# 模块 M11 Classroom 课堂 审计报告 > **审计版本**: V12 | **日期**: 2026-04-04 ## 1. 链路完整性 | 链路 | 状态 | 备注 | |------|------|------| | 课堂生成 | ✅ | classroom_generate → 4 阶段 pipeline → classroom:progress 事件 | | 课堂加载 | ✅ | classroom_get → ClassroomStore HashMap | | 场景播放 | ✅ | SceneRenderer 按 actions 自动播放(speech/whiteboard/quiz) | | 课堂聊天 | ✅ | classroom_chat → LLM 多 agent 响应 | | 笔记展示 | ✅ | scenes 列表 → 点击切换 | | 白板渲染 | ⚠️ | WhiteboardCanvas 和 SceneRenderer 内联 SVG 两套实现未统一 | | TTS | ✅ | 浏览器 SpeechSynthesis zh-CN | | 导出 | ✅ | JSON/HTML/Markdown → Blob download | | 取消生成 | ✅ | classroom_cancel_generation → tasks 移除 | | 课堂历史列表 | ❌ | classroom_list 后端已实现但前端未集成 | | 生成进度查询 | ❌ | classroom_generation_progress 后端已实现但前端未集成 | **链路完整性评分: 82/100** ## 2. 问题清单 | ID | 文件 | 级别 | 描述 | 修复建议 | |----|------|------|------|---------| | M11-01 | `generate.rs:141-144` | **P1** | `is_cancelled()` 用 `blocking_lock()` 在 async 函数中,tokio runtime 可能死锁 | 改为 `try_lock()` 或 `tokio::sync::watch` channel | | M11-02 | `generate.rs:158-175` | **P1** | Stage 0/1 LLM 调用无 `map_err`,driver 未配置时可能 panic 或返回空结果无错误提示 | 增加 map_err 错误处理 | | M11-03 | `generate.rs:190-213` | **P1** | 课堂数据仅存内存 HashMap,应用重启后全部丢失 | 增加 SQLite 或文件持久化 | | M11-04 | `chat.rs:82-92` | P2 | LLM 失败静默 fallback 到 placeholder,用户无法区分真实和模拟回复 | 增加 isPlaceholder 标志 | | M11-05 | `ClassroomPlayer.tsx:74-77` | P2 | 生成完成后强制打开 player,即使生成期间用户已关闭 | 增加手动关闭状态检查 | | M11-06 | `classroomStore.ts:192` | P2 | chat message ID 用 `Date.now()` 可能冲突 | 改用 `crypto.randomUUID()` | | M11-07 | `WhiteboardCanvas.tsx` | P3 | SceneRenderer 未引用 WhiteboardCanvas,白板有两套渲染实现 | 统一为一套 | | M11-08 | `export.rs:92-103` | P3 | HTML 导出只渲染 title+duration,不包含 key_points 等内容 | 丰富导出内容 | **综合健康度: 70/100** — 功能链路基本贯通,但无持久化、async 锁风险、LLM 错误不透明是核心短板。