# 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)。前端 `` 不再在渲染时做 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 调微信 API,curl 自动走 HTTPS_PROXY;5 工具: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-row(bindtap 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 文章),已成功 push(70b87d4..3e1d3bd)。`.DS_Store`/`.workbuddy/` 保持未跟踪、不提交。