早冥读写跑 - 习惯打卡
项目信息
- 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级:到顶就到顶,持续 > 强度
提交记录:
83cafdcrefactor: 阅读和写作改为时长单位3c2b936feat: 优化所有习惯阶梯设计 + 早睡提示a03f639refactor: 早起阶梯动态生成06223aefeat: 首页加关于入口 + 习惯说明弹窗18e7eaedesign: 重新设计分享卡片a54ac1efeat: 正式隐私政策页面516ae12fix: 分享卡片习惯图标一排横排 + 全中文6a2badefix: 数字和天字间距加大bbc1451fix: 数字和天字间距加大到30px
待完成:
- [ ] 部署云函数(login + sync)
- [ ] 提交审核
- [ ] 分享图 UI 继续打磨
2026-05-08 Day 2 — 功能完善 + 大量 Bug 修复
完成事项:
- [x] 修复 onboarding.js 运动习惯缺少
targetMinutes: 1字段 - [x] 修复 settings.js 重复的
case 'exercise'旧版二元模式代码 - [x] 修复 index.js 运动
targetText加|| 1fallback - [x] 修复 stats.js 习惯 emoji 映射
wakeUp→early - [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 绘制文字时 textBaseline 和 textAlign 组合影响定位,数字+单位同行需要对齐方式统一
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):
- WXSS 不支持
*通配符选择器 - CSS 变量必须定义在
page {}选择器内 - 批量修改代码后必须验证语法(
node -c) wx.redirectTo连续跳转导致 webviewId not found,改用reLaunchArray.indexOf()类型不安全,数字和字符串匹配不上要Number()转换- 小程序
button组件有默认样式(边框、内边距),自定义 UI 用view更好 - 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 按日期索引存储