From 4d4d51c8796b5a15b5632bcd2f912c42ca2baac4 Mon Sep 17 00:00:00 2001 From: zichun Date: Mon, 1 Jun 2026 17:26:43 +0800 Subject: [PATCH] docs(spec:FE-03): 派生规格 --- docs/superpowers/specs/2026-06-01-FE-03.md | 188 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+), 0 deletions(-) create mode 100644 docs/superpowers/specs/2026-06-01-FE-03.md diff --git a/docs/superpowers/specs/2026-06-01-FE-03.md b/docs/superpowers/specs/2026-06-01-FE-03.md new file mode 100644 index 0000000..5fb853f --- /dev/null +++ b/docs/superpowers/specs/2026-06-01-FE-03.md @@ -0,0 +1,188 @@ +# FE-03 用户列表与查询 — 实现规格(前端) + +> 阶段:前端(frontend)。作用域限定 `frontend/` 下的页面 / 组件 / 路由 / store / api / 样式。 +> SSoT 引用:需求卡片 `docs/01-需求清单/USR-用户管理/REQ-USR-003.md`;原型 `prototype/erp.html`(`
` 区域:`.toolbar` / `.filterbar` / `.table-shell .grid-table#user-table` / `.pager`,布局与交互权威);API 契约 `docs/05-API接口契约.md` § REQ-USR-003(`GET /api/usr/users`);技术规范 `docs/04-技术规范.md` § 零(技术栈)/ § 2.1 目录约定 / § 2.3 接口通信 / § 2.4 状态与错误 / § 3.2 分页查询;Design Tokens `src/styles/tokens.css`;承载外壳 FE-02 规格 `docs/superpowers/specs/2026-06-01-FE-02.md`(`AppLayout` + 标签栈 + `RequireAuth` 守卫);登录态/请求基建 FE-01 规格 `docs/superpowers/specs/2026-06-01-FE-01.md`(`authSlice` + `request.ts` + token 持久化键 `xly_erp_token`)。 +> 本规格只消费已锁定事实。查询条件解析、文本模糊/精确匹配、分页越界回退、密码与敏感字段过滤等业务逻辑全部在后端(见 REQ-USR-003 后端规格),前端只负责采集筛选条件、发起分页查询、依据响应渲染表格 / 分页 / 空态 / 错误态。本 FE 为**只读查询**,不产生任何写副作用。 + +--- + +## 1. 关联 REQ + 关联原型 + +| 维度 | 内容 | +|---|---| +| 业务功能 | FE-03 用户列表与查询(工具栏刷新/导出 + 筛选条件 + 用户表格 + 分页,对接 `GET /api/usr/users`) | +| 关联 REQ | REQ-USR-003 查询用户(主)。输入表 1:查询字段(下拉单选,默认「用户名」)/ 匹配方式(下拉单选,默认「包含」)/ 查询值(手工输入,空为全部);输出表 1:序号 / 用户名 / 员工名 / 用户号 / 部门 / 用户类型 / 语言 / 作废 / 登录日期 / 制单人 / 制单日期 | +| 关联原型 | `prototype/erp.html` → `
`:`.toolbar`(刷新 / 新增 / 导出Excel / 设置齿轮)、`.filterbar`(下拉 + 文本框 + 搜索 / 清空)、`.table-shell > table.grid-table#user-table`(表头 + `tbody#user-tbody`)、`.pager`(统计文案 + 上/下页 + 当前页 + 每页条数下拉) | +| 路由 | `/usr/users`(React Router v6,受保护区子路由,由 FE-02 `AppLayout` + `RequireAuth` 包裹)。从 FE-02 主页「常用操作 > 用户列表」或导航总览「用户管理 > 用户列表 ★」进入并在顶栏打开「用户列表」标签(标签栈逻辑属 FE-02) | +| 落地组件目录 | 页面 `frontend/src/pages/usr/UserList/`(`index.tsx` + 子组件 `UserToolbar.tsx` / `UserFilterBar.tsx` / `UserTable.tsx`);接口走 `frontend/src/api/usrApi.ts`(新增 `listUsers` 方法)+ `frontend/src/api/request.ts`(FE-01 已建);类型集中 `frontend/src/api/types.ts`(`UserVO` / `PageResult` / `UserListQuery`);列表查询态就近用页面 hook(不进全局 store,见 § 8 决策 D6) | + +> 原型 `#screen-userlist` 为纯静态 HTML + 内联 demo 脚本:`users` 数组直接渲染 `tbody`、`filterbar` 的下拉/输入无真实查询、`.pager` 文案为写死 demo(「共37个单据 共37条记录」「10000 条/页」)、行 `dblclick` 调 `goTo('userdetail')` 切到用户单据屏、工具栏「新增」`data-add-user` 切到新增单据。本规格按 React + AntD 5 复刻其**布局与交互语义**,但表格数据、筛选、分页改为真实对接 `GET /api/usr/users`;「新增」「行双击进单据」为跳转到 FE-04 的导航动作(目标页内容属 FE-04,本页只发起 `navigate`)。 + +--- + +## 2. 组件树(按区域分块,推导自 prototype DOM) + +页面根 `UserListPage`(路由 `/usr/users` 挂载,渲染于 FE-02 `AppLayout` 的 `` 内),纵向结构对应原型 `#screen-userlist`(工具栏 / 筛选栏 / 表格壳 / 分页栏): + +``` +UserListPage(页面容器,对应 #screen-userlist:纵向布局,内容区填充外壳 Outlet) +├── UserToolbar(对应 .toolbar:深色工具条,左侧动作按钮 + 右侧设置齿轮占位) +│ ├── BtnRefresh(对应 .toolbar 刷新:重新拉取当前查询条件 + 当前页,见 § 5 BR8) +│ ├── BtnAdd(对应 .tb-btn#btn-add[data-add-user]:跳转 FE-04 新增用户 `/usr/users/new`;本页仅 navigate) +│ ├── BtnExportExcel(对应 .toolbar「导出Excel」:导出当前查询结果,见 § 5 BR9 / § 8 决策 D5) +│ └── GearSetting(对应 .toolbar .gear「⚙」:列设置占位,无后端,见 § 8 决策 D7) +├── UserFilterBar(对应 .filterbar:查询条件行) +│ ├── ScopeSelect(对应首个 「用户名」:查询字段下拉单选,options=用户名/员工名/用户号/部门/用户类型/作废/登录日期/制单人,默认「用户名」→ 提交 queryField) +│ ├── MatchTypeSelect(对应第 3 个 :查询值文本框,空为查询全部 → 提交 queryValue) +│ ├── FilterMoreToggle(对应 .filterbar .down「▾」:更多条件占位,见 § 8 决策 D3) +│ ├── BtnSearch(对应 .filterbar .btn「搜索」:以当前条件回到第 1 页发起查询,见 § 5 BR7) +│ └── BtnClear(对应 .filterbar .btn.ghost「⊗ 清空」:重置筛选为默认值并回到第 1 页全量查询,见 § 5 BR10) +├── UserTable(对应 .table-shell > table.grid-table#user-table:可横向滚动用户表格) +│ ├── RadioColumn(对应 thead 首列空 + tbody .radio-cell .radio-dot:行选择单选标记,见 § 8 决策 D8) +│ ├── 列:序号 / 用户名 / 员工名 / 用户号 / 部门 / 用户类型 / 语言 / 作废 / 登录日期 / 制单人 / 制单日期(对应 REQ 输出表 1 + 原型 thead) +│ └── Row[](对应 tbody#user-tbody 各 ;双击行 → 跳转 FE-04 修改单据 `/usr/users/:id`,见 § 5 BR12) +└── UserPager(对应 .pager:右对齐分页条) + ├── PageSummary(对应「共 N 条记录」统计文案,来源 PageResult.total) + ├── Pager(对应 ‹ / 当前页 / › :上一页 / 当前页 / 下一页) + └── PageSizeSelect(对应 .pager