iotsaas/docs/feature-roadmap.md
2995840376 0ce191c448 chore: 初始化 iotsaas 版本库基线
纳入范围:
- backend/  Spring Boot 多模块后端(iot-common/device/rule/data/alarm/auth)
- frontend/admin/  Vue3 + Element Plus 管理后台
- Android/   涂鸦原生 APP (com.xhai.iot)
- backend/sql/  Flyway 风格迁移脚本(V2~V21)
- docs/       对接文档与设计文档

排除范围:
- 构建产物: node_modules/ target/ build/ dist/ .gradle/
- 签名密钥: *.jks *.keystore (严禁入库)
- 本机配置: Android/local.properties
- 运行日志: logs/ *.log
- AI 协作本地数据 .codebuddy/ 与第三方 demo tuya-demo/

.gitattributes 统一以 LF 存储, Windows 批处理保留 CRLF
2026-10-27 12:00:41 +08:00

362 lines
14 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.

# IoT SaaS 平台 — 功能规划与实现路线图
> 更新时间: 2026-06-17
> 当前版本: v0.9-alpha(基础框架完成,业务功能需补全)
---
## 一、现状总览
### 1.1 已完成的骨架(后端 4 大微服务)
| 服务 | 端口 | 完成度 | 说明 |
|------|------|--------|------|
| iot-device (设备管理) | 9081 | **60%** | CRUD有,但缺少分组管理、批量操作、固件升级 |
| iot-data (数据采集) | 9082 | **70%** | MQTT接收+InfluxDB存储OK,缺实时数据流推送 |
| iot-rule (规则引擎) | 9083 | **65%** | Aviator表达式引擎OK,缺可视化规则编辑器 |
| iot-alarm (告警服务) | 9084 | **65%** | 基本告警流程OK,缺告警升级策略、值班排班 |
### 1.2 已有的前端页面(7个)
| 页面 | 路径 | 完成度 | 缺失功能 |
|------|------|--------|----------|
| Dashboard | /dashboard | **20%** | 几乎空白,无数据卡片、图表、统计 |
| 设备列表 | /devices | **75%** | 列表CRUD OK,缺详情页内容、在线状态实时刷新 |
| 设备详情 | /devices/:id | **10%** | 页面存在但基本为空壳 |
| 数据采集 | /data | **30%** | 缺历史曲线图、数据导出 |
| 规则引擎 | /rules | **55%** | 列表OK,规则编辑器体验差(纯表单) |
| 告警列表 | /alarms | **50%** | 列表OK,缺实时WebSocket推送、统计面板 |
| 告警规则 | /alarm-rules | **55%** | CRUD OK,缺条件可视化配置 |
| 登录 | /login | **85%** | 基本OK |
### 1.3 完全缺失的模块
| 模块 | 重要性 | 说明 |
|------|--------|------|
| 🔴 用户/角色管理 | **P0** | 有sys_user/sys_role表但没有前端页面和管理接口 |
| 🔴 租户管理 | **P0** | 有tenant表但没有多租户隔离逻辑 |
| 🟡 设备分组管理 | **P1** | 有device_group表但前端无对应页面 |
| 🟡 操作日志 | **P1** | 有log_operation表但无查询页面 |
| 🟡 第三方设备适配器 | **P1** | 只有LocalDeviceAdapter模拟器 |
| 🟢 文件/图片上传 | **P2** | 无上传服务 |
| 🟢 个人中心 | **P2** | 无修改密码、个人信息页 |
| 🟢 UniApp移动端 | **P2** | 未开始开发 |
| ⚪ API网关 | **P3** | 单体阶段可暂缓 |
| ⚪ Matter协议 | **P3** | 可选扩展 |
---
## 二、按优先级划分的详细功能清单
### P0 — 必须立即实现(核心可用性)
#### 2.1 Dashboard 数据看板(当前几乎空白!)
```
目标:打开系统第一眼能看到全局运营状态
```
| 功能点 | 描述 | 复杂度 |
|--------|------|--------|
| 设备统计卡片 | 在线/离线/异常设备数,总设备数 | 低 |
| 今日告警概览 | 新增告警数、待处理数、已解决数 | 低 |
| 数据上报趋势 | 近7天数据量折线图(ECharts) | 中 |
| 设备类型分布饼图 | sensor/controller/gateway占比 | 低 |
| 最近告警列表 | 最新5条告警,点击跳转详情 | 低 |
| 设备状态地图 | 可选:设备地理位置分布 | 高(可选) |
#### 2.2 用户 & 权限管理(系统管理员必须能管人)
| 功能点 | 描述 | 复杂度 |
|--------|------|--------|
| 用户列表 | 分页、搜索、角色筛选 | 低 |
| 用户新增/编辑 | 用户名/密码/手机号/邮箱/分配角色 | 中 |
| 用户禁用/启用 | 冻结账户 | 低 |
| 重置密码 | 管理员重置用户密码 | 低 |
| 角色列表 | 角色 CRUD | 低 |
| 权限分配 | 给角色勾选菜单权限/按钮权限 | 中 |
| 菜单权限控制 | 根据角色动态显示菜单 | 中 |
| 按钮级权限 | v-permission指令控制按钮显隐 | 中 |
#### 2.3 设备详情页充实化(当前是空壳)
| 功能点 | 描述 | 复杂度 |
|--------|------|--------|
| 基本信息 | 设备属性表格展示(名称/类型/平台/型号/固件版本等) | 低 |
| 实时状态 | 在线/离线/最后通信时间 | 低 |
| 最新数据 | 最近一条设备数据(温度/湿度等key-value) | 中 |
| 历史数据曲线 | ECharts 折线图,选时间范围查InfluxDB | 高 |
| 控制面板 | 根据deviceType动态渲染控制组件(开关/滑块/输入框) | 高 |
| 操作记录 | 该设备的命令发送历史 | 中 |
| 告警历史 | 该设备关联的告警记录 | 低 |
#### 2.4 设备列表增强
| 功能点 | 描述 | 复杂度 |
|--------|------|--------|
| 批量操作 | 多选删除/批量启停/批量分配分组 | 中 |
| 导入/导出 | Excel模板导入设备、导出设备列表 | 中 |
| 设备影子 | 显示设备期望状态 vs 上报状态 | 中 |
| 快捷搜索 | 支持模糊搜索设备ID/名称 | 已有 ✅ |
| 在线状态标识 | 表格行用绿/灰/红圆点标示 | 低 |
---
### P1 — 短期内实现(产品完整性)
#### 2.5 设备分组管理
| 功能点 | 描述 | 复杂度 |
|--------|------|--------|
| 分组树形结构 | 左侧树 + 右侧列表 | 中 |
| 分组CRUD | 新增/编辑/删除/拖拽排序 | 中 |
| 分组下设备管理 | 将设备拖入/移出分组 | 中 |
| 分组统计 | 每组的设备数量、在线数 | 低 |
#### 2.6 数据采集模块增强
| 功能点 | 描述 | 复杂度 |
|--------|------|--------|
| 数据看板 | 选设备→选数据点→显示实时曲线 | 高 |
| 多设备对比 | 同一数据点多设备对比图 | 高 |
| 时间范围选择 | 近1小时/6小时/24小时/7天/30天/自定义 | 中 |
| 数据聚合 | 求平均值/最大值/最小值/求和 | 中 |
| 数据导出 | 导出CSV/Excel | 中 |
| 数据异常标记 | 超过阈值的数据点高亮 | 中 |
#### 2.7 告警管理增强
| 功能点 | 描述 | 复杂度 |
|--------|------|--------|
| 告警统计面板 | 按级别/状态/设备分布统计卡片 | 中 |
| 告警趋势图 | 每日新增告警柱状图 | 中 |
| 实时告警推送 | WebSocket连接 → 新告警弹窗提示 | 中 |
| 告警确认/处理备注 | 处理人填写处理意见 | 低 |
| 告警升级 | 超时未处理自动升级通知上级 | 高 |
| 值班排班 | 设置值班人员/时间段 | 高 |
| 告警静默 | 特定时段/特定规则暂停告警 | 中 |
#### 2.8 规则引擎增强
| 功能点 | 描述 | 复杂度 |
|--------|------|--------|
| 可视化规则编辑 | IF条件(下拉选设备+数据点+比较符) THEN动作(下拉) | 高 |
| 规则测试 | 编辑时模拟输入测试执行结果 | 高 |
| 规则执行日志 | 查看每次触发的时间/输入/输出/是否成功 | 中 |
| 场景联动 | 一键执行多个动作(如:开灯+开空调) | 高 |
| 定时任务触发 | cron表达式定时触发规则 | 中 |
#### 2.9 操作日志
| 功能点 | 描述 | 复杂度 |
|--------|------|--------|
| 日志列表 | 操作人/操作类型/操作内容/IP/时间 | 低 |
| 日志搜索 | 按用户/时间范围/操作类型过滤 | 低 |
| 日志详情 | 展示请求参数和响应 | 低 |
#### 2.10 第三方设备适配器(至少实现1个真实平台)
| 适配器 | 优先级 | 工作量 | 说明 |
|--------|--------|--------|------|
| 涂鸦智能(Tuya) | ⭐⭐⭐ | 5-7天 | OpenAPI成熟,文档齐全,推荐首选 |
| 小米IoT(MIOT) | ⭐⭐ | 5-7天 | 需要逆向或使用Home Assistant桥接 |
| Matter协议 | ⭐ | 8-10天 | Java SDK尚不成熟,建议后期再搞 |
---
### P2 — 中期优化(用户体验提升)
#### 2.11 文件/图片上传服务
- 设备头像/图片上传
- 附件上传(如设备说明书)
- 支持 OSS / MinIO / 本地存储
#### 2.12 个人中心
- 修改密码
- 修改个人信息(头像/昵称/手机号)
- 登录日志查看
#### 2.13 系统设置
- 平台基础配置(名称/Logo/公告)
- 告警通知渠道配置(邮件SMTP/短信API Key/钉钉Webhook)
- 数据保留策略配置
#### 2.14 UniApp 移动端
| 功能 | 说明 |
|------|------|
| 首页 | 设备快捷入口 + 最近告警 |
| 设备列表 | 我的设备,支持控制 |
| 设备控制 | 开关/滑块/状态查看 |
| 告警消息 | 消息列表 + 推送通知 |
| 个人中心 | 信息修改/退出登录 |
#### 2.15 固件管理(OTA)
- 固件版本管理
- 固件上传
- 设备固件升级任务
- 升级进度/结果记录
---
### P3 — 长期演进(架构升级)
| 功能 | 说明 |
|------|------|
| API网关 | Spring Cloud Gateway 统一入口、限流、鉴权 |
| 注册中心 | Nacos 服务注册与发现 |
| 配置中心 | Nacos 集中配置管理 |
| 链路追踪 | SkyWalking / Zipkin |
| ELK日志 | Elasticsearch + Logstash + Kibana |
| Prometheus监控 | 指标采集 + Grafana大屏 |
| 多租户完整隔离 | Schema隔离 / 字段级隔离 |
| 国际化(i18n) | 中英文切换 |
---
## 三、建议实施顺序
```
第1周 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
├── Dashboard数据看板(4张统计卡 + 1条趋势图 + 最近告警)
├── 设备详情页充实化(基本信息 + 最新数据 + 操作记录)
└── 设备列表增强(状态标识 + 批量操作)
第2周 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
├── 用户管理(CRUD + 启用禁用 + 重置密码)
├── 角色权限管理(角色CRUD + 菜单权限 + 按钮权限)
├── 动态路由(根据角色生成菜单)
└── 设备分组管理(树形结构 + 设备归属)
第3周 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
├── 数据采集增强(ECharts曲线图 + 时间范围 + 数据导出)
├── 告警管理增强(统计面板 + 实时WebSocket推送 + 确认处理)
├── 操作日志页面
└── 个人中心(改密码 + 个人信息)
第4周 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
├── 规则引擎可视化编辑器(IF-THEN拖拽式)
├── 告警规则条件可视化配置
├── 涂鸦智能适配器对接(如果需要)
└── UI整体打磨(响应式/交互细节/错误处理)
第5周+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
├── UniApp移动端开发
├── 固件OTA管理
├── 系统设置/文件上传
└── 部署优化/性能调优
```
---
## 四、各模块数据库补充
以下表可能还需要新增:
```sql
-- 操作日志表(可能已有log_operation,确认字段是否足够)
CREATE TABLE IF NOT EXISTS `operation_log` (
`id` BIGINT PRIMARY KEY,
`user_id` BIGINT COMMENT '操作人',
`username` VARCHAR(64) COMMENT '操作人名',
`module` VARCHAR(64) COMMENT '模块',
`operation` VARCHAR(64) COMMENT '操作类型',
`method` VARCHAR(256) COMMENT '请求方法',
`request_url` VARCHAR(256) COMMENT '请求URL',
`request_params` TEXT COMMENT '请求参数',
`response_result` TEXT COMMENT '响应结果',
`ip` VARCHAR(64) COMMENT 'IP地址',
`status` TINYINT COMMENT '状态(0失败 1成功)',
`error_msg` VARCHAR(512) COMMENT '错误信息',
`execute_time` BIGINT COMMENT '执行时长(ms)',
`create_time` DATETIME,
INDEX `idx_user_id` (`user_id`),
INDEX `idx_create_time` (`create_time`)
);
-- 系统配置表
CREATE TABLE IF NOT EXISTS `sys_config` (
`id` BIGINT PRIMARY KEY,
`config_key` VARCHAR(128) NOT NULL UNIQUE COMMENT '配置键',
`config_value` TEXT COMMENT '配置值',
`config_name` VARCHAR(128) COMMENT '配置名称',
`remark` VARCHAR(256) COMMENT '备注',
`create_time` DATETIME,
`update_time` DATETIME
);
-- 固件版本表(OTA)
CREATE TABLE IF NOT EXISTS `firmware` (
`id` BIGINT PRIMARY KEY,
`name` VARCHAR(128) NOT NULL COMMENT '固件名称',
`version` VARCHAR(32) NOT NULL COMMENT '版本号',
`device_type` VARCHAR(32) COMMENT '适用设备类型',
`file_url` VARCHAR(512) NOT NULL COMMENT '文件URL',
`file_size` BIGINT COMMENT '文件大小(bytes)',
`md5` VARCHAR(64) COMMENT '文件MD5校验',
`changelog` TEXT COMMENT '更新说明',
`status` TINYINT DEFAULT 1 COMMENT '状态(0草稿 1发布 2废弃)',
`create_by` BIGINT,
`create_time` DATETIME
);
-- 设备固件升级记录表
CREATE TABLE IF NOT EXISTS `device_upgrade_record` (
`id` BIGINT PRIMARY KEY,
`device_id` VARCHAR(64) NOT NULL,
`firmware_id` BIGINT NOT NULL,
`from_version` VARCHAR(32) COMMENT '升级前版本',
`to_version` VARCHAR(32) NOT NULL COMMENT '目标版本',
`status` TINYINT DEFAULT 0 COMMENT '状态(0待升级 1升级中 2成功 3失败)',
`progress` INT DEFAULT 0 COMMENT '进度百分比',
`error_msg` VARCHAR(512) COMMENT '失败原因',
`upgrade_time` DATETIME COMMENT '升级完成时间',
`create_time` DATETIME,
INDEX `idx_device_id` (`device_id`)
);
-- 通知消息表(站内信/WebSocket推送)
CREATE TABLE IF NOT EXISTS `notification` (
`id` BIGINT PRIMARY KEY,
`user_id` BIGINT NOT NULL COMMENT '接收人',
`title` VARCHAR(128) NOT NULL COMMENT '标题',
`content` TEXT NOT NULL COMMENT '内容',
`type` VARCHAR(32) DEFAULT 'system' COMMENT '类型(system/alarm/task)',
`related_id` BIGINT COMMENT '关联业务ID',
`is_read` TINYINT DEFAULT 0 COMMENT '是否已读',
`create_time` DATETIME,
INDEX `idx_user_id` (`user_id`),
INDEX `idx_is_read` (`is_read`)
);
```
---
## 五、技术要点提醒
| 注意事项 | 说明 |
|----------|------|
| 租户隔离 | 当前BaseEntity有tenantId但Service层未做数据隔离,所有服务查询都需要加 `wrapper.eq(Device::getTenantId, currentTenantId)` |
| 前端代理 | vite.config.ts 的proxy是开发用的,生产环境需要Nginx反向代理或API网关 |
| WebSocket连接 | 告警实时推送需要在main.js建立全局WebSocket连接并维护重连机制 |
| ECharts响应式 | 图表容器resize监听,避免窗口变化变形 |
| Excel导入导出 | 推荐EasyExcel库(阿里开源),支持大数据量 |
| 文件上传 | 建议先做本地存储,后续无缝切换到MinIO/OSS |
| 涂鸦对接 | 需要涂鸦IoT开放平台的Access ID/Secret,走OAuth2获取token |
---
## 六、快速启动建议
如果你认同以上规划,建议**从这3件事开始**(效果最明显):
1. **Dashboard数据看板** — 让系统"看起来像个产品"
2. **用户&角色管理** — 让系统"可以多人使用"
3. **设备详情页** — 让系统"每个功能都能用起来"
告诉我你想先从哪个模块开始?