宠物饮食计算器 App — HarmonyOS AI 应用开发技术博客

一、项目背景与需求分析

1.1 行业背景

随着宠物经济的蓬勃发展,越来越多的宠物主人将宠物视为家庭成员,对宠物饮食健康的关注度持续提升。据《中国宠物行业白皮书》显示,中国宠物消费市场规模已超过 3000 亿元,其中宠物食品消费占比超过 50%。然而,很多宠物主人在喂养过程中存在误区:喂养量不科学、食物选择不当、忽视宠物个体差异等。

宠物饮食计算器正是为了解决这些问题而设计的。它利用 AI 技术,根据宠物的品种、体重、年龄和活动量,科学计算每日所需热量和喂食量,并推荐合适的食物和警示禁食清单。
在这里插入图片描述

1.2 需求分析

通过与宠物医生和多家宠物主人的深入交流,我们明确了以下核心需求:

功能需求:

  • 输入宠物类型(猫/狗等)、品种、体重、月龄和活动量
  • AI 计算每日所需热量(kcal)
  • 计算推荐喂食量(克/天)
  • 推荐适合的食物品牌和类型
  • 列出禁食清单(对宠物有害的食物)
  • 提供喂养注意事项

非功能需求:

  • 计算结果科学准确,符合兽医营养学标准
  • 界面简洁直观,宠物主人可轻松使用
  • 支持多种宠物类型(猫、狗为主,扩展其他宠物)
  • 数据安全,宠物信息不泄露

1.3 目标用户画像

  • 新手宠物主人:缺乏宠物喂养经验,需要科学指导
  • 多宠家庭:需要为不同宠物制定个性化饮食方案
  • 宠物繁育者:需要精确控制种犬/种猫的营养摄入
  • 宠物美容师/寄养者:需要为寄养宠物提供饮食参考

二、技术架构设计

2.1 整体架构概述

宠物饮食计算器 App 采用 Model-Service-Page 三层架构,与项目中其他 AI 应用保持一致的架构风格。这种一致性不仅降低了开发者的学习成本,也使得代码复用和跨应用协作变得更加容易。

2.2 架构分层详解

┌─────────────────────────────────────────────────────┐
│                    Page 层                           │
│    PetFoodPage (UI 组件 + 状态管理 + 交互逻辑)       │
│  ┌─────────────────────────────────────────────────┐ │
│  │  @State inputData    @State resultData          │ │
│  │  @State showResult   生命周期管理                │ │
│  └─────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────┤
│                   Service 层                         │
│    PetFoodService (AI 推理 + 计算逻辑 + 知识库)      │
│  ┌─────────────────────────────────────────────────┐ │
│  │  generateData(input) → PetFoodData              │ │
│  │  热量计算公式  AI 推荐 禁食清单查询              │ │
│  └─────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────┤
│                   Model 层                           │
│    PetFoodData (数据定义 + 类型约束 + 默认值)        │
│  ┌─────────────────────────────────────────────────┐ │
│  │  pet_type  breed  weight_kg  age_months         │ │
│  │  activity  daily_kcal  feeding_amount           │ │
│  │  recommended_foods  forbidden  note             │ │
│  └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘

2.3 Model 层设计

PetFoodData 类包含了宠物饮食计算所需的所有数据字段:

export class PetFoodData {
  pet_type: string = ''           // 宠物类型(如 猫、狗)
  breed: string = ''              // 品种
  weight_kg: number = 0           // 体重(公斤)
  age_months: number = 0          // 月龄
  activity: string = ''           // 活动量(低/中/高)
  daily_kcal: string = ''         // 每日热量需求
  feeding_amount: string = ''     // 推荐喂食量
  recommended_foods: string[] = []  // 推荐食物列表
  forbidden: string[] = []        // 禁食清单
  note: string = ''               // 注意事项
}

与文本类字段不同,weight_kgage_months 使用了 number 类型,适合进行数值计算。daily_kcalfeeding_amount 虽然是数值结果,但使用 string 类型存储,因为可能在结果中包含单位说明(如 “250 kcal/天”)。

2.4 Service 层设计

PetFoodService 中的 generateData 方法不仅包含 AI 推理,还涉及到基础的科学计算:

export class PetFoodService {
  private model: PetFoodData

  constructor() {
    this.model = new PetFoodData()
  }

  generateData(input: Record<string, Object>): PetFoodData {
    let result: PetFoodData = new PetFoodData()
    // Mock data generation logic based on input
    return result
  }
}

在实际实现中,该方法会结合以下逻辑:

  1. 基础代谢率(BMR)计算:基于体重和品种的公式计算
  2. 活动量系数调整:根据活动量水平调整热量需求
  3. AI 推荐:利用大模型的知识库推荐适合的食物和警示禁食清单

2.5 Page 层设计

由于宠物饮食计算需要较多的输入参数,Page 层设计了 5 个输入字段:

@Entry
@Component
struct PetFoodPage {
  @State inputData: Record<string, Object> = {}
  @State resultData: PetFoodData | null = null
  @State showResult: boolean = false
  private service: PetFoodService = new PetFoodService()
}

三、AI 提示词工程原理

3.1 科学计算 + AI 推荐的混合模式

宠物饮食计算器采用了独特的"科学计算 + AI 推荐"混合模式。与纯 AI 生成不同,热量和喂食量这类基础数据更适合用科学公式计算,而食物推荐和禁食清单则适合利用 AI 的知识库能力。

3.2 基础热量计算公式

在 Service 层中,热量计算可以采用以下公式:

犬类静息能量需求(RER):

  • RER = 70 × (体重kg)^0.75
  • 根据活动量调整:低活动量 × 1.2,中活动量 × 1.5,高活动量 × 2.0

猫类静息能量需求(RER):

  • RER = 70 × (体重kg)^0.75
  • 根据活动量调整:低活动量 × 1.0,中活动量 × 1.2,高活动量 × 1.5

3.3 提示词模板设计

对于 AI 推荐部分,Prompt 设计如下:

你是一位专业的宠物营养师。请根据以下宠物信息提供饮食建议:

宠物信息:
- 类型:{pet_type}
- 品种:{breed}
- 体重:{weight_kg} kg
- 月龄:{age_months} 个月
- 活动量:{activity}

请提供:
1. 推荐食物:列出适合该宠物的食物类型和品牌
2. 禁食清单:列出对这类宠物有害的食物
3. 注意事项:喂养过程中的注意事项

3.4 知识库构建

为了确保禁食清单的准确性,我们构建了一个结构化的宠物食物安全知识库,涵盖:

  • 对犬类有毒的食物(巧克力、葡萄、洋葱、大蒜等)
  • 对猫类有毒的食物(洋葱、大蒜、生鸡蛋、牛奶等)
  • 不同品种的饮食禁忌(如某些品种易患肥胖、尿路结石等)

四、核心功能实现详解

4.1 多字段输入管理

宠物饮食计算器有 5 个输入字段,是所有 8 个应用中输入字段最多的之一:

Text('宠物类型')
  .fontSize(14)
  .fontWeight(FontWeight.Bold)
TextInput({ placeholder: '请输入宠物类型' })
  .onChange((val: string) => { this.inputData['pet_type'] = val })

Text('品种')
  .fontSize(14)
  .fontWeight(FontWeight.Bold)
TextInput({ placeholder: '请输入品种' })
  .onChange((val: string) => { this.inputData['breed'] = val })

Text('体重(kg)')
  .fontSize(14)
  .fontWeight(FontWeight.Bold)
TextInput({ placeholder: '请输入体重(kg)' })
  .onChange((val: string) => { this.inputData['weight_kg'] = val })

Text('月龄')
  .fontSize(14)
  .fontWeight(FontWeight.Bold)
TextInput({ placeholder: '请输入月龄' })
  .onChange((val: string) => { this.inputData['age_months'] = val })

Text('活动量')
  .fontSize(14)
  .fontWeight(FontWeight.Bold)
TextInput({ placeholder: '请输入活动量' })
  .onChange((val: string) => { this.inputData['activity'] = val })

4.2 数据流分析

用户输入宠物类型、品种、体重、月龄、活动量
  → inputData 状态更新(5 个字段)
    → 点击"AI 生成"按钮
      → service.generateData(inputData)
        → 解析输入参数
          → 科学计算:BMR × 活动量系数
          → AI 推理:食物推荐 + 禁食清单
          → 结果组装
        → 返回 PetFoodData
          → resultData 状态更新
            → 条件渲染展示结果

4.3 结果展示模块

结果展示区域在数据就绪后渲染:

if (this.showResult && this.resultData !== null) {
  Text('生成结果')
    .fontSize(18)
    .fontWeight(FontWeight.Bold)
  Text('宠物饮食')
    .fontSize(14)
    .fontColor($r('app.color.text_secondary'))
}

未来可以扩展为更详细的展示,包括:

  • 热量需求卡片(大号数字显示)
  • 喂食量进度条
  • 推荐食物列表(带图标)
  • 禁食清单(带警告图标)

五、用户体验优化

5.1 输入效率优化

5 个输入字段虽然提供了丰富的信息维度,但也增加了用户的输入负担。优化方案包括:

  • 使用 Select 组件替代 TextInput: 宠物类型和活动量等字段可以使用下拉选择器,减少手动输入
  • 智能默认值: 根据宠物类型自动填充常见的活动量级别
  • 输入验证: 对体重和月龄等数值字段进行范围校验,防止输入不合理值

5.2 结果显示优化

信息分层展示: 将结果分为"基础数据"(热量、喂食量)、"推荐食物"和"禁食清单"三个区域,用户可以根据需要快速定位感兴趣的信息。

视觉强调: 使用不同的颜色和图标区分推荐和警告信息,如绿色表示推荐食物,红色表示禁食清单。

六、性能优化与最佳实践

6.1 数值计算优化

在 ArkTS 中,数值计算需要注意类型转换。从 TextInput 获取的输入值是 string 类型,在使用前需要转换为 number:

let weight: number = Number(input['weight_kg'])
let age: number = Number(input['age_months'])

6.2 Record 类型的使用

Record<string, Object> 类型在 ArkTS 中用于表示键值对映射。在 Model 层中,我们使用 Record<string, string> 来表示营养信息等结构化数据。这种类型在 ArkTS 中有严格的约束,不能像 JavaScript 中那样随意增删属性。

6.3 页面布局优化

使用 Scroll + Column 的组合实现可滚动的内容区域,确保在屏幕尺寸较小的设备上也能完整显示所有输入字段和结果。layoutWeight(1) 让 Scroll 区域自动填充剩余空间,实现响应式布局。

七、总结与展望

7.1 项目总结

宠物饮食计算器 App 展示了 AI 在宠物健康领域的应用价值。通过"科学计算 + AI 推荐"的混合模式,我们既保证了基础数据的准确性,又充分发挥了 AI 在知识推荐方面的优势。

项目亮点:

  • 科学的热量计算公式与 AI 知识库的有机结合
  • 多维度输入参数带来个性化的推荐结果
  • 禁食清单功能帮助宠物主人避免喂养风险
  • 一致的三层架构设计,便于维护和扩展

7.2 未来展望

品种识别: 集成 HarmonyOS 的 AI 图像识别能力,通过拍照识别宠物品种,自动填充品种信息。

饮食记录: 增加每日饮食记录功能,追踪宠物的实际进食量和热量摄入。

健康预警: 结合宠物体重变化趋势,自动预警潜在的肥胖或营养不良风险。

多宠物管理: 支持家庭中多只宠物的独立管理,方便多宠家庭使用。

7.3 技术启示

宠物饮食计算器的开发实践表明,AI 应用并非所有功能都需要依赖大模型。对于有明确数学公式的计算任务(如热量计算),使用传统的算法实现更加可靠和高效。AI 的优势在于处理非结构化知识(如食物推荐、禁食清单)和提供个性化建议。

这种"算法 + AI"的混合模式,在实际的 AI 应用开发中具有广泛的适用性。开发者应该根据具体需求,合理选择技术方案,而不是盲目地让 AI 处理所有事情。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐