框架切换:Next.js 16 → Vite 5 + React 19 + React Router 7 状态管理:7 手写 hook → 4 Zustand slice 数据获取:直接 fetch → TanStack Query 5 (15 hooks) 表单:3-step 状态机 → RHF 7 + Zod 测试:0 → 25 单测 + 20 e2e (4 浏览器) Bundle:192 KB gzip (目标 < 300 KB) Lint:49 warning → 0 warning Type:33 any → 0 any S2-T-01 切 Vite 5 + React 19 框架 S2-T-02 Zustand 4 slice 替代 7 手写 hook S2-T-03 TanStack Query 5 + 15 hooks S2-T-04 Vitest + RTL + MSW + Chromatic 配置 S2-T-05 OpenAPI Codegen + Zod schema 复用 S2-T-06 RHF 7 + Zod 重写 FormCard S2-T-07 Playwright 视觉基线 4 浏览器 5 spec S2-T-08 Vite build + bundle < 300KB gzip G1 闸门 (全部通过): - typecheck: 0 error - lint: 0 error 0 warning - test (Vitest): 25/25 passed - test:e2e (Playwright): 20/20 passed - build (Vite): 326 modules 4.14s - codegen:check: OpenAPI types 非占位 Sprint 2 收口报告:SPRINT_2_CLOSEOUT_2026-07-03.md
7.3 KiB
7.3 KiB
Sprint 6 任务拆解(W10-11 · 12 人天 · 56 子任务)— V10 选项 B
技术栈:Vite 5 + React 19 + Zustand 4 + TanStack Query 5 + RHF 7 + Zod 目标:查询/审核业务 UI(SharePanel / DataQueryForm / ReviewFlow / LLMEnhancement / PosterPreview) 闸门:G6(视觉一致性 design pass + Chromatic 0 像素 diff) V10 变化:保持 12d(S6 是业务密集型,工时难压) PM 决策(2026-07-03):整体重写为新实现;Playwright 视觉回归 + Chromatic 验收
⚠️ V10 关键变化(与 V2 对比)
| 维度 | V2 | V10 选项 B |
|---|---|---|
| DataQueryForm 4 变体 | 1.0d | 1.0d(不变) |
| DataQueryResult 4 变体 | 1.0d | 1.0d(不变) |
| 业务组件库 | 7 | 7(不变) |
| a11y 集成 | S6 末 | S5 已完成,S6 复用 |
| 总估时 | 11d | 12d(略增:加 1d Chromatic 验证) |
0. Sprint 6 概览
| 任务 | 主任务 | 估时 | 子任务数 |
|---|---|---|---|
| T-D-11 | axe-core 集成(复用 S5) | 0d | 0 |
| T-D-12 | 屏幕阅读器 + 键盘测试 | 0.5d | 3 |
| T-D-13 | 替换 alert() 为 Toast | 0.25d | 2 |
| T-D-14 | SharePanel 组件 | 0.75d | 5 |
| T-D-15 | ShareStatusPanel 组件 | 0.5d | 4 |
| T-D-16 | DataQueryForm(4 变体) | 1.0d | 6 |
| T-D-17 | DataQueryResult(4 变体) | 1.0d | 6 |
| T-D-18 | ReviewFlow 组件 | 0.75d | 4 |
| T-D-19 | LLMEnhancement 组件 | 0.75d | 4 |
| T-D-20 | PosterPreview 组件 | 0.5d | 4 |
| T-D-21 | 暗色变体审计 | 1.0d | 4 |
| T-D-22 | Chromatic 视觉回归(S6 增量) | 1.0d | 4 |
| T-D-23 | ESLint 0 warning 守门 | 0.5d | 3 |
| 合计 | 13 任务(含 1 复用) | 9.5d + 缓冲 2.5d = 12d | 49 |
T-D-11 · axe-core 集成(复用 S5 · 0d · 0 子任务)
V10 收益:Sprint 5 已集成,S6 直接复用
T-D-12 · 屏幕阅读器 + 键盘测试(0.5d · 3 子任务)
ST-S6-D-12.1 VoiceOver 测试(0.25d)
- 覆盖:5 业务组件关键路径
ST-S6-D-12.2 NVDA 测试(0.125d)
ST-S6-D-12.3 键盘导航测试(0.125d)
- 覆盖:Tab / Shift+Tab / Enter / Esc / 方向键
T-D-13 · 替换 alert() 为 Toast(0.25d · 2 子任务)
ST-S6-D-13.1 grep + 替换(0.125d)
- 命令:
grep -rn "alert(" apps/web/src/ - 替换:
toast.error(message)/toast.success(message)
ST-S6-D-13.2 验证无 alert() 残留(0.125d)
T-D-14 · SharePanel 组件(0.75d · 5 子任务)
ST-S6-D-14.1 写组件骨架(0.25d)
- V10 集成:RHF + Zod
- UI/交互 1:1:与原型分享面板一致
ST-S6-D-14.2 写表单字段(0.125d)
- 分享链接有效期(7/30/永久)
- 访问密码
- 备注
ST-S6-D-14.3 接入 useShareLinkCreate(0.125d)
ST-S6-D-14.4 写 story(0.125d)
ST-S6-D-14.5 写 e2e(0.125d)
T-D-15 · ShareStatusPanel 组件(0.5d · 4 子任务)
ST-S6-D-15.1 写 3 统计卡片(0.125d)
ST-S6-D-15.2 写访问趋势 mini chart(0.125d)
ST-S6-D-15.3 写 story(0.125d)
ST-S6-D-15.4 写 e2e(0.125d)
T-D-16 · DataQueryForm(4 变体 · 1.0d · 6 子任务)
ST-S6-D-16.1 写 scoreLine 变体(0.125d)
- 字段:省份 / 年份 / 类型
ST-S6-D-16.2 写 rankEstimator 变体(0.125d)
- 字段:位次 / 选科 / 年份
ST-S6-D-16.3 写 majors 变体(0.125d)
- 字段:专业类 / 学历 / 院校
ST-S6-D-16.4 写 schools 变体(0.125d)
- 字段:院校 / 省份 / 类型
ST-S6-D-16.5 接入 TanStack Query mutations(0.25d)
- V10 收益:4 变体复用同一表单骨架
ST-S6-D-16.6 写 story(0.25d)
T-D-17 · DataQueryResult(4 变体 · 1.0d · 6 子体)
ST-S6-D-17.1 写 scoreLine 变体(0.125d)
- 展示:分数段分布表 + chart
ST-S6-D-17.2 写 rankEstimator 变体(0.125d)
- 展示:等效分数 + 院校推荐
ST-S6-D-17.3 写 majors 变体(0.125d)
- 展示:专业列表 + 院校
ST-S6-D-17.4 写 schools 变体(0.125d)
- 展示:院校卡片
ST-S6-D-17.5 接入虚拟滚动(0.25d)
- V10 收益:TanStack Virtual 万行流畅
ST-S6-D-17.6 写 story(0.25d)
T-D-18 · ReviewFlow 组件(0.75d · 4 子任务)
ST-S6-D-18.1 写审核步骤指示器(0.25d)
- V10 集成:复用 S5-D-13 Stepper
ST-S6-D-18.2 写审核表单(RHF 版 · 0.25d)
- 字段:审批意见 / 风险等级 / 备注
ST-S6-D-18.3 接入 useReview* hooks(0.125d)
ST-S6-D-18.4 写 story + e2e(0.125d)
T-D-19 · LLMEnhancement 组件(0.75d · 4 子任务)
ST-S6-D-19.1 写 Provider 选择器(0.25d)
- V10 集成:复用 T-B-17 LLM provider
ST-S6-D-19.2 写流式结果展示(0.25d)
- V10 集成:SSE + Markdown 渲染
ST-S6-D-19.3 接入 useAuditEnhanceMutation(0.125d)
ST-S6-D-19.4 写 story + e2e(0.125d)
T-D-20 · PosterPreview 组件(0.5d · 4 子任务)
ST-S6-D-20.1 写海报渲染(0.125d)
- V10 集成:html2canvas
ST-S6-D-20.2 写 QR Code 嵌入(0.125d)
ST-S6-D-20.3 接入 usePosterGenerateMutation(0.125d)
ST-S6-D-20.4 写 story + e2e(0.125d)
T-D-21 · 暗色变体审计(1.0d · 4 子任务)⚠️ V10 关键
ST-S6-D-21.1 截图所有 7 业务组件 dark mode(0.25d)
ST-S6-D-21.2 Chromatic diff 检测(0.25d)
- 验收:0 像素 diff
ST-S6-D-21.3 修复对比度问题(0.25d)
- 目标:WCAG AA(4.5:1)
ST-S6-D-21.4 提交 Chromatic 基线(0.25d)
T-D-22 · Chromatic 视觉回归(S6 增量 · 1.0d · 4 子任务)⚠️ V10 新增
ST-S6-D-22.1 7 业务组件 × 3 主题(0.25d)
- light / dark / system × 7 组件 = 21 截图
ST-S6-D-22.2 移动端 viewport(0.25d)
- 375px / 768px / 1024px × 7 组件 = 21 截图
ST-S6-D-22.3 交互态截图(0.25d)
- hover / focus / active / disabled / loading / error
ST-S6-D-22.4 提交基线(0.25d)
T-D-23 · ESLint 0 warning 守门(0.5d · 3 子任务)
ST-S6-D-23.1 清理 S6 引入的 any(0.25d)
ST-S6-D-23.2 清理 S6 引入的 unused(0.125d)
ST-S6-D-23.3 守住 Sprint 1-5 已修复规则(0.125d)
V10 验收清单(Sprint 6 G6 闸门)
G6 闸门(必须全部通过):
[ ] 7 业务组件全部完成 + story 全覆盖
[ ] axe-core 0 critical 0 serious
[ ] pnpm typecheck 0 error 0 any
[ ] pnpm lint 0 error 0 warning
[ ] pnpm test:storybook 全绿
[ ] pnpm chromatic 视觉基线 7 组件 × 3 主题 × 3 viewport × 6 态 = 378 截图
[ ] WCAG AA 对比度全通过
[ ] DataQueryForm 万行结果 < 200ms 渲染
V10 风险(Sprint 6 特有)
| ID | 风险 | 等级 | 缓解 |
|---|---|---|---|
| V10-S6-R1 | 4 变体 DataQueryForm 代码重复 | 中 | 提取 <QueryForm variant=...> 单一组件 |
| V10-S6-R2 | 暗色变体对比度不达标 | 中 | 用 design token 强制;S6-D-21 强制审计 |
| V10-S6-R3 | Chromatic 配额超限 | 低 | 累计 S2-S5 用 4 次,剩 6 次给 S6-S8 |
Sprint 6 文档状态:V10 选项 B 重写完成 总工时:12 人天(V2 是 11 人天,+1d Chromatic 验证) 总子任务:49 个(V2 是 55 个) 下一步:Sprint 5 完成后立即启动