Files
lexgo/docs/00-project-profile.md
T
ila c293a41714 docs: record issue 37 acceptance and merge (#37)
- #37 已由用户验收;PR #38 已 fast-forward-only 合入 main,merge commit 728f7d6
- Wiki:Architecture 与 Product-Requirements 标记 #37 已验收,Local-Development 追加验收后
  最终状态(schema v11、未实现的两项作者显示),Home 替换为已验收文案,Project-Profile
  追加当前工程状态
- README 与项目档案记录最终 schema 版本、作者语义、未实现项与对话框样式教训
- docs/ 由 harness.py sync 导出,revision:Architecture 3cf18f98、Product-Requirements daf31e0d、
  Local-Development 7c41d62a、Home 3af7d779、Project-Profile 39adde48
2026-09-16 10:26:38 +08:00

29 KiB
Raw Blame History

generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件) wiki_page: Project-Profile wiki_url: https://git.ilapage.cn/OPC/lexgo/wiki/Project-Profile.- wiki_revision: 39adde482a8729fcf303ef7ca24cd8bf136c58a6 synchronized_at: 2026-09-16T02:25:55Z

LexGo 项目档案

基本信息

目标:围绕“导入内容 → 阅读查词 → 保存词语/短语 → 复习 → 查看进展”建设自托管语言学习 Web 应用。MVP 定位已确认:支持多账号、数据独立的自托管学习工具,先邀请少量用户使用;主要角色为学习者和实例管理员。

现状:已有四份调研材料、项目主题文档和治理工具,无业务代码、产品依赖锁文件、数据库结构或产品测试。首次盘点时没有本地 .git;本轮已连接确认的远端 https://git.ilapage.cn/OPC/lexgo.git,默认分支 main,已有引导提交 ecab8995026e57f2c28f307a6aa32b871cb3163f。仓库归属 OPC,产品验收负责人为当前用户,具体长期维护分工尚未确定。

非目标暂按既有分析:商业 SaaS、多组织租户、课程商城、原生 App、完整离线同步、OCR、视频转写和 FSRS 改造均不包含在本轮基础估算。

项目治理模式

轻量,依据 2026-09-10 用户明确指令。低风险局部调整直接实施;独立需求及中高风险变化建单;不为初始化强制拆 Epic/MVP。见工作流。

DevHarness 来源与基线

本地来源 D:/opc_project/dev_harness,Git commit ecab8995026e57f2c28f307a6aa32b871cb3163f,核验日 2026-09-10。治理脚本、测试与模板按此基线复制,不复制凭据、Git 历史或旧任务快照。升级先比较该基线之后的变化,按本项目真实需要引入。

LinguaCafe 参考基线由现有调研记录为 c1ea298ce40c65b9dd33e9b26fd2e52fae66f2c8;本轮只整理已提供的调研,没有重新核验上游代码、依赖或许可。管理端已由用户指定 go-admin,锁定的本地参考 commit 见下文;现有 gin-vue-admin 建议作为历史材料保留。

子项目与交付单元

当前独立交付物包括文档、治理工具、账号后端和两个前端。目标按一个产品版本、一个仓库规划:基于 go-admin 扩展的共享 Go API/Worker、独立学习前端和独立管理前端;内部 NLP 服务暂为建议。学习端与管理端分开构建,共用后端与账号体系。当前目录为 server、admin、learner 和 scripts,实际入口见代码地图。

技术栈与运行环境

决策 ID 议题 现有证据与状态 对估算的影响
D01 管理端底座 已确认使用 D:/github_project/goadmin 的 go-admin + go-admin-ui,依据用户指令“管理端用D:\github_project\goadmin”;替代 gin-vue-admin 建议 M0 验证指定本地版本配套、MySQL 8 及数据隔离,不再比较管理底座
D02 数据库 已确认 MySQL 8;依据 2026-09-10 用户原话“使用mysql8”。覆盖两份分析的数据库分歧,具体小版本待基线验证锁定 按单一 MySQL 8 数据层估算,不做 PostgreSQL 双库兼容
D03 NLP 用户于2026-09-11确认正式产品全 Go;Python小样仅历史验证 使用词典词形候选,不承诺上下文消歧
D04 默认学习语言 用户已确认英语;中文/日语后续需独立范围与验收 分词、读音和 UI
D05 用户范围 已确认:支持多账号、数据独立的自托管学习工具,先邀请少量用户使用 首版按多用户归属和隔离设计;不自动加入公开注册、邀请链接或组织租户
D06 旧数据 全量迁移是否需要未确认,CSV 与完整迁移不同 迁移另估
D07 范围与交付 已确认 F01~F12;X 系列后置;原型审核后拆实施工单,人员与运行环境待细化 按已确认 MVP 重新估算与验收
D09 学习端技术栈 已按用户要求纳入方案:Vue 3 + TypeScript + Vite,Vue Router、Pinia、Element Plus,Vitest + Playwright 使用官方 create-vue 新建独立前端,具体版本与构建待验证
D10 前后端复用边界 两个前端工程共用基于 go-admin 扩展的 Go 模块化单体;登录和业务数据共用 学习界面及领域模块需开发,不复制整套后台布局或直接移植 LinguaCafe 前端
D08 Gitea 已确认 https://git.ilapage.cn/OPC/lexgo.git,分支 main,工单与 Wiki 已启用 本轮发布核心 Wiki 并同步验证

数据库确定为 MySQL 8;管理端使用 go-admin/go-admin-ui;学习端方案与复用边界见 D09/D10。Redis 任务队列、Python NLP、Compose 仍为候选,具体版本和构建命令在技术验证后固定。不能同时按两种数据库承诺交付。

阅读入口

需求总览、代码地图、工作量。现有分析中的许可说明仅作资源评估线索,采用代码、词典、模型和素材前记录来源与实际许可;本轮不作新的法律结论。

常用命令

见开发与验证。产品构建、启动、测试和部署命令暂不存在,不用示例命令冒充实际可运行入口。

环境、配置与凭据

本地 Windows PowerShell,工作目录 D:/opc_project/lexgo。当前 Gitea MCP 指向 ilaer.eicp.net:8418,并非用户确认的目标站点;本轮因此使用目标站点 Gitea API。凭据从已配置的安全来源读入进程,不复制进项目。Wiki 配置只保存非敏感地址与页面映射,凭据使用 MCP 安全配置或环境变量。

治理默认值与已核验主机

新项目默认采用轻量模式;本项目同时已获用户明确选择。DevHarness 上游模板自身继续采用标准模式,该模板模式不覆盖 LexGo 的选择。

本轮核实本机为 Microsoft Windows 10 企业版 LTSC,使用 PowerShell 7 pwsh,版本 7.3.12;Python 工具当前运行于 Python 3.8。该环境记录只证明文档工具运行主机,不代表产品支持矩阵。

已确认管理端基线

2026-09-10 用户指定 D:/github_project/goadmin。它是三个仓库的容器目录,本轮只读检查三个工作区均无未提交修改;不修改源目录,也不将其中配置、数据库文件或运行数据自动复制到 LexGo。

组成 来源与用途 当前本地完整 commit
go-admin D:/github_project/goadmin/go-admin;origin https://github.com/go-admin-team/go-admin.git;管理 API 与通用基础 f06540883b41d03782bb6b2c4150f298f328c6b6
go-admin-ui D:/github_project/goadmin/go-admin-ui;origin https://github.com/go-admin-team/go-admin-ui.git;管理前端 67d393d713877572fab0b897296a4c1d525fc81d
go-admin-doc D:/github_project/goadmin/go-admin-doc;origin https://github.com/go-admin-team/go-admin-doc.git;配套参考文档 424855aacf6905f3fde860c3331385cb25529a0d

版本依据是上述本地文件,不宣称最新上游版本:后端 go.mod 声明 Go 1.26.5、Gin v1.12.0、GORM v1.31.2、MySQL driver v1.6.0;前端 package.json 声明 Vue ^3.5.41、Element Plus ^2.14.4、Vue Router ^4.6.4、Vuex ^4.1.0,使用 Vue CLI,packageManager 为 pnpm@9.15.1,engines 为 Node >=22 / pnpm >=9。本轮没有执行依赖安装、构建或运行,锁文件可安装性和前后端兼容性仍需实测。

M0 在 LexGo 隔离工程中验证:指定前后端配套构建;MySQL 8 迁移与启动;登录、菜单和 API 权限;普通学习者的数据所有权隔离;用户区与管理区的身份衔接。管理 UI 的 dev/build 脚本使用类 Unix 的内联环境变量写法,Windows 执行方式需验证并最小适配,不假定 PowerShell 下直接成功。

复用范围为通用管理界面及其配套 API/身份能力;阅读器、词汇、短语与复习仍需实现 LexGo 领域逻辑。学习端另建 Vue 3 + TypeScript + Vite 工程,管理端继续使用其现有 Vue CLI/Vuex 结构;不要求两端统一构建工具和状态库。实际引入前核对代码和资源许可、排除本地配置及数据库等运行文件;按固定提交建立上游差异记录,后续升级先验证再更新基线。管理端已按选用模块接入 LexGo,范围与差异见本页末尾。

学习端技术方案(2026-09-10)

依据本轮讨论及用户“先把这些更新到文档.然后再来讨论需求和mvp”的指令记录。此处确定技术方向和复用边界,不代表产品需求、MVP 范围或实现已完成;默认学习语言已确认英语;NLP 方案与具体依赖版本仍待工程验证。

层次 采用方案 用途
页面与交互 Vue 3、Composition API、TypeScript 类型约束与交互组件
工程与构建 官方 create-vue + Vite 创建学习端独立工程
路由 Vue Router 书库、阅读、词汇、复习等页面导航;页面范围待需求讨论
状态 Pinia 登录信息、阅读偏好等前端状态;服务端仍是业务状态主源
通用组件 Element Plus 表单、设置、弹窗等通用界面
领域界面 定制 Vue 组件 阅读器、划词、短语高亮、复习卡片
验证 Vitest + Playwright 组件/规则验证与浏览器学习闭环验证

创建方式是基于官方脚手架与成熟组件库开发学习业务,不是基于完整后台模板换皮。管理端基于 go-admin-ui 二次开发;后端基于配套 go-admin 扩展并复用适配后的身份/权限能力。LinguaCafe 继续提供需求与行为参考,未选定直接移植其前端代码。

参考依据:Vue 官方创建指南、Pinia、Element Plus。本轮只更新设计文档,尚未执行 create-vue、安装产品依赖或构建应用。

MVP 定位确认与筛选边界

2026-09-10 用户接受多账号、数据独立、自托管及少量用户试用的定位,并要求从 LinguaCafe 提取候选需求。定位确认不表示旧 P0 或全部功能获批。F/X 候选、来源与最小验收统一维护在需求总览,当前筛选结果为 F01~F12;原型审核后再拆实施工单。

MVP 功能范围确认

2026-09-10 用户确认 F01~F12 全部进入首版,X01~X14 暂不纳入;随后授权使用 Quant-UX 制作原型,并同意先建原型工单,原型审核后再拆实施工单。桌面和手机均覆盖;默认学习语言已确认英语。工程基础已通过验收,其余范围沿用已验收原型。

原型站点为 https://qux.ilapage.cn/;v1 编辑源和预览统一见需求总览及工单 #1。用户要求减少页面说明、按目标页面呈现。账号配置不进入仓库。

默认学习语言:英语(用户于 2026-09-10 明确确认)。英语分词与本地词典资源仍需工程验证后固定版本。

原型验收与实施准备(2026-09-10)

用户已验收当前 Quant-UX 桌面/手机 v1,原型工单 #1 已关闭;结论见验收记录。LinguaCafe 对照修订未执行,后续由划词验证工单承接,不将预设交互计作真实选择验证。

学习端与管理端均使用账号(用户名)+密码登录,账号不要求邮箱格式;邮箱不作为必填登录标识。两端共用账号体系,管理权限由服务端单独校验。用户名唯一性和大小写规则在账号工单中细化。

四阶段实施总览 #16 已建立四阶段、14 张单元工单;详见需求总览与工作量估算。工程基础 #2 已于 2026-09-10 通过用户验收:两端用户名登录、管理员创建/启停/重置学习账号、可撤销会话和本人英语空空间。阅读、导入、词典和复习尚未实现。代码在 feat/2-account-foundation 分支。

工程基础实际基线(#2,2026-09-10)

MySQL 服务端实际为 8.4.3,连接本机 127.0.0.1:3308;项目专用库 lexgo_dev、lexgo_test_issue2。连接凭据只存本机忽略的 .env.local;文档和 Git 不保存密码。已有非项目数据库未连接读写业务数据、未迁移。

Go 1.26.5 通过 Go 独立工具链下载并校验,系统 Go 1.24.0 保持不变;脚本只为子进程设置 GOTOOLCHAIN/GOSUMDB。Node 22.22.1,两个前端锁定 pnpm 9.15.1。管理端保留 Vue CLI/Vuex,学习端由官方 create-vue 3.23.0 生成,保留 Vue/TypeScript/Vite/Router/Pinia/Element Plus,实际包版本以各自 pnpm-lock.yaml 为准,不要求两端依赖版本一致。

server 是 go-admin 的选用模块接入:原样保留 SysUser、SysDept、必要 common/models 和 MIT 许可,新增 LexGo 路由、账号服务、会话与显式迁移;未接入整套后台路由、代码生成或任意任务执行。server/upstream.json 记录来源和文件摘要。admin/upstream.json 区分原样复用与适配的 go-admin-ui 布局、组件、页面和依赖,原始三个 go-admin 源工作区保持只读。

当前采用随机 Bearer 会话而非直接启用上游开发模式的超长 JWT。已验证退出、禁用、密码重置和到期拒绝;该差异是为满足当前可撤销会话要求,不宣称上游默认实现满足此要求。

日志审计基线(#18)

管理端新增两个审计列表,后端为 LexGo 自有日志模型与接口,参照 go-admin 模块布局但不复制其原始参数/响应持久化逻辑。schema v2 新增 lexgo_login_logs、lexgo_operation_logs;保留 90 天,启动和每小时分批清理,也可显式 audit-cleanup。新建/重置密码均为 6~72 UTF-8 字节;初始 bootstrap 保留 10 字节下限。#2 已验收,#18 已验收;默认模块中的其他候选未纳入。

全 Go 正式架构决定(2026-09-11,#6)

用户已明确选择全 Go:正式英语分词、原文位置映射、本地词典解析和词形候选查询由 Go 后端完成,不运行 Python NLP 服务。此前“Python 建议/全 Go 未决”仅为历史决策记录,由本决定覆盖;spikes/english 保留历史验证,不接入产品。#6 按该方向实施,当前方案见工单最新启动评论;WordNet 3.0 仍为首个资源(英语释义),词形规则候选不等同于 spaCy 上下文消歧,原文及个人学习状态不按候选合并。

#6 当前工程状态(2026-09-11)

#5已验收且相关前置PR均已合入main。#6正式词典/点词查义已按全Go实现,已于2026-09-11通过用户验收,PR #25已合入main;server schema v4,管理端新增英语词典页,学习端加入Go分片及查词面板。正式Go进程不依赖Python NLP,WordNet包随数据库持久化。#3小样仍是历史验证;保存个人释义和状态归#7,音频封面#21、列表优化#24尚未实施。

#7 当前工程状态(2026-09-11)

#6已通过用户验收并合入main。#7个人词条、学习状态与阅读器高亮已按用户确认口径实现,并于2026-09-11通过用户验收,PR #26已fast-forward-only合入main;server schema v5新增lexgo_terms,学习端面板可保存释义、例句与状态并按状态高亮,同一词形在本人其他章节显示一致。个人释义与共享词典分离,且不进入审计日志。词汇库#12、短语#11、到期复习#8、进度#13、音频封面#21与列表优化#24尚未实施。

#8 当前工程状态(2026-09-11)

#7已通过用户验收并合入main。#8到期单词复习已按用户确认的决策表实现,并于2026-09-11通过用户验收,PR #27已fast-forward-only合入main;server schema v6新增lexgo_term_reviews(排期与计数)与lexgo_review_answers(作答记录),固定间隔1/2/4/7/15/30/60天,答对升级封顶7、答错降级最低1、再学一次不改等级,答错与再学立即回队,已知与忽略不入队。作答按answerId去重并以expectedDueAt判定过期标签页,重复提交、网络重发与双标签页都只记一次;到期判定用UTC绝对时刻,不引入本地日边界。独立审核(Claude Code)指出的并发同键500、编辑文本重排复习、面板保存重置等级三项已整改并复测。第3阶段「首条学习闭环」(#5~#8)至此全部验收;剩余#9~#15与#21、#24尚未实施。

#9 当前工程状态(2026-09-13)

#8已通过用户验收并合入main。#9 TXT文件导入已按用户确认的契约实现,并于2026-09-13通过用户验收,PR #28已fast-forward-only合入main;本单没有数据库结构变化,schema仍为v6。解码只接受UTF-8(可选BOM剥离且不进原文),非法字节整体拒绝、不使用替换字符,UTF-16按BOM识别后明确拒绝;文件字节上限2MiB并仍受单章100000码点约束;换行与空白不归一化。文件只在内存中解码,不创建临时文件,客户端文件名不参与任何路径也不入库。解码后交给既有PasteBook/PasteChapter,分章、任务幂等与恢复与粘贴一致。第4阶段已完成#9;剩余#10~#15与#21、#24尚未实施。

#10 当前工程状态(2026-09-14)

#9已通过用户验收并合入main。#10编辑与删除书籍章节已按用户确认的契约实现,并于2026-09-14通过用户验收,PR #29已fast-forward-only合入main;本单没有数据库结构变化,schema仍为v6。可改书名、章节标题与章节正文;只有正文变化才重新处理,重复保存或改回原内容不新建任务,只改标题不改变处理状态。版本门控按content_sha256执行:过期版本任务被标为superseded且完全不触碰章节,认领、恢复扫描与重试都按版本裁决,存储文本重算SHA与存储SHA不一致时按content_changed失败——这修掉了「处理中编辑导致新版本被标失败」的既有缺陷。删除为事务内硬删除加外键级联,删章后重排序号;个人词条、复习排期与作答记录不随删除清理。第4阶段已完成#9与#10;剩余#11~#15与#21、#24尚未实施。

#11 当前工程状态(2026-09-14)

#10已通过用户验收并合入main。#11连续短语的选择、保存与复习已按用户确认的契约实现,并于2026-09-14通过用户验收,PR #30已fast-forward-only合入main。用户在验收前明确确认了D3的存储方式:短语与单词共用lexgo_terms,单词键不含空格、短语键以空格分隔,因此kind与词数由身份键在服务端派生,不新增列、无迁移,schema仍为v6;唯一键、排期表、到期队列与作答幂等路径全部复用。范围规则为两端对齐整词、内部标点与换行保留、2~12词、键≤128字符、片段≤191字符;跨章节按连续词形匹配,重叠取最左最长,短语高亮覆盖内部单词但不修改单词数据;失效引用回退为高亮消失而条目与排期保留;选择使用原生拖选与手机系统手柄,不拦截touchmove。独立审核(Claude Code)判定代码达标并指出一处流程问题(先实现后确认数据结构变更),已在评论7912记录确认与整改。第4阶段已完成#9、#10与#11;剩余#12~#15与#21、#24尚未实施。

#12 当前工程状态(2026-09-15)

#11已通过用户验收并合入main。#12词汇库的搜索、筛选与编辑已按用户确认的契约实现,并于2026-09-15通过用户验收,PR #31已fast-forward-only合入main。本单没有数据库结构变化,schema仍为v6。GET /api/v1/terms提供本人当前语言的分页列表,搜索同时匹配规范化身份键、显示原文与个人释义且大小写不敏感(term列为二进制排序规则,查询先转小写),通配符按字面值转义,状态与类型可与搜索组合,分页默认20、上限100并按最近更新倒序;PATCH /api/v1/terms/:id复用同一套释义/例句与状态/等级校验,身份不可编辑,只有状态或等级变化才重排复习时间,历史作答记录与计数保留。学习端新增生词本页面,含搜索、筛选、分页、空态、无结果清除与编辑对话框(学习中显示1~7等级选择器),筛选与页码写入URL;表单字段抽成共享组件与阅读器面板复用。原型编辑页的「来自某章节」不实现,因为词条按身份存储、不引用章节。第4阶段已完成#9、#10、#11与#12;剩余#13~#15与#21、#24尚未实施。

#13 当前工程状态(2026-09-15)

#12已通过用户验收并合入main。#13章节完成与个人基础进度已按用户确认的契约实现,并于2026-09-15通过用户验收,PR #33已fast-forward-only合入main。schema升到v7,新增lexgo_chapter_progress(一章一行、按content_sha256做内容版本门控、级联到章节与账号),仍然只使用可重放的CREATE TABLE IF NOT EXISTS,迁移需显式执行。POST /api/v1/chapters/:id/complete只记已读、不改变任何词语状态或等级,只有处理完成的章节可标记,重复调用返回同一条记录且不重复计数;GET /api/v1/progress按本人与当前语言统计已读章节(分子与分母都只含可阅读章节)、已知、学习中、新词、忽略、已保存词条与待复习,并给出每本书的已读进度,其中待复习与到期复习队列共用同一查询与同一服务端时钟。学习端新增进度页面与阅读页的显式「标记本章已读」,书籍页显示已读标记。正文改成新版本后该章自动回到未读并可在重读后更新同一条记录,删除章节时记录随之消失。第4阶段已完成#9、#10、#11、#12与#13;剩余#14、#15与#21、#24尚未实施。此外发现并单独记录了既有缺陷#32(编辑章节正文回到曾用版本返回500,已定位未修复,修复方案待用户确认)。

#14 当前工程状态(2026-09-15)

#13已通过用户验收并合入main。#14桌面与手机体验、显示偏好与键盘操作已按用户确认的契约实现,并于2026-09-15通过用户验收,PR #34已fast-forward-only合入main。本单没有数据库与接口变化。学习端站点头部新增「显示」控件:主题可选浅色、深色或跟随系统,正文字号可选标准、大或特大(1.0/1.15/1.3),两者按账号保存在本机(键名含账号id),切换账号立即换成该账号自己的偏好或默认、退出登录回到默认、非法存储值回退默认,且不跨设备同步;字号只作用于阅读面(章节正文、释义面板内容、复习卡的词与释义),不做全局缩放。样式表收敛为一套语义调色板,:root的53个变量是文件内仅有的颜色字面量,深色通过html[data-theme]与Element Plus的html.dark只覆盖变量。阅读位置按账号与章节保存滚动比例和该章content_sha256,再次打开时恢复,正文换成新版本后不再套用旧位置。复习页支持空格或Enter显示答案、1/2/3分别答对/答错/再学一次,输入框与文本域内不触发快捷键,聚焦按钮只保留它自身的空格与Enter,所有可交互元素都有可见焦点环。移动端用390×844触摸视口的Playwright项目验证:八个界面无横向溢出且都能返回,触摸滑动可滚动且不误开释义面板,深色与特大字号刷新后保持且账号间不串。第4阶段已完成#9~#14;剩余#15与#21、#24以及已定位未修复的缺陷#32。真实手机的长按选择、手柄拖动、软键盘与安全区表现仍需人工确认,本单的触摸证据来自模拟设备。

当前工程状态(2026-09-15)

#15 自托管试用交付已按用户确认的契约实现,并于2026-09-15通过用户验收,PR #35已fast-forward-only合入main。本单没有数据库与接口变化,交付三部分:运维工具(scripts/ops.py的依赖检查、建空库、备份、恢复、校验与两账号闭环演练,scripts/bench.py的写明规模性能测量)、编译进后端的纯二进制运维子命令(lexgo backup|restore|verify,部署机只需二进制与MySQL客户端,与工具通道共用同一份manifest格式且可互相恢复),以及新建的Wiki部署与运维页。备份的完整对象是「MySQL全库dump+环境配置」:账号、原文、词典归档、词条、复习记录、阅读进度、审计日志以及附件全部在数据库里;恢复默认只写空库、覆盖需要显式确认与--force、拒绝系统库与带库名切换的dump,并在恢复前后比对源库逐表内容校验和。本机演练:空库安装并建两个虚构账号走通学习闭环(19项)、纯二进制安装(9项)、完整恢复(27项)、两条通道交叉验证(19项)与附件版恢复(22项),逐表行数与内容校验和都与源库一致、源库未被改动。性能在20章/2000词条/8000条作答的人造数据集上实测并写明环境,只作观察不给承诺;真实回滚(升级后切回旧二进制)、HTTPS、多机部署、定时备份与监控告警仍未验证。

#21 书籍音频与封面附件已按用户确认的设计证据(评论8116的线框S1–S4)实现,并于2026-09-15通过用户验收,PR #36已fast-forward-only合入main。schema升到v8,新增lexgo_book_attachments(按book_id+kind唯一,音频与封面字节存MEDIUMBLOB)与lexgo_playback_positions(按owner_id+book_id);类型按文件头magic bytes判定(MP3/JPG/PNG/WebP,含WebP维度解析),音频≤20MiB、封面≤2MiB且≤4096×4096;上传先校验后写入,被拒绝的上传保留旧附件;读取需会话,经http.ServeContent提供Range/206、416、ETag/304;播放位置按账号与书籍保存,替换或移除音频时重置,跨账号一律404。学习端新增书库封面、书籍页「音频与封面」区块与阅读页常驻播放器(播放/暂停、拖动、0.75–1.5倍速、位置上报),字节经带凭据的fetch取回并转为对象URL,令牌不进URL。验证:Go 86项顶层用例、学习端157单测与26项E2E(连续3次全量跑通过)、真实API+MySQL 41项、附件版恢复演练22项。浏览器是否真实解码播放未验证(测试中媒体元素被桩替换),真机听感与兼容性待人工确认;同时修掉了#11遗留的e2e/phrase.spec.ts偶发失败(重试条件改为断言期望词数、重读坐标、松开前留出扩展时间)。

原MVP范围#2~#15至此全部实施并验收。此后用户提出新的使用场景(多篇网络文章合并成一本书的多章,每章各有音频并新增章节插图),已确认在#21已交付代码基础上继续改、不推倒重做;该变更的完整契约草案见#21评论8129,已另建工单#37承接。仍待处理:#24书库列表优化与缺陷#32(编辑正文回到曾用版本返回500,修复方案待确认)。

当前工程状态(2026-09-16)

#37 章节级音频与章节插图已按用户确认的线框与增量契约实现,并于 2026-09-16 通过用户验收,PR #38 已 fast-forward-only 合入 main。本单经历六轮用户驱动的迭代,最终形态是:音频与插图挂在章节上(一章各一张),封面留在书上;阅读页在正文上方显示插图缩略图、点击在弹窗看原图,播放器只在本章有音频时出现;书籍页章节列表每行只有一个「编辑」,编辑对话框同时管理标题、作者、正文、插图与音频(标题/作者/正文点保存后生效,文件选中后立即上传);书籍页封面压成一行紧凑控件,书名右侧显示书级作者,「编辑书籍」可改书名与作者。schema 经历三次追加:v9 新增 lexgo_chapter_attachments 与 lexgo_chapter_playback_positions 并幂等清空书级音频历史行(书级音频接口与播放接口下线),v10 给 lexgo_chapters 加可选作者,v11 给 lexgo_books 加可选作者;v10/v11 用带守卫的条件加列(先查 information_schema 再 ALTER TABLE,在语句列表之后执行),保持「部分迁移可重试、回退标记后可重新升级」这一项目一贯保证。书籍作者与章节作者是两份互相独立、都可选(≤120 字符、留空即清空)的自由文本,章节不继承书级作者。验证:Go 91 项顶层用例、学习端 157 单测与 26 项 E2E、治理 65 项、真实 API+MySQL 52 项、#15 恢复演练第三次 22 项(附件按章节归属、按字节恢复、Range 可用)。

本单期间还发现并修复了一个从 #10 起就存在的真实缺陷:main.ts 漏引入 Element Plus 的 dialog 与 message-box 样式,导致全站所有对话框与确认框退化成文档流块;修复后补充了断言浮层定位属性的 expectModalOverlay/expectMessageBoxOverlay 用例,并把「只看可见性、不看是否浮层」这一验证盲区写回文档。未实现的确认项:书库卡片显示书级作者、章节作者继承书级作者;真机听感与浏览器真实解码播放仍需人工确认。

至此 MVP 原范围 #2~#15 与增补 #21、#37 全部实施并验收;仍待处理 #24 书库列表优化与缺陷 #32。#16 的 #37 复选框已勾选。