iotsaas/backend/sql/init.sql
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

330 lines
17 KiB
SQL
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 Platform 数据库初始化脚本
-- ========================================
-- 创建数据库
CREATE DATABASE IF NOT EXISTS `iot_platform` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `iot_platform`;
-- ========================================
-- 租户表
-- ========================================
CREATE TABLE IF NOT EXISTS `tenant` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '租户ID',
`tenant_name` VARCHAR(128) NOT NULL COMMENT '租户名称',
`tenant_code` VARCHAR(64) NOT NULL COMMENT '租户编码',
`contact_person` VARCHAR(64) COMMENT '联系人',
`contact_phone` VARCHAR(20) COMMENT '联系电话',
`email` VARCHAR(128) COMMENT '邮箱',
`status` TINYINT DEFAULT 1 COMMENT '状态(0-禁用,1-启用)',
`expire_time` DATETIME COMMENT '过期时间',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT DEFAULT 0 COMMENT '删除标记(0-未删除,1-已删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_code` (`tenant_code`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户表';
-- ========================================
-- 用户表
-- ========================================
CREATE TABLE IF NOT EXISTS `sys_user` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`username` VARCHAR(64) NOT NULL COMMENT '用户名',
`password` VARCHAR(128) NOT NULL COMMENT '密码',
`real_name` VARCHAR(64) COMMENT '真实姓名',
`phone` VARCHAR(20) COMMENT '手机号',
`email` VARCHAR(128) COMMENT '邮箱',
`avatar` VARCHAR(512) COMMENT '头像URL',
`status` TINYINT DEFAULT 1 COMMENT '状态(0-禁用,1-启用)',
`tenant_id` BIGINT COMMENT '租户ID',
`role` VARCHAR(20) NOT NULL DEFAULT 'user' COMMENT '角色(admin/user)',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT DEFAULT 0 COMMENT '删除标记(0-未删除,1-已删除)',
`create_by` BIGINT DEFAULT 0 COMMENT '创建人ID',
`update_by` BIGINT DEFAULT 0 COMMENT '更新人ID',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`),
KEY `idx_phone` (`phone`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
-- ========================================
-- 角色表
-- ========================================
CREATE TABLE IF NOT EXISTS `sys_role` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '角色ID',
`role_name` VARCHAR(64) NOT NULL COMMENT '角色名称',
`role_code` VARCHAR(64) NOT NULL COMMENT '角色编码',
`description` VARCHAR(255) COMMENT '角色描述',
`status` TINYINT DEFAULT 1 COMMENT '状态(0-禁用,1-启用)',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT DEFAULT 0 COMMENT '删除标记(0-未删除,1-已删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_role_code` (`role_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';
-- ========================================
-- 用户角色关联表
-- ========================================
CREATE TABLE IF NOT EXISTS `sys_user_role` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`user_id` BIGINT NOT NULL COMMENT '用户ID',
`role_id` BIGINT NOT NULL COMMENT '角色ID',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_role` (`user_id`, `role_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_role_id` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户角色关联表';
-- ========================================
-- 设备分组表
-- ========================================
CREATE TABLE IF NOT EXISTS `device_group` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '分组ID',
`group_name` VARCHAR(128) NOT NULL COMMENT '分组名称',
`group_code` VARCHAR(64) NOT NULL COMMENT '分组编码',
`parent_id` BIGINT DEFAULT 0 COMMENT '父分组ID',
`description` VARCHAR(255) COMMENT '分组描述',
`sort` INT DEFAULT 0 COMMENT '排序',
`status` TINYINT DEFAULT 1 COMMENT '状态(0停用 1正常)',
`tenant_id` BIGINT COMMENT '租户ID',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT DEFAULT 0 COMMENT '删除标记(0-未删除,1-已删除)',
`create_by` BIGINT COMMENT '创建人ID',
`update_by` BIGINT COMMENT '更新人ID',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_group_code` (`group_code`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='设备分组表';
-- ========================================
-- 设备表
-- ========================================
CREATE TABLE IF NOT EXISTS `device` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '设备ID',
`device_id` VARCHAR(64) NOT NULL COMMENT '设备唯一标识',
`device_name` VARCHAR(128) NOT NULL COMMENT '设备名称',
`platform` VARCHAR(32) NOT NULL COMMENT '设备平台(tuya/miot/dueros/local/matter)',
`device_type` VARCHAR(64) NOT NULL COMMENT '设备类型',
`manufacturer` VARCHAR(64) COMMENT '厂商',
`model` VARCHAR(64) COMMENT '型号',
`firmware_version` VARCHAR(32) COMMENT '固件版本',
`status` VARCHAR(16) DEFAULT 'offline' COMMENT '状态(online/offline/error/upgrading)',
`capabilities` JSON COMMENT '设备能力描述',
`location` VARCHAR(128) COMMENT '设备位置',
`group_id` BIGINT COMMENT '分组ID',
`remark` VARCHAR(512) COMMENT '备注',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT DEFAULT 0 COMMENT '删除标记(0-未删除,1-已删除)',
`tenant_id` BIGINT COMMENT '租户ID',
`create_by` BIGINT COMMENT '创建人ID',
`update_by` BIGINT COMMENT '更新人ID',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_device_id` (`device_id`),
KEY `idx_platform` (`platform`),
KEY `idx_device_type` (`device_type`),
KEY `idx_status` (`status`),
KEY `idx_tenant_id` (`tenant_id`),
KEY `idx_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='设备表';
-- ========================================
-- 设备凭证表
-- ========================================
CREATE TABLE IF NOT EXISTS `device_credential` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '凭证ID',
`device_id` VARCHAR(64) NOT NULL COMMENT '设备ID',
`credential_type` VARCHAR(32) NOT NULL COMMENT '凭证类型(api_key/token/password)',
`credential_value` VARCHAR(512) NOT NULL COMMENT '凭证值(加密存储)',
`expires_at` DATETIME COMMENT '过期时间',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT DEFAULT 0 COMMENT '删除标记(0-未删除,1-已删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_device_id_type` (`device_id`, `credential_type`),
KEY `idx_device_id` (`device_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='设备凭证表';
-- ========================================
-- 联动规则表
-- ========================================
CREATE TABLE IF NOT EXISTS `linkage_rule` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '规则ID',
`rule_name` VARCHAR(128) NOT NULL COMMENT '规则名称',
`rule_code` VARCHAR(64) NOT NULL COMMENT '规则编码',
`trigger_device_id` VARCHAR(64) NOT NULL COMMENT '触发设备ID',
`condition_expression` VARCHAR(512) NOT NULL COMMENT '触发条件',
`actions` JSON NOT NULL COMMENT '执行动作列表',
`enabled` TINYINT DEFAULT 1 COMMENT '是否启用(0-禁用,1-启用)',
`tenant_id` BIGINT COMMENT '租户ID',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT DEFAULT 0 COMMENT '删除标记(0-未删除,1-已删除)',
`create_by` BIGINT COMMENT '创建人ID',
`update_by` BIGINT COMMENT '更新人ID',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_rule_code` (`rule_code`),
KEY `idx_trigger_device_id` (`trigger_device_id`),
KEY `idx_enabled` (`enabled`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='联动规则表';
-- ========================================
-- 告警规则表
-- ========================================
CREATE TABLE IF NOT EXISTS `alarm_rule` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '规则ID',
`rule_name` VARCHAR(128) NOT NULL COMMENT '规则名称',
`rule_code` VARCHAR(64) NOT NULL COMMENT '规则编码',
`device_id` VARCHAR(64) COMMENT '设备ID(空表示所有设备)',
`data_point` VARCHAR(64) COMMENT '数据点',
`condition_expression` VARCHAR(512) NOT NULL COMMENT '条件表达式',
`alarm_level` VARCHAR(16) NOT NULL COMMENT '告警级别',
`alarm_template` VARCHAR(512) NOT NULL COMMENT '告警消息模板',
`enabled` TINYINT DEFAULT 1 COMMENT '是否启用(0-禁用,1-启用)',
`deduplication_window` INT DEFAULT 5 COMMENT '告警去重时间窗口(分钟)',
`notification_methods` VARCHAR(128) COMMENT '通知方式',
`tenant_id` BIGINT COMMENT '租户ID',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT DEFAULT 0 COMMENT '删除标记(0-未删除,1-已删除)',
`create_by` BIGINT COMMENT '创建人ID',
`update_by` BIGINT COMMENT '更新人ID',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_rule_code` (`rule_code`),
KEY `idx_device_id` (`device_id`),
KEY `idx_enabled` (`enabled`),
KEY `idx_alarm_level` (`alarm_level`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='告警规则表';
-- ========================================
-- 告警表
-- ========================================
CREATE TABLE IF NOT EXISTS `alarm` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '告警ID',
`alarm_name` VARCHAR(128) NOT NULL COMMENT '告警名称',
`device_id` VARCHAR(64) NOT NULL COMMENT '设备ID',
`alarm_level` VARCHAR(16) NOT NULL COMMENT '告警级别(info/warning/critical/emergency)',
`alarm_content` VARCHAR(512) NOT NULL COMMENT '告警内容',
`status` VARCHAR(16) DEFAULT 'pending' COMMENT '状态(pending/confirmed/resolved)',
`confirmed_time` DATETIME COMMENT '确认时间',
`confirmed_by` BIGINT COMMENT '确认人ID',
`resolved_time` DATETIME COMMENT '解决时间',
`resolved_by` BIGINT COMMENT '解决人ID',
`tenant_id` BIGINT COMMENT '租户ID',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT DEFAULT 0 COMMENT '删除标记(0-未删除,1-已删除)',
PRIMARY KEY (`id`),
KEY `idx_device_id` (`device_id`),
KEY `idx_alarm_level` (`alarm_level`),
KEY `idx_status` (`status`),
KEY `idx_create_time` (`create_time`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='告警表';
-- ========================================
-- 设备数据记录表
-- ========================================
CREATE TABLE IF NOT EXISTS `device_data_record` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '记录ID',
`device_id` VARCHAR(64) NOT NULL COMMENT '设备ID',
`device_type` VARCHAR(64) COMMENT '设备类型',
`data_content` JSON COMMENT '数据内容',
`data_timestamp` BIGINT COMMENT '数据时间戳',
`data_source` VARCHAR(32) COMMENT '数据来源(mqtt/http/coap等)',
`data_quality` VARCHAR(16) COMMENT '数据质量(good/bad/uncertain)',
`tenant_id` BIGINT COMMENT '租户ID',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT DEFAULT 0 COMMENT '删除标记(0-未删除,1-已删除)',
PRIMARY KEY (`id`),
KEY `idx_device_id` (`device_id`),
KEY `idx_data_timestamp` (`data_timestamp`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='设备数据记录表';
-- ========================================
-- 操作日志表
-- ========================================
CREATE TABLE IF NOT EXISTS `operation_log` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '日志ID',
`user_id` BIGINT COMMENT '用户ID',
`username` VARCHAR(64) COMMENT '用户名',
`operation` VARCHAR(64) NOT NULL COMMENT '操作类型',
`method` VARCHAR(64) COMMENT '请求方法',
`url` VARCHAR(255) COMMENT '请求URL',
`ip` VARCHAR(64) COMMENT 'IP地址',
`location` VARCHAR(128) COMMENT 'IP位置',
`params` TEXT COMMENT '请求参数',
`result` TEXT COMMENT '返回结果',
`status` TINYINT COMMENT '状态(0-失败,1-成功)',
`error_msg` VARCHAR(512) COMMENT '错误信息',
`execute_time` BIGINT COMMENT '执行时长(毫秒)',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_operation` (`operation`),
KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志表';
-- ========================================
-- 初始化数据
-- ========================================
-- 插入默认租户
INSERT INTO `tenant` (`tenant_name`, `tenant_code`, `contact_person`, `status`)
VALUES ('默认租户', 'default', 'System', 1)
ON DUPLICATE KEY UPDATE `tenant_name` = VALUES(`tenant_name`);
-- 插入默认角色
INSERT INTO `sys_role` (`role_name`, `role_code`, `description`)
VALUES
('超级管理员', 'admin', '系统最高权限'),
('普通用户', 'user', '普通用户权限')
ON DUPLICATE KEY UPDATE `role_name` = VALUES(`role_name`);
-- 插入默认管理员用户 (密码: admin123)
INSERT INTO `sys_user` (`username`, `password`, `real_name`, `phone`, `email`, `status`)
VALUES ('admin', '$2b$10$xhf.eoyA0/RldzGMiGd1YeGHg.eXEOl4vyPz4Z05ykobWtxYlrWXa', '系统管理员', '13800138000', 'admin@iot.com', 1)
ON DUPLICATE KEY UPDATE `password` = VALUES(`password`);
-- 关联管理员和超级管理员角色
INSERT INTO `sys_user_role` (`user_id`, `role_id`)
SELECT u.id, r.id
FROM `sys_user` u, `sys_role` r
WHERE u.username = 'admin' AND r.role_code = 'admin'
ON DUPLICATE KEY UPDATE `user_id` = VALUES(`user_id`);
-- 插入默认设备分组
INSERT INTO `device_group` (`group_name`, `group_code`, `parent_id`, `description`, `sort`, `tenant_id`)
VALUES
('照明设备', 'light_group', 0, '照明相关设备', 1, 1),
('传感器', 'sensor_group', 0, '传感器设备', 2, 1),
('智能插座', 'socket_group', 0, '智能插座设备', 3, 1)
ON DUPLICATE KEY UPDATE `group_name` = VALUES(`group_name`);
-- 插入示例设备
INSERT INTO `device` (`device_id`, `device_name`, `platform`, `device_type`, `manufacturer`, `model`, `firmware_version`, `status`, `location`, `group_id`, `tenant_id`)
VALUES
('LOCAL_LIGHT_001', '客厅智能灯', 'local', 'light', 'IoT Platform', 'LOCAL-001', '1.0.0', 'online', '客厅', 1, 1),
('LOCAL_SENSOR_001', '温湿度传感器', 'local', 'sensor', 'IoT Platform', 'SENSOR-001', '1.0.0', 'online', '客厅', 2, 1),
('LOCAL_SOCKET_001', '智能插座', 'local', 'socket', 'IoT Platform', 'SOCKET-001', '1.0.0', 'offline', '卧室', 3, 1)
ON DUPLICATE KEY UPDATE `device_name` = VALUES(`device_name`);
-- 插入示例告警规则
INSERT INTO `alarm_rule` (`rule_name`, `rule_code`, `device_id`, `data_point`, `condition_expression`, `alarm_level`, `alarm_template`, `enabled`, `deduplication_window`, `notification_methods`, `tenant_id`)
VALUES
('温度过高告警', 'TEMP_HIGH_ALARM', NULL, 'temperature', 'temperature > 30', 'critical', '设备${deviceId}温度过高,当前温度:${temperature}℃', 1, 5, 'websocket,email', 1),
('设备离线告警', 'DEVICE_OFFLINE_ALARM', NULL, 'status', 'status == \"offline\"', 'warning', '设备${deviceId}已离线', 1, 10, 'websocket,email', 1)
ON DUPLICATE KEY UPDATE `rule_name` = VALUES(`rule_name`);