For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: 在保持前端静态菜单模式前提下,实现 super_admin + 运营管理人员(admin) 的菜单 code 授权和多区域数据权限,并完成迁移与联调。
Architecture: 后端新增“用户-区域范围”和“用户-菜单 code”关系表;登录后前端拉取授权 code 过滤本地静态菜单;接口侧仅保留角色与区域范围守卫。
Tech Stack: FastAPI + SQLAlchemy + Vue3 + Pinia + Element Plus + MySQL
Files:
backend/scripts/migration_20260429_user_scope_menu_code.sqldocs/superpowers/specs/2026-04-29-web-admin-super-admin-menu-region-design.mdTest: docs/sql/sanqiang.sql (对照结构)
[ ] Step 1: 编写新表 DDL
[ ] Step 2: 编写历史表 DDL
[ ] Step 3: 添加必要索引与约束
[ ] Step 4: 编写角色迁移 SQL (admin -> super_admin)
[ ] Step 5: 编写测试运营管理员与授权示例 SQL
[ ] Step 6: 在测试库执行并验证建表/插数成功
Run: mysql -u<user> -p<pass> sanqiang < backend/scripts/migration_20260429_user_scope_menu_code.sql
Expected: DDL/DML 全部执行成功,无主键或唯一冲突。
Files:
backend/app/models/models.pybackend/app/crud/user_region_scope.pybackend/app/crud/user_menu_scope.pybackend/app/crud/__init__.pyTest: backend/app/crud/user.py
[ ] Step 1: 在模型中新增 SysUserRegionScope、SysUserRegionScopeHis
[ ] Step 2: 在模型中新增 SysUserMenuScope、SysUserMenuScopeHis
[ ] Step 3: 新建 CRUD,支持按 user_id 查询/全量覆盖更新
[ ] Step 4: CRUD 更新逻辑增加历史表写入
[ ] Step 5: 补齐角色枚举 super_admin 相关常量
Run: python -m py_compile backend/app/models/models.py backend/app/crud/user_region_scope.py backend/app/crud/user_menu_scope.py
Expected: 无语法错误。
Files:
backend/app/core/auth.pybackend/app/api/public.pybackend/app/core/menu_permission.pyTest: backend/app/api/public.py
[ ] Step 1: 扩展 current-user 返回 isSuperAdmin 与 regionIds
[ ] Step 2: 新增 GET /web/auth/menu-codes 接口
[ ] Step 3: 新增读取用户菜单 code 列表逻辑
[ ] Step 4: 超级管理员返回全量标识
Run: pytest -q backend/tests
Expected: 认证相关测试通过(若缺失测试,至少手工验证接口返回结构)。
Files:
backend/app/api/admin.pybackend/app/api/public.pybackend/app/api/menu.pyTest: backend/app/main.py
[ ] Step 1: 完成 GET /web/auth/menu-codes 接口
[ ] Step 2: 完成菜单授权 CRUD 接口(按 code)
[ ] Step 3: 与 super_admin 全量菜单逻辑打通
[ ] Step 4: 校验菜单 code 返回结构与前端静态路由一致
[ ] Step 5: 保持接口侧不引入 menu-code 鉴权
Run: uvicorn backend.app.main:app --reload
Expected: 服务启动成功,菜单 code 接口返回正确。
Files:
backend/app/api/admin.pybackend/app/crud/user.pybackend/app/schemas/user.pyTest: backend/app/api/admin.py
[ ] Step 1: 用户新增/编辑接口支持 regionIds 入参
[ ] Step 2: 新增 admin 可见区域集合查询逻辑
[ ] Step 3: 区域相关查询统一应用 allowed_region_ids
[ ] Step 4: 请求传入越权 regionId 时返回 403
[ ] Step 5: 保持 super_admin 不受区域限制
Run: pytest -q backend/tests
Expected: 用户与区域权限相关用例通过;越权返回 403。
Files:
web-admin/src/views/system/user/index.vueweb-admin/src/api/admin.tsweb-admin/src/api/system-manage.tsweb-admin/src/views/system/user/modules/user-menu-scope-dialog.vueTest: web-admin/src/views/system/user/index.vue
[ ] Step 1: 新增双层 Tab(运营管理人员/区域用户 + 区域 Tab)
[ ] Step 2: 新增/编辑 admin 弹窗区域改为多选
[ ] Step 3: 新增“菜单权限管理”操作与弹窗
[ ] Step 4: 对接菜单 code 授权接口
[ ] Step 5: 对接 regionIds 保存接口
Run: pnpm --dir web-admin dev
Expected: 页面可正常操作,新增/编辑/授权流程完整。
Files:
web-admin/src/store/modules/menu.tsweb-admin/src/router/core/MenuProcessor.tsweb-admin/src/router/guards/beforeEach.tsweb-admin/src/api/auth.tsTest: web-admin/src/router/modules/sqxp.ts
[ ] Step 1: 登录后调用 GET /web/auth/menu-codes
[ ] Step 2: 在本地静态菜单树按 code 过滤
[ ] Step 3: 实现“仅补齐顶级父菜单”规则
[ ] Step 4: 无菜单权限展示空状态页面
[ ] Step 5: super_admin 直接全菜单
Run: pnpm --dir web-admin build
Expected: 构建通过,路由注册无异常。
Files:
docs/superpowers/specs/2026-04-29-web-admin-super-admin-menu-region-design.mddocs/后端接口全覆盖测试与数据库校验实施跟踪.mddocs/P0-实际验证记录.mdTest: backend/scripts/migration_20260429_user_scope_menu_code.sql
[ ] Step 1: 按割接顺序执行上线前检查
[ ] Step 2: 执行迁移与测试账号准备
[ ] Step 3: 执行四类冒烟(超管/运营/菜单/区域)
[ ] Step 4: 记录接口与数据库前后快照
[ ] Step 5: 更新文档留痕
Run: git status
Expected: 变更包含代码、SQL、文档,且验证记录完整。