#21 书籍音频与封面附件 #36

Merged
ila merged 1 commits from feat/21-book-attachments into main 2026-09-15 20:22:11 +08:00
Owner

#21 书籍音频与封面附件:上传、展示、播放与播放位置。设计证据与契约见评论 8116。

  • schema v8:lexgo_book_attachments(book_id+kind 唯一,MEDIUMBLOB)与 lexgo_playback_positions
  • 后端:按文件头判定类型(MP3/JPG/PNG/WebP,含 WebP 维度)、音频 ≤20 MiB、封面 ≤2 MiB 且 ≤4096²;
    上传/替换/移除;读取支持 Range 206/416 与 ETag 304;播放位置 upsert,替换音频时重置
  • 学习端:书库封面、书籍页「音频与封面」区块、阅读页常驻播放器(播放/暂停、进度、倍速、位置上报)
  • 本地验证:Go 86 项、学习端 157 单测与 26 项 E2E、管理端 31 项、治理 65 项全部通过;
    真实 API+MySQL 41 项检查;#15 恢复演练扩展 22 项检查(恢复后附件按字节相同、Range 可用)
#21 书籍音频与封面附件:上传、展示、播放与播放位置。设计证据与契约见评论 8116。 - schema v8:lexgo_book_attachments(book_id+kind 唯一,MEDIUMBLOB)与 lexgo_playback_positions - 后端:按文件头判定类型(MP3/JPG/PNG/WebP,含 WebP 维度)、音频 ≤20 MiB、封面 ≤2 MiB 且 ≤4096²; 上传/替换/移除;读取支持 Range 206/416 与 ETag 304;播放位置 upsert,替换音频时重置 - 学习端:书库封面、书籍页「音频与封面」区块、阅读页常驻播放器(播放/暂停、进度、倍速、位置上报) - 本地验证:Go 86 项、学习端 157 单测与 26 项 E2E、管理端 31 项、治理 65 项全部通过; 真实 API+MySQL 41 项检查;#15 恢复演练扩展 22 项检查(恢复后附件按字节相同、Range 可用)
ila added 5 commits 2026-09-15 18:40:25 +08:00
从 docs/templates/deployment.md 建立 Deployment-and-Operations 页面映射,由 harness.py sync 导出核心镜像。
- scripts/ops.py:install-check(依赖与资源版本、客户端不得低于服务端)、init-database(建空库
  并提示最小权限)、backup(全库 dump + manifest,不含凭据)、restore(默认只写空库、
  --confirm 必需、覆盖需 --force、拒绝系统库与带 CREATE DATABASE/USE 的 dump、比对源库校验和)、
  verify(完整性 + 可选两账号接口闭环)、smoke(干净实例上建两个演练账号走通学习闭环)
- scripts/bench.py:写明规模的人造数据集性能测量,记录数据量、机器与 p50/p95
- tests/test_lexgo_ops.py:版本解析、库名白名单、dump 安全性、manifest 字段白名单等无库测试
- Wiki 新增 Deployment-and-Operations 页面与 wiki-docs.json 映射(含升级回滚与已知限制)
- 更新 Architecture、Business-Rules、Local-Development、Product-Requirements、Home 与
  README/AGENTS;本单无 schema 与接口变化
- server/cmd/lexgo 增加 backup / restore / verify 子命令,与既有 migrate/bootstrap/serve
  同一入口;备份仍调用 mysqldump,dump 与 manifest 格式和工具通道完全一致、可互相读取
- server/app/lexgo/ops.go:manifest、库名校验、版本解析、dump 库名切换检测、表行数与
  内容校验和、目标库准备、恢复前后源库校验、完整性校验(客户不选 schema,SQL 显式限定库名)
- ops_test.go:7 项无库规则测试与 1 项 MySQL 备份→恢复→校验集成用例
- 部署页补充纯二进制路径(lexgo migrate/bootstrap/backup/restore/verify)、两条通道的关系
  与「接口级两账号闭环仍在工具通道」的边界;Architecture/LocalDev/Home/README/AGENTS 同步
- gofmt 修正 #13 遗留的 library.go 字段对齐
docs/04 与线上 Wiki 的纯二进制安装与交叉验证记录保持一致,revision fa4c663fabf5db418104fc53b7ce00f41f5ba910。
- schema v8:lexgo_book_attachments(按 book_id+kind 唯一,bytes MEDIUMBLOB)与
  lexgo_playback_positions(owner_id+book_id 主键),只用可重放 DDL,外键级联删书
- 后端:按文件头 magic bytes 判定类型(MP3 / JPG / PNG / WebP,含 WebP 维度解析),
  音频 ≤20 MiB、封面 ≤2 MiB 且 ≤4096²;上传/替换/移除;binaryResponse 交给
  http.ServeContent 提供 Range 206、416、ETag 与 304;播放位置 upsert,替换音频时重置
- 学习端:带凭据的 fetch + 对象 URL(令牌不进 URL),书库封面、书籍页「音频与封面」
  区块、阅读页常驻播放器(播放/暂停、进度、0.75–1.5 倍速、错误重试、位置上报)
- 测试:Go 86 项(新增附件单测/集成与 v7→v8 迁移)、学习端 157 单测与 26 项 E2E
- 顺带修掉 e2e/phrase.spec.ts 的偶发失败:重试条件改为断言期望词数、重读坐标、关面板后重试
- 文档:Architecture / Business-Rules / Local-Development / Requirements / Home /
  Deployment-and-Operations(备份范围含附件与体积提示)
ila merged commit ab23ff60e5 into main 2026-09-15 20:22:11 +08:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/lexgo#36