Commit Graph

108 Commits

Author SHA1 Message Date
Blizzard 8d0269cbce fix(fe): 评论页键盘避让改用 bindkeyboardheightchange 移动固定输入条
列表完全不动(adjust-position=false + 页面 overflow:hidden),只有底部 fixed
输入条按键盘高度抬 bottom,聚焦期间不碰输入框其它属性,避免原生 textarea 抖失焦。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 16:10:53 +08:00
Blizzard 7a55ee0f2e feat(community): 评论改为独立二级页面 + 评论内容安全审核 + 评论数按实发实时纠正
前端:
- 新增 pages/comments 独立评论页(列表 + 底部输入条 + 回复),社区卡片点评论改为 navigateTo
- 输入条用普通流式布局 + 原生 adjust-position 做键盘避让,聚焦期间不 setData 碰输入框
- 评论只能配 1 张图;底部常驻「审核后公开」提示;发送按钮在途「审核中…」防连点
- 发布结果按状态区分:过审即时展示,其余提示「已提交,审核通过后展示」
- 评论页把已发布评论数回传社区列表,卡片数字实时更新

后端:
- CreateComment 文本判为违规时直接拒收(ErrContentRejected),不入库
- 社区列表/用户帖子列表用「已发布评论实时条数」覆盖 comment_count,
  修正异步过审/删待审/后台改状态导致的计数漂移
- IDCard 手机号返回完整号码(上一批遗留)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 16:04:21 +08:00
Blizzard 51ead8f411 style(fe): 身份卡只留截图字段 — 去掉性格标签,高度压到 cardH=510
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 18:41:38 +08:00
Blizzard 1544151e5c style(fe): 身份卡降到 cardH=540,反面去掉备注行并压紧版式
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 18:39:09 +08:00
Blizzard c07ed03539 style(fe): 身份卡正反两张等高(都用 cardH=630),正面中间内容垂直居中
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 18:37:17 +08:00
Blizzard 473c9f9200 style(fe): 照护卡改证件版式 — 大字「X星人地球移民/居民身份卡」左对齐
- 去掉蓝色标题条,照护卡整体换淡紫底
- 标题两行左对齐:小字带字距「汪星人/喵星人/宠星人地球移民」+ 大字「居民身份卡」
- 按物种动态取字:狗→汪星人、猫→喵星人、其它→宠星人
- 发证机构→签发机构、有效期→有效期限;小程序码落到右下角淡紫底上
- 新增 spacedText 逐字字距工具

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 18:35:11 +08:00
Blizzard 59412010dc feat(fe+be): 身份卡加公章、修性别符号、电话显示全、照护卡标题两行
- 修正性别 ♂/♀:用名字字号量宽度再定位,不再怼到名字上(之前用小字号量偏了)
- 正反两张卡右上角各盖一枚「肉垫计划 · 官方认证」红色公章(双圈+五角星,微旋转半透明)
- 照护卡标题改成两行「X星地球移民 / 居民身份卡」(按猫狗取 喵/汪/宠)
- 正面「物ID」改为「ID」
- 后端 IDCard.Phone 返回完整手机号,不再脱敏

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 18:32:09 +08:00
Blizzard 4e3859227e style(fe): 身份卡再精简 — 去掉 logo/徽章/图标 emoji 和多余招呼语
- 正面去掉「宠星人」logo、「宠物身份卡」盾牌徽章、爪印水印,头像上移
- 照护卡标题去掉 🌿,各行去掉 👤📞📝🏛📅 图标只留文字
- 走失框去掉「🔔 走失时请联系主人」标题和「或联系主人」,只留扫码说明
- 去掉页面底部「小程序码发布后出现」占位提示

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 18:23:42 +08:00
Blizzard d9a80d7f8a style(fe): 身份卡按参考图收拾 — 去标题/正反面标签/疫苗,卡高按内容自适应
- 去掉顶部「宠物身份卡」大标题和「· 正面 ·/· 背面 ·」灰字,只留两张卡
- 正面卡高度按性格/介绍有无动态算,消掉中间大块空白
- 性格标签为空时整段不画
- 照护卡去掉「疫苗情况」行
- 导出只裁到实际内容底部,卡片下面不再拖空白

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 18:15:45 +08:00
Blizzard 747e7c9d3a feat(fe): 身份卡手机号门槛加「手动填写」兜底
getPhoneNumber 需企业认证 + 手机号验证权限,个人/未认证小程序唤不起。
门槛卡加「手动填写手机号」入口:填 11 位号 → updateProfile 存库 → 重取卡生成。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 17:52:31 +08:00
Blizzard 586875f8c5 feat: 身份卡改上下两张卡(正面/背面) + 手机号硬门槛
- canvas 重画成上下两张:正面(暖黄,头像/名字性别/性别品种毛色年龄/性格
  彩色标签/介绍/物ID+一起生活天数)、背面(蓝色照护信息条 + 主人/电话/疫苗/
  备注/发证机构/有效期 + 走失联系框&小程序码)
- 生成前查手机号:没有则唤起 getPhoneNumber 组件,验证成功才生成;
  拒绝则提示「无法生成」不出卡
- IDCard 增 age/days;ic-canvas 高度改 1480 否则导出被裁

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 17:48:39 +08:00
Blizzard 15adfb76ac feat(fe): 身份卡重绘成正面+照护信息+证件三段式 + 手机号验证
- 正面:头像/名字/物种性别 + 品种·毛色 / 出生·星座 / 体重 + 性格标签chips
- 照护信息:主人 / 联系电话 / 疫苗情况 / 备注(去掉驱虫、过敏)
- 证件区:居民身份卡 + 身份ID / 发证机构 / 有效期 + 小程序码
- 未验证手机号时页面出现「用微信验证手机号」(getPhoneNumber),
  拿到 code 换手机号后重取卡重画;表单去掉过敏输入

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 17:28:26 +08:00
Blizzard ef172f4e4a feat: 宠物加性格/过敏/备注字段 + 身份卡照护信息 + 微信取手机号
- Pet 增 personality/allergy/notes;建档表单加「性格标签(多选)/过敏/备注」
- IDCard 增 color/personality/owner/phone(脱敏)/allergy/notes/疫苗驱虫状态/发证机构
- 微信取手机号:POST /api/user/phone 用 getPhoneNumber 的 code 换手机号存库
  (BindPhoneByCode 走 getuserphonenumber,复用 access_token)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 17:12:56 +08:00
Blizzard 93fc9bc5da style(fe): 成长报告海报预览卡排版打磨
- 头像改圆形 + 白边(和保存的图一致)
- 周期做成小胶囊;数据清单每行「绿勾 + 项目 + 数值右对齐」,更整齐
- 健康状态做成绿色徽章;生成自弱化

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 16:16:38 +08:00
Blizzard 931fb69ef2 fix(fe): 海报预览卡(wxml)也显示真实头像 + 统计周期
之前只改了导出用的 canvas,但弹层里看到的预览卡是 wxml 渲染的,
头像写死 emoji、也没周期。现在预览卡:有照片用照片(poster.pet_avatar_url
兜底 pet.avatar_url)、加「近 7 天 · 日期」周期行,和导出图一致。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 16:10:42 +08:00
Blizzard 72c5308214 fix(be): 海报 pet_avatar_url 一直为空——ownedPet 不解析头像
GetPoster 用 ownedPet 只填了 Age,头像 URL 没解析,导致 pet_avatar_url
恒为空、海报总是退回 emoji。改成显式 s.fileURL(pet.AvatarFileID)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 16:08:23 +08:00
Blizzard c890732410 feat: 成长报告海报改周报口径 + 显示统计周期
- 海报四项统计原来是全部累计,和「周报告」不符;改成近 7 天口径
  (和报告页本周概览一致),高风险异常也按本周真实统计(原来写死 0)
- Poster 加 period 字段,海报上画出「近 7 天 · 07.25 - 07.31」

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 15:33:12 +08:00
Blizzard 95471d0549 style(fe): 我的顶部卡片重排——左对齐紧凑布局
- 没设头图时不再留一块空橙色 banner(和整页暖橘背景撞色的怪感消除)
- 身份行改左对齐:头像 + 昵称/签名并排;社交数(帖子/关注/粉丝)缩成
  一小行内联;养宠数据保留高亮带。头图设了才显示
- 主题色/头图/签名/展示开关都照常生效

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 15:28:23 +08:00
Blizzard 1610fd6814 style(fe): 装扮/预览两个按钮改一行两列、缩小文字
装扮按钮从 profile-head 挪到「我的」页,和「看看别人眼里的我」并成
一行两列(装扮主页 / 别人眼里的我),字号缩小、图标小一号;
profile-head 只保留别人主页的关注键。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 15:22:22 +08:00
Blizzard 4c9fbc4a88 fix(fe+be): 我的页去重宠物墙 + 养宠天数按到家日算
- 养宠天数原来按建档日算,重新建档会被重置成 1(和首页「第869天」矛盾);
  改成按最早那只的到家日算(无到家日退建档日),和首页口径一致
- 「我的」页 profile-head 传 hideWall,藏掉社交宠物墙(下面「我的毛孩子」
  卡更详细,重复了);宠物墙只在别人访问/预览时出现,受「展示我的毛孩子」
  开关控制,语义更对(那开关本来就是给别人看的)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 15:11:59 +08:00
Blizzard 4a1b5e66d3 fix: 成长报告海报用宠物真实头像(没传才用 emoji)
- 后端 Poster 增 pet_avatar_url(取 pet.AvatarURL,和身份卡同一可靠路径)
- 海报 canvas 优先用它、store 兜底;有照片画圆形头像、没有才 emoji
- 头像九参数居中裁剪,竖图/横图都不压扁

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 15:00:47 +08:00
Blizzard d45696140b style(fe): 首页管理计划/记花销 banner 压低
上下 padding sp-5→sp-4、图标块 96→76rpx、间距收紧,整卡矮一截。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 14:53:43 +08:00
Blizzard d5dfde14f4 fix(fe): textarea 占位/文字从第一行开始(改回块级顶部对齐)
共用输入样式 .input,input,textarea,.picker-box 里的 display:flex+
align-items:center 是给单行 input 竖向居中的,但选择器带了 textarea,
导致所有多行输入的占位/光标被竖向居中、不从第一行开始。加一条
textarea{display:block} 恢复顶部对齐,一处修计划备注/记录描述/体重描述/评论。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 14:50:49 +08:00
Blizzard 282306b919 feat(fe): 首页最近记录只留最新6条 + 查看全部入口,去掉无限滚动
首页是速览,记录多了不该无限加载。固定拉最新 6 条,有更多就露出
「查看全部记录 ›」跳到能分页筛选的全部记录页;移除滚动分页/加载更多。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 14:45:29 +08:00
Blizzard 2f2757267e fix(be): 任务完成统计与留痕改用 PlanTask(DailyTask 已空)
- TogglePlanTask:完成无 sheet_type 的任务时补一条 note 记录,
  首页/计划页两条路径都统一留痕(ToggleTask 委托它);去掉前端重复建记录
- 报告页「完成任务」原来统计空的 DailyTask 恒为 0,改成经 plan 关联
  统计 PlanTask 本周完成数;用户汇总的 tasksDone 同改
- 首页今日完成度 todayCompletionPct 同样从 DailyTask 改成今日 PlanTask

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 14:29:04 +08:00
Blizzard 0f3efbc895 chore(be): 上传对象按月份分文件夹 uploads/YYYY-MM/
MD5 去重本来就有(相同内容直接返回已有记录不重传);对象名从
files/<md5> 改成 uploads/2026-07/<md5>,跨月的同内容仍走去重不重复占用。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 14:16:53 +08:00
Blizzard a91f5e39ca feat: 发帖去身份用昵称、标签对齐筛选、图片限2、无类型任务也留痕
- 发帖去掉「发布身份」选择,统一用发布者昵称(后端按 user 取昵称)
- 发帖标签改成 晒宠/新手求助/经验,和社区顶部筛选完全一致;
  tabTag 新手求助→新手求助(原来映射成「求助」对不上)
- 内容输入框:点整块 field 都聚焦(原生 textarea 在 scroll-view 里
  命中区域会偏,只有 placeholder 处能点)
- 发帖图片上限 3→2,文案标注「最多 2 张」
- 无记录类型的自定义任务完成后,补一条 note 记录,最近记录里留痕

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 14:12:52 +08:00
Blizzard b52729dec8 feat(fe): 整站改品牌暖橘竖向淡出渐变,取代独立色块
- page 背景换成顶部品牌橘 → 约半屏褪到米白的竖向淡出,铺全部页面,
  没有色块接缝问题,整屏更一体
- nav-bar 默认改透明 + 深棕字(顶部本身就暖,不再铺奶白毛玻璃);
  去掉 Step4 的 tone 属性和独立 .brand-band
- 带切换条的页面(首页/报告/历史/计划)统一 on-band:chip 半透明白、
  选中实白,在暖底上更清晰

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 13:59:05 +08:00
Blizzard bbc34c5bd6 feat(fe): Step4 门面品牌色带(方案A)+ nav-bar tone
- nav-bar 加 tone="brand":透明底 + 深棕字,压在色带上;默认分支不动
- 首页/记录页顶部加 252rpx 品牌橘色带(下沿大圆角,z-index:-1 垫背后),
  盖住 nav + 切换条,门面卡在色带下方
- 切换条压在色带上:chip 半透明白 + 深棕字,选中实白
- page 加 position:relative 供色带绝对定位锚定
- 新增 --band-a/--band-b/--band-ink token(取自 preview-v3 定稿)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 13:42:11 +08:00
Blizzard bb7db78763 feat(fe+be): 身份卡头像不再压扁 + 内容丰富
- 头像用九参数 drawImage 居中裁剪(cover),竖图/横图都不变形,加白边圈
- 后端 IDCard 增 zodiac(按生日算星座) + weight,卡面加「星座/体重」行
- 加淡淡的肉垫水印 + 旋转的「肉垫计划·官方认证」印章
- 画布加高容纳新增内容

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 11:50:04 +08:00
Blizzard 96c92f2cfb feat(fe): 今日任务完成走记录表单,去掉「全部完成」
- 去掉首页「全部完成」按钮,避免一键刷完不留记录
- 勾选带记录类型的任务 → 跳记录表单,保存成功后才回填任务完成,
  返回首页 onShow 自动刷新任务勾选 + 最近记录(带 taskId 传参)
- 只对未完成任务传 taskId,避免重复完成把已完成任务 toggle 回去
- 无记录类型的任务(如遛狗)仍直接勾选完成

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 09:03:27 +08:00
Blizzard 603bd5773e feat: 用户可见自己帖子的审核状态
- 发帖后若未直接过审,弹窗明确「审核中,通过后才出现在社区」,
  不再让用户以为发失败/是 bug
- 后端 ListUserPosts:看自己主页时返回待审核/未通过的帖子(带状态),
  看别人仍只返回已发布
- 个人主页帖子加「审核中/未通过」状态标 + 说明
- 我的页加「我的帖子」入口,进自己主页看审核状态

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 08:49:20 +08:00
Blizzard b01effaf5e style(fe): 社区帖子图片改固定小缩略图(210rpx 正方形)
aspect-ratio 在微信渲染不生效导致竖图被撑长。改成 flex-wrap +
显式 210rpx 见方的缩略图,小而统一,点击 previewImage 放大。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 08:40:06 +08:00
Blizzard f0ea05696c feat(fe): 社区帖子图片点击放大预览
缩略图保持网格展示,点击走 wx.previewImage 全屏预览,
可左右切换同帖多图(emoji 占位不参与)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 08:33:55 +08:00
Blizzard c852817363 fix(fe): 修社区图片撑破网格;发帖限 3 张;上传偶发失败自动重试
- .photo-tile 补 width:100%+min-width:0:微信 image 默认 320x240,
  不给宽高会冲破 photo-grid(社区帖子图片"爆炸")
- 发帖图片上限从 9 张改成 3 张
- uploadFile 三重兜底:冷启动没 token 先续期、40100 续期重试、
  网络/网关瞬时错误自动重试一次(后端 MD5 去重,重传安全)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 08:32:22 +08:00
Blizzard a010629ac1 chore(deploy): 部署注入 WECHAT_MSG_TOKEN(内容安全回调校验)
deploy/docker-compose.yml 把 .env 的 WECHAT_MSG_TOKEN 映射成
PETS_WECHAT_MSG_TOKEN 注入容器(可选,留空则回调不校验签名);
.env.example 补上说明。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 19:08:11 +08:00
Blizzard 6bb327e62e fix(be): 登记 wechat.msg_token 默认值,让 PETS_WECHAT_MSG_TOKEN 能覆盖
viper AutomaticEnv 只对已登记的 key 生效,纯 .env 部署下未登记的
key 绑不上,会静默取空值。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 19:04:38 +08:00
Blizzard 67b97e4b38 feat(be+admin): 后台看板扩展 + 社区内容安全审核
看板(Recharts):
- 概览页加 DAU/WAU/MAU、今日/本月新增 KPI,新增趋势/活跃趋势/月活/留存曲线
- GET /admin/analytics 内存计算,活跃口径=当天有记录/发帖/评论,排除 bot

内容安全(微信官方 UGC):
- 文本 msg_sec_check 同步判、图片 media_check_async 异步查
- 帖子/评论加 pending/rejected 审核态,feed 只放 published
- 图片结果回调 /api/wx/sec-callback,JSON/XML + 明文模式,签名校验
- 检测不了/未发布时一律转待审核,走后台手动审核
- 后台帖子/评论审核页:修好看不到图(补 attachPostImages)、
  加状态筛选 + 通过/打回;新增评论审核状态接口

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 19:01:48 +08:00
Blizzard c48e241fe1 feat(fe): 评论改小红书式展开输入面板;FAB 统一暖橘;顶部去冗余入口
- 评论:底部平时一条细「说点什么」,点开才展开大写评论面板
  (大输入框+工具栏+发送,浮在键盘上方)。失焦时有草稿保持展开,
  避免点发送因面板收起而丢点击
- FAB 主题色统一:社区发帖 FAB 从深色改成和首页肉垫一致的暖橘圆钮
- 报告页顶部筛选去掉「添加」(报告页不需要建档入口)
- 社区去掉顶部「发布」按钮,发帖统一走右下角悬浮按钮

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 18:13:41 +08:00
Blizzard 4f52a7d3a1 style(fe): 评论弹窗重做——空态加图标、输入区合成圆角输入栏
- 空态从一行飘字改成 图标+两行文案 居中
- 相机/输入框/发送合成一条聊天式圆角输入栏,字数只在输入时显示
- 头部标题加粗

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 18:05:25 +08:00
Blizzard 396f531023 feat(fe): 肉垫 FAB + 冷启动闪屏;顶部筛选改纯文字对齐
- FAB 重设计成肉垫造型(呼应「肉垫计划」),修 fab.js 漏声明
  icon 属性导致的兜底文档图标;社区发帖 FAB 保持图标
- onboarding 加冷启动闪屏,登录+拉宠物在闪屏期完成再进首页,
  不再闪一下建档向导;欢迎屏 logo 换肉垫、去掉过时 AI 文案
- 顶部宠物筛选去掉头像改纯文字(带图/emoji 时高度对不齐),
  固定高度 + vertical-align:middle 彻底对齐,添加用「+」文字

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 17:57:06 +08:00
Blizzard de2b72221c fix(be): 编辑档案补写到家日期/生日;关迁移期外键修复重复索引
- UpdatePet 的 fields map 之前漏了 birthday 和 arrived_at,
  导致编辑档案改到家日期不落库(首页天数一直显示「-」)
- DisableForeignKeyConstraintWhenMigrating:外键列自动索引和字段
  index tag 撞成同名索引,父子表同迁时报 1061,关掉库级外键约束创建

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 17:57:05 +08:00
Blizzard e2ce56680a fix(fe): 修切换条头像撑大 chip;我的页菜单只留设置
- pet-switch 头像 flex:none 锁死 52rpx,真机上图片固有尺寸不再撑大 chip
- 我的毛孩子去掉「+添加」(首页切换条可加)
- 菜单区只留「设置」,档案/计划/多宠都从首页和宠物卡进

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 17:20:02 +08:00
Blizzard 11c4d490e6 feat(fe): 宠物照片替代默认头像,身份卡移到首页门面卡
- 首页/我的/切换条:上传过照片就用照片,没有才退回 emoji
- 报告页分享海报:先异步加载头像再开画,画成圆形头像
- 一起生活的天数改成从到家日期算,没填就显示「-」并可点去补
- 身份卡入口从「我的」页移到首页门面卡右上角

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 17:08:32 +08:00
Blizzard cbfcaada55 feat: 宠物身份卡(canvas 绘制 + 小程序码 + 存相册/分享)
竞品那张「居民身份卡」,完整做了。

## 后端
service/wxacode.go —— 小程序码。两步:先拿 access_token(2h 有效,进程内缓存、
提前 5 分钟过期),再调 getwxacodeunlimit 换一张 PNG 存到 MinIO 返回 URL。
同一只宠物的码 object 名按 pet id 定死,存在就直接返回不重新生成 ——
微信侧有日调用配额,不能每次点都烧一次。

⚠️ getwxacodeunlimit 要求 page 在**已发布**的小程序版本里。开发/未发布时返回
errcode 41030,实测确认。这时身份卡照常出、只是没码(qr_ready=false),
发布后自动就有,不用改代码。best-effort,取不到不算错。

service/idcard.go —— 组装卡片内容。身份 ID 用「宠物雪花 id 的数字 + 生日」
拼成 18 位、每 4 位空一下,纯装饰不入库不校验,同一只每次都一样。
介绍按物种给默认(汪星人/喵星人来地球啦~)。有效期用生日起算。

GET /api/pets/:id/id-card
storage 加了 Exists(StatObject),生成前先查。

## 前端 pages/idcard
离屏 canvas 2d 画卡,导出成图展示 + 存相册 + 分享(open-type=share,
imageUrl 用画好的卡当封面)。

两张远程图(头像 + 小程序码)都用 node.createImage() 异步加载,
**Promise.all 等两张都就绪再开画** —— 否则小程序码会画不上或画一半
(规划里专门点过名的坑)。任一张加载失败 resolve(null),缺图也照画:
头像缺→画物种 emoji,码缺→画「小程序码 待发布」占位框。

存相册的权限被拒过一次后 wx.authorize 不再弹,走 openSetting 引导(同海报那套)。

绘制复用了 bottom-sheet 里 poster 的 canvas 模式(dpr 放大、roundRect、
canvasToTempFilePath),但 poster 只画文字不画远程图,这里的双图加载是新写的。

入口:「我的」→ 身份卡,用当前选中的宠物。

## 验证(预生产库实跑)
  id-card 接口返回:姓名/性别/品种/生日/介绍/身份ID/有效期 全对
  身份 ID = 3410 4333 1420 2503 17(宠物id数字+生日,稳定)
  qr_ready = false,日志确认 41030 invalid page(小程序未发布,预期)
  canvas 版式用 HTML 复刻确认过:未发布=占位、发布后=真码

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 16:48:16 +08:00
Blizzard 048408b0e9 fix(fe): 报告页/我的 底部被 tabBar 遮住
no-fab 的底部留白是 60rpx,那是给二级页(无 tabBar)用的。报告页和「我的」
是 tab 页,底下有原生 tabBar(高 108rpx),60rpx 让不开,最后一张卡/入口
被 tabBar 压住 —— 报告页的「全部记录」就点不到。

加 --pad-b-tab(150rpx + 安全区)和 .tab-nofab 类,报告页和我的改用它。
no-fab(60rpx)留给真正的二级页(record/plan/expense/history/settings…)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 16:05:14 +08:00
Blizzard 7abcc0dd2d refactor(fe): 报告页重构成数据看板,历史页降级成「全部记录」
## 之前报告页的问题
它是个顶级 tab,却只有四张薄卡,而真正的分析全被埋起来:
  - 养宠账单里「记一笔」开 cost 弹层 —— 那分支上一轮随记录表单搬走了,
    点了开空弹层,是个断按钮
  - 养宠账单是我新建花销页的一个残缺子集,重复
  - 后端有 6 条洞察 + 体重曲线,全在「历史页」,报告页只用一行链过去
  - 健康摘要四行手拼字符串,很薄

## 报告 = 数据看板
把埋在历史页的分析提上来,报告页成为真正「看数据」的地方:
  本周概览   周报小结 + 完成/体重变化/高风险三个数 + 生成分享卡片
  健康洞察   6 条洞察直接铺在报告页(按 alert>warn>info 上色),
             点一条跳去记那一类。这是看板的主角
  体重趋势   把那张 SVG 曲线图提上来(点圆点看每次记录)
  健康摘要   疫苗/驱虫/体重/异常四行 + 导出就医摘要
  养宠花销   只给「本月 ¥X + top 类别 + 分类条」概要,点整卡进花销页,
             不再内嵌半套花销 UI,断掉的「记一笔」删了
  全部记录   一行入口进历史页

## 历史页降级成「全部记录」
洞察和体重曲线搬走了,历史页只留「时间轴流水 + 类型筛选」——
分工清晰:报告=看分析,全部记录=翻流水。nav 标题改成「全部记录」,
去掉不再用的 bottom-sheet / fab / seg-tabs 之外的东西。

体重曲线的「记一笔」原来开 weight 弹层(已删),改成跳
addrecord?type=weight;洞察点击也从开弹层改成跳 addrecord。

## 顺手
报告页去掉了 Pro 会员占位卡(支付未接入,就是个营销占位),
接入支付时再加回来。

## 验证(预生产库实跑)
  周报         需要关注 / 完成0 / 高风险1,小结文案对
  洞察         1 条(食便相关),带 level=warn + action=food + 依据
  体重趋势     字段验证只有 1 个点 → 曲线走空态「先记录几次」
  健康摘要     疫苗 0/3 即将到期、驱虫下次日期、体重稳定增长、异常 1 次
  账单         本月 ¥188、top 医疗、2 个类别
  5 个接口全部返回真数据

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 15:03:47 +08:00
Blizzard 6a132d13bd style(fe): 记录页从「肥色块」改成白卡收纳
截图那个真的丑:.quick 是 128rpx 的大方块,整格铺 tone-N 的浅色底,
四个排一行就是一片肥色块,还直接浮在页面渐变上、没有卡片收纳,
不完整的行还留大缺口,整体像一张配色测试表。

改成 preview-v3(你当时认可的那版)的做法:
  每组一张白卡收纳(.card)
  颜色只集中在图标那个 96rpx 小圆角块上(.rec-ic + tone-N)
  标签用纯深色,不跟 tone 变 —— 四组底下的字统一深灰,才不花
  组标题一根同色系竖条 + 组名

.quick / .quick-grid / .tg 现在只有记录页用,直接换成 record 页私有的
.rec-* 类,不动全局。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 14:26:00 +08:00
Blizzard 6fd4977f46 feat(fe): 建档挑方案、计划页套方案、阶段漂移提示
后端上一轮做完了但小程序上看不到,这次接上。

## 建档第四步:挑方案
方案按阶段取,所以必须排在「资料」之后(阶段是第三步定的)。卡片上按重复方式
分开报数(每天 3 项 / 每周 2 项 / 一次性 2 项),不报一个总数——4 条「每天」
套一整月就是 120 多条,只给总数用户会以为出 bug。

「先空着,我自己排」是个平等的选项,和方案卡长一样、就在下面一眼能看到,
不是藏起来的退路:已经养熟的宠物主人有自己的节奏,硬塞一套只会被删掉。

默认选第一套——多数用户是新手,给一个合理默认比让他面对空白好。

编辑档案时不出现第四步:改档案不该顺手改计划。

套方案失败不算建档失败:档案已经建好了,方案之后在计划页还能套,
不该把用户退回表单。

## 计划页:空月份和平时都能套
空月份的提示条带「套一套方案」按钮 —— 空着让用户从零排,多数人会直接退出去。
但「+ 加一件」始终在,不能只给套用。

浮层里写明「套用是往里加,不会覆盖你已经排好的」,因为服务端就是按
「日期+标题」去重的,这句话是真的。套完 toast 报排了几件;一件都没排
(全都已存在)时说「这个月已经有这些安排了」,不说「成功」。

## 阶段漂移提示
首页门面卡下面一张卡:「钞票已经 17个月,从幼年期进入成年期了」,
带上新阶段的划分依据、养护重点和体型说明,点进去到建档页改。

用主色不用红色 —— 这是「可以做一下」不是「出问题了」。
改完回首页 onShow 重拉一次,卡片自然消失。

不在首页直接改阶段:改完要不要套新方案是同一件事,放在建档页一起做才连贯。

## 顺手把合并的尾巴清了
manageTasks 那一支删了:它管的是 DailyTask,而今日任务已经并进计划节点,
增删改都在计划页。留着会出现「这里加的任务」和「计划页加的节点」进不同的表。

连带清掉 7 个死方法 + taskSheets + 一个死 require(简易表单那套早随记录表单
搬到 pages/addrecord 了)。首页现在一个弹层都不开,bottom-sheet 组件也去掉了。

弹层累计:js 1110 → 689 行,wxml 485 → 278 行。

## 验证(预生产库实跑)
  建档四步    6 个月柯基 → 幼年期 → 拉到「幼犬标准照护」→ 套用本月 7 条
              → 首页今日任务 4 条
  先空着      今日任务 0 条,疫苗驱虫提醒仍然建
  计划页套用  0 → 7 条;重复套用 0 条(去重生效)
  漂移检测    17 个月柯基存着幼年期 → drifted=true,给出依据/重点/体型
              改成成年期 → drifted=false
              没生日 → 不提示(算不出就不猜)
              「刚到家」→ 不提示(叠加层不是年龄段)

第一版验证脚本把阶段改成了和算出来一样的值,drifted=False 是对的,
但我的 print 无条件打了提示文案,看着像 bug。重测才验到真的。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 12:59:27 +08:00
Blizzard cff6982613 chore(admin): 删掉停用的老方案,养护方案页按猫狗分 tab
## 停用的 8 套直接删了
上一个提交把老方案(按 3 段配的)改名停用没删,理由是「万一新内容有问题
还能翻回去看」。你要求删掉,删了。

走 service 的 DeleteTemplate 而不是直接删主表:明细要跟着一起清。
复查孤儿明细 0 条。剩 10 套(5 阶段 × 2 物种,各一套)。

已套用出去的计划节点不受影响 —— 套用时就展开成实体行、和模板断开了。

## 按猫狗分 tab
混在一起 10 套要上下找,而且阶段名两边一样(幼年期/青年期…),扫一眼分不清
哪套是猫的。tab 上带条数,「阶段」列不再重复物种。

顺带两处:
  行按阶段顺序排 —— 数据库按 sort 排,但 sort 是全局的,分物种看时会跳号
  新建时默认跟当前 tab 的物种,省一步点击

品种管理页本来就有猫狗 tab;记录事项页不分物种(记录类型猫狗共用)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 12:53:22 +08:00