Files
photo-live/docs/plans/progress/P1b-验收记录.md
T
浅念 b5145d6860 docs: p1b acceptance record
- P1b-验收记录.md: A08 (viewer.spec + journey), A12 partial (viewer
  i18n switch/fallback + admin template i18n; data-lang is P4b), R09
  (assets.e2e + admin upload + viewer render + journey banner), P1a
  final-review 4 items registered (47fb81a, absent from P1a record),
  9-row deviation table (ports 5175/5176 + cms conflict disclosure,
  staff-wide account lookup, art-design-pro v3.0.2 pin + lint ignore,
  no thumbnails in AdminPhoto, session-scoped banner preview,
  errorCode/pending_upload omissions, useCursorList, esbuild
  onlyBuiltDependencies), P2 handover, per-package test stats
- master roadmap: P1 fully complete (P1a + P1b), tag p1; G1 formally
  registered as skipped (no OSS credentials provided)
- P1b plan: all task checkboxes marked with completion notes

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-18 12:56:59 +08:00

8.5 KiB
Raw Blame History

P1b 验收记录

  • 阶段:P1b 观众页与管理后台(计划 docs/plans/2026-09-18-P1b-观众页与管理后台.md,Task 1–12)
  • 日期:2026-09-18
  • 基线 commits:62382ec..HEAD(P1b 计划提交之后至跨端冒烟 40f8f37,共 12 个实施提交,不含本记录提交)
  • 执行模式:子代理驱动 + 双审(每任务先写失败测试→实现→通过→提交;跨任务由子代理接力,主代理与复核代理双重审查)
  • 回归门:pnpm lint && pnpm typecheck && pnpm test && pnpm e2e && pnpm build 全绿(数字见文末统计表;viewer/admin 的 vitest + playwright 任务全部入列)
  • 基础设施:photo-live MySQL/Redis/MinIO compose(infra/,端口绑定 127.0.0.1),前端 e2e 打真实 API + 真实 MinIO 对象(种子走 Prisma/storage 直种或真实 UI/API 链路)

A08 大图操作(基础级,Web 端)

  • 证据:apps/viewer/e2e/viewer.spec.ts 4 用例全绿——点击开大图(browse 经签名 URL 取回真实字节,naturalWidth > 0)、左右切换保持列表序列且 URL 同步 replace(深链可分享)、滚轮缩放受控 CSS transform + 双击复位、关闭精确回到原滚动位置、深链直达目标照片(背后列表构成完整序列)、404/已下线照片深链本地化提示 + 可用返回链接、越过末页边界自动拉次页扩展序列(31/32)。
  • 单测佐证:apps/viewer/src/__tests__/(lightbox / viewer-route / feed 等,vitest 65 用例的一部分——切换序列、URL 语义、滚动回位、缩放边界)。
  • 跨端佐证:apps/viewer/e2e/journey.spec.ts(Task 11)开图→缩放→关闭→深链→被隐照片深链 404 提示全链走真实数据。
  • App 端滑动手势/性能级验收随 P3(A08 移动级)。

A12 多语言(部分:viewer + admin)

  • viewer:apps/viewer/e2e/album.spec.ts——语言切换按钮 zh↔en 内容随切(标题/描述/场地/时间格式/空态/页面 title)、en UI + zh-only 相册内容回退 zh(服务端 resolvedLocale=zh-CN,UI chrome 保持用户所选语言)、chips/错误/空态文案双语;词条完整性有 vitest(i18n.spec.ts 等)。瀑布流/大图/深链提示文案随 locale 全覆盖(feed.spec / viewer.spec 断言中文文案)。
  • admin:art-design-pro 模板 i18n(zh/en)沿用,业务词条(albumsManage./topBar./common.* 等)入 zh/en 语言包;登录/相册/照片管理 e2e 的文案断言均走真实渲染(占位符、按钮、状态标签、确认框)。
  • 组件 data-lang 语言配置属 P4b(embed-loader);A12 全端语言验收(四端切换/回退/漏译)随 P4b T15。

R09 宣传图(顶部 banner)

  • API 级:services/api/test/assets.e2e-spec.ts 14 用例——banner presign init→PUT→complete 上传链(复用照片上传机制)、生效态/替换语义、locale 资产解析、公开端点签名 URL 下发。
  • admin UI:apps/admin/e2e/albums.spec.ts——真实 jpeg 走 file chooser → init/PUT/complete → 状态与预览。
  • viewer UI:apps/viewer/e2e/album.spec.ts——banner 签名 URL 取回真实字节渲染(naturalWidth > 0);无 banner 相册不渲染图。
  • 跨端闭环:journey.spec.ts——admin UI 上传的 banner 在 viewer 活动页真实渲染。

P1a 终审修缮 4 项落实登记(Task 1,commit 47fb81a)

P1a 验收记录(8a09001)偏差表未含下列各项——终审发生于该记录落档之后,按计划 Task 1 在此补登:

  1. 框架级 404 错误码:contracts 新增 NOT_FOUND;AllExceptionsFilter 未知路由默认映射由 ALBUM_NOT_FOUND 改为 NOT_FOUND(业务 404 仍走显式 ApiException 专用码,防枚举语义不变)。
  2. configureApp 抽取:prefix/CORS/x-powered-by 统一配置由 main-cn 与 e2e 共享;禁用 x-powered-by 并有 e2e 断言。
  3. 分页参数抽取:parseCursor/parseLimit(含页大小边界)从 albums.controller 移入 shared/pagination,members/uploads/public 一并复用。
  4. compose 端口回环绑定:MySQL/Redis/MinIO 发布端口绑定 127.0.0.1(不暴露局域网),.env.example 端点同步。
  • 随附 e2e:unknown-route 404 NOT_FOUND + x-powered-by 缺席两例(api e2e 120 → 122)。

偏差与发现登记

# 事项 处理/结论
1 dev 端口 5175/5176 用户裁决 2026-09-18:viewer 5175 / admin 5176(原计划 5173/5174)。事由:开发机 5173 已被用户另一 cms 项目占用,首次起 viewer dev 时发生端口冲突;裁决固定 5175/5176 并同步 CORS_ORIGINS(commit 04b5641,事故在此披露)
2 账号查询访问策略 用户裁决 2026-09-18:契约原描述 admin/owner 可查,实作放宽为全体已认证 staff(邀请发起方不限创建者;泄露面仅激活账号的最小展示字段 id/account/displayName,接收方为已认证内部人员)
3 Art Design Pro v3.0.2 锁定 模板来源仓库/tag/commit 与裁剪清单登记于 apps/admin/SOURCE.md + package.json // 字段;模板自带 eslint9 flat 配置与根配置规则集不同——根 ESLint ignore apps/admin/**(偏差注册,不强改模板);模板版本锁定,升级需重新评估
4 AdminPhoto 无缩略图 管理照片列表条目不含缩略图(不为列表逐条签 URL,控制签名量/带宽);P4a 后台完备时再评估
5 banner 预览会话级 admin banner 上传成功后的预览图走当次会话内存 URL,不落库回显(刷新即失,生效事实以 album_assets 行为准);e2e 在同一页面会话内断言预览
6 errorCode 不在 PhotoRecord 管理列表契约 PhotoRecord 未含 errorCode(处理失败详情不进列表;失败原因排查走单图/日志),P4a 完善
7 pending_upload 不在管理列表 listAlbumPhotos 不返回 pending_upload(未 complete 的会话草稿不算已提交照片),管理页只列已提交域
8 useCursorList 替代 useTable admin 列表页自建游标分页 composable(对齐后端 keyset 契约),不用模板 useTable 的偏移分页
9 esbuild onlyBuiltDependencies pnpm 10 默认拦截依赖构建脚本,根 package.json 白名单放行 esbuild(Vite 平台二进制下载),登记偏差

未尽事项 / 移交

  • P2:outbox 已落库仍无消费者(按 eventId 去重、entityVersion 单调消费);公开端点无限速;观众页最新/热门排序(契约与 UI 随 P2 扩展,当前仅 publishedAt 序);浏览统计(窗口去重)。
  • P3:UI 上传链路(App/后台界面上传;P1b staffB 上传走 API——journey 即按此验收)。
  • P4a:AdminPhoto 缩略图、批量隐藏、账号治理、后台语言切换完整验收;banner 预览持久回显。
  • P4b:传播组件 data-lang(A12 全端验收)。
  • G1:真实 OSS 凭证冒烟——凭证未提供,按总纲 P1 出口约定「无凭证显式跳过并登记」正式登记为跳过(本地 MinIO 已覆盖 presign/head/禁止覆盖/受控复制全语义)。

测试统计汇总(2026-09-18 回归门实测)

包 单测 suites(files)/tests e2e suites(tests)
@photo/contracts 2 / 8 –
@photo/db-cn –(schema 校验随 migrate/生成流程) –
@photo/storage 1 / 6(真实 MinIO 集成) –
@photo/api-cn 6 / 46 12 / 148(auth 14、albums 20、members-categories 15、uploads 20、photos 14、public 17、assets 14、photos-admin 6、users-lookup 6、health 6、db.semantics 6、full-chain 10)
@photo/worker 1 / 8 1 / 7(publish)
@photo/viewer vitest 10 / 65 playwright 5 个 spec / 14 用例(album 5、feed 3、viewer 4、smoke 1、journey 1)
@photo/admin vitest 4 / 15 playwright 2 个 spec / 7 用例(login 5、albums 2)
合计 24 / 148 20 / 176(jest 13 suites / 155 用例 + playwright 7 个 spec / 21 用例)
  • 附加门:lint 7/7 任务、typecheck 10/10 任务、build 7/7 任务全绿(viewer 产物 166 KB js / admin 产物含 element-plus 按需分包)。
  • 总测试数(单测 + e2e):324。
  • 跨端联调(Task 11):viewer playwright 配置以第三个 webServer 拉起 admin dev(5176,复用已在跑实例),journey.spec.ts 单剧本贯通 admin UI → staffB API → worker 发布事务 → viewer UI → admin 隐藏 → viewer 收敛 → 空态,22–35s 稳定通过。