first commit
This commit is contained in:
5
pom.xml
5
pom.xml
@ -218,6 +218,11 @@
|
|||||||
<artifactId>qiaoba-api-monitor</artifactId>
|
<artifactId>qiaoba-api-monitor</artifactId>
|
||||||
<version>${qiaoba.version}</version>
|
<version>${qiaoba.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.qiaoba</groupId>
|
||||||
|
<artifactId>qiaoba-api-tenant</artifactId>
|
||||||
|
<version>${qiaoba.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
<module>qiaoba-api-file</module>
|
<module>qiaoba-api-file</module>
|
||||||
<module>qiaoba-api-auth</module>
|
<module>qiaoba-api-auth</module>
|
||||||
<module>qiaoba-api-monitor</module>
|
<module>qiaoba-api-monitor</module>
|
||||||
|
<module>qiaoba-api-tenant</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
|
|
||||||
|
24
qiaoba-apis/qiaoba-api-tenant/pom.xml
Normal file
24
qiaoba-apis/qiaoba-api-tenant/pom.xml
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<parent>
|
||||||
|
<artifactId>qiaoba-apis</artifactId>
|
||||||
|
<groupId>com.qiaoba</groupId>
|
||||||
|
<version>1.0</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>qiaoba-api-tenant</artifactId>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.qiaoba</groupId>
|
||||||
|
<artifactId>qiaoba-common-datasource</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.qiaoba</groupId>
|
||||||
|
<artifactId>qiaoba-common-doc</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
@ -1,4 +1,4 @@
|
|||||||
package com.qiaoba.module.tenant.entity;
|
package com.qiaoba.api.tenant.entity;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
@ -1,4 +1,4 @@
|
|||||||
package com.qiaoba.module.tenant.entity;
|
package com.qiaoba.api.tenant.entity;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
@ -1,4 +1,4 @@
|
|||||||
package com.qiaoba.module.tenant.entity.param;
|
package com.qiaoba.api.tenant.entity.param;
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
@ -1,4 +1,4 @@
|
|||||||
package com.qiaoba.module.tenant.entity.param;
|
package com.qiaoba.api.tenant.entity.param;
|
||||||
|
|
||||||
import com.qiaoba.common.base.enums.BaseEnum;
|
import com.qiaoba.common.base.enums.BaseEnum;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
@ -1,4 +1,4 @@
|
|||||||
package com.qiaoba.module.tenant.enums;
|
package com.qiaoba.api.tenant.enums;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
@ -34,4 +34,16 @@ public enum TenantModeEnum {
|
|||||||
this.mode = code;
|
this.mode = code;
|
||||||
this.info = info;
|
this.info = info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Boolean isColumn(String mode) {
|
||||||
|
return COLUMN.mode.equals(mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Boolean isSchema(String mode) {
|
||||||
|
return SCHEMA.mode.equals(mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Boolean isDatasource(String mode) {
|
||||||
|
return DATASOURCE.mode.equals(mode);
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package com.qiaoba.module.tenant.enums;
|
package com.qiaoba.api.tenant.enums;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
@ -30,4 +30,12 @@ public enum TenantStatusEnum {
|
|||||||
this.status = code;
|
this.status = code;
|
||||||
this.info = info;
|
this.info = info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Boolean isDisable(String status) {
|
||||||
|
return DISABLE.status.equals(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Boolean isExpire(String status) {
|
||||||
|
return EXPIRE.status.equals(status);
|
||||||
|
}
|
||||||
}
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package com.qiaoba.api.tenant.service;
|
||||||
|
|
||||||
|
import com.qiaoba.api.tenant.entity.SysTenant;
|
||||||
|
import com.qiaoba.api.tenant.entity.param.SysTenantParam;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 租户管理 对外接口暴露
|
||||||
|
*
|
||||||
|
* @author ailanyin
|
||||||
|
* @version 1.0
|
||||||
|
* @since 2023-07-01 08:34:20
|
||||||
|
*/
|
||||||
|
public interface SysTenantApiService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 条件查询租户列表
|
||||||
|
*
|
||||||
|
* @param param 条件
|
||||||
|
* @return list
|
||||||
|
*/
|
||||||
|
List<SysTenant> selectList(SysTenantParam param);
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package com.qiaoba.api.tenant.utils;
|
||||||
|
|
||||||
|
import com.qiaoba.api.tenant.entity.SysTenant;
|
||||||
|
import com.qiaoba.api.tenant.enums.TenantModeEnum;
|
||||||
|
import com.qiaoba.common.base.constants.TenantConstant;
|
||||||
|
import com.qiaoba.common.base.context.BaseContext;
|
||||||
|
import com.qiaoba.common.database.context.TenantDbTypeContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TenantUtil
|
||||||
|
*
|
||||||
|
* @author ailanyin
|
||||||
|
* @version 1.0
|
||||||
|
* @since 2023-07-01 08:34:20
|
||||||
|
*/
|
||||||
|
public class TenantUtil {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置上下文信息
|
||||||
|
*
|
||||||
|
* @param sysTenant 租户
|
||||||
|
*/
|
||||||
|
public static void setContext(SysTenant sysTenant) {
|
||||||
|
BaseContext.setTenantId(sysTenant.getTenantId());
|
||||||
|
BaseContext.setSchema(sysTenant.getMode().equals(TenantModeEnum.SCHEMA.getMode()));
|
||||||
|
// 数据源模式-设置第三方数据源
|
||||||
|
if (TenantModeEnum.isDatasource(sysTenant.getMode())) {
|
||||||
|
//设置当前租户对应的数据源
|
||||||
|
BaseContext.setDataSource(sysTenant.getTenantId());
|
||||||
|
BaseContext.setDatabaseType(TenantDbTypeContext.get(sysTenant.getTenantId()));
|
||||||
|
}
|
||||||
|
// 字段模式 or Schema模式-数据源选择默认数据源
|
||||||
|
else {
|
||||||
|
BaseContext.setDataSource(TenantConstant.DEFAULT_TENANT_ID);
|
||||||
|
BaseContext.setDatabaseType(TenantDbTypeContext.getDefault());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,16 +1,16 @@
|
|||||||
qiaoba:
|
qiaoba:
|
||||||
file-upload-path: C:/${spring.application.name}/uploadPath/
|
file-upload-path: C:/${spring.application.name}/uploadPath/
|
||||||
dataSources:
|
dataSources:
|
||||||
# - driver: com.mysql.cj.jdbc.Driver
|
- driver: com.mysql.cj.jdbc.Driver
|
||||||
# url: jdbc:mysql://192.168.0.202:3306/${spring.application.name}?databaseTerm=SCHEMA&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true
|
url: jdbc:mysql://192.168.0.202:3306/${spring.application.name}?databaseTerm=SCHEMA&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true
|
||||||
# username: root
|
username: root
|
||||||
# password: Root123456789.
|
password: Root123456789.
|
||||||
# #连接池初始化大小
|
#连接池初始化大小
|
||||||
# initial-size: 5
|
initial-size: 5
|
||||||
# #最小空闲线程数
|
#最小空闲线程数
|
||||||
# min-idle: 10
|
min-idle: 10
|
||||||
# #最大连接池数量
|
#最大连接池数量
|
||||||
# max-active: 20
|
max-active: 20
|
||||||
# - driver: com.mysql.cj.jdbc.Driver
|
# - driver: com.mysql.cj.jdbc.Driver
|
||||||
# url: jdbc:mysql://192.168.0.203:3306/${spring.application.name}?databaseTerm=SCHEMA&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true
|
# url: jdbc:mysql://192.168.0.203:3306/${spring.application.name}?databaseTerm=SCHEMA&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true
|
||||||
# username: root
|
# username: root
|
||||||
@ -21,16 +21,16 @@ qiaoba:
|
|||||||
# min-idle: 10
|
# min-idle: 10
|
||||||
# #最大连接池数量
|
# #最大连接池数量
|
||||||
# max-active: 20
|
# max-active: 20
|
||||||
- driver: org.postgresql.Driver
|
# - driver: org.postgresql.Driver
|
||||||
url: jdbc:postgresql://192.168.0.202:5432/mydb?currentSchema=qiaoba-boot&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true
|
# url: jdbc:postgresql://192.168.0.202:5432/mydb?currentSchema=qiaoba-boot&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true
|
||||||
username: postgres
|
# username: postgres
|
||||||
password: postgres
|
# password: postgres
|
||||||
#连接池初始化大小
|
# #连接池初始化大小
|
||||||
initial-size: 5
|
# initial-size: 5
|
||||||
#最小空闲线程数
|
# #最小空闲线程数
|
||||||
min-idle: 10
|
# min-idle: 10
|
||||||
#最大连接池数量
|
# #最大连接池数量
|
||||||
max-active: 20
|
# max-active: 20
|
||||||
|
|
||||||
mybatis-plus:
|
mybatis-plus:
|
||||||
configuration:
|
configuration:
|
||||||
|
@ -30,5 +30,9 @@
|
|||||||
<groupId>com.qiaoba</groupId>
|
<groupId>com.qiaoba</groupId>
|
||||||
<artifactId>qiaoba-api-monitor</artifactId>
|
<artifactId>qiaoba-api-monitor</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.qiaoba</groupId>
|
||||||
|
<artifactId>qiaoba-api-tenant</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
@ -0,0 +1,60 @@
|
|||||||
|
package com.qiaoba.module.system.runner;
|
||||||
|
|
||||||
|
import com.qiaoba.api.tenant.entity.SysTenant;
|
||||||
|
import com.qiaoba.api.tenant.entity.param.SysTenantParam;
|
||||||
|
import com.qiaoba.api.tenant.service.SysTenantApiService;
|
||||||
|
import com.qiaoba.api.tenant.utils.TenantUtil;
|
||||||
|
import com.qiaoba.common.base.constants.TenantConstant;
|
||||||
|
import com.qiaoba.common.base.context.BaseContext;
|
||||||
|
import com.qiaoba.module.system.service.SysConfigService;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.boot.ApplicationArguments;
|
||||||
|
import org.springframework.boot.ApplicationRunner;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 项目启动后同步-[系统配置]
|
||||||
|
*
|
||||||
|
* @author ailanyin
|
||||||
|
* @version 1.0
|
||||||
|
* @since 2023-07-01 08:34:20
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Slf4j
|
||||||
|
public class SyncDataToCacheRunner implements ApplicationRunner {
|
||||||
|
|
||||||
|
private final SysTenantApiService sysTenantApiService;
|
||||||
|
private final SysConfigService sysConfigService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run(ApplicationArguments args) throws Exception {
|
||||||
|
|
||||||
|
// 查询主库中所有正常的租户列表
|
||||||
|
List<SysTenant> sysTenantList;
|
||||||
|
try {
|
||||||
|
BaseContext.setTenantId(TenantConstant.DEFAULT_TENANT_ID);
|
||||||
|
sysTenantList = sysTenantApiService.selectList(SysTenantParam.buildNormalSelectParam());
|
||||||
|
} finally {
|
||||||
|
BaseContext.clearTenantId();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 对租户类型进行分类
|
||||||
|
for (SysTenant sysTenant : sysTenantList) {
|
||||||
|
try {
|
||||||
|
TenantUtil.setContext(sysTenant);
|
||||||
|
sysConfigService.resetConfigCache();
|
||||||
|
log.info("同步[系统配置]完成, 租户ID: {}", sysTenant.getTenantId());
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("同步[系统配置]失败, 租户ID: {}, 错误原因: {}", sysTenant.getTenantId(), e.getMessage());
|
||||||
|
} finally {
|
||||||
|
BaseContext.clearAllHolder();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -22,6 +22,10 @@
|
|||||||
<groupId>com.qiaoba</groupId>
|
<groupId>com.qiaoba</groupId>
|
||||||
<artifactId>qiaoba-auth</artifactId>
|
<artifactId>qiaoba-auth</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.qiaoba</groupId>
|
||||||
|
<artifactId>qiaoba-api-tenant</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -6,9 +6,9 @@ import com.qiaoba.common.base.validate.AddGroup;
|
|||||||
import com.qiaoba.common.base.validate.EditGroup;
|
import com.qiaoba.common.base.validate.EditGroup;
|
||||||
import com.qiaoba.common.database.entity.PageQuery;
|
import com.qiaoba.common.database.entity.PageQuery;
|
||||||
import com.qiaoba.common.database.entity.TableDataInfo;
|
import com.qiaoba.common.database.entity.TableDataInfo;
|
||||||
import com.qiaoba.module.tenant.entity.SysTenant;
|
import com.qiaoba.api.tenant.entity.SysTenant;
|
||||||
import com.qiaoba.module.tenant.entity.dto.TenantSettingDto;
|
import com.qiaoba.module.tenant.entity.dto.TenantSettingDto;
|
||||||
import com.qiaoba.module.tenant.entity.param.SysTenantParam;
|
import com.qiaoba.api.tenant.entity.param.SysTenantParam;
|
||||||
import com.qiaoba.module.tenant.service.SysTenantService;
|
import com.qiaoba.module.tenant.service.SysTenantService;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
@ -3,7 +3,7 @@ package com.qiaoba.module.tenant.controller;
|
|||||||
import com.qiaoba.common.base.result.AjaxResult;
|
import com.qiaoba.common.base.result.AjaxResult;
|
||||||
import com.qiaoba.common.base.validate.AddGroup;
|
import com.qiaoba.common.base.validate.AddGroup;
|
||||||
import com.qiaoba.common.base.validate.EditGroup;
|
import com.qiaoba.common.base.validate.EditGroup;
|
||||||
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
|
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
|
||||||
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
|
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package com.qiaoba.module.tenant.entity.vo;
|
package com.qiaoba.module.tenant.entity.vo;
|
||||||
|
|
||||||
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
|
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package com.qiaoba.module.tenant.entity.vo;
|
package com.qiaoba.module.tenant.entity.vo;
|
||||||
|
|
||||||
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
|
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
@ -2,6 +2,7 @@ package com.qiaoba.module.tenant.filters;
|
|||||||
|
|
||||||
import cn.hutool.core.collection.ListUtil;
|
import cn.hutool.core.collection.ListUtil;
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import com.qiaoba.api.tenant.utils.TenantUtil;
|
||||||
import com.qiaoba.common.base.code.TenantErrorCode;
|
import com.qiaoba.common.base.code.TenantErrorCode;
|
||||||
import com.qiaoba.common.base.constants.BaseConstant;
|
import com.qiaoba.common.base.constants.BaseConstant;
|
||||||
import com.qiaoba.common.base.constants.TenantConstant;
|
import com.qiaoba.common.base.constants.TenantConstant;
|
||||||
@ -10,9 +11,9 @@ import com.qiaoba.common.database.config.DynamicDataSourceConfig;
|
|||||||
import com.qiaoba.common.database.context.TenantDbTypeContext;
|
import com.qiaoba.common.database.context.TenantDbTypeContext;
|
||||||
import com.qiaoba.common.web.utils.ResponseUtil;
|
import com.qiaoba.common.web.utils.ResponseUtil;
|
||||||
import com.qiaoba.common.web.utils.UriUtil;
|
import com.qiaoba.common.web.utils.UriUtil;
|
||||||
import com.qiaoba.module.tenant.entity.SysTenant;
|
import com.qiaoba.api.tenant.entity.SysTenant;
|
||||||
import com.qiaoba.module.tenant.enums.TenantModeEnum;
|
import com.qiaoba.api.tenant.enums.TenantModeEnum;
|
||||||
import com.qiaoba.module.tenant.enums.TenantStatusEnum;
|
import com.qiaoba.api.tenant.enums.TenantStatusEnum;
|
||||||
import com.qiaoba.module.tenant.service.SysTenantService;
|
import com.qiaoba.module.tenant.service.SysTenantService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.core.annotation.Order;
|
import org.springframework.core.annotation.Order;
|
||||||
@ -91,21 +92,7 @@ public class DynamicDataSourceFilter extends OncePerRequestFilter {
|
|||||||
|
|
||||||
private void before(SysTenant sysTenant) {
|
private void before(SysTenant sysTenant) {
|
||||||
log.debug("设置租户信息, 租户ID: {},租户模式: {}", sysTenant.getTenantId(), sysTenant.getMode());
|
log.debug("设置租户信息, 租户ID: {},租户模式: {}", sysTenant.getTenantId(), sysTenant.getMode());
|
||||||
BaseContext.setTenantId(sysTenant.getTenantId());
|
TenantUtil.setContext(sysTenant);
|
||||||
BaseContext.setSchema(sysTenant.getMode().equals(TenantModeEnum.SCHEMA.getMode()));
|
|
||||||
// 数据源模式-设置第三方数据源
|
|
||||||
if (sysTenant.getMode().equals(TenantModeEnum.DATASOURCE.getMode())) {
|
|
||||||
//设置当前租户对应的数据源
|
|
||||||
BaseContext.setDataSource(sysTenant.getTenantId());
|
|
||||||
BaseContext.setDatabaseType(TenantDbTypeContext.get(sysTenant.getTenantId()));
|
|
||||||
}
|
|
||||||
// 字段模式 or Schema模式-数据源选择默认数据源
|
|
||||||
else {
|
|
||||||
BaseContext.setDataSource(TenantConstant.DEFAULT_TENANT_ID);
|
|
||||||
BaseContext.setDatabaseType(TenantDbTypeContext.getDefault());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void after() {
|
private void after() {
|
||||||
@ -127,19 +114,20 @@ public class DynamicDataSourceFilter extends OncePerRequestFilter {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TenantStatusEnum.DISABLE.getStatus().equals(sysTenant.getStatus())) {
|
if (TenantStatusEnum.isDisable(sysTenant.getStatus())) {
|
||||||
// 封禁状态
|
// 封禁状态
|
||||||
log.debug("租户已封禁, 租户ID: {}", sysTenant.getTenantId());
|
log.debug("租户已封禁, 租户ID: {}", sysTenant.getTenantId());
|
||||||
ResponseUtil.errorAuth(response, TenantErrorCode.DISABLE.getCode(), TenantErrorCode.DISABLE.getMsg());
|
ResponseUtil.errorAuth(response, TenantErrorCode.DISABLE.getCode(), TenantErrorCode.DISABLE.getMsg());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TenantStatusEnum.EXPIRE.getStatus().equals(sysTenant.getStatus())) {
|
if (TenantStatusEnum.isExpire(sysTenant.getStatus())) {
|
||||||
// 已过期
|
// 已过期
|
||||||
log.debug("租户已过期, 租户ID: {}", sysTenant.getTenantId());
|
log.debug("租户已过期, 租户ID: {}", sysTenant.getTenantId());
|
||||||
ResponseUtil.errorAuth(response, TenantErrorCode.EXPIRE.getCode(), TenantErrorCode.EXPIRE.getMsg());
|
ResponseUtil.errorAuth(response, TenantErrorCode.EXPIRE.getCode(), TenantErrorCode.EXPIRE.getMsg());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
// 检查是否过期
|
||||||
if (DateUtil.compare(sysTenant.getExpireTime(), new Date()) < 0) {
|
if (DateUtil.compare(sysTenant.getExpireTime(), new Date()) < 0) {
|
||||||
// 已过期
|
// 已过期
|
||||||
log.debug("租户已过期, 租户ID: {}", sysTenant.getTenantId());
|
log.debug("租户已过期, 租户ID: {}", sysTenant.getTenantId());
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package com.qiaoba.module.tenant.mapper;
|
package com.qiaoba.module.tenant.mapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
|
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package com.qiaoba.module.tenant.mapper;
|
package com.qiaoba.module.tenant.mapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.qiaoba.module.tenant.entity.SysTenant;
|
import com.qiaoba.api.tenant.entity.SysTenant;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 租户管理 数据层
|
* 租户管理 数据层
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package com.qiaoba.module.tenant.service;
|
package com.qiaoba.module.tenant.service;
|
||||||
|
|
||||||
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
|
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
|
||||||
import com.qiaoba.module.tenant.entity.param.SysTenantDatasourceParam;
|
import com.qiaoba.api.tenant.entity.param.SysTenantDatasourceParam;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
package com.qiaoba.module.tenant.service;
|
package com.qiaoba.module.tenant.service;
|
||||||
|
|
||||||
|
import com.qiaoba.api.tenant.entity.SysTenant;
|
||||||
import com.qiaoba.common.database.entity.PageQuery;
|
import com.qiaoba.common.database.entity.PageQuery;
|
||||||
import com.qiaoba.common.database.entity.TableDataInfo;
|
import com.qiaoba.common.database.entity.TableDataInfo;
|
||||||
import com.qiaoba.module.tenant.entity.SysTenant;
|
|
||||||
import com.qiaoba.module.tenant.entity.param.SysTenantParam;
|
import com.qiaoba.api.tenant.entity.param.SysTenantParam;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 租户管理 服务层
|
* 租户管理 服务层
|
||||||
|
@ -7,8 +7,8 @@ import com.qiaoba.common.base.enums.DataBaseEnum;
|
|||||||
import com.qiaoba.common.base.exceptions.ServiceException;
|
import com.qiaoba.common.base.exceptions.ServiceException;
|
||||||
import com.qiaoba.common.database.entity.DynamicDataSource;
|
import com.qiaoba.common.database.entity.DynamicDataSource;
|
||||||
import com.qiaoba.common.database.service.DynamicDatasourceService;
|
import com.qiaoba.common.database.service.DynamicDatasourceService;
|
||||||
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
|
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
|
||||||
import com.qiaoba.module.tenant.entity.param.SysTenantDatasourceParam;
|
import com.qiaoba.api.tenant.entity.param.SysTenantDatasourceParam;
|
||||||
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
|
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
@ -6,8 +6,8 @@ import com.qiaoba.common.base.code.DatasourceErrorCode;
|
|||||||
import com.qiaoba.common.base.constants.BaseConstant;
|
import com.qiaoba.common.base.constants.BaseConstant;
|
||||||
import com.qiaoba.common.base.enums.BaseEnum;
|
import com.qiaoba.common.base.enums.BaseEnum;
|
||||||
import com.qiaoba.common.base.exceptions.ServiceException;
|
import com.qiaoba.common.base.exceptions.ServiceException;
|
||||||
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
|
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
|
||||||
import com.qiaoba.module.tenant.entity.param.SysTenantDatasourceParam;
|
import com.qiaoba.api.tenant.entity.param.SysTenantDatasourceParam;
|
||||||
import com.qiaoba.module.tenant.mapper.SysTenantDatasourceMapper;
|
import com.qiaoba.module.tenant.mapper.SysTenantDatasourceMapper;
|
||||||
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
|
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
@ -12,11 +12,11 @@ import com.qiaoba.common.database.context.TenantDbTypeContext;
|
|||||||
import com.qiaoba.common.database.properties.TenantSchema;
|
import com.qiaoba.common.database.properties.TenantSchema;
|
||||||
import com.qiaoba.common.database.utils.DbUtil;
|
import com.qiaoba.common.database.utils.DbUtil;
|
||||||
import com.qiaoba.common.database.utils.JdbcUtil;
|
import com.qiaoba.common.database.utils.JdbcUtil;
|
||||||
import com.qiaoba.module.tenant.entity.SysTenant;
|
import com.qiaoba.api.tenant.entity.SysTenant;
|
||||||
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
|
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
|
||||||
import com.qiaoba.module.tenant.entity.vo.TenantInitCheckVo;
|
import com.qiaoba.module.tenant.entity.vo.TenantInitCheckVo;
|
||||||
import com.qiaoba.module.tenant.entity.vo.TenantInitVo;
|
import com.qiaoba.module.tenant.entity.vo.TenantInitVo;
|
||||||
import com.qiaoba.module.tenant.enums.TenantModeEnum;
|
import com.qiaoba.api.tenant.enums.TenantModeEnum;
|
||||||
import com.qiaoba.module.tenant.init.InitTablesStrategyFactory;
|
import com.qiaoba.module.tenant.init.InitTablesStrategyFactory;
|
||||||
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
|
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
|
||||||
import com.qiaoba.module.tenant.service.SysTenantInitService;
|
import com.qiaoba.module.tenant.service.SysTenantInitService;
|
||||||
@ -50,7 +50,7 @@ public class SysTenantInitServiceImpl implements SysTenantInitService {
|
|||||||
// 1. 查询租户信息, 获取租户名称|租户模式
|
// 1. 查询租户信息, 获取租户名称|租户模式
|
||||||
SysTenant sysTenant = sysTenantService.selectById(tenantId, false);
|
SysTenant sysTenant = sysTenantService.selectById(tenantId, false);
|
||||||
// 2. 租户模式 = 3 数据源模式
|
// 2. 租户模式 = 3 数据源模式
|
||||||
if (TenantModeEnum.DATASOURCE.getMode().equals(sysTenant.getMode())) {
|
if (TenantModeEnum.isDatasource(sysTenant.getMode())) {
|
||||||
// 3. 根据租户ID查询主要数据源(1条)
|
// 3. 根据租户ID查询主要数据源(1条)
|
||||||
SysTenantDatasource datasource = sysTenantDatasourceService.selectPrimary(tenantId);
|
SysTenantDatasource datasource = sysTenantDatasourceService.selectPrimary(tenantId);
|
||||||
// 4. 若没有主要数据源, 返回 未找到数据源信息
|
// 4. 若没有主要数据源, 返回 未找到数据源信息
|
||||||
@ -92,11 +92,11 @@ public class SysTenantInitServiceImpl implements SysTenantInitService {
|
|||||||
public TenantInitVo createTables(String tenantId) {
|
public TenantInitVo createTables(String tenantId) {
|
||||||
SysTenant sysTenant = sysTenantService.selectById(tenantId, false);
|
SysTenant sysTenant = sysTenantService.selectById(tenantId, false);
|
||||||
// 字段模式
|
// 字段模式
|
||||||
if (TenantModeEnum.COLUMN.getMode().equals(sysTenant.getMode())) {
|
if (TenantModeEnum.isColumn(sysTenant.getMode())) {
|
||||||
return new TenantInitVo(HttpStatus.HTTP_OK, "字段模式, 无需新建表");
|
return new TenantInitVo(HttpStatus.HTTP_OK, "字段模式, 无需新建表");
|
||||||
}
|
}
|
||||||
// Schema模式
|
// Schema模式
|
||||||
if (TenantModeEnum.SCHEMA.getMode().equals(sysTenant.getMode())) {
|
if (TenantModeEnum.isSchema(sysTenant.getMode())) {
|
||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
try {
|
try {
|
||||||
// 获取主库Connection 和 Schema
|
// 获取主库Connection 和 Schema
|
||||||
@ -111,7 +111,7 @@ public class SysTenantInitServiceImpl implements SysTenantInitService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 数据源模式
|
// 数据源模式
|
||||||
if (TenantModeEnum.DATASOURCE.getMode().equals(sysTenant.getMode())) {
|
if (TenantModeEnum.isDatasource(sysTenant.getMode())) {
|
||||||
SysTenantDatasource primary = sysTenantDatasourceService.selectPrimary(tenantId, false);
|
SysTenantDatasource primary = sysTenantDatasourceService.selectPrimary(tenantId, false);
|
||||||
Connection connection = JdbcUtil.getConnection(DataBaseEnum.getDriver(primary.getType()),
|
Connection connection = JdbcUtil.getConnection(DataBaseEnum.getDriver(primary.getType()),
|
||||||
DataBaseEnum.getUrl(primary.getType(), primary.getIp(), primary.getPort(), primary.getDbName(), primary.getSchemaName()),
|
DataBaseEnum.getUrl(primary.getType(), primary.getIp(), primary.getPort(), primary.getDbName(), primary.getSchemaName()),
|
||||||
@ -125,14 +125,14 @@ public class SysTenantInitServiceImpl implements SysTenantInitService {
|
|||||||
public TenantInitVo initData(String tenantId) throws SQLException {
|
public TenantInitVo initData(String tenantId) throws SQLException {
|
||||||
SysTenant sysTenant = sysTenantService.selectById(tenantId, false);
|
SysTenant sysTenant = sysTenantService.selectById(tenantId, false);
|
||||||
// 字段模式
|
// 字段模式
|
||||||
if (TenantModeEnum.COLUMN.getMode().equals(sysTenant.getMode())) {
|
if (TenantModeEnum.isColumn(sysTenant.getMode())) {
|
||||||
// 获取默认租户的主数据源
|
// 获取默认租户的主数据源
|
||||||
DataSource dataSource = (DataSource) PrimaryDatasourceContext.getDefault();
|
DataSource dataSource = (DataSource) PrimaryDatasourceContext.getDefault();
|
||||||
// 初始化
|
// 初始化
|
||||||
return init(dataSource.getConnection(), tenantId);
|
return init(dataSource.getConnection(), tenantId);
|
||||||
}
|
}
|
||||||
// SCHEMA
|
// SCHEMA
|
||||||
else if (TenantModeEnum.SCHEMA.getMode().equals(sysTenant.getMode())) {
|
else if (TenantModeEnum.isSchema(sysTenant.getMode())) {
|
||||||
// 获取主库Connection 和 Schema
|
// 获取主库Connection 和 Schema
|
||||||
DruidDataSource dataSource = (DruidDataSource) PrimaryDatasourceContext.getDefault();
|
DruidDataSource dataSource = (DruidDataSource) PrimaryDatasourceContext.getDefault();
|
||||||
// 创建新的连接
|
// 创建新的连接
|
||||||
@ -143,7 +143,7 @@ public class SysTenantInitServiceImpl implements SysTenantInitService {
|
|||||||
return init(connection, tenantId);
|
return init(connection, tenantId);
|
||||||
}
|
}
|
||||||
// Datasource
|
// Datasource
|
||||||
else if (TenantModeEnum.DATASOURCE.getMode().equals(sysTenant.getMode())) {
|
else if (TenantModeEnum.isDatasource(sysTenant.getMode())) {
|
||||||
SysTenantDatasource primary = sysTenantDatasourceService.selectPrimary(tenantId, false);
|
SysTenantDatasource primary = sysTenantDatasourceService.selectPrimary(tenantId, false);
|
||||||
Connection connection = JdbcUtil.getConnection(DataBaseEnum.getDriver(primary.getType()),
|
Connection connection = JdbcUtil.getConnection(DataBaseEnum.getDriver(primary.getType()),
|
||||||
DataBaseEnum.getUrl(primary.getType(), primary.getIp(), primary.getPort(), primary.getDbName(), primary.getSchemaName()),
|
DataBaseEnum.getUrl(primary.getType(), primary.getIp(), primary.getPort(), primary.getDbName(), primary.getSchemaName()),
|
||||||
|
@ -2,6 +2,9 @@ package com.qiaoba.module.tenant.service.impl;
|
|||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.qiaoba.api.tenant.entity.SysTenant;
|
||||||
|
import com.qiaoba.api.tenant.entity.param.SysTenantParam;
|
||||||
|
import com.qiaoba.api.tenant.service.SysTenantApiService;
|
||||||
import com.qiaoba.auth.utils.SecurityUtil;
|
import com.qiaoba.auth.utils.SecurityUtil;
|
||||||
import com.qiaoba.common.base.code.TenantErrorCode;
|
import com.qiaoba.common.base.code.TenantErrorCode;
|
||||||
import com.qiaoba.common.base.constants.BaseConstant;
|
import com.qiaoba.common.base.constants.BaseConstant;
|
||||||
@ -12,8 +15,6 @@ import com.qiaoba.common.base.exceptions.ServiceException;
|
|||||||
import com.qiaoba.common.database.entity.PageQuery;
|
import com.qiaoba.common.database.entity.PageQuery;
|
||||||
import com.qiaoba.common.database.entity.TableDataInfo;
|
import com.qiaoba.common.database.entity.TableDataInfo;
|
||||||
import com.qiaoba.common.redis.service.RedisService;
|
import com.qiaoba.common.redis.service.RedisService;
|
||||||
import com.qiaoba.module.tenant.entity.SysTenant;
|
|
||||||
import com.qiaoba.module.tenant.entity.param.SysTenantParam;
|
|
||||||
import com.qiaoba.module.tenant.mapper.SysTenantMapper;
|
import com.qiaoba.module.tenant.mapper.SysTenantMapper;
|
||||||
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
|
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
|
||||||
import com.qiaoba.module.tenant.service.SysTenantService;
|
import com.qiaoba.module.tenant.service.SysTenantService;
|
||||||
@ -35,7 +36,7 @@ import java.util.Objects;
|
|||||||
@Configuration
|
@Configuration
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class SysTenantServiceImpl implements SysTenantService {
|
public class SysTenantServiceImpl implements SysTenantService, SysTenantApiService {
|
||||||
|
|
||||||
|
|
||||||
private final SysTenantMapper sysTenantMapper;
|
private final SysTenantMapper sysTenantMapper;
|
||||||
@ -125,10 +126,10 @@ public class SysTenantServiceImpl implements SysTenantService {
|
|||||||
wrapper.lambda().lt(Objects.nonNull(param.getTime()), SysTenant::getExpireTime, param.getTime());
|
wrapper.lambda().lt(Objects.nonNull(param.getTime()), SysTenant::getExpireTime, param.getTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
// 登录接口, 只返回ID和名字两个字段
|
// 登录接口, 只返回 ID/Name/Mode
|
||||||
if (param.getIsLogin()) {
|
if (param.getIsLogin()) {
|
||||||
wrapper.lambda()
|
wrapper.lambda()
|
||||||
.select(SysTenant::getCompanyName, SysTenant::getTenantId);
|
.select(SysTenant::getCompanyName, SysTenant::getTenantId, SysTenant::getMode);
|
||||||
}
|
}
|
||||||
return wrapper;
|
return wrapper;
|
||||||
}
|
}
|
||||||
@ -137,4 +138,9 @@ public class SysTenantServiceImpl implements SysTenantService {
|
|||||||
log.debug("加载租户信息进缓存, 租户ID: {}", sysTenant.getTenantId());
|
log.debug("加载租户信息进缓存, 租户ID: {}", sysTenant.getTenantId());
|
||||||
redisService.set(TenantConstant.TENANT_INFO_KEY_PREFIX + sysTenant.getTenantId(), sysTenant);
|
redisService.set(TenantConstant.TENANT_INFO_KEY_PREFIX + sysTenant.getTenantId(), sysTenant);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SysTenant> selectList(SysTenantParam param) {
|
||||||
|
return sysTenantMapper.selectList(param2Wrapper(param));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user