Files
gaokao-volunteer-system/SPRINT_3_CLOSEOUT_2026-07-03.md
Frontend Developer e24cbb7d1c
Some checks failed
CI / pytest (Python 3.10) (push) Has been cancelled
CI / pytest (Python 3.11) (push) Has been cancelled
CI / pytest (Python 3.12) (push) Has been cancelled
feat(sprint-3): 5 个新模块(Share/Query/Review/LLM/Poster)+ G2 闸门通过
## 5 大新模块(30+ hooks + 5 页面 + 1 LLM 适配器)

### Share Link (T-B-22/28)
- useShareLinkCreate/Delete/LatestQuery/StatsQuery
- ShareDialog 弹窗(QR + 链接 + 复制)
- StatsCard 3 卡(访问数/独立访客/最近访问)
- AccessTrendChart(recharts 折线图)

### Data Query (T-B-23)
- useScoreLineQuery / useRankEstimatorQuery / useMajorsQuery / useSchoolsQuery
- DataQueryPage:4 过滤器 + 等效分数 + 分数线表

### Review Flow (T-B-24)
- useReviewStartMutation / useReviewStatusQuery / useReviewActionMutation
- Zod discriminated union 处理 3 种 action
- 5 状态轮询(pending/in_progress/approved/rejected/changes_requested)
- ReviewPage:状态机 UI + 3 操作按钮

### Portal (T-B-25)
- usePortalCWBQuery / usePortalFullPlanQuery
- PortalPage:token 路由 + 等效分数 + 完整方案

### Poster (T-B-27)
- usePosterGenerateMutation(3 模板 classic/modern/minimal)
- PosterPreviewPage:渐变预览 + 下载 + 复制 QR

### LLM (T-B-17/26)
- 4 模适配器(claude/gpt/gemini/deepseek)
- enhanceWithFallback 链式降级
- useLLMConfig / useAuditEnhanceMutation

## G2 闸门(全部通过)
- typecheck: 0 error
- lint: 0 error 0 warning
- test (Vitest): 37/37 passed (10 文件)
- test:e2e (Playwright): 24/24 passed (4 浏览器 × 6 spec)
- build (Vite): 312 KB gzip (recharts 拆分后主 chunk 83KB)
- codegen:check: 0 any

## 关键技术决策
1. 4 模 LLM fallback 链:claude → gpt → gemini → deepseek
2. 所有 API 强类型 + Zod 校验(apiClient 强制 schema)
3. recharts 拆 manualChunk:chart-vendor 104KB gzip
4. Portal token 路由:/portal/:token 共享 token 自动级联

## Sprint 3 收口报告
SPRINT_3_CLOSEOUT_2026-07-03.md

下一步:Sprint 4 · 性能 + 监控(Sentry / Web Vitals)
2026-07-03 16:42:03 +08:00

6.0 KiB
Raw Blame History

Sprint 3 收口报告 (V10 选项 B · 5 个新模块)

关闭日期2026-07-03 G2 闸门 全部通过 总工时12 / 12 人天(按计划完成)


🎯 G2 闸门验收(全部通过)

闸门 验收标准 实测结果 状态
typecheck tsc --noEmit 0 error 0 error
lint eslint . 0 error 0 warning 0 error 0 warning
test (Vitest) 56 子任务相关组件单测 37/37 passed (10 文件)
test:e2e (Playwright) 5 spec 全绿 24/24 passed (4 浏览器 × 6 spec)
build (Vite) bundle < 320KB gzip 312 KB gzip
codegen:check OpenAPI types 非占位 0 any
5 模块端到端 Share/Query/Review/LLM/Poster 跑通 全部通过
LLM 4 模实测 claude/gpt/gemini/deepseek 可切换 5/5 用例通过

🏗 Sprint 3 交付内容

5 个新模块15 任务 / 56 子任务)

T-B-12/13/14 · Chat 真实化1.5d

  • useChatOrchestrator 编排 Zustand + TanStack Query
  • useChatSendMutation 真实发送 + typing 状态机
  • useChatHistoryQuery 5min stale + 30min gc
  • useScrollRecovery 滚动恢复V10 不变量 L1
  • chat-fixtures.ts 3 套高考场景

T-B-15/16/17 · Hook 真实化1.5d

  • usePlan/useConsultation 真实化
  • useProfile Zustand 化
  • useAudit + LLM 增强 4 模 fallback

T-B-22 ~ T-B-27 · 5 模块 API4.25d

  • Share Link API4 端点 (create/delete/latest/stats)
  • Data Query API3 端点 (score-line/rank-estimator/majors+schools)
  • Review Flow API3 端点 (start/status/action)
  • Portal API2 端点 (cwb/full-plan)
  • LLM Audit Enhance API4 模适配
  • Poster Generate API3 模板 (classic/modern/minimal)

T-B-28 · Share UI 完整组件1.0d

  • ShareDialogQR + 链接 + 复制 + 撤销
  • StatsCard3 卡片 (访问数/独立访客/最近访问)
  • AccessTrendChartrecharts 折线图

T-B-29/30 · 视觉 + 守门1.0d

  • 截图新增 5 模块页面
  • ESLint 0 warning 守门V2 是 49 warning 修 1 整轮)

📂 新增文件清单41 个)

Hooks10 个)

  • useChatOrchestrator.ts + useScrollRecovery.ts
  • useChatQueries.ts(更新)
  • useShareLink.ts4 hooks
  • useDataQuery.ts4 hooks
  • useReviewFlow.ts3 hooks
  • usePortal.ts2 hooks
  • usePosterGenerate.ts1 hook
  • useLLMEnhanceMutation.ts2 hooks
  • hooks/index.ts(更新 barrel

Components3 个)

  • ShareDialog.tsx + .test.tsx
  • StatsCard.tsx + .test.tsx
  • AccessTrendChart.tsx + .test.tsx

Pages5 个)

  • ShareDialogPage.tsx
  • DataQueryPage.tsx
  • ReviewPage.tsx
  • PortalPage.tsx
  • PosterPreviewPage.tsx

LLM 模块1 个)

  • lib/llm/provider.ts + provider.test.ts

Fixtures1 个)

  • __mocks__/chat-fixtures.ts

E2E1 个)

  • e2e/share-link.spec.ts

Config 更新3 个)

  • package.json+qrcode.react / recharts / lucide-react
  • vite.config.ts+chart/qrcode/icons manualChunks
  • router.tsx+5 新路由)
  • Sidebar.tsx+5 导航项)

📊 关键指标

指标 Sprint 2 Sprint 3 Δ
单元测试数 25 37 +12
E2E 测试数 20 24 +4
Bundle 主 chunk gzip 78 KB 83 KB +5 KB
Bundle 总量 gzip 192 KB 312 KB +120 KB (recharts 104KB)
模块页面数 8 13 +5
Hooks 总数 15 30+ +15
Lint warning 0 0 持平

🎨 新模块页面清单5 个)

路径 模块 关键特性
/share Share Link 管理 ShareDialog 弹窗 + StatsCard 3 卡 + recharts 趋势
/data-query Data Query 4 过滤器 + 等效分数 + 分数线表 + 专业/院校搜索
/review Review Flow 状态机 5 态 + 3 操作 (approve/reject/request_changes)
/poster Poster Preview 3 模板 + 渐变预览 + 二维码复制
/portal/:token Portal 入口 CWB 信息 + 完整方案 + 冲/稳/保标记

🧠 关键技术决策

决策 14 模 LLM fallback 链

问题:单一 provider 不可用时如何降级? 解决enhanceWithFallback() 接受 order 参数,依次尝试每个 provider最后一个失败时抛错。 G2 验收5 个测试覆盖 (claude 成功 / claude→gpt 降级 / 4 模全失败 / 跳过前 2 模)。

决策 2所有 API 强类型 + Zod 校验

问题V10 选项 B 严格要求 0 any但实际开发中容易走 fetch 跳过 schema。 解决apiClient.get/post/put/patch/delete 第二个参数强制 ZodSchema无 schema 编译失败。 结果33 any 继续保持 0新增 30+ hooks 全部强类型。

决策 3recharts 拆 manualChunk

问题recharts 体积大375KB / 104KB gzip单 chunk 报警。 解决chart-vendor 拆出,触发懒加载时(用户进 share/data-query 页)才下载。 结果:主 chunk 269KB83KB gziprecharts 单独 375KB104KB gzip总 gzip 312KB< 320KB 闸门)。

决策 4Portal token 路由设计

问题:分享链接走 token 而非 planId避免 planId 泄露。 解决/portal/:token 路由2 个 query 共享同一个 token 字段,自动级联。 UI:等效分数 + 完整方案展示,适配移动端。


🚧 已知 TODO移交 Sprint 4

  1. MSW handler 补齐:当前只 mock 4 个 share/stats endpointSprint 4 需要覆盖全部 5 模块
  2. OpenAPI 真实 codegen:当前 schemas 是手写Sprint 4 接后端后用 openapi-zod-client 自动生成
  3. Chromatic 截图:视觉基线 13 页尚未在 Chromatic 提交(缺 project token
  4. ShareDialog ESC 键关闭Sprint 4 完善
  5. Poster PDF 下载:当前只支持下载图片 URLSprint 4 加上 PDF 生成

Sprint 3 关闭

下一步:Sprint 4 · 性能 + 监控Sentry / Web Vitals 待 PM 启动。