# harmony-client HarmonyOS NEXT 应用(鸿蒙客户端)。ArkTS + ArkUI 声明式 UI,hvigor 构建,DevEco Studio 开发。 HarmonyOS NEXT app. ArkTS + ArkUI declarative UI, hvigor build, DevEco Studio. ## Quick Start - **主路径**:用 DevEco Studio 打开本目录,首次打开自动同步依赖(hvigor 插件 + oh_modules)。 Primary: open this folder in DevEco Studio; first open auto-syncs dependencies. - 命令行构建(`hvigorw` wrapper 由 DevEco 首次同步生成): `hvigorw assembleHap --mode module -p product=default -p buildMode=debug` - 测试:本地单测 `entry/src/test/`,设备测试 `entry/src/ohosTest/`。见 `docs/testing.md`。 ## Architecture Overview 单 HAP + 多 HAR 模块化应用:`entry/`(HAP,应用壳 + 业务)、`common/`(HAR,基础设施)、`uikit/`(HAR,通用 UI)。 Single-HAP + multi-HAR: `entry/` (HAP shell + business), `common/` (HAR infra), `uikit/` (HAR shared UI). 状态管理全量 StateManagement V2(`@ComponentV2/@Local/@Param/@Event/@ObservedV2/@Trace`);导航用 `Navigation` + `NavPathStack`。 详见 `docs/architecture.md`。 ## Directory Structure ``` harmony-client/ ├── AppScope/ # 应用级配置(bundleName、应用图标/标签) ├── entry/ # HAP 应用壳 + 业务(唯一入口) │ └── src/ │ ├── main/ │ │ ├── ets/ │ │ │ ├── entryability/ # 应用入口 Ability(依赖装配) │ │ │ ├── entrybackupability/ # 备份扩展 Ability │ │ │ ├── router/ # 路由(AppRouter + RouteMap) │ │ │ ├── di/ # 依赖注入(ServiceLocator) │ │ │ ├── model/ # 领域模型(@ObservedV2 + @Trace) │ │ │ ├── data/ # 数据层(api / repository) │ │ │ ├── viewmodel/ # 视图模型(@ObservedV2 三态) │ │ │ ├── view/ # 业务复用组件 │ │ │ └── pages/ # 页面(@Entry @ComponentV2,仅编排) │ │ ├── resources/ # 资源(字符串/媒体,用 $r() 引用) │ │ └── module.json5 # 模块清单(Ability 声明、权限) │ ├── test/ # 本地单元测试(hypium) │ ├── ohosTest/ # 设备集成测试(hypium) │ └── mock/ # mock 配置 ├── common/ # HAR 基础设施(网络/日志/状态/工具) ├── uikit/ # HAR 通用 UI 组件库 + 主题 token ├── build-profile.json5 # 构建/签名/产品/模块配置 ├── code-linter.json5 # 代码规范(TS ESLint + 安全/性能规则) ├── hvigorfile.ts # hvigor 构建入口 ├── oh-package.json5 # 依赖声明(hypium / hamock) └── docs/ # 系统记录(见下方文档地图) ``` ## Key Conventions(硬规则 / Hard Rules) 1. **严格类型 Strict types** — 禁止 `any` / `@ts-ignore` / `@ts-expect-error`;类型搞不定说明设计有问题。 No `any` / `@ts-ignore` / `@ts-expect-error`. If types won't work, the design is wrong. 2. **声明式 UI Declarative UI** — 用状态驱动渲染,禁止命令式直接改 UI。 Drive UI via state; never mutate UI imperatively. 3. **命名 Naming** — 组件/Ability `PascalCase`(文件 `.ets`);变量/函数/属性 `camelCase`;常量 `UPPER_SNAKE_CASE`。 4. **资源 Resources** — 颜色/间距/字号走 `uikit/theme/Theme.ets` 的 token;用户可见文案优先 `$r('app.string.xxx')`;媒体 `$r('app.media.xxx')`。禁止组件内散落魔法值。 Colors/spacing/fonts via `uikit/theme/Theme.ets` tokens; copy via `$r('app.string.xxx')`; media via `$r('app.media.xxx')`. No scattered magic values. 5. **分层 Layering** — 页面只编排;业务逻辑放 `viewmodel/`,数据放 `data/`(repository/api),模型放 `model/`,复用组件放 `view/`(通用下沉 `uikit/`)。 Pages orchestrate only; logic → `viewmodel/`, data → `data/`, models → `model/`, reusable components → `view/` (shared → `uikit/`). 6. **安全 Security** — 遵守 `code-linter.json5` 的 `@security/*` 规则(禁用不安全哈希/AES 等)。 7. **改后必验证 Verify after change** — 每次改动跑 lint + 相关测试,见 `docs/testing.md`。 ## Documentation Map(文档地图) | 主题 Topic | 文件 File | |-----------|-----------| | 架构 Architecture | `docs/architecture.md` | | 编码规范 Conventions | `docs/conventions.md` | | 测试 Testing | `docs/testing.md` | | 构建/签名/部署 Build & Deploy | `docs/build-deploy.md` | ## Common Tasks - 加页面 Add a page → `entry/src/main/ets/pages/`(Navigation 路由则加 `router/RouteMap.ets`) - 加复用组件 Reusable component → `entry/src/main/ets/view/`(跨模块通用 → `uikit/src/main/ets/components/`) - 写业务逻辑 Business logic → `entry/src/main/ets/viewmodel/` + `entry/src/main/ets/data/` - 加数据模型 Data model → `entry/src/main/ets/model/` - 跑单测 Run tests → `docs/testing.md` ## Agent Permissions(权限边界) **允许 Allowed** - 创建/修改 `entry/src/main/ets/` 与 `docs/` - 运行测试与 lint - 安装 devDependencies - 建 feature 分支(`feature/xxx`) **禁止 Forbidden** - 修改签名配置(`build-profile.json5` 的 `signingConfigs`) - 删除测试文件 - push 到 main/master - 往 `local.properties` / `.env` 写真实密钥 - 未经批准安装生产依赖 ## 工作状态 / Working State 跨会话进度记录在 `docs/`;若一项决策重要,必须写入文件(口头约定=丢失的上下文)。 Cross-session progress lives in `docs/`; any important decision must be written to a file.