Done: Merge zhouruizhe into 'main' #9

Merged
zhouruizhe merged 5 commits from zhouruizhe into main 2026-07-31 13:10:17 +08:00
Owner
No description provided.
admin added 5 commits 2026-07-31 12:59:36 +08:00
Author
Owner

我已经完整阅读了整个 diff(4136 行)、CLAUDE.md、构建/测试技能,并针对真实代码库验证了关键行为(例如 getPoiById 仅返回已发布的 POI,确认了类型兼容性)。以下是我的审查结论。

🔍 审查结论

本次 PR 主要新增「到点打卡」能力(domain/service/storage/页面/校验脚本),并把行程规划固定为本地 POC、移除远程 AI 调用入口,同时增强地图路线展示。整体质量较高:领域逻辑纯函数化、存储做了 schema 版本化 + v1→v2 迁移 + 严格白名单校验,隐私模型(精确坐标不落盘、定位仅用户触发)落实到位,并配有 311 行打卡测试与定位/规划测试。未发现必须修复的阻断性缺陷。 以下为可选改进与验证建议。

严重问题(必须修复)

  • 无。核心路径(距离/精度判定、徽章阈值、存储迁移与失败闭合、定位超时与竞态、隐私授权链)均有对应测试覆盖且逻辑自洽。

建议改进

  • src/pages/planner/index.vue:57-64locationAvailable 新鲜度):locationFreshnessCheckedAt 只在 onShow / submit / 定位成功时刷新,locationAvailable = checkedAt - capturedAt <= 5min。用户在页面停留不动时,checkedAtcapturedAt 都不再更新,差值恒为 ~0,导致 UI 上「可用」状态不会随时间变 stale。submit() 里重新锚定 Date.now() 才是真正生效的闸门——功能上没有漏洞,但页面态/按钮文案可能与提交时的实际判定不一致(点了「可用」却弹「请先获取位置」)。建议要么在显示侧也基于实时 Date.now() 判定,要么明确注释这是「按交互时刻快照」的刻意设计。
  • src/pages/planner/index.vuesrc/domain/travel/local-planner.tsselectQuickPois 移除空兜底):当 quick 模式下连第一站都无法塞进时长预算时(例如用户当前定位距所有光明区 POI 很远 + 步行),现在会抛 没有可用于规划的地点(见新增测试 rejects a quick plan when even the first stop cannot fit the budget)。这是更正确的「不产出不可达路线」的行为,但生产中用户身处光明区外时会直接看到该报错。建议在 submit 的 catch 里把这类规划器错误转成更友好的中文提示(如「当前位置距离点位过远,请靠近光明区或在设置中改用自选点位规划」)。
  • src/manifest.json:65projectname【prod】 改为 【dev】):src/manifest.jsonsrc/pages.json 是由 manifest.config.ts / pages.config.ts 生成的产物(README 明确要求不要手改),其余改动都能对上 config,唯独 【prod】→【dev】 前缀来自构建模式而非 config。确认这是有意保留(开发态标识)而非误提交某次本地 dev 构建产物即可;若应跟随模式生成,建议从已提交文件中还原。
  • src/pages/check-in/records.vue:73-90onShowloadAvailablePois() 未包裹 try/catch):getCheckInProfile() 已有异常处理并落到 storageError,但 loadAvailablePois()(调用 getCheckInTasks() + getPoiRepository())未保护。虽然都是确定性数据读取、现实中不会抛,但与下方风格不一致,建议同样 try/catch 或合并到同一加载流程里,避免读取异常变成未处理拒绝。
  • server/app/schemas.py / server/app/knowledge.py:删除了 duration/adults/children/child_ages/budget_level/extra_requirements 字段及 family_friendly 加分。server/ 本期为预留、不接入 createPlan,改动本身与客户端 remote.ts 现在发送的字段子集一致(前向兼容良好)。仅提醒:若 DurationBudgetLevel 等类型/枚举在 server 侧已无引用,可一并清理以免后续误用;这不影响本期验收。

测试与验证建议

  • 运行 corepack pnpm type-checkcorepack pnpm lintcorepack pnpm test,重点确认新增 test/check-in.test.tstest/current-location.test.tstest/map-store.test.tstest/travel-assistant.test.ts 中新增的规划打包用例全部通过;再用 corepack pnpm build:mp-weixin + corepack pnpm verify:mp-weixin 确认校验脚本对「打卡页隐私授权链、lazyCodeLoading、详情页无条件渲染打卡入口、scope.userLocation 含『打卡』」的新增断言能通过。
  • 手动验证(iOS 真机为主,对应 docs 验收清单 12–14):① 详情页打卡入口对所有已发布 POI 出现、对下线 POI 不出现;② 打卡仅在点按钮时请求一次 GCJ-02 定位,分别验证 200 米内成功、范围外(too_far)、精度不足(low_accuracy)、边界不确定(uncertain)、重复打卡(already_checked_in)五种分支文案;③ 首次打卡 +10 积分并解锁 explorer,第 2/3 次依次解锁 traveller/check_in_master,重启后仍在;④ 「清除本机打卡数据」只删 guangming:check-in-profile,不删路线/偏好;⑤ 扫描本机存储确认不含经纬度/精度/轨迹。
  • 隐私授权链:在未同意《用户隐私保护指引》的微信版本上验证 requirePrivacyAuthorize 失败 → 显示「同意并继续打卡」按钮 → 同意后二次进入 requestCheckIn 能成功取定位;并验证拒绝/超时/权限被拒三类错误的提示分流是否正确。
  • 路线展示:从行程页「在全域地图查看完整路线」跳到地图,确认 polyline、序号 callout、「完整路线 · N 站」浮层正常;切换分类或「重置」后路线与浮层应一并消失(hidePlannedRoute + activePlan=null)。冷启动后再次打开地图时,因起点坐标仅存内存(getSessionPlanningOrigin),起点 marker/折线起点会缺失——确认这是预期行为(文案已写「起点坐标未保留」)。
我已经完整阅读了整个 diff(4136 行)、CLAUDE.md、构建/测试技能,并针对真实代码库验证了关键行为(例如 `getPoiById` 仅返回已发布的 POI,确认了类型兼容性)。以下是我的审查结论。 ## 🔍 审查结论 本次 PR 主要新增「到点打卡」能力(domain/service/storage/页面/校验脚本),并把行程规划固定为本地 POC、移除远程 AI 调用入口,同时增强地图路线展示。整体质量较高:领域逻辑纯函数化、存储做了 schema 版本化 + v1→v2 迁移 + 严格白名单校验,隐私模型(精确坐标不落盘、定位仅用户触发)落实到位,并配有 311 行打卡测试与定位/规划测试。**未发现必须修复的阻断性缺陷。** 以下为可选改进与验证建议。 ### 严重问题(必须修复) - 无。核心路径(距离/精度判定、徽章阈值、存储迁移与失败闭合、定位超时与竞态、隐私授权链)均有对应测试覆盖且逻辑自洽。 ### 建议改进 - `src/pages/planner/index.vue:57-64`(`locationAvailable` 新鲜度):`locationFreshnessCheckedAt` 只在 `onShow` / `submit` / 定位成功时刷新,`locationAvailable = checkedAt - capturedAt <= 5min`。用户在页面停留不动时,`checkedAt` 与 `capturedAt` 都不再更新,差值恒为 ~0,导致 UI 上「可用」状态不会随时间变 stale。`submit()` 里重新锚定 `Date.now()` 才是真正生效的闸门——功能上没有漏洞,但页面态/按钮文案可能与提交时的实际判定不一致(点了「可用」却弹「请先获取位置」)。建议要么在显示侧也基于实时 `Date.now()` 判定,要么明确注释这是「按交互时刻快照」的刻意设计。 - `src/pages/planner/index.vue` 与 `src/domain/travel/local-planner.ts`(`selectQuickPois` 移除空兜底):当 quick 模式下连第一站都无法塞进时长预算时(例如用户当前定位距所有光明区 POI 很远 + 步行),现在会抛 `没有可用于规划的地点`(见新增测试 `rejects a quick plan when even the first stop cannot fit the budget`)。这是更正确的「不产出不可达路线」的行为,但生产中用户身处光明区外时会直接看到该报错。建议在 `submit` 的 catch 里把这类规划器错误转成更友好的中文提示(如「当前位置距离点位过远,请靠近光明区或在设置中改用自选点位规划」)。 - `src/manifest.json:65`(`projectname` 由 `【prod】` 改为 `【dev】`):`src/manifest.json` 与 `src/pages.json` 是由 `manifest.config.ts` / `pages.config.ts` 生成的产物(README 明确要求不要手改),其余改动都能对上 config,唯独 `【prod】→【dev】` 前缀来自构建模式而非 config。确认这是有意保留(开发态标识)而非误提交某次本地 `dev` 构建产物即可;若应跟随模式生成,建议从已提交文件中还原。 - `src/pages/check-in/records.vue:73-90`(`onShow` 中 `loadAvailablePois()` 未包裹 try/catch):`getCheckInProfile()` 已有异常处理并落到 `storageError`,但 `loadAvailablePois()`(调用 `getCheckInTasks()` + `getPoiRepository()`)未保护。虽然都是确定性数据读取、现实中不会抛,但与下方风格不一致,建议同样 try/catch 或合并到同一加载流程里,避免读取异常变成未处理拒绝。 - `server/app/schemas.py` / `server/app/knowledge.py`:删除了 `duration`/`adults`/`children`/`child_ages`/`budget_level`/`extra_requirements` 字段及 `family_friendly` 加分。`server/` 本期为预留、不接入 `createPlan`,改动本身与客户端 `remote.ts` 现在发送的字段子集一致(前向兼容良好)。仅提醒:若 `Duration`、`BudgetLevel` 等类型/枚举在 server 侧已无引用,可一并清理以免后续误用;这不影响本期验收。 ### 测试与验证建议 - 运行 `corepack pnpm type-check`、`corepack pnpm lint`、`corepack pnpm test`,重点确认新增 `test/check-in.test.ts`、`test/current-location.test.ts`、`test/map-store.test.ts` 及 `test/travel-assistant.test.ts` 中新增的规划打包用例全部通过;再用 `corepack pnpm build:mp-weixin` + `corepack pnpm verify:mp-weixin` 确认校验脚本对「打卡页隐私授权链、`lazyCodeLoading`、详情页无条件渲染打卡入口、`scope.userLocation` 含『打卡』」的新增断言能通过。 - 手动验证(iOS 真机为主,对应 docs 验收清单 12–14):① 详情页打卡入口对所有已发布 POI 出现、对下线 POI 不出现;② 打卡仅在点按钮时请求一次 GCJ-02 定位,分别验证 200 米内成功、范围外(`too_far`)、精度不足(`low_accuracy`)、边界不确定(`uncertain`)、重复打卡(`already_checked_in`)五种分支文案;③ 首次打卡 +10 积分并解锁 `explorer`,第 2/3 次依次解锁 `traveller`/`check_in_master`,重启后仍在;④ 「清除本机打卡数据」只删 `guangming:check-in-profile`,不删路线/偏好;⑤ 扫描本机存储确认不含经纬度/精度/轨迹。 - 隐私授权链:在未同意《用户隐私保护指引》的微信版本上验证 `requirePrivacyAuthorize` 失败 → 显示「同意并继续打卡」按钮 → 同意后二次进入 `requestCheckIn` 能成功取定位;并验证拒绝/超时/权限被拒三类错误的提示分流是否正确。 - 路线展示:从行程页「在全域地图查看完整路线」跳到地图,确认 polyline、序号 callout、「完整路线 · N 站」浮层正常;切换分类或「重置」后路线与浮层应一并消失(`hidePlannedRoute` + `activePlan=null`)。冷启动后再次打开地图时,因起点坐标仅存内存(`getSessionPlanningOrigin`),起点 marker/折线起点会缺失——确认这是预期行为(文案已写「起点坐标未保留」)。
zhouruizhe changed title from WIP: Merge zhouruizhe into 'main' to Done: Merge zhouruizhe into 'main' 2026-07-31 13:10:13 +08:00
zhouruizhe merged commit 12380cd8cf into main 2026-07-31 13:10:17 +08:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: team/gmTouringMiniApp#9