MVP 补齐桌面与手机学习体验、主题及键盘操作 #14

Closed
opened 2026-09-10 17:09:28 +08:00 by ila · 4 comments
Owner

来源与目标

2026-09-10 用户确认 F01–F12、原型通过,并要求按四阶段建议推进。原型验收:#1 评论 7498。阶段 4;覆盖 F12 收尾。

基于各工单已有响应式基础,完成整条学习流程在两类浏览器的交互一致性、主题与字号偏好。

验收标准

  • 登录、导入、阅读、查词、短语、词汇、复习在桌面/手机无溢出、遮挡或无法返回;真机结果单独记录。
  • 字号和基础明暗主题可保存,账号切换不串偏好;保留阅读位置。
  • 键盘焦点、关闭/取消、复习常用操作可达,输入框内不误触全局快捷键;触摸与滚动不冲突。
  • 仅计跨功能收尾,不重复估算各功能已有的手机布局测试;不含 PWA 和复杂主题。

依赖与执行

前置:#9, #12, #13。状态:待验收(2026-09-15,提交 e069894,PR #34;契约见评论 8081,实施证据见最新评论)。前置尚未通过时不得标进行中;每单完成停在待验收,由用户验收后关闭。技术验证可与不依赖其结论的工作分工,但不提前冻结未验证契约。

参考模块与设计证据

通用 Element Plus 表单与可访问性模式;阅读与复习定制组件。

沿用已验收两端原型,重要差异补局部设计。

后端不为建表/API 单独画页面原型;先写数据、接口、状态、隔离与幂等契约。学习端采用 #1 已验收 v1,未做的 LinguaCafe 对照不标完成。

工作量、范围与风险

预计 3~5 人日(8 小时/人日),包含本单设计、前后端实现、相关测试、修正和文档;是规划估算,不是交付日期或 AI 运行时间。仅 F 范围,X 系列不纳入。数据变更先在隔离测试库验证迁移/回退,保留既有数据和原型。

文档与证据

实施时按影响更新 Architecture-and-Code-Map、Business-Rules-and-Glossary、Local-Development-and-Verification;需求变化更新 Product-Requirements-Overview,交付单补实际部署恢复文档。Wiki 先写再回读同步;结束评论记录测试、未验证内容、提交及 revision。工单正文保留基线,重要变化追加评论。

Gitea MCP 指向其他站点,沿用目标 git.ilapage.cn API 回退;凭据仅进入进程。

## 来源与目标 2026-09-10 用户确认 F01–F12、原型通过,并要求按四阶段建议推进。原型验收:#1 评论 7498。阶段 4;覆盖 F12 收尾。 基于各工单已有响应式基础,完成整条学习流程在两类浏览器的交互一致性、主题与字号偏好。 ## 验收标准 - [ ] 登录、导入、阅读、查词、短语、词汇、复习在桌面/手机无溢出、遮挡或无法返回;真机结果单独记录。 - [ ] 字号和基础明暗主题可保存,账号切换不串偏好;保留阅读位置。 - [ ] 键盘焦点、关闭/取消、复习常用操作可达,输入框内不误触全局快捷键;触摸与滚动不冲突。 - [ ] 仅计跨功能收尾,不重复估算各功能已有的手机布局测试;不含 PWA 和复杂主题。 ## 依赖与执行 前置:#9, #12, #13。状态:待验收(2026-09-15,提交 e069894,PR #34;契约见评论 8081,实施证据见最新评论)。前置尚未通过时不得标进行中;每单完成停在待验收,由用户验收后关闭。技术验证可与不依赖其结论的工作分工,但不提前冻结未验证契约。 ## 参考模块与设计证据 通用 Element Plus 表单与可访问性模式;阅读与复习定制组件。 沿用已验收两端原型,重要差异补局部设计。 后端不为建表/API 单独画页面原型;先写数据、接口、状态、隔离与幂等契约。学习端采用 #1 已验收 v1,未做的 LinguaCafe 对照不标完成。 ## 工作量、范围与风险 预计 3~5 人日(8 小时/人日),包含本单设计、前后端实现、相关测试、修正和文档;是规划估算,不是交付日期或 AI 运行时间。仅 F 范围,X 系列不纳入。数据变更先在隔离测试库验证迁移/回退,保留既有数据和原型。 ## 文档与证据 实施时按影响更新 Architecture-and-Code-Map、Business-Rules-and-Glossary、Local-Development-and-Verification;需求变化更新 Product-Requirements-Overview,交付单补实际部署恢复文档。Wiki 先写再回读同步;结束评论记录测试、未验证内容、提交及 revision。工单正文保留基线,重要变化追加评论。 Gitea MCP 指向其他站点,沿用目标 git.ilapage.cn API 回退;凭据仅进入进程。
Author
Owner

#14 方案确认与实施启动(2026-09-15)

用户 2026-09-15 指示「做 #14,都按你说的来做」,授权按本契约实施。覆盖 F12 收尾,前置 #9、#12、#13 均已验收关闭。分支 feat/14-responsive-display 从 main 5f86f17 创建。

D1 先测现状(已完成,事实而非假设)

用带触摸的 390×844 移动视口逐个打开登录/书库/导入/书籍/阅读/查词面板/生词本/复习/进度:每个页面 scrollWidth 都等于 innerWidth,没有溢出元素。说明前几单的响应式基础成立,本单不重做已完成的部分,只补缺口并把已成立的性质固化成自动化移动测试。真机手感(长按选择、手柄拖动)无法由本机自动化产生,按 D9 记录为待人工确认的证据缺口,不用窄屏桌面冒充真机。

D2 主题偏好

theme ∈ {浅色, 深色, 跟随系统},默认跟随系统。用 html[data-theme] 标记,同时切换 Element Plus 官方暗色类 html.dark 并引入 element-plus/theme-chalk/dark/css-vars.css;style.css 现有的 116 处硬编码颜色收敛为约 20 个语义变量(背景、表面、文本、次要文本、边框、主色、提示、状态色等),暗色只覆盖变量,不改组件结构。跟随系统时监听 prefers-color-scheme 实时变化。含中文衬线字体与 Element Plus 组件在深色下的可读性。

D3 字号偏好

三档「标准 / 大 / 特大」(1.0 / 1.15 / 1.3),经 CSS 变量 --reader-font-scale 作用于阅读面:章节正文、释义面板正文与例句、复习卡的词与释义。不做全局 UI 缩放,避免侧栏与按钮在窄屏被挤坏;这是有意的边界,会写入文档。

D4 偏好的保存与账号隔离

保存在本机 localStorage,键为 lexgo-learner-display:<账号 id>,按账号隔离:切换账号立刻换成该账号自己的偏好或默认值,A 的深色不会带给 B。未登录的登录页使用系统默认。不跨设备同步(属范围外,明确记录)。这直接对应验收标准「字号和基础明暗主题可保存,账号切换不串偏好」。

D5 偏好入口

学习端站点头部统一放一个「显示」控件(下拉/弹层,含主题与字号两组单选),当前值可见、可键盘操作、移动端可点开。七个页面各加一处引用,不重构现有头部结构。

D6 保留阅读位置

按「账号+章节」保存滚动比例,并同时保存当时的 content_sha256:章节就绪后恢复到上次位置;正文版本变化后不恢复(避免把新内容的读者丢到旧偏移);同账号其他章节互不影响。本机行为,不跨设备。

D7 键盘操作与焦点

  • 复习页:空格/Enter 显示答案,1 认识/答对,2 不认识/答错,3 再学一次;只在事件目标不是输入框、文本域、下拉或按钮时生效,避免与按钮原生按键重复触发;界面显示快捷键提示。
  • 阅读器保留 Esc 关闭释义面板;LookupPanel 自身的 Esc 继续只关面板。
  • 所有可交互元素(按钮、链接、输入、阅读词、状态控件)有可见焦点环。

D8 触摸与滚动

不引入任何会阻止默认行为的触摸处理(现状即如此,本单保持)。新增带 hasTouch 的移动 e2e:触摸滑动必须真的滚动页面、不得误开释义面板;pointerup 与 selectionchange 的既有设计不变。长按原生选择的手感仍需真机确认。

D9 范围外

PWA、离线能力、自定义配色/复杂主题、全局 UI 缩放、偏好跨设备同步、阅读位置跨设备同步、真机自动化(记录为待人工确认)。

D10 验证与文档

  • 新增移动测试项目(390×844,isMobile + hasTouch):8 个界面无横向溢出、每页都有可返回的入口、复习键盘流程、触摸滚动不误触、主题切换在刷新后保持且账号间不串、阅读位置恢复。
  • 单元测试:偏好 store(账号隔离、跟随系统、非法存储值回退、Element Plus 暗色类同步)、阅读位置(sha 变化不恢复、账号隔离、比例夹取)。
  • 真实浏览器(桌面+移动模拟)走一遍并截图;管理端本单无改动,仍跑其既有测试与 lint。
  • 更新 Architecture-and-Code-Map、Business-Rules-and-Glossary、Local-Development-and-Verification、Product-Requirements-Overview 与 Home;无 schema 变化。

D11 回退

纯前端与文档改动,无迁移:回退到上一提交即可;本单不触碰后端与数据库。

Gitea MCP 仍指向其他站点,沿用目标站点 API 回退;凭据仅从既有安全配置读入进程。

## #14 方案确认与实施启动(2026-09-15) 用户 2026-09-15 指示「做 #14,都按你说的来做」,授权按本契约实施。覆盖 F12 收尾,前置 #9、#12、#13 均已验收关闭。分支 `feat/14-responsive-display` 从 main `5f86f17` 创建。 ### D1 先测现状(已完成,事实而非假设) 用带触摸的 390×844 移动视口逐个打开登录/书库/导入/书籍/阅读/查词面板/生词本/复习/进度:**每个页面 `scrollWidth` 都等于 `innerWidth`,没有溢出元素**。说明前几单的响应式基础成立,本单不重做已完成的部分,只补缺口并把已成立的性质固化成自动化移动测试。真机手感(长按选择、手柄拖动)无法由本机自动化产生,按 D9 记录为待人工确认的证据缺口,不用窄屏桌面冒充真机。 ### D2 主题偏好 `theme ∈ {浅色, 深色, 跟随系统}`,默认跟随系统。用 `html[data-theme]` 标记,同时切换 Element Plus 官方暗色类 `html.dark` 并引入 `element-plus/theme-chalk/dark/css-vars.css`;`style.css` 现有的 116 处硬编码颜色收敛为约 20 个语义变量(背景、表面、文本、次要文本、边框、主色、提示、状态色等),暗色只覆盖变量,不改组件结构。跟随系统时监听 `prefers-color-scheme` 实时变化。含中文衬线字体与 Element Plus 组件在深色下的可读性。 ### D3 字号偏好 三档「标准 / 大 / 特大」(1.0 / 1.15 / 1.3),经 CSS 变量 `--reader-font-scale` 作用于**阅读面**:章节正文、释义面板正文与例句、复习卡的词与释义。不做全局 UI 缩放,避免侧栏与按钮在窄屏被挤坏;这是有意的边界,会写入文档。 ### D4 偏好的保存与账号隔离 保存在本机 `localStorage`,键为 `lexgo-learner-display:<账号 id>`,**按账号隔离**:切换账号立刻换成该账号自己的偏好或默认值,A 的深色不会带给 B。未登录的登录页使用系统默认。**不跨设备同步**(属范围外,明确记录)。这直接对应验收标准「字号和基础明暗主题可保存,账号切换不串偏好」。 ### D5 偏好入口 学习端站点头部统一放一个「显示」控件(下拉/弹层,含主题与字号两组单选),当前值可见、可键盘操作、移动端可点开。七个页面各加一处引用,不重构现有头部结构。 ### D6 保留阅读位置 按「账号+章节」保存滚动比例,并同时保存当时的 `content_sha256`:章节就绪后恢复到上次位置;**正文版本变化后不恢复**(避免把新内容的读者丢到旧偏移);同账号其他章节互不影响。本机行为,不跨设备。 ### D7 键盘操作与焦点 - 复习页:`空格`/`Enter` 显示答案,`1` 认识/答对,`2` 不认识/答错,`3` 再学一次;**只在事件目标不是输入框、文本域、下拉或按钮时生效**,避免与按钮原生按键重复触发;界面显示快捷键提示。 - 阅读器保留 `Esc` 关闭释义面板;`LookupPanel` 自身的 Esc 继续只关面板。 - 所有可交互元素(按钮、链接、输入、阅读词、状态控件)有可见焦点环。 ### D8 触摸与滚动 不引入任何会阻止默认行为的触摸处理(现状即如此,本单保持)。新增带 `hasTouch` 的移动 e2e:触摸滑动必须真的滚动页面、不得误开释义面板;`pointerup` 与 `selectionchange` 的既有设计不变。长按原生选择的手感仍需真机确认。 ### D9 范围外 PWA、离线能力、自定义配色/复杂主题、全局 UI 缩放、偏好跨设备同步、阅读位置跨设备同步、真机自动化(记录为待人工确认)。 ### D10 验证与文档 - 新增移动测试项目(390×844,`isMobile` + `hasTouch`):8 个界面无横向溢出、每页都有可返回的入口、复习键盘流程、触摸滚动不误触、主题切换在刷新后保持且账号间不串、阅读位置恢复。 - 单元测试:偏好 store(账号隔离、跟随系统、非法存储值回退、Element Plus 暗色类同步)、阅读位置(sha 变化不恢复、账号隔离、比例夹取)。 - 真实浏览器(桌面+移动模拟)走一遍并截图;管理端本单无改动,仍跑其既有测试与 lint。 - 更新 Architecture-and-Code-Map、Business-Rules-and-Glossary、Local-Development-and-Verification、Product-Requirements-Overview 与 Home;无 schema 变化。 ### D11 回退 纯前端与文档改动,无迁移:回退到上一提交即可;本单不触碰后端与数据库。 Gitea MCP 仍指向其他站点,沿用目标站点 API 回退;凭据仅从既有安全配置读入进程。
Author
Owner

#14 实施完成,待用户验收(2026-09-15)

用户 2026-09-15 指示「做 #14,都按你说的来做」,按契约评论 8081 实施。分支 feat/14-responsive-display 从 main 5f86f17 创建,功能提交 e069894 已推送;PR #34 未合并,工单不关闭,停在待用户验收。

实现与差异

  • D1 先测现状:390×844 触摸视口逐个打开八个界面,全部没有横向溢出——响应式基础在前几单已成立,本单只补缺口并把它固化成自动化移动用例。
  • D2 主题:浅色/深色/跟随系统;style.css 收敛为语义调色板(:root 的 53 个变量是文件内仅有的颜色字面量),html[data-theme] 覆盖取值,html.dark 映射 Element Plus 暗色变量并引入其暗色样式表;跟随系统时监听系统配色变化。
  • D3 字号:标准/大/特大(1.0/1.15/1.3),经 --reader-font-scale 只作用于阅读面,不做全局缩放。
  • D4 保存与隔离:本机 lexgo-learner-display:<账号 id>,切换账号换成该账号偏好或默认,退出回默认;非法/旧格式回退默认。不跨设备同步。
  • D5 入口:站点头部「显示」下拉,七个学习页面共用,键盘可达、手机可点。
  • D6 阅读位置:按账号+章节保存滚动比例与该章 content_sha256;正文换新版本后不恢复,等待可滚动后再应用(约 1 秒内放弃)。
  • D7 键盘与焦点:复习页 空格/Enter 显示答案、1/2/3 评分,输入控件内不触发、聚焦按钮的按键交给浏览器;Esc 关闭释义面板;焦点环覆盖自定义元素。
  • D8 触摸:不引入任何阻止默认行为的触摸处理;移动用例用真实触摸事件验证滚动与误触。

实际验证

验证 结果
learner npx vitest --run / vue-tsc --build / pnpm run build / playwright test 147 项单测、类型检查、构建、23 项 E2E(桌面 19 + 移动 4)通过;新增 20 单测与 8 项 E2E
admin pnpm test / pnpm lint 31 项与 lint 通过(管理端无改动)
python -m unittest discover -s tests / harness.py check --strict / sync --check 56 项、严格检查、镜像一致
LEXGO_TEST_DB_NAME=lexgo_test_issue13 python scripts/server.py test-integration 70 项通过(后端未改动,复跑确认)
真实学习端+Go API+MySQL 真机模拟触摸视口下的八页无溢出检查;粘贴 40 行长章节后「滚动 → 离开 → 返回」位置恢复(偏差 < 150px);深色+特大刷新后保持且正文实际变大;在真实到期卡上按空格显示答案(故意不评分,避免改动 fixture 的复习计划);fixture 书籍结束时删除
移动项目 --project=mobile 八个界面无横向溢出且均可返回、显示控件手指可点、CDP 触摸上滑真的滚动且不误开面板、面板不越界且预留底部空间、关闭面板后位置不跳、深色与字号刷新保持、账号隔离

本单自己踩到并修掉的问题(如实记录)

  1. 调色板自引用:批量把颜色字面量替换为变量时,:root 自身的定义也被替换,产生 --bg: var(--brand-panel-text) 这类自引用,所有颜色静默失效;几何断言与属性断言全部照常通过,只有焦点环探针暴露了它(outline-style: none 而宽度仍是 medium 的 3px)。修好后补了 e2e/theme.spec.ts:逐个读回 16 个变量,断言深浅两套都解析成非空值、背景不透明、正文与背景不同色。
  2. 快捷键与聚焦按钮冲突:最初「事件来自按钮就忽略」的规则让空格显示答案后焦点落在「答对」上、数字键随即失效;改为只让按钮拥有它自己的按键(空格/Enter),数字键仍归复习。
  3. 恢复位置过早:章节刚渲染时还不可滚动,一次性 60ms 定时器静默放弃;改为等待可滚动后再应用。
  4. 一次把 onMounted(load) 改成只注册滚动监听,导致阅读器不再加载章节,被既有单测当场拦下。

未验证与边界

  • 真实手机的长按选择、手柄拖动、滚动惯性、软键盘与安全区表现仍需人工确认;本单触摸证据来自 390×844 hasTouch 的模拟设备,不用模拟结果冒充真机(#4、#11 起就记录该缺口,本单未能消除)。
  • 只在 Chromium 上验证;未做 Safari/Firefox。
  • 不含 PWA、离线、自定义配色、全局 UI 缩放、偏好与阅读位置跨设备同步。
  • 真实链路的复习键盘验证只做到「显示答案」,未在真实数据上评分(避免改动 fixture 计划),评分路径由单元测试与 mock E2E 覆盖。

文档

  • Architecture-and-Code-Map: a4fd3873678017ea046a6e708141d7f8140edcef
  • Business-Rules-and-Glossary: 5a44b1713b3fd2374baa78314872539f3e2e23ab
  • Local-Development-and-Verification: e6255c24e7b966573a9851b1e2356e370d3daef1
  • Product-Requirements-Overview: 912089b338bf3c978add09069e39e7fb19c94240
  • Home: 591ce1b3b16af9401062af925ba159ebdc4b8c6a
  • 镜像校验:sync --check 通过,4 个变更页逐字节正文比对一致;仓库根 AGENTS.md 与 README.md 已同步口径与进度

回退

纯前端与文档改动,无 schema 变化、无接口变化:git revert 到 5f86f17 或恢复上一版学习端构建即可。

Gitea MCP 仍指向其他站点,沿用目标站点 API 回退;凭据仅从既有安全配置读入进程。

附件:移动端八个界面与深色/特大/滚动截图、桌面主题浅深两态、复习键盘流程,以及真实链路的阅读位置、深色特大与复习键盘截图;本会话模型不能读取图片,断言来自程序化检查。

## #14 实施完成,待用户验收(2026-09-15) 用户 2026-09-15 指示「做 #14,都按你说的来做」,按契约评论 [8081](https://git.ilapage.cn/OPC/lexgo/issues/14#issuecomment-8081) 实施。分支 `feat/14-responsive-display` 从 main `5f86f17` 创建,功能提交 `e069894` 已推送;PR [#34](https://git.ilapage.cn/OPC/lexgo/pulls/34) 未合并,工单不关闭,停在待用户验收。 ### 实现与差异 - **D1 先测现状**:390×844 触摸视口逐个打开八个界面,**全部没有横向溢出**——响应式基础在前几单已成立,本单只补缺口并把它固化成自动化移动用例。 - **D2 主题**:浅色/深色/跟随系统;`style.css` 收敛为语义调色板(`:root` 的 53 个变量是文件内仅有的颜色字面量),`html[data-theme]` 覆盖取值,`html.dark` 映射 Element Plus 暗色变量并引入其暗色样式表;跟随系统时监听系统配色变化。 - **D3 字号**:标准/大/特大(1.0/1.15/1.3),经 `--reader-font-scale` 只作用于阅读面,不做全局缩放。 - **D4 保存与隔离**:本机 `lexgo-learner-display:<账号 id>`,切换账号换成该账号偏好或默认,退出回默认;非法/旧格式回退默认。不跨设备同步。 - **D5 入口**:站点头部「显示」下拉,七个学习页面共用,键盘可达、手机可点。 - **D6 阅读位置**:按账号+章节保存滚动比例与该章 `content_sha256`;正文换新版本后不恢复,等待可滚动后再应用(约 1 秒内放弃)。 - **D7 键盘与焦点**:复习页 `空格`/`Enter` 显示答案、`1/2/3` 评分,输入控件内不触发、聚焦按钮的按键交给浏览器;`Esc` 关闭释义面板;焦点环覆盖自定义元素。 - **D8 触摸**:不引入任何阻止默认行为的触摸处理;移动用例用真实触摸事件验证滚动与误触。 ### 实际验证 | 验证 | 结果 | |---|---| | learner `npx vitest --run` / `vue-tsc --build` / `pnpm run build` / `playwright test` | 147 项单测、类型检查、构建、**23 项 E2E**(桌面 19 + 移动 4)通过;新增 20 单测与 8 项 E2E | | admin `pnpm test` / `pnpm lint` | 31 项与 lint 通过(管理端无改动) | | `python -m unittest discover -s tests` / `harness.py check --strict` / `sync --check` | 56 项、严格检查、镜像一致 | | `LEXGO_TEST_DB_NAME=lexgo_test_issue13 python scripts/server.py test-integration` | 70 项通过(后端未改动,复跑确认) | | 真实学习端+Go API+MySQL | 真机模拟触摸视口下的八页无溢出检查;粘贴 40 行长章节后「滚动 → 离开 → 返回」位置恢复(偏差 < 150px);深色+特大刷新后保持且正文实际变大;在真实到期卡上按空格显示答案(**故意不评分**,避免改动 fixture 的复习计划);fixture 书籍结束时删除 | | 移动项目 `--project=mobile` | 八个界面无横向溢出且均可返回、显示控件手指可点、CDP 触摸上滑真的滚动且不误开面板、面板不越界且预留底部空间、关闭面板后位置不跳、深色与字号刷新保持、账号隔离 | ### 本单自己踩到并修掉的问题(如实记录) 1. **调色板自引用**:批量把颜色字面量替换为变量时,`:root` 自身的定义也被替换,产生 `--bg: var(--brand-panel-text)` 这类自引用,**所有颜色静默失效**;几何断言与属性断言全部照常通过,只有焦点环探针暴露了它(`outline-style: none` 而宽度仍是 medium 的 3px)。修好后补了 `e2e/theme.spec.ts`:逐个读回 16 个变量,断言深浅两套都解析成非空值、背景不透明、正文与背景不同色。 2. **快捷键与聚焦按钮冲突**:最初「事件来自按钮就忽略」的规则让空格显示答案后焦点落在「答对」上、数字键随即失效;改为只让按钮拥有它自己的按键(空格/Enter),数字键仍归复习。 3. **恢复位置过早**:章节刚渲染时还不可滚动,一次性 60ms 定时器静默放弃;改为等待可滚动后再应用。 4. 一次把 `onMounted(load)` 改成只注册滚动监听,导致阅读器不再加载章节,被既有单测当场拦下。 ### 未验证与边界 - **真实手机的长按选择、手柄拖动、滚动惯性、软键盘与安全区表现仍需人工确认**;本单触摸证据来自 390×844 `hasTouch` 的模拟设备,不用模拟结果冒充真机(#4、#11 起就记录该缺口,本单未能消除)。 - 只在 Chromium 上验证;未做 Safari/Firefox。 - 不含 PWA、离线、自定义配色、全局 UI 缩放、偏好与阅读位置跨设备同步。 - 真实链路的复习键盘验证只做到「显示答案」,未在真实数据上评分(避免改动 fixture 计划),评分路径由单元测试与 mock E2E 覆盖。 ### 文档 - Architecture-and-Code-Map: `a4fd3873678017ea046a6e708141d7f8140edcef` - Business-Rules-and-Glossary: `5a44b1713b3fd2374baa78314872539f3e2e23ab` - Local-Development-and-Verification: `e6255c24e7b966573a9851b1e2356e370d3daef1` - Product-Requirements-Overview: `912089b338bf3c978add09069e39e7fb19c94240` - Home: `591ce1b3b16af9401062af925ba159ebdc4b8c6a` - 镜像校验:`sync --check` 通过,4 个变更页逐字节正文比对一致;仓库根 `AGENTS.md` 与 `README.md` 已同步口径与进度 ### 回退 纯前端与文档改动,**无 schema 变化、无接口变化**:`git revert` 到 `5f86f17` 或恢复上一版学习端构建即可。 Gitea MCP 仍指向其他站点,沿用目标站点 API 回退;凭据仅从既有安全配置读入进程。 附件:移动端八个界面与深色/特大/滚动截图、桌面主题浅深两态、复习键盘流程,以及真实链路的阅读位置、深色特大与复习键盘截图;本会话模型不能读取图片,断言来自程序化检查。
Author
Owner

#14 代码审核:达标(2026-09-15,Claude Code)

审核对象:提交 e069894(PR #34)。只读审阅代码与测试差异,没有重跑测试。契约 D1~D11(评论 8081)逐条核对如下。

逐条核对

  • D2/D4 主题与隔离:stores/preferences.ts 的 readPreference 对损坏/旧格式/非法值一律回退默认而不是抛错或半应用;displayKey 按账号 id 建立独立存储键;watch(() => session.user?.id, ...) 在账号切换时立即重新 load。这几点都是容易做漏的边界,代码里都处理了。达标。
  • D3 字号:FONT_SCALES 只通过 --reader-font-scale 一个 CSS 变量输出,applyPreference 没有触碰任何布局相关的变量,符合「只作用阅读面、不做全局缩放」的边界。达标。
  • D6 阅读位置:readingPosition.ts 的 readPosition 显式比较 parsed.sha !== sha 才拒绝,ReaderView.vue 的 restorePosition 用 sha 和 status==='ready' 双重把关;恢复逻辑改成轮询等待页面可滚动(最多 20×50ms ≈ 1s 后放弃),而不是单个定时器賭时机。达标。
  • D7 键盘操作:reviewShortcuts.ts 的 ignoresShortcut 精确区分「按钮只吃 Space/Enter」和「数字键永远归复习」,这正是 pi 自己发现并修复的冲突点;代码注释把原因写清楚了,不是含糊带过。达标。
  • D8 触摸:确认没有引入 preventDefault/touchmove 拦截,移动端 e2e 用真实触摸事件验证滑动能滚动、不误开面板。达标。
  • D11 无 schema/接口变化:git show --stat 确认改动全部在 learner/ 与文档,没有 server/ 目录改动。达标。

对自查缺陷记录的复核

评论里如实记录了实施中踩到并修掉的 4 个问题,我抽查了其中两个最容易被掩盖的:

  1. 调色板自引用:检查 style.css 的 :root 块(53 个变量)与 html[data-theme='dark'] 覆盖块,两处全部是字面量十六进制颜色,没有找到自引用的 var()。深色覆盖块的取值与浅色一一对应、无遗漏。确认已修复。
  2. 快捷键与聚焦按钮冲突:ignoresShortcut 的实现与描述一致——button, a[href], [role="button"] 只拦截 Space/Enter,数字键不受影响。确认已修复。

这种「先如实报告自己犯过的错,再给出修复依据」的记录方式值得肯定,比只报喜不报错更可信。

结论

达标,可以进入用户验收。 这单的验收标准本身就要求「真机结果单独记录」,pi 也确实把「模拟触摸视口」和「真实手机」分得很清楚,没有像业务规则明确禁止的那样拿窄屏当真机;D1 的现状复测(先证明前几单的响应式基础已经成立,再补自动化用例固化,而不是不问就重做)也是合理的效率判断,没有虚报工作量。

本次审核只读代码,没有重跑 learner 的 vitest/E2E(含新增的 mobile/theme/keyboard 专项用例);pi 报告的 147 项单测、23 项 E2E 等结果未被本次复核重复验证。真机(长按选择、手柄拖动、软键盘、安全区)仍是待人工确认的已知缺口,这一点工单本身已如实标注,不需要我重复提示。

Gitea MCP 仍指向其他站点,本次沿用已记录的目标站点 API 回退;凭据只从 ~/.claude/gitea.env 安全配置读入进程。

## #14 代码审核:达标(2026-09-15,Claude Code) 审核对象:提交 `e069894`(PR #34)。只读审阅代码与测试差异,没有重跑测试。契约 D1~D11(评论 8081)逐条核对如下。 ### 逐条核对 - **D2/D4 主题与隔离**:`stores/preferences.ts` 的 `readPreference` 对损坏/旧格式/非法值一律回退默认而不是抛错或半应用;`displayKey` 按账号 id 建立独立存储键;`watch(() => session.user?.id, ...)` 在账号切换时立即重新 `load`。这几点都是容易做漏的边界,代码里都处理了。**达标**。 - **D3 字号**:`FONT_SCALES` 只通过 `--reader-font-scale` 一个 CSS 变量输出,`applyPreference` 没有触碰任何布局相关的变量,符合「只作用阅读面、不做全局缩放」的边界。**达标**。 - **D6 阅读位置**:`readingPosition.ts` 的 `readPosition` 显式比较 `parsed.sha !== sha` 才拒绝,`ReaderView.vue` 的 `restorePosition` 用 sha 和 `status==='ready'` 双重把关;恢复逻辑改成轮询等待页面可滚动(最多 20×50ms ≈ 1s 后放弃),而不是单个定时器賭时机。**达标**。 - **D7 键盘操作**:`reviewShortcuts.ts` 的 `ignoresShortcut` 精确区分「按钮只吃 Space/Enter」和「数字键永远归复习」,这正是 pi 自己发现并修复的冲突点;代码注释把原因写清楚了,不是含糊带过。**达标**。 - **D8 触摸**:确认没有引入 `preventDefault`/`touchmove` 拦截,移动端 e2e 用真实触摸事件验证滑动能滚动、不误开面板。**达标**。 - **D11 无 schema/接口变化**:`git show --stat` 确认改动全部在 `learner/` 与文档,没有 `server/` 目录改动。**达标**。 ### 对自查缺陷记录的复核 评论里如实记录了实施中踩到并修掉的 4 个问题,我抽查了其中两个最容易被掩盖的: 1. **调色板自引用**:检查 `style.css` 的 `:root` 块(53 个变量)与 `html[data-theme='dark']` 覆盖块,两处全部是字面量十六进制颜色,没有找到自引用的 `var()`。深色覆盖块的取值与浅色一一对应、无遗漏。**确认已修复**。 2. **快捷键与聚焦按钮冲突**:`ignoresShortcut` 的实现与描述一致——`button, a[href], [role="button"]` 只拦截 Space/Enter,数字键不受影响。**确认已修复**。 这种「先如实报告自己犯过的错,再给出修复依据」的记录方式值得肯定,比只报喜不报错更可信。 ### 结论 **达标,可以进入用户验收。** 这单的验收标准本身就要求「真机结果单独记录」,pi 也确实把「模拟触摸视口」和「真实手机」分得很清楚,没有像业务规则明确禁止的那样拿窄屏当真机;D1 的现状复测(先证明前几单的响应式基础已经成立,再补自动化用例固化,而不是不问就重做)也是合理的效率判断,没有虚报工作量。 本次审核只读代码,没有重跑 learner 的 vitest/E2E(含新增的 mobile/theme/keyboard 专项用例);pi 报告的 147 项单测、23 项 E2E 等结果未被本次复核重复验证。真机(长按选择、手柄拖动、软键盘、安全区)仍是待人工确认的已知缺口,这一点工单本身已如实标注,不需要我重复提示。 Gitea MCP 仍指向其他站点,本次沿用已记录的目标站点 API 回退;凭据只从 `~/.claude/gitea.env` 安全配置读入进程。
Author
Owner

#14 验收通过(2026-09-15)

用户于 2026-09-15 明确回复「#14 通过验收」。

  • 验收范围:#14 契约 D1~D11(评论 8081)— 主题(浅色/深色/跟随系统)与正文字号(标准/大/特大)按账号保存且账号切换不串、阅读位置保留(正文换版本后不套用)、复习页空格显示答案与 1/2/3 评分且输入框内不误触、八个界面在 390×844 触摸视口无横向溢出且均可返回、触摸滑动滚动不误开释义面板。
  • 代码审核:Claude Code 于 15:40 出具 审核 8090,结论达标、无待改项;本次在结单前先读了该审核(修正 #13 时先结单后读审核的疏漏)。
  • 合并:PR #34 已 fast-forward-only 合入 main,merge commit e069894;验收文档提交 20e13e9 已推送。
  • 文档 revision:Home 9f6485206c60c737b386fdf2f2946adf606d53e7、Architecture b61d9e1b0d9ae9fc24cb026580149f2b582a2526、Product-Requirements 358d7720d952a49b6827a96173a4f63387ac6989、Project-Profile 5cf8e02e2248e93b1255ad85fb41153984c84cd1。
  • 镜像校验:sync --check 通过,并对 4 个变更页做逐字节正文比对(全部一致)。站点对整页批量回读仍返回 HTTP 429,沿用「revision 级 check + 变更页正文比对」。
  • 回退:本单无 schema 变化、无接口变化,纯学习端与文档改动;回到 5f86f17 或恢复上一版学习端构建即可。
  • 遗留:真实手机的长按选择、手柄拖动、滚动惯性、软键盘与安全区表现仍需人工确认(本单触摸证据来自 390×844 hasTouch 模拟设备,未用模拟结果冒充真机);未做 Safari/Firefox 验证。缺陷 #32(编辑正文回到曾用版本返回 500)已定位、方案待用户确认,尚未排期。

单元工单关闭;#16 的 #14 复选框同步勾选。

## #14 验收通过(2026-09-15) 用户于 2026-09-15 明确回复「#14 通过验收」。 - 验收范围:#14 契约 D1~D11(评论 [8081](https://git.ilapage.cn/OPC/lexgo/issues/14#issuecomment-8081))— 主题(浅色/深色/跟随系统)与正文字号(标准/大/特大)按账号保存且账号切换不串、阅读位置保留(正文换版本后不套用)、复习页空格显示答案与 1/2/3 评分且输入框内不误触、八个界面在 390×844 触摸视口无横向溢出且均可返回、触摸滑动滚动不误开释义面板。 - 代码审核:Claude Code 于 15:40 出具 [审核 8090](https://git.ilapage.cn/OPC/lexgo/issues/14#issuecomment-8090),结论**达标、无待改项**;本次在结单前先读了该审核(修正 #13 时先结单后读审核的疏漏)。 - 合并:PR [#34](https://git.ilapage.cn/OPC/lexgo/pulls/34) 已 fast-forward-only 合入 main,merge commit `e069894`;验收文档提交 `20e13e9` 已推送。 - 文档 revision:Home `9f6485206c60c737b386fdf2f2946adf606d53e7`、Architecture `b61d9e1b0d9ae9fc24cb026580149f2b582a2526`、Product-Requirements `358d7720d952a49b6827a96173a4f63387ac6989`、Project-Profile `5cf8e02e2248e93b1255ad85fb41153984c84cd1`。 - 镜像校验:`sync --check` 通过,并对 4 个变更页做逐字节正文比对(全部一致)。站点对整页批量回读仍返回 HTTP 429,沿用「revision 级 check + 变更页正文比对」。 - 回退:本单无 schema 变化、无接口变化,纯学习端与文档改动;回到 `5f86f17` 或恢复上一版学习端构建即可。 - 遗留:**真实手机的长按选择、手柄拖动、滚动惯性、软键盘与安全区表现仍需人工确认**(本单触摸证据来自 390×844 `hasTouch` 模拟设备,未用模拟结果冒充真机);未做 Safari/Firefox 验证。缺陷 #32(编辑正文回到曾用版本返回 500)已定位、方案待用户确认,尚未排期。 单元工单关闭;#16 的 #14 复选框同步勾选。
ila closed this issue 2026-09-15 15:45:28 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/lexgo#14