# E-03 · 每日一题 + 全站正确率 | 字段 | 值 | |---|---| | 项目 | EnglishDrill · `Desktop/english-drill` | | 优先级 | P0 · M2 | | 建议模型 | glm-5.3-flash(主)/ qwen3.8-flash(哈希与并发复核) | | 依赖 | 无 | | 预估 | 1 天 | ## 一、背景(为什么做) 给"每天打开"一个**除打卡之外**的理由,且每天全站同题 → 可以讨论、可以比。全站正确率是社交货币:"今天 128 人作答,正确率 43%"(增长报告 P0-3)。题库已有 226 题,选题算法几行搞定——成本极低。 ## 二、目标(交付物) **后端** - `GET /api/challenge/today` → `{ question, my_answer?, participants_today }` - 选题:`hash(日期字符串)` 对题目数取模(**确定性**:同日全站同题;跨日自动轮换;跳过软删题) - `POST /api/challenge/today` → 提交答案 `{ answer }` → 返回 `{ correct, all_correct_rate, participants_today }` - 全站正确率 = 今日该题全部作答的正确比例(实时聚合) - 同一用户重复提交:以最新为准(或幂等返回,选一种并写进用例) - 与现有 `Attempt` 打通(每日一题作答是否计入统计——**计入**,保持口径统一) **前端** - 首页顶部卡片:"每日一题"——作答交互(选择题选项/填空题输入)、提交后展示 `全站正确率 + 参与者数 + 我的结果` - 已答状态持久(刷新不丢,从后端 `my_answer` 恢复) ## 三、执行步骤 ```text 1. 侦察 Question 模型(软删字段/题型)与 Attempt 写入惯例 2. 确定性选题函数 + 单测(同日期多用户同题、跨日期轮换、软删跳过) 3. GET/POST 接口 + 并发下正确率聚合正确性 4. 首页卡片(含已答态、错误态、空题库态) 5. E2E:guest/登录两态、提交、重复提交 ``` ## 四、验收标准 - [ ] 同日任意用户 GET 得到同一题(固定日期多用户用例证明) - [ ] 跨日自动更换(mock 日期证明) - [ ] 提交返回正确率与参与人数准确(构造 2 用户 1 对 1 错 → 50%) - [ ] 重复提交行为明确定义且用例覆盖 - [ ] 首页卡片:未答/已答/空题库三态正常 - [ ] 既有 E2E 全绿 + 新增 ≥6 用例 ## 五、验收命令(参考) ```bash cd backend && python tests/e2e/run_e2e.py -k challenge python tests/e2e/run_e2e.py --http ``` ## 六、边界(不许做) - 不新建题目表/排期表(复用 Question + 哈希选题,零人工排期) - 不做推送/提醒(本轮只做入口) ## 七、交接 写 `PROGRESS_E-03.md`(含确定性选题与正确率聚合的用例输出)。