# E-01 · 分享战报(周报图 + 邀请二维码) | 字段 | 值 | |---|---| | 项目 | EnglishDrill · `Desktop/english-drill`(backend + frontend) | | 优先级 | P0 · M1 | | 建议模型 | deepseek-v4.1-flash(主)/ gemini-3.8-flash(出图视觉验收) | | 依赖 | 无 | | 预估 | 1.5 天 | ## 一、背景(为什么做) 增长分析报告给它的定性是"**最高 ROI**"(`docs/AGI增长点分析-2026-09-11.md` P0-1):现在用户学得再好,没有任何可外发的物料——传播段为零。图里带邀请码和二维码,天然把"分享"接上"邀请裂变"。 数据全部现成:`Attempt` + `ExpLog` + `ProgressBar` 都有聚合基础。 ## 二、目标(交付物) **后端** - `GET /api/accounts/report/week` → `{ attempted, correct_rate, streak_days, words_mastered, rank, invite_code }`(本周窗口 = 最近 7 天;排名复用本轮排行榜逻辑) **前端** - `/report` 新页面: - 数据卡(本周战绩) - **Canvas 绘制 750×1000 战报图**:战绩数据 + 邀请码 + 二维码(二维码库复用项目现有依赖,若无则引入轻量 `qrcode` 生成 dataURL 再 drawImage) - 「保存图片」(`canvas.toBlob` → download)与「分享」(`navigator.share`,不支持时降级保存) - 移动端视口适配 - 入口:个人中心/学习统计页加入口按钮 ## 三、执行步骤 ```text 1. 侦察现有统计接口与邀请码字段(复用,不重造聚合) 2. 周报接口 + 用例(窗口边界、无数据用户空态) 3. /report 页 + Canvas 绘制(DPR 处理防模糊、字体加载等待 document.fonts.ready) 4. 保存/分享链路(含降级) 5. 移动端视口验证 + 出图视觉验收 ``` ## 四、验收标准 - [ ] 周报接口字段全部正确(含无数据用户返回零值不报错) - [ ] 窗口边界正确:7 天内记录计入、7 天+1 秒外不计入 - [ ] Canvas 产出 750×1000 完整图:战绩 + 邀请码 + **二维码可扫(扫码指向注册链接)** - [ ] 保存下载文件名语义化(如 `englishdrill-report-2026-09-11.png`) - [ ] `navigator.share` 可用时调起分享;不可用时降级为保存 - [ ] 移动端(390×844)完整可用 - [ ] E2E 新增用例(report 接口 + 页面可达);既有 84/84 不回归 ## 五、验收命令(参考) ```bash cd backend && python tests/e2e/run_e2e.py -k report python tests/e2e/run_e2e.py --http # 真实 granian 交叉验证 # 视觉验收:浏览器打开 /report → 生成图 → 交付截图给视觉模型检查 ``` ## 六、边界(不许做) - 不新增收费点(增长期约束,报告明确"零收费") - 不改现有排行榜/统计逻辑(复用其函数) - 不引重量级图表库(Canvas 手绘即可) ## 七、交接 写 `PROGRESS_E-01.md`(含接口用例输出、出图截图说明、扫码验证结论)。