feat: 30个景点替换为真实照片,添加图片批处理脚本 #12

Merged
zuozhou merged 1 commits from zuozhou into main 2026-07-31 18:17:26 +08:00
Member
No description provided.
zuozhou added 1 commit 2026-07-31 18:16:47 +08:00
feat: 30个景点替换为真实照片,添加图片批处理脚本
AI Code Review / review (pull_request) Successful in 2m58s
d01525fd51
zuozhou merged commit 352a94b148 into main 2026-07-31 18:17:26 +08:00
Owner

🔍 审查结论

本次 PR 把 30 个 POI 的封面图从占位图替换为项目方提供的真实照片,新增了照片注册表、批处理脚本、sharp 依赖,并同步更新了测试。我已对数据一致性、领域校验逻辑、测试断言做了静态核对(环境未装依赖,无法实跑),结论如下。

严重问题(必须修复)

无。核心逻辑正确,主要顾虑集中在体积(见下,建议项但需重点验证),不构成阻塞性代码缺陷。

已核实的关键正确性:

  • 30 个 poiSeeds ID ↔ POI_COVER_PHOTOS_READY 集合 ↔ photos/ 目录 jpg 文件三者完全 1:1,无遗漏、无孤儿文件。因此 createCoverImage 中所有 POI 的 isPlaceholder=falsevalidation.ts:168 不会产生 POC_PLACEHOLDER_ASSETtest/poi-domain.test.ts:31toHaveLength(0) 成立。
  • 新 URL /static/poi/photos/<id>.jpg 命中 validation.ts:24LOCAL_ASSET_PATTERN = /^\/static\//,不会触发 IMAGE_INVALID
  • formatRecommendationLabelselectors.ts:21)已固定返回 推荐指数 N/5,与 test/poi-domain.test.ts:195 更新后的断言一致。
  • sharp 仅在 scripts/process-poi-photos.mjs 中 import,未进入 src/,作为 devDependency 不会被打进运行包。

建议改进

  • src/data/poi/photos.ts:6(高优先级,需验证)— 图片体积与小程序主包限制风险。 photos.ts 自身声明的约束是"文件 ≤ 120 KB",但 30 张照片合计 2.7 MB,其中 5 张超标poi_amap_b0ffmdhve1(144KB)、poi_amap_b02f38nj9k(140KB)、poi_hongqiao_park(129KB)、poi_amap_b0jgbp18uf(128KB)、poi_amap_b0fffwu1l5(125KB)。uni-app 会把 src/static 原样拷贝进产物,对 mp-weixin 主包 2 MB 上限 构成实质风险——单这批照片就已超过 2 MB,叠加其它静态资源与 JS 后,微信开发者工具可能拒绝预览/上传。建议:①用脚本把上述 5 张重新压到 ≤120 KB(当前 JPEG_QUALITY=80800×600,可降到 q72 或 720×540);②或将 photos/ 整体移入分包 / CDN。需用 pnpm build:mp-weixin 后查产物体积确认。

  • package.json:5(低)— Node 引擎声明与 sharp 要求不一致。 engines.node 写的是 >=18,但新增 sharp@0.35.3 及其全部平台二进制要求 node >=20.9.0.nvmrc=20、本机 v20.20.2 满足,但 engines 字段已不准确,Node 18 环境下安装/运行该脚本会失败。建议把 engines.node 提到 >=20.9,或至少 >=20

  • scripts/process-poi-photos.mjs:62 附近的 unlink(低)— 一次性脚本会原地删除原图,建议加注释。 该脚本读/写同一目录并在转换后 unlink 原始中文名文件(不可逆)。当前照片已处理并提交,重跑是安全的 no-op(已改名为 <poiId>.jpg 的文件不在 NAME_TO_POI_ID 中文名映射里,会被 SKIP),但建议在文件顶部注释说明"一次性脚本、会删除原图、重跑为 no-op"。另外脚本内的 NAME_TO_POI_IDscripts/process-poi-photos.mjs:12)与 photos.tsPOI_COVER_PHOTOS_READY 是两份重复清单,后续新增照片需同步两处,注意别漂移。

  • test/poi-domain.test.ts:195(说明,无需动作)— 测试已与已上线行为对齐。 formatRecommendationLabel 在上个提交 09f8ec7 已统一为 推荐指数 N/5,本 PR 把原先断言旧格式(官方推荐指数 / POC 推荐指数(待审核))的用例改为新格式并重命名。这是正确的修正,无问题。

测试与验证建议

  • 运行 pnpm testpoi-domain.test.ts,确认 POC_PLACEHOLDER_ASSET 为 0、推荐指数标签用例通过(已静态核对会通过,但建议实跑确认)。
  • 运行 pnpm build:mp-weixin 并在微信开发者工具中检查主包体积是否 ≤2 MB(本次最大风险点);如超限,按上面第 1 条压缩或分包。
  • pnpm type-checkpnpm lint,确认新增 photos.ts、改动后的 dataset.ts 无类型/lint 报错。
  • 抽查若干 POI 详情页,确认封面图正常加载、无 404(路径大小写、文件名与 ID 完全一致)。
  • 可选:对 5 张超标图重跑压缩脚本至 ≤120 KB 后再次构建比对体积。
## 🔍 审查结论 本次 PR 把 30 个 POI 的封面图从占位图替换为项目方提供的真实照片,新增了照片注册表、批处理脚本、`sharp` 依赖,并同步更新了测试。我已对数据一致性、领域校验逻辑、测试断言做了静态核对(环境未装依赖,无法实跑),结论如下。 ### 严重问题(必须修复) 无。核心逻辑正确,主要顾虑集中在体积(见下,建议项但需重点验证),不构成阻塞性代码缺陷。 已核实的关键正确性: - 30 个 `poiSeeds` ID ↔ `POI_COVER_PHOTOS_READY` 集合 ↔ `photos/` 目录 jpg 文件三者**完全 1:1**,无遗漏、无孤儿文件。因此 `createCoverImage` 中所有 POI 的 `isPlaceholder=false`,`validation.ts:168` 不会产生 `POC_PLACEHOLDER_ASSET`,`test/poi-domain.test.ts:31` 的 `toHaveLength(0)` 成立。 - 新 URL `/static/poi/photos/<id>.jpg` 命中 `validation.ts:24` 的 `LOCAL_ASSET_PATTERN = /^\/static\//`,不会触发 `IMAGE_INVALID`。 - `formatRecommendationLabel`(`selectors.ts:21`)已固定返回 `推荐指数 N/5`,与 `test/poi-domain.test.ts:195` 更新后的断言一致。 - `sharp` 仅在 `scripts/process-poi-photos.mjs` 中 import,未进入 `src/`,作为 devDependency 不会被打进运行包。 ### 建议改进 - **`src/data/poi/photos.ts:6`(高优先级,需验证)— 图片体积与小程序主包限制风险。** `photos.ts` 自身声明的约束是"文件 ≤ 120 KB",但 30 张照片合计 **2.7 MB**,其中 **5 张超标**:`poi_amap_b0ffmdhve1`(144KB)、`poi_amap_b02f38nj9k`(140KB)、`poi_hongqiao_park`(129KB)、`poi_amap_b0jgbp18uf`(128KB)、`poi_amap_b0fffwu1l5`(125KB)。uni-app 会把 `src/static` 原样拷贝进产物,对 **mp-weixin 主包 2 MB 上限** 构成实质风险——单这批照片就已超过 2 MB,叠加其它静态资源与 JS 后,微信开发者工具可能拒绝预览/上传。建议:①用脚本把上述 5 张重新压到 ≤120 KB(当前 `JPEG_QUALITY=80`、`800×600`,可降到 q72 或 720×540);②或将 `photos/` 整体移入分包 / CDN。需用 `pnpm build:mp-weixin` 后查产物体积确认。 - **`package.json:5`(低)— Node 引擎声明与 sharp 要求不一致。** `engines.node` 写的是 `>=18`,但新增 `sharp@0.35.3` 及其全部平台二进制要求 `node >=20.9.0`。`.nvmrc=20`、本机 v20.20.2 满足,但 engines 字段已不准确,Node 18 环境下安装/运行该脚本会失败。建议把 `engines.node` 提到 `>=20.9`,或至少 `>=20`。 - **`scripts/process-poi-photos.mjs:62` 附近的 `unlink`(低)— 一次性脚本会原地删除原图,建议加注释。** 该脚本读/写同一目录并在转换后 `unlink` 原始中文名文件(不可逆)。当前照片已处理并提交,重跑是安全的 no-op(已改名为 `<poiId>.jpg` 的文件不在 `NAME_TO_POI_ID` 中文名映射里,会被 SKIP),但建议在文件顶部注释说明"一次性脚本、会删除原图、重跑为 no-op"。另外脚本内的 `NAME_TO_POI_ID`(`scripts/process-poi-photos.mjs:12`)与 `photos.ts` 的 `POI_COVER_PHOTOS_READY` 是两份重复清单,后续新增照片需同步两处,注意别漂移。 - **`test/poi-domain.test.ts:195`(说明,无需动作)— 测试已与已上线行为对齐。** `formatRecommendationLabel` 在上个提交 `09f8ec7` 已统一为 `推荐指数 N/5`,本 PR 把原先断言旧格式(`官方推荐指数` / `POC 推荐指数(待审核)`)的用例改为新格式并重命名。这是正确的修正,无问题。 ### 测试与验证建议 - 运行 `pnpm test` 跑 `poi-domain.test.ts`,确认 `POC_PLACEHOLDER_ASSET` 为 0、推荐指数标签用例通过(已静态核对会通过,但建议实跑确认)。 - 运行 `pnpm build:mp-weixin` 并在微信开发者工具中检查主包体积是否 ≤2 MB(本次最大风险点);如超限,按上面第 1 条压缩或分包。 - `pnpm type-check` 与 `pnpm lint`,确认新增 `photos.ts`、改动后的 `dataset.ts` 无类型/lint 报错。 - 抽查若干 POI 详情页,确认封面图正常加载、无 404(路径大小写、文件名与 ID 完全一致)。 - 可选:对 5 张超标图重跑压缩脚本至 ≤120 KB 后再次构建比对体积。
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: team/gmTouringMiniApp#12