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 显示模块化导出按需导入降低耦合

相关新闻

智能专业的防作弊功能体系:在线笔试系统让招聘笔试更高效、公正

智能专业的防作弊功能体系:在线笔试系统让招聘笔试更高效、公正

在当今竞争激烈的社招校招市场中,如何确保招聘流程的公正性、高效性和安全性,成为众多企业和人力资源部门关注的焦点。考试云,作为在线考试系统的佼佼者,以其强大的功能、灵活的招聘场景应用以及丰富的客户案例,为企业…

2026/7/27 5:49:42 阅读更多 →
大型储煤棚高精度定位为什么选核芯物联蓝牙AOA?抛开参数内卷,聊聊落地优先的真实选型逻辑

大型储煤棚高精度定位为什么选核芯物联蓝牙AOA?抛开参数内卷,聊聊落地优先的真实选型逻辑

工业室内定位行业干货|能源棚库场景技术路线客观复盘 深耕工业室内定位行业多年,我们常年和全国各地能源行业集成商、工程伙伴深度交流。北方能源片区大面积、超高储煤棚场景的定位需求逐年激增,不少同行在技术路线选型时容易陷入参数误区&am…

2026/7/27 5:49:42 阅读更多 →
C++ std::divides函数对象:从除法运算符到泛型编程的核心组件

C++ std::divides函数对象:从除法运算符到泛型编程的核心组件

1. 项目概述:从“除法”到“可调用的对象”在C的日常开发中,尤其是涉及到算法、泛型编程和STL(标准模板库)的深度使用时,我们常常会遇到一个看似简单却蕴含深意的需求:如何将一个运算符,比如除法…

2026/7/27 5:49:42 阅读更多 →

最新新闻

Python+Flask构建旅游评论智能分析系统

Python+Flask构建旅游评论智能分析系统

1. 项目概述:旅游评论智能分析系统的价值与应用场景每次旅行前刷几百条评论却依然难以决策?这个用PythonFlask构建的旅游评论分析系统,正是为了解决这个痛点而生。我在实际开发中发现,传统人工阅读评论的方式存在三大缺陷&#xf…

2026/7/27 6:02:47 阅读更多 →
构建高可用AI服务网关:多后端负载均衡与故障转移实践

构建高可用AI服务网关:多后端负载均衡与故障转移实践

在实际使用大型语言模型 API 进行开发或研究时,开发者常常面临两个核心问题:如何稳定、经济地获取高质量的 API 服务,以及如何在不同服务商之间进行技术选型和切换。网络上关于“日抛补货”、“一年卡”等非官方渠道的讨论,恰恰反…

2026/7/27 6:02:46 阅读更多 →
MATLAB实现光流法运动估计:原理、代码与优化

MATLAB实现光流法运动估计:原理、代码与优化

1. 光流法运动估计的核心原理与应用场景 光流法作为计算机视觉中运动估计的经典算法,其核心思想是通过分析连续帧图像中像素点的亮度变化来推算物体的运动速度和方向。这种方法最早由心理学家James J. Gibson在20世纪40年代提出,现已成为自动驾驶、视频稳…

2026/7/27 6:02:46 阅读更多 →
C语言函数递归,详细易懂小白必看

C语言函数递归,详细易懂小白必看

目录 一.什么是递归 1.递归的思想 2.最简单的递归 3.栈溢出 4.递归的限制条件 二.递归举例 1.求n的阶乘 2.递归的问题 一.什么是递归 递归是一种解决问题的方法,简单理解就是函数自己调用自己 1.递归的思想 把一个大的复杂的问题层层转化为和原问题相似&am…

2026/7/27 6:02:46 阅读更多 →
LangChain内置工具实战指南:从原理到应用

LangChain内置工具实战指南:从原理到应用

1. LangChain内置工具全景概览LangChain作为当前最热门的AI应用开发框架,其内置工具集一直是开发者快速构建智能应用的核心武器库。我在实际项目中发现,90%的常规需求都可以通过合理组合这些内置工具实现。不同于官方文档按字母排序的罗列方式&#xff0…

2026/7/27 6:02:46 阅读更多 →
2026-07-25-02-技术教程-CIMPro孪大师智慧水务数字孪生实战

2026-07-25-02-技术教程-CIMPro孪大师智慧水务数字孪生实战

CIMPro孪大师7.1实战:30分钟打造智慧水务数字孪生可视化系统从0到1,手把手教你构建专业级水务数字孪生应用一、前言:为什么选择智慧水务作为入门案例 数字孪生技术在智慧水务领域的应用正迎来爆发期。据住建部数据,截至2026年上半…

2026/7/27 6:01:46 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻