Files
smart_grid_iot/.trae/specs/refactor-system-auth-pg/spec.md
T
andyesfly 0a8103f33d refactor: 系统权限模块重构,迁移至PostgreSQL并对齐新设计
- 切换数据库为PostgreSQL,更新依赖与配置
- 重构权限体系,使用sys_user/sys_role/sys_menu等新实体替代旧模型
- 移除旧的用户角色/权限/系统设置相关代码与实体
- 新增字典、菜单管理模块与基础CRUD接口
- 优化鉴权逻辑,基于菜单权限标识进行接口校验
- 前端同步更新API、路由与权限控制逻辑
- 删除冗余的v-permission指令与相关代码
2026-08-19 14:11:34 +08:00

126 lines
8.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 系统管理与认证授权模块对齐新设计 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 标识。