63 lines
2.6 KiB
Markdown
63 lines
2.6 KiB
Markdown
# 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`(含确定性选题与正确率聚合的用例输出)。
|