資源庫樣板編輯器(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 時帶入 |
共用 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 設計
實機截圖(STG,亮色模式,2026-07-05,帳號 blsadmin):


版面骨架(三頁全景,本頁=頁3):
狀態呈現:樣板編輯 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 圖
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 §4 與 module-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. 邊界情況與已知坑
- 樣板 SSP 單一真相來源:控制預設 / AO / 元件 / 人員
/ 系統特性 / 程序書全部讀寫
template_ssp_id指向的樣板 SSP,不要另建 sidecar 表存預設值(會變第二套真相) - lazy IR upsert:control-defaults 首次 PUT 建 IR、後續更新;DELETE 清值保留 IR(控制留在 profile)
- 可翻譯欄位要傳
locale:
module_frames_trans存翻譯,不傳 locale 的 update 對前端 failover 讀取無效 - 程序書雙 context:同一
ssp_reference_documents表以 context_id/type 分別掛控制項或 AO - 共用 SSP 子區的坑同 SSP 子頁:資產 M2M
implemented_components編輯鎖定、party 軟式參照、資產設備 merge vs 系統 full-replace 等坑,與 SSP 資產 §12 / SSP 編輯器 §12 相同(同一批元件 / 同結構);本頁只在 API base 與 gate 上不同。 - 範本無 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
- E2E:
compliance-manager-test/repo;以樣板編輯/module-frame/ModuleFrameTemplateEdit搜尋 - 相關文件:上層導航 範本管理;共用資料結構 SSP 編輯器(基本資料 / 參與方 / 元件 / 授權 / 資產);匯入精靈
module-frame-import;memory
feedback_mf_defaults_single_source_of_truth