Appearance
权限能力矩阵(Acc / 小程序写操作)
与 permission-api-unification.md 配套。实施或验收时对照本表。
图例:菜单 = 可见入口 + 读接口(POST /acc/*/page、detail 等,assertAccReadPermission);入/出/生产的 过账/冲红 另须 btn_acc_*_write。具备写按钮时隐含对应模块读权限。403 统一 code: PERMISSION_DENIED,可选 requiredPermissions 数组。
PC 前端(Web)
| 能力 | 实现 |
|---|---|
| 动态路由 | permission-routes:fetchMyRouterRoutes → 仅 addRoute 已授权页面 |
| 路由守卫 | router.beforeEach:routePathAllowed / isBrowserPathAllowed(含 sites/:id/members 参数路径) |
| API 403 文案 | getApiErrorMessage / isPermissionDeniedError(frontend/src/shared/utils/api-error.ts);Sys/Acc 列表、过账/保存弹窗、权限树等已接入 |
| 无菜单直达 URL | 未在 allowedRoutePaths 内 → /no-permission |
| 按钮态(过账/冲红等) | POST /sys/me/auth-claims + authStore.refreshAuthClaims;API 鉴权由网关每次请求 loadUserGatewayClaims |
| 改角色后重登 | invalidateSessionsForRole / invalidateSessionsForUser / invalidateSessionsForPermission(角色绑定、权限树、用户角色站点、密码/状态/合并) |
网关
| 能力 | 实现 |
|---|---|
| 权限头 | loadUserGatewayClaimsCached → x-user-permissions 等(GATEWAY_CLAIMS_CACHE) |
| 会话 | Redis `token:{userId}:web |
Acc 后端(Nest)
| 能力 | 实现 |
|---|---|
| 路由登记表 | backend/src/libs/shared/auth/acc-route-permission-registry.ts(POST 路径 → read/write/记工审核等) |
| 全局中间件 | AccRoutePermissionMiddleware(acc-app 全路由);与 service 层 assertAcc* 双保险 |
| 未登记路由 | 默认 放行(仍由 service 鉴权);设 ACC_ROUTE_GUARD_STRICT=true 则未登记直接 403 |
| 403 响应 | throwAccPermissionDenied → code: PERMISSION_DENIED + requiredPermissions |
| 冲红权限 | assertCanCorrectWipProduction 与读/写断言一致,返回 PERMISSION_DENIED |
Sys 后端(Nest)
| 能力 | 实现 |
|---|---|
| 路由登记表 | backend/src/libs/shared/auth/sys-route-permission-registry.ts |
| 全局中间件 | SysRoutePermissionMiddleware;admin = ADMIN/SUPER_ADMIN,authenticated = 已登录 |
| 登录/注册 | /auth/* 自动 skip |
| 严格模式 | SYS_ROUTE_GUARD_STRICT=true |
| ADMIN 断言 | assertAdmin / assertAdminRole 统一 PERMISSION_DENIED |
PC 记账 — 档案类(菜单即维护权)
有对应 menu_acc_* 即可 分页、保存、删除(与商品档案一致);无单独写按钮。
| 能力 | Permission.code | 典型 API |
|---|---|---|
| 商品档案 | menu_acc_goods | POST /acc/goods/page、save、delete、BOM 等 |
| 工种 | menu_acc_work_types | POST /acc/work-types/* |
| 供应商 | menu_acc_suppliers | POST /acc/partners/supplier/* |
| 客户 | menu_acc_customers | POST /acc/partners/customer/* |
| 工人 | menu_acc_workers | POST /acc/partners/worker/*(含 worker/candidate-users) |
| 工资结算 | 读:menu_acc_settlements / mobile_manager_settlement;写:btn_acc_settlement_write | 读:page/detail/labor-pending/page/export-csv;写:post、mark-paid、unmark-paid(撤销发放,非 void) |
| 库存流水 | menu_acc_stock_ledger | POST /acc/stock-ledger/page 等;导出 CSV 另须 btn_acc_stock_ledger_export → POST /acc/stock-ledger/export-csv |
| 库存调整 | btn_acc_stock_adjust_write | POST /acc/stock-ledger/adjust/post(盘点/报废/退货回库;须 menu_acc_stock_ledger 查看流水) |
| 站点记工查看 | mobile_recorder_labour_view 或 menu_acc_production / menu_acc_workers / menu_acc_settlements 或报工审核码 | POST /acc/partners/labor-records/site-page |
小程序 本人记工(worker/me、worker/me/labor-page)仍仅校验站点范围 + 绑定工人身份(入口 mobile_worker_labour)。
PC 记账 — 单据类(读/写分离)
| 能力 | Permission.code | 典型 API |
|---|---|---|
| 原料入库菜单 | menu_acc_inbound | POST /acc/inbound/page |
| 原料入库过账 / 冲红 | btn_acc_inbound_write | POST /acc/inbound/post、void |
| 成品出库菜单 | menu_acc_outbound | POST /acc/outbound/page |
| 成品出库过账 / 冲红 | btn_acc_outbound_write | POST /acc/outbound/post、void |
| 生产记录菜单 | menu_acc_production | POST /acc/production/page |
| 生产过账 | btn_acc_production_write | POST /acc/production/post |
| 报工冲红等 | btn_acc_production_wip_correct | 生产冲红/删报工等 |
| 报工登记审核(PC) | btn_acc_labor_review | POST /acc/production/labor-submission/* 站点审核 |
| 报工登记审核(小程序经理) | mobile_manager_labor_review | 同上(经理入口) |
小程序(platform=mobile,component=recorder 等)
| 能力 | Permission.code | 页面 |
|---|---|---|
| 新建入库 | mobile_recorder_inbound_create | /pages/recorder/inbound-create |
| 新建出库 | mobile_recorder_outbound_create | /pages/recorder/outbound-create |
| 入库单列表 | mobile_recorder_inbound | /pages/recorder/inbound |
| 出库单列表 | mobile_recorder_outbound | /pages/recorder/outbound |
角色种子(sync-roles-and-permissions.mjs)
| 角色 code | 说明 |
|---|---|
ACC_PC_OPERATOR | 含全部 menu_acc_* 与写按钮 |
MINI_RECORDER | 含记录员小程序入口(含新建入/出库) |
PROD_WIP_LEAD | 生产负责人 + 冲红按钮 |
改 seed 或绑定后,用户需 重新登录 刷新 JWT 内 permissionCodes。
自动化覆盖(Jest)
| 范围 | 文件 |
|---|---|
| Acc 读/写/结算/记工 | backend/src/apps/acc/modules/acc-permission.integration.spec.ts |
| Acc / Sys 路由 Guard 规则 | assert-acc-route-permission.spec.ts、assert-sys-route-permission.spec.ts |
| Acc/Sys registry 与 Controller 一致 | pnpm --filter taskflow-backend run check:route-registry |
| 生产冲红、ADMIN、WIP 写 | assert-can-correct-wip.spec.ts、roles-assignment-permission.spec.ts;acc-permission.integration.spec.ts 含 postWipOpen / addWipOperationReport / closeWipProduction |
| 鉴权声明加载 | load-user-gateway-claims.spec.ts |
下列手工/E2E 项仍建议在预发按角色走一遍;步骤与环境变量见 permission-staging-checklist.md。
小程序 API 错误
| 能力 | 实现 |
|---|---|
网关 403 / PERMISSION_DENIED | miniapp/src/utils/api-error.ts → getMiniappApiErrorMessage;http.ts 拒绝时带权限码 |
全端业务页 Toast / err | 工人/店长/记账/me/通知等页已统一 getMiniappApiErrorMessage(首页 formatHomeLoadError 仍过滤运行时英文报错) |
| 记录员写操作页 | 入/出库创建、生产过账/在制开单等加载与提交失败已接 Toast |
自检用例
- [ ] 仅勾「入库菜单」未勾
btn_acc_inbound_write:列表可开,过账/冲红应 403。 - [ ] 勾选对应
btn_acc_*_write:过账与冲红(入/出库)可通过。 - [ ] 无站点:Acc 接口 403 / 前端不请求。
- [ ] 无权限码:过账返回 403,响应含
PERMISSION_DENIED与requiredPermissions。 - [ ] 无
menu_acc_inbound且无btn_acc_inbound_write:POST /acc/inbound/page应 403。 - [ ] 仅
menu_acc_production不可 WIP 开单/报工/关账、不可审核报工;须btn_acc_production_write或btn_acc_labor_review/mobile_manager_labor_review。 - [ ] 无
menu_acc_customers:POST /acc/partners/customer/delete应 403(保存同理)。 - [ ] 无
menu_acc_settlements:POST /acc/settlement/page应 403。 - [ ] 仅有
menu_acc_settlements无btn_acc_settlement_write:post、mark-paid应 403。 - [ ] 勾选
btn_acc_settlement_write:可过账结算、标记发放。 - [ ] 无记工查看能力码:
POST /acc/partners/labor-records/site-page应 403。 - [ ] 有
mobile_recorder_labour_view或menu_acc_production:站点记工列表可访问。