docs: 添加租户权限管理数据库补丁SQL

## 新增功能

### 🔧 数据库补丁SQL
- 创建 `patch_tenant_permissions.sql` 快速修复补丁
- 添加用户角色类型字典:admin、租户管理员、部门管理员、普通用户
- 添加组织类型字典:租户、部门、子部门分类
- 添加权限等级字典:系统级、租户级、部门级、个人级
- 添加操作类型字典:创建租户、创建部门、管理用户、查看数据

### 📋 数据字典完善
- 支持多租户权限分级控制的字典数据
- 包含中英文双语支持
- 提供前端渲染类型配置
- 支持权限可视化展示

### 🎯 解决问题
- 补充admin新增租户权限控制缺失的数据字典支持
- 为前端权限按钮显示提供字典数据基础
- 完善多租户架构的数据基础设施
- 支持权限等级和操作类型的标准化管理

### 📖 使用说明
- 执行补丁SQL前请备份数据库
- 根据实际ID生成策略调整字典ID值
- 执行后重启应用刷新字典缓存
- 支持扩展更多权限相关字典配置

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-08-14 17:25:46 +08:00
co-authored by Claude
parent 0c7a82f834
commit b5b93ac62b
2 changed files with 174 additions and 0 deletions
+112
View File
@@ -18,6 +18,37 @@
### 🚀 最新更新
#### v1.0.7 - 租户/部门权限管理优化 (2025-01-16)
**重要改进:**
- **权限分级控制**: 实现租户和部门的分级权限管理
- **admin用户**:可以创建租户(顶级组织)+ 创建部门
- **普通用户**:只能在自己租户下创建部门,无法创建租户
- **前端权限控制**: 动态按钮显示
- 只有admin角色才能看到"新增租户"按钮
- 普通用户只显示"新增部门"按钮
- **后端API安全**: 严格的权限验证
- 创建顶级组织时检查管理员权限
- 非admin用户尝试创建租户时返回权限错误
- **文案优化**: 更准确的业务概念
- "组织" → "租户":明确多租户架构
- "新增子组织" → "新增部门":符合组织层级关系
**权限逻辑:**
```
├── admin用户
│ ├── ✅ 创建租户(顶级组织)
│ └── ✅ 创建部门(子组织)
└── 普通用户
├── ❌ 不能创建租户
└── ✅ 只能在自己租户下创建部门
```
**🔧 数据库补丁**:执行 [`patch_tenant_permissions.sql`](./patch_tenant_permissions.sql) 添加权限相关字典数据
#### v1.0.6 - 健康数据查询优化 (2025-01-16)
**重要改进:**
@@ -45,6 +76,7 @@ GET /t_user_health_data/page?userId=12345&departmentInfo=1940374227169349634&sta
**影响模块:**
- `TUserHealthDataServiceImpl.java` - 核心查询逻辑优化
- `DeviceUserMappingServiceImpl.java` - 设备用户映射服务
- `SysOrgUnitsController.java` - 租户/部门权限控制
### 技术选型
@@ -96,6 +128,86 @@ git clone https://github.com/brunoGao/ljwx-boot-starter
4. 启动`LjwxBootApplication`类
5. 看到`---[LjwxBoot]-[ljwx-boot-admin]-启动完成,当前使用的端口:[9999],环境变量:[mybatis,dev]---`即代表启动成功
### 📊 数据字典SQL
系统使用数据字典来管理下拉选项、状态值等基础数据。以下是核心数据字典表的建表SQL:
#### 字典主表 (sys_dict)
```sql
CREATE TABLE `sys_dict` (
`id` bigint NOT NULL COMMENT 'ID',
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '字典名称',
`code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '字典编码',
`type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '字典类型(1:系统字典,2:业务字典)',
`sort` int DEFAULT NULL COMMENT '排序值',
`description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '字典描述',
`status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '1' COMMENT '是否启用(0:禁用,1:启用)',
`create_user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建用户名称',
`create_user_id` bigint DEFAULT NULL COMMENT '创建用户ID',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '更新用户名称',
`update_user_id` bigint DEFAULT NULL COMMENT '更新用户ID',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`is_deleted` tinyint DEFAULT '0' COMMENT '是否删除(0:否,1:是)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='数据字典主表';
```
#### 字典子项表 (sys_dict_item)
```sql
CREATE TABLE `sys_dict_item` (
`id` bigint NOT NULL COMMENT 'ID',
`dict_id` bigint DEFAULT NULL COMMENT '父字典ID',
`dict_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '父字典编码',
`value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '数据值',
`zh_cn` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '中文名称',
`en_us` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '英文名称',
`type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '类型(前端渲染类型)',
`sort` int DEFAULT NULL COMMENT '排序值',
`description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '字典描述',
`status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '1' COMMENT '是否启用(0:禁用,1:启用)',
`create_user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建用户名称',
`create_user_id` bigint DEFAULT NULL COMMENT '创建用户ID',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '更新用户名称',
`update_user_id` bigint DEFAULT NULL COMMENT '更新用户ID',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`is_deleted` tinyint DEFAULT '0' COMMENT '是否删除(0:否,1:是)',
PRIMARY KEY (`id`),
KEY `idx_dict_code` (`dict_code`),
KEY `idx_dict_id` (`dict_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='数据字典子项表';
```
#### 基础字典数据
```sql
-- 状态字典
INSERT INTO `sys_dict` (`id`, `name`, `code`, `type`, `sort`, `description`, `status`) VALUES
(1, '状态', 'status', '1', 1, '通用状态字典', '1');
INSERT INTO `sys_dict_item` (`id`, `dict_id`, `dict_code`, `value`, `zh_cn`, `en_us`, `type`, `sort`, `description`, `status`) VALUES
(1, 1, 'status', '0', '禁用', 'Disabled', 'error', 1, '禁用状态', '1'),
(2, 1, 'status', '1', '启用', 'Enabled', 'success', 2, '启用状态', '1');
-- 用户状态字典
INSERT INTO `sys_dict` (`id`, `name`, `code`, `type`, `sort`, `description`, `status`) VALUES
(2, '用户状态', 'user_status', '1', 2, '用户状态字典', '1');
INSERT INTO `sys_dict_item` (`id`, `dict_id`, `dict_code`, `value`, `zh_cn`, `en_us`, `type`, `sort`, `description`, `status`) VALUES
(3, 2, 'user_status', '0', '禁用', 'Disabled', 'error', 1, '用户禁用', '1'),
(4, 2, 'user_status', '1', '正常', 'Normal', 'success', 2, '用户正常', '1'),
(5, 2, 'user_status', '2', '锁定', 'Locked', 'warning', 3, '用户锁定', '1');
-- 字典类型字典
INSERT INTO `sys_dict` (`id`, `name`, `code`, `type`, `sort`, `description`, `status`) VALUES
(3, '字典类型', 'dict_type', '1', 3, '字典类型分类', '1');
INSERT INTO `sys_dict_item` (`id`, `dict_id`, `dict_code`, `value`, `zh_cn`, `en_us`, `type`, `sort`, `description`, `status`) VALUES
(6, 3, 'dict_type', '1', '系统字典', 'System Dict', 'primary', 1, '系统内置字典', '1'),
(7, 3, 'dict_type', '2', '业务字典', 'Business Dict', 'info', 2, '业务定制字典', '1');
```
### 项目结构
```
+62
View File
@@ -0,0 +1,62 @@
-- ===============================================
-- 租户/部门权限管理补丁SQL
-- 功能: 为admin新增租户权限控制添加数据字典支持
-- 版本: v1.0.7
-- 日期: 2025-01-16
-- ===============================================
-- 1. 添加用户角色类型字典
INSERT INTO `sys_dict` (`id`, `name`, `code`, `type`, `sort`, `description`, `status`, `create_time`) VALUES
(1001, '用户角色类型', 'user_role_type', '1', 10, '用户角色分类字典', '1', NOW());
INSERT INTO `sys_dict_item` (`id`, `dict_id`, `dict_code`, `value`, `zh_cn`, `en_us`, `type`, `sort`, `description`, `status`, `create_time`) VALUES
(10001, 1001, 'user_role_type', 'admin', '系统管理员', 'Administrator', 'error', 1, '系统最高权限管理员,可创建租户', '1', NOW()),
(10002, 1001, 'user_role_type', 'tenant_admin', '租户管理员', 'Tenant Admin', 'warning', 2, '租户管理员,可管理租户下所有资源', '1', NOW()),
(10003, 1001, 'user_role_type', 'dept_admin', '部门管理员', 'Department Admin', 'info', 3, '部门管理员,可管理部门下的用户和资源', '1', NOW()),
(10004, 1001, 'user_role_type', 'user', '普通用户', 'Normal User', 'success', 4, '普通用户,只能查看和使用基本功能', '1', NOW());
-- 2. 添加组织类型字典
INSERT INTO `sys_dict` (`id`, `name`, `code`, `type`, `sort`, `description`, `status`, `create_time`) VALUES
(1002, '组织类型', 'org_type', '1', 11, '组织架构类型字典', '1', NOW());
INSERT INTO `sys_dict_item` (`id`, `dict_id`, `dict_code`, `value`, `zh_cn`, `en_us`, `type`, `sort`, `description`, `status`, `create_time`) VALUES
(10005, 1002, 'org_type', '1', '租户', 'Tenant', 'primary', 1, '顶级组织,多租户架构的租户', '1', NOW()),
(10006, 1002, 'org_type', '2', '部门', 'Department', 'info', 2, '租户下的部门组织', '1', NOW()),
(10007, 1002, 'org_type', '3', '子部门', 'Sub Department', 'default', 3, '部门下的子部门', '1', NOW());
-- 3. 添加权限等级字典
INSERT INTO `sys_dict` (`id`, `name`, `code`, `type`, `sort`, `description`, `status`, `create_time`) VALUES
(1003, '权限等级', 'permission_level', '1', 12, '系统权限等级分类', '1', NOW());
INSERT INTO `sys_dict_item` (`id`, `dict_id`, `dict_code`, `value`, `zh_cn`, `en_us`, `type`, `sort`, `description`, `status`, `create_time`) VALUES
(10008, 1003, 'permission_level', '1', '系统级', 'System Level', 'error', 1, '系统级权限,可操作所有资源', '1', NOW()),
(10009, 1003, 'permission_level', '2', '租户级', 'Tenant Level', 'warning', 2, '租户级权限,可操作租户内资源', '1', NOW()),
(10010, 1003, 'permission_level', '3', '部门级', 'Department Level', 'info', 3, '部门级权限,可操作部门内资源', '1', NOW()),
(10011, 1003, 'permission_level', '4', '个人级', 'Personal Level', 'success', 4, '个人级权限,只能操作个人资源', '1', NOW());
-- 4. 添加操作类型字典
INSERT INTO `sys_dict` (`id`, `name`, `code`, `type`, `sort`, `description`, `status`, `create_time`) VALUES
(1004, '操作类型', 'operation_type', '1', 13, '系统操作类型字典', '1', NOW());
INSERT INTO `sys_dict_item` (`id`, `dict_id`, `dict_code`, `value`, `zh_cn`, `en_us`, `type`, `sort`, `description`, `status`, `create_time`) VALUES
(10012, 1004, 'operation_type', 'create_tenant', '创建租户', 'Create Tenant', 'error', 1, '创建新租户,仅admin可操作', '1', NOW()),
(10013, 1004, 'operation_type', 'create_dept', '创建部门', 'Create Department', 'warning', 2, '在租户下创建部门', '1', NOW()),
(10014, 1004, 'operation_type', 'manage_user', '管理用户', 'Manage User', 'info', 3, '管理用户账号和权限', '1', NOW()),
(10015, 1004, 'operation_type', 'view_data', '查看数据', 'View Data', 'success', 4, '查看业务数据', '1', NOW());
-- 5. 更新现有组织表,增加组织类型字段(如果不存在)
-- 注意:这个操作需要根据实际表结构调整
-- ALTER TABLE `sys_org_units` ADD COLUMN `org_type` varchar(10) DEFAULT '2' COMMENT '组织类型(1:租户,2:部门,3:子部门)' AFTER `level`;
-- 6. 为现有组织数据设置类型(根据level判断)
-- UPDATE `sys_org_units` SET `org_type` = '1' WHERE `level` = 1 AND `parent_id` = 0;
-- UPDATE `sys_org_units` SET `org_type` = '2' WHERE `level` = 2;
-- UPDATE `sys_org_units` SET `org_type` = '3' WHERE `level` >= 3;
-- ===============================================
-- 执行说明:
-- 1. 在应用此补丁前,请备份现有数据库
-- 2. 根据实际sys_dict表的id生成策略调整id值
-- 3. 如需要修改组织表结构,请取消注释相关ALTER和UPDATE语句
-- 4. 执行后重启应用以刷新字典缓存
-- ===============================================