Files
wx_pbzc/.workbuddy/memory/2026-08-14.md
T
lc 346d46cb27 feat(index): 新版本更新通知(What's New)弹窗
- 复用 ui-modal(position:center) + ui-btn,不新建组件,风格统一且自动跟随暗黑
- config.js 新增 releaseNotes 数组(每条一行短句),复用已有 version 字段
- 首页 _checkUpdateNote() 在 onShow 检测 storage 版本 vs config.version,
  不一致则居中弹通知并写回 storage 防重复;onCloseUpdateNote 关闭
- 绿色渐变徽章 + sparkleWhite 图标 + 版本标题 + 要点列表 + 知道了按钮
- 纯通知不重启应用;发版时改 version 同步更新 releaseNotes 即可
2026-08-14 10:40:03 +08:00

5.8 KiB
Raw Blame History

2026-08-14 工作日志

修复:设置页切换暗黑模式后其他 tab 的 tabBar 不跟随变暗

  • 现象:设置页选暗黑模式后,只有设置 tab 的底栏变暗,切到训练/记录/排行 tab 底栏仍是白色,完全退出重进才正常。
  • 根因:自定义 tabBar 组件的 pageLifetimes.show() 对自定义 tabBar 不触发(微信框架特殊行为——自定义 tabBar 由框架管理,不走普通组件的页面生命周期)。各 tab 页 onShow 里只做了 tb.setData({selected:X}) 设高亮,没有同步主题;onSelectDarkModegetCurrentPages() 只返回当前 tab 页(其他 tab 不在页面栈里),所以 tb.updateTheme() 只刷新了设置页的 tabBar 实例。
  • 修复4 个 tab 页 onShow 里获取 tabBar 后,在 setData({selected:X}) 之后加一行 tb.updateTheme()updateTheme() 内部调 applyThemeToPage(this)(有"样式未变则跳过"的优化),不会产生多余渲染。涉及 pages/index/index.jspages/records/records.jspages/leaderboard/leaderboard.jspages/settings/settings.js
  • 教训:自定义 tabBar 不能依赖 pageLifetimes 做状态同步,必须在各 tab 页 onShow 里显式调 this.getTabBar() 更新。

修复:循环训练偶数组数休息语音被「一半」提示吞掉

  • 现象:循环训练设 2 组时,第 1 组练完进入休息,本该播 restStart「休息一下」,实际播的是 halfway「已完成一半啦」,休息语音不响。
  • 根因:偶数 set 数时 sets×hold/2 正好落在某组练完→休息切换的那一 tick。_circuitCue 先播 halfway 并设 _voiceBusyUntil=now+2600 占麦;紧接着 _advance()_circuitPhase('resting') 检查麦占用,restStart 被静音。原代码注释有意让"进度提示优先于阶段提示",但偶数组数下两者撞车。
  • 修复_circuitCue 里先算 atRestBoundary(phaseRemaining<=0 && rest>0 && setIndex<sets) 与 restWillSpeak(hold>=10 && rest>=5)halfway/last30/last10 在"落在休息边界且 restStart 会播"时跳过自身,让休息语音优先。奇数组数一半点在中段不会撞车,不动;短组配置 rest 不播也保持原 halfway 行为,无回归。改 pages/timer/timer.js_circuitCue
  • 顺带:last30/last10 在更长偶数组数(如 4 组×30s 的 set3→rest)也会撞同一问题,一并按同规则让位,行为一致。

新增:训练完成分享海报(canvas 绘制 + 小程序码)

  • 现象:训练完成后点分享,微信默认截取当前页面,因完成弹窗垂直居中,卡片只截到上半部分(绿色星星+"完成!"),大数字和按钮被切掉。
  • 方案:用隐藏 canvas 2d 绘制一张 5:4(500×400 逻辑像素)的专用分享海报,在 onShareAppMessage 里作为 imageUrl 返回;提前在 _saveAndShowCompletion 弹窗数据就绪后生成,避免分享时现场绘制延迟。
  • 海报内容(初版):浅灰底 + 顶部品牌 + 白色圆角成绩卡 + 绿色渐变星星图标 + 状态文案 + 大数字时长 + 连续打卡(如有)+ 底部"扫码一起打卡"引导 + 右下角小程序二维码。
  • 文件改动
    • pages/timer/timer.wxml:添加隐藏 <canvas type="2d" id="sharePoster">
    • pages/timer/timer.wxss.share-poster-canvas 移出视口、不响应点击
    • pages/timer/timer.js:新增 _drawSharePoster()_formatShareDuration()_saveAndShowCompletion() 里 setData 后预生成;onShareAppMessage() 返回 imageUrl: this._shareImageUrlonTrainAgain() 清空旧图防止复用
    • static/share-qr.jpg:加入用户提供的小程序二维码资源
  • 注意:导出用 jpg quality 0.9、dest 500×400,控制文件在 128KB 以内;二维码路径 /static/share-qr.jpg 为相对小程序根目录;若二维码加载失败仍导出无二维码的海报,保证分享入口不灰。

调整:分享海报(实测反馈)

  • 反馈:① 大数字(分钟数)压住了上方"完成"状态文案;② 顶部小程序名称多余;③ 要删二维码。
  • 根因:初版状态文案 y=172(字号22)、大数字基线 y=230 且字号最大 90px,数字顶部≈165 落入状态文案区域(150~172),多位数分钟(如纯分钟 "6"→90px)直接压字。
  • 修复(仅改 _drawSharePoster 布局):删除顶部"平板的支撑"品牌名;删除右下角二维码及依赖它的"扫码一起打卡"引导(连带 static/share-qr.jpg 也删,不再引用);重排垂直节奏——卡片放大(42~358)、图标 circleY=104、状态文案 y=184(24px)、大数字基线 y=286(上限84px,顶部≈226,与状态文案下沿 192 间距 34 安全)、连续打卡 y=332;导出改为绘制完直接 canvasToTempFilePath,无需等图片加载。
  • 结论:海报现为"成绩卡 + 图标 + 状态 + 大数字 + 连续打卡"的极简版,无品牌名无二维码。

新增:新版本更新通知(What's New)弹窗

  • 需求:新版本发布后用户首次进入弹一个"更新了什么"通知弹窗(纯通知,不是微信"点击更新→重启"流程)。用户澄清要的是 What's New,不是 applyUpdate 重启。
  • 实现:复用 ui-modal(position:center) 居中弹窗 + ui-btn,不新建组件;config.jsreleaseNotes 数组;首页 index.js_checkUpdateNote()onShow 检测 storage.lastUpdateNoteVersion vs config.version,不一致则显示并写回 storage 防重复;顶部绿色渐变徽章 + sparkleWhite 图标 + 版本标题 + 要点列表 + "知道了"按钮。
  • 文件config.js(releaseNotes)、pages/index/index.{js,wxml,wxss}index.json 无需改(ui-modal/ui-btn 已注册)。
  • 发版约定:每次发版改 config.version 并同步更新 releaseNotes 即可。前端改动不发云函数。