本卡屬 FR-132(母卡 CM-2510),A.5 存取管理前端第 2 張,取代作廢的 CM-2537。依賴:T-5.1(共用元件與端點)、T-3.7(匯出匯入 API,已完成)、T-3.9(角色寫入同步寫規則表,已完成)。建議 model:opus。
取代今天的「權限管理」頁(/auth/role-manage、/auth/role-form)。分兩頁:角色列表(一張表一行一角色)與角色明細。明細左邊是 T-5.1 的功能選單權限樹,右邊三張卡:這個角色的人會看到哪些選單、角色基本資料、角色實際存的規則。新增角色、編輯角色、從列表按「複製」都進同一頁,差別只在上方是名稱輸入框還是標題。內建的系統管理員只能看、複製、匯出,不能改也不能刪。
is_system、is_template、規則清單:entity 有(~/Projects/Jedicogy/module/jedi-python-package/jedi-iam/jedi_iam/domain/entities/role_entity.py:21-22,37,mapper infra/mapper/role_mapper.py:35 已組好 capability_patterns),但 app/dto/role.py:16-38 的 RoleDTO 與 api/serializers/role.py:29-50 的 RoleResponse 沒帶出——前端沒辦法判斷哪個是內建、也拿不到規則卡的資料。RoleResponse.capabilities 是舊表 role_capabilities 的逐顆清單(出貨角色在 seed 時按當下能力點展開寫入,scripts/init/gen_shipped_roles_sql.py:41),日後新增的權限不會出現在這裡;樹的勾選狀態以它為準可以,但「權限數(展開後)」要用展開服務算。POST /role、PUT /role/<uid> body 送 capabilities: [id,...](api/serializers/role.py:5-13),T-3.9 已讓它同時逐顆寫規則表(jedi 352bdc10)。PUT 必帶 tenant_id,不帶會被 roles 的 RLS 擋成 500(T-3.9 驗收時發現,既有行為)。POST /roles/export body {uids:[...]}、POST /roles/import body {format_version, roles:[{name,description,is_admin,capabilities:[規則]}], on_conflict}(api/serializers/role.py:68-83、api/routes/role_route.py:122-147);零命中規則回 400 AUTH_400009、同名未選處理方式回 409;守門 iam.role.export/iam.role.import。docs/features/FR-132-2610-access-management/inventory/a1-shipped-roles.json):系統管理員 *.*.*;稽核主管 15 條、稽核員 25 條、一般成員 19 條、唯讀 14 條。docs/features/FR-132-2610-access-management/mockup/roles-and-assignments-v3.html 定稿:角色列表(頂部切換「角色列表」)
docs/features/FR-132-2610-access-management/mockup/role-detail-v3.html 定稿:角色明細(頂部切換「編輯既有角色/新增角色」)
~/Projects/Billows/Audit-Manager/compliance-manager-fe/src/views/role-manage/RoleManage.vue (265 行) 現有列表,BaseService 呼叫方式可參考
~/Projects/Billows/Audit-Manager/compliance-manager-fe/src/views/role-manage/RoleForm.vue (605 行) 現有表單,tenant/license 判斷可參考
~/Projects/Billows/Audit-Manager/compliance-manager-fe/src/config/router/index.js:100-115 舊 role-manage/role-form 路由(退役在 T-5.5)
~/Projects/Billows/Audit-Manager/compliance-manager-fe/src/config/api/api.js:29-31,45 ROLES/ROLE/ROLE_STATUS/ROLE_MENU
~/Projects/Jedicogy/module/jedi-python-package/jedi-iam/jedi_iam/app/dto/role.py:16-38 RoleDTO 補欄
~/Projects/Jedicogy/module/jedi-python-package/jedi-iam/jedi_iam/api/serializers/role.py:29-50 RoleResponse 補欄
RoleDTO/RoleResponse 補 is_system、is_template、capability_patterns(list[str]);角色列表每列補 capability_count(規則經展開服務算出的項數)與 visible_page_count(用 T-5.1 的同一支可見判定算)。列表算數量若一頁 N 個角色各查一次太慢,批次展開(expand_roles 本來就收多個 role id)。另:is_system 角色的 PUT/DELETE 若後端還沒擋,補擋(回 403 或 409,error code 照 AUTH_<HTTP><序號> 規則並同步 FE error-code.json)。DataTable,欄位:名稱(is_system 帶 pi pi-lock 圖示與「內建」Tag)+一句描述、權限數、使用者數、可見頁面數、最後修改(updated_at;範例角色從未被改過時顯示「系統建立」)、操作(編輯/複製/刪除;is_system 只有檢視/複製)。不做類型欄、不做分類篩選(決策者裁:只有一筆內建,分類會誤導)。工具列只有 IconField 搜尋與「顯示已停用」InputSwitch。頂部按鈕「匯入角色 JSON」「新增角色」。列表走 POST /roles 分頁慣例。刪除前 ConfirmDialog,有人被指派時提示人數。/access/roles/new、/access/roles/:uid、/access/roles/new?from=<uid>。左:T-5.1 PermissionTree;右欄三張可收合卡(PrimeVue Panel toggleable):可見選單(T-5.1 VisibleMenuPreview,「加入」勾該頁門檻項)、角色資料(狀態、最後修改、權限數、使用者數、「查看指派清單」帶 role_uid 篩選跳 T-5.3 指派頁)、權限規則(capability_patterns 唯讀清單,每條標展開幾項,底下說明「含星號的規則會自動涵蓋日後新增的權限」)。InputText、描述輸入、「以既有角色為範本」Dropdown(預設「不使用」;選了把該角色的勾選帶入,之後各自獨立,不留關聯);列表「複製」=帶 from 預選範本、名稱預填「<原名> 的副本」。右欄只有可見選單卡。底部「建立角色」在名稱空或一項都沒勾時停用,旁邊提示「填好名稱並至少勾一項才能建立」。position: sticky):有變更時列出「N 項未儲存的變更:<權限名> 新增/移除…」,按鈕「放棄變更」「儲存角色」(新增模式為「建立角色」)。離開頁面有未存變更時用 onBeforeRouteLeave 確認。readonly、無儲存列,只有「複製成新角色」「匯出 JSON」。範例角色(is_template)可改可刪可複製,介面不另加標籤。Dialog+FileUpload(mode="basic"、只收 .json),400 時在對話框內列出零命中的規則;409 時改顯示「覆蓋/另存」選擇再送一次 on_conflict。hasCap:建立 iam.role.create、修改 iam.role.update、刪除 iam.role.delete、匯出 iam.role.export、匯入 iam.role.import。