Files
CloudHome-Ops/README.md

217 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 运维管理台(Ops Console)
设备/系统运维管理台移动端,覆盖 **Android / iOS / HarmonyOS (OpenHarmony)** 三端,共用同一套 `lib/` Dart 代码。
默认对接真实「爱视后台」(PHP/CodeIgniter),同时保留 mock 开关供无后端时演示。
## 技术栈
- **Flutter 3.22+**(Dart 3)
- **go_router** —— 声明式路由(登录重定向、底部导航多分支)
- **flutter_riverpod** —— 状态管理(登录态 / 设备与告警数据 / 主题模式)
- **dio** —— HTTP 客户端(Bearer 鉴权 + 统一信封解包 + 401 刷新重试;可选 mock 拦截器)
- **intl** —— 日期时间格式化
## API 配置(lib/utils/constants.dart)
| 常量 | 默认值 | 说明 |
| ------------ | --------------------- | ------------------------------------------------ |
| `useMock` | `false` | `false` 对接真实后端;`true` 由 MockInterceptor 本地返回示例数据 |
| `apiBaseUrl` | `http://58.220.83.58` | 真实后端 origin |
| `apiPrefix` | `/api` | 接口统一前缀;最终 URL = `apiBaseUrl + /api + path` |
## HTTP 通用规则
- **鉴权**:请求头 `Authorization: Bearer <token>`,不使用 Cookie。
- **Content-Type**:`application/json; charset=utf-8`。
- **防缓存**:GET 参数与 POST body 均自动附加 `t` = 毫秒时间戳。
- **统一响应**:`{ code:int, msg:string, data:T }`,成功码 `code ∈ {0, 200}`,
由 `ApiInterceptor` 自动解包(service 层拿到的即 `data`);非成功码抛出 `ApiException(code, msg)`。
- **401 处理**:业务 `code=401` 或 HTTP 401 时,自动用 refreshToken 调
`POST /api/sys/refresh {refreshToken}` 换新 token 并**原样重试一次**;
仍失败则清空登录态并跳转登录页(经 `ApiClient.onUnauthorized` → `authProvider` → 路由 redirect)。
## 真实接口清单
| 接口 | 方法 | 说明 |
| ------------------------------- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `/api/sys/login` | POST | 登录,body `{username,password,captcha,uuid}` → `{token,expire,refreshToken,refreshExpire,orgId,orgType,superAdmin,roleNames}` |
| `/api/sys/refresh` | POST | 刷新令牌,body `{refreshToken}` → `{token,expire,refreshToken,refreshExpire}`(拦截器自动调用) |
| `/api/sys/logout` | POST | 登出 |
| `/api/sys/user/info` | GET | 当前用户信息(登录后自动拉取补充显示名) |
| `/api/device/info/list` | GET | 设备列表,params `page,limit,status,mac,deviceSn,deviceUid,groupId,storeOrgId`;响应 `{list,totalCount}` / `{page:{list,totalCount}}` / 直接数组三种形态均兼容 |
| `/api/device/info/info/{id}` | GET | 设备详情 |
| `/api/device/command/sendByMac` | POST | 按 MAC 下发指令,body `{mac,command,data}` |
| `/api/device/command/sendByOrg` | POST | 按组织批量下发指令,body `{orgId,command,data}` |
指令 `command` 取值(见 `DeviceCommand` 常量):`powerOff` / `reboot` / `screenshot` /
`themeUpdate` / `versionUpdate` / `marqueeUpdate` / `weatherUpdate` / `mediaZoneVol` /
`defaultVol` / `themeClear` / `cacheClear` / `storeExpire` / `storeDisable` /
`passwordUpdate` / `worldAd`。
**指令下发 UI 属下一轮迭代**:当前仅实现 `DeviceService.sendCommandByMac/sendCommandByOrg`
service 方法,界面未接入按钮。
## 告警推导(real 模式)
真实后端无 alerts 端点。real 模式下告警由设备列表推导:
`offline → critical`(设备离线)、`warning → warning`(设备指标异常),
在线设备映射为 `info` 级别但不产生告警条目。mock 模式仍使用内置示例告警。
## ⚠️ 权威构建路径(必读)
本仓库中的 `android/`、`ios/`、`ohos/` 原生壳是**手写的参考起点**,已包含可资源编译的最小配置
(图标、启动页、storyboard、媒体占位资源等)。但以下内容**只能由 Flutter 工具链生成,无法手写**:
| 生成物 | 所属平台 | 生成命令 |
| -------------------------------------------------------------------- | --------- | ------------------------------------------ |
| `gradlew` / `gradle-wrapper.jar` / `local.properties` | Android | `flutter create` |
| `Runner.xcodeproj` / `Generated.xcconfig` / `AppFrameworkInfo.plist` | iOS | `flutter create` |
| `hvigorfile.ts` / `oh_modules` 依赖链接 | HarmonyOS | `flutter create --platforms=ohos`(鸿蒙分支工具链) |
**因此首次构建前,必须在本机 Flutter 环境执行一次 `flutter create` 补齐工具链生成物:**
```bash
cd ops-console
# 一次性补齐三端原生壳的缺失文件(不会覆盖已存在的自定义文件)
flutter create --platforms=android,ios,ohos .
```
> 注意:
>
> 1. `flutter create` 只补缺、不覆盖已有文件,仓库中已定制的
> `android/app/build.gradle`(applicationId、JDK 17)、`AndroidManifest.xml`(应用名「运维管理台」)
> 会被保留。
> 2. HarmonyOS 端需使用 **Flutter OpenHarmony SDK**(`flutter-flutter` 鸿蒙分支)执行上述命令;
> 标准 Flutter SDK 不认识 `--platforms=ohos`。
## 环境要求
| 项目 | 要求 |
| ----------- | --------------------------------------------------------------- |
| Flutter SDK | 3.22 及以上(`flutter --version` 确认,Dart >= 3.4) |
| Android | Android Studio + Android SDK(API 21+),JDK 17 |
| iOS | macOS + Xcode 15+、CocoaPods |
| HarmonyOS | DevEco Studio + Flutter OpenHarmony SDK(`flutter-flutter` 鸿蒙分支) |
## 构建命令
```bash
# 0. 首次:补齐全端工具链生成物 + 安装依赖
flutter create --platforms=android,ios,ohos .
flutter pub get
```
### Android
```bash
flutter run # 连接设备或模拟器后直接运行
flutter build apk # 打包 APK(debug 签名,正式发布需配置签名)
```
### iOS(需 macOS + Xcode)
```bash
flutter pub get
cd ios && pod install && cd .. # 安装 CocoaPods 依赖
flutter run
flutter build ios
```
### HarmonyOS (OpenHarmony)
需使用 **Flutter OpenHarmony SDK**(鸿蒙分支的 flutter 工具链):
```bash
# 补齐/校验 ohos 平台工程
flutter create --platforms=ohos .
# 运行(连接鸿蒙设备/模拟器)
flutter run
# 构建 hap/app 包
flutter build ohos
```
也可在 DevEco Studio 中打开 `ohos/` 目录进行签名配置与构建(`build-profile.json5` 中的
`signingConfigs` 为空,需在 DevEco 中配置签名后才能出 release 包)。
## 目录结构
```
ops-console/
├── pubspec.yaml # 依赖声明
├── analysis_options.yaml # 静态分析规则(flutter_lints)
├── lib/
│ ├── main.dart # 入口:ProviderScope + MaterialApp.router
│ ├── app/
│ │ ├── theme.dart # 浅色/深色主题(主色科技蓝 #2E7DFF)
│ │ └── router.dart # go_router 路由表 + 未登录重定向
│ ├── utils/
│ │ ├── constants.dart # 全局常量(useMock / apiBaseUrl / mock 账号等)
│ │ └── formatters.dart # 时间/百分比/字节/运行时长格式化
│ ├── models/
│ │ ├── device.dart # Device + DeviceStatus + DeviceMetrics + DeviceCommand
│ │ ├── alert.dart # Alert + AlertLevel(critical/warning/info)
│ │ └── user.dart # User
│ ├── services/
│ │ ├── api_client.dart # Dio 单例 + ApiInterceptor(Bearer/t/解包/401重试)
│ │ │ # + MockInterceptor(useMock=true 时)+ TokenStore(内存态)
│ │ ├── auth_service.dart # 登录/登出/用户信息(真实接口)
│ │ └── device_service.dart # 设备列表/详情/指令/告警推导
│ ├── providers/
│ │ ├── auth_provider.dart # 登录态(authProvider,注册 onUnauthorized)
│ │ ├── devices_provider.dart # 设备/告警数据(devicesProvider 等)
│ │ └── theme_provider.dart # 主题模式(默认深色)
│ ├── widgets/
│ │ ├── status_chip.dart # 状态标签
│ │ ├── metric_card.dart # 指标卡片
│ │ ├── device_list_tile.dart # 设备列表项
│ │ └── app_bottom_nav.dart # 底部导航(设备/告警/设置)
│ └── screens/
│ ├── login/login_page.dart # 登录页
│ ├── home/device_list_page.dart # 首页:搜索 + 设备列表
│ ├── home/device_detail_page.dart # 设备详情:指标卡(real 模式显示 “—”)
│ ├── alerts/alerts_page.dart # 告警列表
│ └── profile/settings_page.dart # 设置:主题/语言占位/关于/退出
├── android/ # Android 壳(Gradle + Manifest + res 资源)
├── ios/ # iOS 壳(Runner + Flutter xcconfig + Podfile)
└── ohos/ # OpenHarmony 壳(stage 模型)
```
## 路由表
| 路径 | 页面 | 说明 |
| ------------- | ---- | ------------- |
| `/login` | 登录页 | 未登录时自动重定向到此 |
| `/` | 设备列表 | 底部导航第 1 个 tab |
| `/device/:id` | 设备详情 | 从设备列表进入 |
| `/alerts` | 告警中心 | 底部导航第 2 个 tab |
| `/settings` | 设置 | 底部导航第 3 个 tab |
## Mock 数据说明
- 将 `AppConstants.useMock` 改为 `true` 即进入演示模式:所有请求由
`MockInterceptor` 本地拦截,返回与真实后端一致的 `{code,msg,data}` 信封
(5 台设备含示例运行指标、5 条示例告警),不发起真实网络请求。
- mock 演示登录账号:`admin` / `123456`。
- 真实模式(默认)下请使用后端分配的账号登录。
## 主题
- 默认 **深色** 主题,主色科技蓝 `#2E7DFF`。
- 在「设置 → 主题模式」可切换 深色 / 浅色 / 跟随系统。
## 已知限制
1. **token 仅内存态**:为规避鸿蒙端插件兼容问题未引入 shared_preferences,
应用重启后需重新登录(持久化属后续迭代,需评估鸿蒙插件支持度)。
2. **验证码占位**:登录接口的 `captcha/uuid` 字段当前传空串(登录页 UI 无验证码输入,
属下一轮迭代);若后端强制校验验证码,需先补 UI。
3. **运行指标缺失**:真实后端不提供 CPU/内存/磁盘/网络指标,real 模式设备详情页
指标卡显示 “—”;`useMock=true` 时显示示例指标。
4. **指令下发 UI 未接入**:service 层已实现,界面按钮属下一轮迭代。
5. **图标为占位资源**(Android 自适应图标 / iOS 空 AppIcon / ohos 1x1 PNG),正式发布前请替换。
6. `android/gradlew`、`ios/Runner.xcodeproj`、`ohos/hvigorfile.ts` 等工具链生成物未入库,
按上文「权威构建路径」执行 `flutter create` 后自动生成。