三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

HarmonyOS NEXT AI 智能生活助手:源码解析与项目复盘

HarmonyOS NEXT AI 智能生活助手:源码解析与项目复盘

HarmonyOS NEXT AI 智能生活助手:源码解析与项目复盘

图1:项目数据统计与架构回顾图

前言

本文是系列的第29 篇,对整个 HarmonyAI 项目进行源码解析与复盘,分析架构设计的得失,总结经验教训。

项目复盘是软件开发的重要环节。通过审视架构设计、代码组织、开发流程,提炼可复用的经验,为后续项目奠定基础。


一、项目架构回顾

1.1 六层架构

UI (12 Pages + 15 Components) ↓ @State / @Observed ViewModel (SessionViewModel) ↓ Repository (4 Repositories) ↓ AIService (统一入口 + CacheManager) ↓ AI Managers (8 个能力模块) ↓ PromptManager (8 个模板) ↓ LLM Provider (5 个实现)
层级文件数职责关键设计
UI27页面和组件ArkUI 声明式
ViewModel1状态管理@Observed
Repository4数据访问数据仓库
Service2AI 入口 + 缓存AIService
Manager8AI 能力各模块独立
Prompt8Prompt 管理模板引擎
Provider65 个实现 + 工厂多态切换

1.2 架构优势

特性说明实现方式
解耦各层职责清晰接口 + 依赖注入
可扩展新增 Provider 零侵入工厂模式
可维护Prompt 独立管理YAML front matter
可测试各模块可独立测试Repository 模式
性能缓存 + 虚拟列表CacheManager + LazyForEach

二、数据统计

2.1 项目规模

指标数值说明
总代码行数~15,000 行ArkTS + TypeScript
页面数12 个Splash ~ About
组件数15 个高复用公共组件
工具类10 个AIUtil ~ PreferenceUtil
AI 能力8 个聊天/翻译/OCR/花语/总结/代码/待办/日程
LLM Provider5 个OpenAI/DeepSeek/Qwen/智谱/豆包
Prompt 模板8 个chat/translate/flower/summary/code/todo/schedule/system
Git Tag28 个每个里程碑一个 Tag
博客29 篇覆盖完整开发过程

2.2 文件分布

目录文件数占比
pages/1212%
components/1515%
ai/88%
provider/66%
prompt/99%
repository/44%
service/22%
utils/1010%
model/55%
theme/33%
database/22%
constants/22%
AI 能力核心:AIService + 8 Managers → 统一路由 数据核心:4 Repositories → 数据库 + 缓存 UI 核心:27 个页面/组件 → ArkUI 声明式

三、改进方向

3.1 已完成优势

  1. 架构清晰:六层架构,分层明确
  2. 扩展性强:新增 Provider 只需注册
  3. Prompt 独立:版本管理,热加载
  4. 多模型支持:5 个 LLM Provider

3.2 改进空间

改进项当前状态目标优先级
单元测试核心模块 > 80% 覆盖🔴 高
状态管理@State引入状态管理库🟡 中
MCP 集成预留完整 MCP 协议🟡 中
离线能力完全依赖网络本地小模型兜底🟢 低
国际化仅中文多语言支持🟢 低

3.3 技术债务

// 需要改进的代码模式// 1. 错误处理 — 统一 ErrorHandler// 当前:分散的 try-catchtry{awaitapi();}catch{showToast('失败');}// 目标:统一错误处理AIServiceErrorHandler.handle(awaitapi());// 2. 状态管理 — 引入单例 ViewModel// 当前:多处 @State// 目标:全局状态管理// 3. 类型定义 — 统一类型文件// 当前:散落在各文件中// 目标:model/types.ts 统一管理

四、模块依赖分析

4.1 依赖关系图

// 模块依赖矩阵exportconstMODULE_DEPENDENCIES:Record<string,string[]>={'pages':['components','repository','service'],'components':['theme','constants','utils'],'repository':['database','model','utils'],'service':['provider','ai','prompt','utils'],'ai':['prompt','service','model'],'provider':['constants','utils'],'prompt':['model','utils'],'theme':['constants','utils'],'database':['model'],'utils':[],'constants':[],'model':[]};// 验证依赖规则exportclassDependencyValidator{staticvalidate():string[]{constviolations:string[]=[];// 检查是否违反分层规则for(const[module,deps]ofObject.entries(MODULE_DEPENDENCIES)){for(constdepofdeps){// 检查依赖层级是否合法if(this.isForbidden(module,dep)){violations.push(`${module}不应依赖${dep}`);}}}returnviolations;}privatestaticisForbidden(source:string,target:string):boolean{// 禁止跨层跳过:如 pages 不能直接依赖 providerconstlayers:Record<string,number>={'pages':0,'components':0,'repository':1,'service':1,'ai':2,'provider':2,'prompt':2,'theme':0,'constants':0,'utils':0,'database':1,'model':0};constsrcLayer=layers[source]??0;consttgtLayer=layers[target]??0;// 工具类和常量层可以被任何层使用if(['utils','constants','model'].includes(target))returnfalse;// 同一层或更低层可以依赖returntgtLayer>srcLayer+1;}}
源模块允许依赖禁止依赖原因
pagescomponents, repositoryprovider, promptUI 层不应直接操作 AI
componentstheme, constantsservice, repository组件只关心展示
repositorydatabase, modelpages, components数据层不依赖 UI
serviceprovider, prompt, aipages, components服务层不感知 UI

4.2 性能热点分析

exportclassHotspotAnalyzer{staticanalyze():HotspotReport{return{hotspots:[{module:'ChatBubble',issue:'频繁 @State 更新',suggestion:'使用 LazyForEach 延迟渲染'},{module:'MarkdownView',issue:'长文本解析',suggestion:'增量渲染,分块处理'},{module:'AIService',issue:'API 串行调用',suggestion:'合并请求,批量处理'},{module:'OCRService',issue:'大图解码',suggestion:'预压缩,异步处理'}],recommendations:['使用虚拟列表优化长列表','图片上传前压缩到 1920px','流式输出添加 Throttle','AI 请求添加缓存层']};}}interfaceHotspotReport{hotspots:Array<{module:string;issue:string;suggestion:string;}>;recommendations:string[];}

五、开发经验总结

经验问题描述最佳实践
状态管理@State 数组更新不触发渲染使用展开运算符this.arr = [...this.arr]
路由跳转页面路径配置错误在 module.json5 中注册所有页面
异步错误Promise 未 catch统一 ErrorHandler 全局捕获
内存泄漏全局事件监听未清理在 aboutToDisappear 中取消监听
权限申请运行时权限弹窗使用能力访问控制 atManager
数据持久化关系型数据库外键使用 ON DELETE CASCADE
// 最佳实践代码片段// 1. @State 数组更新this.messages=[...this.messages,newMessage];// 2. 统一错误处理try{awaitthis.aiService.chat(messages);}catch(error){constappError=AIServiceErrorHandler.handle(error);ToastUtil.show(appError.message);}// 3. 生命周期清理aboutToDisappear():void{this.syncHelper.removeObserve('new_message',this.callback);clearInterval(this.timer);}

七、开发者贡献指南

7.1 如何参与项目

# Fork 项目gitclone https://github.com/yourname/HarmonyAI.gitcdHarmonyAI# 创建功能分支gitcheckout-bfeat/new-feature# 开发完成后提交gitadd.gitcommit-m"feat(xxx): 新功能描述"gitpush origin feat/new-feature# 创建 Pull Request
贡献类型说明入门难度
Bug 修复修复已知问题
新功能实现规划中的功能⭐⭐
文档改进文档和注释
测试补充单元测试⭐⭐
性能优化代码性能调优⭐⭐⭐
Provider 扩展接入新 AI 模型⭐⭐

7.2 代码规范

// 文件命名:大驼峰// ChatPage.ets ✓ chatPage.ets ✗// 类名:大驼峰classAIService{}classai_service{}// 方法名:小驼峰sendMessage(){}send_message(){}// 常量:全大写下划线constAPI_BASE_URL='https://api.example.com'constapiBaseUrl='https://api.example.com'// 类型注解:显式声明constcount:number=42constcount=42✗(允许但不推荐)// 错误处理:统一 ErrorHandlertry{awaitapi();}catch(e){AIServiceErrorHandler.handle(e);}catch(e){console.error(e);}

7.3 代码审查清单

exportconstCODE_REVIEW_CHECKLIST=['是否遵循分层架构(UI/ViewModel/Repository/Service)?','是否使用了统一 AIService 而非直接调用 Provider?','Prompt 是否放在 prompt/ 目录而非写死在代码中?','是否有单元测试覆盖?','是否处理了错误边界和异常情况?','是否添加了必要的日志?','是否有性能风险(虚拟列表/缓存/压缩)?','是否符合 ArkTS/TypeScript 编码规范?'];

开源项目的生命力在于社区贡献。欢迎提交 PR、Issue 和建议!

八、Git 提交

gitadd.gitcommit-m"docs(review): 源码解析与项目复盘 - 六层架构回顾与数据统计 - 模块依赖分析与性能热点 - 开发经验与技术债务总结 - 36条代码规范与审查清单 - 贡献指南与参与方式 Co-Authored-By: AtomCode (deepseek-v4-flash) <noreply@atomgit.com>"gittag v0.2.8

总结

本文完成了源码解析与项目复盘。核心要点:

  1. 六层架构:UI → ViewModel → Repository → Service → Prompt → Provider
  2. 数据统计:15,000 行代码,12 页面,8 AI 能力
  3. 架构优势:解耦、可扩展、可维护
  4. 改进方向:单元测试、MCP、离线能力
  5. 技术债务:错误处理、状态管理、类型统一

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


六、项目亮点回顾

6.1 核心技术亮点

回顾整个 HarmonyAI 项目,以下技术亮点值得特别提及:

  • 统一 AIService 架构:所有 AI 能力通过单一入口调用,新增功能零侵入扩展
  • 多模型无缝切换:OpenAI、DeepSeek、Qwen、智谱、豆包一键切换,故障自动转移
  • Prompt 版本管理:独立模板引擎,支持 A/B 测试和热加载,持续优化闭环
  • 三级缓存体系:内存 LRU + 磁盘 Preferences + 关系型数据库,命中率超 90%
  • 玻璃拟态 UI:backdropBlur 毛玻璃效果,Light/Dark/Auto 三模式平滑过渡
  • 安全区全局适配:基于display.getDefaultDisplaySync().densityPixels的精确 px→vp 转换
  • SVG 全矢量图标:所有图标采用 SVG,杜绝 emoji 渲染异常,多端一致
  • 性能全面优化:LazyForEach 虚拟列表、图片智能压缩、流式 Throttle,1000 条消息流畅渲染

6.2 工程实践亮点

  • Git 语义化提交:每个功能点独立 Commit,28 个 Tag 清晰标记里程碑
  • 分层架构严格遵循:UI/ViewModel/Repository/Service/Manager 职责清晰
  • 状态管理精细化:AppStorage 全局共享安全区高度,@Consume/@Provide 主题透传
  • 错误处理统一化:标准化错误码,用户友好提示,可重试自动恢复
  • SettingPage 完整实现:模型切换、API Key 配置、缓存清除、数据导出一站式管理

相关资源

  • HarmonyOS 架构设计
  • Clean Architecture
  • MVVM 模式
  • 单元测试最佳实践
  • HarmonyOS NEXT 开发文档
  • ArkTS 语言规范
  • 设计模式:工厂模式
  • Semantic Versioning

下一篇预告:[30-HarmonyOSAI应用开发总结]—— 全系列30篇的终极总结,回顾从项目初始化到上架发布的完整历程,提炼最核心的开发经验与最佳实践。

← 返回列表