Blizzard
|
60ee9d4bbc
|
feat(be): 记录类型挪进数据库,后台可配 + 15 种新类型
## 为什么
9 种记录类型全是低频医疗和记账(疫苗一年一次、驱虫一季一次、体检更少),
用户今天打开 App 大概率没什么可记,时间轴是空的。竞品 35 种里有 26 种是
高频日常(洗澡/剪指甲/换猫砂/喝水/洗食盆),那才是每天打开的理由。
## 一个比预想好得多的发现
本来担心加类型会踩到分析逻辑。把那 9 个常量的引用全捞了一遍,结论是不会:
weight record.go:83 回写宠物体重;home/insight/report 的体重趋势与基准
food + poop insight.go:130 食便相关性
symptom insight.go:160 症状聚类;report 高风险计数
cost report.go:99 消费统计
vaccine report.go:137 疫苗完成度
deworm/medicine/photo 没有任何特殊分支
这些分支全都是「按某个具体常量过滤」,没有一处是 switch 全枚举、也没有
default 兜底。CreateRecord 更是完全没有 type 白名单校验。所以新增类型
不可能碰到任何现存逻辑——一行分析代码都不用改。
于是分工是:
record_types 表 负责「展示什么、能记什么」
那 9 个常量 负责「哪几种参与分析」
两者各管一段,常量一个都没删。
## 表设计
code / label / icon / group_key / sort / enabled / form / locked。
group_key 而不是 group:group 是 MySQL 保留字,GORM 会加反引号所以能跑,
但手写 SQL 排查时很容易踩。
form 区分 full(弹层里有专用 wx:elif 分支)和 simple(时间+备注+照片)。
15 种新类型全是 simple——下一步在弹层加一个通用分支吃掉它们,不然 28 个
分支再加 15 个会把 bottom-sheet 写到 1800 行。
locked 给那 9 种:有代码分支依赖、且被 care_template_items.sheet_type 引用。
## 两条硬拦在 service 层的规则
1. locked 的删不掉
2. 已经有记录的删不掉(删了历史记录会变孤儿)
想让它从记录页消失应该用 enabled=false,历史记录仍能正常显示。
都在 service 层拦,不是靠前端隐藏按钮。改 code 同样受 2 的约束——
code 是落库值,改了历史记录会对不上任何类型。
## bootstrap 的取舍
文章和养护模板当初按你的要求从代码里挪走了,这次 24 种类型仍然放在 seed 里,
因为它不是内容而是结构:表空着记录页一个可记事项都没有,App 直接不能用。
和管理员账号一样,只在表**完全为空**时铺一次,之后一切以数据库为准。
表非空就完全不碰,否则后台删掉的类型会每次重启自己长回来。
ListRecordTypes 在表为空时返回空数组 + 打 warn,不硬编码兜底一份——
那等于把「可配置」又变回代码常量,下次改配置的人会发现改了没用。
## 图标
新增 15 个(iconfont.wxss 40 → 55),全部取自本地那份 tabler-icons-3.46.0
真源,不是凭记忆画路径。已解码抽检确认路径非空。
## 验证(生产库实跑)
建表 + 24 条 bootstrap 一次到位,分组 daily6/health7/care6/clean5
locked 9 个、simple 表单 15 个
规则 1 删 weight → 「有统计和分析逻辑依赖它,不能删」
规则 2 新增 nose 成功 → 重复 code 报错 → 删除成功
规则 3 造 1 条 tmptest 记录 → 删类型被拦;删掉记录后再删 → 成功;残留 0
规则 4 停用「美容」→ 小程序端洗护组只剩 5 项;恢复后回到 6 项
规则 3 一开始没真验到:库里唯一的记录类型是 weight,locked 先拦住了,
「已有记录」那个分支根本没走到。补了个造真记录的测试才算验过。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-30 09:24:24 +08:00 |
|
Blizzard
|
4f6f0f632e
|
refactor(be): 文章内容从代码里移出,改为直接同步数据库
几百字的正文塞进 Go 源文件,既看不清 diff 也没法在后台改完再同步
回来——内容和代码本来就是两条生命周期。
- 删掉 articles_more.go(16 篇)
- seed.go 只保留 seedAdmin,去掉 seedArticles / builtinArticles /
backfillArticleContent(后者是给早期无正文文章补内容的一次性逻辑,
已无意义)
数据已经在库里,删代码不影响:预生产 20 篇文章原样在,小程序端照常
读得到。上线时手动同步这张表即可。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-29 13:53:35 +08:00 |
|
Blizzard
|
7159930d9c
|
feat(admin): 随机昵称 + 建档数统计 + 帖子发布时间 + 16 篇新文章
## 新用户昵称
微信登录拿不到昵称(要用户主动授权),原来一律叫「微信用户」,
社区里一屏全是同名,后台也没法区分。改成随机生成「铲屎官12138」
这种形式:10 个前缀 × 5 位数字,落库前查重,撞了重试。
新增 users.nickname_auto 标记这个昵称是系统生成的。原来判断该不该
用微信授权昵称覆盖,靠的是「昵称是不是等于『微信用户』」这个字符串
比较,改成随机昵称后这招就失效了。有标记位才能安全覆盖,同时保证
用户自己改过的昵称不会被冲掉(改昵称时会把标记置 false)。
## 用户管理
加「宠物档案」列,显示每个用户建了几个档。用一次 GROUP BY 查完
当页所有人,不是每行一次 count——那会是 N+1。
## 帖子审核
加发布时间列。今天的显示「今天 14:48」,昨天的显示「昨天」,
更早的显示日期——审核时关心的是「多久以前发的」而不是完整时间戳。
## 文章
新增 16 篇,连同原有 4 篇共 20 篇,每篇 400-570 字:
猫 5 篇(新猫到家第一周 / 猫砂盆 / 公猫尿闭 / 掉毛毛球 / 老年猫信号)
狗 5 篇(社会化关键期 / 定点排便 / 遛狗时长 / 刷牙 / 中暑防护)
通用 6 篇(体重趋势 / 驱虫周期 / 绝育 / 急诊清单 / 就医准备 / 养宠预算)
沿用和 AI 助手一样的安全护栏:不做诊断、不给药物剂量,凡是可能
延误病情的都写清「什么时候必须去医院」。犬用驱虫药对猫的致死风险
这类真实事故也写进去了。
seedArticles 从「库空才插」改成「按标题补缺失」,以后往内置清单加
文章,老库启动也能拿到。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-29 12:55:22 +08:00 |
|
Blizzard
|
3fde90e97b
|
feat: 补齐五块缺失功能(记录丢数据/文章正文/提醒管理/我的页入口/分享/关注)
P0 修数据问题
- 记录弹层有 5 个输入框从未绑定,用户填的便便备注、饮食内容、药品名称、
剂量、消费备注全部丢弃;用药记录因此只存下「用药记录」四个字。已全部绑定并入库
- 异常观察保存时写死「风险中」,AI 实际判定的等级被丢掉。改为使用 riskData
的真实 risk_level,并把成因与建议存进备注
文章正文
- 早期 seed 的 4 篇文章 Content 全空,点开只是打开关联记录弹层,内容运营等于白做
- 补写 4 篇真实正文(疫苗驱虫/软便判断/换粮方案/养宠花销),遵循不诊断、
异常必提就医的护栏;对已存在的空正文做幂等回填
- 新增文章详情页,学习页与首页卡片改为打开正文
提醒管理
- 后端 CRUD 早已具备但小程序只读,用户改不了疫苗驱虫日期。提醒弹层支持增删改
- 修复后端 UpdateReminder 漏掉 type 字段导致改类型不生效
「我的」页 7 个死入口接活
- 提醒设置、健康记录、多宠物管理、会员权益分别落到对应功能
- 数据导出:汇总档案与记录为文本,可复制发给医生
- 意见反馈:新增 feedback 表与提交接口,后台加「意见反馈」管理页
- 关于我们:应用说明与免责声明
分享
- 各页面补 onShareAppMessage/onShareTimeline
- 帖子分享按钮改用微信原生 open-type="share",删除原来点了没反应的空壳弹层
社区关注
- 新增 follows 表与关注/取关接口,「关注」tab 此前等同「推荐」,
现只显示已关注用户的帖子;帖子头部可直接关注,标记 followed / is_self
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-07-25 18:11:08 +08:00 |
|
Blizzard
|
609f7d06cf
|
init: 毛孩子计划 小程序 + Go 后端 + 内嵌后台
- pets-fe: 微信原生小程序(首页/计划/记录/报告/社区/引导),
服务端驱动、无假数据;弹层改用 scroll-view,打开时隐藏自定义 tabBar
- pets-be: Gin + GORM(MySQL, sundynix_ 前缀) + MinIO,统一响应/分页,
微信 code2session 登录,provider-neutral AI(DeepSeek),go:embed React 后台
- 修复:分段选择类型不匹配(字符串 vs 数字)导致选不中
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-07-03 15:36:55 +08:00 |
|