HarmonyOs应用《日记本》开发第11篇 - DiaryModel 数据模型设计 数据模型是任何应用的基础。在日记项目中DiaryModel.ets定义了核心的数据结构和辅助函数它是 UI 层和存储层之间的桥梁。本篇将深入解析日记项目的数据模型设计。完整代码/** * 日记数据模型 *//** * 心情/天气选项接口 */exportinterfaceMoodWeatherItem{key:string;label:string;emoji:string;}exportclassDiaryItem{id:string;title:string;content:string;date:string;// 日期 YYYY-MM-DDcreateTime:number;// 创建时间戳updateTime:number;// 更新时间戳mood:string;// 心情: happy / calm / sad / excited / angryweather:string;// 天气: sunny / cloudy / rainy / snowy / overcastconstructor(id:string,title:string,content:string,date:string,createTime:number0,updateTime:number0,mood:stringcalm,weather:stringsunny){this.idid;this.titletitle;this.contentcontent;this.datedate;this.createTimecreateTime;this.updateTimeupdateTime;this.moodmood;this.weatherweather;}}/** * 心情枚举 */exportconstMoodList:MoodWeatherItem[][{key:happy,label:开心,emoji:},{key:calm,label:平静,emoji:},{key:excited,label:兴奋,emoji:},{key:sad,label:难过,emoji:},{key:angry,label:生气,emoji:},];/** * 天气枚举 */exportconstWeatherList:MoodWeatherItem[][{key:sunny,label:晴,emoji:☀️},{key:cloudy,label:多云,emoji:⛅},{key:overcast,label:阴,emoji:☁️},{key:rainy,label:雨,emoji:️},{key:snowy,label:雪,emoji:❄️},];/** * 根据key获取心情信息 */exportfunctiongetMoodByKey(key:string):MoodWeatherItem{for(letitemofMoodList){if(item.keykey){returnitem;}}returnMoodList[1];// 默认平静}/** * 根据key获取天气信息 */exportfunctiongetWeatherByKey(key:string):MoodWeatherItem{for(letitemofWeatherList){if(item.keykey){returnitem;}}returnWeatherList[0];// 默认晴}DiaryItem 类设计字段解析字段类型说明示例值idstring唯一标识diary_1721856000000_42titlestring日记标题美好的一天contentstring日记内容今天去公园散步...datestring日记日期2026-07-24createTimenumber创建时间戳1721856000000updateTimenumber更新时间戳1721856000000moodstring心情标识happyweatherstring天气标识sunny日期格式设计date:string;// 日期 YYYY-MM-DDcreateTime:number;// 创建时间戳毫秒updateTime:number;// 更新时间戳毫秒为什么日期用字符串而时间用时间戳date字符串用户选择的日记日期格式固定为YYYY-MM-DD便于显示和比较createTime/updateTime时间戳系统自动生成的时间用于排序和精确记录// 日期比较字符串即可if(item.datetoday){...}// 时间排序需要时间戳list.sort((a,b)b.updateTime-a.updateTime);构造函数的默认值设计constructor(id:string,title:string,content:string,date:string,createTime:number0,updateTime:number0,mood:stringcalm,// 默认平静weather:stringsunny// 默认晴天){// ...}默认值的选择逻辑字段默认值原因id空由存储层自动生成title允许无标题日记content允许无内容日记date由调用方设置当前日期createTime0由存储层自动设置updateTime0由存储层自动设置moodcalm平静是中性默认值weathersunny晴天是积极默认值构造函数的使用方式// 1. 新建日记在 DiaryEdit 页面constdiarynewDiaryItem(this.diaryId,// 编辑时有值新建时为空this.title.trim(),this.content.trim(),this.date,0,// createTime 由存储层设置0,// updateTime 由存储层设置this.mood,this.weather);// 2. 从 JSON 反序列化constlist:ArrayDiaryItemJSON.parse(raw);// JSON.parse 会创建普通对象但结构与 DiaryItem 一致MoodWeatherItem 接口设计接口定义exportinterfaceMoodWeatherItem{key:string;// 唯一标识label:string;// 中文标签emoji:string;// Emoji 图标}复用设计心情和天气共用同一个接口因为它们的数据结构完全一致// 心情列表exportconstMoodList:MoodWeatherItem[][{key:happy,label:开心,emoji:},{key:calm,label:平静,emoji:},{key:excited,label:兴奋,emoji:},{key:sad,label:难过,emoji:},{key:angry,label:生气,emoji:},];// 天气列表exportconstWeatherList:MoodWeatherItem[][{key:sunny,label:晴,emoji:☀️},{key:cloudy,label:多云,emoji:⛅},{key:overcast,label:阴,emoji:☁️},{key:rainy,label:雨,emoji:️},{key:snowy,label:雪,emoji:❄️},];设计优势代码复用一套接口服务两种数据UI 复用天气和心情选择器可以使用相同的渲染逻辑扩展方便新增心情或天气只需在数组中添加元素在 UI 中的使用// 天气选择器ForEach(WeatherList,(item:MoodWeatherItem){Column(){Text(item.emoji).fontSize(28)Text(item.label).fontSize(12).fontColor(this.weatheritem.key?#FF6B6B:#999)}.onClick((){this.weatheritem.key;})})// 心情选择器完全相同的结构ForEach(MoodList,(item:MoodWeatherItem){Column(){Text(item.emoji).fontSize(28)Text(item.label).fontSize(12).fontColor(this.mooditem.key?#FF6B6B:#999)}.onClick((){this.mooditem.key;})})辅助函数设计getMoodByKeyexportfunctiongetMoodByKey(key:string):MoodWeatherItem{for(letitemofMoodList){if(item.keykey){returnitem;}}returnMoodList[1];// 默认平静}使用场景根据存储的 mood 字符串值获取对应的标签和 emoji 用于显示。// 在日记卡片中显示心情 emojiText(getMoodByKey(item.mood).emoji).fontSize(18)// 在详情页显示心情标签Text(getMoodByKey(this.diary!.mood).label).fontSize(13).fontColor(#888)getWeatherByKeyexportfunctiongetWeatherByKey(key:string):MoodWeatherItem{for(letitemofWeatherList){if(item.keykey){returnitem;}}returnWeatherList[0];// 默认晴}使用场景与 getMoodByKey 类似用于天气信息的显示。// 在日记卡片中显示天气 emojiText(getWeatherByKey(item.weather).emoji).fontSize(18).margin({right:8})默认值的选择returnMoodList[1];// 默认平静returnWeatherList[0];// 默认晴为什么选择这些默认值MoodList[1]是平静——中性、安全的默认心情WeatherList[0]是晴——积极、常见的默认天气如果数据损坏或 key 不匹配至少显示一个合理的默认值。模块导出设计// 导出接口exportinterfaceMoodWeatherItem{...}// 导出类exportclassDiaryItem{...}// 导出常量exportconstMoodList:MoodWeatherItem[][...];exportconstWeatherList:MoodWeatherItem[][...];// 导出函数exportfunctiongetMoodByKey(key:string):MoodWeatherItem{...}exportfunctiongetWeatherByKey(key:string):MoodWeatherItem{...}在其他文件中的导入// Index.etsimport{DiaryItem,getMoodByKey,getWeatherByKey}from../model/DiaryModel;// DiaryEdit.etsimport{DiaryItem,MoodList,WeatherList,MoodWeatherItem}from../model/DiaryModel;// DiaryDetail.etsimport{DiaryItem,getMoodByKey,getWeatherByKey}from../model/DiaryModel;// DiaryStore.etsimport{DiaryItem}from../model/DiaryModel;按需导入每个文件只导入它需要的部分减少不必要的依赖。数据流图DiaryModel.ets ┌─────────────────────────────────────┐ │ DiaryItem (class) │ │ MoodWeatherItem (interface) │ │ MoodList / WeatherList (constants) │ │ getMoodByKey / getWeatherByKey │ └──────────────┬──────────────────────┘ │ ┌──────────┼──────────┐ │ │ │ ▼ ▼ ▼ ┌───────┐ ┌────────┐ ┌─────────┐ │ Index │ │DiaryEdit│ │DiaryDetail│ │ 显示 │ │ 编辑 │ │ 详情 │ └───────┘ └────────┘ └─────────┘ │ │ │ └──────────┼──────────┘ │ ▼ ┌─────────────┐ │ DiaryStore │ │ 存储/读取 │ └─────────────┘小结DiaryModel.ets是日记项目数据架构的核心通过合理的设计实现了清晰的类结构DiaryItem 封装了日记的所有属性接口复用MoodWeatherItem 同时服务心情和天气安全的默认值构造函数和辅助函数都提供合理默认值便捷的辅助函数getMoodByKey/getWeatherByKey 简化 UI 显示模块化导出按需导入降低耦合