2026-01-19 11:03:08 +00:00
|
|
|
|
-- ===================================================================
|
|
|
|
|
|
-- 菜单权限系统数据库迁移脚本
|
|
|
|
|
|
-- 创建日期: 2025-12-10
|
2026-03-26 06:55:12 +00:00
|
|
|
|
-- 说明: 添加 menus 表和 role_menu_permissions 表,实现基于角色的多级菜单权限管理
|
2026-01-19 11:03:08 +00:00
|
|
|
|
-- ===================================================================
|
|
|
|
|
|
|
|
|
|
|
|
-- ----------------------------
|
|
|
|
|
|
-- Table structure for menus
|
|
|
|
|
|
-- ----------------------------
|
|
|
|
|
|
DROP TABLE IF EXISTS `menus`;
|
|
|
|
|
|
CREATE TABLE `menus` (
|
|
|
|
|
|
`menu_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜单ID',
|
|
|
|
|
|
`menu_code` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '菜单代码(唯一标识)',
|
|
|
|
|
|
`menu_name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '菜单名称',
|
|
|
|
|
|
`menu_icon` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '菜单图标标识',
|
|
|
|
|
|
`menu_url` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '菜单URL/路由',
|
|
|
|
|
|
`menu_type` enum('action','link','divider') COLLATE utf8mb4_unicode_ci DEFAULT 'action' COMMENT '菜单类型: action-操作/link-链接/divider-分隔符',
|
|
|
|
|
|
`parent_id` int(11) DEFAULT NULL COMMENT '父菜单ID(用于层级菜单)',
|
2026-03-26 06:55:12 +00:00
|
|
|
|
`menu_level` tinyint(3) NOT NULL DEFAULT 1 COMMENT '菜单层级(根节点为1)',
|
|
|
|
|
|
`tree_path` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '树路径(如 /3/6)',
|
2026-01-19 11:03:08 +00:00
|
|
|
|
`sort_order` int(11) DEFAULT 0 COMMENT '排序顺序',
|
|
|
|
|
|
`is_active` tinyint(1) DEFAULT 1 COMMENT '是否启用: 1-启用, 0-禁用',
|
2026-03-26 06:55:12 +00:00
|
|
|
|
`is_visible` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否在侧边菜单显示',
|
2026-01-19 11:03:08 +00:00
|
|
|
|
`description` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '菜单描述',
|
|
|
|
|
|
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
|
|
|
|
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|
|
|
|
|
PRIMARY KEY (`menu_id`),
|
|
|
|
|
|
UNIQUE KEY `uk_menu_code` (`menu_code`),
|
|
|
|
|
|
KEY `idx_parent_id` (`parent_id`),
|
2026-03-26 06:55:12 +00:00
|
|
|
|
KEY `idx_menu_level` (`menu_level`),
|
|
|
|
|
|
KEY `idx_tree_path` (`tree_path`),
|
|
|
|
|
|
KEY `idx_is_active` (`is_active`),
|
|
|
|
|
|
KEY `idx_is_visible` (`is_visible`)
|
2026-01-19 11:03:08 +00:00
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统菜单表';
|
|
|
|
|
|
|
|
|
|
|
|
-- ----------------------------
|
|
|
|
|
|
-- Table structure for role_menu_permissions
|
|
|
|
|
|
-- ----------------------------
|
|
|
|
|
|
DROP TABLE IF EXISTS `role_menu_permissions`;
|
|
|
|
|
|
CREATE TABLE `role_menu_permissions` (
|
|
|
|
|
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '权限ID',
|
|
|
|
|
|
`role_id` int(11) NOT NULL COMMENT '角色ID',
|
|
|
|
|
|
`menu_id` int(11) NOT NULL COMMENT '菜单ID',
|
2026-03-26 06:55:12 +00:00
|
|
|
|
`granted_by` int(11) DEFAULT NULL COMMENT '授权操作人ID',
|
|
|
|
|
|
`granted_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '授权时间',
|
2026-01-19 11:03:08 +00:00
|
|
|
|
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
|
|
|
|
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|
|
|
|
|
PRIMARY KEY (`id`),
|
|
|
|
|
|
UNIQUE KEY `uk_role_menu` (`role_id`,`menu_id`),
|
|
|
|
|
|
KEY `idx_role_id` (`role_id`),
|
|
|
|
|
|
KEY `idx_menu_id` (`menu_id`),
|
2026-03-26 06:55:12 +00:00
|
|
|
|
KEY `idx_granted_by` (`granted_by`),
|
|
|
|
|
|
KEY `idx_granted_at` (`granted_at`),
|
2026-01-19 11:03:08 +00:00
|
|
|
|
CONSTRAINT `fk_rmp_role_id` FOREIGN KEY (`role_id`) REFERENCES `roles` (`role_id`) ON DELETE CASCADE,
|
|
|
|
|
|
CONSTRAINT `fk_rmp_menu_id` FOREIGN KEY (`menu_id`) REFERENCES `menus` (`menu_id`) ON DELETE CASCADE
|
|
|
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色菜单权限映射表';
|
|
|
|
|
|
|
|
|
|
|
|
-- ----------------------------
|
2026-03-26 06:55:12 +00:00
|
|
|
|
-- 初始化菜单数据
|
2026-01-19 11:03:08 +00:00
|
|
|
|
-- ----------------------------
|
|
|
|
|
|
BEGIN;
|
|
|
|
|
|
|
2026-03-26 06:55:12 +00:00
|
|
|
|
-- 一级菜单
|
|
|
|
|
|
INSERT INTO `menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`)
|
2026-01-19 11:03:08 +00:00
|
|
|
|
VALUES
|
2026-03-26 06:55:12 +00:00
|
|
|
|
('account_settings', '账户设置', 'UserCog', '/account-settings', 'link', NULL, 1, NULL, 1, 1, 1, '管理个人账户信息'),
|
|
|
|
|
|
('prompt_management', '提示词仓库', 'BookText', '/prompt-management', 'link', NULL, 1, NULL, 2, 1, 1, '管理AI提示词模版'),
|
|
|
|
|
|
('platform_admin', '平台管理', 'Shield', '/admin/management/user-management', 'link', NULL, 1, NULL, 3, 1, 1, '平台管理员后台'),
|
|
|
|
|
|
('logout', '退出登录', 'LogOut', NULL, 'action', NULL, 1, NULL, 99, 1, 1, '退出当前账号');
|
|
|
|
|
|
|
|
|
|
|
|
-- 二级菜单(挂载到平台管理)
|
|
|
|
|
|
INSERT INTO `menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`)
|
|
|
|
|
|
SELECT 'user_management', '用户管理', 'Users', '/admin/management/user-management', 'link', menu_id, 2, NULL, 1, 1, 1, '账号、角色、密码重置'
|
|
|
|
|
|
FROM `menus` WHERE `menu_code` = 'platform_admin';
|
|
|
|
|
|
|
|
|
|
|
|
INSERT INTO `menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`)
|
|
|
|
|
|
SELECT 'permission_management', '权限管理', 'KeyRound', '/admin/management/permission-management', 'link', menu_id, 2, NULL, 2, 1, 1, '菜单与角色授权矩阵'
|
|
|
|
|
|
FROM `menus` WHERE `menu_code` = 'platform_admin';
|
|
|
|
|
|
|
|
|
|
|
|
INSERT INTO `menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`)
|
|
|
|
|
|
SELECT 'dict_management', '字典管理', 'BookMarked', '/admin/management/dict-management', 'link', menu_id, 2, NULL, 3, 1, 1, '码表、平台类型、扩展属性'
|
|
|
|
|
|
FROM `menus` WHERE `menu_code` = 'platform_admin';
|
|
|
|
|
|
|
|
|
|
|
|
INSERT INTO `menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`)
|
|
|
|
|
|
SELECT 'hot_word_management', '热词管理', 'Text', '/admin/management/hot-word-management', 'link', menu_id, 2, NULL, 4, 1, 1, 'ASR 热词与同步'
|
|
|
|
|
|
FROM `menus` WHERE `menu_code` = 'platform_admin';
|
|
|
|
|
|
|
|
|
|
|
|
INSERT INTO `menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`)
|
|
|
|
|
|
SELECT 'client_management', '客户端管理', 'Smartphone', '/admin/management/client-management', 'link', menu_id, 2, NULL, 5, 1, 1, '版本、下载地址、发布状态'
|
|
|
|
|
|
FROM `menus` WHERE `menu_code` = 'platform_admin';
|
|
|
|
|
|
|
|
|
|
|
|
INSERT INTO `menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`)
|
|
|
|
|
|
SELECT 'external_app_management', '外部应用管理', 'AppWindow', '/admin/management/external-app-management', 'link', menu_id, 2, NULL, 6, 1, 1, '外部系统入口与图标配置'
|
|
|
|
|
|
FROM `menus` WHERE `menu_code` = 'platform_admin';
|
|
|
|
|
|
|
|
|
|
|
|
INSERT INTO `menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`)
|
|
|
|
|
|
SELECT 'terminal_management', '终端管理', 'Monitor', '/admin/management/terminal-management', 'link', menu_id, 2, NULL, 7, 1, 1, '专用设备、激活和绑定状态'
|
|
|
|
|
|
FROM `menus` WHERE `menu_code` = 'platform_admin';
|
|
|
|
|
|
|
|
|
|
|
|
-- 回填路径
|
|
|
|
|
|
UPDATE `menus` SET `tree_path` = CONCAT('/', `menu_id`) WHERE `parent_id` IS NULL;
|
|
|
|
|
|
UPDATE `menus` c JOIN `menus` p ON c.`parent_id` = p.`menu_id`
|
|
|
|
|
|
SET c.`tree_path` = CONCAT(p.`tree_path`, '/', c.`menu_id`);
|
2026-01-19 11:03:08 +00:00
|
|
|
|
|
|
|
|
|
|
COMMIT;
|
|
|
|
|
|
|
|
|
|
|
|
-- ----------------------------
|
|
|
|
|
|
-- 初始化角色权限数据
|
|
|
|
|
|
-- 注意:角色表已存在,role_id=1为平台管理员,role_id=2为普通用户
|
|
|
|
|
|
-- ----------------------------
|
|
|
|
|
|
BEGIN;
|
|
|
|
|
|
|
|
|
|
|
|
-- 平台管理员(role_id=1)拥有所有菜单权限
|
|
|
|
|
|
INSERT INTO `role_menu_permissions` (`role_id`, `menu_id`)
|
|
|
|
|
|
SELECT 1, menu_id FROM `menus` WHERE is_active = 1;
|
|
|
|
|
|
|
2026-03-26 06:55:12 +00:00
|
|
|
|
-- 普通用户(role_id=2)排除平台管理与其二级子菜单
|
2026-01-19 11:03:08 +00:00
|
|
|
|
INSERT INTO `role_menu_permissions` (`role_id`, `menu_id`)
|
2026-03-26 06:55:12 +00:00
|
|
|
|
SELECT 2, menu_id FROM `menus`
|
|
|
|
|
|
WHERE is_active = 1
|
|
|
|
|
|
AND menu_code NOT IN (
|
|
|
|
|
|
'platform_admin',
|
|
|
|
|
|
'user_management',
|
|
|
|
|
|
'permission_management',
|
|
|
|
|
|
'dict_management',
|
|
|
|
|
|
'hot_word_management',
|
|
|
|
|
|
'client_management',
|
|
|
|
|
|
'external_app_management',
|
|
|
|
|
|
'terminal_management'
|
|
|
|
|
|
);
|
2026-01-19 11:03:08 +00:00
|
|
|
|
|
|
|
|
|
|
COMMIT;
|