- 切换数据库为PostgreSQL,更新依赖与配置 - 重构权限体系,使用sys_user/sys_role/sys_menu等新实体替代旧模型 - 移除旧的用户角色/权限/系统设置相关代码与实体 - 新增字典、菜单管理模块与基础CRUD接口 - 优化鉴权逻辑,基于菜单权限标识进行接口校验 - 前端同步更新API、路由与权限控制逻辑 - 删除冗余的v-permission指令与相关代码
126 lines
8.5 KiB
Markdown
126 lines
8.5 KiB
Markdown
# 系统管理与认证授权模块对齐新设计 Spec
|
||
|
||
## Why
|
||
系统设计已完成调整(鑫潼智电系统):数据库从 MySQL 6 表升级为 PostgreSQL 37 表;系统管理域改为 7 张 `sys_` 前缀表;RBAC 由"权限码"模型改为"菜单级"模型(`sys_menu`/`sys_role_menu`);新增数据字典(`sys_dict`);原"系统设置"模块在新设计中无对应表。现有系统管理与认证授权代码仍基于旧模型,需要整体对齐新设计。
|
||
|
||
## What Changes
|
||
- **数据库引擎切换**:MySQL → PostgreSQL 15+(连接配置、安装 `pg`/`pg-hstore` 驱动;`database/db_init.sql` 已更新为 PostgreSQL 脚本)
|
||
- **系统域数据模型重构**(7 张表,替代原 6 张表):
|
||
- `sys_user`:username / password_hash / real_name / phone / email / status / last_login_at(移除 nickname、avatar、last_login_ip)
|
||
- `sys_role`:role_code / role_name / description / sort_order(移除 status)
|
||
- `sys_user_role`:user_id / role_id(不变)
|
||
- `sys_menu`:菜单级 RBAC,menu_type 1目录/2菜单(本次不启用 3按钮),含 menu_path / component / icon / sort_order / permission / visible(替代 permissions 表)
|
||
- `sys_role_menu`:role_id / menu_id(替代 role_permissions 表)
|
||
- `sys_dict`:**新增**数据字典表
|
||
- `sys_operation_log`:字段精简为 user_id / module / action / method / params / ip / created_at(移除 username、url、user_agent、request_params、response_data、status_code、duration、error_message)
|
||
- **认证逻辑适配**:登录基于 `sys_user` + `password_hash` 比对,更新 `last_login_at`;登录返回 userInfo(含 realName)、roles(role_code)、menus(角色菜单树)
|
||
- **RBAC 重构**:菜单级权限。前端由菜单树驱动侧边栏与路由;后端接口鉴权按"接口路径 → 菜单 permission 标识"校验,ADMIN 角色全量放行;**按钮级权限暂不保留**(v-permission 指令移除)
|
||
- **系统设置模块移除**:删除前后端系统设置代码(settings 页面、system.controller/system.service、api/system.ts)
|
||
- **新增菜单管理模块**:sys_menu 树形 CRUD(目录/菜单两级)
|
||
- **新增数据字典模块**:sys_dict CRUD 与类型分组查询
|
||
- **操作日志对齐**:实体、中间件、接口、前端页面字段更新
|
||
- **初始数据补齐**:4 个角色(ADMIN/SALESMAN/WORKER/CUSTOMER)、6 个顶级业务菜单 + 5 个系统管理子菜单、19 条字典数据、管理员账户 admin/admin123456(ADMIN 角色)及角色-菜单绑定
|
||
|
||
## Impact
|
||
- Affected specs: smart-grid-iot-admin(已完成项目,本次为增量调整)
|
||
- Affected code:
|
||
- server:config/config.default.ts、package.json、entity 全部系统域实体、controller(auth/user/role/log/menu/dict)、service(auth/user/role/log/menu/dict)、middleware(auth/rbac/log)、dto
|
||
- client:api(auth/user/role/log/menu/dict)、stores/permission.ts、router/index.ts、layouts/index.vue、views(system/user、system/role、log/operation、新增 system/menu、system/dict)、删除 views/settings
|
||
- database/db_init.sql:补充初始数据(管理员账户、角色菜单绑定、系统管理子菜单)
|
||
|
||
## ADDED Requirements
|
||
|
||
### Requirement: PostgreSQL 数据库连接
|
||
系统 SHALL 使用 PostgreSQL 15+ 作为数据库:
|
||
- server 依赖安装 `pg`、`pg-hstore`
|
||
- `config.default.ts` 的 sequelize 数据源 dialect 为 `postgres`,连接 xintong 库
|
||
- 系统域 7 张表通过 `database/db_init.sql` 创建(Sequelize `sync: false`)
|
||
|
||
#### Scenario: 服务连接 PostgreSQL 成功
|
||
- **WHEN** 启动后端服务且本机已按 db_init.sql 建好库表
|
||
- **THEN** 服务正常启动,登录、查询等接口可正常读写 sys_ 系列表
|
||
|
||
### Requirement: 菜单级 RBAC(sys_menu)
|
||
系统 SHALL 以菜单为权限载体:
|
||
- `sys_menu` 支持两级树:目录(menu_type=1)、菜单(menu_type=2);字段含 menu_path、component、icon、sort_order、permission、visible
|
||
- 用户登录返回其角色(经 `sys_role_menu`)关联的菜单树;前端据此渲染侧边栏与动态路由
|
||
- 后端接口鉴权:RbacMiddleware 将请求路径映射为权限标识,校验用户角色关联菜单的 permission 集合;ADMIN 角色(role_code=ADMIN)直接放行
|
||
- 本次不做按钮级权限(menu_type=3、v-permission 指令移除)
|
||
|
||
#### Scenario: 登录用户仅看到被授权菜单
|
||
- **WHEN** 业务员角色登录
|
||
- **THEN** 侧边栏只渲染其角色已绑定的菜单,访问未授权接口返回 403
|
||
|
||
#### Scenario: ADMIN 全量访问
|
||
- **WHEN** 运营管理员(ADMIN 角色)登录
|
||
- **THEN** 可见全部菜单,所有受保护接口放行
|
||
|
||
### Requirement: 菜单管理模块
|
||
系统 SHALL 提供菜单管理能力:
|
||
- 菜单树查询(全部菜单,供角色配置使用)
|
||
- 目录/菜单的创建、编辑、删除、排序、可见性切换
|
||
- 权限标识(permission)维护
|
||
|
||
### Requirement: 数据字典模块
|
||
系统 SHALL 提供数据字典管理能力:
|
||
- sys_dict 的创建、编辑、删除
|
||
- 按 dict_type 分组查询、状态筛选
|
||
|
||
### Requirement: 初始数据
|
||
系统 SHALL 通过 db_init.sql 初始化:
|
||
- 4 个角色:ADMIN(运营管理员)/ SALESMAN(业务员)/ WORKER(共享电工)/ CUSTOMER(客户)
|
||
- 6 个顶级业务菜单(客户管理/项目管理/运营派单/设备监控/统计报表/系统管理)与系统管理下 5 个子菜单(用户/角色/菜单/数据字典/操作日志)
|
||
- 管理员账户 admin/admin123456(bcrypt hash,角色 ADMIN)
|
||
- 角色-菜单绑定:ADMIN 绑定全部菜单;SALESMAN 绑定客户/项目/统计报表等业务菜单;WORKER/CUSTOMER 无后台菜单
|
||
- 19 条字典数据(customer_status/equip_type/device_type/dispatch_status/pay_cycle/dispatch_type)
|
||
|
||
## MODIFIED Requirements
|
||
|
||
### Requirement: 用户管理模块
|
||
The system SHALL 管理 sys_user:
|
||
- 列表支持分页、关键词搜索(username/realName/phone)、状态筛选、角色筛选
|
||
- 新增/编辑字段:username、password、realName、phone、email、status、角色分配(roleIds)
|
||
- 删除、批量删除、状态切换(原能力保留)
|
||
- 返回数据不包含 password_hash
|
||
|
||
#### Scenario: 管理员创建用户
|
||
- **WHEN** 管理员填写 username/realName/phone/email/角色并提交
|
||
- **THEN** 系统校验唯一性与必填项,bcrypt 加密密码写入 sys_user,分配 sys_user_role,列表刷新
|
||
|
||
### Requirement: 角色管理模块
|
||
The system SHALL 管理 sys_role:
|
||
- 列表支持分页、关键词搜索(roleCode/roleName)、关联用户数统计
|
||
- 新增/编辑字段:roleCode、roleName、description、sortOrder
|
||
- 权限配置由"权限码树"改为"菜单树勾选"(sys_role_menu)
|
||
- 删除时若关联用户则禁止删除
|
||
|
||
### Requirement: 操作日志模块
|
||
The system SHALL 记录操作日志:
|
||
- 字段:user_id、module、action、method、params、ip、created_at
|
||
- 日志中间件按新字段写入,仅记录写操作(POST/PUT/DELETE)
|
||
- 查询接口支持按操作人/模块/时间范围筛选
|
||
- 前端日志页字段与接口对齐
|
||
|
||
### Requirement: 认证授权服务
|
||
The system SHALL 适配新用户模型:
|
||
- 登录:username + password 校验(sys_user.password_hash)、禁用校验、更新 last_login_at
|
||
- 登录返回:accessToken、refreshToken、userInfo(id/username/realName)、roles(role_code 数组)、menus(角色菜单树)
|
||
- 刷新 Token、当前用户信息接口同步适配
|
||
|
||
### Requirement: 前端动态菜单与路由
|
||
The system SHALL 由菜单树驱动前端:
|
||
- 侧边栏菜单由用户 menus 渲染(目录→子菜单两级,含图标)
|
||
- 动态路由按 sys_menu.menu_path/component 注册;component 缺失(未开发业务模块)时渲染"功能开发中"占位页
|
||
- 登录跳转仪表盘(仪表盘保持固定路由,不纳入菜单表)
|
||
- 移除设置页相关路由与菜单
|
||
|
||
## REMOVED Requirements
|
||
|
||
### Requirement: 系统设置模块(站点名称/Logo/会话超时/密码策略/IP白名单)
|
||
**Reason**: 新设计无对应表,模块整体移除。
|
||
**Migration**: 删除 server 端 system.controller.ts/system.service.ts、client 端 views/settings 页面与 api/system.ts,以及相关路由、菜单、日志映射与中间件引用。
|
||
|
||
### Requirement: 权限码 RBAC 与按钮级权限(permissions/role_permissions + v-permission)
|
||
**Reason**: 新设计采用菜单级 RBAC,按钮级权限暂不保留。
|
||
**Migration**: 删除 permissions/role_permissions 相关实体、服务与 DTO,由 sys_menu/sys_role_menu 替代;移除前端 v-permission 指令及按钮级权限判断;路由 meta.permission 改为基于菜单 permission 标识。
|