框架版本匯入 / 編輯(Framework Version Import / Edit)
功能群:合規框架與 SSP|匯入三步式先讀 _overview §4、母頁 compliance-framework-manage
事實基準:2026-07-05 從 FE / BE code 掃出;endpoint 對
routes.json、schema 對db_schema.json、error code 開檔驗
1. 功能描述
框架版本匯入 / 編輯是把框架版本的控制項全集從 PDF/OSCAL 匯入成 catalog、並編輯 catalog 內容的頁面。兩個相連頁面:
- 匯入頁(
FrameworkImportPage.vue,2 route:/import-version上傳、/import-version/:parseUid預覽):走 parse→預覽→confirm 三步式(見 _overview §4),confirm 後寫oscal.catalogs+ 回填版本catalog_id。 - 版本內容編輯頁(
FrameworkVersionEditView.vue):對已匯入 catalog 的群組 / 控制項 / AO 做內嵌編輯(直接 PUT/DELETE,無暫存)。
主要使用者:平台(root 租戶)管理員(框架是全域資源)。
角色速覽(本群非專案層角色,見 _overview §5):僅 platform admin 可匯入 / 編輯。
1.1 功能總覽(本頁全部功能)
| # | 功能 | 說明 | 位置 | 詳述 |
|---|---|---|---|---|
| 1 | 選解析器 + 上傳 PDF | parser 下拉 + .pdf 拖放 → 解析成 parse job | 匯入 Step1 | UC-CFI-01 |
| 2 | 草稿橫幅 | 列出 / 開啟 / 丟棄未完成 parse job | 匯入 Step1 | §6.1 |
| 3 | 預覽雙欄 | 左 PDF iframe、右 TabView(基本資訊 + 內容) | 匯入 Step2 | §5 |
| 4 | 版本 metadata | version / release_date / publish_status(replace-mode 隱藏,沿用既有) | 匯入 Step2 Tab | §6.2 |
| 5 | 內容內嵌編輯 | 群組 / 控制項 / AO 編輯、標刪 / 還原、G/C/A 計數 | 匯入 Step2 / 編輯頁 | §6.2 |
| 6 | 確認匯入 | confirm → 寫 catalog + version | 匯入 Step2 | UC-CFI-01 |
| 7 | 丟棄 | DELETE parse job(暫存不入正式表) | 匯入 Step1/2 | §6.1 |
| 8 | 失敗態 | error_code + 訊息 → 重試 / 丟棄 | 匯入 | §10 |
| 9 | 版本內容直接編輯 | catalog control / group / assessment 內嵌 PUT/DELETE | 編輯頁 | UC-CFI-02 |
| 10 | 編輯權 gate | draft 且 platform admin 才可編;有引用才可刪 | 編輯頁 | §3 |
UC(§2)展開本頁所有具實質後端邏輯的功能:PDF 匯入三步(UC-CFI-01)、版本內容內嵌編輯(UC-CFI-02,與匯入不同機制、無暫存 diff)。草稿橫幅 / 失敗態 / 丟棄等純顯示或單步操作見 §6.1 / §10;replace-mode 等匯入變體併入 UC-CFI-01。
2. Use Case
角色速覽(本群非專案層角色,見 _overview §5):僅 platform admin 可匯入 / 編輯。
流程圖視覺慣例:菱形 = 判斷、橘底 = 例外 / 擋下、紅框 = 錯誤(標 error code)、綠框 = 成功終點、虛線 = 可選路徑。
UC-CFI-01 從 PDF 匯入框架版本控制集
| 項目 | 內容 |
|---|---|
| 角色 | platform admin |
| 前置條件 | 已登入;有目標框架(新版本或 replace 既有版本) |
| 產出 / 後置條件 | confirm 後寫 oscal.catalogs +
framework_versions.catalog_id 回填 |
UC-CFI-02 版本內容內嵌編輯(catalog 群組 / 控制項 / AO)
| 項目 | 內容 |
|---|---|
| 角色 | platform admin |
| 前置條件 | 版本 publish_status = 'draft'(非 draft →
唯讀);已匯入 catalog |
| 產出 / 後置條件 | catalog 群組 / 控制項 / AO 直接寫入(PUT)或刪除(DELETE,有引用不可刪);無暫存 diff,即時生效 |
3. 權限矩陣
| 操作 | FE 判定 | BE 強制 | BE 檢查位置 |
|---|---|---|---|
| 進匯入 / 編輯頁 | isPlatformAdmin(否則 toast 導回框架管理) |
require_platform_admin() → GRC_403060 |
FrameworkImportPage:130-141;BE route/service |
| 上傳 / confirm / 刪除 parse job | 同上 | require_platform_admin() |
app/oscal/service/framework_app_service.py |
| 內容內嵌編輯 | draft 且 platform admin(readOnly gate) |
require_platform_admin() |
catalog control/group/assessment routes |
| 刪除控制項 | allowDelete(有引用才可刪) |
業務前置 | 同上 |
4. 狀態機與前置條件
發布生命週期見 _overview §3。本頁:
| 條件 | 效果 | 出處 |
|---|---|---|
parse job status='awaiting_review' |
可預覽 / confirm | parse job |
parse job status='failed' |
失敗態(error_code + 重試 / 丟棄) | 同上 |
target_version_uid 已設(replace-mode) |
基本資訊 tab 隱藏、metadata 沿用既有版本 | FrameworkImportPage |
版本 publish_status != 'draft' |
內容編輯頁唯讀 | FrameworkVersionEditView readOnly gate |
5. UI 設計
📸 實機截圖三張皆從缺:本頁「新增/匯入版本」入口與本 route 都受
isPlatformAdmin守門(ComplianceFrameworkVersionManage.vue::isPlatformAdmin——作用中租戶 path 為單層/N/才算 root/平台租戶;合規框架屬全域資源,讀=所有租戶、寫=僅平台租戶)。2026-07-05 盤點:現有 E2E 測試帳號(blsadmin 等)所屬租戶皆非平台 root 租戶,直接打 route 也會被導回列表頁,暫無可用帳號截圖;待有平台租戶帳號再補。
版面骨架:
狀態呈現:兩步分屬兩 route(reload 可復原);預覽用 Splitter(PDF 40% / 內容 60%);編輯頁直接 PUT/DELETE 內嵌(無暫存 diff)。
6. API 規格
Envelope:成功 {"status": true, "data": …}、失敗
{"error_code": "…", "msg": "…"}。
6.1 總清單(本頁呼叫的全部 endpoint)
| 分類 | Method + Path | 說明 | 完整規格 |
|---|---|---|---|
| 草稿 | GET /oscal-framework-parse-jobs |
未完成 parse job 清單 | §6.2 |
| 解析 | POST /oscal-framework-parse-jobs/parse |
上傳 + 解析(回 parse_uid) | §6.2 |
| 預覽 | GET /oscal-framework-parse-jobs/{uid} |
取解析結果 | §6.2 |
| 確認 | POST /oscal-framework-parse-jobs/{uid}/confirm |
寫 catalog + version | §6.2 |
| 丟棄 | DELETE /oscal-framework-parse-jobs/{uid} |
放棄 parse job | GAI-SD-02 |
| 內容編輯 | PUT/DELETE
/oscal-catalog-{control,group,control-assessment}/{uid} |
catalog 內嵌編輯 | GAI-SD-02 |
6.2 核心 endpoint
[POST] /oscal-framework-parse-jobs/parse
Request(multipart):
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
file |
raw | 是 | .pdf 檔案 |
target_framework_uid |
string | 是 | 目標框架 |
parser_type |
string | 是 | 解析器類型 |
target_parent_version_uid |
string | 否 | — |
target_version_uid |
string | 否 | replace-mode |
Response
data:{parse_uid, status}。出處:api/oscal/routes/framework/...parse_jobs
[GET] /oscal-framework-parse-jobs/{uid}
Response data:
| 欄位 | 型別 | 說明 |
|---|---|---|
status |
string | awaiting_review / failed /
confirmed |
parsed_result |
object | 解析結果,含 groups / controls /
assessments |
... |
— | 其他欄位 |
狀態 awaiting_review / failed /
confirmed。
[POST] /oscal-framework-parse-jobs/{uid}/confirm
Request:
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
decisions |
array | 是 | 決策清單 |
overrides |
object | 是 | 內容覆寫,含 groups / controls /
assessments |
target_version |
string | 否 | replace-mode 省略,沿用既有 |
target_release_date |
date | 否 | replace-mode 省略,沿用既有 |
target_publish_status |
string | 否 | replace-mode 省略,沿用既有 |
confirm 後寫 oscal.catalogs + 回填
framework_versions.catalog_id。require_platform_admin
→
GRC_403060。出處:app/oscal/service/framework_app_service.py
7. 前端檔案地圖(compliance-manager-fe/)
| 檔案 | 角色 |
|---|---|
src/views/compliance-framework/FrameworkImportPage.vue |
匯入頁(Step1 上傳 / Step2 預覽 confirm) |
src/views/compliance-framework/FrameworkVersionEditView.vue |
版本內容內嵌編輯頁 |
src/components/.../FrameworkArticleContent.vue |
群組 / 控制項 / AO 內嵌編輯元件 |
src/config/router/index.js:542-555 |
routes compliance-framework-import-version /
-version-edit |
src/config/api/api.js |
endpoint 常數 |
src/config/locales/i18n/zh-tw/compliance-framework-manage.json |
共用 i18n |
8. 後端檔案地圖(本頁核心鏈路)
| 鏈路 | Route | App Service | 底層 |
|---|---|---|---|
| 解析 / confirm | api/oscal/routes/framework/oscal_import_route.py・...parse_jobs |
app/oscal/service/framework_app_service.py::import_framework_version(catalog_service.import_catalog_from_{pdf,excel}) |
jedi_oscal_v2 CatalogService +
oscal.framework_parse_jobs |
| 內容編輯 | catalog control/group/assessment routes | catalog edit service | catalog repos |
DDD 提醒:匯入走三步式(暫存 parse job → confirm
才入正式表);全程 require_platform_admin。
9. DB
9.1 資料表總清單
| 表 | 讀/寫 | 說明 | 欄位詳述 |
|---|---|---|---|
| oscal.framework_parse_jobs | 寫(暫存) | PDF/OSCAL 解析暫存 job | §9.3 |
| oscal.frameworks / framework_versions | 讀 / 寫(catalog_id 回填) | 框架 / 版本 | manage §9.3 |
| oscal.catalogs | 寫(confirm 生成) | 版本 catalog | GAI-SD-03 |
| oscal.catalog_groups / catalog_controls / catalog_control_parts | 寫 / 編輯 | 控制項三層 + AO | GAI-SD-03 |
9.2 ER 圖
框架 → 版本 → catalog 結構見 compliance-framework-manage
§9.2;本頁另寫暫存 oscal.framework_parse_jobs(confirm
後落地 catalog)。
9.3 核心表
oscal.framework_parse_jobs — 框架解析暫存 job
uid / status(awaiting_review
/ failed / confirmed)/
parsed_result(JSON 解析結果)/
target_framework_uid / parser_type /
created_at / created_user。confirm
後結果落地正式 catalog;DELETE 放棄。
10. 頁面邏輯與資料對應
載入:Step1 GET 草稿清單;上傳 POST parse → 導向
Step2(/:parseUid);Step2 GET 解析結果 → 預覽 →
confirm。
關鍵欄位對應:
| 畫面元素 | API 欄位 |
|---|---|
| 版本 metadata tab | confirm target_version /
target_release_date /
target_publish_status |
| 內容編輯 | overrides {groups, controls, assessments} +
decisions |
| 內嵌 catalog 編輯 | PUT/DELETE catalog-{control,group,control-assessment} |
錯誤對應:非 platform admin
GRC_403060;解析失敗 → 失敗態 error_code + 重試。
11. 背景行為與外部依賴
| 類型 | 內容 |
|---|---|
| 解析 | PDF/OSCAL 解析成 catalog(CatalogService);暫存 parse job |
| Socket | 本頁無 socket |
| jedi-* 套件 | jedi-oscal-v2(Catalog / Framework service) |
| 系統參數 | 無 feature flag |
12. 邊界情況與已知坑
- 三步式暫存:上傳解析成
framework_parse_jobs暫存,confirm 才寫正式 catalog;未 confirm 可 DELETE 丟棄;草稿橫幅可續作 - 兩 route
分步:
/import-version(上傳)與/import-version/:parseUid(預覽)分屬兩 route,reload 可復原、可分享連結 - replace-mode:
target_version_uid已設時 metadata tab 隱藏、沿用既有版本 metadata;confirm 不送新 metadata - 內容編輯無暫存:
FrameworkVersionEditView直接 PUT/DELETE 內嵌,非匯入的暫存 diff——與匯入頁不同機制 - 編輯 gate:版本非 draft 或非 platform admin →
唯讀;有引用(
has_references)才可刪控制項 - platform admin only:框架全域資源,一般租戶 admin
也不能匯入 / 編輯(
GRC_403060)
13. 開發與驗證
- 跑起來:BE
python main_socketio.py(port 8000,log 在log/app.log);FE Vite dev server。BE 改 service code 必重啟 - 測試帳號:需 platform(root 租戶)admin;密碼見
.env/ 部署文件 - 導航路徑:合規框架管理 → 版本管理 → 匯入版本
- 前置資料:一個框架;一份 PDF 控制集檔案
- E2E:
compliance-manager-test/repo;以框架匯入/framework-import搜尋 - 相關文件:母頁 compliance-framework-manage、匯入三步式 _overview §4