gwy-exam/docs/checks/task-09.md
2026-09-01 16:47:25 +08:00

92 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 任务 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 讲解」在错题详情页为占位禁用状态,完整实现归属任务 11AI 讲解)与后续(重做)。
- 自评式 `selfAssess` 由用户确认选用:因原型已直接展示答案与解析,故详情页以「自评记对/记错」推进间隔复习,而非重新作答。
- 作答历史当前来源为 `practice`刷题作答记录复习作答submit/selfAssess不写入 `practice-records`,故历史中不含复习记录。
## 当前结论
任务 09 完成:错题复习闭环在前后端打通。答错自动沉淀、待复习筛选、复习提交(作答式 + 自评式两种)、+1/+3/+7 间隔安排、连续 4 次标记掌握、再次答错回到当天、错题本 / 错题详情 / 复习操作、数据中枢联动全部实测通过桌面与移动双端页面均对齐原型。类型检查vue-tsc / tsc与生产构建131 模块)全部通过。测试数据已清理,错题记录恢复演示基线。