本卡屬 FR-132 A.6(子母卡 CM-2559),CM-2565 拆出的第二棒 M2b。依賴:CM-2565(甲)commit 後才有 v-can 掛點可掃。建議 model:opus。
把權限矩陣真的產出來:一支 JSON 寫明「哪一頁、哪個功能點、綁哪顆權限」,從程式產、再反過來核程式。它是設計標準,產品經理和客戶文件都讀它,角色設定頁的樹也改讀它(那是下一棒)。
CM-2565 runner 實查(不必重查):
- 權限清單在程式碼:core.plugins.PLUGINS + core.host_capabilities.HOST_CAPABILITIES,208 顆;產生器 import 這兩份,不連 DB
- 「頁→進入權限」只在 DB:ui_routes 51 條、route_capabilities 123 筆(每頁 read=ALL、其餘 ANY);程式碼無宣告
- FE 權限來源:userStore.capabilityNames(全集)、capabilityBypass(超管)、useUserUtil().hasCap 唯一出口
- 散寫基線:hasCap( 37 處(33 處字面)、pagePermission.includes 4、can( 9(RoleList/RoleDetail)
- v-can 採編譯期轉換(vite nodeTransforms 把 v-can 改寫成 v-if="$can(X)",原有 v-if 以 AND 合併;$can 掛 globalProperties);Vue 先跑內建 v-if 再跑自訂轉換,要在父節點處理子元素、根節點在 ROOT 層處理;PrimeVue Menu items 掛不了,改 items 過濾並登記豁免
盤點表(功能點文字與多權限語意的對照):docs/features/FR-132-2610-access-management/inventory/a6-button-capabilities.md
後端 route→權限機器清單:scripts/deliverables/collect_route_guards.py(test/security/code/test_route_guard_inventory.py 用它)
甲棒產出:src/config/capabilities.js(CAP 常數)、v-can 轉換、$can、DeviceManage.vue 示範
scripts/deliverables/gen_permission_matrix.py 擴充(甲棒已建、先只產常數檔):掃 FE 各 .vue 的 v-can 掛點,取元素的 i18n key 當功能點文字(找不到 key 的記元素文字並標 label_source=literal);頁→進入權限從 DEV DB 讀 ui_routes+route_capabilities(決策者裁:連 DEV DB,CI 沒 DB 所以守衛只讀已入版控的 JSON,不直接連 DB)。輸出 docs/features/FR-132-2610-access-management/permission-matrix.json:page/page_label/feature/kind(page/button/menu-item)/capability(字串、陣列、或 {all:[…]})/extra_condition/source_file。排序固定、可重跑、diff 乾淨。順手調兩條登記(你正在動 ui_routes/route_capabilities):
flow-template-edit 門檻改 flow.template.read(ALL),寫入由 v-can 擋;原 update 改 ANY。