手冊首頁 / 合規稽核 / 資源庫樣板編輯器

資源庫樣板編輯器(ModuleFrame Template Editor)

功能群:合規框架與 SSP|上層導航頁見 範本管理 / 合規資源庫|資產模型先讀 功能群總覽;OSCAL SSP 領域概念見 oscal-knowledge

事實基準:2026-07-05 從 FE ModuleFrameTemplateEditView.vue + BE code 掃出;endpoint 對 routes.json、schema 對 db_schema.json、error code 開檔驗(module_frame_error_code.py

變更紀錄

日期 FR 變更
2026-07-06 FR-047 module-frame.md 拆出:樣板 SSP 多 tab 編輯器獨立成子頁;共用 SSP 子區交叉引用 SSP 編輯器 各子頁,只寫 API base 與行為差異

1. 功能描述

資源庫樣板編輯器是 範本管理 清單「樣板編輯」導向的內容編制面板ModuleFrameTemplateEditView.vue):把資源庫綁定的樣板 SSP(module_frames.template_ssp_id 指向的 oscal.system_security_plans)內容全部編在此。這是單一真相來源——讀取與寫入都走同一份樣板 SSP,專案成立 clone 時原樣帶入。

編輯器以多個 tab 組織,本質是範本版的 SSP 編輯器:受評標的(system-characteristics)、負責單位 / 人員(parties)、元件 / 外部授權 / 資產(components / leveraged / inventory)這幾個子區,與 專案 SSP 編輯器同一套資料結構、同一批可重用元件ModuleFramePartiesPanel.vue 等 SSP 與範本共用),差別只在 API base(範本走 /module-frame/{uid}/…,SSP 走 /ssp/{ssp_uid}/…)與編輯 gate(範本以資源庫作者能力守門、SSP 以 manager + AP=planning 守門)。因此這些子區的 field-level 逐欄規格交叉引用 SSP 子頁、不在此重複

樣板編輯器特有、無 SSP 子頁對應的兩塊是 適用控制項現況預設值(control-defaults / objective-defaults,UC-MF-01 core,體現「lazy upsert 對樣板 SSP IR 寫入」)與 程序書池(reference-documents,掛控制 / AO 雙 context),於本頁自述。

主要使用者:資源庫作者(管理員);scope=SYSTEM 公版由 root 租戶 admin 維護。

角色速覽(本群非專案層角色,見 _overview §5):資源庫作者(管理員)為主;scope=SYSTEM 公版 root 租戶維護。

1.1 功能總覽(本頁全部功能)

本頁是樣板 SSP 多 tab 編輯器:與 專案 SSP 編輯器 共用資料結構的子區(單位/人員/元件/授權/資產/受評標的),逐欄規格交叉引用對應 SSP 子頁(只寫 API base 差異);範本特有子區(適用控制項預設值、程序書池)於本頁自述。

# 功能 說明 位置 詳述(field-level)
1 適用控制項編輯 控制樹選控制 / AO,填現況預設值(control-defaults / objective-defaults,lazy upsert) tab 適用控制項 本頁 UC-MF-01 / §6.2
2 納入控制項 樹選調整 profile 納入的控制集 tab 動作 §12
3 受評標的 system-characteristic(組織 / 系統 / 資訊分類,1:1 upsert) tab 受評標的 SSP 基本資料(API base 差異見 §6.1)
4 負責單位 / 人員 parties(organization / person)CRUD tab 負責單位 SSP 參與方
5 元件 components CRUD tab 元件·授權·資產 › 元件 SSP 元件清冊
6 外部授權 leveraged authorization CRUD 同上 › 授權 SSP 利用授權
7 資產 inventory-items CRUD(設備 / 系統分流) 同上 › 資產 SSP 資產清冊
8 程序書池 reference-documents(掛控制 / AO 雙 context) tab 程序書 本頁 §6.2
9 發布 樣板編完發布(enable 決定可否成立專案) 動作 _overview §3
10 匯入 / 匯出 control-defaults Excel 匯入匯出;SSP OSCAL 匯出;整包 import 動作 §6.1 / import 精靈

UC(§2)只展開本頁具實質後端邏輯、且無 SSP 子頁可交叉引用的核心:適用控制項現況預設值編輯(1,UC-MF-01——最能體現「樣板 SSP 單一真相來源 + lazy upsert」)。共用 SSP 子區的 CRUD 流程與逐坑見對應 SSP 子頁;匯入 / 匯出精靈(10)另屬 匯入精靈頁,此處只交叉連結不重複。

2. Use Case

角色速覽(同 §1)。

流程圖視覺慣例:菱形 = 判斷、橘底 = 例外 / 擋下、紅框 = 錯誤(標 error code)、綠框 = 成功終點、虛線 = 可選路徑。

UC-MF-01 編輯控制項 / AO 現況預設值

項目 內容
角色 資源庫作者
前置條件 資源庫已有樣板 SSP(template_ssp_id);控制項屬該 profile
產出 / 後置條件 樣板 SSP 的 ssp_implemented_requirements / ssp_statements props 更新;專案成立 clone 時帶入
uc_mf_01 start open 開資源庫樣板編輯 → 適用控制項 tab 選控制項 / AO start->open edit 填控制項/AO 現況預設值 (實作狀態/描述/責任角色…) open->edit save PUT .../control-defaults/{ci} (或 .../objective-defaults) edit->save resolve 解析 module_frame_uid → template_ssp_id save->resolve upsert 樣板 SSP 已有該控制 IR? resolve->upsert create lazy 建 IR(控制項留在 profile) upsert->create 否(首次) update 更新 IR.props (implementation_status/description/…) upsert->update single 讀寫同源:讀取也走同一樣板 SSP (MF defaults 單一真相來源) create->single update->single done 預設值落地;專案成立 clone 時帶入 single->done
UC-MF-01 流程:選控制/AO→填預設值→PUT control-defaults→解析 template_ssp_id→lazy upsert IR→讀寫同源

共用 SSP 子區(單位 / 人員 / 元件 / 授權 / 資產 / 受評標的)的 CRUD UC 與 M2M 坑,見 SSP 編輯器 UC-SE-01 及各子頁 UC;本頁不重述。

3. 權限矩陣

操作 FE 判定 BE 強制 BE 檢查位置
讀樣板內容 登入 + 選單權限 @jwt_required() route
樣板 / 子資源 CRUD 選單能力(作者) @jwt_required() + 業務前置(控制屬 profile、名稱不重複…) app/module_frame/service/*
發布(下游可成立專案) enable + published 未發布 → GRC_412031(在 project-create,非本頁) project_start_app_service

本頁多為 JWT + 選單能力守門;細粒度前置以 error code 表達(見 §4)。scope=SYSTEM 公版的寫入權另受 root 租戶約束。與 SSP 編輯器守門的差異:SSP 走 require_participant(讀)/ require_manager + AP=planning(寫);範本走資源庫作者能力,無專案角色 / AP 概念。

4. 狀態機與前置條件

條件 效果 出處
控制項不屬該 profile 加預設值 → MODULE_FRAME_400001 module_frame_error_code.py:18
AO 不屬該控制項 MODULE_FRAME_400002 :19
資源庫無樣板 SSP 編內容 → MODULE_FRAME_404004 :15
匯入檔格式 / 標頭不符 MODULE_FRAME_400003 / 400004 :20-21
子資源名稱重複 org/component/leveraged/inventory/person → MODULE_FRAME_409001~409005 :24-28
enable=1 且 published 才可用於成立專案 下游 project-create

5. UI 設計

樣板編輯器 — 多 tab 編 template_ssp_id 樣板 SSP(單一真相來源) draft / published 徽章|守門=資源庫作者能力(無 AP=planning gate) 開啟:UC-MF-01 控制項 / AO 現況預設值(範本特有) tab 適用控制項(範本特有) 控制樹選控制 / AO → 填現況預設值 lazy upsert(IR 不存在自動建) PUT …/control-defaults/{ctrl} PUT …/objective-defaults → UC-MF-01(點我) 開啟:§6.2 程序書池 reference-documents(範本特有) tab 程序書池(範本特有) reference-documents,掛控制 / AO 雙 context context_type / context_id 分流關聯 GET/POST …/reference-documents → §6.2(點我) 共用 SSP 子區(與專案 SSP 編輯器同資料結構;差別只在 API base = /module-frame/{uid}/…) 開啟:SSP 基本資料 spec(受評標的逐欄) tab 受評標的 → system-characteristic(1:1,8 欄) GET/PUT …/system-characteristic project-ssp-basic.md(逐欄) 開啟:SSP 參與方 spec(單位 / 人員逐欄) tab 負責單位 / 人員 → parties(organization / person) GET/POST …/parties project-ssp-parties.md(逐欄) 開啟:SSP 元件清冊 spec(元件 / 授權 / 資產逐欄) tab 元件·授權·資產 → components / leveraged / inventory GET/POST …/components|…/leveraged project-ssp-components / -leveraged / -inventory 動作列(本頁):納入控制項(樹選調整 profile 控制集)・發布(enable 決定可成立專案) 匯入 / 匯出:control-defaults Excel 匯入匯出・樣板 SSP OSCAL 匯出・整包 import POST …/control-defaults/import | GET …/ssp-export (詳見 module-frame-import 精靈頁) 彩色=可點跳轉:teal/coral=本頁小節錨點(範本特有:適用控制項 / 程序書)|purple/pink=跨群 project-ssp-* 子頁(共用 SSP 子區逐欄) 灰=本頁結構 / 動作描述|共用子區與 SSP 編輯器同資料結構,差別只在 API base 與守門(無 AP=planning gate) API 僅列代表性,完整規格見 §6 與各子頁 §6
樣板編輯器版面 wireframe:多 tab(適用控制項/受評標的/負責單位/元件·授權·資產/程序書);共用 SSP 子區 tab 連對應 project-ssp-* 子頁、範本特有 tab(適用控制項/程序書)連本頁小節錨點

實機截圖(STG,亮色模式,2026-07-05,帳號 blsadmin):

樣板編輯多 tab(適用控制項):控制項預設值/AO 進度卡 + 左樹選控制項

程序書文件池 tab:13 份程序書清單 + 拖放上傳區

版面骨架(三頁全景,本頁=頁3):

mf_ui_layout page 頁 1:資源庫清單 (ModuleFrame) 篩選(狀態/enable/provider/framework/group) +建立(手動/docx/excel)|複製|下載 SSP 樣板 列:名稱 / 群組 / provider / 框架 / profile / 狀態 / enable / 版本 / 稽核流程範本|⋮ 編輯基本/刪除/enable 切換 頁 2:明細 (ModuleFrameDetail)群組→控制項→AO 下鑽 樹 + 麵包屑;面板:頻率/風險/責任部門;任務表;每項編輯/刪除 頁 3:樣板編輯 (ModuleFrameTemplateEditView)=編樣板 SSP Tabs :基本資訊|適用控制項(控制樹→AO 現況/工作流/任務)|受評標的(system-characteristic)|負責單位(parties org)|負責人員(parties person)|元件+外部授權+資產|程序書池(reference-documents) 動作:發布|編輯納入控制項(樹選)|編輯基本資訊|下載 SSP 樣板  狀態徽章:draft/published 所有內容編輯都寫進 template_ssp_id 指向的樣板 SSP(單一真相來源)
資源庫管理版面:頁1 清單、頁2 明細下鑽、頁3 樣板編輯多 tab(全寫進樣板 SSP)

狀態呈現:樣板編輯 draft/published 徽章;適用控制項 tab 為控制樹 + AO 現況表單;無 socket,寫入後本地更新 + 重載。

6. API 規格

Envelope:成功 {"status": true, "data": …, "meta": …}、失敗 {"error_code": "…", "msg": "…"}

6.1 總清單(本頁呼叫的全部 endpoint)

分類 Method + Path 說明 完整規格
控制預設 GET/PUT/DELETE /module-frame/{uid}/control-defaults[/{control_identifier}] 控制項現況預設值(lazy upsert) §6.2
控制預設匯入匯出 POST .../control-defaults/import[/template,/validate,/verify]、GET .../control-defaults/{export,template/download} Excel 匯入三步 + 匯出 / 樣板 GAI-SD-02
AO 預設 GET/PUT/DELETE /module-frame/{uid}/objective-defaults[/{uid}] AO 現況預設值 §6.2
程序書 GET/POST/PUT/DELETE .../reference-documents[/{doc_uid}](+ 掛控制 / AO) 程序書池 + 雙 context 關聯 §6.2
受評標的 GET/PUT /module-frame/{uid}/system-characteristic 系統特性(1:1 upsert,8 欄) SSP 基本資料 §6(逐欄同 SSP,僅 base 不同)
單位 / 人員 GET/POST/PUT/DELETE /module-frame/{uid}/parties[/{party_uid}] party 增改刪(organization / person 依 type 過濾) SSP 參與方 §6
元件 GET/POST/PUT/DELETE /module-frame/{uid}/components[/{uid}] 元件清冊增改刪 SSP 元件清冊 §6
授權 GET/POST/PUT/DELETE /module-frame/{uid}/leveraged[/{uid}] 利用授權增改刪 SSP 利用授權 §6
資產 GET/POST/PUT/DELETE /module-frame/{uid}/inventory[/{uid}] 資產清冊增改刪(設備 / 系統分流) SSP 資產清冊 §6
SSP 匯出入 GET .../ssp-export.../ssp-import-template、POST /module-frame/import[/template,/verify,/yaml] 樣板 SSP OSCAL 匯出 / 整包匯入 GAI-SD-02 / import 精靈

交叉引用約定:受評標的 / 單位 / 人員 / 元件 / 授權 / 資產六個子區的 request / response 逐欄表、jsonb 內部結構、props 保留鍵、逐坑,與對應 SSP 子頁 完全相同(同一批可重用元件 + 同一資料結構),差別只有 API base 前綴(本頁 /module-frame/{uid}/…,SSP /ssp/{ssp_uid}/…)與編輯 gate(見 §3)。故此處只列 base,逐欄請點對應子頁 §6,避免兩份文件各記一套而失同步。

6.2 核心 endpoint(範本特有)

以下兩塊為樣板編輯器特有、無 SSP 子頁對應,於本頁完整描述。

[PUT] /module-frame/{uid}/control-defaults/{control_identifier}

控制項現況預設值 lazy upsert(IR 不存在自動建、控制項留在 profile)。

Request:

欄位 型別 必填 說明
implementation_status 實作狀態
implementation_description 實作說明
responsible_role 責任角色
control_origination 控制來源

解析 module_frame_uid → template_ssp_id → 對樣板 SSP 的 ssp_implemented_requirements upsert。DELETE = 清值保留 IR。前置:控制屬 profile(否則 MODULE_FRAME_400001)、有樣板 SSP(否則 MODULE_FRAME_404004)。出處:app/module_frame/service/module_frame_control_default_service.py

[GET/PUT/DELETE] /module-frame/{uid}/objective-defaults[/{uid}]

AO(評估目標)現況預設值:對樣板 SSP 的 ssp_statements props upsert(AO key 統一 _obj.N)。前置:AO 屬該控制項(否則 MODULE_FRAME_400002)。出處:app/module_frame/service/module_frame_objective_default_service.py(objective-defaults path)。

[GET/POST/PUT/DELETE] /module-frame/{uid}/reference-documents[/{doc_uid}]

程序書池:掛控制項或 AO 的雙 context 關聯。同一 oscal.ssp_reference_documents 表以 context_type / context_id 分別掛控制項或 AO(雙 context)。上傳走檔案儲存後建關聯;刪除清關聯。出處:app/module_frame/service/module_frame_reference_document_service.py

7. 前端檔案地圖(compliance-manager-fe/)

檔案 角色
src/views/module_frame/ModuleFrameTemplateEditView.vue 頁3 樣板編輯多 tab 容器
src/components/grc/ModuleFramePartiesPanel.vue 單位 / 人員 tab(party-type 過濾;SSP 與範本共用
src/components/grc/ssp/SspComponentsLeveragedInventoryTab.vue 元件 · 授權 · 資產 tab(SSP 與範本共用
src/components/grc/ssp/SspBasicSection.vue 受評標的 tab(SSP 與範本共用
src/config/router/index.js:431-448 route module-frame-template-edit
src/config/api/api.js endpoint 常數(MODULE_FRAME 等)

共用元件的內部行為(欄位、Dialog、M2M 坑)見對應 SSP 子頁 §7

8. 後端檔案地圖(本頁核心鏈路)

鏈路 Route App Service 底層
控制預設 upsert module_frame_control_default_route.py::ModuleFrameControlDefaultListResource.put module_frame_control_default_service.py::upsert(解析 template_ssp_id → lazy IR upsert) jedi_oscal_v2 SspService(IR CRUD)
AO 預設 module_frame_objective_default_route.py module_frame_objective_default_service.py 樣板 SSP ssp_statements
程序書 module_frame_reference_document_route.py module_frame_reference_document_service.py oscal.ssp_reference_documents
共用子資源(parties / components / leveraged / inventory / system-characteristic) module_frame_*_route.py 對應 service 樣板 SSP 的 ssp_* 子表

DDD 提醒:所有內容編輯解析到 template_ssp_id 對樣板 SSP 寫入(單一真相來源);勿在本群另建 sidecar 表存預設值。子資源鏈路與 SSP 編輯器 §8 是同結構、不同 base。

9. DB

9.1 資料表總清單(本頁讀寫的表)

讀/寫 說明 欄位詳述
oscal.system_security_plans 讀 / 樣板 SSP(module_frames.template_ssp_id 指向)— 內容單一真相來源 GAI-SD-03
oscal.ssp_implemented_requirements 控制項現況預設(control-defaults) 規劃頁 §9.3
oscal.ssp_statements AO 現況預設(objective-defaults) 規劃頁 §9.3
oscal.ssp_reference_documents 程序書池(掛控制 / AO 雙 context) 規劃頁 §9.3
oscal.ssp_system_characteristics 受評標的(system-characteristic,1:1) SSP 基本資料 §9.3
oscal.ssp_components / ssp_leveraged_authorizations / ssp_inventory_items 元件 / 外部授權 / 資產 SSP 元件 / 授權 / 資產
oscal.parties 負責單位 / 人員 SSP 參與方 §9.3
oscal.profiles / catalogs 綁定的基準線 / 控制母體 GAI-SD-03

9.2 ER 圖

mf_er mf compliance.module_frames 資源庫主檔 uid / name / group / provider enable / scope(SYSTEM/tenant) oscal_framework_version_uid oscal_profile_uid template_ssp_id ← 樣板 SSP audit_flow_template_uid is_delete(軟刪除) tr compliance.module_frames_trans name/description/group 翻譯 mf->tr 1:N locale ssp oscal.system_security_plans 樣板 SSP(is_template=True) ★內容編輯的單一真相來源 mf->ssp template_ssp_id ir oscal.ssp_implemented_requirements ssp_statements 控制項/AO 現況預設值 (control-defaults / objective-defaults) ssp->ir 1:N sub oscal.ssp_components / ssp_leveraged_authorizations ssp_inventory_items / parties ssp_reference_documents 元件/外部授權/資產/ 人員/程序書池 ssp->sub 子資源
資源庫 → template_ssp_id 樣板 SSP → ssp_* 子表(單一真相來源);module_frames_trans 翻譯

9.3 核心表欄位(取自 DEV DB dump,含 DB comment)

範本特有的兩塊寫入表(現況預設 / 程序書)欄位語意如下;共用 SSP 子表的完整欄位卡(含 jsonb 內部結構、props 保留鍵)見對應 SSP 子頁 §9.3(本頁與其同結構、不重複)。

  • oscal.ssp_implemented_requirements(control-defaults):控制項現況預設,props 存 implementation_status/description/responsible_role/control_origination;lazy upsert,DELETE 清值保留 IR。
  • oscal.ssp_statements(objective-defaults):AO 現況預設,AO key _obj.N
  • oscal.ssp_reference_documents(程序書池):以 context_type/context_id 掛控制項或 AO(雙 context)。

10. 頁面邏輯與資料對應

載入:進頁各 tab GET 對應子資源(control-defaults / objective-defaults / reference-documents / parties / components / leveraged / inventory / system-characteristic)。

關鍵欄位對應

畫面元素 API 欄位
控制現況表單 control-defaults implementation_status/description/responsible_role/control_origination → 樣板 SSP IR props
AO 現況 objective-defaults → ssp_statements props
程序書 reference-documents(context 控制 / AO)
受評標的 / 單位·人員 / 元件·授權·資產 同對應 SSP 子頁 §10(欄位對應相同,僅 base 不同)

儲存流程:各子資源獨立 PUT / POST(lazy upsert 對樣板 SSP);讀寫同源。

錯誤對應MODULE_FRAME_400001(控制不屬 profile)/ 400002(AO 不屬控制)/ 404004(無樣板 SSP)/ 400003-400004(匯入檔)/ 409001-409005(子資源名稱重複)。

11. 背景行為與外部依賴

類型 內容
匯入解析 control-defaults Excel / 整包 import 走解析(見 _overview §4module-frame-import
可翻譯欄位 module_frames_trans;寫 name/description/group 要傳 locale(docs/claude/translatable-fields.md
Socket 本頁 socket
jedi-* 套件 jedi-oscal-v2(樣板 SSP / catalog / profile)
系統參數 scope=SYSTEM 公版;enable 決定成立專案可用性

12. 邊界情況與已知坑

  1. 樣板 SSP 單一真相來源:控制預設 / AO / 元件 / 人員 / 系統特性 / 程序書全部讀寫 template_ssp_id 指向的樣板 SSP,不要另建 sidecar 表存預設值(會變第二套真相)
  2. lazy IR upsert:control-defaults 首次 PUT 建 IR、後續更新;DELETE 清值保留 IR(控制留在 profile)
  3. 可翻譯欄位要傳 localemodule_frames_trans 存翻譯,不傳 locale 的 update 對前端 failover 讀取無效
  4. 程序書雙 context:同一 ssp_reference_documents 表以 context_id/type 分別掛控制項或 AO
  5. 共用 SSP 子區的坑同 SSP 子頁:資產 M2M implemented_components 編輯鎖定、party 軟式參照、資產設備 merge vs 系統 full-replace 等坑,與 SSP 資產 §12 / SSP 編輯器 §12 相同(同一批元件 / 同結構);本頁只在 API base 與 gate 上不同。
  6. 範本無 AP=planning gate:SSP 編輯器以 AP=planning + manager 守門,範本編輯器以資源庫作者能力守門、無專案 / AP 概念——移植 SSP 子頁描述時勿把 AP gate 誤套到本頁。

13. 開發與驗證

  • 跑起來:BE python main_socketio.py(port 8000,log 在 log/app.log);FE Vite dev server。BE 改 service code 必重啟
  • 測試帳號:資源庫作者 / 管理員;scope=SYSTEM 需 root 租戶帳號(密碼見 .env / 部署文件)
  • 導航路徑:側邊選單「範本管理 / 合規資源庫」→ 某列「樣板編輯」(/module-frame/module-frame/:uid/template-edit
  • 前置資料:需一個框架版本 + profile;樣板 SSP 由建立資源庫時生成;建幾筆元件 / 授權 / 資產測共用子區 CRUD
  • E2Ecompliance-manager-test/ repo;以 樣板編輯 / module-frame / ModuleFrameTemplateEdit 搜尋
  • 相關文件:上層導航 範本管理;共用資料結構 SSP 編輯器基本資料 / 參與方 / 元件 / 授權 / 資產);匯入精靈 module-frame-import;memory feedback_mf_defaults_single_source_of_truth