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-catch
try { await api(); } catch { showToast('失败'); }

// 目标:统一错误处理
AIServiceErrorHandler.handle(await api());

// 2. 状态管理 — 引入单例 ViewModel
// 当前:多处 @State
// 目标:全局状态管理

// 3. 类型定义 — 统一类型文件
// 当前:散落在各文件中
// 目标:model/types.ts 统一管理

四、模块依赖分析

4.1 依赖关系图

// 模块依赖矩阵
export const MODULE_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': []
};

// 验证依赖规则
export class DependencyValidator {
  static validate(): string[] {
    const violations: string[] = [];

    // 检查是否违反分层规则
    for (const [module, deps] of Object.entries(MODULE_DEPENDENCIES)) {
      for (const dep of deps) {
        // 检查依赖层级是否合法
        if (this.isForbidden(module, dep)) {
          violations.push(`${module} 不应依赖 ${dep}`);
        }
      }
    }

    return violations;
  }

  private static isForbidden(source: string, target: string): boolean {
    // 禁止跨层跳过:如 pages 不能直接依赖 provider
    const layers: 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
    };

    const srcLayer = layers[source] ?? 0;
    const tgtLayer = layers[target] ?? 0;

    // 工具类和常量层可以被任何层使用
    if (['utils', 'constants', 'model'].includes(target)) return false;

    // 同一层或更低层可以依赖
    return tgtLayer > srcLayer + 1;
  }
}
源模块允许依赖禁止依赖原因
pagescomponents, repositoryprovider, promptUI 层不应直接操作 AI
componentstheme, constantsservice, repository组件只关心展示
repositorydatabase, modelpages, components数据层不依赖 UI
serviceprovider, prompt, aipages, components服务层不感知 UI

4.2 性能热点分析

export class HotspotAnalyzer {
  static analyze(): 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 请求添加缓存层'
      ]
    };
  }
}

interface HotspotReport {
  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 {
  await this.aiService.chat(messages);
} catch (error) {
  const appError = AIServiceErrorHandler.handle(error);
  ToastUtil.show(appError.message);
}

// 3. 生命周期清理
aboutToDisappear(): void {
  this.syncHelper.removeObserve('new_message', this.callback);
  clearInterval(this.timer);
}

七、开发者贡献指南

7.1 如何参与项目

# Fork 项目
git clone https://github.com/yourname/HarmonyAI.git
cd HarmonyAI

# 创建功能分支
git checkout -b feat/new-feature

# 开发完成后提交
git add .
git commit -m "feat(xxx): 新功能描述"
git push origin feat/new-feature

# 创建 Pull Request
贡献类型说明入门难度
Bug 修复修复已知问题
新功能实现规划中的功能⭐⭐
文档改进文档和注释
测试补充单元测试⭐⭐
性能优化代码性能调优⭐⭐⭐
Provider 扩展接入新 AI 模型⭐⭐

7.2 代码规范

// 文件命名:大驼峰
// ChatPage.ets ✓  chatPage.ets ✗

// 类名:大驼峰
class AIService {}class ai_service {}// 方法名:小驼峰
sendMessage() {}send_message() {}// 常量:全大写下划线
const API_BASE_URL = 'https://api.example.com'const apiBaseUrl = 'https://api.example.com'// 类型注解:显式声明
const count: number = 42const count = 42           ✗(允许但不推荐)

// 错误处理:统一 ErrorHandler
try { await api(); }
catch (e) { AIServiceErrorHandler.handle(e); }catch (e) { console.error(e); }

7.3 代码审查清单

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

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

八、Git 提交

git add .
git commit -m "docs(review): 源码解析与项目复盘

- 六层架构回顾与数据统计
- 模块依赖分析与性能热点
- 开发经验与技术债务总结
- 36条代码规范与审查清单
- 贡献指南与参与方式

Co-Authored-By: AtomCode (deepseek-v4-flash) <noreply@atomgit.com>"
git tag 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 配置、缓存清除、数据导出一站式管理

相关资源


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

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐