imetting_backend/sql/add_menu_permissions_system...

100 lines
4.7 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

-- ===================================================================
-- 菜单权限系统数据库迁移脚本
-- 创建日期: 2025-12-10
-- 说明: 添加 menus 表和 role_menu_permissions 表,实现基于角色的菜单权限管理
-- ===================================================================
-- ----------------------------
-- 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用于层级菜单',
`sort_order` int(11) DEFAULT 0 COMMENT '排序顺序',
`is_active` tinyint(1) DEFAULT 1 COMMENT '是否启用: 1-启用, 0-禁用',
`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`),
KEY `idx_is_active` (`is_active`)
) 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',
`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`),
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='角色菜单权限映射表';
-- ----------------------------
-- 初始化菜单数据(基于现有系统的下拉菜单)
-- ----------------------------
BEGIN;
-- 用户菜单项
INSERT INTO `menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `sort_order`, `is_active`, `description`)
VALUES
('change_password', '修改密码', 'KeyRound', NULL, 'action', 1, 1, '用户修改自己的密码'),
('prompt_management', '提示词仓库', 'BookText', '/prompt-management', 'link', 2, 1, '管理AI提示词模版'),
('platform_admin', '平台管理', 'Shield', '/admin/management', 'link', 3, 1, '平台管理员后台'),
('logout', '退出登录', 'LogOut', NULL, 'action', 99, 1, '退出当前账号');
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;
-- 普通用户role_id=2拥有除"平台管理"外的所有菜单权限
INSERT INTO `role_menu_permissions` (`role_id`, `menu_id`)
SELECT 2, menu_id FROM `menus` WHERE menu_code != 'platform_admin' AND is_active = 1;
COMMIT;
-- ----------------------------
-- 查询验证
-- ----------------------------
-- 查看所有菜单
-- SELECT * FROM menus ORDER BY sort_order;
-- 查看平台管理员的菜单权限
-- SELECT r.role_name, m.menu_name, m.menu_code, m.menu_url
-- FROM role_menu_permissions rmp
-- JOIN roles r ON rmp.role_id = r.role_id
-- JOIN menus m ON rmp.menu_id = m.menu_id
-- WHERE r.role_id = 1
-- ORDER BY m.sort_order;
-- 查看普通用户的菜单权限
-- SELECT r.role_name, m.menu_name, m.menu_code, m.menu_url
-- FROM role_menu_permissions rmp
-- JOIN roles r ON rmp.role_id = r.role_id
-- JOIN menus m ON rmp.menu_id = m.menu_id
-- WHERE r.role_id = 2
-- ORDER BY m.sort_order;