RuoYi-Vue/sql/tenant_package.sql

205 lines
8.0 KiB
SQL
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.

-- ============================================
-- 租户套餐功能 - 数据库脚本
-- 版本: 1.0
-- 日期: 2025-12-19
-- 说明: 实现租户套餐功能,通过套餐控制租户的菜单权限
-- ============================================
-- ============================================
-- 第一步:创建租户套餐表
-- ============================================
CREATE TABLE IF NOT EXISTS sys_tenant_package (
package_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '套餐ID',
package_name VARCHAR(50) NOT NULL COMMENT '套餐名称',
package_code VARCHAR(50) NOT NULL COMMENT '套餐编码',
status CHAR(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
del_flag CHAR(1) DEFAULT '0' COMMENT '删除标志(0存在 2删除)',
create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
create_time DATETIME DEFAULT NULL COMMENT '创建时间',
update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
update_time DATETIME DEFAULT NULL COMMENT '更新时间',
remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (package_id),
UNIQUE KEY uk_package_code (package_code)
) ENGINE=InnoDB AUTO_INCREMENT=1 COMMENT='租户套餐表';
-- ============================================
-- 第二步:创建套餐菜单关联表
-- ============================================
CREATE TABLE IF NOT EXISTS sys_package_menu (
package_id BIGINT(20) NOT NULL COMMENT '套餐ID',
menu_id BIGINT(20) NOT NULL COMMENT '菜单ID',
PRIMARY KEY (package_id, menu_id),
INDEX idx_package_id (package_id) -- 为package_id添加索引用户要求
) ENGINE=InnoDB COMMENT='套餐菜单关联表';
-- ============================================
-- 第三步修改sys_tenant表增加套餐字段
-- ============================================
-- 检查列是否存在,避免重复执行报错
SELECT COUNT(*) INTO @col_exists
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'sys_tenant'
AND column_name = 'package_id';
-- 只有列不存在时才添加
SET @sql = IF(@col_exists = 0,
'ALTER TABLE sys_tenant ADD COLUMN package_id BIGINT(20) DEFAULT NULL COMMENT ''套餐ID'' AFTER tenant_code',
'SELECT ''Column package_id already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 添加索引(忽略已存在的情况)
-- 注意:如果索引已存在会报错,可忽略该错误继续执行
SET @index_exists = (SELECT COUNT(*) FROM information_schema.statistics
WHERE table_schema = DATABASE() AND table_name = 'sys_tenant' AND index_name = 'idx_package_id');
SET @sql = IF(@index_exists = 0, 'ALTER TABLE sys_tenant ADD INDEX idx_package_id (package_id)', 'SELECT 1');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- ============================================
-- 第四步:初始化套餐数据
-- ============================================
INSERT INTO sys_tenant_package (package_name, package_code, status, create_by, create_time, remark) VALUES
('基础套餐', 'BASIC', '0', 'admin', NOW(), '用户、部门管理'),
('标准套餐', 'STANDARD', '0', 'admin', NOW(), '增加角色、菜单、字典管理'),
('高级套餐', 'PREMIUM', '0', 'admin', NOW(), '全部功能,不限制菜单');
-- ============================================
-- 第五步:初始化套餐菜单关联(基础套餐)
-- ============================================
-- 基础套餐:只包含用户、部门、岗位、字典管理
INSERT INTO sys_package_menu (package_id, menu_id) VALUES
-- 系统管理模块
(1, 1), -- 系统管理
-- 菜单项
(1, 100), -- 用户管理
(1, 101), -- 部门管理
(1, 103), -- 岗位管理
(1, 104), -- 字典管理
-- 用户管理按钮
(1, 1000), (1, 1001), (1, 1002), (1, 1003), (1, 1004), (1, 1005), (1, 1006),
-- 部门管理按钮
(1, 1016), (1, 1017), (1, 1018), (1, 1019),
-- 岗位管理按钮
(1, 1020), (1, 1021), (1, 1022), (1, 1023), (1, 1024),
-- 字典管理按钮
(1, 1025), (1, 1026), (1, 1027), (1, 1028), (1, 1029);
-- ============================================
-- 第六步:初始化套餐菜单关联(标准套餐)
-- ============================================
-- 标准套餐:增加角色、菜单管理
INSERT INTO sys_package_menu (package_id, menu_id) VALUES
-- 系统管理模块
(2, 1), -- 系统管理
-- 菜单项
(2, 100), (2, 101), (2, 102), (2, 103), (2, 104), (2, 105), -- 用户/部门/角色/岗位/字典/菜单
-- 用户管理按钮
(2, 1000), (2, 1001), (2, 1002), (2, 1003), (2, 1004), (2, 1005), (2, 1006),
-- 角色管理按钮
(2, 1007), (2, 1008), (2, 1009), (2, 1010), (2, 1011),
-- 菜单管理按钮
(2, 1012), (2, 1013), (2, 1014), (2, 1015),
-- 部门管理按钮
(2, 1016), (2, 1017), (2, 1018), (2, 1019),
-- 岗位管理按钮
(2, 1020), (2, 1021), (2, 1022), (2, 1023), (2, 1024),
-- 字典管理按钮
(2, 1025), (2, 1026), (2, 1027), (2, 1028), (2, 1029);
-- ============================================
-- 第七步:高级套餐不插入关联数据
-- ============================================
-- 说明:高级套餐 (package_id=3) 不插入 sys_package_menu 数据
-- 代码逻辑:查询结果为空列表时,表示"不限制菜单",用户可以看到所有菜单
-- ============================================
-- 第八步:关联现有租户到套餐
-- ============================================
-- 根据实际租户情况调整(使用安全的更新方式)
UPDATE sys_tenant SET package_id = 1 WHERE tenant_code = 'DEFAULT' AND package_id IS NULL;
UPDATE sys_tenant SET package_id = 2 WHERE tenant_code = 'TENANT_A' AND package_id IS NULL;
UPDATE sys_tenant SET package_id = 3 WHERE tenant_code = 'TENANT_B' AND package_id IS NULL;
-- ============================================
-- 验证数据
-- ============================================
-- 验证套餐表
SELECT * FROM sys_tenant_package;
-- 验证套餐菜单关联(基础套餐)
SELECT COUNT(*) AS '基础套餐菜单数' FROM sys_package_menu WHERE package_id = 1;
-- 验证套餐菜单关联(标准套餐)
SELECT COUNT(*) AS '标准套餐菜单数' FROM sys_package_menu WHERE package_id = 2;
-- 验证套餐菜单关联(高级套餐)
SELECT COUNT(*) AS '高级套餐菜单数应为0' FROM sys_package_menu WHERE package_id = 3;
-- 验证租户套餐关联
SELECT tenant_id, tenant_name, tenant_code, package_id
FROM sys_tenant
WHERE package_id IS NOT NULL;
-- ============================================
-- 回滚脚本(仅供紧急情况使用)
-- ============================================
/*
-- 警告:回滚将删除所有套餐数据和配置!
-- 1. 清除租户的套餐关联
UPDATE sys_tenant SET package_id = NULL;
-- 2. 删除套餐菜单关联表
DROP TABLE IF EXISTS sys_package_menu;
-- 3. 删除套餐表
DROP TABLE IF EXISTS sys_tenant_package;
-- 4. 删除租户表的套餐字段
ALTER TABLE sys_tenant DROP COLUMN IF EXISTS package_id;
ALTER TABLE sys_tenant DROP INDEX IF EXISTS idx_package_id;
*/
-- ============================================
-- 使用说明
-- ============================================
/*
套餐机制说明:
1. **基础套餐 (BASIC)**
- 适用于小型租户
- 只包含基础的用户、部门、岗位、字典管理
- 不能分配角色和菜单权限
2. **标准套餐 (STANDARD)**
- 适用于中型租户
- 包含基础功能 + 角色管理 + 菜单管理
- 可以自定义角色和权限
3. **高级套餐 (PREMIUM)**
- 适用于大型租户
- 不限制任何菜单功能
- sys_package_menu 表中无记录表示"全部菜单可见"
菜单过滤逻辑:
- 用户最终可见菜单 = 角色菜单 ∩ 套餐菜单
- 超级管理员不受套餐限制
- 未配置套餐的租户默认不限制菜单
*/