宠物食谱查询工具 v1.2.0:从"能不能吃"到"该怎么喂"
宠物食谱查询工具 v1.2.0:从"能不能吃"到"该怎么喂"
2026-09-04 开发日志
今天给「宠物食谱查询工具」做了一次比较大的更新:食材库从 22 种扩到 66 种,新增了宠物档案和按年龄阶段的喂养指南。这篇博客记录一下这次更新的思路和实现。
起因
工具的第一个版本只有 22 种狗食材。用了一段时间发现两个问题:
-
猫呢? 家里养猫的朋友打开工具一看,全是狗的食材,完全用不了。猫是专性肉食动物(obligate carnivore),饮食需求和狗差异巨大——比如百合对猫是致命的,对狗却没什么大事。混在一起不行,必须分开。
-
幼犬和老年犬吃一样的? 同样是鸡胸肉,幼犬期可以频繁喂来支持生长,老年犬就要控制频率关注消化。工具只告诉你"能吃",不告诉你"现在这个阶段该怎么吃",信息只给了一半。
这两个问题决定了这次更新的两个主要方向:扩充猫食材 和 年龄阶段喂养指南。
一、食材库扩充:22 → 66
思路
每种食材的数据结构不变,还是原来的字段:
{
"name": "鸡胸肉",
"species": "dog", # dog / cat
"safety": "safe", # safe / conditional / unsafe
"preparation": "煮熟去骨",
"interval_days": 2,
"portion_advice": "每餐 10-15% 体重",
"nutrition": "高蛋白低脂肪",
"cautions": "避免生食,沙门氏菌风险",
"category": "肉类"
}
关键设计:species 字段做猫狗分离。搜索时按种类过滤,猫的主人不会看到狗的食材,反之亦然。
新增内容
狗食材(22 → 42,新增 20 种):
补充了常见的蔬菜水果(西兰花、南瓜、蓝莓、苹果等)、肉类(三文鱼、牛肉、鸭肉等)、以及几个容易踩坑的——木糖醇(花生酱常见载体,对狗致命)、夏威夷果、酒精。
猫食材(0 → 24,全新):
猫的食材库从零开始建。重点标注了几个猫特有的危险项:
- 百合:所有部位有毒,连花粉落在毛上被舔食都能致命。这个必须红色标注,不是"谨慎",是"绝对不行"。
- 洋葱大蒜:破坏猫的红细胞,导致溶血性贫血。
- 生鸡蛋:抗生物素蛋白影响猫的皮毛健康。
- 巧克力:可可碱对猫的毒性比狗更强,因为猫体型更小。
安全的部分主要是煮熟的肉类(鸡胸、三文鱼、牛肉)和少量蔬菜(南瓜助消化、蒸胡萝卜)。
验证
扩完之后跑了一下去重检查,确认没有名字重复的食材。测试从 24 个更新到匹配 66 条数据的新断言,全部通过。
二、宠物档案与年龄阶段喂养
选择方案
这个功能我考虑了三种方案:
| 方案 | 做法 | 优点 | 缺点 |
|---|---|---|---|
| A. 知识页 | 静态页面展示各阶段喂养建议 | 简单 | 和实际宠物脱节 |
| B. 档案表 | 存出生日期,自动算阶段,集成到提醒 | 个性化 | 需要建表、改 UI |
| C. 标签化 | 食材按年龄阶段标安全/不安全 | 最精细 | 数据量爆炸,维护成本高 |
选了 方案 B。理由:A 太被动,用户不会主动去查一个知识页;C 对每种食材 × 每个阶段都要标注,66 × 6 = 396 条规则,维护不动。B 刚好——存个出生日期,自动算阶段,在提醒页展示当前阶段的建议,性价比最高。
数据库设计
新增 pets 表:
CREATE TABLE IF NOT EXISTS pets (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
species TEXT NOT NULL, -- dog / cat
birth_date TEXT, -- YYYY-MM-DD
breed TEXT,
weight_kg REAL,
notes TEXT
)
一个设计决策:feeding_log.pet_name 是自由文本,不是指向 pets.id 的外键。这样删除宠物档案不会丢失喂食历史——档案是"锦上添花",不是喂食记录的前提。测试 test_delete_pet_keeps_feeding_log 专门守护这个行为。
年龄阶段定义
新建 age_guidance.py,定义狗和猫各三个阶段:
狗:
幼犬期 0-12 个月 — 少食多餐,每天 3-4 次,高蛋白高脂肪
成犬期 1-7 岁 — 每天 1-2 次,均衡饮食
老年期 7 岁以上 — 每天 2-3 次小份,低脂易消化,关注肾脏
猫:
幼猫期 0-12 个月 — 频繁喂食,高蛋白高脂肪支持生长
成猫期 1-7 岁 — 每天 2-3 次,高蛋白为主
老年期 7 岁以上 — 每天 3-4 次小份,易消化,关注肾脏和甲状腺
三个函数:
get_age_stage(birth_date, species)— 返回"junior"/"adult"/"senior"get_age_text(birth_date)— 返回可读的年龄描述,如"2 岁 3 个月"get_stage_info(stage, species)— 返回该阶段的完整喂养指南 dict
集成到提醒页
提醒页的改动最大:
- 宠物选择:优先从档案列表选(显示名字 + 种类 + 年龄),没有档案则回退到手动输入
- 年龄阶段卡片:选中有档案的宠物后,顶部显示一张信息卡片——当前阶段、建议频率、营养重点、注意事项
- 食材过滤:按宠物种类过滤,选了猫就只看猫的食材
- 推荐高亮:当前阶段推荐的食材类别标 ⭐
这样用户打开提醒页,一眼就能看到:这是只 2 岁的成犬,该吃均衡饮食,鸡胸肉可以喂(⭐推荐),但牛油果就别碰了。
三、测试
从 24 个测试增加到 42 个,新增 18 个:
- 7 个宠物档案 CRUD 测试(增删改查、删除档案保留喂食记录)
- 11 个年龄阶段计算测试(各阶段判定、无效输入处理、格式化输出)
全绿。
四、发布
代码推送到 GitCode 后,通过华为云高校运营平台的开放 API 发布了作品:
- 训练营:AI素养课ClassRoom第五期
- 作品陈列馆:https://gallery.developer.huaweicloud.com/gallery/002c6f4947400000
- 在线访问:通过 DevBridge 隧道暴露的临时地址
发布流程用了一个专门的 skill,自动处理了 IAM 身份验证、STS 临时凭证生成、截图、封面合成、详情文章打包。整个过程不需要手动填表单,API 一键提交。
下一步
- 食材库还可以继续扩,特别是猫的部分(目前 24 种,狗 42 种)
- 年龄阶段的分界点(1 岁、7 岁)对不同品种其实应该不同——大型犬 5 岁就算老年了,但这个需要品种数据支持,暂时用通用值
- 考虑加一个"喂食统计"页,按周/月汇总,看看是不是喂太多了
- 点赞
- 收藏
- 关注作者
评论(0)