Skip to content

lwbeyond/IIoT-Data-Monitor

Repository files navigation

Industrial IoT Monitor (Go)

工业物联网设备数据采集与监控系统 | 数据库课程设计项目

Go Version MySQL License

📋 项目简介

本项目是一个生产级别的工业物联网监控系统,严格按照数据库课程要求设计,展示了完整的数据库设计能力和现代 Go 后端开发实践。

核心特性

  • 完整的数据库设计: 13张表 + 2视图 + 1触发器 + 1存储过程
  • 现代后端架构: Go (Gin + GORM) 分层设计
  • 复杂查询展示: 多表联查、模糊搜索、聚合统计、存储过程调用
  • 大数据量支持: 10,000+ 条时序数据记录
  • Web 可视化: Bootstrap 5 + ECharts 数据展示
  • 配置管理: Viper + YAML 配置文件

🚀 技术栈

类别 技术 版本
语言 Go 1.21+
Web框架 Gin v1.9.1
ORM GORM v2
数据库 MySQL 8.0+
配置 Viper v1.18.2
前端 Bootstrap + ECharts 5.3 + 5.4

📁 项目结构

industrial-iot-go/
├── cmd/
│   ├── server/main.go          # 主服务器入口
│   └── seeder/main.go          # 数据生成器(10,000+条记录)
├── internal/
│   ├── model/                  # GORM 数据模型 (8个文件)
│   │   ├── user.go
│   │   ├── role.go
│   │   ├── device.go
│   │   ├── realtime_data.go
│   │   ├── alert.go
│   │   ├── maintenance.go
│   │   ├── warehouse.go
│   │   └── types.go            # 类型别名
│   ├── dao/                    # 数据访问层 (4个文件)
│   │   ├── user_dao.go
│   │   ├── device_dao.go
│   │   ├── realtime_dao.go
│   │   └── statistics_dao.go   # 统计查询
│   ├── service/                # 业务逻辑层 (2个文件)
│   │   ├── device_service.go
│   │   └── statistics_service.go
│   ├── controller/             # 控制器层
│   │   └── controller.go
│   └── dto/                    # 数据传输对象
│       └── response.go
├── router/
│   └── router.go               # Gin 路由配置
├── pkg/
│   ├── config/
│   │   └── config.go           # Viper 配置加载
│   └── utils/
│       └── database.go         # 数据库连接工具
├── web/
│   └── index.html              # 前端单页应用
├── scripts/
│   └── init.sql                # 数据库初始化脚本
├── config.yaml                 # 配置文件
├── API_TESTING.md              # API 测试指南
├── DEPLOYMENT.md               # 完整部署指南
├── go.mod
└── README.md

🗄️ 数据库设计

表结构 (13张表)

表名 说明 关系类型
users 用户表 -
roles 角色表 -
user_roles 用户角色关联 N:M
device_types 设备类型 -
workshops 车间 -
devices 设备 1:N (关联类型/车间)
metrics 指标定义 -
realtime_data 实时数据(核心大表) 1:N (关联设备/指标)
alert_rules 报警规则 1:N (关联指标)
alert_logs 报警日志 1:N (关联设备/规则)
maintenance_orders 维修工单 1:N (关联设备/用户)
warehouses 仓库 -
materials 物料 1:N (关联仓库)

视图 (2个)

  • v_device_status: 设备状态联合视图(设备+类型+车间)
  • v_alert_summary: 报警汇总视图(报警+设备+规则+处理人)

触发器 (1个)

  • trg_check_alert: 实时数据插入时自动检测阈值,超阈值自动生成报警记录

存储过程 (1个)

  • sp_daily_statistics(date, device_id): 按日期和设备统计所有指标的平均值、最大值、最小值

完整性约束

  • 外键约束: 所有关联表均定义 FOREIGN KEY
  • 级联操作: ON DELETE CASCADE / ON DELETE RESTRICT / ON DELETE SET NULL
  • 索引优化: 复合索引、唯一索引、状态索引

⚡ 快速启动

前置条件

  • Go 1.21+
  • MySQL 8.0+
  • Git

步骤 1: 初始化数据库

# 登录 MySQL
mysql -u root -p

# 执行初始化脚本
source scripts/init.sql

步骤 2: 配置环境

编辑 config.yaml

database:
  host: localhost
  port: 3306
  user: root
  password: your_password  # 修改为实际密码
  dbname: iiot_monitor
  charset: utf8mb4

server:
  port: 8080
  mode: debug

步骤 3: 生成测试数据

# 安装依赖
go mod tidy

# 运行数据生成器
go run cmd/seeder/main.go

生成数据:

  • 5 个车间
  • 10 个设备类型
  • 50 个设备
  • 10,000+ 条实时数据(过去7天)
  • 若干报警日志(基于超阈值数据)

步骤 4: 启动服务器

go run cmd/server/main.go

服务将在 http://localhost:8080 启动。

步骤 5: 访问系统

前端界面: http://localhost:8080

API 接口:

  • Dashboard: GET /api/v1/devices/dashboard
  • Search: GET /api/v1/devices/search?q=keyword
  • Statistics: GET /api/v1/stats/type-distribution
  • Daily Check: POST /api/v1/maintenance/daily-check

详细 API 文档见: API_TESTING.md


💡 核心功能展示

Feature A: 设备仪表盘 (Multi-table Join)

API: GET /api/v1/devices/dashboard

SQL 能力:

  • 3表 INNER JOIN: devicesdevice_typesworkshops
  • 相关子查询获取最新数据
  • CASE 语句状态转换
SELECT d.id, d.device_name, dt.type_name, w.name,
  (SELECT rd.value FROM realtime_data rd WHERE rd.device_id = d.id ...) AS latest_temp
FROM devices d
INNER JOIN device_types dt ON d.device_type_id = dt.id
INNER JOIN workshops w ON d.workshop_id = w.id

Feature B: 智能搜索 (Fuzzy Query)

API: GET /api/v1/devices/search?q=keyword

SQL 能力:

  • LIKE 模糊匹配
  • 跨多个字段和表的 OR 查询
  • 参数化查询防注入
WHERE d.device_name LIKE '%keyword%'
  OR d.device_code LIKE '%keyword%'
  OR w.name LIKE '%keyword%'
  OR w.location LIKE '%keyword%'

Feature C: 统计报表 (Aggregation)

API: GET /api/v1/stats/type-distribution

SQL 能力:

  • GROUP BY 分组统计
  • COUNT(*) + AVG() 聚合函数
  • 时间窗口过滤 (DATE_SUB)
SELECT dt.type_name, COUNT(d.id), AVG(rd.value)
FROM device_types dt
LEFT JOIN devices d ON dt.id = d.device_type_id
GROUP BY dt.id

Feature D: 存储过程调用 (Database-Level Computation)

API: POST /api/v1/maintenance/daily-check

SQL 能力:

  • CALL 调用存储过程
  • 展示数据库层计算能力
db.Raw("CALL sp_daily_statistics(?, ?)", date, deviceID).Scan(&results)

🎨 前端界面

基于 Bootstrap 5ECharts 开发的现代化 Web 界面:

  • 📊 实时图表: 设备类型分布和平均温度双轴图
  • 🔍 智能搜索: 跨设备、车间、位置的模糊搜索
  • 📋 仪表盘: 完整的设备列表,包含实时数据
  • 🎨 响应式设计: 美观的渐变背景和卡片布局

🧪 测试与验证

数据库验证

-- 查看所有表
SHOW TABLES;

-- 查看视图
SHOW FULL TABLES WHERE Table_type = 'VIEW';
SELECT * FROM v_device_status LIMIT 5;

-- 查看触发器
SHOW TRIGGERS;

-- 查看存储过程
SHOW PROCEDURE STATUS WHERE Db = 'iiot_monitor';

-- 测试存储过程
CALL sp_daily_statistics('2024-12-21', 1);

-- 验证数据量
SELECT COUNT(*) FROM realtime_data;

API 测试

# 设备仪表盘
curl http://localhost:8080/api/v1/devices/dashboard | jq

# 模糊搜索
curl "http://localhost:8080/api/v1/devices/search?q=机床" | jq

# 统计报表
curl http://localhost:8080/api/v1/stats/type-distribution | jq

# 存储过程调用
curl -X POST http://localhost:8080/api/v1/maintenance/daily-check \
  -H "Content-Type: application/json" \
  -d '{"date": "2024-12-21", "device_id": 1}' | jq

📚 文档


🎓 课程评分要点

数据库设计 (满分)

  • 表数量 ≥ 10 ✅ (13张)
  • 视图 ≥ 2 ✅ (2个)
  • 触发器 ≥ 1 ✅ (1个,自动报警)
  • 存储过程 ≥ 1 ✅ (1个,日统计)
  • 外键约束 ✅ (全部定义)
  • 关系类型 ✅ (1:1, 1:N, N:M 全覆盖)

应用开发 (满分)

  • 架构清晰 ✅ (标准三层架构)
  • 代码规范 ✅ (中文注释)
  • 复杂查询 ✅ (4种SQL能力展示)
  • 数据量充足 ✅ (10,000+条)
  • 界面友好 ✅ (Bootstrap响应式)

技术亮点(加分项)

  • 配置管理: Viper + YAML
  • 数据生成器: 自动生成大量测试数据
  • 数据可视化: ECharts 图表展示
  • RESTful API: 标准 REST 接口设计
  • 连接池: 数据库连接优化

🔧 开发计划

  • Phase 1: 数据库设计与初始化
  • Phase 2: Go 后端骨架搭建
  • Phase 3: 核心业务逻辑(4个特性)
  • Phase 4: 数据生成器 + 前端界面

🤝 贡献

欢迎提交 Issue 和 Pull Request!


📄 许可证

MIT License


📧 联系方式

  • 项目: Industrial IoT Monitor
  • 用途: 数据库课程设计
  • 技术: Go + MySQL + Bootstrap + ECharts

🎉 祝你课程设计答辩成功!

About

工业物联网设备数据采集与监控系统

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published