Files
2026-07-29 11:05:03 +08:00

73 lines
9.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 2026-07-22 工作日志
## 修复:首页「今日目标」数字在真机被圆圈遮挡
- 现象:模拟器正常,真机(用户开了系统/微信字体缩放)大字号下数字超出固定圆形 `.target-ring`(280rpx, overflow:hidden) 被裁切。
- 根因:微信按 `fontSizeScaleFactor` 自动放大所有文字(含 rpx 字号),但不放大 rpx 盒子尺寸 → 真机文字变大、容器不变 → 溢出裁切。模拟器跑标准档(1.0)不重现。
- 改动:
- `pages/index/index.js`:新增 `targetTimeFontSize`(默认 84) 数据;`onLoad``_readFontScale()`,用 `wx.getAppBaseInfo().fontSizeScaleFactor`(回退 `getSystemInfoSync().fontSizeSetting/17`)反向补偿 `84/factor`clamp 到 [48,96],抵消系统缩放使数字视觉恒定。
- `pages/index/index.wxml``target-time` 增加 `style="font-size: {{targetTimeFontSize}}rpx;"`
- `pages/index/index.wxss``.target-time``white-space:nowrap`(防换行顶出)。
- 校验:`node --check index.js` 通过。
- 此坑记入 MEMORY.md(微信字体缩放导致文字溢出固定盒子)。
## 修复:同上改动导致模拟器数字变小
- 现象:真机修复后正常,但模拟器「今日目标」数字又变小/不正常。
- 根因:模拟器 `getAppBaseInfo().host.env === 'devtools'`,会**原样返回手机真实缩放倍率**(如 1.3)却**渲染时不放大文字**;真机才会放大。之前的补偿把字号缩成 `84/1.3≈65rpx`,模拟器按 65 渲染→偏小。
- 改动:`pages/index/index.js` `_readFontScale()` 增加判断——`host.env === 'devtools'` 时跳过补偿、直接用 84rpx 设计字号;仅真机/PC 微信才做 `84/factor` 补偿。
- 校验:`node --check index.js` 通过。devtools 不对称坑补入 MEMORY.md。
## 优化:排行榜头像延迟(批准实施 ①②)
- 措施①云函数预解析:`cloudfunctions/leaderboard/index.js` 新增模块级 `_resolveAvatars(urls)`,在 `exports.main` return 前收集 ranked+myEntry 的全部 `avatarUrl`,过滤 `cloud://` 的批量调 `cloud.getTempFileURL({fileList})` 换成临时 https URL(按 50/批分页;失败 catch 降级保留原 fileID)。前端 `<image>` 不再在渲染时做 getTempFileURL 往返。
- 措施②上传压缩:`pages/settings/settings.js``_uploadAvatar` 上传前先 `_compressAvatar(filePath)``wx.compressImage({quality:80, compressedWidth:200})` 把 chooseAvatar 原图压到最长边 200px;失败/不支持(旧基础库/devtools)回退原图,上传不崩。
- 校验:`node --check` 两文件均通过。
- ⚠️ 部署要求:`leaderboard` 云函数改动**必须重新部署**才能生效(前端 settings.js 改了重新编译即可,对之后上传的头像生效;已存旧 cloud:// 头像由云函数预解析加速)。两者互补。
## 优化:记录页底部列表与月份选择器联动(方案 B 分段切换)
- 现象:切月份时日历热力图会变,但下方「最近记录」列表不变(它绑的是全局 top-30 `historyList`,与月份无关)。
- 改动(`pages/records/`):
- `records.js`data 加 `listMode:'month'``refresh()` 新增 `displayList`month 模式=`monthRecords` 即所选月逐条记录,recent 模式=全局 top-30 `historyList`);新增 `onToggleListMode(e)``data-mode` 切模式后 `refresh()`。切月时 `listMode` 保持不变。
- `records.wxml`:历史卡片头部加 `[本月|最近]` 分段控件(`.rec-seg`,复用排行榜/设置页 `.period-seg` 视觉语言);标题动态为 `{{year}}年{{month}}月记录``最近记录`;列表 `wx:for="{{displayList}}"`;空态文案随模式切换(本月→"本月还没有训练记录/换个有训练的月份看看吧")。
- `records.wxss`:新增 `.rec-seg`/`.rec-seg-item`/`.rec-seg-item.active` 样式;`.history-hint``margin-bottom:8rpx`
- 校验:`node --check records.js` 通过。
- 注:`getRecordsByMonth(monthKey)` 返回该月逐条记录且存储时已按最新在前排序,故月份联动零额外数据成本。日历热力图仍用 `monthRecords`,不受 listMode 影响。
## 内容产出:公众号文章(产品介绍)
- 用户要求写公众号文章并发送草稿箱。确认:环境无微信公众号 connector/MCP、无 appid/appsecret,且本机对外 TLS 不稳(同 git push 的 SSL_ERROR_SYSCALL),无法真发草稿箱。用户选择「产品介绍 + 先成稿自行发布」。
- 产出:`docs/公众号文章_平板支撑小程序.md`(约 1200 字,面向健身/普通用户,含封面/配图建议注释与文末二维码占位)。结构:痛点引入 → 训练计时 → 首页打卡 → 排行榜领奖台 → 记录日历 → 个性化主题 → 为什么是它 → CTA。所有功能点均基于真实已实现功能,未编造。
- 注:「小程序名称」为占位,需用户替换实际上架名;发布方式:复制 markdown 到公众号编辑器(或转 HTML 富文本粘贴)。
## 配置:微信公众号 MCP connector 骨架(真发草稿箱)
- 用户选择「有公众号+凭据,帮我配」。已实现自定义 MCP server。
- 脚本:`~/.workbuddy/wx-mcp-server.js`(纯 Node + curl 调微信 APIcurl 自动走 HTTPS_PROXY5 工具:get_access_token/md_to_html/upload_thumb/add_draft/publish_article)。凭据存 `~/.workbuddy/wx_credentials.json`(占位模板,chmod 600,不进 mcp.json),token 缓存 `~/.workbuddy/wx_token.json`
- 合并进 `~/.workbuddy/.mcp.json``mcpServers.wx-mcp`(保留原 `connector-proxy`)。
- 握手测试(initialize+tools/list)通过;网络探活 `api.weixin.qq.com` 直连 TLS 正常(返回 invalid appid,国内直连可达,与 github 国外被墙不同)。
- 待用户:①填真实 appid/appsecret ②提供封面图(路径/URL)③确认公众号为认证服务号(drafts/add 权限)。之后用 publish_article 把 docs/公众号文章 发到草稿箱。
- 注:实际 MCP 配置点在带点的 `.mcp.json`(系统说明的无点版不存在),以实际文件为准。
## 设置页:加「功能介绍」引导到公众号文章入口
- 技术结论:微信小程序**不支持**直接点击跳转公众号文章(wx.navigateTo 只能跳内部页面;web-view 仅限已配置业务域名,且公众号文章 mp.weixin.qq.com/s/ 被禁)。故用「复制链接→微信打开」引导。
- 实现(用户选方案 B 引导到公众号文章):
- `config.js`:新增 `articleUrl` 常量(占位 `https://mp.weixin.qq.com/s/REPLACE_WITH_ARTICLE_LINK`,文章发到公众号后填真实永久链接)。
- `pages/settings/settings.js`data 加 `appArticleUrl`/`showArticleGuide`;新增 `onOpenArticle`/`onCloseArticle`/`onCopyArticle`wx.setClipboardData 复制链接+toast,复用 onCopyWechat 同款交互)。
- `pages/settings/settings.wxml`:「关于」卡片加「功能介绍」about-rowbindtap onOpenArticle);末尾加底部 sheet 引导弹窗(显示链接+复制按钮,仿 plan-editor 风格,style=themeStyle 跟随暗黑)。
- `pages/settings/settings.wxss`:新增 `.article-guide-*` 样式(复用 --card-bg/--primary 等变量与 planEditorSlideUp 动画)。
- 校验:`node --check settings.js` 通过;grep 确认 wxml/js/config 引用一致。
- 待办:①把真实文章链接填进 config.articleUrl(需先把文章发到公众号拿永久链接,可走之前搭的 wx-mcp 草稿箱流程)②重新编译小程序验证弹窗。
## 设置页:「功能介绍」复制链接 → 直接显示公众号名称
- 用户反馈复制链接打开太麻烦,改为在「关于」直接显示公众号名称,且名称定义在 config.js。
- 改动:
- `config.js``articleUrl` 替换为 `officialAccount: '爱咖啡的人'`
- `pages/settings/settings.js`data 删除 `appArticleUrl`/`showArticleGuide`,加 `appOfficialAccount: config.officialAccount`;删除 `onOpenArticle/onCloseArticle/onCopyArticle`,新增 `onCopyOfficialAccount`wx.setClipboardData 复制公众号名 + toast「已复制,去微信搜索关注」)。
- `pages/settings/settings.wxml`:「关于」的「功能介绍」about-row 改成「公众号」行,value=`{{appOfficialAccount}}`bindtap=`onCopyOfficialAccount`;删除末尾 article-guide 底部 sheet 弹窗。
- `pages/settings/settings.wxss`:删除全部 `.article-guide-*` 无用样式。
- 校验:`node --check` settings.js/config.js 通过;grep 确认无 article-guide/articleUrl/showArticleGuide 残留。
- 约定:公众号名称后续若变更,只改 `config.js``officialAccount` 即可。
## 提交流程:git push 到 github 的可用配置(本机)
- 本机有本地代理 `HTTPS_PROXY=http://127.0.0.1:59305`github.com 经其透明转发。直接推会失败(沙箱无网 / HTTP/2 framing / TLS 握手失败)。
- **可用命令**(关键:必须 `dangerouslyDisableSandbox` 才能访问 127.0.0.1 的代理;并关掉 HTTP/2,否则代理报 framing 错误):
`git -c http.version=HTTP/1.1 push origin main`(沙箱禁用 + 走 env 的 HTTPS_PROXY)。
- 试过不可用的组合:显式 `-c http.proxy=... -c https.proxy=... -c http.sslVersion=tlsv1.2` → 代理空响应;默认 HTTP/2 → framing 错误。
- 本次提交 `3e1d3bd`(公众号名称改动 + docs 文章),已成功 push70b87d4..3e1d3bd)。`.DS_Store`/`.workbuddy/` 保持未跟踪、不提交。