b5145d6860
- 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>
8.5 KiB
8.5 KiB
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.ts4 用例全绿——点击开大图(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.ts14 用例——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 在此补登:
- 框架级 404 错误码:contracts 新增
NOT_FOUND;AllExceptionsFilter 未知路由默认映射由ALBUM_NOT_FOUND改为NOT_FOUND(业务 404 仍走显式 ApiException 专用码,防枚举语义不变)。 - configureApp 抽取:prefix/CORS/x-powered-by 统一配置由 main-cn 与 e2e 共享;禁用
x-powered-by并有 e2e 断言。 - 分页参数抽取:parseCursor/parseLimit(含页大小边界)从 albums.controller 移入
shared/pagination,members/uploads/public 一并复用。 - 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 稳定通过。