更新oa代码

This commit is contained in:
2025-11-06 15:56:29 +08:00
parent 9c67793fc3
commit 6a9b5d413a
60 changed files with 6194 additions and 2757 deletions
@@ -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;
-- =============================================
+192
View File
@@ -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 查询
+71
View File
@@ -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
[]
```