# 06 · 开发计划 按「先跑通核心闭环,再做沉淀与增长」的顺序。每阶段可独立验收。 --- ## ✅ 进度总览(截至 2026-06-25) V1 开发主体(阶段 0 → 4)全部完成并部署。 **环境**:`cloud1-d0gmb6bjde8af3266` · AppId `wx6cfaffb865048e83` · 部署方式 CloudBase CLI(`tcb`,配置见根目录 `cloudbaserc.json`)。 **已部署云函数(7)**:`login`、`dogManage`、`walkSave`、`walkManual`、`getDogDetail`、`getHistory`、`sendReminder`(+ 每日 19:00 定时触发器 `dailyReminder`)。 **数据库集合(4,已建)**:`users`、`dogs`、`walks`、`dog_achievements`。 **页面(9,全部真实功能)**:login / dog-edit / home / walking / summary / dog-detail / history / records / achievements;组件:custom-tab-bar、manual-add-sheet。 | 阶段 | 状态 | |------|------| | 0 工程搭建 | ✅ 完成 | | 1 账号与建档闭环 | ✅ 完成 | | 2 遛狗核心闭环 | ✅ 完成 | | 2.5 定位与狗步 | ✅ 完成 | | 3 沉淀与激励 | ✅ 完成 | | 4 增长 | ✅ 完成(订阅消息待填模板 ID) | | 5 Pending | ⏸ 未启动(不在 V1) | --- ## 🐛 逻辑漏洞修正(2026-06-25 代码审查) 对照 [05-业务规则](./05-业务规则.md) 审查现网代码,发现并修正以下逻辑漏洞: ### 1. 补记无法维持连续打卡(违反 R8 / R10)⭐ - **问题**:`walkSave`/`walkManual` 的连续天数只依据 `lastWalkDate + currentStreak` 做增量推算。当用户「先实时遛了今天 → 再补记昨天」时,补记日期早于 `lastWalkDate`,算法走 `diff<=0` 分支原样返回,**连续天数不会向前补全**,直接违背 R8「补记可维持连续打卡不断签」。 - **修正**:新增 `computeStreak(openid, dogId)`,落库后**从该狗全部 `walkDate` 历史重算**连续天数(`Set` 去重同日多次、以最新日期为锚向前数连续日、遇断签停止)。补记以任意顺序插入都能正确续签/断签。`walkSave` 与 `walkManual` 均改用此函数,`lastWalkDate` 也取自重算结果。 ### 2. 「早起鸟」成就永不可解锁(违反 R11) - **问题**:`utils/achievements.js` 定义了 6 个成就且 `getDogDetail` 也按 6 统计,但「早起鸟」(早遛 10 次) **在任何云函数中都没有解锁逻辑、也无计数字段**,导致用户永远停在 5/6,成就墙存在一个不可达成项。 - **修正**:`walkSave`(仅实时遛狗,场景类不计补记)按开始时间本地小时 `<7` 累加 `stats.earlyWalks`,达 10 次解锁;`STAT_ACHIEVEMENTS` 增加 `early_bird` 判定。前端 `achievements.js` 进度与「还差 X 次」文案改为基于 `earlyWalks` 真实计算。 ### 3. 成果卡选填字段「先分享后补填」会丢失(违反 R7) - **问题**:`summary.js` 的 `ensureAttached` 在字段为空时即把 `_attached` 置 `true`。若用户先点「分享」(此时未填)再补填天气/备注/照片后点「完成」,回写被提前锁定跳过,**选填字段与「雨天战士」成就一并丢失**。 - **修正**:空内容时仅 `return` 不置位,只有真正成功回写后才锁定 `_attached`,保证后续补填仍能写入。 > 数据兼容:旧狗档无 `earlyWalks` 字段,云函数与前端均以 `|| 0` 兜底;连续天数在下一次遛狗/补记时按历史自动重算修正,无需迁移。 --- **待你手动处理**: 1. 订阅消息模板 ID — 公众平台创建后填入 `utils/config.js` 与 `sendReminder/index.js`,重新部署。 2. (可选)数据库索引与权限收紧 — 见 [02-数据模型](./02-数据模型.md) §5/§6;当前客户端不直读库,默认管理端权限不影响功能。 3. (可选)存量旧狗数据迁移 — 阶段1建的狗无 `sizeLevel/stride`,进编辑页重存即可补齐(walkSave 已兜底 0.35m 不报错)。 --- ## 阶段 0 · 工程搭建(地基) **目标**:能在微信开发者工具里跑起空壳,云开发环境就绪。 - [x] 创建小程序 + 开通云开发,建环境(实际 env `cloud1-d0gmb6bjde8af3266`)。 - [x] 初始化目录结构(见 [01-架构设计](./01-架构设计.md))。 - [x] `app.js` 初始化 `wx.cloud`,`app.wxss` 落地设计 token。 - [x] 纯手写基础 UI,不引第三方库(全局 `.btn/.card` 等 + 组件 `custom-tab-bar`/`manual-add-sheet`;`dog-card`/`stat-grid` 等暂内联在页面,未抽独立组件)。 - [x] 建 4 个数据库集合(CLI 建好)。 ⚠️ 索引未建、权限为默认管理端(客户端不直读,暂不影响)—— 见 [02-数据模型](./02-数据模型.md) §5/§6。 - [x] `utils/cloud.js` 封装 callFunction(统一错误/loading)。 **验收**:✅ 工程可在开发者工具导入运行;云函数经 `tcb fn deploy` 部署可调通。 --- ## 阶段 1 · 账号与建档闭环 **对应屏**:0a 登录 → 0b 建档 → 1 我的 - [x] `login` 云函数 + 登录页(R1 分流)。 - [x] `dogManage` 云函数(create/update/list,R2)。 - [x] 建档/编辑页(复用表单,犬种 picker,chip 单选)。 - [x] 首页:用户卡 + 狗狗卡 + 功能入口列表。 - [x] 自定义 tabBar(中央状态化 FAB:idle/walking/paused 三态变色)。 **验收**:✅ 新用户登录→建档→进首页看到自己的狗;编辑能预填回写。 --- ## 阶段 2 · 遛狗核心闭环(V1 重点)⭐ **对应屏**:2/2b 遛狗中 → 3 成果卡 → 4 狗狗主页 - [x] 遛狗会话状态机(walking/paused,时间戳计时,后台恢复,R5)。 - [x] 多狗选择弹层(R4)。 - [x] 便便打卡、暂停/继续、结束二次确认(R5)。 - [x] 定位增强 + 降级处理(R6):授权时累计 GPS 距离并换算狗步;未授权时距离/狗步存 null 且界面隐藏。 - 狗步模型按 R3 落地:体型档位→步幅→体重±15%校准(`utils/dogStep.js` + `dogManage`);未知犬种建档强制选体型档位。 - `walkSave` 改 `action:'finish'`、收 `distanceMeters`、按每只狗 stride 算狗步;walk 增 `source` 字段。 - [x] `walkSave` 云函数:落库 + stats 更新 + 连续天数(R10)+ 成就判定(R11);含 `finish/attach` 动作回写选填字段 + 雨天战士。 - [x] 成果卡页(全选填 R7,新成就提示,三宫格统计)。 - [x] `getDogDetail` + 狗狗主页(累计 R9、成就墙、近期记录)。 **验收**:完整走通「点遛狗→计时/距离/狗步(定位授权时)→结束→成果卡→记录沉淀进狗狗主页」;未授权定位时只保留时长,连续天数与统计正确累加。 --- ## 阶段 3 · 沉淀与激励 **对应屏**:5 历史 → 6/6b 记录 → 7 成就 - [x] 遛狗历史页(按周分组,补记标识)。 - [x] `walkManual` 补记云函数 + 补记弹层组件(R8)。 - [x] 新增 `getHistory` 云函数(跨全部狗狗的历史列表,附狗名)。 - [x] 记录 Tab(成就概览 + 历史;空状态 6b 引导)。 - [x] 完整成就页(已解锁/未解锁含进度,两入口共用)。 - [x] 成就定义表 `utils/achievements.js` 全量落地。 **验收**:补记不计排行但维持连续;成就解锁与进度展示正确;新用户空状态引导生效。 --- ## 阶段 4 · 增长 - [x] 成果卡 Canvas 生成分享图(`canvas type=2d` → `showShareImageMenu`)+ `onShareAppMessage/onShareTimeline` 转发。 - [x] 头像/照片云存储上传与压缩(`utils/media.js`:chooseMedia 压缩 → cloud.uploadFile);头像在首页/狗狗主页/成果卡显示。 - [x] 连续打卡订阅消息:`sendReminder` 云函数 + 每日 19:00 定时触发器;成果卡「完成」时 `requestSubscribeMessage`。 - ⚠️ 需手动:公众平台创建订阅消息模板 → 把模板 ID 填入 `miniprogram/utils/config.js` 与 `cloudfunctions/sendReminder/index.js`,并按模板字段改 `data`。未配置时该功能静默跳过。 **验收**:成果卡能生成带数据的分享图并分享;头像/照片可上传并展示;模板配置后定时提醒可发。 --- ## 阶段 5 · 后置 / Pending(不在 V1) - 地图轨迹回放、GPS 去噪与更精细的轨迹纠偏。 - 广场、附近、排行榜、信息站。 - 排行榜需新增定时聚合云函数,按 `countsForRanking=true` 统计。 --- ## 里程碑建议 | 里程碑 | 含阶段 | 可交付 | 状态 | |--------|--------|--------|------| | **M1 可建档** | 0 + 1 | 登录建档跑通 | ✅ 达成 | | **M2 可遛狗** ⭐ | 2 + 2.5 | 核心闭环可用(含 GPS/狗步),可内测 | ✅ 达成 | | **M3 可沉淀** | 3 | 完整 V1 体验 | ✅ 达成 | | **M4 可传播** | 4 | 上线 + 拉新 | ✅ 达成(订阅消息待填模板 ID) | > 下一步建议:真机全流程联调 → 处理上方「待你手动」三项 → 提审上线。阶段 5(排行榜/广场等)需先做产品设计再排期。