状态:代码已交付(2026-08-22,T1-T7 全链路 + 六维审查 8 项即修闭环;真机验收待执行) 依据:设计 spec([ ] 已归档)· 实现计划([ ] 已归档) 前置:v0.11.6(AI 平台化)交付后开工
课堂助手新增第三采集动线「图文采集」——连续框选截屏组成图文会话(无音频),补齐网页/PDF/图文教程等图文场景的知识采集空白;同步两项采集体验改进到视频导入。
| # | 需求 | 落点 |
|---|---|---|
| 1 | 图文内容可采集为会话 | 截屏导入(全屏快照 → 框选 → 截图落库 + OCR)→ kind=photo 图文会话;会话列表/详情/转笔记全链路可用 |
| 2 | 会话类型可区分 | sessions.kind 字段(NULL=视频类零回归,photo=图文);列表徽标 + 详情空态适配 |
| 3 | 跨链路采集体验同步 | 视频导入完成后「去会话页」直达按钮;OCR 进度消息携带累计识别块数 |
| 4 | 健壮性 | 图文/实时采集互斥;崩溃残留 24h 清扫;零截图不留空壳;OCR 失败不阻断截图 |
sessions.kind列(建表 +ensure_column幂等迁移);Rust/前端类型穿透- 5 命令:
start_photo_session/capture_screen_snapshot/save_photo_capture/finish_photo_session/discard_photo_session photo_capture.rs业务编排:base64 解码校验 →SessionImageStore.save_frame(双指纹去重)→ 全图 OCR(960px 口径,bbox 反算)→ OCR 块落库 → 识别预览返回- 互斥注册(AppState.photo_session)+ 残留清扫(列表加载时 24h 超时 photo recording → failed)
PhotoCapturePanel(课堂助手左栏三态面板:开始/截屏/完成 + 最近截图缩略图 + 识别反馈 + 去会话页直达)ScreenSelectOverlay(全屏框选遮罩:letterbox 缩放 + 物理像素坐标换算 + canvas PNG 裁剪)- 会话列表「📷 图文」徽标;会话详情空转写空态
VideoImportPanel直达按钮 + 导入 OCR 进度增强
- Rust 测试 7 组(端到端/零截图/互斥/清扫/filter_note 空 segments/迁移/重复截图)+ 前端状态机与坐标换算测试
- 文档:ADR(会话类型字段)+ 本版本文档 + 系列总览 + README 索引 + CHANGELOG
- 全量回归:cargo test / clippy / tsc / vitest
- kind 字段而非派生:会话类型是领域语义,列表徽标/详情空态/清扫都需要——派生判断(如无 segments)脆弱且不可靠
- 前端 canvas 裁剪而非后端:命令无状态,两次调用间无法保持帧缓存;canvas 裁剪与 base64 通道均有项目先例
- 截图不过 UI 垃圾黑名单:用户显式框选的内容即意图(与自动采帧链路不同)
- 三链路 OCR 口径统一:960px 缩放 + bbox 反算 + score≥0.5(实时/导入已具备,图文遵循)
- 互斥:图文采集与实时捕获共享屏幕内容动线,避免状态混乱
- PNG 无损裁剪:快照显示用 JPEG 省流量、裁剪图 PNG 无损(OCR 友好)
- YAGNI:单张删除/内容类型标注/OCR 编辑/真实全屏窗口/图文音频——不纳入本期
- 课堂助手可开始图文采集 → 连续框选截屏 ≥2 张 → 每张立即显示识别块数与文本预览 → 完成采集后会话出现在会话列表(📷 图文徽标)
- 图文会话详情页:无讲述内容空态 + 屏卡流完整(标题/正文/配图/标签);可一键转笔记(纯 OCR 画面要点)
- 视频导入完成后有「去会话页」直达按钮;导入 OCR 进度显示累计识别块数
- 实时捕获进行中无法开始图文采集(原因可见);图文采集中无法开始实时捕获
- 零截图完成采集 → 不留空壳会话;人为制造超 24h recording 图文会话 → 列表加载被清扫为 failed
- 全量回归通过(cargo test / clippy / vitest / tsc)
- 设计 spec([ ] 已归档)· 实现计划([ ] 已归档)· v0.11 系列总览 ·
- 复用资产:
capture/gdi_capture.rs·image_store.rs·import_frame.rs(960px 口径)·screens.rs(屏卡聚类)·BoxSelectOverlay.tsx(框选范式)