-- ======================================== -- 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`);