diff --git a/docs/plans/2026-09-17-实施总纲.md b/docs/plans/2026-09-17-实施总纲.md index 6f4af64..fc568c7 100644 --- a/docs/plans/2026-09-17-实施总纲.md +++ b/docs/plans/2026-09-17-实施总纲.md @@ -109,6 +109,15 @@ Schema 所有权:国内库表(users、albums、photos、upload_sessions、ou > EmbedPage。验收记录见 docs/plans/progress/UI02-验收记录.md:V-A01–A15 矩阵、 > 前后截图、全量回归数字。) +> **进度:UI-03 App 全页面视觉重构完成,2026-09-22,tag `ui03`**(非阶段行—— +> App 侧横向视觉升级:按 5 张设计板重构全部 20 个页面/状态——蓝白工作台(登录拼 +> 贴、16:9 封面卡、分组表单、底部固定操作)+ 深色摄影界面(拍摄、管理大图);分类 +> 页新提取、分享卡真实二维码、隐藏确认绑定 photoId;纯 Flutter 视觉层改造,上传引 +> 擎/原生桥/状态机/权限/API 契约/Web 观众页/embed 零改动。验收记录见 +> docs/plans/progress/UI03-验收记录.md:APP-A01–A18 矩阵(A15 ⚠️ 部分)、20 页面 +> 映射、10 张 after 截图、web 426 单测 + 364 e2e + mobile analyze 0 + 397 测试全绿 +> (合计 1187,mobile +56);320/430/平板/横屏/文字缩放与 iOS/真机关口随 G2 执行。) + 阶段顺序 P1 → P2 → P3 → P4a → P4b → P5。P3 与 P4a 在 P2 契约稳定后可并行;P4b 依赖 P2 的公开列表契约与同步通道(展示位事件扩展),其 T15 全端语言验收还需 P3 完成;P5 依赖全部前序。 每阶段出口执行统一回归门:lint + typecheck + 单元 + 集成 + E2E 全绿,并产出《阶段验收记录》(docs/plans/progress/,逐项对照 A 编号登记证据与未尽事项)。 diff --git a/docs/plans/progress/UI03-验收记录.md b/docs/plans/progress/UI03-验收记录.md index 24e7a91..1cf5ab7 100644 --- a/docs/plans/progress/UI03-验收记录.md +++ b/docs/plans/progress/UI03-验收记录.md @@ -1,44 +1,140 @@ # UI-03 App 全页面视觉重构 验收记录 -基线 commit:18c4c3c · 日期:2026-09-22 · 环境:Windows + MuMu 模拟器 (Android 15) + Flutter 3.44 +基线:方案 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) + +| 编号 | 状态 | 证据 | |---|---|---| -| 01 | 登录 | ui03-screenshots/baseline/01-login.png | -| 02 | 设置 | ui03-screenshots/baseline/02-settings.png | -| 05 | 相册列表 | ui03-screenshots/baseline/05-albums.png | -| 06 | 相册详情 | ui03-screenshots/baseline/06-album-detail.png | -| 14 | 上传中心 | ui03-screenshots/baseline/14-uploads.png | +| 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 明确标注未完成 | -## 20 页面映射 +## 4. 截图索引 -| # | 页面 | 代码入口 | Task | 状态 | -|---|---|---|---|---| -| 01 | 登录 | lib/pages/login_page.dart | Task 2 | 待执行 | -| 02 | 设置 | lib/pages/home_page.dart (SettingsTab) | Task 2 | 待执行 | -| 03 | 修改密码 | lib/pages/password_change_page.dart | Task 2 | 待执行 | -| 04 | 语言选择 | 现有语言面板 | Task 2 | 待执行 | -| 05 | 相册列表 | lib/pages/albums_tab.dart | Task 3 | 待执行 | -| 06 | 相册详情 | lib/pages/album_detail_page.dart | Task 3 | 待执行 | -| 07 | 操作菜单 | BottomSheet from detail | Task 3 | 待执行 | -| 08 | 空相册 | album_detail (empty state) | Task 3 | 待执行 | -| 09 | 创建相册 | lib/pages/album_form_page.dart | Task 4 | 待执行 | -| 10 | 编辑相册 | 同上 (edit mode) | Task 4 | 待执行 | -| 11 | 成员 | lib/pages/album_members_page.dart | Task 4 | 待执行 | -| 12 | 分类 | 新提取 album_categories_page.dart | Task 4 | 待执行 | -| 13 | 拍摄 | lib/pages/capture_page.dart | Task 5 | 待执行 | -| 14 | 上传中心 | lib/pages/queue_tab.dart | Task 5 | 待执行 | -| 15 | 异常任务 | queue (needs attention) | Task 5 | 待执行 | -| 16 | 服务端历史 | lib/pages/server_history_page.dart | Task 5 | 待执行 | -| 17 | 照片网格 | lib/pages/album_photos_page.dart | Task 6 | 待执行 | -| 18 | 管理大图 | lib/pages/album_photo_viewer_page.dart | Task 6 | 待执行 | -| 19 | 分享卡 | lib/pages/share_qr_dialog.dart | Task 6 | 待执行 | -| 20 | 隐藏确认 | viewer (hide confirm) | Task 6 | 待执行 | +目录:`docs/plans/progress/ui03-screenshots/`(按任务指令与基线约定存放;方案 §8.2 原文路径 `docs/designs/ui03-implementation/` 未采用,见偏差表)。数据为 `scripts/demo-seed.mjs` 合成(双语演示相册、12 张 sharp 生成照片、点赞/浏览),无真实账号与私人照片。 -## APP-A 验收矩阵 +| 文件 | 页面 | 说明 | +|---|---|---| +| 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 全部代码合入后): + +| 命令 | 结果 | |---|---| -| APP-A01 至 APP-A18 | 待验 | +| `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`(指向本提交) diff --git a/docs/plans/progress/ui03-screenshots/after/01-login.png b/docs/plans/progress/ui03-screenshots/after/01-login.png new file mode 100644 index 0000000..1ccb47a Binary files /dev/null and b/docs/plans/progress/ui03-screenshots/after/01-login.png differ diff --git a/docs/plans/progress/ui03-screenshots/after/02-settings.png b/docs/plans/progress/ui03-screenshots/after/02-settings.png new file mode 100644 index 0000000..2a8f546 Binary files /dev/null and b/docs/plans/progress/ui03-screenshots/after/02-settings.png differ diff --git a/docs/plans/progress/ui03-screenshots/after/04-language-sheet.png b/docs/plans/progress/ui03-screenshots/after/04-language-sheet.png new file mode 100644 index 0000000..f212bcf Binary files /dev/null and b/docs/plans/progress/ui03-screenshots/after/04-language-sheet.png differ diff --git a/docs/plans/progress/ui03-screenshots/after/05-albums.png b/docs/plans/progress/ui03-screenshots/after/05-albums.png new file mode 100644 index 0000000..9897135 Binary files /dev/null and b/docs/plans/progress/ui03-screenshots/after/05-albums.png differ diff --git a/docs/plans/progress/ui03-screenshots/after/05b-albums-en.png b/docs/plans/progress/ui03-screenshots/after/05b-albums-en.png new file mode 100644 index 0000000..ea896c3 Binary files /dev/null and b/docs/plans/progress/ui03-screenshots/after/05b-albums-en.png differ diff --git a/docs/plans/progress/ui03-screenshots/after/06-album-detail.png b/docs/plans/progress/ui03-screenshots/after/06-album-detail.png new file mode 100644 index 0000000..4146156 Binary files /dev/null and b/docs/plans/progress/ui03-screenshots/after/06-album-detail.png differ diff --git a/docs/plans/progress/ui03-screenshots/after/14-uploads.png b/docs/plans/progress/ui03-screenshots/after/14-uploads.png new file mode 100644 index 0000000..9f0373e Binary files /dev/null and b/docs/plans/progress/ui03-screenshots/after/14-uploads.png differ diff --git a/docs/plans/progress/ui03-screenshots/after/17-photos.png b/docs/plans/progress/ui03-screenshots/after/17-photos.png new file mode 100644 index 0000000..0e86e7f Binary files /dev/null and b/docs/plans/progress/ui03-screenshots/after/17-photos.png differ diff --git a/docs/plans/progress/ui03-screenshots/after/18-viewer.png b/docs/plans/progress/ui03-screenshots/after/18-viewer.png new file mode 100644 index 0000000..2f41ecc Binary files /dev/null and b/docs/plans/progress/ui03-screenshots/after/18-viewer.png differ diff --git a/docs/plans/progress/ui03-screenshots/after/19-share.png b/docs/plans/progress/ui03-screenshots/after/19-share.png new file mode 100644 index 0000000..f7a199d Binary files /dev/null and b/docs/plans/progress/ui03-screenshots/after/19-share.png differ