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

84 lines
8.5 KiB
Markdown
Raw Blame History

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.
# 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 稳定通过。