29
Project-Profile
ila edited this page 2026-09-16 21:50:54 +08:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 复选框已勾选。

  • 2026-09-16 新增第二本英语词典(#40):ECDICT 常用子集提供中文释义、CMUdict 提供 IPA 转写音标,二者由 sha256 pin 的源显式准备;schema v12 放开 lexgo_dictionaries 单行约束并增加 provider 列,英英与英汉词典可分别启停。音标来源必须可追溯(IPA 转写 / ECDICT 记法),不确定时不显示。许可:ECDICT 仓库 MIT(数据由公开资料整理,再分发前需自行评估)、CMUdict BSD-2,许可证随仓库保存,词典归档不提交进 Git。

  • 2026-09-16 登录有效期由 8 小时改为 30 天(#42):两端共用同一登录接口,有效期是具名常量 SessionLifetime,绝对有效期、不滑动续期;服务端只存令牌 SHA-256 摘要,改密码/停用/重置仍撤销该账号全部会话。设备与会话管理界面未包含,如需另建工单。

  • 2026-09-16 用户验收 #40(英汉词典与规范音标):ECDICT 常用子集提供中文释义、CMUdict 提供 IPA 转写音标,两本英语词典可分别启停。schema 最终为 v12(放开 lexgo_dictionaries 单行 CHECK、增加 provider 列,两步带条件守卫、可重放)。音标来源必须可追溯(cmudict IPA / ecdict 记法),不可靠就不显示。资源由 scripts/dict_prepare.py 从 sha256 pin 的源显式准备,产物不入库;许可为 ECDICT MIT 与 CMUdict BSD-2。

  • 2026-09-16 用户验收 #42(登录有效期):学习端与管理端共用同一登录接口,有效期由 8 小时改为 30 天(具名常量 SessionLifetime,绝对有效期、不滑动续期)。已知代价:令牌泄露窗口放大约 90 倍;设备/会话列表与"退出其他设备"未包含。

  • 2026-09-16 用户验收 #32(缺陷修复):编辑正文回到曾经用过的版本时复用该内容版本已有的处理任务行;因分支携带仅改镜像的过程提交,PR #39 以 squash 方式合入 main(f565c1c),未改写分支历史。