3.7 KiB
3.7 KiB
一键修复问题教案 设计文档
日期: 2026-06-15
背景: 批量生成时,AI(deepseek-v4-flash)偶尔生成格式异常的 Markdown(基础信息表以 |:---|:---| 开头,无表头行),导致解析器无法提取课题、课时等字段,产生警告(warnings)。用户需要一键重新生成所有有警告的教案并原位替换。
功能描述
在工作区工具栏新增"修复 X 篇问题教案"按钮,仅当当前整本有警告教案时显示。点击后弹出 FixBrokenDialog,列出问题教案数量,用户确认后依次重新生成并原位替换,完成后显示摘要。
数据层:useTeachingBook.ts
新增 regenerateLesson(id: DesignId): Promise<GenerateLessonResult>:
- 根据
id查找教案,取originalFilename(去掉.md后缀)作为 topic - 调用
booksApi.generateLesson(topic)获取新 Markdown - 用
parseTeachingDesign解析 - 在
book.value.designs中原位替换(splice) - 若当前选中的是该教案,更新
selectedId为新教案的 id - 调用
touch()触发自动保存 - 返回
{ ok: true }或{ ok: false, message }
暴露于 TeachingBookStore 接口。
新组件:FixBrokenDialog.vue
Props:
running: booleandone: numbertotal: numbercurrentTopic: stringerror: string | null
Emits:
start: []— 确认开始修复cancel: []— 取消(仅 running 阶段)close: []— 关闭对话框
Phase 状态(组件内部):
| phase | 触发条件 | 显示内容 |
|---|---|---|
confirm |
初始 | "共 X 篇教案有问题,重新生成可修复。" + 开始/取消按钮 |
running |
start emit 后,running=true |
进度条 + "正在修复第 X/Y 篇" + 当前课题 + 停止按钮 |
done |
running 变为 false 且无 error |
"已修复 Y 篇教案。" + 关闭按钮 |
error |
running 变为 false 且有 error |
错误信息 + "已完成 X/Y 篇" + 关闭按钮 |
phase 切换逻辑与 BatchGenerateDialog 保持一致(watch props.running)。
修改:WorkspaceToolbar.vue
- 新增 prop:
warningCount: number(已有) - 新增 emit:
fix-broken: [] - 新增按钮:仅当
warningCount > 0时显示,文案修复 {{ warningCount }} 处提示
修改:WorkspaceView.vue
新增状态:
showFixDialog: booleanfixRunning: booleanfixDone: numberfixTotal: numberfixCurrentTopic: stringfixError: string | nullfixCancelled: boolean
新增 handleFixStart():
brokenLessons = book.designs.filter(d => d.warnings.length > 0)
fixTotal = brokenLessons.length
fixDone = 0
fixRunning = true
for each lesson:
if fixCancelled: break
fixCurrentTopic = topic
result = await regenerateLesson(lesson.id)
if !result.ok: fixError = result.message; break
fixDone++
fixRunning = false
新增 closeFixDialog():重置状态,关闭对话框。
文件变更
| 文件 | 操作 |
|---|---|
src/composables/useTeachingBook.ts |
新增 regenerateLesson |
src/components/FixBrokenDialog.vue |
新建 |
src/components/WorkspaceToolbar.vue |
新增 fix-broken emit 与按钮 |
src/components/WorkspaceView.vue |
新增 fix 状态与处理逻辑 |
错误处理
- 单篇失败:记录
fixError,中止后续修复,进入 error phase(已完成的保留) - 网络超时:同上,由
booksApi.generateLesson抛出异常捕获 - 用户取消:设置
fixCancelled = true,当前篇完成后停止,进入 done phase(不视为 error)
不在范围内
- 每篇修复结果的详细日志(仅显示总数)
- 单篇教案的独立修复按钮(侧边栏)
- 修复前预览差异