- 新增 DataSourceConfig 配置类,支持 MySQL(主)与 TDengine(时序)多数据源,使用 Druid 手动配置以兼容 Spring Boot 4.x
- 重构 MQTT 配置,从 spring-integration-mqtt 迁移至 Paho MQTT v5 原生客户端,实现消息发布/订阅与优雅关闭
- 重构 MqttMessageHandler 与 MqttProducer,适配 v5 客户端回调,优化设备状态消息处理逻辑(online/offline 字段调整)
- 新增设备修改昵称接口(PUT /api/v1/devices/{id})与 TDengine 心跳最后在线时间查询接口
- 设备列表查询填充在线状态(Redis),增强设备管理功能
- 配置缓存预热失败时仅记录日志,避免数据库不可用导致应用启动失败
- 更新开发与生产环境配置,添加 TDengine 数据源及 MQTT 认证信息
55 lines
3.4 KiB
SQL
55 lines
3.4 KiB
SQL
-- ----------------------------------------------------------------------------
|
||
-- SN管理 菜单 & 按钮权限初始化脚本(可重复执行 / 幂等)
|
||
--
|
||
-- 依赖
|
||
-- 1. 前端页面 vue3-element-admin-ttstd/src/views/devices/sn/index.vue
|
||
-- 2. 后端接口 com.youlai.boot.device.controller.DeviceController (/api/v1/device)
|
||
--
|
||
-- 说明
|
||
-- - 菜单本身(type=M)不携带权限字符串,权限必须来自按钮行(type=B, perm 非空)
|
||
-- - 权限字符串中含冒号,部分客户端会把 :xxx 当成绑定变量,故本脚本用 CONCAT 拼接
|
||
-- 且授权改用「菜单下所有按钮」子查询,SQL 文本中避免出现 :token
|
||
-- - 权限每次请求实时查库,执行后刷新页面即可,无需重启
|
||
-- ----------------------------------------------------------------------------
|
||
|
||
-- 0. 定位「SN管理」菜单(按前端组件路径唯一标识)
|
||
SET @menu_id = (SELECT `id` FROM `sys_menu` WHERE `component` = 'devices/sn/index' LIMIT 1);
|
||
|
||
-- 若菜单不存在则创建(挂到「设备调试」目录下;如目录 id 不同请自行调整 parent_id)
|
||
SET @parent_id = (SELECT `id` FROM `sys_menu` WHERE `name` = '设备调试' AND `parent_id` = 0 LIMIT 1);
|
||
INSERT INTO `sys_menu` (`parent_id`, `tree_path`, `name`, `type`, `route_name`, `route_path`, `component`,
|
||
`perm`, `always_show`, `keep_alive`, `visible`, `sort`, `icon`, `redirect`,
|
||
`create_time`, `update_time`, `params`)
|
||
SELECT @parent_id, CONCAT('0,', @parent_id), 'SN管理', 'M', 'SnManagement', 'sn-management',
|
||
'devices/sn/index', NULL, NULL, 1, 1, 1, 'device', NULL, now(), now(), NULL
|
||
FROM DUAL
|
||
WHERE @parent_id IS NOT NULL
|
||
AND NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `component` = 'devices/sn/index');
|
||
|
||
-- 重新取一次菜单 id(可能刚创建)
|
||
SET @menu_id = (SELECT `id` FROM `sys_menu` WHERE `component` = 'devices/sn/index' LIMIT 1);
|
||
-- 计算按钮的 tree_path = 菜单 tree_path + ',' + 菜单 id
|
||
SET @tree_path = (SELECT CONCAT(`tree_path`, ',', `id`) FROM `sys_menu` WHERE `id` = @menu_id);
|
||
|
||
-- 1. 插入按钮权限(不存在才插入);权限字符串用 CONCAT 拼接,避免 :token 被客户端误判
|
||
INSERT INTO `sys_menu` (`parent_id`, `tree_path`, `name`, `type`, `route_name`, `route_path`, `component`,
|
||
`perm`, `always_show`, `keep_alive`, `visible`, `sort`, `icon`, `redirect`,
|
||
`create_time`, `update_time`, `params`)
|
||
SELECT @menu_id, @tree_path, t.`name`, 'B', NULL, NULL, NULL,
|
||
t.`perm`, NULL, NULL, 1, t.`sort`, NULL, NULL, now(), now(), NULL
|
||
FROM (
|
||
SELECT '查询' AS `name`, CONCAT('sys', ':', 'device', ':', 'list') AS `perm`, 1 AS `sort` UNION ALL
|
||
SELECT '新增', CONCAT('sys', ':', 'device', ':', 'add'), 2 UNION ALL
|
||
SELECT '编辑', CONCAT('sys', ':', 'device', ':', 'edit'), 3 UNION ALL
|
||
SELECT '删除', CONCAT('sys', ':', 'device', ':', 'delete'), 4
|
||
) t
|
||
WHERE @menu_id IS NOT NULL
|
||
AND NOT EXISTS (SELECT 1 FROM `sys_menu` m WHERE m.`perm` = t.`perm`);
|
||
|
||
-- 2. 授权给 ADMIN 角色(role_id = 2;如实际角色 id 不同请修改)
|
||
-- 直接授权该菜单下的全部按钮,避免 SQL 文本中出现带冒号的权限字符串
|
||
INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`)
|
||
SELECT 2, `id`
|
||
FROM `sys_menu`
|
||
WHERE `parent_id` = @menu_id AND `type` = 'B';
|