Files
YwxAppThink/addon/iot/install.sql
T
yangwx 18101cf11a feat: 上线前安全加固与发布工程化;appmall 由插件迁移为独立应用
安全(P0)
- 发布包签名:新增 scripts/package_keygen.php、scripts/package_verify.php、
  ywxapp\service\PackageVerifier;FrameworkService::apply() 解压前强制验签
  (ywxapp.framework_package_verify,默认开启)
- JWT 收紧:config/jwt.php 移除公开默认密钥,JwtService::assertStrongSecret()
  校验非空 / 长度≥32 / 已知弱值;.env.production.example 键名由 JWT_SECRET_KEY 修正为 JWT_SECRET
- /api/v1/Article:免登录白名单收窄为只读接口,写操作字段白名单 + assertOwner() 越权校验
- 开发者令牌:查找接口不再回显明文、统一失败文案 + 限流
- TemplateInstaller:文件名白名单 + realpath 归一化 + 目录内断言,修复 Zip Slip;补 use ZipArchive
- 后台登录:接入验证码、失败锁定与登录限流(config/ratelimit.php)
- 缓存 / Session 驱动可由 .env 覆盖(CACHE_DRIVER / SESSION_TYPE),集群部署改 redis
- paycenter 支付日志开关改为 PAY_LOG,不再跟随 APP_DEBUG

工程化 / 交付
- 新增 CHANGELOG.md 与 .env.production.example;composer.lock 入库锁定依赖版本
- 插件离线安装 CLI 增加 --uid,后台上传安装透传 uid,付费插件授权校验可通过
- 授权拒绝文案区分「未携带 uid」与「未找到有效授权」,便于排障
- .gitignore 放行 .env.production.example / .env.addon.example / .gitattributes / public/.htaccess

结构
- appmall 由 addon/appmall 迁移为独立应用 app/appmall(市场 / 开发者中心 / 审核 / 分润)
2026-10-22 00:53:39 +08:00

361 lines
21 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.
-- ============================================================
-- addon/iot/install.sql —— iot 插件数据表
-- 框架约定:插件安装时由 ywxapp\service\AddonService 执行本文件
-- (仅允许 CREATE TABLE / INSERT,见 importsql 白名单)。
-- 表名须为 __PREFIX__<插件名>_*,与 __PREFIX__addon 等核心表命名一致。
-- 时间字段统一约定:create_at / update_at / delete_at
-- ============================================================
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_connection` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`client_id` varchar(191) NOT NULL DEFAULT '' COMMENT 'MQTT客户端标识',
`username` varchar(191) DEFAULT NULL COMMENT '用户名',
`ip` varchar(64) DEFAULT NULL COMMENT '客户端IP',
`status` tinyint(1) DEFAULT '1' COMMENT '1在线 0离线',
`create_at` int DEFAULT NULL COMMENT '连接时间',
`update_at` int DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_client_id` (`client_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT客户端连接表';
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_message` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`client_id` varchar(191) DEFAULT NULL COMMENT '发布者client_id',
`topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题',
`payload` longtext COMMENT '消息内容',
`qos` tinyint(1) DEFAULT '0' COMMENT 'QoS等级',
`retain` tinyint(1) DEFAULT '0' COMMENT '是否保留消息',
`source` varchar(32) DEFAULT 'client' COMMENT '来源:client 客户端 / manual 后台手动',
`create_at` int DEFAULT NULL COMMENT '时间',
PRIMARY KEY (`id`),
KEY `idx_topic` (`topic`),
KEY `idx_create_at` (`create_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT消息日志表';
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_topic` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`client_id` varchar(191) NOT NULL DEFAULT '' COMMENT '订阅者client_id',
`topic` varchar(255) NOT NULL DEFAULT '' COMMENT '订阅主题(支持通配符)',
`qos` tinyint(1) DEFAULT '0' COMMENT 'QoS等级',
`create_at` int DEFAULT NULL COMMENT '订阅时间',
PRIMARY KEY (`id`),
KEY `idx_client_id` (`client_id`),
KEY `idx_topic` (`topic`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT订阅关系表';
-- 认证账号表(allow_anonymous=0 或提供用户名时校验密码)
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_auth` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(191) NOT NULL DEFAULT '' COMMENT '用户名',
`password` varchar(191) NOT NULL DEFAULT '' COMMENT '密码(bcrypt哈希,兼容明文)',
`member_id` int unsigned NOT NULL DEFAULT '0' COMMENT '归属框架会员ID(0=非会员账号;会员直通时回填对应 member_user.id)',
`is_superuser` tinyint(1) NOT NULL DEFAULT '0' COMMENT '超级用户跳过ACL',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1启用 0禁用',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
`create_at` int DEFAULT NULL,
`update_at` int DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT认证账号表';
-- ACL 主题权限表(按 sort 顺序匹配,命中即决定 allow/deny)
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_acl` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`target_type` varchar(16) NOT NULL DEFAULT 'all' COMMENT 'all/user/client',
`target` varchar(191) NOT NULL DEFAULT '' COMMENT '匹配值:用户名/clientid,all时忽略',
`topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题过滤器,支持通配符与占位符%u %c',
`access` tinyint(1) NOT NULL DEFAULT '3' COMMENT '1订阅 2发布 3两者',
`allow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1允许 0拒绝',
`sort` int NOT NULL DEFAULT '0' COMMENT '匹配优先级,越小越先',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
`create_at` int DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_sort` (`sort`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT ACL权限表';
-- 保留消息持久化表(重启后恢复 retained)
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_retain` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题',
`payload` longblob COMMENT '消息内容(二进制安全)',
`qos` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'QoS等级',
`update_at` int DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_topic` (`topic`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT保留消息表';
-- 离线消息队列表(clean=false 会话离线期间的 QoS1/2 消息)
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_offline` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`client_id` varchar(191) NOT NULL DEFAULT '' COMMENT '目标订阅者client_id',
`topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题',
`payload` longblob COMMENT '消息内容(二进制安全)',
`qos` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'QoS等级',
`create_at` int DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_client_id` (`client_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT离线消息队列表';
-- 实时运行指标快照(Broker 周期写入单行 id=1,后台仪表盘轮询读取,跨进程安全)
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_stats` (
`id` int unsigned NOT NULL,
`uptime` int DEFAULT '0' COMMENT '运行时长(秒)',
`clients_online` int DEFAULT '0' COMMENT '在线连接数',
`clients_total` int DEFAULT '0' COMMENT '累计会话数',
`subscriptions` int DEFAULT '0' COMMENT '订阅关系数',
`messages_received` int DEFAULT '0' COMMENT '累计接收消息数',
`messages_sent` int DEFAULT '0' COMMENT '累计发送消息数',
`retained` int DEFAULT '0' COMMENT '保留消息数',
`timestamp` int DEFAULT '0' COMMENT '快照时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT实时运行指标快照';
-- 转发规则表(规则引擎:匹配源主题后转发到外部 Broker,如 EMQX)
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_rule` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(191) NOT NULL DEFAULT '' COMMENT '规则名称',
`source_filter` varchar(255) NOT NULL DEFAULT '' COMMENT '源主题过滤器(支持通配符 + #)',
`target_type` varchar(16) NOT NULL DEFAULT 'mqtt' COMMENT '转发目标类型:mqtt',
`target_broker` varchar(255) NOT NULL DEFAULT '' COMMENT '外部Broker地址 host:port',
`target_clientid` varchar(191) DEFAULT '' COMMENT '连接外部Broker的clientId(可选)',
`target_username` varchar(191) DEFAULT '' COMMENT '外部Broker用户名(可选)',
`target_password` varchar(191) DEFAULT '' COMMENT '外部Broker密码(可选)',
`target_topic` varchar(255) NOT NULL DEFAULT '' COMMENT '转发目标主题,支持 ${topic} 变量',
`target_qos` tinyint(1) NOT NULL DEFAULT '0' COMMENT '转发QoS',
`enabled` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1启用 0停用',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
`create_at` int DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_enabled` (`enabled`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT转发规则(规则引擎)';
-- 手动发布出站队列(后台/API 发布经 DB 出栈,Broker 消费后内部路由,零外部依赖)
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_outbox` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题',
`payload` longblob COMMENT '消息内容(二进制安全)',
`qos` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'QoS等级',
`retain` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否保留',
`source` varchar(32) DEFAULT 'manual' COMMENT '来源: manual/api/admin',
`create_at` int DEFAULT NULL,
`status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0待投递 1已投递',
PRIMARY KEY (`id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT手动发布出站队列(跨进程内部路由)';
-- 智能设备绑定表(华为式:后台预登记SN+配对码+激活令牌 → 设备入云激活领凭证 → 用户扫码+配对码绑定)
-- 绑定与激活分离:pair_code 机身贴纸防抢绑;activate_token 出厂预置一次性,设备 activate() 领取 uuid/secret
-- 连接约定:MQTT username=clientId=uuid,密码=secret(bcrypt)
-- Topic 规范:/devices/{uuid}/state 设备上报(影子,retain) / /devices/{uuid}/cmd 下发命令
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_device` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`sn` varchar(64) NOT NULL DEFAULT '' COMMENT '设备序列号(机身二维码内容,绑定凭证)',
`mac` varchar(32) NOT NULL DEFAULT '' COMMENT '设备MAC(去冒号小写,即插即用注册身份)',
`uuid` varchar(64) NOT NULL DEFAULT '' COMMENT '设备连接用户名(clientId约定同值)',
`secret` varchar(191) NOT NULL DEFAULT '' COMMENT '连接密码(bcrypt哈希,明文仅激活/重置时返回一次)',
`pair_code` varchar(16) NOT NULL DEFAULT '' COMMENT '配对码(机身贴纸,绑定时校验防抢绑)',
`activate_token` varchar(64) NOT NULL DEFAULT '' COMMENT '入云激活令牌(一次性,设备出厂预置)',
`title` varchar(128) NOT NULL DEFAULT '' COMMENT '设备名称',
`model` varchar(64) NOT NULL DEFAULT '' COMMENT '产品型号',
`dev_type` varchar(64) NOT NULL DEFAULT '' COMMENT '设备类型(esp32c3_temp等,App据此渲染面板)',
`ver` varchar(32) NOT NULL DEFAULT '' COMMENT '固件版本(OTA检测/提示)',
`pins` varchar(64) NOT NULL DEFAULT '' COMMENT '总线GPIO表(CSV如3,4,10;下标=位置序号;设备上线时上报一次)',
`member_id` int unsigned NOT NULL DEFAULT '0' COMMENT '绑定会员ID(0=未绑定)',
`room` varchar(64) NOT NULL DEFAULT '' COMMENT '房间/位置',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1启用 0禁用',
`bind_at` int DEFAULT NULL COMMENT '绑定时间',
`create_at` int DEFAULT NULL,
`update_at` int DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_sn` (`sn`),
UNIQUE KEY `uk_mac` (`mac`),
UNIQUE KEY `uk_uuid` (`uuid`),
KEY `idx_member` (`member_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT智能设备绑定表';
-- 传感器位置配置表(配置真源:位置数/别名/探头数/上下限/gap 一律由服务端下发,不进 state 报文)
-- 三方一致:服务端(本表 + iot_device.cfg_ver) → retained /devices/{uuid}/config → 设备 NVS + config_ack → App 经 HTTP 读同一份
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_sensor_cfg` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`device_uuid` varchar(64) NOT NULL DEFAULT '' COMMENT '设备uuid',
`pos_index` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '位置序号(OneWire总线A/B/C,0起)',
`alias` varchar(32) NOT NULL DEFAULT '' COMMENT '位置名称(如 进水/回水)',
`probes` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '该位置探头数(1~3)',
`upper` decimal(6,2) NOT NULL DEFAULT '85.00' COMMENT '超温上限(℃)',
`lower` decimal(6,2) NOT NULL DEFAULT '0.00' COMMENT '低温下限(℃)',
`gap` decimal(6,2) NOT NULL DEFAULT '0.00' COMMENT '位置内温差告警阈值(0=关闭)',
`enabled` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1启用 0停用',
`create_at` int DEFAULT NULL,
`update_at` int DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_dev_pos` (`device_uuid`,`pos_index`),
KEY `idx_device` (`device_uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='传感器位置配置表(配置真源)';
-- 设备共享表(华为式家庭授权:设备主人把设备共享给其他会员,按 perm 分级)
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_share` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`device_id` int unsigned NOT NULL DEFAULT '0' COMMENT '设备ID(iot_device.id)',
`owner_id` int unsigned NOT NULL DEFAULT '0' COMMENT '设备主人会员ID',
`member_id` int unsigned NOT NULL DEFAULT '0' COMMENT '被共享会员ID',
`perm` tinyint(1) NOT NULL DEFAULT '2' COMMENT '1只读 2可控制',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1生效 0撤销',
`create_at` int DEFAULT NULL,
`update_at` int DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_dev_member` (`device_id`, `member_id`),
KEY `idx_member` (`member_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT设备共享表';
-- 设备日志表(设备维度:状态上报/事件/下发命令留痕,智慧生活诊断与审计)
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_device_log` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`uuid` varchar(64) NOT NULL DEFAULT '' COMMENT '设备uuid',
`topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题',
`payload` longtext COMMENT '消息内容',
`direction` varchar(8) NOT NULL DEFAULT 'in' COMMENT 'in=设备上报 out=服务端下发',
`create_at` int DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_uuid` (`uuid`),
KEY `idx_create_at` (`create_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT设备日志表';
-- 告警记录表(设备离线/场景联动/OTA失败等推送与展示)
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_alert` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`member_id` int unsigned NOT NULL DEFAULT '0' COMMENT '归属会员',
`uuid` varchar(64) NOT NULL DEFAULT '' COMMENT '关联设备uuid(可空)',
`pos_index` tinyint unsigned NOT NULL DEFAULT '255' COMMENT '传感器位置序号(255=不适用,如离线/场景告警)',
`type` varchar(32) NOT NULL DEFAULT '' COMMENT 'offline/scene/condition/custom',
`level` tinyint(1) NOT NULL DEFAULT '2' COMMENT '1提示 2警告 3严重',
`title` varchar(128) NOT NULL DEFAULT '' COMMENT '标题',
`content` varchar(512) NOT NULL DEFAULT '' COMMENT '内容',
`is_read` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0未读 1已读',
`create_at` int DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_member` (`member_id`),
KEY `idx_create_at` (`create_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT设备告警记录表';
-- OTA 固件版本表
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_ota` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`model` varchar(64) NOT NULL DEFAULT '' COMMENT '适用设备型号',
`version` varchar(32) NOT NULL DEFAULT '' COMMENT '版本号',
`filename` varchar(128) NOT NULL DEFAULT '' COMMENT '固件文件名',
`file_hash` varchar(64) NOT NULL DEFAULT '' COMMENT 'SHA256',
`size` int unsigned NOT NULL DEFAULT '0' COMMENT '字节数',
`url` varchar(255) NOT NULL DEFAULT '' COMMENT '固件下载地址',
`remark` varchar(255) DEFAULT NULL COMMENT '备注/更新说明',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1可下发 0停用',
`create_at` int DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_model` (`model`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT OTA固件版本表';
-- 设备分组表(房间/自定义分组)
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_group` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`member_id` int unsigned NOT NULL DEFAULT '0' COMMENT '归属会员(0=后台全局分组)',
`title` varchar(64) NOT NULL DEFAULT '' COMMENT '分组名',
`type` varchar(16) NOT NULL DEFAULT 'room' COMMENT 'room=房间 custom=自定义',
`sort` int NOT NULL DEFAULT '0' COMMENT '排序',
`create_at` int DEFAULT NULL,
`update_at` int DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_member` (`member_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT设备分组表';
-- 分组-设备关联表
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_group_device` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`group_id` int unsigned NOT NULL DEFAULT '0' COMMENT '分组ID',
`device_id` int unsigned NOT NULL DEFAULT '0' COMMENT '设备ID(iot_device.id)',
`create_at` int DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_group_device` (`group_id`,`device_id`),
KEY `idx_device` (`device_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT分组设备关联表';
-- 场景表(智慧生活:设备状态/定时/手动 三类触发器 → 动作组)
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_scene` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`member_id` int unsigned NOT NULL DEFAULT '0' COMMENT '归属会员(0=后台全局场景)',
`title` varchar(64) NOT NULL DEFAULT '' COMMENT '场景名',
`icon` varchar(32) NOT NULL DEFAULT '' COMMENT '图标标识',
`enabled` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1启用 0停用',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
`create_at` int DEFAULT NULL,
`update_at` int DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_member` (`member_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT场景表';
-- 场景触发器(device_state=设备状态/事件条件,schedule=定时cron,manual=手动)
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_scene_trigger` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`scene_id` int unsigned NOT NULL DEFAULT '0' COMMENT '场景ID',
`type` varchar(16) NOT NULL DEFAULT 'device_state' COMMENT 'device_state/schedule/manual',
`topic` varchar(255) NOT NULL DEFAULT '' COMMENT 'device_state: 主题过滤器',
`condition_json` text COMMENT '条件JSON',
`cron` varchar(64) NOT NULL DEFAULT '' COMMENT 'schedule: 5段cron,如 0 8 * * *',
`enabled` tinyint(1) NOT NULL DEFAULT '1',
`create_at` int DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_scene` (`scene_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT场景触发器';
-- 场景动作(send_cmd=下发命令 http=HTTP回调 notify=站内告警)
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_scene_action` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`scene_id` int unsigned NOT NULL DEFAULT '0' COMMENT '场景ID',
`sort` int NOT NULL DEFAULT '0' COMMENT '执行顺序',
`type` varchar(16) NOT NULL DEFAULT 'send_cmd' COMMENT 'send_cmd/http/notify',
`device_uuid` varchar(64) NOT NULL DEFAULT '' COMMENT 'send_cmd: 目标设备',
`payload_json` text COMMENT 'send_cmd: 命令payload / http: 请求体',
`topic` varchar(255) NOT NULL DEFAULT '' COMMENT 'http: 回调URL / notify: 通知标题',
`create_at` int DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_scene` (`scene_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT场景动作';
-- 场景执行日志(命中/未命中留痕)
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_scene_log` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`scene_id` int unsigned NOT NULL DEFAULT '0' COMMENT '场景ID',
`trigger_type` varchar(16) NOT NULL DEFAULT '' COMMENT 'device_state/schedule/manual',
`matched` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1命中 0未命中',
`message` text COMMENT '命中摘要/失败原因',
`create_at` int DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_scene` (`scene_id`),
KEY `idx_create_at` (`create_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT场景执行日志';
-- 传感器结构化时序表(一行 = 一个位置的一次上报)
-- 与 iot_device_log 的分工:log 存原始报文(longtext) 供诊断审计;本表存解析后的数值,
-- 供曲线绘制、统计、云端阈值复核 —— longtext 里加不了数值索引,画不了曲线。
-- iv 必须存:设备是「事件驱动稀疏上报」,相邻两点可能隔几十秒,画图/统计须按 ts→ts+iv 前向填充。
-- 探头身份(ROM 短码)作为 vs_json 的 key,使换探头后仍能把同一颗探头的数据串起来。
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_sensor_point` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`uuid` varchar(64) NOT NULL DEFAULT '' COMMENT '设备uuid',
`pos_index` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '位置序号(0起)',
`ts` int unsigned NOT NULL DEFAULT '0' COMMENT '设备NTP秒(0=未对时,已取服务端接收时间)',
`iv` smallint unsigned NOT NULL DEFAULT '0' COMMENT '本条数据覆盖秒数(前向填充用)',
`t` decimal(6,2) DEFAULT NULL COMMENT '位置温度=有效探头均值',
`df` decimal(6,2) DEFAULT NULL COMMENT '位置内极差',
`v` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1=位置有有效读数',
`vs_json` varchar(255) NOT NULL DEFAULT '' COMMENT '逐探头明细 {"A3F2":25.6}',
`ok_mask` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '探头有效位图',
`alert_mask` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '云端复核告警位图(bit7=gap)',
`cfg_ver` int unsigned NOT NULL DEFAULT '0' COMMENT '上报时的配置版本',
`create_at` int DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_dev_pos_ts` (`uuid`,`pos_index`,`ts`),
KEY `idx_create_at` (`create_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='传感器结构化时序(曲线/统计/云端复核)';