# 临抢修系统权限与三员设计 > 确认日期:2026-09-20 > 参考项目:`D:\rxkj\zonghepingtai` > 当前阶段:先完成业务功能和页面,不启用真实权限控制。 ## 1. 第一阶段口径 - 第一阶段所有登录用户统一使用 `admin` 系统管理员账号,先跑通功能。 - 第一阶段暂不启用用户、角色、租户的访问拦截。 - 第一阶段不因当前用户角色或租户不同而隐藏业务菜单、按钮或数据。 - 后端仍保留清晰的权限扩展点,但第一阶段不放置会阻断业务流程的授权注解和路由守卫。 - 系统管理中的“角色管理”“菜单管理”“菜单权限管理”页面先行提供,配置数据可用于后续启用权限控制。 - 菜单仍采用数据库动态配置,不在前端写死完整菜单树。 - 后续正式权限模型中,菜单必须同时满足“租户已授权”和“用户角色已授权”两个条件后才能使用。 - “三员控制”纳入后续安全设计,第一阶段由 `admin` 临时承担全部职责,不能把第一阶段的单账号方式直接视为正式生产权限方案。 ## 2. 系统管理菜单 系统管理一级菜单下共 6 个子菜单: | 序号 | 子菜单 | 第一阶段 | 说明 | |---:|---|---|---| | 1 | 承修单位管理 | 实现 | 名称、简称、单位性质、排序、联系人、是否失信单位 | | 2 | 产品结构树管理 | 实现 | 型号 -> X号 -> 一级系统 -> 二级系统 -> 设备,共 5 级 | | 3 | 设备基础库管理 | 实现 | 一级系统 -> 二级系统 -> 设备,共 3 级;产品结构树设备关联设备基础库设备类 | | 4 | 角色管理 | 页面和基础数据实现,暂不拦截 | 角色名称、角色编码、排序、备注;预留角色菜单授权和角色人员维护 | | 5 | 菜单管理 | 实现 | 树形维护菜单、路由、类型、图标、排序、显示状态和权限标识 | | 6 | 菜单权限管理 | 页面和授权数据实现,暂不拦截 | 预留“租户授权 + 角色授权”双重勾选规则 | ### 2.1 角色管理 建议字段: - 角色名称 - 角色编码 - 角色类型 - 排序 - 备注 - 状态 - 创建人、创建时间、修改人、修改时间 建议操作: - 查询、刷新、新增、修改、删除 - 配置菜单权限 - 维护角色人员 第一阶段不根据角色限制功能访问,仅保存角色和角色菜单关系,便于后续启用。 ### 2.2 菜单管理 菜单采用树形结构,主要字段: - 上级菜单 `PID` - 菜单名称 `NAME` - 菜单类型 `TYPE`:菜单、按钮、系统、页面等,最终取值以设计为准 - 路由地址 `URL` - 菜单参数 `PARAMS` - 图标 `ICON` - 权限标识 `PERMISSIONS` - 排序 `SORT` - 是否显示 `SHOW_MENU` - 是否刷新 `IS_REFRESH` - 描述 `REMARK` - 功能说明 `REMARK2` - 删除标记和审计字段 菜单维护要求: - 新增、修改、删除后刷新菜单缓存。 - 删除父菜单前先校验是否存在子菜单。 - 删除菜单时同步清理角色菜单关系。 - 前端登录后从后端获取当前用户可以使用的菜单树,并动态生成路由。 - 第一阶段由后端返回 `admin` 可见的全部已配置菜单。 - 后续启用权限后,菜单变更应在刷新菜单或重新登录后生效。 ### 2.3 菜单权限管理 最终规则: 1. 先选择租户。 2. 再选择角色。 3. 对该租户和该角色分别勾选菜单。 4. 同一菜单必须同时出现在租户授权和角色授权中,用户才能访问。 5. 页面入口和按钮权限使用同一套规则。 6. 用户拥有多个角色时,角色菜单先取并集,再与租户菜单取交集。 等价逻辑: ```text 用户可用菜单 = 租户已授权菜单 ∩(用户所有有效角色已授权菜单的并集) ``` 第一阶段: - 页面、表结构和保存关系可以先行实现。 - 查询菜单导航时不应用租户或角色过滤。 - `admin` 可使用全部菜单。 - 后续启用时再打开上述交集过滤。 ## 3. 动态菜单与路由 参考项目做法: - 前端登录后调用 `/sys/menu/nav` 获取菜单树。 - 前端递归处理菜单,根据 `URL` 加载页面组件。 - 通过 Vue Router 的 `addRoutes` 动态添加路由。 - 菜单通过 `PID` 组成树,通过 `SORT` 排序。 - 菜单新增、修改、删除、角色菜单授权、租户菜单授权后清理权限缓存。 本项目沿用同一思路,但不机械复制参考项目的租户、公司和角色结构。第一阶段先保证: - 菜单由数据库配置。 - 页面路由由菜单配置驱动。 - 新增业务页面时不需要改动完整前端菜单树。 - 后续启用租户和角色过滤时,只替换导航查询规则,不重写前端菜单渲染逻辑。 ## 4. 预留逻辑表 以下为本项目 `LX` 模式下建议的逻辑对象;实际表名、字段名在 DM8 中统一使用大写,并在建表前按现有数据库规范复核: | 逻辑表 | 用途 | 关键字段 | |---|---|---| | `LX.SYS_MENU` | 动态菜单 | `ID`、`PID`、`NAME`、`TYPE`、`URL`、`PARAMS`、`ICON`、`PERMISSIONS`、`SORT`、`SHOW_MENU`、`IS_REFRESH`、`REMARK`、`REMARK2` | | `LX.SYS_ROLE` | 角色 | `ID`、`NAME`、`CODE`、`TYPE`、`SORT`、`REMARK`、`STATUS` | | `LX.SYS_ROLE_MENU` | 角色菜单关系 | `ROLE_ID`、`MENU_ID` | | `LX.SYS_USER_ROLE` | 用户角色关系 | `USER_ID`、`ROLE_ID` | | `LX.SYS_TENANT_MENU` | 租户菜单关系 | `TENANT_ID`、`MENU_ID` | | 登录日志 | 三员审计基础 | 用户、时间、IP、结果、浏览器信息 | | 操作日志 | 三员审计基础 | 用户、菜单、动作、请求、结果、时间、IP | 说明: - 本项目的租户定义尚未确认,`TENANT_ID` 的取值来源需要结合 `SYS_DEPT`、`SYS_USER` 和实际组织机构规则另行确认。 - 第一阶段表结构可以先建立,但不启用过滤逻辑。 - 后续如果确定不需要多租户数据隔离,只保留菜单的双授权规则,也仍需明确“租户维度”的实际业务含义。 ## 5. 三员控制 “三员控制”暂按常见的信息系统三员分立理解为: 1. 系统管理员 2. 安全保密管理员 3. 安全审计员 第一阶段不启用三员分权,统一由 `admin` 跑通功能。后续正式启用时,建议按以下职责分离: | 角色 | 主要职责 | 禁止或限制 | |---|---|---| | 系统管理员 | 用户、角色、菜单、参数、设备基础数据、系统运维 | 不得删除或篡改安全审计日志;不得单人同时拥有审计员全部权限 | | 安全保密管理员 | 安全策略、敏感词字典、数据密级或敏感标记、授权规则 | 不得删除审计日志;不得随意修改自身权限 | | 安全审计员 | 查看登录日志、操作日志、安全事件和审计报表 | 不得修改业务数据、角色菜单和安全策略;审计记录只读 | 三员分权原则: - 三员应使用不同账号,不能共用一个账号。 - 系统管理员和安全审计员的权限不能合并给同一账号。 - 重要配置、授权和删除操作必须写入操作日志。 - 审计日志只能追加和查询,不能通过普通业务页面修改或删除。 - 审计员的操作本身也要留痕。 - 三员的具体岗位边界、是否允许兼任、是否需要双人审批,待后续安全方案确认。 ## 6. 参考项目对应位置 参考项目主要实现位置: - 后端菜单模型:`zt/core/src/main/java/com/zt/modules/sys/model/SysMenu.java` - 后端角色模型:`zt/core/src/main/java/com/zt/modules/sys/model/SysRole.java` - 后端角色菜单模型:`zt/core/src/main/java/com/zt/modules/sys/model/SysRoleMenu.java` - 后端菜单控制器:`zt/core/src/main/java/com/zt/modules/sys/controller/SysMenuController.java` - 后端角色控制器:`zt/core/src/main/java/com/zt/modules/sys/controller/SysRoleController.java` - 后端租户控制器:`zt/core/src/main/java/com/zt/modules/sys/controller/SysTenantController.java` - 菜单 SQL:`zt/core/src/main/resources/mapper/dm/sys/SysMenuDao.xml` - 角色菜单 SQL:`zt/core/src/main/resources/mapper/dm/sys/SysRoleMenuDao.xml` - 前端动态路由:`web/src/router/router.js` - 角色管理页面:`web/packages/views/modules/sys/role.vue` - 角色编辑页面:`web/packages/views/modules/sys/role-add-or-update.vue` - 角色菜单授权页面:`web/packages/views/modules/sys/role-menu.vue` - 菜单管理页面:`web/packages/views/modules/sys/menu.vue` - 菜单编辑页面:`web/packages/views/modules/sys/menu-add-or-update.vue` - 租户菜单授权页面:`web/packages/views/modules/sys/tenant-menu.vue` 本项目只参考其动态菜单、树形配置、角色菜单关系和缓存刷新思路,不直接复制其公司、租户、安全框架和业务耦合代码。 ## 7. 当前结论与待确认 已确认: - 第一阶段不做角色控制,所有用户使用 `admin`。 - 先完成业务页面和动态菜单。 - 系统管理增加角色管理、菜单管理、菜单权限管理。 - 菜单权限的最终规则是租户和角色都勾选后才能使用。 - 后续增加三员控制。 待确认: - 本项目“租户”的实际定义及与 `SYS_DEPT`、`SYS_USER` 的关系。 - 角色类型和预置角色的最终编码。 - 菜单类型、按钮权限标识和菜单字段的最终清单。 - 三员的具体职责边界、是否允许兼任、是否需要双人审批。 - 首次启用权限控制时,`admin` 是否保留超级管理员绕过规则。