本卡屬 FR-132 A.6「頁內按鈕照權限隱藏」(子母卡見本卡建立順序前一張),第 1 棒,底層。建議 model:opus。

這一棒在做什麼(白話)

讓前端有一份「這個人全部有效權限」可查,全站按鈕都讀它。今天前端判斷讀的是側欄選單帶回的權限,只含綁在頁面上的那些;沒綁頁的 92 項(SSP、證據分類、AI 小幫手…)查起來永遠是「沒有」。改成登入後一次向後端拿全部有效權限,存進 store,統一一個 has() 給全站用。順手把 AI 小幫手右下角浮鈕接上判斷。

在哪裡(首腦核過)

FE hasCap 現況:src/utils/userUtil.js:16-43(從 /user/web-menu 的 permissions 樹扁平化成 Set)
FE 補查:src/composables/useMyCapabilities.js(每頁自己 load effective-access,has = hasCap || bypass || names)
FE 呼叫點:hasCap( 33 處/17 檔;can( 6 處(useRoleCaps)
FE 浮鈕:src/layout/AppLayout.vue:129-140(v-if="showChatBtn" 只看開關,不看權限)
BE 端點:GET /users/<uid>/effective-access(jedi-iam api/routes/role_assignment_route.py:79 → app/service/effective_access_service.py:26-63,回 bypass.super_admin 與 capabilities[{name, sources}]);能力點集合取自判定同一條(explain_active_capabilities)
BE 守門:jedi-iam authz/capability.py;AI 小幫手聊天端點守 ai.assistant.read(jedi-ai-bot plugin/contract.py:37)

怎麼做

要寫測試

手測

連帶

紀律