HarmonyOS应用开发实战:萌宠日记 - 宠物信息数据结构设计
HarmonyOS应用开发实战萌宠日记 - 宠物信息数据结构设计前言数据结构设计是应用开发的基础它决定了数据如何组织、存储、传递和展示。在萌宠日记中我们设计了多个interface 接口来定义宠物信息、健康提醒、日记条目等数据模型。这些接口通过强类型约束确保了数据在组件间传递时的类型安全和可维护性。本文将从萌宠日记中所有数据结构定义出发深入解析接口设计原则、数据类型选择、数据模型演进以及如何通过良好的数据结构设计提升代码质量。一、萌宠日记中的数据结构全景1.1 所有接口定义接口名称定义位置用途字段数QuickActionHomePage.ets快捷操作项3HealthReminderHomePage.ets健康提醒项5BasicInfoItemPetProfilePage.ets基本信息键值对2TimelineItemGrowthTimelinePage.ets时间轴条目8HealthCategoryHealthRecordPage.ets健康分类3WeightRecordHealthRecordPage.ets体重记录4AlbumCategoryAlbumPage.ets相册分类1PhotoItemAlbumPage.ets照片项1ReminderItemReminderPage.ets提醒项6MoodItemWriteDiaryPage.ets心情选项2TopicItemCommunityPage.ets话题标签2PostItemCommunityPage.ets帖子项4MoodStatStatisticsPage.ets心情统计3ActivityStatStatisticsPage.ets活动统计3MenuItemProfilePage.ets菜单项31.2 接口定义示例// 快捷操作 — 首页 interface QuickAction { icon: string // Emoji 图标 label: string // 标签文字 color: string // 背景色 } // 健康提醒 — 首页 interface HealthReminder { icon: string // 图标 title: string // 标题 date: string // 日期 daysLeft: string // 倒计时 color: string // 背景色 } // 时间轴条目 — 成长时间轴 interface TimelineItem { date: string // 日期 age: string // 年龄 title: string // 标题 description: string // 描述 hasImage: boolean // 是否有图片 isSpecial: boolean // 是否特殊事件 specialIcon?: string // 特殊事件图标可选 }提示?标记的字段为可选属性如TimelineItem中的specialIcon。当isSpecial为true时specialIcon才有值。这种设计既保持了类型安全又提供了灵活性。二、接口设计原则2.1 字段命名规范// 推荐命名 interface HealthReminder { icon: string // 语义清晰 title: string // 使用全称避免缩写 daysLeft: string // 驼峰命名 iconBg: string // 缩写合理bg background } // 不推荐命名 interface HealthReminder { i: string // 单字母语义不明确 ttl: string // 缩写不易理解 dl: string // 缩写不易理解 clr: string // 缩写不易理解 }2.2 字段类型选择数据类型适用场景示例说明string文本、标识符name,date,icon最常用number数值、索引index,count,percentage计算用boolean状态标记isSpecial,hasImage以is/has开头string[]标签列表可扩展多个标签可选?非必填字段specialIcon?条件属性2.3 布尔字段命名// 推荐使用 is/has/can 前缀 interface TimelineItem { isSpecial: boolean // 是否特殊事件 hasImage: boolean // 是否有图片 // isActive: boolean // 是否激活状态 // canEdit: boolean // 是否可编辑 }三、数据模型演进3.1 简单版本// V1简单扁平结构 interface Pet { name: string age: string breed: string }3.2 扩展版本// V2完整信息结构 interface Pet { id: string name: string gender: male | female breed: string birthDate: string weight: number personality: string[] isNeutered: boolean avatar: Resource arrivalDate: string }3.3 嵌套版本// V3嵌套对象结构 interface Pet { id: string name: string basicInfo: PetBasicInfo // 基本信息 healthInfo: PetHealthInfo // 健康信息 growthRecords: GrowthRecord[] // 成长记录 photos: PhotoInfo[] // 照片列表 } interface PetBasicInfo { gender: male | female breed: string birthDate: string arrivalDate: string weight: number personality: string[] } interface PetHealthInfo { isNeutered: boolean vaccineRecords: VaccineRecord[] dewormingRecords: DewormingRecord[] }四、数据与视图分离4.1 展示数据 vs 存储数据// 展示数据 — 直接用于 UI 渲染 interface TimelineItem { date: string age: string title: string description: string hasImage: boolean isSpecial: boolean specialIcon?: string } // 存储数据 — 数据库中的原始数据 interface TimelineRecord { id: string petId: string date: Date title: string description: string imageIds: string[] isSpecial: boolean specialType: string createdAt: Date updatedAt: Date }4.2 数据转换函数// 将存储数据转换为展示数据 function toTimelineItem(record: TimelineRecord): TimelineItem { return { date: formatDate(record.date), age: calculateAge(record.date), title: record.title, description: record.description, hasImage: record.imageIds.length 0, isSpecial: record.isSpecial, specialIcon: getSpecialIcon(record.specialType) } }五、枚举与常量5.1 枚举类型// 使用枚举约束可选值 enum PetGender { MALE male, FEMALE female } enum SpecialEventType { BIRTHDAY birthday, VACCINE vaccine, TRAVEL travel, FIRST_TIME first_time } interface TimelineItem { // ... isSpecial: boolean specialType?: SpecialEventType // 使用枚举而非字符串 }5.2 常量数据// 使用常量定义固定数据 const QUICK_ACTIONS: QuickAction[] [ { icon: , label: 日记, color: #FFF3E0 }, { icon: , label: 档案, color: #E3F2FD }, { icon: , label: 健康, color: #E8F5E9 }, { icon: , label: 相册, color: #FCE4EC }, { icon: ⚙️, label: 更多, color: #F3E5F5 } ] const MOODS: MoodItem[] [ { emoji: , label: 开心 }, { emoji: , label: 平静 }, { emoji: , label: 一般 }, { emoji: , label: 难过 }, { emoji: , label: 生气 } ]六、数据流设计6.1 数据流方向用户操作 → 事件回调 → 父组件处理 → 状态更新 → UI 重渲染 ↓ ↓ 存储数据 展示数据6.2 数据流示例// 1. 用户点击编辑按钮 // 2. 触发回调 onClick(() { this.onNavigateToPetProfile?.() }) // 3. 父组件执行导航 HomePage({ onNavigateToPetProfile: () { this.homeStack.pushPath({ name: petProfile }) } }) // 4. 目标页面接收数据 Builder HomeNavDestinations() { NavDestination() { PetProfilePage({ petId: 123, petName: 豆豆 }) } .title(宠物档案) }七、数据验证7.1 运行时验证function validateTimelineItem(item: TimelineItem): boolean { if (!item.date || !item.age || !item.title) { console.error(Invalid timeline item: missing required fields) return false } if (item.isSpecial !item.specialIcon) { console.warn(Special event without icon) } return true }7.2 编译时验证// 接口在编译时提供类型检查 // 错误传递了不存在的字段 const item: TimelineItem { date: 2024-05-05, age: 2岁3个月, title: 去公园玩, invalidField: error // ✗ 编译错误 }八、接口设计的演进8.1 从简单到完整V1: 扁平单文件 ↓ V2: 按页面拆分接口 ↓ V3: 抽取公共类型 ↓ V4: 嵌套对象 枚举 ↓ V5: 数据转换层 验证8.2 萌宠日记的当前阶段萌宠日记当前处于V2-V3 阶段接口已按页面拆分每个页面独立定义部分接口已使用嵌套对象结构但尚未抽取公共类型到单独文件尚未引入数据转换层九、公共类型抽取9.1 公共类型文件// types/pet.ets — 公共类型定义 export interface PetInfo { id: string name: string gender: male | female breed: string birthDate: string } export interface DiaryEntry { id: string title: string content: string mood: string photos: string[] createdAt: string }9.2 类型导入import { PetInfo, DiaryEntry } from ../types/pet // 使用公共类型 Component export struct PetProfilePage { Prop pet: PetInfo }十、最佳实践10.1 数据结构设计原则有序列表 — 数据结构设计的 5 个原则接口优先先定义接口再实现功能类型驱动开发语义化命名字段名清晰表达含义避免缩写类型精确使用string适合通用使用枚举约束可选值数据与视图分离展示数据和存储数据使用不同接口渐进式演进先简单后复杂随着需求迭代逐步完善10.2 萌宠日记数据结构总结设计维度当前状态优化方向接口定义15 个接口按页面分散抽取公共类型字段命名驼峰命名语义清晰—类型选择string 为主引入枚举可选属性少数接口使用?扩展使用数据转换无转换层增加转换函数枚举未使用引入枚举约束总结本文从萌宠日记的数据结构设计出发深入解析了接口定义的完整方法数据全景15 个接口覆盖所有页面数据模型命名规范驼峰命名、语义清晰、布尔前缀类型选择string、number、boolean、可选类型数据模型演进从扁平到嵌套从简单到完整数据与视图分离展示数据 vs 存储数据枚举与常量约束可选值定义固定数据数据流设计从用户操作到 UI 更新的完整链路公共类型抽取跨页面共享类型定义良好的数据结构设计是应用质量的基石值得在开发初期投入足够的设计时间。下一篇我们将深入宠物档案编辑页面的实现思路探讨编辑页面的设计和实现方案。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源ArkTS 接口定义https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-interfaceArkTS 类型系统https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/introduction-to-arkts枚举定义https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/introduction-to-arkts数据管理概述https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/state-management组件间通信https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-component-encapsulation编程规范https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-coding-style-guide应用数据持久化https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/app-data-persistence数据库开发指导https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/data-persistence-by-rdb-store

相关新闻

能科科技AI+工业场景化应用【第二期】:PLM AI智能助手

能科科技AI+工业场景化应用【第二期】:PLM AI智能助手

当前,PLM(例如Teamcenter)作为一款专业的产品生命周期管理系统,广泛应用于制造企业,帮助企业实现产品数据的统一管理与协同共享。但是在实际应用中存在两大难题:一是隐性人力成本高,新员工培训耗…

2026/7/22 11:49:53阅读更多 →
OpenCode开源AI编程代理:安装配置与核心功能解析

OpenCode开源AI编程代理:安装配置与核心功能解析

1. OpenCode是什么?一个开源AI编程代理的全面解析 OpenCode是当前开发者社区热议的一款开源AI编程代理工具,它能在你的终端、IDE或桌面环境中直接嵌入智能编程助手功能。与市面上常见的商业AI编程工具不同,OpenCode的核心优势在于其开源属性和…

2026/7/22 11:49:53阅读更多 →
古籍文献修复库房通风 易互德无尘稳温布风管延缓纸张酸化老化

古籍文献修复库房通风 易互德无尘稳温布风管延缓纸张酸化老化

市级古籍保护中心修复库房存放线装古籍、拓片、善本,纸质文物材质脆弱,温湿度波动、粉尘、强气流都会加速纸张酸化、纤维脆化,造成不可逆破损。传统铁皮风管高速送风搅动空气中粉尘、酸性颗粒物,附着古籍表面腐蚀纸页;…

2026/7/22 11:49:53阅读更多 →
边缘节点的数据同步协议设计:基于 CRDT 的最终一致性与断网续传策略

边缘节点的数据同步协议设计:基于 CRDT 的最终一致性与断网续传策略

边缘节点的数据同步协议设计:基于 CRDT 的最终一致性与断网续传策略 一、边缘同步的"最后一公里"困境 云端数据库通过主从复制实现数据一致性,前提是网络可靠、延迟可控。边缘节点的网络环境恰恰相反:4G/5G 信号不稳定&#xff0…

2026/7/22 12:40:01阅读更多 →
(Python)statsmodels — 统计建模的瑞士军刀

(Python)statsmodels — 统计建模的瑞士军刀

Python 第三方库评估:statsmodels — 统计建模的瑞士军刀,值不值得引入你的项目? 前言 你正面对一堆数据,老板说"做个回归分析,看看哪些因素影响销量"。你打开 Jupyter Notebook,脑子里闪过 R 语…

2026/7/22 12:40:01阅读更多 →
端侧 AI 推理的未来架构:从模型压缩到专用 NPU 编译器协同设计的趋势判断

端侧 AI 推理的未来架构:从模型压缩到专用 NPU 编译器协同设计的趋势判断

端侧 AI 推理的未来架构:从模型压缩到专用 NPU 编译器协同设计的趋势判断 一、模型压缩的物理极限逼近 过去三年,端侧 AI 的主流策略是压缩——将大模型通过各种量化、蒸馏、剪枝手段塞进移动设备。INT8 量化将 7B 模型从 14GB 压至 7GB,Q4_K…

2026/7/22 12:40:01阅读更多 →
边缘设备上的模型编译优化:INT8 量化、算子融合与目标架构特化的编译管线

边缘设备上的模型编译优化:INT8 量化、算子融合与目标架构特化的编译管线

边缘设备上的模型编译优化:INT8 量化、算子融合与目标架构特化的编译管线 一、模型在边缘设备上的"水土不服" 将一个在 H100 上训练好的 7B 模型直接部署到树莓派或 Jetson Nano,启动即 OOM(Out of Memory),…

2026/7/22 12:40:01阅读更多 →
抖音无水印视频提取技术解析与实战指南

抖音无水印视频提取技术解析与实战指南

1. 项目背景与需求解析 2026年的抖音平台在内容保护机制上已经迭代到第7代数字水印系统,这套名为"AquaGuard Pro"的技术不仅会在显眼位置添加平台LOGO,还会通过像素级分散算法将用户ID信息嵌入图片的色相通道中。这种水印技术给普通用户保存高…

2026/7/22 12:40:01阅读更多 →
短视频去水印技术解析与12款工具实测对比

短视频去水印技术解析与12款工具实测对比

1. 短视频去水印需求背景解析 在短视频内容爆发式增长的当下,许多用户都会遇到这样的场景:在快手平台看到一段精彩的舞蹈教学、实用的生活技巧或有趣的宠物视频,想要保存下来反复观看或二次创作时,却发现视频右下角带着明显的平台…

2026/7/22 12:38:01阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 0:53:59阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 0:53:59阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 0:53:59阅读更多 →
中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业做小程序,最常见的矛盾是预算有限,但又不希望功能太单薄;没有技术团队,但又希望后续能自己运营;想快速上线,又担心隐性收费和售后失联。选型时如果只看“低价套餐”或“案例数量”,很容…

2026/7/22 0:01:17阅读更多 →
GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

企业做营销,最怕钱花完了,资产没有留下。 效果广告能带来一段时间的曝光,但预算停止后,流量往往也随之停止。短视频内容可能在几天内冲高,也可能很快沉下去。AI搜索时代,企业需要重新思考一个问题&#xff…

2026/7/22 0:01:17阅读更多 →
Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复 一、你的 Agent 在"再想想"的循环里绕了 12 轮,用户已经关窗口了 Agent 与人最大的区别是:人知道什么时候该停下来给答案,Agent 会一直"想"下去。你给 Agent 接…

2026/7/22 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/21 22:53:50阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/21 18:53:30阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/21 18:53:30阅读更多 →