## ADDED Requirements > 来源说明:文中《中科兴皖需求 V0.3》及其章节引用为历史出处,原文已清理;以下既有 SHALL 要求继续有效,当前入口见根 `AGENTS.md` 与本工程标准。 ### Requirement: 角色与菜单授权 系统 SHALL 通过 `sys_role`、`sys_role_menu` 等模型维护角色与菜单的关联;角色管理界面 SHALL 支持为角色配置可访问菜单树,且勾选子菜单时 SHALL 自动包含必要父菜单(与《中科兴皖需求 V0.3》§2.1.5 描述一致)。 #### Scenario: 勾选子菜单 - **WHEN** 管理员在角色菜单配置弹窗中仅勾选叶子菜单 - **THEN** 保存后角色 SHALL 同时获得该叶子到根路径上的父菜单权限,避免出现「有子无父」的不可达状态 ### Requirement: 数据权限范围 角色 SHALL 具有 `data_scope` 字段,取值语义为:全部、本部门、本部门及以下、仅本人、自定义等(与需求 §2.1.5 及表注释一致);当为自定义时,系统 SHALL 使用 `sys_role_data_scope_detail` 维护 `scope_type`(部门/用户)与 `scope_value`。 #### Scenario: 配置自定义数据权限 - **WHEN** 管理员将角色数据权限设为自定义并在弹窗中选择部门与用户 - **THEN** 持久化 SHALL 写入 `sys_role_data_scope_detail`,且运行时查询 SHALL 按明细过滤 ### Requirement: 多角色权限合并 单个用户允许绑定多个角色;其**菜单权限**与**数据权限** SHALL 分别取所有的角色的权限**并集**(与需求 §2.1.5「特别注意」一致)。 用户有效角色 SHALL 为:**直接绑定角色** ∪ **经启用职位(`sys_user_post` → `sys_post` → `sys_post_role`)继承的启用角色**(与需求 §2.1.8 一致)。停用职位、停用角色或已软删关联 SHALL NOT 参与并集。 #### Scenario: 两角色菜单合并 - **WHEN** 用户同时具有角色 R1(菜单集合 M1)与角色 R2(菜单集合 M2) - **THEN** 用户可见菜单 SHALL 为 M1 ∪ M2 #### Scenario: 两角色数据范围合并 - **WHEN** 用户同时具有角色 R1 与 R2,各自数据权限范围不同 - **THEN** 可访问数据 SHALL 为两角色数据权限的并集(在实现上与产品确认:取更宽或按需求文档并集语义) #### Scenario: 经职位继承角色 - **WHEN** 用户未直接绑定角色,但绑定启用职位 P,且 P 关联启用角色 R(菜单集合 M) - **THEN** 用户有效菜单 SHALL 包含 M,且数据权限 SHALL 按 R 的 `data_scope` 参与并集;登录门禁 SHALL 视该用户为已有有效角色 ### Requirement: 职位关联角色配置 系统 SHALL 通过 `sys_post_role` 维护职位与角色关联;职位管理界面 SHALL 支持为职位配置关联角色;用户管理界面 SHALL 支持为用户多选职位。职位本身 SHALL NOT 直接配置菜单树或独立 `data_scope`(权限仍落在 `sys_role`)。 用户详情接口 SHALL 区分:`roleIds`(直接绑定)、`postInheritedRoleIds`(职位继承)、`effectiveRoleIds` / `effectiveRoleNames`(有效并集)。用户管理新增/编辑界面 SHALL NOT 提供直接绑角色的写入控件;直接绑定由运维接口/脚本或专用授权模块维护。更新用户时若仅提交职位关联,SHALL NOT 清空该用户的直接角色绑定。 #### Scenario: 职位角色配置全量替换 - **WHEN** 管理员在职位「角色配置」中保存角色 ID 列表 - **THEN** 系统 SHALL 将该职位的有效 `sys_post_role` 关联替换为该列表(软删除旧关联) #### Scenario: 用户详情返回三层角色 - **WHEN** 调用方请求用户详情 - **THEN** 响应 SHALL 同时包含直接绑定、职位继承与有效角色字段,且有效角色与运行时菜单/数据权限所用并集一致 #### Scenario: 仅更新职位不改动直接角色 - **WHEN** 更新用户请求体仅包含 `postIds`、未包含 `roleIds` - **THEN** 系统 SHALL 仅替换 `sys_user_post`,SHALL NOT 修改 `sys_user_role` ### Requirement: Web 与小程序菜单树 菜单管理 SHALL 同时支撑 Web 端与小程序端菜单;系统 SHALL 预置两棵顶层虚拟根(需求中的 parent_id=0 的「web 端菜单」「移动端菜单」),后续菜单 SHALL 挂载其下(与需求 §2.1.6)。 #### Scenario: 新增移动端菜单 - **WHEN** 管理员新增小程序端一级菜单 - **THEN** 该节点 SHALL 挂在移动端根节点之下,且 `visible`/`status` 字段符合规范枚举 ### Requirement: 超级管理员与租户 租户管理 SHALL 仅对超级系统管理员开放(与需求 §2.1.1);其他系统管理 SHALL 在租户上下文中执行,与 `api-conventions` 中租户隔离一致。 #### Scenario: 非 superadmin 访问租户管理 - **WHEN** 非超级管理员请求租户管理接口或页面 - **THEN** 系统 SHALL 拒绝访问