feat/37-chapter-attachments
main
#37 音频与插图改为章节级,封面维持书级。线框与契约见评论 8152。
- schema v9:lexgo_chapter_attachments(chapter_id+kind 唯一,MEDIUMBLOB)与 lexgo_chapter_playback_positions(owner_id+chapter_id),并用幂等语句清空书级音频历史行 - 书级音频与播放位置接口下线(路由不再注册);封面仍是书级且行为不变 - 章节级接口:POST/DELETE/GET /chapters/:id/{audio,illustration}、PUT /chapters/:id/playback; 章节列表与阅读器响应带 illustrationVersion/audioVersion/playbackSeconds(始终存在) - 复用 #21 的类型嗅探、尺寸校验、ServeContent Range/ETag 包装与“先校验后写入”流程 - 学习端:封面区块收窄、章节行新增缩略图与「附件」入口、独立的章节附件对话框、 阅读页正文上方插图与章级播放器(audioChapterId 防止复用上一章音频)、切换章节上报位置 - 测试:Go 87 项(含 v8→v9 迁移与回退、书级接口已下线、章级附件集成)、学习端 157 单测与 26 项 E2E、真实 API 52 项、#15 恢复演练第三次 22 项 - 文档:Architecture / Business-Rules / Local-Development / Requirements / Home / Deployment 改为章级口径
- 书籍页章节列表去掉插图列,并不再为列表预取图片(省掉每章一次请求) - 阅读页把插图换成高 120px 的缩略图按钮(可 Tab、回车/Space 打开),点击后在对话框里 按原图显示(最大 min(88vw,1200px) × 78vh,保持比例),Esc 关闭后正文位置不变 - 无插图的章节仍不显示占位;后端与 schema 无变化(仍 v9) - 测试:157 单测与 26 项 E2E 通过(新断言:列表无 <img> 且不请求 /illustration、缩略图是按钮、 弹窗内为对象 URL 图片);真实链路验证列表无图、缩略图 ≤130px、弹窗原图 naturalWidth>0 - 文档:Architecture / Business-Rules / Local-Development / Requirements / Home 同步修订
- 章节列表每行只保留「编辑」;移除「附件」按钮与独立的附件对话框 - 章节编辑对话框同时编辑标题、正文、本章插图与本章音频,并明确写出生效时机: 标题与正文点「保存章节」后生效,插图与音频在选中文件后立即上传、取消不撤销 - 无插图/音频的章节仍显示「未设置」,后端口与 schema 无变化(仍 v9) - 测试:157 单测与 26 项 E2E 通过(新断言:章节行只有一个按钮、对话框含四类控件与时机说明、 对话框内上传后仍可用保存按钮提交文本);真实链路确认按钮数为 1、上传即时生效、取消后阅读页正常 - 文档:Architecture / Business-Rules / Local-Development / Requirements / Home 同步
- main.ts 补上 dialog 与 message-box 的样式导入:自 #10 起 ElDialog/ElMessageBox 一直 缺少样式,退化成列表后面的普通块(用户报告「编辑区显示在章节列表下面」) - 新增 e2e/overlay.ts:expectModalOverlay / expectMessageBoxOverlay 断言弹窗位于 .el-overlay(position: fixed)、在视口内且横向不溢出 - attachments.spec.ts(章节编辑对话框、插图弹窗)与 edit.spec.ts(书名对话框、删除确认) 都改用该断言,堵住「只看可见性、不看是否浮层」的验证盲区 - 真实链路确认:对话框遮罩为 rgba(0,0,0,0.5)、居中于视口;确认框同样为固定浮层 - 文档:Local-Development 记录缺陷、根因、修复与新增回归断言
- schema v10:lexgo_chapters 增加 author VARCHAR(120) NOT NULL DEFAULT '';由 Go 条件步骤 addChapterAuthorColumn(先查 information_schema 再 ALTER)在语句列表之后执行,保持 「部分迁移可重试 / 回退标记后可重新升级」,新建库的 v3 语句也带该列 - 章节编辑接受 author(可选、trim、≤120 字符、空串清空),仅改作者不重新处理章节; ChapterSummary 与 ChapterSource 都返回它,阅读页在标题下显示非空作者 - 对话框:标题与作者改成「标签在左、输入框在右」的同行排版,正文编辑框加高到 18 行, 插图与音频压缩为各一两行(规格写在下方),时机说明合并为一行 - 测试:Go 89 项(新增作者往返与 v9→v10 迁移用例)、学习端 157 单测与 26 项 E2E - 真实链路:标签同行偏差 <8px、正文高度 415px、保存作者后阅读页显示、清空后消失 - 文档:Architecture / Business-Rules / Local-Development / Requirements / Home 同步
- schema v11:lexgo_books 增加 author VARCHAR(120) NOT NULL DEFAULT '',复用 v10 的条件加列 助手(改名 addAuthorColumn,表名取自本文件常量),保持迁移可重放;新建库 v3 语句也带该列 - PATCH /api/v1/books/:id 接受可选 author(省略保留、空串清空、trim、≤120),BookSummary 与 BookRef 返回它;「编辑书名」改为「编辑书籍」,对话框同行编辑书名与作者 - 书籍页封面压成一行紧凑控件(预览+上传/替换/移除),去掉「封面」「书籍封面」规格与 「音频与插图按章节设置」等文字,把高度让给章节列表;书名右侧显示书级作者(未设置不显示) - 测试:Go 91 项(新增书级作者往返与 v10→v11 迁移用例)、学习端 157 单测与 26 项 E2E - 真实链路:封面行高 68px、删掉的四段文字不再出现、作者显示在书名同一行右侧且刷新后保留 - 文档:Architecture / Business-Rules / Local-Development / Requirements / Home 同步
No dependencies set.
The note is not visible to the blocked user.
#37 音频与插图改为章节级,封面维持书级。线框与契约见评论 8152。
真实 API 52 项;#15 恢复演练第三次 22 项(按章节归属、按字节恢复、Range 可用)
- schema v9:lexgo_chapter_attachments(chapter_id+kind 唯一,MEDIUMBLOB)与 lexgo_chapter_playback_positions(owner_id+chapter_id),并用幂等语句清空书级音频历史行 - 书级音频与播放位置接口下线(路由不再注册);封面仍是书级且行为不变 - 章节级接口:POST/DELETE/GET /chapters/:id/{audio,illustration}、PUT /chapters/:id/playback; 章节列表与阅读器响应带 illustrationVersion/audioVersion/playbackSeconds(始终存在) - 复用 #21 的类型嗅探、尺寸校验、ServeContent Range/ETag 包装与“先校验后写入”流程 - 学习端:封面区块收窄、章节行新增缩略图与「附件」入口、独立的章节附件对话框、 阅读页正文上方插图与章级播放器(audioChapterId 防止复用上一章音频)、切换章节上报位置 - 测试:Go 87 项(含 v8→v9 迁移与回退、书级接口已下线、章级附件集成)、学习端 157 单测与 26 项 E2E、真实 API 52 项、#15 恢复演练第三次 22 项 - 文档:Architecture / Business-Rules / Local-Development / Requirements / Home / Deployment 改为章级口径