-- ---------------------------------------------------------------------------- -- 应用图标管理 菜单 & 按钮权限初始化脚本(可重复执行 / 幂等) -- -- 依赖 -- 1. 前端页面 vue3-element-admin-ttstd/src/views/devices/app-icon/index.vue -- 2. 后端接口 com.youlai.boot.device.controller.AppIconController (/api/v1/app-icons) -- -- 说明 -- - 菜单本身(type=M)不携带权限字符串,权限必须来自按钮行(type=B, perm 非空) -- - 权限字符串中含冒号,部分客户端会把 :xxx 当成绑定变量,故本脚本用 CONCAT 拼接 -- 且授权改用「菜单下所有按钮」子查询,SQL 文本中避免出现 :token -- - 权限每次请求实时查库,执行后刷新页面即可,无需重启 -- ---------------------------------------------------------------------------- -- 0. 定位「应用图标管理」菜单(按前端组件路径唯一标识) SET @menu_id = (SELECT `id` FROM `sys_menu` WHERE `component` = 'devices/app-icon/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), '应用图标管理', 'M', 'AppIcon', 'app-icon', 'devices/app-icon/index', NULL, NULL, 1, 1, 6, 'picture', NULL, now(), now(), NULL FROM DUAL WHERE @parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `component` = 'devices/app-icon/index'); -- 重新取一次菜单 id(可能刚创建) SET @menu_id = (SELECT `id` FROM `sys_menu` WHERE `component` = 'devices/app-icon/index' LIMIT 1); -- 计算按钮的 tree_path = 菜单 tree_path + ',' + 菜单 id SET @tree_path = (SELECT CONCAT(`tree_path`, ',', `id`) FROM `sys_menu` WHERE `id` = @menu_id); -- 1. 插入 4 个按钮权限(上传 / 锁定 / 解锁 / 删除;不存在才插入) -- 权限字符串用 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('device', ':', 'app-icon', ':', 'upload') AS `perm`, 1 AS `sort` UNION ALL SELECT '锁定', CONCAT('device', ':', 'app-icon', ':', 'lock'), 2 UNION ALL SELECT '解锁', CONCAT('device', ':', 'app-icon', ':', 'unlock'), 3 UNION ALL SELECT '删除', CONCAT('device', ':', 'app-icon', ':', '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';