docs(routing): 新增前端路由与目录规范并收敛计划路由
ci / 质量门禁 (push) Canceled after 0s

背景:
- 前端路由缺少统一规范:导航模块 key 与 URL 首段不一致,页面目录未镜像
  路由,04 规范中的历史路由示例与实际实现不符;
- 用户确认「平台」更名为「管理中心」,路由统一为 /<模块>/<功能>。

改动:
- 新增 11-前端路由与目录规范:模块与基础路径表、路径语法(复数 kebab-case、
  /new、:id、层级与 query 状态)、pages/<模块>/<功能>/ 目录映射、路由注册、
  旧链重定向、新增页面检查清单;
- 04 §8 的 API-27 改为模块化路由并链接 11;工程规范索引与 AGENTS §9 登记 11;
- 开发计划:平台更名管理中心,附录 C 页面清单收敛为模块化路由,§7.1 / §8.3
  同步,版本记录补「路由规范回写」;
- A1 实施报告路由说明更新为 /system/users(旧 /users* 重定向)。

影响面:
- 仅文档与规范,不改变功能范围、权限点与后端接口;后续批次按 11 执行。

回滚方式:
- 回滚本提交即恢复原附录 C 与 04 §8 描述;代码不受影响。

验证证据:
- pnpm format:check 通过;路由与代码行为见相邻的 web 重构提交。
This commit is contained in:
Stev_Wang committed 2026-11-03 10:30:55 +08:00
1 parent f8b6232b4c
commit a1e28daec5
6 files changed
+152 -22

No files matched your search

@@ -23,7 +23,7 @@
| A1-FE-03 | `/me` 缓存、`usePermission` / `<Can>`、路由与按钮级控制、403 页 | ✅ |
| A1-QA-01 | 登录 / 刷新 / 登出 / 停用 / 角色变更 / 越权 6 类用例 | ✅(接口 int + 浏览器 e2e) |
口径确认(用户拍板):初始密码由管理员设定、首次登录强制修改;手机号列表掩码、详情全号仅 `user:manage` 可见;路由按开发计划附录 C 使用 `/users`。
口径确认(用户拍板):初始密码由管理员设定、首次登录强制修改;手机号列表掩码、详情全号仅 `user:manage` 可见;路由按开发计划附录 C 使用 `/system/users`(2026-11-03 路由规范调整后)。
---
@@ -52,7 +52,7 @@
### 2.3 前端(`apps/web`)
- 路由:`/users`、`/users/new`、`/users/:id`、`/403`;`RequireAuth` + `RequirePermission`;未登录跳 `/login?redirect=`(含 `sanitizeRedirect` 防开放重定向);无权限进 403;停用账号回登录并给出停用说明。
- 路由:`/system/users`、`/system/users/new`、`/system/users/:id`、`/403`(旧 `/users*` 已加重定向);`RequireAuth` + `RequirePermission`;未登录跳 `/login?redirect=`(含 `sanitizeRedirect` 防开放重定向);无权限进 403;停用账号回登录并给出停用说明。
- 权限:`usePermission` / `usePermissions` + `<Can>`,无权限按钮不渲染;`/me` 走 TanStack Query 缓存。
- 登录:方案 B 左右分屏(左 560 品牌 + 能力 + CSS 规格缩略,右表单卡);真实 `POST /auth/login`;错误 / loading / 锁定态;首次登录强改在登录页内完成,成功后清会话要求用新密码重登。
- 用户列表 / 详情:左 400 列表 + 右 760 详情(基本资料 / 角色权限 / 负责客户 / 登录与安全 / 操作记录);搜索、部门、角色、状态、排序、游标分页;停用 / 启用 / 客户转交 / 调整角色 / 超管授予均「对象卡 → 后果 → 勾选」二次确认;编辑资料弹窗;空 / 加载 / 错误三态;1024 / 1280 适配。
@@ -24,6 +24,7 @@
| V0.1 | 2026-11-02 | 初稿:全项目 M0–M4 开发计划(M0 十二批次任务级 WBS;M1–M4 迭代 + 任务组 WBS;M5 预研边界)、七个管理模块专项、前后端并行与联调机制、质量门禁、风险与验收、待确认事项 |
| V0.1(进度回写) | 2026-11-02 | A0 工程骨架与契约基线完成:批次总览增加状态列、A0 WBS 标注完成、回写执行证据与偏差;不改变原计划范围与验收口径 |
| V0.1(进度回写 A1) | 2026-11-03 | A1 身份认证与用户管理完成:批次总览更新 A1 状态、A1 WBS 标注完成、回写执行证据与遗留;不改变原计划范围与验收口径 |
| V0.1(路由规范回写) | 2026-11-03 | 「平台」更名「管理中心」,前端路由统一为 `/<模块>/<功能>`(A1 用户页改为 `/system/users`);同步附录 C 页面清单与前端目录约定,不改变功能范围与验收口径 |
### 0.2 引用约定
@@ -912,7 +913,7 @@ PRD §7 把 **M-27(素材元素级拆解)** 与「自动字幕 → TTS 配
| 项 | 内容 |
| --- | --- |
| 页面 | `/login`、`/users`、`/users/new`、`/users/:id`、部门树(内嵌用户页) |
| 页面 | `/login`、`/system/users`、`/system/users/new`、`/system/users/:id`、部门树(内嵌用户页) |
| 接口 | `POST /auth/login`、`/auth/refresh`、`/auth/logout`、`GET /me`、`GET /users`、`POST /users`、`PATCH /users/{id}`(含角色分配)、`POST /users/{id}/transfer-customers` |
| 关键规则 | 部门最多两级;手机号唯一;一人可多角色;离职**停用不删**,名下客户必须转交;超管建议 ≤ 2 人、授予二次确认并审计;停用即时生效 |
| 页面状态 | 空态(无用户 / 无搜索结果)、加载骨架、错误重试、无权限 403;停用用户列表默认隐藏、可筛选查看 |
@@ -1012,8 +1013,8 @@ PRD §7 把 **M-27(素材元素级拆解)** 与「自动字幕 → TTS 配
| 项 | 约定 |
| --- | --- |
| 目录 | `apps/web/src/{app,pages,features,components,hooks,lib,stores}`;按业务域分 `features/<domain>`,禁止在 `apps/web` 内自建"共享包" |
| 路由 | 路由表集中声明(路径、标题、权限点、菜单分组);路由守卫读 `/me` 权限;无权限跳 403 |
| 目录 | `apps/web/src/{app,pages,features,components,hooks,lib,stores}`;页面按 `pages/<模块>/<功能>/` 与路由一一对应,详见 [11-前端路由与目录规范](../工程规范/11-前端路由与目录规范.md);禁止在 `apps/web` 内自建"共享包" |
| 路由 | 统一 `/<模块>/<功能>`(见 [11](../工程规范/11-前端路由与目录规范.md)),路由表集中声明(路径、标题、权限点、菜单分组);守卫读 `/me` 权限;无权限跳 403 |
| 权限渲染 | 统一 `usePermission` / `<Can permission="...">`;禁止 `removeChild` 式隐藏;无权限按钮不渲染但接口仍要校验 |
| 数据请求 | TanStack Query:queryKey 规范、失效策略、乐观更新仅用于勾选类;错误统一 toast + 页面级错误态 |
| 表单 | 优先 Semi Form;动态表单走 `form-engine`;字段校验前后端同源(Zod / schema) |
@@ -1368,22 +1369,22 @@ infra/:compose、Nginx、监控、备份脚本占位
| 路由 | 页面 | 权限点 | 批次 |
| --- | --- | --- | --- |
| `/login` | 登录 | 公开 | A1 |
| `/users`、`/users/new`、`/users/:id` | 用户与部门 | `user:view` / `user:manage` | A1 |
| `/roles`、`/roles/:id` | 角色与权限 | `role:view` / `role:manage` | A2 |
| `/industries` | 行业管理 | `industry_pack:view` / `customer:manage` | A3 |
| `/customers`、`/customers/new`、`/customers/:id` | 客户管理 | `customer:view` / `customer:manage` | A3 |
| `/customer-groups` | 客户组 | `customer_group:manage` | A3 |
| `/customer-fields/approvals` | 字段审批 | `customer_field:approve` | A3 |
| `/dicts`、`/dicts/:type` | 字典 | `dict:view` / `dict:edit` | A4 |
| `/system/configs` | 系统配置 | `system:configure` | A4 |
| `/audit-logs`、`/audit-logs/:id` | 审计 | `audit:view` | A5 |
| `/tasks`、`/tasks/:id` | 任务中心 | `media:view` / `media:generate` | A6 |
| `/ai/providers`、`/ai/routes`、`/ai/prompts`、`/ai/usage` | AI 配置 | `ai:view` / `ai:configure` | A7 |
| `/industry-packs`、`/industry-packs/:id/versions/:ver` | 行业包与设计器 | `industry_pack:*` | B0–B2 |
| `/assets`、`/assets/:id` | 资产包 | `asset:*` | B1 |
| `/brief-cards`、`/brief-cards/new`、`/brief-cards/:id` | 要素卡 | `brief_card:*` | B2 |
| `/script-templates` | 脚本模板 | `script_template:*` | B2 |
| `/exports`、`/exports/:id` | 导出与归档 | `export:create` | B3 |
| `/system/users`、`/system/users/new`、`/system/users/:id` | 用户与部门 | `user:view` / `user:manage` | A1 |
| `/system/roles`、`/system/roles/:id` | 角色与权限 | `role:view` / `role:manage` | A2 |
| `/system/industries` | 行业管理 | `industry_pack:view` / `customer:manage` | A3 |
| `/system/customers`、`/system/customers/new`、`/system/customers/:id` | 客户管理 | `customer:view` / `customer:manage` | A3 |
| `/system/customer-groups` | 客户组 | `customer_group:manage` | A3 |
| `/system/customer-fields/approvals` | 字段审批 | `customer_field:approve` | A3 |
| `/system/dicts`、`/system/dicts/:type` | 字典 | `dict:view` / `dict:edit` | A4 |
| `/system/settings` | 系统配置 | `system:configure` | A4 |
| `/system/audit-logs`、`/system/audit-logs/:id` | 审计 | `audit:view` | A5 |
| `/material/tasks`、`/material/tasks/:id` | 任务中心 | `media:view` / `media:generate` | A6 |
| `/system/ai`(后续 `/system/ai/providers` 等) | AI 配置 | `ai:view` / `ai:configure` | A7 |
| `/system/industry-packs`、`/system/industry-packs/:id/versions/:ver` | 行业包与设计器 | `industry_pack:*` | B0–B2 |
| `/assets/library`、`/assets/library/:id` | 资产包 | `asset:*` | B1 |
| `/scripts/framework-cards`、`/scripts/framework-cards/new`、`/scripts/framework-cards/:id` | 要素卡 | `brief_card:*` | B2 |
| `/scripts/templates` | 脚本模板 | `script_template:*` | B2 |
| `/delivery/export`、`/delivery/records`、`/delivery/records/:id` | 导出与归档 | `export:create` | B3 |
| `/403`、`/404` | 异常页 | 公开 | A0 |
### D 接口清单