HarmonyOS应用《玄象》开发实战:MansionData.ets 数据建模:二十八宿经纬度与神兽属性
阅读时长约 19 分钟 | 难度★★★★☆ | 篇章第 4 篇 · 二十八星宿模块 对应源码entry/src/main/ets/common/utils/MansionData.ets前言二十八星宿是中华传统文化的核心天文体系。玄象项目通过MansionData.ets将 28 个星宿的结构化数据建模为MansionInfo接口涵盖名称、四象、五行、神兽、分野、星官等完整属性。本篇将深入剖析玄象项目星宿数据建模的实现从MansionInfo接口设计、MANSIONS静态数据数组、28 宿分组策略、四象 / 五行 / 神兽属性映射到getMansionsBySiXiang查询算法。掌握这套数据建模方法论您就能为任何 HarmonyOS 应用构建结构化文化数据体系。提示数据结构设计是应用开发的基石。玄象项目星宿数据采用“静态数组 类型接口“模式兼顾编码效率与运行时性能。一、MansionInfo 接口设计1.1 接口定义export interface MansionInfo { name: string; // 星宿名称如角宿 pinyin: string; // 拼音如Jiǎo Xiù siXiang: string; // 四象苍龙/朱雀/白虎/玄武 wuXing: string; // 五行木/金/土/日/月/火/水 animal: string; // 神兽蛟/龙/貉/兔/狐/虎/豹等 fenYe: string; // 分野对应的古国 season: string; // 季节春/夏/秋/冬 xingGuan: string; // 属星官列表 description: string; // 文化解释 }1.2 字段设计说明字段类型意义示例namestring星宿名称“角宿”pinyinstring拼音标注“Jiǎo Xiù”siXiangstring四象归属“苍龙”wuXingstring五行属性“木”animalstring神兽“蛟”fenYestring分野“郑国”seasonstring季节“春季”xingGuanstring星官“角、平道、天田”descriptionstring文化解释“角宿二十八宿之一…”二、MANSIONS 静态数据数组2.1 完整数据示例export class MansionData { static readonly MANSIONS: MansionInfo[] [ // 东方苍龙七宿 { name: 角宿, pinyin: Jiǎo Xiù, siXiang: 苍龙, wuXing: 木, animal: 蛟, fenYe: 郑国, season: 春季, xingGuan: 角、平道、天田, description: 角宿二十八宿之一东方苍龙七宿之首。角宿因其形象如龙角而得名。古人认为角宿是苍龙的角代表着吉祥、威武和领导力。在农业方面角宿亦主春耕播种之时序象征万物复苏与生机蓬勃。 }, // ... 共 28 项 ]; }2.2 数据分组结构玄象项目 28 宿分为四组每组 7 宿四象方位星宿7 宿苍龙东角、亢、氐、房、心、尾、箕朱雀南井、鬼、柳、星、张、翼、轸白虎西奎、娄、胃、昴、毕、觜、参玄武北斗、牛、女、虚、危、室、壁2.3 描述字段的文化价值description: 角宿二十八宿之一东方苍龙七宿之首。角宿因其形象如龙角而得名。玄象项目每个星宿的description字段包含其文化解释用于详情页展示。三、四象分组常量3.1 SI_XIANG_ORDER 数组static readonly SI_XIANG_ORDER: string[] [苍龙, 朱雀, 白虎, 玄武];3.2 四象方位与颜色四象方位季节颜色苍龙东春青朱雀南夏红白虎西秋白玄武北冬黑四、查询方法4.1 按四象查询static getMansionsBySiXiang(siXiang: string): MansionInfo[] { return MansionData.MANSIONS.filter(m m.siXiang siXiang); }使用Array.filter过滤出指定四象的 7 个星宿。4.2 按名称查询static getMansionByName(name: string): MansionInfo | undefined { return MansionData.MANSIONS.find(m m.name name); }使用Array.find查找指定星宿用于详情页数据加载。五、数据建模设计原则5.1 纯数据、无逻辑MansionData类遵循“纯数据“原则不包含 UI 相关逻辑。5.2 只读访问所有数据通过static readonly暴露防止外部修改。5.3 查询方法封装通过getMansionsBySiXiang和getMansionByName方法封装查询逻辑。六、二十八宿完整数据清单6.1 东方苍龙七宿星宿五行神兽分野角宿木蛟郑国亢宿金龙郑国氐宿土貉郑国房宿日兔宋国心宿月狐宋国尾宿火虎燕国箕宿水豹燕国6.2 南方朱雀七宿星宿五行神兽分野井宿木犴秦国鬼宿金羊秦国柳宿土獐周国星宿日马周国张宿月鹿周国翼宿火蛇楚国轸宿水蚓楚国6.3 西方白虎七宿星宿五行神兽分野奎宿木狼鲁国娄宿金狗鲁国胃宿土雉鲁国昴宿日鸡赵国毕宿月乌赵国觜宿火猴魏国参宿水猿魏国6.4 北方玄武七宿星宿五行神兽分野斗宿木獬吴国牛宿金牛吴国女宿土蝠齐国虚宿日鼠齐国危宿月燕齐国室宿火猪卫国壁宿水㺄卫国七、数据模型的扩展方向7.1 国际化export interface MansionInfo { // ... 现有字段 nameEn: string; // 英文名 descriptionEn: string; // 英文描述 }7.2 经纬度export interface MansionInfo { // ... 现有字段 ra: number; // 赤经 dec: number; // 赤纬 stars: number; // 星数 }八、MansionData 数据在页面中的使用8.1 列表页加载aboutToAppear(): void { this.mansions MansionData.getMansionsBySiXiang(this.currentSiXiang); }8.2 详情页查询const mansion MansionData.getMansionByName(params.mansionName);九、数据模型设计总结9.1 设计原则纯数据无逻辑只读不可修改查询方法封装9.2 数据流MansionData.ets ↓ 静态数据 MansionListPage.ets ← filter → List ↓ 点击 MansionDetailPage.ets ← find → 详情展示九、MansionData 数据模型的最佳实践9.1 数据模型的测试玄象项目MansionData的单元测试应覆盖describe(MansionDataTest, () { it(should have 28 mansions, 0, () { expect(MansionData.MANSIONS.length).assertEqual(28); }); it(should return 7 mansions for each siXiang, 0, () { MansionData.SI_XIANG_ORDER.forEach(siXiang { const mansions MansionData.getMansionsBySiXiang(siXiang); expect(mansions.length).assertEqual(7); }); }); it(should find mansion by name, 0, () { const mansion MansionData.getMansionByName(角宿); expect(mansion).not.assertNull(); expect(mansion?.name).assertEqual(角宿); }); });9.2 数据导出为 JSON 的建议当前MansionData数据在代码中硬编码。建议将数据导出为 JSON 文件放入rawfile目录通过resourceManager加载// resources/base/rawfile/mansions.json { mansions: [ { name: 角宿, pinyin: Jiǎo Xiù, siXiang: 苍龙, wuXing: 木, animal: 蛟, fenYe: 郑国, season: 春季, xingGuan: 角、平道、天田, description: 角宿二十八宿之一东方苍龙七宿之首。 } ] }9.3 数据模型扩展方向扩展字段类型用途ranumber赤经天文坐标decnumber赤纬天文坐标magnitudenumber星等亮度starsnumber主星数量十一、四象分组与五行属性11.1 四象与五行的对应关系四象方位五行季节星宿数量苍龙东木春7朱雀南火夏7白虎西金秋7玄武北水冬711.2 二十八宿的五行循环二十八宿的五行属性在四象内部循环木→金→土→日→月→火→水。例如东方苍龙七宿角木蛟、亢金龙、氐土貉、房日兔、心月狐、尾火虎、箕水豹。十二、MansionData 在玄象项目中的数据流12.1 完整数据链路MansionData.MANSIONS (28 条静态数据) ↓ getMansionsBySiXiang(苍龙) 7 条星宿数据 ↓ ForEach ListItem 渲染 ↓ onClick router.pushUrl({ params: { mansionName: 角宿 } }) ↓ getMansionByName(角宿) MansionInfo 详情数据 ↓ UI 渲染 星宿详情页完整展示12.2 数据流设计原则纯数据层MansionData 只负责数据存储与查询不包含 UI 逻辑单向数据流数据从 MansionData → 页面 → ListItem → 详情页可测试性纯数据层可独立测试不依赖 UI 环境十三、数据模型的性能优化13.1 静态数据的查询优化MansionData使用Array.filter和Array.find进行查询时间复杂度 O(n)。对于 28 条数据O(n) 完全足够。若数据量扩展到 1000应考虑使用Map索引static readonly MANSION_MAP: Mapstring, MansionInfo new Map( MansionData.MANSIONS.map(m [m.name, m]) );13.2 数据模型的维护建议数据与代码分离将星宿数据移入rawfile/mansions.json版本控制数据变更时更新版本号触发缓存更新国际化预留nameEn、descriptionEn等国际化字段十四、二十八宿文化知识拓展14.1 二十八宿与西方星座的对应二十八宿西方星座对应关系角宿、亢宿室女座春季星空心宿天蝎座夏季星空毕宿金牛座冬季星空参宿猎户座冬季星空14.2 二十八宿在文学作品中的引用《西游记》中二十八宿多次出现如奎木狼下凡为黄袍怪《水浒传》中梁山好汉对应三十六天罡、七十二地煞唐代诗人杜甫有“人生不相见动如参与商“的诗句参宿和商宿心宿即参商二星。14.3 二十八宿的文化影响二十八宿不仅用于天文观测还深入影响了中国的历法通过二十八宿的位置确定二十四节气风水罗盘上的二十四山源于二十八宿命理八字排盘中的神煞系统引用星宿文学诗词歌赋中大量引用星宿意象艺术敦煌壁画中有大量星宿题材十五、数据模型在玄象项目中的实际应用15.1 MansionData 的完整调用链路// 1. 列表页按四象查询 const mansions MansionData.getMansionsBySiXiang(苍龙); // 2. 详情页按名称查询 const mansion MansionData.getMansionByName(角宿); // 3. 四象切换获取所有四象 const siXiangs MansionData.SI_XIANG_ORDER;15.2 数据模型的自检清单开发者在修改MansionData时应确认以下检查项28 宿数据是否完整每象 7 宿四象名称是否正确苍龙/朱雀/白虎/玄武五行属性是否合理木金土日月火水分野是否与历史记载一致描述文字是否准确总结本篇以玄象项目MansionData.ets为蓝本深入剖析了 ArkTS 数据建模从MansionInfo接口设计、MANSIONS静态数据数组、28 宿分组策略、四象 / 五行 / 神兽属性映射到getMansionsBySiXiang查询算法。掌握这套数据建模方法论您就能为任何 HarmonyOS 应用构建结构化文化数据体系。下一篇《32 · MansionListPage 列表页List / ListItem / LazyForEach 性能优化》将带您深入玄象项目星宿列表页的实现。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源HarmonyOS 官方文档ForEach 组件HarmonyOS 官方文档List 组件二十八星宿wikipedia.org/wiki/二十八宿开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net