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

108 lines
7.0 KiB
Markdown
Raw Permalink 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.
# Tasks - 系统管理与认证授权模块对齐新设计
## 阶段一:数据库与基础配置
- [x] Task 1: 切换数据库引擎为 PostgreSQL
- [x] 在 server/package.json 安装 `pg`、`pg-hstore` 依赖
- [x] 修改 server/src/config/config.default.ts:sequelize dialect 改为 `postgres`,host/port(5432)/database(xintong)/username/password 环境变量(默认 postgres)
- [x] 检查 config.local.ts 的 sync 配置合理性(表由 SQL 脚本创建,保持 sync: false 或按需调整)
- [x] 验证:yarn build 通过,服务可连接 PostgreSQL
- [x] Task 2: 补充 database/db_init.sql 初始数据
- [x] 补充 sys_menu 系统管理目录下的 5 个子菜单(用户管理/角色管理/菜单管理/数据字典/操作日志,含 menu_path/component/permission/sort_order)
- [x] 补充 sys_user:admin/admin123456(用 Node bcryptjs 生成 hash 填入 password_hash,real_name=运营管理员)
- [x] 补充 sys_user_role:admin → ADMIN 角色
- [x] 补充 sys_role_menu:ADMIN 绑定全部菜单;SALESMAN 绑定客户/项目/统计报表等业务菜单
- [x] 验证:在 PostgreSQL 中执行脚本无报错,各表初始数据条数正确
## 阶段二:后端重构
- [x] Task 3: 重构系统域实体层(7 个实体)
- [x] 新建 sysUser.entity.ts(sys_user:username/password_hash/real_name/phone/email/status/last_login_at)
- [x] 新建 sysRole.entity.ts(sys_role:role_code/role_name/description/sort_order)
- [x] 新建 sysUserRole.entity.ts(sys_user_role)
- [x] 新建 sysMenu.entity.ts(sys_menu:parent_id/menu_name/menu_path/component/icon/sort_order/menu_type/permission/visible)
- [x] 新建 sysRoleMenu.entity.ts(sys_role_menu)
- [x] 新建 sysDict.entity.ts(sys_dict:dict_type/dict_label/dict_value/sort_order/status)
- [x] 新建 sysOperationLog.entity.ts(sys_operation_log:user_id/module/action/method/params/ip/created_at)
- [x] 删除旧实体 user/role/userRole/permission/rolePermission/operationLog 的 .entity.ts 文件
- [x] 验证:yarn build 通过
- [x] Task 4: 重构认证与 RBAC
- [x] auth.service.ts:登录校验 sys_user.password_hash,更新 last_login_at;返回 accessToken/refreshToken/userInfo(id/username/realName)/roles(role_code 数组)/menus(菜单树)
- [x] auth.controller.ts:登录/刷新/登出/当前用户接口适配
- [x] 新增菜单查询能力:permission.service(或新 menu.service)提供 getUserMenus(userId)(角色经 sys_role_menu 关联 sys_menu 的树)与 checkUserPermission(userId, code)
- [x] rbac.middleware.ts:路径→权限标识映射改为基于 sys_menu.permission;ADMIN 角色放行;未授权返回 403
- [x] 验证:admin 登录返回 menus;无权限角色访问受保护接口返回 403
- [x] Task 5: 重构用户管理
- [x] user.service.ts:字段适配 real_name/phone/email(删除 nickname/avatar/last_login_ip),搜索条件更新,返回数据剔除 password_hash
- [x] user.controller.ts:接口保持不变,入参字段对齐
- [x] dto/user.dto.ts:字段更新(realName/phone/email/roleIds)
- [x] 验证:用户 CRUD 与角色分配联调通过
- [x] Task 6: 重构角色管理
- [x] role.service.ts:字段适配 role_code/role_name/sort_order(删除 status);权限接口改为菜单(getRoleMenus 返回角色已勾选菜单树、updateRoleMenus 批量写 sys_role_menu)
- [x] role.controller.ts:权限相关接口改为 `/roles/:id/menus`
- [x] dto/role.dto.ts:字段更新
- [x] 验证:角色列表、菜单勾选保存联调通过
- [x] Task 7: 新增菜单管理模块
- [x] 新建 menu.controller.ts + menu.service.ts:菜单树查询(含全部菜单供角色配置)、创建/编辑/删除目录或菜单、排序与可见性维护
- [x] 新建 dto/menu.dto.ts
- [x] 验证:菜单树 CRUD 联调通过
- [x] Task 8: 新增数据字典模块
- [x] 新建 dict.controller.ts + dict.service.ts:分页列表、按 dict_type 分组查询、创建/编辑/删除
- [x] 新建 dto/dict.dto.ts
- [x] 验证:字典 CRUD 与类型筛选联调通过
- [x] Task 9: 重构操作日志模块
- [x] log.service.ts / log.controller.ts:字段对齐(user_id/module/action/method/params/ip),查询支持按 user/module/时间范围筛选
- [x] log.middleware.ts:按新字段写入(params 存请求体),移除 url/user_agent/status_code/duration/error_message
- [x] 验证:写操作自动记录日志,查询接口正常
- [x] Task 10: 移除系统设置模块
- [x] 删除 system.controller.ts / system.service.ts
- [x] 清理 rbac/log 中间件及配置中 settings 相关映射
- [x] 验证:yarn build 通过,无残留引用
## 阶段三:前端重构
- [x] Task 11: 前端 API 层适配
- [x] api/auth.ts:登录/当前用户返回类型更新(userInfo.realName、roles、menus)
- [x] api/user.ts:字段更新(realName/phone/email)
- [x] api/role.ts:角色字段更新;权限接口改为菜单接口(getRoleMenus/updateRoleMenus)
- [x] 新增 api/menu.ts、api/dict.ts
- [x] 删除 api/system.ts
- [x] api/log.ts:字段与筛选参数更新
- [x] Task 12: 前端权限 Store 与动态路由
- [x] stores/permission.ts:UserInfo 更新(id/username/realName/roles/menus),提供 menus 状态
- [x] router/index.ts:移除 settings 路由;基于用户 menus 注册动态路由(menu_path→component 映射,缺失组件渲染"功能开发中"占位页);登录跳转仪表盘
- [x] layouts/index.vue:侧边栏菜单由 menus 动态渲染(目录→子菜单两级 + 图标),移除静态菜单与设置分组;用户名显示 realName
- [x] 移除 v-permission 指令(directives/permission.ts)及引用
- [x] 验证:admin 登录后侧边栏显示全部菜单,业务占位页可访问
- [x] Task 13: 前端页面适配
- [x] views/system/user/index.vue:字段改为 realName/phone/email
- [x] views/system/role/index.vue:权限配置弹窗改为菜单树勾选
- [x] 新增 views/system/menu/index.vue(树形表格 CRUD)
- [x] 新增 views/system/dict/index.vue(列表 + 类型筛选 CRUD)
- [x] views/log/operation.vue:字段与筛选更新
- [x] 删除 views/settings/basic.vue、views/settings/security.vue
- [x] 验证:各页面构建通过、交互正常
## 阶段四:联调与验证
- [ ] Task 14: 全流程联调
- [ ] 前端 yarn dev + 后端服务 + PostgreSQL 环境启动
- [ ] admin 登录 → 仪表盘 → 系统管理(用户/角色/菜单/字典/日志)全流程走通
- [ ] 业务员角色仅见授权菜单,未授权接口 403
- [ ] 日志自动记录写操作并可查询
- [ ] 边界检查:无菜单角色登录、删除被占用角色、重复用户名/角色编码
## Task Dependencies
- [Task 2] depends on [Task 1](PG 环境就绪后可执行 SQL)
- [Task 3] 先行;[Task 4-10] depends on [Task 3](实体)
- [Task 11] depends on [Task 5-9](接口就绪)
- [Task 12] depends on [Task 11](API 类型)
- [Task 13] depends on [Task 11]
- [Task 14] depends on [Task 4-13]