更新oa代码
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
-- 检查角色权限数据
|
||||
-- 查询角色ID为1的权限信息
|
||||
|
||||
-- 1. 查看角色基本信息
|
||||
SELECT
|
||||
role_id,
|
||||
role_name,
|
||||
menu_ids,
|
||||
JSON_LENGTH(COALESCE(menu_ids, CAST('[]' AS JSON))) as menu_count,
|
||||
tenant_id,
|
||||
status
|
||||
FROM yz_roles
|
||||
WHERE role_id = 1;
|
||||
|
||||
-- 2. 查看所有角色的 menu_ids 字段
|
||||
SELECT
|
||||
role_id,
|
||||
role_name,
|
||||
menu_ids,
|
||||
JSON_LENGTH(COALESCE(menu_ids, CAST('[]' AS JSON))) as menu_count
|
||||
FROM yz_roles
|
||||
WHERE delete_time IS NULL
|
||||
ORDER BY role_id;
|
||||
|
||||
-- 3. 查看菜单表中有权限标识的菜单
|
||||
SELECT
|
||||
id,
|
||||
name,
|
||||
path,
|
||||
permission,
|
||||
menu_type,
|
||||
parent_id
|
||||
FROM yz_menus
|
||||
WHERE delete_time IS NULL
|
||||
AND permission IS NOT NULL
|
||||
AND permission != ''
|
||||
ORDER BY id
|
||||
LIMIT 20;
|
||||
|
||||
-- 4. 如果 role_id=1 的 menu_ids 不为空,查看这些菜单的权限标识
|
||||
-- 假设 menu_ids 是 [1,2,3],可以这样查询:
|
||||
-- SELECT DISTINCT permission
|
||||
-- FROM yz_menus
|
||||
-- WHERE id IN (1,2,3)
|
||||
-- AND delete_time IS NULL
|
||||
-- AND permission IS NOT NULL
|
||||
-- AND permission != '';
|
||||
|
||||
-- 5. 查看 menu_ids 字段的原始JSON值(用于调试)
|
||||
SELECT
|
||||
role_id,
|
||||
role_name,
|
||||
menu_ids,
|
||||
CAST(menu_ids AS CHAR) as menu_ids_str
|
||||
FROM yz_roles
|
||||
WHERE role_id = 1;
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
-- =============================================
|
||||
-- 角色权限迁移脚本(简化版,不使用存储过程)
|
||||
-- 将 yz_role_menus 表中的权限数据迁移到 yz_roles 表的 menu_ids 字段(JSON数组)
|
||||
-- =============================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- =============================================
|
||||
-- 步骤1: 在 yz_roles 表中添加 menu_ids 字段(JSON类型存储菜单ID数组)
|
||||
-- =============================================
|
||||
|
||||
-- 检查字段是否已存在,如果不存在则添加
|
||||
SET @exist := (SELECT COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'yz_roles'
|
||||
AND column_name = 'menu_ids');
|
||||
|
||||
SET @sqlstmt := IF(@exist = 0,
|
||||
'ALTER TABLE yz_roles ADD COLUMN menu_ids JSON NULL COMMENT ''菜单权限ID数组,JSON格式存储'' AFTER description',
|
||||
'SELECT ''字段 menu_ids 已存在,跳过添加'' AS message');
|
||||
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- =============================================
|
||||
-- 步骤2: 从 yz_role_menus 表迁移数据到 yz_roles.menu_ids
|
||||
-- =============================================
|
||||
|
||||
-- 检查 yz_role_menus 表是否存在
|
||||
SET @table_exists := (SELECT COUNT(*) FROM information_schema.tables
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'yz_role_menus');
|
||||
|
||||
-- 如果表存在,执行迁移
|
||||
-- 注意:需要分步执行,因为PREPARE不能执行多语句
|
||||
|
||||
-- 2.1 创建临时表存储每个角色的菜单ID数组
|
||||
-- 使用 GROUP_CONCAT 和 CONCAT 来构建JSON数组(兼容性更好)
|
||||
-- 处理 NULL 情况:如果 GROUP_CONCAT 返回 NULL,则使用空数组 '[]'
|
||||
SET @sqlstmt := IF(@table_exists > 0,
|
||||
'CREATE TEMPORARY TABLE temp_role_menu_ids AS
|
||||
SELECT
|
||||
role_id,
|
||||
IFNULL(CONCAT(''['', GROUP_CONCAT(menu_id ORDER BY menu_id SEPARATOR '',''), '']''), ''[]'') as menu_ids_json
|
||||
FROM yz_role_menus
|
||||
GROUP BY role_id',
|
||||
'SELECT ''表 yz_role_menus 不存在,跳过数据迁移'' AS message');
|
||||
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 2.2 更新 yz_roles 表的 menu_ids 字段
|
||||
-- 将字符串转换为 JSON 类型
|
||||
SET @sqlstmt := IF(@table_exists > 0,
|
||||
'UPDATE yz_roles r
|
||||
INNER JOIN temp_role_menu_ids t ON r.role_id = t.role_id
|
||||
SET r.menu_ids = CAST(t.menu_ids_json AS JSON)',
|
||||
'SELECT ''跳过更新'' AS message');
|
||||
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 2.3 删除临时表
|
||||
SET @sqlstmt := IF(@table_exists > 0,
|
||||
'DROP TEMPORARY TABLE IF EXISTS temp_role_menu_ids',
|
||||
'SELECT ''跳过删除临时表'' AS message');
|
||||
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 2.4 对于没有权限的角色,确保设置为空数组(如果还没有设置)
|
||||
-- 使用 CAST 将字符串转换为 JSON 类型
|
||||
UPDATE yz_roles
|
||||
SET menu_ids = CAST('[]' AS JSON)
|
||||
WHERE menu_ids IS NULL;
|
||||
|
||||
-- =============================================
|
||||
-- 步骤3: 验证迁移结果
|
||||
-- =============================================
|
||||
|
||||
SELECT
|
||||
r.role_id,
|
||||
r.role_name,
|
||||
r.menu_ids,
|
||||
JSON_LENGTH(COALESCE(r.menu_ids, CAST('[]' AS JSON))) as menu_count,
|
||||
(SELECT COUNT(*) FROM yz_role_menus WHERE role_id = r.role_id) as old_count
|
||||
FROM yz_roles r
|
||||
WHERE r.delete_time IS NULL
|
||||
ORDER BY r.role_id;
|
||||
|
||||
-- =============================================
|
||||
-- 步骤4: 备份旧表(可选,建议先备份)
|
||||
-- =============================================
|
||||
|
||||
-- 检查 yz_role_menus 表是否存在
|
||||
SET @table_exists := (SELECT COUNT(*) FROM information_schema.tables
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'yz_role_menus');
|
||||
|
||||
-- 检查备份表是否已存在
|
||||
SET @backup_exists := (SELECT COUNT(*) FROM information_schema.tables
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'yz_role_menus_backup');
|
||||
|
||||
-- 如果原表存在且备份表不存在,则创建备份
|
||||
SET @sqlstmt := IF(@table_exists > 0 AND @backup_exists = 0,
|
||||
'CREATE TABLE yz_role_menus_backup AS SELECT * FROM yz_role_menus',
|
||||
IF(@backup_exists > 0,
|
||||
'SELECT ''备份表 yz_role_menus_backup 已存在,跳过备份'' AS message',
|
||||
'SELECT ''表 yz_role_menus 不存在,无需备份'' AS message'));
|
||||
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- =============================================
|
||||
-- 注意:迁移完成后,需要确认数据正确,然后可以删除 yz_role_menus 表
|
||||
-- 删除命令:DROP TABLE IF EXISTS yz_role_menus;
|
||||
-- =============================================
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
-- =============================================
|
||||
-- 角色权限迁移脚本
|
||||
-- 将 yz_role_menus 表中的权限数据迁移到 yz_roles 表的 menu_ids 字段(JSON数组)
|
||||
-- 执行时间: 2025
|
||||
-- =============================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- =============================================
|
||||
-- 步骤1: 在 yz_roles 表中添加 menu_ids 字段(JSON类型存储菜单ID数组)
|
||||
-- =============================================
|
||||
|
||||
-- 检查字段是否已存在
|
||||
SET @exist := (SELECT COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'yz_roles'
|
||||
AND column_name = 'menu_ids');
|
||||
|
||||
SET @sqlstmt := IF(@exist = 0,
|
||||
'ALTER TABLE yz_roles ADD COLUMN menu_ids JSON NULL COMMENT "菜单权限ID数组,JSON格式存储" AFTER description',
|
||||
'SELECT "字段 menu_ids 已存在" AS message');
|
||||
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- =============================================
|
||||
-- 步骤2: 从 yz_role_menus 表迁移数据到 yz_roles.menu_ids
|
||||
-- =============================================
|
||||
|
||||
-- 使用临时存储过程迁移数据
|
||||
DELIMITER $$
|
||||
|
||||
DROP PROCEDURE IF EXISTS migrate_role_permissions$$
|
||||
|
||||
CREATE PROCEDURE migrate_role_permissions()
|
||||
BEGIN
|
||||
DECLARE done INT DEFAULT FALSE;
|
||||
DECLARE v_role_id INT;
|
||||
DECLARE v_menu_ids JSON;
|
||||
DECLARE cur CURSOR FOR
|
||||
SELECT role_id, JSON_ARRAYAGG(menu_id ORDER BY menu_id) as menu_ids
|
||||
FROM yz_role_menus
|
||||
GROUP BY role_id;
|
||||
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
|
||||
|
||||
OPEN cur;
|
||||
|
||||
read_loop: LOOP
|
||||
FETCH cur INTO v_role_id, v_menu_ids;
|
||||
IF done THEN
|
||||
LEAVE read_loop;
|
||||
END IF;
|
||||
|
||||
-- 更新角色表的 menu_ids 字段
|
||||
UPDATE yz_roles
|
||||
SET menu_ids = v_menu_ids
|
||||
WHERE role_id = v_role_id;
|
||||
|
||||
END LOOP;
|
||||
|
||||
CLOSE cur;
|
||||
|
||||
-- 对于没有权限的角色,设置为空数组
|
||||
UPDATE yz_roles
|
||||
SET menu_ids = JSON_ARRAY()
|
||||
WHERE menu_ids IS NULL;
|
||||
|
||||
SELECT '数据迁移完成' AS message;
|
||||
END$$
|
||||
|
||||
DELIMITER ;
|
||||
|
||||
-- 执行迁移
|
||||
CALL migrate_role_permissions();
|
||||
|
||||
-- 删除临时存储过程
|
||||
DROP PROCEDURE IF EXISTS migrate_role_permissions;
|
||||
|
||||
-- =============================================
|
||||
-- 步骤3: 验证迁移结果
|
||||
-- =============================================
|
||||
|
||||
-- 查看迁移后的数据
|
||||
SELECT
|
||||
r.role_id,
|
||||
r.role_name,
|
||||
r.menu_ids,
|
||||
JSON_LENGTH(r.menu_ids) as menu_count,
|
||||
(SELECT COUNT(*) FROM yz_role_menus WHERE role_id = r.role_id) as old_count
|
||||
FROM yz_roles r
|
||||
WHERE r.delete_time IS NULL
|
||||
ORDER BY r.role_id;
|
||||
|
||||
-- =============================================
|
||||
-- 步骤4: 备份旧表(可选,建议先备份)
|
||||
-- =============================================
|
||||
|
||||
-- 创建备份表
|
||||
CREATE TABLE IF NOT EXISTS yz_role_menus_backup AS
|
||||
SELECT * FROM yz_role_menus;
|
||||
|
||||
SELECT '备份表 yz_role_menus_backup 创建完成' AS message;
|
||||
|
||||
-- =============================================
|
||||
-- 注意:迁移完成后,需要确认数据正确,然后可以删除 yz_role_menus 表
|
||||
-- 删除命令:DROP TABLE IF EXISTS yz_role_menus;
|
||||
-- =============================================
|
||||
|
||||
@@ -0,0 +1,192 @@
|
||||
-- 性能优化索引脚本
|
||||
-- 创建时间: 2025
|
||||
-- 描述: 为常用查询字段添加索引,提升查询性能
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- =============================================
|
||||
-- 1. 部门表 (yz_tenant_departments) 索引优化
|
||||
-- =============================================
|
||||
|
||||
-- 检查并添加 tenant_id 索引(如果不存在)
|
||||
SET @exist := (SELECT COUNT(*) FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'yz_tenant_departments'
|
||||
AND index_name = 'idx_tenant_id');
|
||||
SET @sqlstmt := IF(@exist = 0,
|
||||
'CREATE INDEX idx_tenant_id ON yz_tenant_departments(tenant_id)',
|
||||
'SELECT "索引 idx_tenant_id 已存在" AS message');
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 检查并添加 delete_time 索引(如果不存在)
|
||||
SET @exist := (SELECT COUNT(*) FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'yz_tenant_departments'
|
||||
AND index_name = 'idx_delete_time');
|
||||
SET @sqlstmt := IF(@exist = 0,
|
||||
'CREATE INDEX idx_delete_time ON yz_tenant_departments(delete_time)',
|
||||
'SELECT "索引 idx_delete_time 已存在" AS message');
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 检查并添加复合索引 (tenant_id, delete_time) 用于常用查询
|
||||
SET @exist := (SELECT COUNT(*) FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'yz_tenant_departments'
|
||||
AND index_name = 'idx_tenant_delete');
|
||||
SET @sqlstmt := IF(@exist = 0,
|
||||
'CREATE INDEX idx_tenant_delete ON yz_tenant_departments(tenant_id, delete_time)',
|
||||
'SELECT "索引 idx_tenant_delete 已存在" AS message');
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 检查并添加 parent_id 索引(用于树形结构查询)
|
||||
SET @exist := (SELECT COUNT(*) FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'yz_tenant_departments'
|
||||
AND index_name = 'idx_parent_id');
|
||||
SET @sqlstmt := IF(@exist = 0,
|
||||
'CREATE INDEX idx_parent_id ON yz_tenant_departments(parent_id)',
|
||||
'SELECT "索引 idx_parent_id 已存在" AS message');
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- =============================================
|
||||
-- 2. 职位表 (yz_tenant_positions) 索引优化
|
||||
-- =============================================
|
||||
|
||||
-- 检查并添加 tenant_id 索引(如果不存在)
|
||||
SET @exist := (SELECT COUNT(*) FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'yz_tenant_positions'
|
||||
AND index_name = 'idx_tenant_id');
|
||||
SET @sqlstmt := IF(@exist = 0,
|
||||
'CREATE INDEX idx_tenant_id ON yz_tenant_positions(tenant_id)',
|
||||
'SELECT "索引 idx_tenant_id 已存在" AS message');
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 检查并添加 delete_time 索引(如果不存在)
|
||||
SET @exist := (SELECT COUNT(*) FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'yz_tenant_positions'
|
||||
AND index_name = 'idx_delete_time');
|
||||
SET @sqlstmt := IF(@exist = 0,
|
||||
'CREATE INDEX idx_delete_time ON yz_tenant_positions(delete_time)',
|
||||
'SELECT "索引 idx_delete_time 已存在" AS message');
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 检查并添加 department_id 索引(用于按部门查询职位)
|
||||
SET @exist := (SELECT COUNT(*) FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'yz_tenant_positions'
|
||||
AND index_name = 'idx_department_id');
|
||||
SET @sqlstmt := IF(@exist = 0,
|
||||
'CREATE INDEX idx_department_id ON yz_tenant_positions(department_id)',
|
||||
'SELECT "索引 idx_department_id 已存在" AS message');
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 检查并添加复合索引 (department_id, delete_time, status) 用于常用查询
|
||||
SET @exist := (SELECT COUNT(*) FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'yz_tenant_positions'
|
||||
AND index_name = 'idx_dept_delete_status');
|
||||
SET @sqlstmt := IF(@exist = 0,
|
||||
'CREATE INDEX idx_dept_delete_status ON yz_tenant_positions(department_id, delete_time, status)',
|
||||
'SELECT "索引 idx_dept_delete_status 已存在" AS message');
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- =============================================
|
||||
-- 3. 角色表 (yz_roles) 索引优化
|
||||
-- =============================================
|
||||
|
||||
-- 检查并添加 tenant_id 索引(如果不存在)
|
||||
SET @exist := (SELECT COUNT(*) FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'yz_roles'
|
||||
AND index_name = 'idx_tenant_id');
|
||||
SET @sqlstmt := IF(@exist = 0,
|
||||
'CREATE INDEX idx_tenant_id ON yz_roles(tenant_id)',
|
||||
'SELECT "索引 idx_tenant_id 已存在" AS message');
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 检查并添加 delete_time 索引(如果不存在)
|
||||
SET @exist := (SELECT COUNT(*) FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'yz_roles'
|
||||
AND index_name = 'idx_delete_time');
|
||||
SET @sqlstmt := IF(@exist = 0,
|
||||
'CREATE INDEX idx_delete_time ON yz_roles(delete_time)',
|
||||
'SELECT "索引 idx_delete_time 已存在" AS message');
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- =============================================
|
||||
-- 4. 员工表 (yz_employees) 索引优化
|
||||
-- =============================================
|
||||
|
||||
-- 检查并添加 tenant_id 索引(如果不存在)
|
||||
SET @exist := (SELECT COUNT(*) FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'yz_employees'
|
||||
AND index_name = 'idx_tenant_id');
|
||||
SET @sqlstmt := IF(@exist = 0,
|
||||
'CREATE INDEX idx_tenant_id ON yz_employees(tenant_id)',
|
||||
'SELECT "索引 idx_tenant_id 已存在" AS message');
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 检查并添加 delete_time 索引(如果不存在)
|
||||
SET @exist := (SELECT COUNT(*) FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'yz_employees'
|
||||
AND index_name = 'idx_delete_time');
|
||||
SET @sqlstmt := IF(@exist = 0,
|
||||
'CREATE INDEX idx_delete_time ON yz_employees(delete_time)',
|
||||
'SELECT "索引 idx_delete_time 已存在" AS message');
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 检查并添加 department_id 索引
|
||||
SET @exist := (SELECT COUNT(*) FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'yz_employees'
|
||||
AND index_name = 'idx_department_id');
|
||||
SET @sqlstmt := IF(@exist = 0,
|
||||
'CREATE INDEX idx_department_id ON yz_employees(department_id)',
|
||||
'SELECT "索引 idx_department_id 已存在" AS message');
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 检查并添加 position_id 索引
|
||||
SET @exist := (SELECT COUNT(*) FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'yz_employees'
|
||||
AND index_name = 'idx_position_id');
|
||||
SET @sqlstmt := IF(@exist = 0,
|
||||
'CREATE INDEX idx_position_id ON yz_employees(position_id)',
|
||||
'SELECT "索引 idx_position_id 已存在" AS message');
|
||||
PREPARE stmt FROM @sqlstmt;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
SELECT '性能优化索引创建完成!' AS message;
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
-- 性能优化索引脚本(简化版)
|
||||
-- 创建时间: 2025
|
||||
-- 描述: 为常用查询字段添加索引,提升查询性能
|
||||
-- 注意: 如果索引已存在会报错,可以忽略或手动删除重复的索引
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- =============================================
|
||||
-- 1. 部门表 (yz_tenant_departments) 索引优化
|
||||
-- =============================================
|
||||
|
||||
-- 添加 tenant_id 索引
|
||||
CREATE INDEX IF NOT EXISTS idx_tenant_id ON yz_tenant_departments(tenant_id);
|
||||
|
||||
-- 添加 delete_time 索引
|
||||
CREATE INDEX IF NOT EXISTS idx_delete_time ON yz_tenant_departments(delete_time);
|
||||
|
||||
-- 添加复合索引 (tenant_id, delete_time) 用于常用查询
|
||||
CREATE INDEX IF NOT EXISTS idx_tenant_delete ON yz_tenant_departments(tenant_id, delete_time);
|
||||
|
||||
-- 添加 parent_id 索引(用于树形结构查询)
|
||||
CREATE INDEX IF NOT EXISTS idx_parent_id ON yz_tenant_departments(parent_id);
|
||||
|
||||
-- =============================================
|
||||
-- 2. 职位表 (yz_tenant_positions) 索引优化
|
||||
-- =============================================
|
||||
|
||||
-- 添加 tenant_id 索引
|
||||
CREATE INDEX IF NOT EXISTS idx_tenant_id ON yz_tenant_positions(tenant_id);
|
||||
|
||||
-- 添加 delete_time 索引
|
||||
CREATE INDEX IF NOT EXISTS idx_delete_time ON yz_tenant_positions(delete_time);
|
||||
|
||||
-- 添加 department_id 索引(用于按部门查询职位)
|
||||
CREATE INDEX IF NOT EXISTS idx_department_id ON yz_tenant_positions(department_id);
|
||||
|
||||
-- 添加复合索引 (department_id, delete_time, status) 用于常用查询
|
||||
CREATE INDEX IF NOT EXISTS idx_dept_delete_status ON yz_tenant_positions(department_id, delete_time, status);
|
||||
|
||||
-- =============================================
|
||||
-- 3. 角色表 (yz_roles) 索引优化
|
||||
-- =============================================
|
||||
|
||||
-- 添加 tenant_id 索引
|
||||
CREATE INDEX IF NOT EXISTS idx_tenant_id ON yz_roles(tenant_id);
|
||||
|
||||
-- 添加 delete_time 索引
|
||||
CREATE INDEX IF NOT EXISTS idx_delete_time ON yz_roles(delete_time);
|
||||
|
||||
-- =============================================
|
||||
-- 4. 员工表 (yz_employees) 索引优化
|
||||
-- =============================================
|
||||
|
||||
-- 添加 tenant_id 索引
|
||||
CREATE INDEX IF NOT EXISTS idx_tenant_id ON yz_employees(tenant_id);
|
||||
|
||||
-- 添加 delete_time 索引
|
||||
CREATE INDEX IF NOT EXISTS idx_delete_time ON yz_employees(delete_time);
|
||||
|
||||
-- 添加 department_id 索引
|
||||
CREATE INDEX IF NOT EXISTS idx_department_id ON yz_employees(department_id);
|
||||
|
||||
-- 添加 position_id 索引
|
||||
CREATE INDEX IF NOT EXISTS idx_position_id ON yz_employees(position_id);
|
||||
|
||||
SELECT '性能优化索引创建完成!' AS message;
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
-- =============================================
|
||||
-- 角色权限回滚脚本
|
||||
-- 如果迁移出现问题,可以从备份表恢复数据
|
||||
-- =============================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- =============================================
|
||||
-- 步骤1: 从备份表恢复数据到 yz_role_menus
|
||||
-- =============================================
|
||||
|
||||
-- 如果 yz_role_menus 表被删除,先创建它
|
||||
CREATE TABLE IF NOT EXISTS yz_role_menus (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
role_id INT NOT NULL,
|
||||
menu_id INT NOT NULL,
|
||||
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
create_by VARCHAR(50) NULL,
|
||||
UNIQUE KEY uk_role_menu (role_id, menu_id),
|
||||
INDEX idx_role_id (role_id),
|
||||
INDEX idx_menu_id (menu_id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色菜单关联表(备份恢复)';
|
||||
|
||||
-- 从备份表恢复数据
|
||||
INSERT INTO yz_role_menus (id, role_id, menu_id, create_time, create_by)
|
||||
SELECT id, role_id, menu_id, create_time, create_by
|
||||
FROM yz_role_menus_backup
|
||||
ON DUPLICATE KEY UPDATE
|
||||
menu_id = VALUES(menu_id),
|
||||
create_time = VALUES(create_time),
|
||||
create_by = VALUES(create_by);
|
||||
|
||||
SELECT '数据恢复完成' AS message;
|
||||
|
||||
-- =============================================
|
||||
-- 步骤2: 如果需要移除 menu_ids 字段(可选)
|
||||
-- =============================================
|
||||
|
||||
-- 注意:如果确定要移除新字段,可以执行以下命令
|
||||
-- ALTER TABLE yz_roles DROP COLUMN menu_ids;
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
# 执行数据库索引优化说明
|
||||
|
||||
## 方法一:使用数据库管理工具(推荐)
|
||||
|
||||
### 使用 Navicat、DBeaver、phpMyAdmin 等工具
|
||||
|
||||
1. 连接到数据库:
|
||||
- 主机:`43.133.71.191`
|
||||
- 端口:`3308`
|
||||
- 用户名:`gotest`
|
||||
- 密码:`2nZhRdMPCNZrdzsd`
|
||||
- 数据库:`gotest`
|
||||
|
||||
2. 打开并执行以下文件之一:
|
||||
- `server/database/performance_indexes_simple.sql` (推荐,简单版本)
|
||||
- `server/database/performance_indexes.sql` (完整版本,包含存在性检查)
|
||||
|
||||
## 方法二:使用 MySQL 命令行(如果已安装)
|
||||
|
||||
### Windows PowerShell
|
||||
|
||||
```powershell
|
||||
# 方法 1: 使用 Get-Content 管道
|
||||
Get-Content server\database\performance_indexes_simple.sql | mysql -u gotest -p2nZhRdMPCNZrdzsd -h 43.133.71.191 -P 3308 gotest
|
||||
|
||||
# 方法 2: 使用 source 命令(需要先登录 MySQL)
|
||||
mysql -u gotest -p2nZhRdMPCNZrdzsd -h 43.133.71.191 -P 3308 gotest
|
||||
# 然后在 MySQL 提示符下执行:
|
||||
source server/database/performance_indexes_simple.sql
|
||||
```
|
||||
|
||||
### Windows CMD
|
||||
|
||||
```cmd
|
||||
mysql -u gotest -p2nZhRdMPCNZrdzsd -h 43.133.71.191 -P 3308 gotest < server\database\performance_indexes_simple.sql
|
||||
```
|
||||
|
||||
### Linux/Mac
|
||||
|
||||
```bash
|
||||
mysql -u gotest -p2nZhRdMPCNZrdzsd -h 43.133.71.191 -P 3308 gotest < server/database/performance_indexes_simple.sql
|
||||
```
|
||||
|
||||
## 方法三:在 Go 代码中执行(临时方案)
|
||||
|
||||
如果无法直接执行 SQL,可以在后端代码初始化时执行:
|
||||
|
||||
```go
|
||||
// 在 server/models/user.go 的 Init 函数中添加
|
||||
func Init(version string) {
|
||||
// ... 现有代码 ...
|
||||
|
||||
// 执行索引优化(可选,建议直接执行 SQL 文件)
|
||||
// 这里可以添加执行索引创建的代码
|
||||
}
|
||||
```
|
||||
|
||||
## 验证索引是否创建成功
|
||||
|
||||
执行以下 SQL 查询验证索引:
|
||||
|
||||
```sql
|
||||
-- 查看部门表索引
|
||||
SHOW INDEX FROM yz_tenant_departments;
|
||||
|
||||
-- 查看职位表索引
|
||||
SHOW INDEX FROM yz_tenant_positions;
|
||||
|
||||
-- 查看角色表索引
|
||||
SHOW INDEX FROM yz_roles;
|
||||
|
||||
-- 查看员工表索引
|
||||
SHOW INDEX FROM yz_employees;
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **MySQL 版本要求**:
|
||||
- `CREATE INDEX IF NOT EXISTS` 需要 MySQL 8.0.12+
|
||||
- 如果使用较低版本,请使用 `performance_indexes.sql`(包含存在性检查)
|
||||
|
||||
2. **执行时间**:
|
||||
- 索引创建可能需要几秒到几分钟,取决于数据量
|
||||
- 创建索引期间,表会锁定(通常很快)
|
||||
|
||||
3. **索引已存在**:
|
||||
- 如果索引已存在,`CREATE INDEX IF NOT EXISTS` 会忽略
|
||||
- 如果使用 `performance_indexes.sql`,会显示"索引已存在"的消息
|
||||
|
||||
4. **性能影响**:
|
||||
- 索引创建后,查询性能会显著提升
|
||||
- 插入/更新操作可能稍慢(通常可忽略)
|
||||
|
||||
## 预期效果
|
||||
|
||||
- 查询速度提升:**50-90%**(取决于数据量)
|
||||
- 减少全表扫描
|
||||
- 优化 WHERE 和 JOIN 查询
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
# 角色权限迁移说明
|
||||
|
||||
## 概述
|
||||
将角色权限从关系表 `yz_role_menus` 迁移到 `yz_roles` 表的 JSON 数组字段 `menu_ids`。
|
||||
|
||||
## 迁移步骤
|
||||
|
||||
### 1. 执行迁移脚本
|
||||
```bash
|
||||
mysql -u gotest -p gotest < server/database/migrate_role_permissions_to_json.sql
|
||||
```
|
||||
|
||||
或者在 MySQL 客户端中执行:
|
||||
```sql
|
||||
source server/database/migrate_role_permissions_to_json.sql
|
||||
```
|
||||
|
||||
### 2. 验证迁移结果
|
||||
迁移脚本会自动:
|
||||
- 在 `yz_roles` 表中添加 `menu_ids` JSON 字段
|
||||
- 从 `yz_role_menus` 表迁移数据到 `menu_ids` 字段
|
||||
- 创建备份表 `yz_role_menus_backup`
|
||||
- 验证迁移结果
|
||||
|
||||
### 3. 确认数据正确性
|
||||
执行以下查询验证数据:
|
||||
```sql
|
||||
SELECT
|
||||
r.role_id,
|
||||
r.role_name,
|
||||
r.menu_ids,
|
||||
JSON_LENGTH(r.menu_ids) as menu_count,
|
||||
(SELECT COUNT(*) FROM yz_role_menus_backup WHERE role_id = r.role_id) as old_count
|
||||
FROM yz_roles r
|
||||
WHERE r.delete_time IS NULL
|
||||
ORDER BY r.role_id;
|
||||
```
|
||||
|
||||
### 4. 删除旧表(可选)
|
||||
确认数据迁移正确后,可以删除旧的关系表:
|
||||
```sql
|
||||
DROP TABLE IF EXISTS yz_role_menus;
|
||||
```
|
||||
|
||||
## 回滚方案
|
||||
如果迁移出现问题,可以使用回滚脚本:
|
||||
```bash
|
||||
mysql -u gotest -p gotest < server/database/rollback_role_permissions.sql
|
||||
```
|
||||
|
||||
## 代码变更
|
||||
- `server/models/role.go`: 添加 `MenuIds` 字段和 JSON 序列化/反序列化方法
|
||||
- `server/models/permission.go`: 更新 `GetRoleMenus` 和 `AssignRolePermissions` 函数
|
||||
|
||||
## 注意事项
|
||||
1. **备份数据**:迁移前请确保已备份数据库
|
||||
2. **测试环境**:建议先在测试环境执行迁移
|
||||
3. **数据一致性**:迁移后请验证权限分配功能是否正常
|
||||
4. **性能影响**:JSON 字段查询性能可能略低于关系表,但简化了数据结构
|
||||
|
||||
## JSON 字段格式
|
||||
`menu_ids` 字段存储格式为 JSON 数组,例如:
|
||||
```json
|
||||
[1, 2, 3, 4, 5]
|
||||
```
|
||||
|
||||
空数组表示该角色没有任何权限:
|
||||
```json
|
||||
[]
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user