Files
photo-live/docs/plans/progress/UI03-验收记录.md
T
浅念 f435d7bfc3 docs: UI-03 acceptance record
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-22 03:16:21 +08:00

14 KiB
Raw Blame History

UI-03 App 全页面视觉重构 验收记录

基线:方案 commit 18c4c3c · A00 基线 commit 9d521ff(父提交即 ui02 标签指向的 2a489aa)· 日期:2026-09-22 · 环境:Windows 11 + MuMu 模拟器(Android 15,540×960 @240dpi)+ Flutter 3.44(仓库固定版本)· 基线时工作树干净(除本目录截图产物)。

1. 任务完成表

任务 内容 Commit 状态
Task 1 (A00) 基线截图 + 验收骨架 + 20 页面差距核对 9d521ff 完成
Task 2 (A01) 主题校准 + 账号与设置(页面 01-04) 95e8417 完成
Task 3 (A03) 相册工作台(页面 05-08) 5715c60 完成
Task 4 (A04) 表单与协作(页面 09-12) 8bd09ee 完成
Task 5 (A05) 拍摄与上传(页面 13-16) ab51616 完成
Task 6 (A06) 照片与分享(页面 17-20) 8ee6959 完成
Task 7 (A07+A08) 回归验收 + 交接(本记录 + 总纲注记 + tag ui03) 本提交 完成

2. 20 页面映射

# 页面 代码入口 Task 状态 after 截图
01 登录 lib/pages/login_page.dart Task 2 Done 01-login.png
02 设置 lib/pages/home_page.dart (SettingsTab) Task 2 Done 02-settings.png
03 修改密码 lib/pages/password_change_page.dart Task 2 Done 运行检查(widget 测试覆盖)
04 语言选择 lib/ui/language_sheet.dart Task 2 Done 04-language-sheet.png
05 相册列表 lib/pages/albums_tab.dart Task 3 Done 05-albums.png(zh)/ 05b-albums-en.png(en)
06 相册详情 lib/pages/album_detail_page.dart Task 3 Done 06-album-detail.png
07 操作菜单 album_detail_page.dart:413 AlbumActionSheet Task 3 Done 运行检查(widget 测试覆盖)
08 空相册 album_detail_page.dart 空态分支 Task 3 Done 运行检查(widget 测试覆盖)
09 创建相册 lib/pages/album_form_page.dart Task 4 Done 运行检查(widget 测试覆盖)
10 编辑相册 album_form_page.dart(edit 模式,Details/Access 页签) Task 4 Done 运行检查(widget 测试覆盖)
11 成员 lib/pages/album_members_page.dart Task 4 Done 运行检查(widget 测试覆盖)
12 分类 lib/pages/album_categories_page.dart(新提取) Task 4 Done 运行检查(widget 测试覆盖)
13 拍摄 lib/pages/capture_page.dart Task 5 Done 运行检查(深色界面 widget 测试覆盖;模拟器无摄像头,不冒充预览)
14 上传中心 lib/pages/queue_tab.dart Task 5 Done 14-uploads.png
15 异常任务 queue_tab.dart Needs attention 筛选视图 Task 5 Done 运行检查(widget 测试覆盖)
16 服务端历史 lib/pages/server_history_page.dart Task 5 Done 运行检查(widget 测试覆盖)
17 照片网格 lib/pages/album_photos_page.dart Task 6 Done 17-photos.png
18 管理大图 lib/pages/album_photo_viewer_page.dart Task 6 Done 18-viewer.png
19 分享卡 lib/pages/share_qr_dialog.dart Task 6 Done 19-share.png
20 隐藏确认 album_photo_viewer_page.dart:619 HidePhotoConfirmSheet Task 6 Done 运行检查(widget 测试覆盖)

说明:07/08/15/20 为其它页面的状态或弹层(BottomSheet / 空态 / 筛选视图),无独立路由;13 拍摄页 MuMu 模拟器无可用摄像头,按方案 §8.2「无相机设备时不冒充预览」以深色样式与逻辑测试覆盖。

3. APP-A 验收矩阵(方案 §8.1)

编号 状态 证据
APP-A01 20 页面均有实现/入口映射 ✅ 上表 20/20 Done;无「只做首页」情况
APP-A02 卡片/分组表单/底部操作/摄影深色接近设计板 ✅ AlbumCard 16:9 封面+底部暗色渐变叠字(albums_tab.dart:189);分组表单(album_form_page.dart);底部固定 Take/Choose photos;摄影深色 kColorPhotoBackdrop=0xFF10161E(tokens.dart:56)、capture_page.dart 深色界面;截图 01/05/06/14/17/18/19
APP-A03 根导航仅三主页面,返回/路由正确 ✅ home_page.dart:41 IndexedStack 三页签(相册/上传/设置),内部 Navigator push;viewer 关闭返回网格原滚动位置(album_photo_viewer_test.dart)
APP-A04 登录/密码无注册飞书入口,错误与提交反馈真实 ✅ login_page.dart / password_change_page.dart 无注册、无飞书入口(负面项由代码走查确认);错误提示来自真实 API 响应(login_page_test.dart 5 项、password_change_page_test.dart 4 项)
APP-A05 语言 Done 提交、取消不改变、中英文持久化 ✅ language_sheet.dart 临时选中 + Done 提交;account_pages_ui03_test.dart 覆盖取消/提交/持久化;实机验证:截图 04(zh 面板)→ 切 English 后 05b 全英文
APP-A06 相册状态/角色入口/封面缺省正确,无伪造计数 ✅ 状态角标与计数全部来自 API;无封面同尺寸占位(albums_tab.dart:30);AlbumActionSheet 按角色过滤(album_detail_page.dart:413);截图 05(占位封面)/06(状态徽章)
APP-A07 创建/编辑必填、跨页签草稿、语言字段和时区不丢失 ✅ album_form_page.dart:326-337 Details/Access 页签共享草稿;时区显式选择;album_form_page_test.dart 14 项(必填/草稿/时区保留)
APP-A08 邀请为内部账号选择;成员分类权限、失败状态可用 ✅ album_members_page.dart:365 BottomSheet 搜索选择器(内部账号,防抖 :420);album_categories_page.dart 权限分支;成员 6 项 + 分类 7 项测试
APP-A09 相机方向/权限/连拍/入队反馈,无多余拍摄模式 ✅ capture_page.dart 单一拍摄模式、快门 76dp(:757)、连拍轻反馈、退出不取消已入队;capture_page_test.dart 14 项(含分类切换归属不变)
APP-A10 上传状态和操作匹配,移除本机记录不删云图 ✅ queue_tab.dart:82 摘要、:219/:388 异常分类重试(Retry/Select again 按真实可恢复性);移除记录仅本地(queue_tab_test.dart 20 项)
APP-A11 服务端历史与本机队列不混淆,账号隔离正确 ✅ server_history_page.dart 独立页「Server records · All devices」,按账号/权限拉取;server_history_page_test.dart 7 项
APP-A12 预览受控、签名刷新有限、分页和回位正确 ✅ 签名 URL 失败 → 一次受控刷新不无限重试(album_photo_viewer_test.dart);三列网格极窄两列(album_photos_page.dart:535);关闭返回原滚动位置
APP-A13 隐藏/恢复/删除权限真实,确认绑定正确 photoId ✅ HidePhotoConfirmSheet(album_photo_viewer_page.dart:619),photoId 在打开瞬间捕获防错位;权限沿用服务端校验未放宽
APP-A14 QR 真实生成、公开关闭提示、复制失败回退 ✅ QrImageView 由真实 viewer 链接生成(share_qr_dialog.dart:127);未公开琥珀提示(:8 注释/:152);share_qr_page_test.dart 4 项;截图 19
APP-A15 320/390/430、平板、横屏及文字缩放可达 ⚠️ 部分 350/390/800/900 逻辑宽度已由 widget 测试覆盖;320/430、文字缩放 1.3/2.0、平板、横屏未系统化截验,随 G2 真机关口补(同 UI-01 UI-A07 处理先例)
APP-A16 浅深色、减少动画、Semantics、点击目标达标 ✅* 工作台浅色 + 摄影界面深色为方案既定双风格(非系统暗色切换);快门 76dp、详情四入口 ≥44dp;Semantics/减少动画未逐一核验(*见偏差表)
APP-A17 上传恢复、凭证续签、原生桥接回归未受影响 ✅ lib/features 引擎/桥零改动;147 项引擎/桥测试全绿,含凭证续签(test/features/uploads/upload_engine_test.dart:648/:983)
APP-A18 截图与测试证据真实,未完成关口明确标注 ✅ 本记录 + 10 张 after 截图(MuMu 实机截取,demo-seed 合成数据);iOS/真机关口在 §8 明确标注未完成

4. 截图索引

目录:docs/plans/progress/ui03-screenshots/(按任务指令与基线约定存放;方案 §8.2 原文路径 docs/designs/ui03-implementation/ 未采用,见偏差表)。数据为 scripts/demo-seed.mjs 合成(双语演示相册、12 张 sharp 生成照片、点赞/浏览),无真实账号与私人照片。

文件 页面 说明
after/01-login.png 01 登录 冷启动,摄影拼贴 + 品牌主标题
after/02-settings.png 02 设置 账号摘要卡 + 分组 + 退出
after/04-language-sheet.png 04 语言选择 拖柄 BottomSheet,三选项各以自身语言书写
after/05-albums.png 05 相册列表 中文;16:9 封面卡 + 底部导航
after/05b-albums-en.png 05 相册列表(en) 切换 English 后全英文界面
after/06-album-detail.png 06 相册详情 封面资料 + 四入口 + Recent photos 三列预览
after/14-uploads.png 14 上传中心 摘要 + 筛选 + 历史入口
after/17-photos.png 17 照片网格 三列网格 + All/Published/Hidden 筛选
after/18-viewer.png 18 管理大图 深色背景 contain + 资料条 + Hide/Publish again/Delete
after/19-share.png 19 分享卡 真实二维码 + 链接 + Copy link + 公开状态提示
baseline/01-login.png 等 5 张 01/02/05/06/14 A00 基线(commit 9d521ff)

未截图页面(03/07-13/15/16/20):全部有 widget 测试覆盖并做模拟器运行检查;§8.2 要求的「20 页英文全量 + 320/430/平板/横屏/文字缩放 + 深色全组」未在本轮完成,登记于 §7 剩余事项。

5. 测试命令与真实结果

Web/Turbo 关(2026-09-22,UI-03 全部代码合入后):

命令 结果
pnpm lint 10/10 通过(缓存命中,web 输入自 ui02 未变)
pnpm typecheck 13/13 通过
pnpm test(单测) 426 通过:viewer 222/28 文件、admin 77/14、embed-loader 27、contracts 29、storage 6、api-cn 51、worker 14
pnpm build 10/10 通过
pnpm e2e 364 通过:api-cn 257/257(24 套件,全量新跑 131.54s)、sync 27/27、worker 13/13、admin 23、viewer 44/44

Flutter 关(source scripts/flutter-env.sh && cd apps/mobile):

命令 结果
flutter analyze 0 issues
flutter test 397/397 全绿(UI-02 时为 341,+56;含 account_pages_ui03/album_workspace_ui03 及 16 个页面级套件)

首轮波动的诚实记录(均为同一根因,已复核非产品缺陷):

  1. viewer e2e 首轮 7 失败/16 未跑:失败全部为 seed 辅助的 content-batches 超时(http://127.0.0.1:8081)——当时我并行执行 flutter test + APK 构建,把 sync flush 挤到超时。停止并行负载后单独重跑 viewer e2e:44/44 通过(1.7m)。
  2. flutter test 首轮 396 过 1 挂(capture_page_test「分类切换」),同样发生在并行构建期间;单独重跑全量:397/397 全绿(00:21s)。

6. 既有改动保护与不触碰范围

  • 改动面仅 apps/mobile(pages/theme/tokens/l10n/language_sheet/config.dart 的 viewer 链接 lang 参数)与 docs/;git diff ui02..HEAD --stat 验证无 Web/服务端代码改动。
  • 上传引擎、原生桥、任务状态机、权限校验、幂等、凭证续签、API 契约、Web 观众页、embed 组件全部未动;147 项引擎/桥测试全绿。
  • UI-01 成果(tokens/components/PhotoThumbnail/StateBadge)为校准复用而非重建;未放宽隐藏预览/恢复发布权限;二维码由真实链接生成,未写死设计图数字。

7. 方案偏差与剩余事项

# 偏差/剩余 处理
1 截图目录用 docs/plans/progress/ui03-screenshots/(任务指令 + 基线约定),非 §8.2 的 docs/designs/ui03-implementation/ 已在本记录声明;内容要求(合成数据、无假预览)均已遵守
2 §8.2 全量截图矩阵(20 页英文全量、中文 8 页全、320/430/平板/横屏、深色全组、代表性错误态截图)未完整执行;本轮交付任务要求的 8 页 + 2 张补充 剩余随 G2 真机/平板关口补拍,不宣称已通过
3 APP-A15 部分通过:350/390/800/900 已测;320/430、文字缩放 1.3/2.0、平板、横屏待真机 与 UI-01 UI-A07 同口径标注 ⚠️,不虚报
4 APP-A16 的 Semantics 标签与「减少动画」适配未逐项核验;点击目标(快门 76dp、四入口 ≥44dp)已达标 登记,后续无障碍专项跟进
5 部分负面项为代码走查而非自动化断言:A03 导航缺失项、A04 注册/飞书入口缺失、A06 长标题截断、A07 键盘遮挡、A08 邀请分页、A10 百分比文案、A14 复制失败回退 低风险(缺失类负面项),已列后续补测清单
6 方案 commit 18c4c3c 误含 21 个 .playwright-mcp/*.yml 会话残留(与 UI-02 偏差 6 同源) 已入库无法单独摘除;后续统一清理
7 首轮 e2e/flutter test 并行负载下的超时波动 见 §5,隔离重跑全绿,根因为验收执行方式而非代码

8. 外部关口(未完成,不隐瞒)

  • iOS 构建/运行:未执行(无 Mac 环境)。
  • Android 真机(后台/锁屏/强退重启、相机实拍):未执行;MuMu 无摄像头,拍摄页以逻辑测试 + 深色样式覆盖。
  • 平板/横屏系统化验证、无障碍(TalkBack)走查:未执行。

9. 交付文件清单

  • 本记录:docs/plans/progress/UI03-验收记录.md
  • after 截图 10 张 + baseline 5 张:docs/plans/progress/ui03-screenshots/{after,baseline}/
  • 总纲注记:docs/plans/2026-09-17-实施总纲.md(UI-03 条目)
  • 标签:ui03(指向本提交)