记录:鸿蒙实战案例(源于黑马程序员视频)

学习内容:

观看黑马程序员视频完成饮食记录业务层开发


学习时间:

2024年6月22日


学习产出:

一.统计信息数据模型

定义statsInfo

export default class StatsInfo{
  /**
   * 当日摄入卡路里总量
   */
  intake: number = 0
  /**
   * 当日运动消耗能量
   */
  expend: number = 0
  /**
   * 当日摄入碳水总量
   */
  carbon: number = 0
  /**
   * 当日摄入蛋白总量
   */
  protein: number = 0
  /**
   * 当日摄入脂肪总量
   */
  fat: number = 0

  constructor(intake: number = 0, expend: number = 0, carbon: number = 0, protein: number = 0, fat: number = 0) {
    this.intake = intake
    this.expend = expend
    this.carbon = carbon
    this.protein = protein
    this.fat = fat
  }
}

修改GroupInfo

export default class GroupInfo<TYPE, ELEMENT> {
  /**
   * 分组类型
   */
  type: TYPE
  /**
   * 组内数据集合
   */
  items: ELEMENT[]


  constructor(type: TYPE, items: ELEMENT[]) {
    this.type = type
    this.items = items
  }
}

二.业务逻辑

RecordService,将数据库查询的数据转为页面所需要的数据

新增方法

页面用的是RecordVO,页面只需传PO所需数据,直接写入匿名对象的字段

insert(typeId: number, itemId: number, amount: number){
    // 1.获取时间 若没取到则获取今天的日期
    let createTime = (AppStorage.Get('selectedDate') || DateUtil.beginTimeOfDay(new Date())) as number
    // 2.新增
    return RecordModel.insert({ typeId, itemId, amount, createTime })
  }

删除

deleteById(id:number){
    return RecordModel.deleteById(id)
  }

查询

async queryRecordByDate(date: number): Promise<RecordVO[]>{
    // 1.查询数据库的RecordPO
    let rps = await RecordModel.listByDate(date)
    // 2.将RecordPO转为RecordVO
    return rps.map(rp => {
      // 2.1.获取po中的基本属性
      let rv = {id: rp.id, typeId: rp.typeId, amount: rp.amount} as RecordVO
      // 2.2.查询记录项
      rv.recordItem = ItemModel.getById(rp.itemId, rp.typeId !== RecordTypeEnum.WORKOUT)
      // 2.3.计算热量
      rv.calorie = rp.amount * rv.recordItem.calorie
      return rv
    })
  }

计算 StatsInfo

  calculateStatsInfo(records:RecordVO[]):StatsInfo{
    //1.准备结果
    let info=new StatsInfo()
    if(!records||records.length<=0){
      return info
    }
    //2.计算统计数据
    records.forEach(r=>{
      if(r.typeId===RecordTypeEnum.WORKOUT){
        //运动,累加消耗热量
        info.expend+=r.calorie
      }else {
        //食物,累加摄入热量,蛋白质,碳水,脂肪
        info.intake+=r.calorie
        info.carbon+=r.recordItem.carbon
        info.protein+=r.recordItem.protein
        info.fat+=r.recordItem.fat
        }
    })
    //3.返回
    return info
  }

 计算 GroupInfo

  calculateGroupInfo(records:RecordVO[]):GroupInfo<RecordType,RecordVO>[]{
    //1.创建空的记录类型分组
    let groups=RecordTypes.map(RecordType=>new GroupInfo(RecordType,[]))
    if(!records||records.length<=0){
      return groups
    }
    //2.遍历所有饮食记录
    records.forEach(record=>{
      //2.1把每个记录存入其对应类型的分组中
      groups[record.typeId].items.push(record)
      //2.2计算该组的总热量
      groups[record.typeId].calorie+=record.calorie

    })
    return groups

  }

注:AppStorage.Get('selectedDate')的结果不一定是number类型,要将其转为number类型

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值