早冥读写跑 - 习惯打卡

项目信息

  • AppID:wx306f19ac1b77f5fb
  • 云开发环境:cloudbase-d2gxgalntfac36de2
  • 代码路径~/codes/growth-five-habits/
  • 仓库:https://gitee.com/xdx54321/growth-five-habits
  • 文档:PRD / DESIGN.md / LESSONS.md 均在项目根目录

开发日志

2026-05-11 Day 4 — 设置页修复 + 分享图小程序码 + 提交审核

完成事项

  • [x] 修复设置页 stepper delta 类型错误(字符串拼接导致跳档)
  • [x] 修复设置页 indexOf 精确匹配导致非标值只有2档,改用最近匹配
  • [x] 修复已在边界时仍触发 toast 提示
  • [x] 设置页调整档位/开关/起床时间后自动同步云端
  • [x] 分享图添加实际小程序码(替换占位文字,带圆角裁剪)
  • [x] 删除 1.8MB 残留 PNG,解决包体积超 2MB 限制
  • [x] 移除 tests 目录(含 import.meta,小程序不支持)
  • [x] 代码推送 Gitee:fe7cc2a
  • [x] 提交审核(2026-05-11),等审核通过

待完成

  • 等审核结果
  • 分享图 UI 可继续打磨

2026-05-10 Day 3 — Bug 修复 + 架构优化

完成事项

  • [x] 修复隐私页渲染异常(privacy.json 缺少 usingComponents 导致纯文本显示)
  • [x] 隐私同意从独立页面改为引导页最后一步集成(底部小字 + 链接)
  • [x] 数据库从 3 集合合并为 1 集合 users(upsert 语义,净减 107 行代码)
  • [x] 云函数简化:sync action updateCheckin→checkin, updateSettings→save
  • [x] 去掉 waitForCloudReady 轮询等待逻辑
  • [x] 关于页 + 引导页增加隐私政策链接入口
  • [x] 引导页 navigator 在 swiper-item 内失效,改用 bindtap + navigateTo
  • [x] 代码推送 Gitee:363aea5

待完成

  • [ ] ~~重新部署云函数(login + sync 已改)~~ ✅
  • [ ] ~~清除云数据库 user_settings 和 daily_records 集合(不再需要)~~ ✅
  • [ ] ~~提交审核~~ ✅ 已提交(2026-05-10),等备案通过
  • 云函数部署完成,新用户引导流程正常
  • 数据写入 users 集合正常
  • 清缓存后引导页 → 首页流程跑通

踩坑补充: 13. privacy.json 必须有 "usingComponents": {},否则页面渲染异常(纯文本) 14. <navigator><swiper-item> 内被 swiper 吞掉点击事件,用 bindtap + navigateTo 代替 15. 单用户小程序不需要拆集合,1 个 users 集合 + doc().set() upsert 足够


2026-05-08 Day 2(续)— 产品设计深度打磨

完成事项

  • [x] 阅读单位从「页」改为「分钟」,阶梯 [10,15,20,30,45,60]
  • [x] 写作单位从「字」改为「分钟」,阶梯 [5,10,15,20,30,45]
  • [x] 冥想阶梯优化为 [3,5,10,15,20,30],默认3分钟
  • [x] 运动阶梯砍到6级 [5,10,15,20,30,45]
  • [x] 早起阶梯改为动态生成:根据用户基准起床时间自动选择阶梯模板(4档:≥9:00 / 8:00-8:59 / 7:00-7:59 / 6:00-6:59)
  • [x] 早起数据结构从 targetMinutes(相对偏移)改为 targetWakeTime(绝对目标时间)
  • [x] 旧数据自动迁移(targetMinutes → targetWakeTime)
  • [x] 基准时间变更时自动重新计算早起等级
  • [x] 加码/退档弹窗改为显示具体时间(如「从 7:00 提升到 6:30」)
  • [x] 早起打卡成功30%概率显示早睡提醒
  • [x] 首页底部导航增加「关于」入口
  • [x] 每个习惯卡片加问号图标,点击弹出习惯说明(含描述+4条实操建议)
  • [x] 分享卡片重新设计:大数字C位布局、动态文案、习惯图标一排横排、全中文
  • [x] 正式隐私政策页面(9个章节,替换原有简单提示)

产品设计决策

  • 阅读/写作改时长而非页数/字数:投入指标 > 产出指标,鼓励「到场」而非「凑数」
  • 早起阶梯动态生成:同一套阶梯不适合不同作息的用户,基准越晚步子越大、越早步子越小
  • 倒计时功能不做:锁屏场景下体验差,核心价值是打卡不是计时
  • 阶梯统一6级:到顶就到顶,持续 > 强度

提交记录

  • 83cafdc refactor: 阅读和写作改为时长单位
  • 3c2b936 feat: 优化所有习惯阶梯设计 + 早睡提示
  • a03f639 refactor: 早起阶梯动态生成
  • 06223ae feat: 首页加关于入口 + 习惯说明弹窗
  • 18e7eae design: 重新设计分享卡片
  • a54ac1e feat: 正式隐私政策页面
  • 516ae12 fix: 分享卡片习惯图标一排横排 + 全中文
  • 6a2bade fix: 数字和天字间距加大
  • bbc1451 fix: 数字和天字间距加大到30px

待完成

  • [ ] 部署云函数(login + sync)
  • [ ] 提交审核
  • [ ] 分享图 UI 继续打磨

2026-05-08 Day 2 — 功能完善 + 大量 Bug 修复

完成事项

  • [x] 修复 onboarding.js 运动习惯缺少 targetMinutes: 1 字段
  • [x] 修复 settings.js 重复的 case 'exercise' 旧版二元模式代码
  • [x] 修复 index.js 运动 targetText|| 1 fallback
  • [x] 修复 stats.js 习惯 emoji 映射 wakeUpearly
  • [x] 打卡支持再次点击取消(不需要长按)
  • [x] 分享图去掉累计天数和完成率统计区
  • [x] 分享预览从 wx.previewImage 全屏改为弹窗模式
  • [x] 弹窗增加保存到相册(含权限处理)和分享给好友按钮
  • [x] 分享图改为玻璃拟态风格,蓝绿品牌色调(晨光蓝→成长绿渐变)
  • [x] 分享图文字统一放大,透明度提高,排版优化
  • [x] 实现完整加码/退档系统:
    • 连续7天完成 → 弹窗建议加码(显示当前目标→下一级目标)
    • 用户确认 → currentLevel+1,target 升级
    • 连续3天失败 → 弹窗建议退档
    • 加码后3天保护期
    • 设置页手动调整同步 currentLevel
  • [x] 新增 historyCache 历史记录存储(按日期索引)
  • [x] 统计页从 historyCache 读历史数据(之前只读 todayCache,清缓存后统计为空)
  • [x] 云端同步增强:syncFromCloud 把所有云端 records 写入 historyCache
  • [x] 新用户判断改为云端优先:登录后查 user_settings 表,有数据则拉取恢复
  • [x] syncFromCloud 完成后自动标记 onboarded

待完成

  • [ ] 部署云函数(login + sync),目前云端数据未写入
  • [ ] Gitee 推送代码
  • [ ] 提交审核
  • [ ] 分享图 UI 还需打磨(用户反馈排版和美观问题)
  • [ ] 微信开发者工具 MCP 连接问题未解决

踩坑补充: 8. Python 替换 JS 文件时容易丢失相邻方法(如 generateShareImage),替换后必须 grep 确认方法完整性 9. Canvas 绘制文字时 textBaselinetextAlign 组合影响定位,数字+单位同行需要对齐方式统一 10. drawShareCard 中 emoji 用 unicode 转义可能在某些 Canvas 渲染引擎有问题,建议直接用 emoji 字符 11. Class body 方法间不能用逗号 — 用 edit 工具插入代码时带了逗号(},),导致小程序 JS 引擎报 module not defined,Node.js 检测不出来 12. 云函数未部署时,云端查询会失败,新用户判断不能因为云端不可用就强制跳引导页,需要降级到本地判断

2026-05-07 Day 1 — 初始开发 + 大量修复

完成事项

  • [x] AppID 注册 + 云环境创建 + 备案提交
  • [x] 名称确定:早冥读写跑 - 习惯打卡(独特性 > 泛流量,搜索零竞品)
  • [x] Claude Code 完成 Day 1-3 初始开发(35文件/5241行)
  • [x] 修复 constants.js DAY boundary 空格语法错误
  • [x] 修复 app.wxss * 通配符选择器不支持
  • [x] 修复 variables.wxss CSS 变量未包裹在 page {}
  • [x] 调整 app.json 首页启动顺序
  • [x] 6个页面全部实现 onShareAppMessage(index/onboarding/settings/about/privacy/stats)
  • [x] 首页排版优化:删掉底部说明卡片,3按钮减为2,压缩间距,一屏显示
  • [x] 首页 UI 重写:渐变品牌头部 + 更大打卡圆圈 + 彩色完成指示条 + 进度渐变条
  • [x] 习惯目标值显示:未完成显示"目标:X分钟",已完成显示"已完成 · X分钟"
  • [x] 运动习惯改为时长模式(原为二元"动起来"),阶梯:1→5→10→15→20→30→45→60分钟
  • [x] 设置页排版优化:stepper 从 button 改为 view,去掉默认样式干扰
  • [x] 修复冥想显示 undefined(indexOf 类型安全问题)
  • [x] 数据同步改为全自动(去掉手动按钮,app.js onLaunch 自动拉取、onShow 静默检查)
  • [x] 新建统计页(热力图 + 里程碑 + 完成率 + Canvas 分享图)
  • [x] 首页进入隐私/引导检查从 redirectTo 改为 reLaunch(修复 webviewId not found)
  • [x] 首次进入提示文案轻量化("隐私协议"→"👋 开始前",去掉正式条款感)
  • [x] 隐私协议去掉"可随时删除数据"承诺

待完成

  • [ ] 部署云函数(login + sync),目前云端数据未写入
  • [ ] gitee 创建远程仓库并推送
  • [ ] 提交审核
  • [ ] UI 还需要继续打磨(用户反馈"不够美观")
  • [ ] 微信开发者工具 MCP 连接问题未解决,无法截图验证

踩坑记录(详见 LESSONS.md):

  1. WXSS 不支持 * 通配符选择器
  2. CSS 变量必须定义在 page {} 选择器内
  3. 批量修改代码后必须验证语法(node -c
  4. wx.redirectTo 连续跳转导致 webviewId not found,改用 reLaunch
  5. Array.indexOf() 类型不安全,数字和字符串匹配不上要 Number() 转换
  6. 小程序 button 组件有默认样式(边框、内边距),自定义 UI 用 view 更好
  7. Canvas 分享图:createImage 从 canvas 节点调用、先注册 onload 再赋值 src、导出用 setTimeout(800ms)

页面结构

pages/
├── index/         # 首页 - 打卡
├── onboarding/    # 引导页 - 设置初始习惯
├── settings/      # 设置页 - 调整目标
├── stats/         # 统计页 - 热力图/里程碑/分享图
├── about/         # 关于方法 - 微习惯方法论介绍
└── privacy/       # 首次进入提示

核心约束

  • 不用 tabBar,全部 wx.navigateTo / wx.reLaunch
  • 每个页面必须实现 onShareAppMessage
  • WXSS 不支持 * 通配符,CSS 变量必须包在 page {}
  • 提示文案不涉及数据存储说明
  • 批量修改后必须验证语法
  • Class body 方法间不能有逗号(小程序 JS 引擎会报 module not defined)
  • Python 替换 JS 后必须 grep 确认关键方法完整性
  • Local-First 策略:优先本地缓存,云函数只写
  • 数据同步全自动,用户无感知
  • 新用户判断云端优先(查 user_settings 表)
  • 历史打卡记录用 historyCache 按日期索引存储