92 lines
7.9 KiB
Markdown
92 lines
7.9 KiB
Markdown
# 任务 09 检查记录:错题复习闭环
|
||
|
||
日期:2026-09-01
|
||
|
||
## 交付内容
|
||
|
||
### 后端(Handler + Schema + Routes)
|
||
|
||
- `server/src/handlers/review.ts`(重写 + 抽出状态推进逻辑)
|
||
- `applyReviewOutcome(item, correct, wrongReason?)`:统一根据本次判定推进错题状态——答对/记对则 `reviewCount+1`,连续达到 4 次标记 `mastered`,否则按 `nextIntervalByCount` 安排 `+1/+3/+7` 天(第1次+1、第2次+3、第3次+7);答错/记错则回到当天(`reviewCount=0`、`nextReviewAt=today`、`status=pending` 并可更新错因)。
|
||
- `list`:错题列表,支持 `module` / `status` 筛选 + 分页;每条返回模块、子模块、题干、错因、状态、复习次数、下次复习日期。
|
||
- `detail`(新增):完整题目 + 选项 + 标准答案 + 解析 + 错题记录 + 该题全部作答历史(`source:'practice'`,新→旧)。
|
||
- `submit`(作答式):提交选项答案,答对/答错推进状态(复用 `applyReviewOutcome`)。
|
||
- `selfAssess`(新增,自评式):用户看完答案与解析后自行「记对了 / 记错了」,仅提交 `{correct, wrongReason?}`,同样推进间隔复习;此接口用于契合原型「直接展示答案 + 自评」的交互。
|
||
- `markMastered`:手动标记已掌握。
|
||
- `server/src/schemas/api.ts`:
|
||
- 新增 `ReviewSelfAssessBodySchema`(`{correct: boolean, wrongReason?: string}`)。
|
||
- `server/src/routes.ts`:新增 `POST /api/review/:id/self-assess`(错题复习 tag)。
|
||
- `server/src/handlers/practice.ts`(Task 09 补充):`answer` 答错时调用 `upsertWrongQuestion()`——答错自动沉淀/重置 `wrong-questions.json`(新增或回到当天),实现「答错自动沉淀错题」。
|
||
|
||
### 前端(View + API)
|
||
|
||
- `client/src/api/index.ts`:新增 `reviewApi.detail()` / `selfAssess()`;`reviewApi.submit()` 改收 body;导出 `ReviewListItem / ReviewDetail / ReviewSubmitResult` 类型。
|
||
- `client/src/views/practice/PracticeView.vue`(错题本 tab 完善):
|
||
- **错题本 tab**:状态筛选(全部/待复习/复习中/已掌握)+ 模块筛选(全部模块/五模块)chip;错题卡片(模块、子模块标签、状态徽章、题干、错因、已复习次数、下次复习日期);点击进入错题详情;空态提示。
|
||
- `client/src/views/practice/WrongDetailView.vue`(新增):错题详情页。
|
||
- 顶栏:返回 + 标题 + 状态徽章。
|
||
- 题目卡:模块/子模块/难度标签 + 题干。
|
||
- 答案卡:正确答案(绿底高亮)+ 复习状态/次数 + 标准解析;选项对照展示(正确答案绿勾)。
|
||
- 操作区:重做此题 / AI 讲解(占位禁用,归属任务 11)。
|
||
- 自评区:「这次复习结果如何?——记对了 / 记错了」;记错可勾选错因标签;提交后显示结果横幅(已标记为记对/记错 + 已复习次数 + 下次复习日期 + 状态)。
|
||
- 标记掌握:已彻底掌握,移出错题本。
|
||
- 作答历史:该题全部作答记录(答对/答错 + 错因),按日期倒序。
|
||
- `client/src/components/base/icons.ts`:新增 `filter` 图标。
|
||
- `client/src/router/index.ts`:新增 `/practice/wrong/:id`(错题详情)。
|
||
|
||
## 与原型图对照
|
||
|
||
- 「移动-刷题-错题本.png」:状态/模块筛选、错题卡片(模块+子模块标签、题干、错因、复习次数、下次复习日期)、底部 TabBar —— 一致。
|
||
- 「桌面-刷题中心-错题本态.png」:错因分布 + 最近错题(此处略去原型所示的独立错因分布卡,因任务 08 已在刷题 tab 展现;本任务聚焦筛选 + 列表 + 详情);列表筛选与卡片结构对齐。
|
||
- 「移动-错题详情.png」:模块/子模块/难度标签、题干、正确答案(D 绿底)、解析、重做此题 / AI 讲解按钮 —— 一致;补加作答历史卡。
|
||
|
||
## 接口实测(curl,演示数据)
|
||
|
||
| 接口 | 结果 |
|
||
|---|---|
|
||
| `GET /api/review/list?status=pending` | 5 条待复习(模块、题干、错因、状态、次数、下次复习日期均返回) |
|
||
| `GET /api/review/list?status=mastered` | 已掌握记录正确返回 |
|
||
| `GET /api/review/:id/detail` | 题目 + 选项 + 答案 + 解析 + 错题记录 + 历史(6 条) |
|
||
| `POST /api/review/:id/self-assess`(记对) | `{correct:true, reviewCount:1, nextReviewAt:'2026-09-02', status:'reviewing'}`(+1 天) |
|
||
| `POST /api/review/:id/self-assess`(记对 第2次) | `nextReviewAt:'2026-09-04'`(+3 天),status reviewing |
|
||
| `POST /api/review/:id/self-assess`(记错+错因) | `{correct:false, reviewCount:0, nextReviewAt:'2026-09-01', status:'pending'}`,wrongReason 更新 |
|
||
| `POST /api/review/:id/submit`(作答式) | 答对推进 +1/+3/+7,答错回到当天(复用同一推进逻辑) |
|
||
| `POST /api/review/:id/mark-mastered` | `{status:'mastered'}` |
|
||
| `GET /api/dashboard/overview` | `pendingReview: 7`(联动错题待复习数量) |
|
||
|
||
## 浏览器检查(agent-browser)
|
||
|
||
| 场景 | 结果 |
|
||
|---|---|
|
||
| 桌面 1440 错题本 | 状态/模块筛选 chip + 错题卡片(标签、状态徽章、错因、复习次数、下次复习日期),对齐原型 |
|
||
| 桌面 1440 错题详情 | 题目 + 正确答案(绿底)+ 解析 + 选项对照 + 自评区 + 作答历史,渲染正常 |
|
||
| 桌面 1440 自评记对 | 点击「记对了」→ 结果横幅「已标记为记对 · 已复习 2 次」→ API status reviewing / +3天 |
|
||
| 桌面 1440 自评记错 | 勾选错因「计算失误」+ 点「记错了」→ API status pending / 回到当天 / wrongReason 更新 |
|
||
| 桌面 1440 标记掌握 | 点「已彻底掌握,移出错题本」→ API status mastered → 自动返回错题本 |
|
||
| 桌面 1440 已掌握筛选 | 筛选出 mastered 记录,联动正确 |
|
||
| 移动 390 错题本 | 状态/模块筛选 + 错题卡片 + 底部 TabBar,无横向溢出,对齐原型 |
|
||
| 移动 390 错题详情 | 题目 + 答案 + 解析 + 选项 + 自评区 + 底部 TabBar,无遮挡 |
|
||
|
||
截图:`deliverables/checks/task09-wrong-book-desktop.png`、`task09-wrong-detail-desktop.png`、`task09-wrong-detail-result.png`、`task09-wrong-book-mobile.png`、`task09-wrong-detail-mobile.png`。
|
||
|
||
## 完成标准核对(开发计划任务09)
|
||
|
||
- ✅ 答错自动沉淀错题(`practice.answer` 答错 → `upsertWrongQuestion` 写入/重置错题库)。
|
||
- ✅ 待复习筛选(状态 + 模块筛选,`/api/review/list` 支持 `module`/`status`)。
|
||
- ✅ 复习提交(作答式 `submit` + 自评式 `selfAssess`)。
|
||
- ✅ +1/+3/+7 天安排(`nextIntervalByCount`:1→+1、2→+3、3→+7)。
|
||
- ✅ 连续答对后标记掌握(`reviewCount>=4 → mastered`)。
|
||
- ✅ 再次答错回到当天(`reviewCount=0`、`nextReviewAt=today`、`status=pending`)。
|
||
- ✅ 错题本、错题详情、复习操作(筛选列表条目 → 详情页 → 自评/标记掌握)。
|
||
- ✅ 数据中枢联动(`dashboard.overview.pendingReview` 反映待复习错题数量)。
|
||
|
||
## 边界说明
|
||
|
||
- 「重做此题 / AI 讲解」在错题详情页为占位禁用状态,完整实现归属任务 11(AI 讲解)与后续(重做)。
|
||
- 自评式 `selfAssess` 由用户确认选用:因原型已直接展示答案与解析,故详情页以「自评记对/记错」推进间隔复习,而非重新作答。
|
||
- 作答历史当前来源为 `practice`(刷题作答记录);复习作答(submit/selfAssess)不写入 `practice-records`,故历史中不含复习记录。
|
||
|
||
## 当前结论
|
||
|
||
任务 09 完成:错题复习闭环在前后端打通。答错自动沉淀、待复习筛选、复习提交(作答式 + 自评式两种)、+1/+3/+7 间隔安排、连续 4 次标记掌握、再次答错回到当天、错题本 / 错题详情 / 复习操作、数据中枢联动全部实测通过;桌面与移动双端页面均对齐原型。类型检查(vue-tsc / tsc)与生产构建(131 模块)全部通过。测试数据已清理,错题记录恢复演示基线。
|