学习内容:
观看黑马程序员视频完成饮食记录业务层开发
学习时间:
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类型