组织、用户与权限体系

这套正式管理能力是新系统的账户基础。默认后台提供首页、部门、用户、角色、字典、本人资料和真实界面偏好;任务、资源和表单等学习示例通过 VITE_ADMIN_EXAMPLES=true 显式开启。模块开关不替代账户授权,关闭模块的菜单、搜索结果、路由和旧页签都不能继续进入。字典选项按实际业务授权读取,具体合同见 字典管理与业务消费。

管理列表优先占用工作区。当前位置只在顶栏展示一套语义面包屑;手机保留当前页名称。部门树、筛选、工具栏和表格使用统一的 UG UI 公开组件,长名称不挤走其他有效列,完整名称通过提示和详情查看。

稳定主体与关系

合同 含义 后续业务如何使用
AdminUserId 字符串用户 ID;AdminIdentity.id 与 ManagementUser.id 对应同一主体 业务记录使用 createdBy、ownerId 等字段引用该 ID,不以账号或姓名作主键
ManagementUser.departmentId 用户当前所属部门,可为空 组织归属、成员列表;不能直接解释为服务端数据范围
ManagementUser.roleIds 分配给用户的角色实体 ID,可有多个 编辑账户关联,角色成员筛选
ManagementRole.code 稳定角色编码 认证快照 AdminIdentity.roles 中的可信角色编码;与角色 ID、展示名称区别使用
ManagementRole.permissions 角色包含的功能权限码 服务端计算有效权限,登录/刷新返回身份的权限快照
ManagementDepartment.parentId 部门父级 ID,可为空 保持组织树;禁止循环及有关联成员或子部门时删除;停用保留既有关联,阻止新增归属

管理列表、成员入口与关联详情使用同一套 Provider 查询。用户筛选的 department、role 等 URL 状态转换为 Provider 筛选,服务端必须先筛选、再排序分页和计算总数,不能只过滤当前页。精简关联选项使用 users/options,不为了展示名称读取用户无权查看的完整资源。

页面与后端的边界

flowchart LR
  Pages[管理页面与业务页面] --> UI[UG UI 公开组件]
  Pages --> Access[Access Control Provider]
  Pages --> Data[Data Provider]
  Session[认证状态] --> Auth[Auth Provider]
  Access --> Snapshot[可信身份与权限快照]
  Auth --> Adapter[接入方 Adapter]
  Data --> Adapter
  Adapter --> Backend[Go / Java / TypeScript / Python 后端]

Auth Provider 负责登录、退出、会话恢复与刷新;Data Provider 负责资源查询和写入;Access Control Provider 统一判断功能与记录操作。业务页面消费这些合同,不直接请求接口或根据后端语言分支。路径、字段命名、分页封装、认证头和错误映射在 Adapter 收敛,见 后端 Adapter。数字后端 ID 应在接入边界无损转换为字符串,不能经 JavaScript 不安全整数损失精度。

具备对应 read 权限时,编辑先读取最新记录;仅有列表和更新权限时只编辑已授权的列表字段,不额外读取无权访问的详情。提交只包含实际发生变化的字段,未改的权限、关系和服务端字段不随旧列表快照覆盖。详情失败提供重试;写入保护和字段错误按共享合同处理。演示 Provider 验证页面行为,不能证明真实后端授权和持久化已接通。

权限登记与扩展

auth/permissions.ts 保存统一的前端权限目录。system 模块提供用户、部门、角色、字典与设置权限;业务权限放在自己的模块入口,由应用在生成导航之前统一登记:

// src/modules/orders/index.ts 的模块声明中:
permissions: [
  { code: "orders:list", label: "查询订单", group: "订单" },
  { code: "orders:approve", label: "审批订单", group: "订单" },
],

数组项结构为 { code, label, group, description? }。模块入口同时登记自己的 pages,不修改核心 app/modules.ts 或 system 模块。学习权限由 examples 模块按开关登记。不能在运行中的页面修改目录;重复权限码和无效定义会直接报错。

目录登记仅提供含义与操作选项,不授予当前用户权限。角色编辑不能分配超出当前账户授权的权限。既有记录中的未登记权限只读显示并保留,批量全选或保存其他字段不得删除它们,也不得从输入或服务端目录自动加入可授予集合。内置角色、自删/自停用、最后启用超管以及部门关系保护在所有适配器下保持一致,真实服务端必须再次执行。

权限选择复用 UGSelectionList 的公开分组、搜索和全选/半选能力;领域规则留在 Admin。新系统的用户、角色、组织与接口 DTO 不进入 UG UI。

接入新业务

  1. 复用稳定用户 ID,定义业务资源、字段和权限目录,不再创建第二套账户或角色体系。
  2. 在业务模块的 pages 登记页面、菜单、访问声明与原生 loader;消费业务只写所选端,模板 system 功能同步双端。
  3. 页面使用现有列表、编辑与详情模式,组合 UG UI 公开组件;公共缺口在 UG UI 扩充。
  4. 在 Provider/Adapter 映射真实后端,统一筛选、总数、部分更新与错误,不在页面解析后端 DTO。
  5. 验证无权限、空数据、失败重试、关联跳转、刷新恢复和响应式,再验证实际后端会话及 CRUD 持久化。

开户、邀请、密码重置、数据范围、多租户与具体后端实现需要相应服务端合同;当前用户模型不存密码。它们可继续扩展这套稳定主体,但不能用演示创建用户或前端按钮代替后端能力。