# jiankong_app **Repository Path**: liyao123456/jiankong_app ## Basic Information - **Project Name**: jiankong_app - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-07-25 - **Last Updated**: 2025-07-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 监控应用 - Flutter + GetX 项目 这是一个使用Flutter和GetX框架构建的示例应用,演示了GetX的状态管理、路由管理和依赖注入功能。 ## 项目特色 - ✅ Flutter 3.29.3 - ✅ GetX 4.7.2 状态管理 - ✅ GetX CLI 生成的标准项目结构 - ✅ 响应式编程 - ✅ 路由管理 - ✅ 依赖注入 ## Flutter 环境配置 ### 问题解决:Flutter 命令找不到 如果你遇到 `flutter: command not found` 的错误,这是因为Flutter SDK路径没有正确添加到系统PATH中。 #### 临时解决方案(当前会话) ```bash export PATH="/Users/leo/dev/flutter/bin:$PATH" ``` #### 永久解决方案 1. 编辑你的shell配置文件: ```bash # 如果使用zsh (默认在macOS) nano ~/.zshrc # 或者如果使用bash nano ~/.bash_profile ``` 2. 在文件末尾添加以下行: ```bash export PATH="/Users/leo/dev/flutter/bin:$PATH" ``` 3. 重新加载配置: ```bash # 如果使用zsh source ~/.zshrc # 或者如果使用bash source ~/.bash_profile ``` 4. 验证配置: ```bash flutter --version ``` ## 项目结构 ``` lib/ ├── app/ │ ├── modules/ │ │ └── home/ │ │ ├── bindings/home_binding.dart # 依赖绑定 │ │ ├── controllers/home_controller.dart # 控制器 │ │ └── views/home_view.dart # 视图 │ └── routes/ │ ├── app_pages.dart # 路由页面配置 │ └── app_routes.dart # 路由常量 └── main.dart # 应用入口 ``` ## 运行项目 ### 1. 安装依赖 ```bash export PATH="/Users/leo/dev/flutter/bin:$PATH" flutter pub get ``` ### 2. 运行应用 ```bash export PATH="/Users/leo/dev/flutter/bin:$PATH" flutter run ``` ### 3. 分析代码 ```bash export PATH="/Users/leo/dev/flutter/bin:$PATH" flutter analyze ``` ## GetX CLI 使用 项目已经安装了get-cli工具,可以快速生成GetX结构: ### 创建新页面 ```bash get create page:settings ``` ### 创建新控制器 ```bash get create controller:user ``` ### 创建新视图 ```bash get create view:profile ``` ## GetX 核心概念演示 ### 1. 响应式变量 (Reactive Variables) ```dart class HomeController extends GetxController { var count = 0.obs; // .obs 使变量变为响应式 void increment() => count.value++; } ``` ### 2. 状态监听 (State Observing) ```dart Obx(() => Text('${controller.count}')) // 自动重建当count变化时 ``` ### 3. 依赖注入 (Dependency Injection) ```dart class HomeView extends GetView { // controller 自动注入,无需手动Get.find() } ``` ### 4. 路由管理 (Route Management) ```dart GetMaterialApp( initialRoute: AppPages.INITIAL, getPages: AppPages.routes, ) ``` ## 特性展示 - **响应式计数器**:演示响应式变量和状态管理 - **多按钮操作**:增加、减少、重置功能 - **美观界面**:使用Material Design 3 - **路由导航**:GetX路由系统 ## 开发工具 - **GetX CLI**: 快速生成代码结构 - **Flutter Inspector**: 调试界面布局 - **Hot Reload**: 快速开发迭代 ## API 接口说明 ### 用户认证接口 - `login(phoneNumber, password)` - 用户登录 - `logout()` - 用户退出登录 - `getUserInfo()` - 获取用户信息 ### 用户管理接口 - `editUserInfo(userModel)` - 编辑用户信息 - `getSysConfig()` - 获取用户配置信息 ### 报警消息管理接口 - `getAlarmTypes()` - 获取所有告警类型 - `getUnreadAlarmCount()` - 获取未读消息数 - `getAlarmMessages(query)` - 获取报警消息列表 - `readAlarmMessage(msgId, hsId)` - 标记消息为已读 - `getChannelAlarmGroups()` - 获取报警消息按通道分组 ### 通道管理接口 - `getChannelStat()` - 获取通道数统计 - `getOrganizeList()` - 获取组织列表 - `getChannelList(query)` - 获取通道列表 - `getChannelDetail(hsId)` - 获取通道详细信息 ### 实时视频管理接口 - `startStream(serial, playType)` - 开始直播 - `stopStream(serial, code, checkOutputs)` - 停止直播 - `getTalkUrl(serial, code)` - 获取对讲地址 ### 录像回放管理接口 - `getPlaybackRecordList(params)` - 获取录像回放列表 ### 云端录像管理接口 - `getCloudRecordMonthly(params)` - 云端录像按月查询 - `getCloudRecordDaily(params)` - 云端录像按天查询 - `startPlayback(params)` - 开始回放录像 - `stopPlayback(params)` - 回放流停止 - `controlPlayback(params)` - 回放控制 - `downloadRecord(params)` - 录像下载 #### 高级用法示例 ```dart import 'package:jiankong_app/app/data/services/api_service.dart'; import 'package:jiankong_app/app/data/models/user_model.dart'; // 直接使用 ApiService final apiService = ApiService(); // 用户登录 final loginResponse = await apiService.login('15199999999', 'WAjmSU@96371'); if (loginResponse.success) { print('登录成功: ${loginResponse.data?.userName}'); } // 获取用户信息 final userResponse = await apiService.getUserInfo(); if (userResponse.success) { print('用户信息: ${userResponse.data?.userName}'); } // 获取报警消息 final query = AlarmMessageQueryModel( pageNo: 1, pageSize: 20, alarmType: 1, ); final messagesResponse = await apiService.getAlarmMessages(query); if (messagesResponse.success) { print('报警消息数量: ${messagesResponse.data?.records.length}'); } // 通道管理示例 final channelStatResponse = await apiService.getChannelStat(); if (channelStatResponse.success) { print('在线通道: ${channelStatResponse.data?.onlineChannels}'); print('离线通道: ${channelStatResponse.data?.offlineChannels}'); } // 获取组织列表 final organizeResponse = await apiService.getOrganizeList(); if (organizeResponse.success) { print('组织数量: ${organizeResponse.data?.length}'); } // 获取通道列表 final channelQuery = ChannelQueryModel( organizeId: '1', status: 'ON', pageNo: 1, pageSize: 20, ); final channelsResponse = await apiService.getChannelList(channelQuery); if (channelsResponse.success) { print('通道数量: ${channelsResponse.data?.records.length}'); } // 实时视频管理示例 // 开始直播 final startStreamResponse = await apiService.startStream( StartStreamModel( serial: '34020000001310000001', playType: 'HLS', ), ); if (startStreamResponse.success) { print('直播地址: ${startStreamResponse.data}'); } // 停止直播 final stopStreamResponse = await apiService.stopStream( StopStreamModel( serial: '34020000001310000001', checkOutputs: false, ), ); if (stopStreamResponse.success) { print('直播已停止'); } // 获取对讲地址 final talkUrlResponse = await apiService.getTalkUrl( TalkUrlModel( serial: '34020000001310000001', ), ); if (talkUrlResponse.success) { print('对讲地址: ${talkUrlResponse.data}'); } // 录像回放管理示例 // 获取录像回放列表 final playbackQuery = PlaybackRecordListModel( serial: '34020000001310000001', starttime: '2024-01-01T00:00:00', endtime: '2024-01-01T23:59:59', type: 'all', ); final playbackResponse = await apiService.getPlaybackRecordList(playbackQuery); if (playbackResponse.success) { print('录像总数: ${playbackResponse.data?.sumNum}'); print('录像列表: ${playbackResponse.data?.recordList.length}'); } // 云端录像管理示例 // 云端录像按月查询 final monthlyQuery = CloudRecordMonthlyQueryModel( serial: '34020000001310000001', period: '202401', // YYYYMM ); final monthlyResponse = await apiService.getCloudRecordMonthly(monthlyQuery); if (monthlyResponse.success) { print('当月有录像的天数: ${monthlyResponse.data?.length}'); print('录像日期: ${monthlyResponse.data}'); } // 云端录像按天查询 final dailyQuery = CloudRecordDailyQueryModel( serial: '34020000001310000001', period: '20240101', // YYYYMMDD ); final dailyResponse = await apiService.getCloudRecordDaily(dailyQuery); if (dailyResponse.success) { print('通道名称: ${dailyResponse.data?.name}'); print('当天录像数量: ${dailyResponse.data?.list.length}'); } // 开始回放录像 final startPlaybackParams = PlaybackStartModel( serial: '34020000001310000001', starttime: '2024-01-01T10:00:00', endtime: '2024-01-01T11:00:00', ); final startPlaybackResponse = await apiService.startPlayback(startPlaybackParams); if (startPlaybackResponse.success) { print('回放流ID: ${startPlaybackResponse.data?.streamID}'); print('HLS播放地址: ${startPlaybackResponse.data?.hls}'); print('WEBRTC播放地址: ${startPlaybackResponse.data?.webrtc}'); } // 回放控制 final controlParams = PlaybackControlModel( streamId: 'your_stream_id', command: 'play', // play, pause, teardown, scale range: 'now', ); final controlResponse = await apiService.controlPlayback(controlParams); if (controlResponse.success) { print('回放控制成功'); } // 停止回放 final stopPlaybackParams = PlaybackStopModel( streamId: 'your_stream_id', ); final stopPlaybackResponse = await apiService.stopPlayback(stopPlaybackParams); if (stopPlaybackResponse.success) { print('回放已停止'); print('下载文件地址: ${stopPlaybackResponse.data?.playbackFileURL}'); } // 录像下载 final downloadParams = RecordDownloadModel( deviceId: '34020000001310000001', channelId: '34020000001310000001', storeType: 2, // 1设备存储 2中心存储 startTime: '20240101100000', // YYYYMMDDHHmmss endTime: '20240101110000', ); final downloadResponse = await apiService.downloadRecord(downloadParams); if (downloadResponse.success) { print('下载地址: ${downloadResponse.data}'); } ``` ### 数据模型 #### 用户模型 (UserModel) - `userId` - 用户ID - `userName` - 用户名 - `phoneNumber` - 手机号 - `tenantId` - 租户ID - `picUrl` - 头像URL #### 系统配置模型 (SysConfigModel) - `id` - 配置ID - `configKey` - 配置键 - `configValue` - 配置值 - `configType` - 配置类型 - `remark` - 备注 #### 报警类型模型 (AlarmTypeModel) - `id` - 类型ID - `typeName` - 类型名称 - `typeCode` - 类型编码 - `description` - 描述 #### 报警消息模型 (AlarmMessageModel) - `id` - 消息ID - `planId` - 报警计划ID - `channelName` - 通道名称 - `channelId` - 通道ID - `deviceName` - 设备名称 - `deviceId` - 设备ID - `alarmTypeName` - 报警类型名称 - `alarmType` - 报警类型 - `time` - 报警时间 - `startTime` - 录像开始时间 - `endTime` - 录像结束时间 - `alarmPicture` - 联动快照 - `videoType` - 录像类型 - `organizeId` - 组织ID - `organizeName` - 组织名称 - `hsId` - 华数通道ID #### 通道报警分组模型 (ChannelAlarmGroupModel) - `hsId` - 华数通道ID - `unreadMsgCnt` - 未读消息数 - `lastAlarmMessageVO` - 最近一条报警消息 #### 通道统计模型 (ChannelStatModel) - `onlineChannels` - 在线通道数 - `offlineChannels` - 离线通道数 #### 组织模型 (OrganizeModel) - `id` - 组织ID - `organizeCode` - 组织机构编码 - `organizeName` - 组织机构名称 - `parentId` - 父级ID - `organizeLevel` - 组织机构级别 - `feature` - 扩展字段 - `sort` - 排序字段 - `state` - 是否删除 - `isCascade` - 是否级联 - `isDomain` - 是否域组织 - `tenantId` - 租户ID #### 通道模型 (ChannelModel) - `id` - 通道ID - `deviceId` - 设备ID - `name` - 通道名 - `deviceName` - 设备名称 - `hsOrganizationId` - 组织ID - `hsOrganizationName` - 组织名称 - `manufacturer` - 厂家 - `model` - 型号 - `owner` - 所有者 - `civilCode` - 行政编码 - `address` - 设备地址 - `businessGroupId` - 业务编码 - `firmware` - 固件版本 - `serialNumber` - 序列号 - `ipAddress` - IP地址 - `port` - 端口 - `parental` - 是否父节点 - `parentId` - 父节点ID - `status` - 状态 (ON|OFF) - `longitude` - 经度 - `latitude` - 纬度 - `altitude` - 海拔高度 - `batteryLevel` - 电量 - `signalLevel` - 信号强度 - `ptzType` - PTZ类型 - `snapUrl` - 抓图地址 - `hsId` - 华数通道ID - `channelId` - 通道编码 #### 通道详情模型 (ChannelDetailModel) - `channelId` - 通道编码 - `channelName` - 通道名称 - `ptzType` - PTZ类型 - `longitude` - 经度 - `latitude` - 纬度 - `deviceId` - 设备编码 - `deviceName` - 设备名称 - `deviceType` - 协议类型 - `remoteIp` - IP地址 - `remotePort` - 端口 - `domainName` - 域名称 - `domainId` - 国标编码 - `organizeStr` - 域组织 #### 开始直播参数模型 (StartStreamModel) - `serial` - 设备ID - `playType` - 播放地址类型 (WEBRTC、FLV、WS_FLV、RTMP、HLS、RTS) #### 停止直播参数模型 (StopStreamModel) - `serial` - 设备ID - `code` - 通道ID - `checkOutputs` - 是否检查通道在线人数 #### 对讲地址参数模型 (TalkUrlModel) - `serial` - 设备ID - `code` - 通道ID #### 录像回放列表参数模型 (PlaybackRecordListModel) - `serial` - 设备ID - `channel` - 通道序号 - `code` - 通道编号 - `starttime` - 开始时间 (YYYY-MM-DDTHH:mm:ss) - `endtime` - 结束时间 (YYYY-MM-DDTHH:mm:ss) - `type` - 录像类型 (all-所有, time-定时录像, alarm-报警录像, manual-手动录像) - `center` - 是否进行中心历史记录检索 - `indistinct` - 是否同时进行中心检索和前端检索 - `timeout` - 超时时间(秒) #### 录像记录模型 (RecordItemModel) - `deviceID` - 通道编号 - `name` - 通道名称 - `filePath` - 文件路径名 - `fileSize` - 文件大小 - `address` - 录像地址 - `startTime` - 录像开始时间 - `endTime` - 录像结束时间 - `secrecy` - 保密属性 (0-不涉密, 1-涉密) - `type` - 录像产生类型 (time, alarm, manual, all) - `recorderID` - 录像触发者ID #### 录像回放数据模型 (PlaybackRecordDataModel) - `sn` - 设备序列号 - `deviceID` - 设备ID - `name` - 设备名称 - `sumNum` - 录像总数 - `recordList` - 录像列表 (RecordItemModel数组) #### 云端录像按月查询参数模型 (CloudRecordMonthlyQueryModel) - `serial` - 设备ID - `code` - 通道编号 - `period` - 月份 (YYYYMM) #### 云端录像按天查询参数模型 (CloudRecordDailyQueryModel) - `serial` - 设备ID - `code` - 通道编号 - `period` - 日期 (YYYYMMDD) #### 云端录像按天查询响应数据模型 (CloudRecordDailyDataModel) - `name` - 通道名称 - `list` - 当天录像列表 (CloudRecordItemModel数组) #### 云端录像项模型 (CloudRecordItemModel) - `name` - 通道名称 - `startAt` - 开始时间 (YYYYMMDDHHmmss) - `duration` - 录像时长 - `hls` - 录像播放链接 - `import` - 重要标记 #### 开始回放录像参数模型 (PlaybackStartModel) - `serial` - 设备ID - `channel` - 通道序号 - `code` - 通道编号 - `starttime` - 开始时间 (YYYY-MM-DDTHH:mm:ss) - `endtime` - 结束时间 (YYYY-MM-DDTHH:mm:ss) - `download` - 下载标识 - `downloadSpeed` - 下载倍速 - `smsId` - 指定SMS - `audio` - 是否开启音频 - `transport` - 流传输模式 - `transportMode` - 流传输主被动模式 - `timeout` - 超时时间(秒) #### 开始回放录像响应数据模型 (PlaybackStartDataModel) - `streamID` - 回放流ID - `smsID` - 流媒体编号 - `deviceID` - 设备编号 - `channelID` - 通道编号 - `channelName` - 通道名称 - `channelCustomName` - 通道自定义名称 - `webrtc` - WEBRTC播放地址 - `flv` - HTTP-FLV播放地址 - `wsFLV` - Websocket-FLV播放地址 - `rtmp` - RTMP播放地址 - `hls` - HLS(M3U8)播放地址 - `rtsp` - RTSP播放地址 - `cdn` - 转推CDN地址 - `snapURL` - 快照地址 - `transport` - 流传输模式 - `startAt` - 开始时间 - `recordStartAt` - 实时录像开始时间 - `duration` - 持续时间(秒) - `playbackDuration` - 回放文件总时长(秒) - `timestampSec` - 当前回放时长(秒) - `progress` - 回放进度([0-1]) - `playbackFileURL` - 下载文件链接 - 其他视频音频相关参数... #### 回放流停止参数模型 (PlaybackStopModel) - `streamId` - 回放流ID #### 回放流停止响应数据模型 (PlaybackStopDataModel) - `playbackFileURL` - 下载文件链接 #### 回放控制参数模型 (PlaybackControlModel) - `streamId` - 回放流ID - `command` - 回放控制类型 (play, pause, teardown, scale) - `range` - 跳转时间点 - `scale` - 播放倍率 #### 录像下载参数模型 (RecordDownloadModel) - `deviceId` - 设备ID - `channelId` - 通道ID - `storeType` - 存储类型 (1设备存储 2中心存储) - `startTime` - 开始时间 (YYYYMMDDHHmmss) - `endTime` - 结束时间 (YYYYMMDDHHmmss) ## 下一步 1. 添加更多页面和功能 2. 集成API请求 (GetConnect) 3. 添加本地存储 (GetStorage) 4. 实现主题切换 5. 添加国际化支持 --- **注意**:确保Flutter环境正确配置后,所有命令都能正常工作。如果遇到问题,请参考上面的"Flutter 环境配置"部分。