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

14 KiB
Raw Blame History

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管理
├── 系统设置/文件上传
└── 部署优化/性能调优

四、各模块数据库补充

以下表可能还需要新增:

-- 操作日志表(可能已有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. 设备详情页 — 让系统"每个功能都能用起来"

告诉我你想先从哪个模块开始?