Files
smart_grid_iot/.trae/specs/refactor-system-auth-pg/tasks.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

7.0 KiB
Raw Blame History

Tasks - 系统管理与认证授权模块对齐新设计

阶段一:数据库与基础配置

  • Task 1: 切换数据库引擎为 PostgreSQL

    • 在 server/package.json 安装 pg、pg-hstore 依赖
    • 修改 server/src/config/config.default.ts:sequelize dialect 改为 postgres,host/port(5432)/database(xintong)/username/password 环境变量(默认 postgres)
    • 检查 config.local.ts 的 sync 配置合理性(表由 SQL 脚本创建,保持 sync: false 或按需调整)
    • 验证:yarn build 通过,服务可连接 PostgreSQL
  • Task 2: 补充 database/db_init.sql 初始数据

    • 补充 sys_menu 系统管理目录下的 5 个子菜单(用户管理/角色管理/菜单管理/数据字典/操作日志,含 menu_path/component/permission/sort_order)
    • 补充 sys_user:admin/admin123456(用 Node bcryptjs 生成 hash 填入 password_hash,real_name=运营管理员)
    • 补充 sys_user_role:admin → ADMIN 角色
    • 补充 sys_role_menu:ADMIN 绑定全部菜单;SALESMAN 绑定客户/项目/统计报表等业务菜单
    • 验证:在 PostgreSQL 中执行脚本无报错,各表初始数据条数正确

阶段二:后端重构

  • Task 3: 重构系统域实体层(7 个实体)

    • 新建 sysUser.entity.ts(sys_user:username/password_hash/real_name/phone/email/status/last_login_at)
    • 新建 sysRole.entity.ts(sys_role:role_code/role_name/description/sort_order)
    • 新建 sysUserRole.entity.ts(sys_user_role)
    • 新建 sysMenu.entity.ts(sys_menu:parent_id/menu_name/menu_path/component/icon/sort_order/menu_type/permission/visible)
    • 新建 sysRoleMenu.entity.ts(sys_role_menu)
    • 新建 sysDict.entity.ts(sys_dict:dict_type/dict_label/dict_value/sort_order/status)
    • 新建 sysOperationLog.entity.ts(sys_operation_log:user_id/module/action/method/params/ip/created_at)
    • 删除旧实体 user/role/userRole/permission/rolePermission/operationLog 的 .entity.ts 文件
    • 验证:yarn build 通过
  • Task 4: 重构认证与 RBAC

    • auth.service.ts:登录校验 sys_user.password_hash,更新 last_login_at;返回 accessToken/refreshToken/userInfo(id/username/realName)/roles(role_code 数组)/menus(菜单树)
    • auth.controller.ts:登录/刷新/登出/当前用户接口适配
    • 新增菜单查询能力:permission.service(或新 menu.service)提供 getUserMenus(userId)(角色经 sys_role_menu 关联 sys_menu 的树)与 checkUserPermission(userId, code)
    • rbac.middleware.ts:路径→权限标识映射改为基于 sys_menu.permission;ADMIN 角色放行;未授权返回 403
    • 验证:admin 登录返回 menus;无权限角色访问受保护接口返回 403
  • Task 5: 重构用户管理

    • user.service.ts:字段适配 real_name/phone/email(删除 nickname/avatar/last_login_ip),搜索条件更新,返回数据剔除 password_hash
    • user.controller.ts:接口保持不变,入参字段对齐
    • dto/user.dto.ts:字段更新(realName/phone/email/roleIds)
    • 验证:用户 CRUD 与角色分配联调通过
  • Task 6: 重构角色管理

    • role.service.ts:字段适配 role_code/role_name/sort_order(删除 status);权限接口改为菜单(getRoleMenus 返回角色已勾选菜单树、updateRoleMenus 批量写 sys_role_menu)
    • role.controller.ts:权限相关接口改为 /roles/:id/menus
    • dto/role.dto.ts:字段更新
    • 验证:角色列表、菜单勾选保存联调通过
  • Task 7: 新增菜单管理模块

    • 新建 menu.controller.ts + menu.service.ts:菜单树查询(含全部菜单供角色配置)、创建/编辑/删除目录或菜单、排序与可见性维护
    • 新建 dto/menu.dto.ts
    • 验证:菜单树 CRUD 联调通过
  • Task 8: 新增数据字典模块

    • 新建 dict.controller.ts + dict.service.ts:分页列表、按 dict_type 分组查询、创建/编辑/删除
    • 新建 dto/dict.dto.ts
    • 验证:字典 CRUD 与类型筛选联调通过
  • Task 9: 重构操作日志模块

    • log.service.ts / log.controller.ts:字段对齐(user_id/module/action/method/params/ip),查询支持按 user/module/时间范围筛选
    • log.middleware.ts:按新字段写入(params 存请求体),移除 url/user_agent/status_code/duration/error_message
    • 验证:写操作自动记录日志,查询接口正常
  • Task 10: 移除系统设置模块

    • 删除 system.controller.ts / system.service.ts
    • 清理 rbac/log 中间件及配置中 settings 相关映射
    • 验证:yarn build 通过,无残留引用

阶段三:前端重构

  • Task 11: 前端 API 层适配

    • api/auth.ts:登录/当前用户返回类型更新(userInfo.realName、roles、menus)
    • api/user.ts:字段更新(realName/phone/email)
    • api/role.ts:角色字段更新;权限接口改为菜单接口(getRoleMenus/updateRoleMenus)
    • 新增 api/menu.ts、api/dict.ts
    • 删除 api/system.ts
    • api/log.ts:字段与筛选参数更新
  • Task 12: 前端权限 Store 与动态路由

    • stores/permission.ts:UserInfo 更新(id/username/realName/roles/menus),提供 menus 状态
    • router/index.ts:移除 settings 路由;基于用户 menus 注册动态路由(menu_path→component 映射,缺失组件渲染"功能开发中"占位页);登录跳转仪表盘
    • layouts/index.vue:侧边栏菜单由 menus 动态渲染(目录→子菜单两级 + 图标),移除静态菜单与设置分组;用户名显示 realName
    • 移除 v-permission 指令(directives/permission.ts)及引用
    • 验证:admin 登录后侧边栏显示全部菜单,业务占位页可访问
  • Task 13: 前端页面适配

    • views/system/user/index.vue:字段改为 realName/phone/email
    • views/system/role/index.vue:权限配置弹窗改为菜单树勾选
    • 新增 views/system/menu/index.vue(树形表格 CRUD)
    • 新增 views/system/dict/index.vue(列表 + 类型筛选 CRUD)
    • views/log/operation.vue:字段与筛选更新
    • 删除 views/settings/basic.vue、views/settings/security.vue
    • 验证:各页面构建通过、交互正常

阶段四:联调与验证

  • 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]