add
This commit is contained in:
@ -11,7 +11,7 @@
|
||||
Target Server Version : 80032
|
||||
File Encoding : 65001
|
||||
|
||||
Date: 06/06/2023 17:51:05
|
||||
Date: 07/06/2023 17:41:14
|
||||
*/
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
@ -34,7 +34,7 @@ CREATE TABLE `sys_config` (
|
||||
`remark` varchar(500) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '备注',
|
||||
`tenant_id` bigint NULL DEFAULT NULL,
|
||||
PRIMARY KEY (`config_id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 1665985595258265601 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '参数配置表' ROW_FORMAT = DYNAMIC;
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 1666019098658177025 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '参数配置表' ROW_FORMAT = DYNAMIC;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of sys_config
|
||||
@ -212,9 +212,14 @@ INSERT INTO `sys_menu` VALUES (1046, '在线查询', 109, 1, '#', '', '', 0, 0,
|
||||
INSERT INTO `sys_menu` VALUES (1047, '批量强退', 109, 2, '#', '', '', 0, 0, 'F', '1', 'monitor:online:batchLogout', '#', 'admin', '2023-05-27 22:22:59', '', NULL, '', 1);
|
||||
INSERT INTO `sys_menu` VALUES (1048, '单条强退', 109, 3, '#', '', '', 0, 0, 'F', '1', 'monitor:online:forceLogout', '#', 'admin', '2023-05-27 22:22:59', '', NULL, '', 1);
|
||||
INSERT INTO `sys_menu` VALUES (1663431933531869185, '租户管理', 0, 3, 'tenant', 'tenant/index', NULL, 0, 0, 'C', '1', 'tenant:list', 'logininfor', 'admin', '2023-05-30 14:27:33', 'admin', '2023-05-30 14:44:25', '', 1);
|
||||
INSERT INTO `sys_menu` VALUES (1663432090671468545, '新建租户', 1663431933531869185, 2, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:add', '#', 'admin', '2023-05-30 14:28:10', '', NULL, '', 1);
|
||||
INSERT INTO `sys_menu` VALUES (1663432193243172865, '修改租户', 1663431933531869185, 3, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:edit', '#', 'admin', '2023-05-30 14:28:35', '', NULL, '', 1);
|
||||
INSERT INTO `sys_menu` VALUES (1663446141111689218, '查询详情', 1663431933531869185, 4, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:query', '#', 'admin', '2023-05-30 15:24:00', '', NULL, '', 1);
|
||||
INSERT INTO `sys_menu` VALUES (1663432090671468545, '新建租户', 1663431933531869185, 1, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:add', '#', 'admin', '2023-05-30 14:28:10', '', NULL, '', 1);
|
||||
INSERT INTO `sys_menu` VALUES (1663432193243172865, '修改租户', 1663431933531869185, 2, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:edit', '#', 'admin', '2023-05-30 14:28:35', '', NULL, '', 1);
|
||||
INSERT INTO `sys_menu` VALUES (1663446141111689218, '查询详情', 1663431933531869185, 3, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:query', '#', 'admin', '2023-05-30 15:24:00', '', NULL, '', 1);
|
||||
INSERT INTO `sys_menu` VALUES (1666365593968984065, '新增数据源', 1663431933531869185, 5, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:datasource:add', '#', 'admin', '2023-06-07 16:44:52', '', NULL, '', 1);
|
||||
INSERT INTO `sys_menu` VALUES (1666365690861600770, '修改数据源', 1663431933531869185, 6, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:datasource:edit', '#', 'admin', '2023-06-07 16:45:15', '', NULL, '', 1);
|
||||
INSERT INTO `sys_menu` VALUES (1666365815403069442, '删除数据源', 1663431933531869185, 7, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:datasource:remove', '#', 'admin', '2023-06-07 16:45:45', '', NULL, '', 1);
|
||||
INSERT INTO `sys_menu` VALUES (1666365996601196545, '数据源列表', 1663431933531869185, 8, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:datasource:list', '#', 'admin', '2023-06-07 16:46:28', '', NULL, '', 1);
|
||||
INSERT INTO `sys_menu` VALUES (1666366412382552066, '删除租户', 1663431933531869185, 4, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:remove', '#', 'admin', '2023-06-07 16:48:07', '', NULL, '', 1);
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for sys_post
|
||||
@ -266,7 +271,7 @@ CREATE TABLE `sys_role` (
|
||||
-- ----------------------------
|
||||
-- Records of sys_role
|
||||
-- ----------------------------
|
||||
INSERT INTO `sys_role` VALUES (1, '超级管理员', 'admin', 1, '4', '1', 'admin', '2023-04-23 14:35:29', 'admin', '2023-05-31 11:05:52', '超级管理员', 1);
|
||||
INSERT INTO `sys_role` VALUES (1, '超级管理员', 'admin', 1, '1', '1', 'admin', '2023-04-23 14:35:29', 'admin', '2023-06-07 16:48:29', '超级管理员', 1);
|
||||
INSERT INTO `sys_role` VALUES (1660535591067213826, '测试', 'test', 1, '1', '1', 'admin', '2023-05-22 14:38:31', '', NULL, NULL, 1);
|
||||
|
||||
-- ----------------------------
|
||||
@ -349,6 +354,11 @@ INSERT INTO `sys_role_menu` VALUES (1, 1663431933531869185, 1);
|
||||
INSERT INTO `sys_role_menu` VALUES (1, 1663432090671468545, 1);
|
||||
INSERT INTO `sys_role_menu` VALUES (1, 1663432193243172865, 1);
|
||||
INSERT INTO `sys_role_menu` VALUES (1, 1663446141111689218, 1);
|
||||
INSERT INTO `sys_role_menu` VALUES (1, 1666365593968984065, 1);
|
||||
INSERT INTO `sys_role_menu` VALUES (1, 1666365690861600770, 1);
|
||||
INSERT INTO `sys_role_menu` VALUES (1, 1666365815403069442, 1);
|
||||
INSERT INTO `sys_role_menu` VALUES (1, 1666365996601196545, 1);
|
||||
INSERT INTO `sys_role_menu` VALUES (1, 1666366412382552066, 1);
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for sys_tenant
|
||||
@ -366,6 +376,7 @@ CREATE TABLE `sys_tenant` (
|
||||
`expire_time` datetime NULL DEFAULT NULL COMMENT '过期时间',
|
||||
`account_count` bigint NULL DEFAULT NULL COMMENT '用户数量',
|
||||
`status` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '状态',
|
||||
`mode` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '模式',
|
||||
`create_user` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
|
||||
`update_user` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '更新者',
|
||||
@ -377,8 +388,40 @@ CREATE TABLE `sys_tenant` (
|
||||
-- ----------------------------
|
||||
-- Records of sys_tenant
|
||||
-- ----------------------------
|
||||
INSERT INTO `sys_tenant` VALUES (1, '主系统', '111', '111', '11', '11122', '111', NULL, '2099-05-30 23:59:59', 111, '1', 'admin', '2023-05-30 15:18:04', '', NULL, '111');
|
||||
INSERT INTO `sys_tenant` VALUES (2, '副系统', '111', '111', '11', '11122', '111', NULL, '2099-05-29 15:27:02', 111, '1', 'admin', '2023-05-30 15:18:04', '', NULL, '111');
|
||||
INSERT INTO `sys_tenant` VALUES (1, '主系统', '111', '111', '11', '11122', '111', NULL, '2099-05-30 23:59:59', 111, '1', NULL, 'admin', '2023-05-30 15:18:04', '', NULL, '111');
|
||||
INSERT INTO `sys_tenant` VALUES (2, '副系统', '111', '111', '11', '11122', '111', NULL, '2099-05-29 15:27:02', 111, '1', '3', 'admin', '2023-05-30 15:18:04', '', NULL, '111');
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for sys_tenant_datasource
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `sys_tenant_datasource`;
|
||||
CREATE TABLE `sys_tenant_datasource` (
|
||||
`id` bigint NOT NULL,
|
||||
`type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '类型',
|
||||
`ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'IP',
|
||||
`port` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '端口',
|
||||
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '名称',
|
||||
`username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '账号',
|
||||
`password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码',
|
||||
`init_count` int NULL DEFAULT NULL COMMENT '初始连接数',
|
||||
`min_count` int NULL DEFAULT NULL COMMENT '最小空闲数',
|
||||
`max_count` int NULL DEFAULT NULL COMMENT '最大连接数',
|
||||
`weight` int NULL DEFAULT NULL COMMENT '权重',
|
||||
`is_master` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '是否主库',
|
||||
`is_use` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '是否使用',
|
||||
`create_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
|
||||
`update_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
|
||||
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
|
||||
`tenant_id` bigint NOT NULL,
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '租户数据源' ROW_FORMAT = DYNAMIC;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of sys_tenant_datasource
|
||||
-- ----------------------------
|
||||
INSERT INTO `sys_tenant_datasource` VALUES (166160396877907999, 'MySQL', '127.0.0.1', '3306', 'test123', 'root', 'root', 5, 10, 20, NULL, '1', '1', 'admin', '2023-06-07 14:36:11', '', NULL, NULL, 2);
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for sys_user
|
||||
@ -407,7 +450,7 @@ CREATE TABLE `sys_user` (
|
||||
-- ----------------------------
|
||||
-- Records of sys_user
|
||||
-- ----------------------------
|
||||
INSERT INTO `sys_user` VALUES (1650123803828019202, 1659443064624918529, 'admin', '小王', '4567@163.com', '18800001124', '1', '/resource/2023/05/19/blob/37f932d6ae4541d7b9688de6ab0b9f50.blob', '$2a$10$otwytPwmUHPy04dCf8S6I.Za7D.xGQ5MJOdEQk8fWTHCWDJCayur.', '1', 'admin', '2023-05-08 15:16:53', 'admin', '2023-05-23 10:11:24', NULL, 1);
|
||||
INSERT INTO `sys_user` VALUES (1, 1659443064624918529, 'admin', '小王', '4567@163.com', '18800001124', '1', '/resource/2023/05/19/blob/37f932d6ae4541d7b9688de6ab0b9f50.blob', '$2a$10$otwytPwmUHPy04dCf8S6I.Za7D.xGQ5MJOdEQk8fWTHCWDJCayur.', '1', 'admin', '2023-05-08 15:16:53', 'admin', '2023-05-23 10:11:24', NULL, 1);
|
||||
INSERT INTO `sys_user` VALUES (1660830718629277697, 1659443256656932865, 'admin1', 'qq', '', '', '0', '', '$2a$10$mDfrzPMZuxvKeKmqUPA4hOgNC2Zdgb8vOgVL8hP8IIdT6fAWpe0Bm', '1', 'admin', '2023-05-23 10:11:15', '', NULL, NULL, 1);
|
||||
|
||||
-- ----------------------------
|
||||
@ -442,7 +485,7 @@ CREATE TABLE `sys_user_role` (
|
||||
-- ----------------------------
|
||||
-- Records of sys_user_role
|
||||
-- ----------------------------
|
||||
INSERT INTO `sys_user_role` VALUES (1660830718629277697, 1, 1);
|
||||
INSERT INTO `sys_user_role` VALUES (1, 1, 1);
|
||||
INSERT INTO `sys_user_role` VALUES (1660830718629277697, 1660535591067213826, 1);
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
@ -3,7 +3,7 @@ qiaoba:
|
||||
datasource:
|
||||
master:
|
||||
driver: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://localhost:3306/qiaoba-boot?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true
|
||||
url: jdbc:mysql://localhost:3306/${spring.application.name}?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true
|
||||
username: root
|
||||
password: root
|
||||
pool:
|
||||
|
@ -1,6 +1,7 @@
|
||||
package com.qiaoba.common.base.enums;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.qiaoba.common.base.exceptions.ServiceException;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@ -15,11 +16,13 @@ import lombok.Getter;
|
||||
@AllArgsConstructor
|
||||
public enum DataBaseEnum {
|
||||
|
||||
// ip/port/database
|
||||
|
||||
/**
|
||||
* MySQL
|
||||
*/
|
||||
MY_SQL("MySQL",
|
||||
"jdbc:mysql://localhost:3306/{}?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true",
|
||||
"jdbc:mysql://{}:{}/{}?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true",
|
||||
"com.mysql.cj.jdbc.Driver"),
|
||||
|
||||
/**
|
||||
@ -59,4 +62,21 @@ public enum DataBaseEnum {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String getDriver(String type) {
|
||||
for (DataBaseEnum dataBaseEnum : values()) {
|
||||
if (dataBaseEnum.getType().equals(type)) {
|
||||
return dataBaseEnum.driver;
|
||||
}
|
||||
}
|
||||
throw new ServiceException(StrUtil.format("未找到数据库驱动, Type: {}", type));
|
||||
}
|
||||
|
||||
public static String getUrl(String type, String ip, String port, String database) {
|
||||
for (DataBaseEnum dataBaseEnum : values()) {
|
||||
if (dataBaseEnum.getType().equals(type)) {
|
||||
return StrUtil.format(dataBaseEnum.url, ip, port, database);
|
||||
}
|
||||
}
|
||||
throw new ServiceException(StrUtil.format("未找到数据库Url, Type: {}", type));
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.qiaoba.common.database.config;
|
||||
|
||||
import cn.hutool.core.collection.ListUtil;
|
||||
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
|
||||
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
|
||||
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
|
||||
@ -10,6 +11,8 @@ import net.sf.jsqlparser.expression.StringValue;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* MybatisPlusConfig
|
||||
*
|
||||
@ -20,6 +23,11 @@ import org.springframework.context.annotation.Configuration;
|
||||
@Configuration
|
||||
public class MybatisPlusConfig {
|
||||
|
||||
/**
|
||||
* 不需要拼接租户ID的表 租户表/租户数据源表
|
||||
*/
|
||||
private static final List<String> IGNORE_TABLES = ListUtil.toList("sys_tenant", "sys_tenant_datasource");
|
||||
|
||||
@Bean
|
||||
public MybatisPlusInterceptor mybatisPlusInterceptor() {
|
||||
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
|
||||
@ -29,10 +37,10 @@ public class MybatisPlusConfig {
|
||||
return new StringValue(BaseContext.getTenantId());
|
||||
}
|
||||
|
||||
// sys_tenant 不需要拼接租户ID
|
||||
// 不拼接租户ID
|
||||
@Override
|
||||
public boolean ignoreTable(String tableName) {
|
||||
return "sys_tenant".equals(tableName);
|
||||
return IGNORE_TABLES.contains(tableName);
|
||||
}
|
||||
}));
|
||||
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
|
||||
|
@ -23,7 +23,7 @@ public class PoolInfo {
|
||||
private Integer min;
|
||||
|
||||
/**
|
||||
* 最大空闲数
|
||||
* 最大连接数
|
||||
*/
|
||||
private Integer max;
|
||||
}
|
||||
|
@ -1,5 +1,9 @@
|
||||
package com.qiaoba.common.database.utils;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.qiaoba.common.base.exceptions.ServiceException;
|
||||
import com.qiaoba.common.web.advice.ExceptionAdvice;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.DriverManager;
|
||||
import java.sql.SQLException;
|
||||
@ -52,9 +56,9 @@ public class JdbcUtil {
|
||||
Class.forName(driver);
|
||||
//建立连接
|
||||
conn = DriverManager.getConnection(url, username, password);
|
||||
return conn;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw new ServiceException(StrUtil.format("数据源连接失败,错误: {}", e.getMessage()));
|
||||
}
|
||||
return conn;
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.qiaoba.module.tenant.controller;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.qiaoba.common.base.enums.BaseEnum;
|
||||
import com.qiaoba.common.base.result.AjaxResult;
|
||||
import com.qiaoba.common.base.validate.AddGroup;
|
||||
@ -7,7 +8,9 @@ import com.qiaoba.common.base.validate.EditGroup;
|
||||
import com.qiaoba.common.database.entity.PageQuery;
|
||||
import com.qiaoba.common.database.entity.TableDataInfo;
|
||||
import com.qiaoba.module.tenant.entity.SysTenant;
|
||||
import com.qiaoba.module.tenant.entity.dto.TenantSettingDto;
|
||||
import com.qiaoba.module.tenant.entity.param.SysTenantParam;
|
||||
import com.qiaoba.module.tenant.handle.MysqlHandler;
|
||||
import com.qiaoba.module.tenant.service.SysTenantService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@ -32,6 +35,8 @@ import java.util.Date;
|
||||
public class SysTenantController {
|
||||
|
||||
private final SysTenantService sysTenantService;
|
||||
private final MysqlHandler mysqlHandler;
|
||||
|
||||
|
||||
@PreAuthorize("hasAuthority('tenant:add')")
|
||||
@PostMapping
|
||||
@ -70,4 +75,19 @@ public class SysTenantController {
|
||||
param.setIsLogin(true);
|
||||
return sysTenantService.selectPageList(param, pageQuery);
|
||||
}
|
||||
|
||||
@GetMapping("/getSetting/{tenantId}")
|
||||
@Operation(summary = "查看设置信息")
|
||||
@PreAuthorize("hasAuthority('tenant:query')")
|
||||
public AjaxResult getSetting(@PathVariable String tenantId) {
|
||||
return AjaxResult.success(sysTenantService.getSetting(tenantId));
|
||||
}
|
||||
|
||||
@PreAuthorize("hasAuthority('tenant:edit')")
|
||||
@PutMapping("/setting")
|
||||
@Operation(summary = "修改设置信息")
|
||||
public AjaxResult setting(TenantSettingDto dto) {
|
||||
return AjaxResult.success(sysTenantService.update(BeanUtil.copyProperties(dto, SysTenant.class)));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,59 @@
|
||||
package com.qiaoba.module.tenant.controller;
|
||||
|
||||
import com.qiaoba.common.base.result.AjaxResult;
|
||||
import com.qiaoba.common.base.validate.AddGroup;
|
||||
import com.qiaoba.common.base.validate.EditGroup;
|
||||
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
|
||||
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 租户数据源管理 Web层
|
||||
*
|
||||
* @author ailanyin
|
||||
* @version 1.0
|
||||
* @since 2023/5/30 10:52
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/tenant/datasource")
|
||||
@RequiredArgsConstructor
|
||||
@Tag(name = "租户数据源管理")
|
||||
public class SysTenantDatasourceController {
|
||||
|
||||
private final SysTenantDatasourceService sysTenantDatasourceService;
|
||||
|
||||
@PreAuthorize("hasAuthority('tenant:datasource:add')")
|
||||
@PostMapping
|
||||
@Operation(summary = "新增数据源")
|
||||
public AjaxResult add(@Validated(AddGroup.class) @RequestBody SysTenantDatasource sysTenantDatasource) {
|
||||
return AjaxResult.toAjax(sysTenantDatasourceService.insert(sysTenantDatasource));
|
||||
}
|
||||
|
||||
@PreAuthorize("hasAuthority('tenant:datasource:edit')")
|
||||
@PutMapping
|
||||
@Operation(summary = "修改数据源")
|
||||
public AjaxResult edit(@Validated(EditGroup.class) @RequestBody SysTenantDatasource sysTenantDatasource) {
|
||||
return AjaxResult.toAjax(sysTenantDatasourceService.updateById(sysTenantDatasource));
|
||||
}
|
||||
|
||||
@DeleteMapping("/{ids}")
|
||||
@PreAuthorize("hasAuthority('tenant:datasource:remove')")
|
||||
@Operation(summary = "删除数据源")
|
||||
public AjaxResult remove(@PathVariable List<String> ids) {
|
||||
return AjaxResult.toAjax(sysTenantDatasourceService.deleteByIds(ids));
|
||||
}
|
||||
|
||||
@PreAuthorize("hasAuthority('tenant:datasource:list')")
|
||||
@GetMapping("/list")
|
||||
@Operation(summary = "获取列表")
|
||||
public AjaxResult list(@RequestParam String tenantId) {
|
||||
return AjaxResult.success(sysTenantDatasourceService.selectList(tenantId));
|
||||
}
|
||||
}
|
@ -27,6 +27,21 @@ public class SysTenant extends BaseEntity {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 字段模式
|
||||
*/
|
||||
public static final String COLUMN_MODE = "1";
|
||||
|
||||
/**
|
||||
* 数据库模式
|
||||
*/
|
||||
public static final String DATABASE_MODE = "2";
|
||||
|
||||
/**
|
||||
* 数据源模式
|
||||
*/
|
||||
public static final String DATASOURCE_MODE = "3";
|
||||
|
||||
@TableId
|
||||
@NotNull(message = "id不能为空", groups = {EditGroup.class})
|
||||
private String tenantId;
|
||||
@ -68,4 +83,6 @@ public class SysTenant extends BaseEntity {
|
||||
@Schema(description = "状态")
|
||||
private String status;
|
||||
|
||||
private String mode;
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,71 @@
|
||||
package com.qiaoba.module.tenant.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.qiaoba.common.base.entity.BaseEntity;
|
||||
import com.qiaoba.common.base.validate.AddGroup;
|
||||
import com.qiaoba.common.base.validate.EditGroup;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* 租户数据源
|
||||
*
|
||||
* @author ailanyin
|
||||
* @version 1.0
|
||||
* @since 2023/6/7 14:38
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
@TableName("sys_tenant_datasource")
|
||||
public class SysTenantDatasource extends BaseEntity {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@TableId
|
||||
@NotNull(message = "id不能为空", groups = {EditGroup.class})
|
||||
private String id;
|
||||
|
||||
@NotBlank(message = "数据源类型不能为空", groups = {AddGroup.class, EditGroup.class})
|
||||
@Schema(description = "数据源类型")
|
||||
private String type;
|
||||
|
||||
@NotBlank(message = "数据库IP不能为空", groups = {AddGroup.class, EditGroup.class})
|
||||
@Schema(description = "数据库IP")
|
||||
private String ip;
|
||||
|
||||
@NotBlank(message = "数据库端口不能为空", groups = {AddGroup.class, EditGroup.class})
|
||||
@Schema(description = "数据库端口")
|
||||
private String port;
|
||||
|
||||
@NotBlank(message = "数据库名称不能为空", groups = {AddGroup.class, EditGroup.class})
|
||||
@Schema(description = "数据库名称")
|
||||
private String name;
|
||||
|
||||
@NotBlank(message = "数据库账号不能为空", groups = {AddGroup.class, EditGroup.class})
|
||||
@Schema(description = "数据库账号")
|
||||
private String username;
|
||||
|
||||
@NotBlank(message = "数据库密码不能为空", groups = {AddGroup.class, EditGroup.class})
|
||||
@Schema(description = "数据库密码")
|
||||
private String password;
|
||||
|
||||
private Integer initCount;
|
||||
|
||||
private Integer minCount;
|
||||
|
||||
private Integer maxCount;
|
||||
|
||||
private Integer weight;
|
||||
|
||||
private String isMaster = "1";
|
||||
|
||||
private String isUse;
|
||||
|
||||
@NotBlank(message = "租户ID", groups = {AddGroup.class, EditGroup.class})
|
||||
@Schema(description = "租户ID")
|
||||
private String tenantId;
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package com.qiaoba.module.tenant.entity.dto;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 租户设置
|
||||
*
|
||||
* @author ailanyin
|
||||
* @version 1.0
|
||||
* @since 2023/6/7 17:13
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
public class TenantSettingDto implements Serializable {
|
||||
|
||||
private String tenantId;
|
||||
private String mode;
|
||||
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package com.qiaoba.module.tenant.entity.vo;
|
||||
|
||||
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 租户设置
|
||||
*
|
||||
* @author ailanyin
|
||||
* @version 1.0
|
||||
* @since 2023/6/7 17:13
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class TenantSettingVo implements Serializable {
|
||||
|
||||
private String tenantId;
|
||||
private String mode;
|
||||
private List<SysTenantDatasource> datasourceList;
|
||||
|
||||
}
|
@ -5,9 +5,10 @@ import cn.hutool.core.lang.Snowflake;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.db.DbUtil;
|
||||
import cn.hutool.db.sql.SqlExecutor;
|
||||
import com.qiaoba.common.database.utils.JdbcUtil;
|
||||
import com.qiaoba.module.tenant.service.SysTenantService;
|
||||
import com.qiaoba.module.tenant.utils.MenuUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@ -24,16 +25,10 @@ import java.util.List;
|
||||
*/
|
||||
@Component
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
public class MysqlHandler {
|
||||
|
||||
@Value("${qiaoba.datasource.master.driver}")
|
||||
private String driver;
|
||||
@Value("${qiaoba.datasource.master.url}")
|
||||
private String url;
|
||||
@Value("${qiaoba.datasource.master.username}")
|
||||
private String username;
|
||||
@Value("${qiaoba.datasource.master.password}")
|
||||
private String password;
|
||||
private final SysTenantService sysTenantService;
|
||||
|
||||
/**
|
||||
* 角色-超管ID
|
||||
@ -45,15 +40,13 @@ public class MysqlHandler {
|
||||
*/
|
||||
private static final ThreadLocal<Long> USER_SUPER_ADMIN_ID = new ThreadLocal<>();
|
||||
|
||||
/**
|
||||
* 处理字段模式
|
||||
*/
|
||||
public void handleColumnType(String tenantId) {
|
||||
|
||||
public void handle(String tenantId) {
|
||||
log.info("Mysql-Column-Start");
|
||||
|
||||
Connection conn = null;
|
||||
Connection conn = sysTenantService.getConnection(tenantId);
|
||||
try {
|
||||
conn = JdbcUtil.getConnection(driver, url, username, password);
|
||||
|
||||
// 处理 sys_config
|
||||
handleSysConfig(conn, tenantId);
|
||||
// 处理 sys_post
|
||||
@ -64,6 +57,11 @@ public class MysqlHandler {
|
||||
handleSysUser(conn, tenantId);
|
||||
// 处理 sys_user_role
|
||||
bindUserAndRole(conn, tenantId);
|
||||
// 处理 sys_menu
|
||||
MenuUtil.handleMenu(conn, tenantId);
|
||||
// 处理 sys_role_menu
|
||||
bindRoleAndMenu(conn, tenantId);
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
@ -74,21 +72,6 @@ public class MysqlHandler {
|
||||
log.info("Mysql-Column-End");
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理数据库模式
|
||||
*/
|
||||
private void handleDatabaseType() {
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理数据源模式
|
||||
*/
|
||||
private void handleDatasourceType() {
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void handleSysConfig(Connection conn, String tenantId) throws Exception {
|
||||
handleSql(conn, tenantId, "data/sys_config_data");
|
||||
@ -158,4 +141,16 @@ public class MysqlHandler {
|
||||
ROLE_SUPER_ADMIN_ID.get(), tenantId);
|
||||
SqlExecutor.execute(conn, sql);
|
||||
}
|
||||
|
||||
private void bindRoleAndMenu(Connection conn, String tenantId) throws Exception {
|
||||
String sql = "INSERT INTO `sys_role_menu` VALUES ({}, {}, {});";
|
||||
StringBuilder sb = new StringBuilder();
|
||||
List<String> menuIds = MenuUtil.getAllMenuIdsByTenantId(conn, tenantId);
|
||||
for (String menuId : menuIds) {
|
||||
sb.append(StrUtil.format(sql, ROLE_SUPER_ADMIN_ID.get(), menuId, tenantId));
|
||||
}
|
||||
if (StrUtil.isNotBlank(sb.toString())) {
|
||||
SqlExecutor.execute(conn, sb.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,14 @@
|
||||
package com.qiaoba.module.tenant.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
|
||||
|
||||
/**
|
||||
* 租户数据源 数据层
|
||||
*
|
||||
* @author ailanyin
|
||||
* @version 1.0
|
||||
* @since 2023/6/7 14:47
|
||||
*/
|
||||
public interface SysTenantDatasourceMapper extends BaseMapper<SysTenantDatasource> {
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
package com.qiaoba.module.tenant.runner;
|
||||
|
||||
import com.qiaoba.module.tenant.handle.MysqlHandler;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.boot.ApplicationArguments;
|
||||
import org.springframework.boot.ApplicationRunner;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* @author ailanyin
|
||||
* @version 1.0
|
||||
* @since 2023/6/6 15:23
|
||||
*/
|
||||
//@Component
|
||||
@RequiredArgsConstructor
|
||||
public class TestRunner implements ApplicationRunner {
|
||||
|
||||
private final MysqlHandler mysqlHandler;
|
||||
|
||||
@Override
|
||||
public void run(ApplicationArguments args) throws Exception {
|
||||
mysqlHandler.handleColumnType("2");
|
||||
}
|
||||
}
|
@ -0,0 +1,55 @@
|
||||
package com.qiaoba.module.tenant.service;
|
||||
|
||||
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 租户数据源 服务层
|
||||
*
|
||||
* @author ailanyin
|
||||
* @version 1.0
|
||||
* @since 2023/6/7 14:48
|
||||
*/
|
||||
public interface SysTenantDatasourceService {
|
||||
|
||||
/**
|
||||
* 查询租户的主库
|
||||
*
|
||||
* @param tenantId 租户ID
|
||||
* @return 数据源
|
||||
*/
|
||||
SysTenantDatasource selectMaster(String tenantId);
|
||||
|
||||
/**
|
||||
* 新增
|
||||
*
|
||||
* @param sysTenantDatasource sysTenantDatasource
|
||||
* @return 结果
|
||||
*/
|
||||
int insert(SysTenantDatasource sysTenantDatasource);
|
||||
|
||||
/**
|
||||
* 修改
|
||||
*
|
||||
* @param sysTenantDatasource sysTenantDatasource
|
||||
* @return 结果
|
||||
*/
|
||||
int updateById(SysTenantDatasource sysTenantDatasource);
|
||||
|
||||
/**
|
||||
* 批量删除
|
||||
*
|
||||
* @param ids ids
|
||||
* @return 结果
|
||||
*/
|
||||
int deleteByIds(List<String> ids);
|
||||
|
||||
/**
|
||||
* 查询租户的所有数据源
|
||||
*
|
||||
* @param tenantId tenantId
|
||||
* @return list
|
||||
*/
|
||||
List<SysTenantDatasource> selectList(String tenantId);
|
||||
}
|
@ -3,8 +3,11 @@ package com.qiaoba.module.tenant.service;
|
||||
import com.qiaoba.common.database.entity.PageQuery;
|
||||
import com.qiaoba.common.database.entity.TableDataInfo;
|
||||
import com.qiaoba.module.tenant.entity.SysTenant;
|
||||
import com.qiaoba.module.tenant.entity.vo.TenantSettingVo;
|
||||
import com.qiaoba.module.tenant.entity.param.SysTenantParam;
|
||||
|
||||
import java.sql.Connection;
|
||||
|
||||
/**
|
||||
* 租户管理 服务层
|
||||
*
|
||||
@ -46,4 +49,20 @@ public interface SysTenantService {
|
||||
* @return info
|
||||
*/
|
||||
SysTenant selectById(String tenantId);
|
||||
|
||||
/**
|
||||
* 获取租户数据库连接
|
||||
*
|
||||
* @param tenantId tenantId
|
||||
* @return Connection
|
||||
*/
|
||||
Connection getConnection(String tenantId);
|
||||
|
||||
/**
|
||||
* 获取设置信息
|
||||
*
|
||||
* @param tenantId tenantId
|
||||
* @return setting
|
||||
*/
|
||||
TenantSettingVo getSetting(String tenantId);
|
||||
}
|
||||
|
@ -0,0 +1,57 @@
|
||||
package com.qiaoba.module.tenant.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.qiaoba.common.base.enums.BaseEnum;
|
||||
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
|
||||
import com.qiaoba.module.tenant.mapper.SysTenantDatasourceMapper;
|
||||
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 租户数据源 服务层实现
|
||||
*
|
||||
* @author ailanyin
|
||||
* @version 1.0
|
||||
* @since 2023/6/7 14:49
|
||||
*/
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class SysTenantDatasourceServiceImpl implements SysTenantDatasourceService {
|
||||
|
||||
private final SysTenantDatasourceMapper sysTenantDatasourceMapper;
|
||||
|
||||
@Override
|
||||
public SysTenantDatasource selectMaster(String tenantId) {
|
||||
QueryWrapper<SysTenantDatasource> wrapper = new QueryWrapper<>();
|
||||
wrapper.lambda()
|
||||
.eq(SysTenantDatasource::getTenantId, tenantId)
|
||||
.eq(SysTenantDatasource::getIsMaster, BaseEnum.YES.getCode());
|
||||
return sysTenantDatasourceMapper.selectOne(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int insert(SysTenantDatasource sysTenantDatasource) {
|
||||
return sysTenantDatasourceMapper.insert(sysTenantDatasource);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int updateById(SysTenantDatasource sysTenantDatasource) {
|
||||
return sysTenantDatasourceMapper.updateById(sysTenantDatasource);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int deleteByIds(List<String> ids) {
|
||||
return sysTenantDatasourceMapper.deleteBatchIds(ids);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SysTenantDatasource> selectList(String tenantId) {
|
||||
QueryWrapper<SysTenantDatasource> wrapper = new QueryWrapper<>();
|
||||
wrapper.lambda()
|
||||
.eq(SysTenantDatasource::getTenantId, tenantId);
|
||||
return sysTenantDatasourceMapper.selectList(wrapper);
|
||||
}
|
||||
}
|
@ -4,16 +4,25 @@ import cn.hutool.core.util.StrUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.qiaoba.auth.utils.SecurityUtil;
|
||||
import com.qiaoba.common.base.enums.BaseEnum;
|
||||
import com.qiaoba.common.base.enums.DataBaseEnum;
|
||||
import com.qiaoba.common.base.exceptions.ServiceException;
|
||||
import com.qiaoba.common.database.entity.PageQuery;
|
||||
import com.qiaoba.common.database.entity.TableDataInfo;
|
||||
import com.qiaoba.common.database.utils.JdbcUtil;
|
||||
import com.qiaoba.module.tenant.entity.SysTenant;
|
||||
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
|
||||
import com.qiaoba.module.tenant.entity.vo.TenantSettingVo;
|
||||
import com.qiaoba.module.tenant.entity.param.SysTenantParam;
|
||||
import com.qiaoba.module.tenant.mapper.SysTenantMapper;
|
||||
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
|
||||
import com.qiaoba.module.tenant.service.SysTenantService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
@ -27,7 +36,19 @@ import java.util.Objects;
|
||||
@RequiredArgsConstructor
|
||||
public class SysTenantServiceImpl implements SysTenantService {
|
||||
|
||||
@Value("${qiaoba.datasource.master.driver}")
|
||||
private String driver;
|
||||
@Value("${qiaoba.datasource.master.url}")
|
||||
private String url;
|
||||
@Value("${qiaoba.datasource.master.username}")
|
||||
private String username;
|
||||
@Value("${qiaoba.datasource.master.password}")
|
||||
private String password;
|
||||
@Value("${spring.application.name}")
|
||||
private String baseDatabase;
|
||||
|
||||
private final SysTenantMapper sysTenantMapper;
|
||||
private final SysTenantDatasourceService sysTenantDatasourceService;
|
||||
|
||||
@Override
|
||||
public int insert(SysTenant sysTenant) {
|
||||
@ -54,6 +75,36 @@ public class SysTenantServiceImpl implements SysTenantService {
|
||||
return sysTenantMapper.selectById(tenantId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Connection getConnection(String tenantId) {
|
||||
SysTenant sysTenant = selectById(tenantId);
|
||||
if (Objects.isNull(sysTenant)) {
|
||||
throw new ServiceException("租户不存在");
|
||||
}
|
||||
|
||||
if (SysTenant.COLUMN_MODE.equals(sysTenant.getMode())) {
|
||||
return column();
|
||||
}
|
||||
if (SysTenant.DATABASE_MODE.equals(sysTenant.getMode())) {
|
||||
return database(tenantId);
|
||||
}
|
||||
if (SysTenant.DATASOURCE_MODE.equals(sysTenant.getMode())) {
|
||||
return datasource(tenantId);
|
||||
}
|
||||
|
||||
throw new ServiceException("未找到租户设置的数据源模式");
|
||||
}
|
||||
|
||||
@Override
|
||||
public TenantSettingVo getSetting(String tenantId) {
|
||||
SysTenant sysTenant = selectById(tenantId);
|
||||
if (Objects.isNull(sysTenant)) {
|
||||
throw new ServiceException("租户不存在");
|
||||
}
|
||||
List<SysTenantDatasource> datasourceList = sysTenantDatasourceService.selectList(tenantId);
|
||||
return new TenantSettingVo(tenantId, sysTenant.getMode(), datasourceList);
|
||||
}
|
||||
|
||||
private QueryWrapper<SysTenant> param2Wrapper(SysTenantParam param) {
|
||||
QueryWrapper<SysTenant> wrapper = new QueryWrapper<>();
|
||||
wrapper.lambda()
|
||||
@ -77,4 +128,30 @@ public class SysTenantServiceImpl implements SysTenantService {
|
||||
}
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理字段模式
|
||||
*/
|
||||
private Connection column() {
|
||||
return JdbcUtil.getConnection(driver, url, username, password);
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理数据库模式
|
||||
*/
|
||||
private Connection database(String tenantId) {
|
||||
String realUrl = this.url.replaceFirst(baseDatabase, baseDatabase + "-" + tenantId);
|
||||
return JdbcUtil.getConnection(driver, realUrl, username, password);
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理数据源模式
|
||||
*/
|
||||
private Connection datasource(String tenantId) {
|
||||
SysTenantDatasource master = sysTenantDatasourceService.selectMaster(tenantId);
|
||||
if (Objects.isNull(master)) {
|
||||
throw new ServiceException("未找到租户数据源信息");
|
||||
}
|
||||
return JdbcUtil.getConnection(DataBaseEnum.getDriver(master.getType()), DataBaseEnum.getUrl(master.getType(), master.getIp(), master.getPort(), master.getName()), master.getUsername(), master.getPassword());
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,115 @@
|
||||
package com.qiaoba.module.tenant.utils;
|
||||
|
||||
import cn.hutool.core.io.FileUtil;
|
||||
import cn.hutool.core.lang.Snowflake;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.db.sql.SqlExecutor;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
|
||||
import java.nio.charset.Charset;
|
||||
import java.sql.Connection;
|
||||
import java.sql.ResultSet;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 处理菜单工具类
|
||||
*
|
||||
* @author ailanyin
|
||||
* @version 1.0
|
||||
* @since 2023/6/7 11:01
|
||||
*/
|
||||
public class MenuUtil {
|
||||
|
||||
private MenuUtil() {
|
||||
}
|
||||
|
||||
public static void handleMenu(Connection conn, String tenantId) throws Exception {
|
||||
handleSystemMenu(conn, tenantId);
|
||||
handleMonitorMenu(conn, tenantId);
|
||||
}
|
||||
|
||||
private static void handleMonitorMenu(Connection conn, String tenantId) throws Exception {
|
||||
long monitorId = new Snowflake().nextId();
|
||||
String sql = "INSERT INTO `sys_menu` VALUES ({}, '系统监控', 0, 2, 'monitor', NULL, '', 0, 0, 'M', '1', '', 'monitor', 'admin', '2023-05-27 22:25:03', '', NULL, '系统监控目录', {});";
|
||||
sql = StrUtil.format(sql, monitorId, tenantId);
|
||||
SqlExecutor.execute(conn, sql);
|
||||
|
||||
// 登录用户
|
||||
Long onlineUserId = handleMenu(conn, monitorId, tenantId, "data/sys_menu/monitor/online_user/menu");
|
||||
handleButton(conn, tenantId, onlineUserId, "data/sys_menu/monitor/online_user/button");
|
||||
}
|
||||
|
||||
private static void handleSystemMenu(Connection conn, String tenantId) throws Exception {
|
||||
long systemId = new Snowflake().nextId();
|
||||
String sql = "INSERT INTO `sys_menu` VALUES ({}, '系统管理', 0, 1, 'system', NULL, '', 0, 0, 'M', '1', '', 'system', 'admin', '2023-04-23 14:35:29', '', NULL, '系统管理目录', {});";
|
||||
sql = StrUtil.format(sql, systemId, tenantId);
|
||||
SqlExecutor.execute(conn, sql);
|
||||
|
||||
// 用户管理
|
||||
Long userId = handleMenu(conn, systemId, tenantId, "data/sys_menu/system/user/menu");
|
||||
handleButton(conn, tenantId, userId, "data/sys_menu/system/user/button");
|
||||
// 角色管理
|
||||
Long roleId = handleMenu(conn, systemId, tenantId, "data/sys_menu/system/role/menu");
|
||||
handleButton(conn, tenantId, roleId, "data/sys_menu/system/role/button");
|
||||
// 菜单管理
|
||||
Long menuId = handleMenu(conn, systemId, tenantId, "data/sys_menu/system/menu/menu");
|
||||
handleButton(conn, tenantId, menuId, "data/sys_menu/system/menu/button");
|
||||
// 部门管理
|
||||
Long deptId = handleMenu(conn, systemId, tenantId, "data/sys_menu/system/dept/menu");
|
||||
handleButton(conn, tenantId, deptId, "data/sys_menu/system/dept/button");
|
||||
// 岗位管理
|
||||
Long postId = handleMenu(conn, systemId, tenantId, "data/sys_menu/system/post/menu");
|
||||
handleButton(conn, tenantId, postId, "data/sys_menu/system/post/button");
|
||||
// 字典管理
|
||||
Long dictId = handleMenu(conn, systemId, tenantId, "data/sys_menu/system/dict/menu");
|
||||
handleButton(conn, tenantId, dictId, "data/sys_menu/system/dict/button");
|
||||
// 参数管理
|
||||
Long configId = handleMenu(conn, systemId, tenantId, "data/sys_menu/system/config/menu");
|
||||
handleButton(conn, tenantId, configId, "data/sys_menu/system/config/button");
|
||||
}
|
||||
|
||||
private static Long handleMenu(Connection conn, Long systemId, String tenantId, String fileName) throws Exception {
|
||||
long tempId = new Snowflake().nextId();
|
||||
ClassPathResource resource = new ClassPathResource(fileName);
|
||||
List<String> lines = FileUtil.readLines(resource.getFile(), Charset.defaultCharset());
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (String line : lines) {
|
||||
if (StrUtil.isNotBlank(line)) {
|
||||
line = StrUtil.format(line, tempId, systemId, tenantId);
|
||||
sb.append(line);
|
||||
}
|
||||
}
|
||||
if (StrUtil.isNotBlank(sb.toString())) {
|
||||
SqlExecutor.execute(conn, sb.toString());
|
||||
}
|
||||
return tempId;
|
||||
}
|
||||
|
||||
private static void handleButton(Connection conn, String tenantId, Long parentId, String fileName) throws Exception {
|
||||
ClassPathResource resource = new ClassPathResource(fileName);
|
||||
List<String> lines = FileUtil.readLines(resource.getFile(), Charset.defaultCharset());
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (String line : lines) {
|
||||
if (StrUtil.isNotBlank(line)) {
|
||||
line = StrUtil.format(line, new Snowflake().nextId(), parentId, tenantId);
|
||||
sb.append(line);
|
||||
}
|
||||
}
|
||||
if (StrUtil.isNotBlank(sb.toString())) {
|
||||
SqlExecutor.execute(conn, sb.toString());
|
||||
}
|
||||
}
|
||||
|
||||
public static List<String> getAllMenuIdsByTenantId(Connection conn, String tenantId) throws Exception {
|
||||
List<String> menuIds = new ArrayList<>();
|
||||
ResultSet resultSet = conn.createStatement().executeQuery(StrUtil.format("SELECT menu_id FROM `sys_menu` where tenant_id = '{}'", tenantId));
|
||||
while (resultSet.next()) {
|
||||
String menuId = resultSet.getString("menu_id");
|
||||
if (StrUtil.isNotBlank(menuId)) {
|
||||
menuIds.add(menuId);
|
||||
}
|
||||
}
|
||||
return menuIds;
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
null not found
|
@ -0,0 +1,3 @@
|
||||
INSERT INTO `sys_menu` VALUES ({}, '在线查询', {}, 1, '#', '', '', 0, 0, 'F', '1', 'monitor:online:query', '#', 'admin', '2023-05-27 22:22:59', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '批量强退', {}, 2, '#', '', '', 0, 0, 'F', '1', 'monitor:online:batchLogout', '#', 'admin', '2023-05-27 22:22:59', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '单条强退', {}, 3, '#', '', '', 0, 0, 'F', '1', 'monitor:online:forceLogout', '#', 'admin', '2023-05-27 22:22:59', '', NULL, '', {});
|
@ -0,0 +1 @@
|
||||
INSERT INTO `sys_menu` VALUES ({}, '登录用户', {}, 1, 'online', 'monitor/online/index', '', 0, 0, 'C', '1', 'monitor:online:list', 'online', 'admin', '2023-05-27 22:22:18', 'admin', '2023-05-30 09:49:35', '在线用户菜单', {});
|
@ -0,0 +1,4 @@
|
||||
INSERT INTO `sys_menu` VALUES ({}, '参数查询', {}, 1, '#', '', '', 0, 0, 'F', '1', 'system:config:query', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '参数新增', {}, 2, '#', '', '', 0, 0, 'F', '1', 'system:config:add', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '参数修改', {}, 3, '#', '', '', 0, 0, 'F', '1', 'system:config:edit', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '参数删除', {}, 4, '#', '', '', 0, 0, 'F', '1', 'system:config:remove', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', {});
|
@ -0,0 +1 @@
|
||||
INSERT INTO `sys_menu` VALUES ({}, '参数设置', {}, 7, 'config', 'system/config/index', '', 0, 0, 'C', '1', 'system:config:list', 'edit', 'admin', '2022-08-15 18:01:28', 'admin', '2023-05-24 21:13:11', '参数设置菜单', {});
|
@ -0,0 +1,4 @@
|
||||
INSERT INTO `sys_menu` VALUES ({}, '部门查询', {}, 1, '', '', '', 0, 0, 'F', '1', 'system:dept:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '部门新增', {}, 2, '', '', '', 0, 0, 'F', '1', 'system:dept:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '部门修改', {}, 3, '', '', '', 0, 0, 'F', '1', 'system:dept:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '部门删除', {}, 4, '', '', '', 0, 0, 'F', '1', 'system:dept:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
@ -0,0 +1 @@
|
||||
INSERT INTO `sys_menu` VALUES ({}, '部门管理', {}, 4, 'dept', 'system/dept/index', '', 0, 0, 'C', '1', 'system:dept:list', 'tree', 'admin', '2023-04-23 14:35:29', '', NULL, '部门管理菜单', {});
|
@ -0,0 +1,5 @@
|
||||
INSERT INTO `sys_menu` VALUES ({}, '字典查询', {}, 1, '#', '', '', 0, 0, 'F', '1', 'system:dict:query', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '字典新增', {}, 2, '#', '', '', 0, 0, 'F', '1', 'system:dict:add', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '字典修改', {}, 3, '#', '', '', 0, 0, 'F', '1', 'system:dict:edit', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '字典删除', {}, 4, '#', '', '', 0, 0, 'F', '1', 'system:dict:remove', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '字典导出', {}, 5, '#', '', '', 0, 0, 'F', '1', 'system:dict:export', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', {});
|
@ -0,0 +1 @@
|
||||
INSERT INTO `sys_menu` VALUES ({}, '字典管理', {}, 6, 'dict', 'system/dict/index', '', 0, 0, 'C', '1', 'system:dict:list', 'documentation', 'admin', '2022-08-15 18:01:28', 'admin', '2023-05-31 11:15:14', '字典管理菜单', {});
|
@ -0,0 +1,4 @@
|
||||
INSERT INTO `sys_menu` VALUES ({}, '菜单查询', {}, 1, '', '', '', 0, 0, 'F', '1', 'system:menu:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '菜单新增', {}, 2, '', '', '', 0, 0, 'F', '1', 'system:menu:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '菜单修改', {}, 3, '', '', '', 0, 0, 'F', '1', 'system:menu:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '菜单删除', {}, 4, '', '', '', 0, 0, 'F', '1', 'system:menu:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
@ -0,0 +1 @@
|
||||
INSERT INTO `sys_menu` VALUES ({}, '菜单管理', {}, 3, 'menu', 'system/menu/index', '', 0, 0, 'C', '1', 'system:menu:list', 'tree-table', 'admin', '2023-04-23 14:35:29', '', NULL, '菜单管理菜单', {});
|
@ -0,0 +1,5 @@
|
||||
INSERT INTO `sys_menu` VALUES ({}, '岗位查询', {}, 1, '', '', '', 0, 0, 'F', '1', 'system:post:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '岗位新增', {}, 2, '', '', '', 0, 0, 'F', '1', 'system:post:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '岗位修改', {}, 3, '', '', '', 0, 0, 'F', '1', 'system:post:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '岗位删除', {}, 4, '', '', '', 0, 0, 'F', '1', 'system:post:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '岗位导出', {}, 5, '', '', '', 0, 0, 'F', '1', 'system:post:export', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
@ -0,0 +1 @@
|
||||
INSERT INTO `sys_menu` VALUES ({}, '岗位管理', {}, 5, 'post', 'system/post/index', '', 0, 0, 'C', '1', 'system:post:list', 'post', 'admin', '2023-04-23 14:35:29', '', NULL, '岗位管理菜单', {});
|
@ -0,0 +1,5 @@
|
||||
INSERT INTO `sys_menu` VALUES ({}, '角色查询', {}, 1, '', '', '', 0, 0, 'F', '1', 'system:role:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '角色新增', {}, 2, '', '', '', 0, 0, 'F', '1', 'system:role:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '角色修改', {}, 3, '', '', '', 0, 0, 'F', '1', 'system:role:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '角色删除', {}, 4, '', '', '', 0, 0, 'F', '1', 'system:role:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '角色导出', {}, 5, '', '', '', 0, 0, 'F', '1', 'system:role:export', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
@ -0,0 +1 @@
|
||||
INSERT INTO `sys_menu` VALUES ({}, '角色管理', {}, 2, 'role', 'system/role/index', '', 0, 0, 'C', '1', 'system:role:list', 'peoples', 'admin', '2023-04-23 14:35:29', '', NULL, '角色管理菜单', {});
|
@ -0,0 +1,7 @@
|
||||
INSERT INTO `sys_menu` VALUES ({}, '用户查询', {}, 1, '', '', '', 0, 0, 'F', '1', 'system:user:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '用户新增', {}, 2, '', '', '', 0, 0, 'F', '1', 'system:user:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '用户修改', {}, 3, '', '', '', 0, 0, 'F', '1', 'system:user:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '用户删除', {}, 4, '', '', '', 0, 0, 'F', '1', 'system:user:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '用户导出', {}, 5, '', '', '', 0, 0, 'F', '1', 'system:user:export', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '用户导入', {}, 6, '', '', '', 0, 0, 'F', '1', 'system:user:import', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
||||
INSERT INTO `sys_menu` VALUES ({}, '重置密码', {}, 7, '', '', '', 0, 0, 'F', '1', 'system:user:resetPwd', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
|
@ -0,0 +1 @@
|
||||
INSERT INTO `sys_menu` VALUES ({}, '用户管理', {}, 1, 'user', 'system/user/index', '', 0, 0, 'C', '1', 'system:user:list', 'user', 'admin', '2023-04-23 14:35:29', '', NULL, '用户管理菜单', {});
|
@ -1,2 +1,2 @@
|
||||
INSERT INTO `sys_role` VALUES ({}, '超级管理员', 'admin', 1, '4', '1', 'admin', '2023-04-23 14:35:29', 'admin', '2023-05-31 11:05:52', '超级管理员', {});
|
||||
INSERT INTO `sys_role` VALUES ({}, '超级管理员', 'admin', 1, '1', '1', 'admin', '2023-04-23 14:35:29', 'admin', '2023-05-31 11:05:52', '超级管理员', {});
|
||||
INSERT INTO `sys_role` VALUES ({}, '测试', 'test', 1, '1', '1', 'admin', '2023-05-22 14:38:31', '', NULL, NULL, {});
|
||||
|
Reference in New Issue
Block a user