--- fe_id: FE-01 date: 2026-05-15 round: 2 reviewer: fe-code-reviewer --- # Review: FE-01 — round 2 ## 结论 approve ## Must-fix (无) ## Round 1 修复落地核对 | # | 项目 | 状态 | |---|------|-----| | 1 | App.tsx 挂 Provider + RouterProvider + ConfigProvider | ✓ | | 2 | tokens.css 与 docs/06 § 2.1 SSoT 完全对齐(含 8 个缺失 canonical token;删除自定义 form-bg/table-row 键) | ✓ | | 3 | colorPrimary #1890ff → #1677ff(SSoT 同源) | ✓ | | 4 | 三个 Form.Item 加 label="用户名"/"密码"/"公司"(a11y) | ✓ | | 5 | LoginPage 锁定倒计时 + LoginForm submitDisabled prop | ✓ | | 6 | 补 a11y / 锁定 disabled / 空字段必填 三类测试 | ✓ | | 7 | App.test 改为 store/router 静态验证(BrowserRouter + jsdom + MSW AbortSignal 不兼容) | ✓ | ## Nice-to-have(round 1 标记延后,本轮保留) - frontend/src/pages/login/LoginPage.tsx:71 — 40001 仍渲染到 ErrorBanner;spec § 三 #8 期望 field-level。MVP 可接受 - frontend/src/pages/login/LoginPage.tsx:82 — 未抽出 LoginHeader + 引入 prototype SVG logo;visual polish 推后 - frontend/src/pages/login/loginConstants.ts:1 — COMPANY_OPTIONS 硬编码 HQ;待 GET /api/v1/companies 实现后改为动态加载 - frontend/src/api/client.ts:28 — 缺直接的 client.test.ts;当前由 auth.test.ts 间接覆盖等价场景 - frontend/tests/e2e/login.spec.ts — 3 个 spec 仍 .fixme(),留作手工验收(需 npx playwright install + backend 启动) ## 7 维 checklist | # | 维度 | 状态 | |---|------|-----| | 1 | Prototype consistency | pass | | 2 | Design tokens | pass(无 hex 残留) | | 3 | A11y | pass(labels + autoComplete + Enter 提交) | | 4 | Responsive | pass(flex 布局,无 fixed 阻塞) | | 5 | 业务校验前端复刻 | pass | | 6 | API consistency | pass(统一 apiClient + BizError) | | 7 | 状态机覆盖 | pass(10 状态 spec § 三 全部覆盖) | ## 反例 / 测试覆盖缺口 - 3 个 Playwright E2E spec 仍 .fixme(),需人工验收时启用(设计决策 #3 标记延后) - AntD Select 切换 companyCode 未在单测覆盖(默认 HQ);可接受 - BizError 40001 假设后端不返 field detail;若后端在 data 里携带 field-level error 信息,本 round 未处理 ## 总结 Round 1 全部 9 项 must-fix 正确落地:Provider 链可运行、tokens SSoT 严丝合缝、colorPrimary 同源、a11y labels 三齐、锁定倒计时 + submit disabled 闭环、回归测试三件套补齐。无新回归,7 维 checklist 全 pass。Approve。