From ccf453b19826a1146f48e6f8a4dbc5777b6346a1 Mon Sep 17 00:00:00 2001 From: ailanyin Date: Thu, 8 Jun 2023 17:56:44 +0800 Subject: [PATCH] add --- .../qiaoba/common/base/DatasourceService.java | 19 ++ .../common/base/constants/TenantConstant.java | 5 + .../config/DynamicDataSourceConfig.java | 10 + .../filters/DynamicDataSourceFilter.java | 48 +++-- .../common/database/properties/PoolInfo.java | 4 + .../common/database/utils/JdbcUtil.java | 1 - .../controller/SysTenantController.java | 29 +-- .../module/tenant/handler/DataHandler.java | 23 +++ .../tenant/handler/DataHandlerFactory.java | 46 +++++ .../MysqlDataHandler.java} | 49 +++-- .../tenant/handler/OracleDataHandler.java | 25 +++ .../tenant/handler/PostgreSqlHandler.java | 25 +++ .../tenant/handler/SqlServerHandler.java | 25 +++ .../tenant/service/SysTenantService.java | 18 +- .../service/impl/SysTenantServiceImpl.java | 80 +++++--- .../qiaoba/module/tenant/utils/MenuUtil.java | 32 +-- .../{ => MySQL}/data/sys_config_data | 0 .../data/sys_menu/monitor/.gitkeep | 0 .../data/sys_menu/monitor/online_user/button | 0 .../data/sys_menu/monitor/online_user/menu | 0 .../data/sys_menu/system/config/button | 0 .../data/sys_menu/system/config/menu | 0 .../data/sys_menu/system/dept/button | 0 .../data/sys_menu/system/dept/menu | 0 .../data/sys_menu/system/dict/button | 0 .../data/sys_menu/system/dict/menu | 0 .../data/sys_menu/system/menu/button | 0 .../data/sys_menu/system/menu/menu | 0 .../data/sys_menu/system/post/button | 0 .../data/sys_menu/system/post/menu | 0 .../data/sys_menu/system/role/button | 0 .../data/sys_menu/system/role/menu | 0 .../data/sys_menu/system/user/button | 0 .../data/sys_menu/system/user/menu | 0 .../resources/{ => MySQL}/data/sys_post_data | 0 .../resources/{ => MySQL}/data/sys_role_data | 0 .../resources/{ => MySQL}/data/sys_user_data | 0 .../main/resources/MySQL/table/base_tables | 186 ++++++++++++++++++ 38 files changed, 524 insertions(+), 101 deletions(-) create mode 100644 qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/DatasourceService.java create mode 100644 qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/DataHandler.java create mode 100644 qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/DataHandlerFactory.java rename qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/{handle/MysqlHandler.java => handler/MysqlDataHandler.java} (77%) create mode 100644 qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/OracleDataHandler.java create mode 100644 qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/PostgreSqlHandler.java create mode 100644 qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/SqlServerHandler.java rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_config_data (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_menu/monitor/.gitkeep (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_menu/monitor/online_user/button (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_menu/monitor/online_user/menu (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_menu/system/config/button (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_menu/system/config/menu (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_menu/system/dept/button (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_menu/system/dept/menu (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_menu/system/dict/button (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_menu/system/dict/menu (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_menu/system/menu/button (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_menu/system/menu/menu (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_menu/system/post/button (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_menu/system/post/menu (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_menu/system/role/button (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_menu/system/role/menu (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_menu/system/user/button (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_menu/system/user/menu (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_post_data (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_role_data (100%) rename qiaoba-modules/qiaoba-module-tenant/src/main/resources/{ => MySQL}/data/sys_user_data (100%) create mode 100644 qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/table/base_tables diff --git a/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/DatasourceService.java b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/DatasourceService.java new file mode 100644 index 0000000..b47d965 --- /dev/null +++ b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/DatasourceService.java @@ -0,0 +1,19 @@ +package com.qiaoba.common.base; + +/** + * 数据源接口 + * + * @author ailanyin + * @version 1.0 + * @since 2023/6/8 17:23 + */ +public interface DatasourceService { + + /** + * 检查租户是否允许访问 + * + * @param tenantId tenantId + * @return true = 允许 + */ + boolean checkTenantInfo(String tenantId); +} diff --git a/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/constants/TenantConstant.java b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/constants/TenantConstant.java index 6f023a8..92da78e 100644 --- a/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/constants/TenantConstant.java +++ b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/constants/TenantConstant.java @@ -18,4 +18,9 @@ public class TenantConstant { * header 租户 key */ public static final String HEADER_KEY_TENANT = "tenant"; + + /** + * 系统默认租户ID + */ + public static final String DEFAULT_TENANT_ID = "1"; } diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/DynamicDataSourceConfig.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/DynamicDataSourceConfig.java index c792a7b..a0ebdda 100644 --- a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/DynamicDataSourceConfig.java +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/DynamicDataSourceConfig.java @@ -58,6 +58,16 @@ public class DynamicDataSourceConfig { dataSource.freshDataSource(DATA_SOURCE_MAP); } + public void addTenantDataSource(String tenantId, String driver, String url, String username, String password, PoolInfo poolInfo) { + addDataSourceToMap(DynamicDatasourceConstant.MASTER_PREFIX + tenantId, buildDataSource(driver, url, username, password, poolInfo)); + dataSource.freshDataSource(DATA_SOURCE_MAP); + } + + public void deleteTenantDataSource(String tenantId) { + DATA_SOURCE_MAP.remove(DynamicDatasourceConstant.MASTER_PREFIX + tenantId); + dataSource.freshDataSource(DATA_SOURCE_MAP); + } + private static Object buildDataSource(String driver, String url, String username, String password, PoolInfo poolInfo) { boolean flag = JdbcUtil.checkConnect(driver, url, username, password); if (!flag) { diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/filters/DynamicDataSourceFilter.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/filters/DynamicDataSourceFilter.java index c928570..0f86831 100644 --- a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/filters/DynamicDataSourceFilter.java +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/filters/DynamicDataSourceFilter.java @@ -1,9 +1,9 @@ package com.qiaoba.common.database.filters; -import com.qiaoba.common.base.constants.BaseConstant; +import cn.hutool.core.util.StrUtil; +import com.qiaoba.common.base.DatasourceService; import com.qiaoba.common.base.constants.TenantConstant; import com.qiaoba.common.base.context.BaseContext; -import com.qiaoba.common.database.config.DynamicDataSourceContext; import com.qiaoba.common.database.constants.DynamicDatasourceConstant; import com.qiaoba.common.web.utils.ResponseUtil; import org.springframework.core.annotation.Order; @@ -13,7 +13,6 @@ import org.springframework.web.filter.OncePerRequestFilter; import javax.annotation.Resource; import javax.servlet.FilterChain; import javax.servlet.ServletException; -import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -30,26 +29,33 @@ import java.io.IOException; public class DynamicDataSourceFilter extends OncePerRequestFilter { @Resource - private DynamicDataSourceContext dynamicDataSourceContext; + private DatasourceService datasourceService; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - before(request); + String tenantId = request.getHeader(TenantConstant.HEADER_KEY_TENANT); + // 主库或没有tenantId + if (StrUtil.isBlank(tenantId) + || TenantConstant.DEFAULT_TENANT_ID.equals(tenantId) + || request.getRequestURI().startsWith("/tenant")) { + setDefaultSetting(); + filterChain.doFilter(request, response); + return; + } + + if (!checkTenantInfo(tenantId)) { + // 检查租户的信息,是否存在,是否过期,是否禁用 + ResponseUtil.response(response, "租户可能到期或被禁用"); + return; + } + before(tenantId); filterChain.doFilter(request, response); after(); } - private boolean checkTenantInfo(String tenantCode, ServletResponse servletResponse) throws IOException { - // 检查租户的信息,是否存在,是否过期,是否禁用 - ResponseUtil.response((HttpServletResponse) servletResponse, "租户: " + tenantCode + "已到期"); - return false; - } - - private void before(HttpServletRequest request) { - String tenantId = request.getHeader(TenantConstant.HEADER_KEY_TENANT); - // todo + private void before(String tenantId) { //设置当前租户对应的数据源 - BaseContext.setDataSource(DynamicDatasourceConstant.DEFAULT_MASTER_DATASOURCE_KEY); + BaseContext.setDataSource(DynamicDatasourceConstant.MASTER_PREFIX + tenantId); //设置当前租户对应的租户ID BaseContext.setTenantId(tenantId); //设置当前租户对应的数据库类型 @@ -59,4 +65,16 @@ public class DynamicDataSourceFilter extends OncePerRequestFilter { private void after() { BaseContext.clearAllHolder(); } + + private boolean checkTenantInfo(String tenantId) { + return datasourceService.checkTenantInfo(tenantId); + } + + private void setDefaultSetting() { + BaseContext.setDataSource(DynamicDatasourceConstant.DEFAULT_MASTER_DATASOURCE_KEY); + //设置当前租户对应的租户ID + BaseContext.setTenantId(TenantConstant.DEFAULT_TENANT_ID); + //设置当前租户对应的数据库类型 + BaseContext.setDatabaseType("MySQL"); + } } diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/properties/PoolInfo.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/properties/PoolInfo.java index ea19b13..260da20 100644 --- a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/properties/PoolInfo.java +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/properties/PoolInfo.java @@ -1,6 +1,8 @@ package com.qiaoba.common.database.properties; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; /** * 数据源连接池信息 @@ -10,6 +12,8 @@ import lombok.Data; * @since 2023-04-23 15:37:43 */ @Data +@NoArgsConstructor +@AllArgsConstructor public class PoolInfo { /** diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/utils/JdbcUtil.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/utils/JdbcUtil.java index aca418e..76e6212 100644 --- a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/utils/JdbcUtil.java +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/utils/JdbcUtil.java @@ -2,7 +2,6 @@ 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; diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/controller/SysTenantController.java b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/controller/SysTenantController.java index b6702ed..57082aa 100644 --- a/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/controller/SysTenantController.java +++ b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/controller/SysTenantController.java @@ -9,7 +9,6 @@ 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; @@ -19,8 +18,6 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; -import java.io.PrintWriter; -import java.nio.charset.Charset; /** * 租户管理 Web层 @@ -36,7 +33,6 @@ import java.nio.charset.Charset; public class SysTenantController { private final SysTenantService sysTenantService; - private final MysqlHandler mysqlHandler; @PreAuthorize("hasAuthority('tenant:add')") @PostMapping @@ -86,24 +82,15 @@ public class SysTenantController { return AjaxResult.success(sysTenantService.update(BeanUtil.copyProperties(dto, SysTenant.class))); } + @PreAuthorize("hasAuthority('tenant:init')") + @PostMapping("/init") + @Operation(summary = "初始化") + public void initData(String tenantId) throws Exception { + sysTenantService.initData(tenantId); + } + @GetMapping("/test") public void test(HttpServletResponse response) throws Exception { - response.setCharacterEncoding("UTF-8"); - response.setContentType("text/html;charset=UTF-8"); - PrintWriter writer = response.getWriter(); - int i = 0; - while (i < 101) { - String text = null; - if (i == 100) { - text = "

恭喜!升级完成

"; - } else { - text = "

升级进度:[" + i + "]

"; - } - writer.write(text); - writer.flush(); - i = i + 10; - Thread.sleep(1000); - } - writer.close(); + sysTenantService.initData("2"); } } diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/DataHandler.java b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/DataHandler.java new file mode 100644 index 0000000..22eb515 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/DataHandler.java @@ -0,0 +1,23 @@ +package com.qiaoba.module.tenant.handler; + +import java.sql.Connection; + +/** + * 数据处理器 + * + * @author ailanyin + * @version 1.0 + * @since 2023/6/8 15:27 + */ +public interface DataHandler { + + /** + * 处理 + * + * @param conn conn + * @param needCreateTables 是否需要建表 + * @param tenantId tenantId + * @return 结果 + */ + boolean handle(Connection conn, String tenantId, Boolean needCreateTables); +} diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/DataHandlerFactory.java b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/DataHandlerFactory.java new file mode 100644 index 0000000..61b3cd3 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/DataHandlerFactory.java @@ -0,0 +1,46 @@ +package com.qiaoba.module.tenant.handler; + +import com.qiaoba.common.base.enums.DataBaseEnum; +import com.qiaoba.common.base.exceptions.ServiceException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 处理器工厂-根据不同类型的数据库-选择不同的处理器 + * + * @author ailanyin + * @version 1.0 + * @since 2023/6/8 15:34 + */ +@Component +@RequiredArgsConstructor +public class DataHandlerFactory { + + private static Map handlerMap = new ConcurrentHashMap<>(); + + private final MysqlDataHandler mysqlDataHandler; + private final OracleDataHandler oracleDataHandler; + private final PostgreSqlHandler postgreSqlHandler; + private final SqlServerHandler sqlServerHandler; + + @PostConstruct + public void register() { + handlerMap.put(DataBaseEnum.MY_SQL.getType(), mysqlDataHandler); + handlerMap.put(DataBaseEnum.ORACLE.getType(), oracleDataHandler); + handlerMap.put(DataBaseEnum.POSTGRE_SQL.getType(), postgreSqlHandler); + handlerMap.put(DataBaseEnum.SQL_SERVER.getType(), sqlServerHandler); + } + + public static DataHandler getHandler(String name) { + DataHandler dataHandler = handlerMap.get(name); + if (Objects.isNull(dataHandler)) { + throw new ServiceException("数据库处理器工厂异常, 类型:[" + name + "]找不到相对应的解析器"); + } + return dataHandler; + } +} diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handle/MysqlHandler.java b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/MysqlDataHandler.java similarity index 77% rename from qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handle/MysqlHandler.java rename to qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/MysqlDataHandler.java index aaa4364..25cd7a2 100644 --- a/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handle/MysqlHandler.java +++ b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/MysqlDataHandler.java @@ -1,19 +1,22 @@ -package com.qiaoba.module.tenant.handle; +package com.qiaoba.module.tenant.handler; import cn.hutool.core.io.FileUtil; 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.module.tenant.service.SysTenantService; import com.qiaoba.module.tenant.utils.MenuUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.jdbc.ScriptRunner; import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Component; +import java.io.File; +import java.io.FileReader; import java.nio.charset.Charset; import java.sql.Connection; +import java.sql.SQLException; import java.util.List; /** @@ -26,9 +29,7 @@ import java.util.List; @Component @Slf4j @RequiredArgsConstructor -public class MysqlHandler { - - private final SysTenantService sysTenantService; +public class MysqlDataHandler implements DataHandler { /** * 角色-超管ID @@ -40,13 +41,14 @@ public class MysqlHandler { */ private static final ThreadLocal USER_SUPER_ADMIN_ID = new ThreadLocal<>(); + @Override + public boolean handle(Connection conn, String tenantId, Boolean needCreateTables) { - public void handle(String tenantId) { - log.info("Mysql-Column-Start"); - - Connection conn = sysTenantService.getConnection(tenantId); try { - + // 手动提交 + conn.setAutoCommit(false); + // 创建表 + initTables(conn); // 处理 sys_config handleSysConfig(conn, tenantId); // 处理 sys_post @@ -61,20 +63,35 @@ public class MysqlHandler { MenuUtil.handleMenu(conn, tenantId); // 处理 sys_role_menu bindRoleAndMenu(conn, tenantId); - + conn.commit(); + return true; } catch (Exception e) { + try { + conn.rollback(); + } catch (SQLException ex) { + ex.printStackTrace(); + } e.printStackTrace(); } finally { DbUtil.close(conn); ROLE_SUPER_ADMIN_ID.remove(); USER_SUPER_ADMIN_ID.remove(); } - log.info("Mysql-Column-End"); + return false; } + private void initTables(Connection conn) throws Exception { + ClassPathResource resource = new ClassPathResource("MySQL/table/base_tables"); + File file = resource.getFile(); + FileReader reader = new FileReader(file); + ScriptRunner scriptRunner = new ScriptRunner(conn); + scriptRunner.setSendFullScript(true); + scriptRunner.runScript(reader); + reader.close(); + } private void handleSysConfig(Connection conn, String tenantId) throws Exception { - handleSql(conn, tenantId, "data/sys_config_data"); + handleSql(conn, tenantId, "MySQL/data/sys_config_data"); } private void handleSql(Connection conn, String tenantId, String fileName) throws Exception { @@ -94,11 +111,11 @@ public class MysqlHandler { } private void handleSysPost(Connection conn, String tenantId) throws Exception { - handleSql(conn, tenantId, "data/sys_post_data"); + handleSql(conn, tenantId, "MySQL/data/sys_post_data"); } private void handleSysRole(Connection conn, String tenantId) throws Exception { - handleUserOrRole(conn, tenantId, "data/sys_role_data", true); + handleUserOrRole(conn, tenantId, "MySQL/data/sys_role_data", true); } private void handleUserOrRole(Connection conn, String tenantId, String fileName, Boolean isRole) throws Exception { @@ -131,7 +148,7 @@ public class MysqlHandler { } private void handleSysUser(Connection conn, String tenantId) throws Exception { - handleUserOrRole(conn, tenantId, "data/sys_user_data", false); + handleUserOrRole(conn, tenantId, "MySQL/data/sys_user_data", false); } private void bindUserAndRole(Connection conn, String tenantId) throws Exception { diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/OracleDataHandler.java b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/OracleDataHandler.java new file mode 100644 index 0000000..97e1d8c --- /dev/null +++ b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/OracleDataHandler.java @@ -0,0 +1,25 @@ +package com.qiaoba.module.tenant.handler; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.sql.Connection; + +/** + * OracleDataHandler + * + * @author ailanyin + * @version 1.0 + * @since 2023/6/5 16:28 + */ +@Component +@Slf4j +@RequiredArgsConstructor +public class OracleDataHandler implements DataHandler { + + @Override + public boolean handle(Connection conn, String tenantId, Boolean needCreateTables) { + return false; + } +} diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/PostgreSqlHandler.java b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/PostgreSqlHandler.java new file mode 100644 index 0000000..065d8cf --- /dev/null +++ b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/PostgreSqlHandler.java @@ -0,0 +1,25 @@ +package com.qiaoba.module.tenant.handler; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.sql.Connection; + +/** + * PostgreSqlHandler + * + * @author ailanyin + * @version 1.0 + * @since 2023/6/5 16:28 + */ +@Component +@Slf4j +@RequiredArgsConstructor +public class PostgreSqlHandler implements DataHandler { + + @Override + public boolean handle(Connection conn, String tenantId, Boolean needCreateTables) { + return false; + } +} diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/SqlServerHandler.java b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/SqlServerHandler.java new file mode 100644 index 0000000..0d1887e --- /dev/null +++ b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/handler/SqlServerHandler.java @@ -0,0 +1,25 @@ +package com.qiaoba.module.tenant.handler; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.sql.Connection; + +/** + * SqlServerHandler + * + * @author ailanyin + * @version 1.0 + * @since 2023/6/5 16:28 + */ +@Component +@Slf4j +@RequiredArgsConstructor +public class SqlServerHandler implements DataHandler { + + @Override + public boolean handle(Connection conn, String tenantId, Boolean needCreateTables) { + return false; + } +} diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/service/SysTenantService.java b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/service/SysTenantService.java index 6e24827..4be9a50 100644 --- a/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/service/SysTenantService.java +++ b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/service/SysTenantService.java @@ -3,8 +3,8 @@ 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 com.qiaoba.module.tenant.entity.vo.TenantSettingVo; import java.sql.Connection; @@ -50,14 +50,6 @@ public interface SysTenantService { */ SysTenant selectById(String tenantId); - /** - * 获取租户数据库连接 - * - * @param tenantId tenantId - * @return Connection - */ - Connection getConnection(String tenantId); - /** * 获取设置信息 * @@ -65,4 +57,12 @@ public interface SysTenantService { * @return setting */ TenantSettingVo getSetting(String tenantId); + + /** + * 初始化数据 + * + * @param tenantId tenantId + * @throws Exception Exception + */ + void initData(String tenantId) throws Exception; } diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/service/impl/SysTenantServiceImpl.java b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/service/impl/SysTenantServiceImpl.java index c7eda4b..ffafa64 100644 --- a/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/service/impl/SysTenantServiceImpl.java +++ b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/service/impl/SysTenantServiceImpl.java @@ -3,16 +3,20 @@ package com.qiaoba.module.tenant.service.impl; 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.DatasourceService; 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.config.DynamicDataSourceConfig; import com.qiaoba.common.database.entity.PageQuery; import com.qiaoba.common.database.entity.TableDataInfo; +import com.qiaoba.common.database.properties.PoolInfo; 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.entity.vo.TenantSettingVo; +import com.qiaoba.module.tenant.handler.DataHandlerFactory; import com.qiaoba.module.tenant.mapper.SysTenantMapper; import com.qiaoba.module.tenant.service.SysTenantDatasourceService; import com.qiaoba.module.tenant.service.SysTenantService; @@ -34,7 +38,7 @@ import java.util.Objects; */ @Service @RequiredArgsConstructor -public class SysTenantServiceImpl implements SysTenantService { +public class SysTenantServiceImpl implements SysTenantService, DatasourceService { @Value("${qiaoba.datasource.master.driver}") private String driver; @@ -49,6 +53,7 @@ public class SysTenantServiceImpl implements SysTenantService { private final SysTenantMapper sysTenantMapper; private final SysTenantDatasourceService sysTenantDatasourceService; + private final DynamicDataSourceConfig dynamicDataSourceConfig; @Override public int insert(SysTenant sysTenant) { @@ -75,26 +80,6 @@ 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); @@ -105,6 +90,31 @@ public class SysTenantServiceImpl implements SysTenantService { return new TenantSettingVo(tenantId, sysTenant.getMode(), datasourceList); } + @Override + public void initData(String tenantId) throws Exception { + + SysTenant sysTenant = selectById(tenantId); + if (Objects.isNull(sysTenant)) { + throw new ServiceException("租户不存在"); + } + // 初始化数据 + Connection connection = getConnection(sysTenant); + boolean result = DataHandlerFactory.getHandler(connection.getMetaData().getDatabaseProductName().trim()).handle(connection, tenantId, !SysTenant.COLUMN_MODE.equals(sysTenant.getMode())); + if (!result) { + throw new ServiceException("同步数据出错, 数据已回滚"); + } + // 将数据源添加到数据源池中 + if (sysTenant.getMode().equals(SysTenant.DATASOURCE_MODE)) { + SysTenantDatasource master = sysTenantDatasourceService.selectMaster(tenantId); + dynamicDataSourceConfig.addTenantDataSource(tenantId, + DataBaseEnum.getDriver(master.getType()), + DataBaseEnum.getUrl(master.getType(), master.getIp(), master.getPort(), master.getName()), + master.getUsername(), + master.getPassword(), + new PoolInfo(master.getInitCount(), master.getMinCount(), master.getMaxCount())); + } + } + private QueryWrapper param2Wrapper(SysTenantParam param) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() @@ -129,6 +139,20 @@ public class SysTenantServiceImpl implements SysTenantService { return wrapper; } + private Connection getConnection(SysTenant sysTenant) { + if (SysTenant.COLUMN_MODE.equals(sysTenant.getMode())) { + return column(); + } + if (SysTenant.DATABASE_MODE.equals(sysTenant.getMode())) { + return database(sysTenant.getTenantId()); + } + if (SysTenant.DATASOURCE_MODE.equals(sysTenant.getMode())) { + return datasource(sysTenant.getTenantId()); + } + + throw new ServiceException("未找到租户设置的数据源模式"); + } + /** * 处理字段模式 */ @@ -150,8 +174,18 @@ public class SysTenantServiceImpl implements SysTenantService { private Connection datasource(String tenantId) { SysTenantDatasource master = sysTenantDatasourceService.selectMaster(tenantId); if (Objects.isNull(master)) { - throw new ServiceException("未找到租户数据源信息"); + throw new ServiceException("未找到租户主数据源信息"); } return JdbcUtil.getConnection(DataBaseEnum.getDriver(master.getType()), DataBaseEnum.getUrl(master.getType(), master.getIp(), master.getPort(), master.getName()), master.getUsername(), master.getPassword()); } + + @Override + public boolean checkTenantInfo(String tenantId) { + SysTenant sysTenant = selectById(tenantId); + if (Objects.isNull(sysTenant)) { + return false; + } + // todo 检查租户有没有过期/禁用 + return sysTenant.getStatus().equals(BaseEnum.NORMAL.getCode()); + } } diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/utils/MenuUtil.java b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/utils/MenuUtil.java index a32465e..60add56 100644 --- a/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/utils/MenuUtil.java +++ b/qiaoba-modules/qiaoba-module-tenant/src/main/java/com/qiaoba/module/tenant/utils/MenuUtil.java @@ -36,8 +36,8 @@ public class MenuUtil { 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"); + Long onlineUserId = handleMenu(conn, monitorId, tenantId, "MySQL/data/sys_menu/monitor/online_user/menu"); + handleButton(conn, tenantId, onlineUserId, "MySQL/data/sys_menu/monitor/online_user/button"); } private static void handleSystemMenu(Connection conn, String tenantId) throws Exception { @@ -47,26 +47,26 @@ public class MenuUtil { 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 userId = handleMenu(conn, systemId, tenantId, "MySQL/data/sys_menu/system/user/menu"); + handleButton(conn, tenantId, userId, "MySQL/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 roleId = handleMenu(conn, systemId, tenantId, "MySQL/data/sys_menu/system/role/menu"); + handleButton(conn, tenantId, roleId, "MySQL/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 menuId = handleMenu(conn, systemId, tenantId, "MySQL/data/sys_menu/system/menu/menu"); + handleButton(conn, tenantId, menuId, "MySQL/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 deptId = handleMenu(conn, systemId, tenantId, "MySQL/data/sys_menu/system/dept/menu"); + handleButton(conn, tenantId, deptId, "MySQL/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 postId = handleMenu(conn, systemId, tenantId, "MySQL/data/sys_menu/system/post/menu"); + handleButton(conn, tenantId, postId, "MySQL/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 dictId = handleMenu(conn, systemId, tenantId, "MySQL/data/sys_menu/system/dict/menu"); + handleButton(conn, tenantId, dictId, "MySQL/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"); + Long configId = handleMenu(conn, systemId, tenantId, "MySQL/data/sys_menu/system/config/menu"); + handleButton(conn, tenantId, configId, "MySQL/data/sys_menu/system/config/button"); } private static Long handleMenu(Connection conn, Long systemId, String tenantId, String fileName) throws Exception { diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_config_data b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_config_data similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_config_data rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_config_data diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/monitor/.gitkeep b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/monitor/.gitkeep similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/monitor/.gitkeep rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/monitor/.gitkeep diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/monitor/online_user/button b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/monitor/online_user/button similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/monitor/online_user/button rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/monitor/online_user/button diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/monitor/online_user/menu b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/monitor/online_user/menu similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/monitor/online_user/menu rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/monitor/online_user/menu diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/config/button b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/config/button similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/config/button rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/config/button diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/config/menu b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/config/menu similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/config/menu rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/config/menu diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/dept/button b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/dept/button similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/dept/button rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/dept/button diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/dept/menu b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/dept/menu similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/dept/menu rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/dept/menu diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/dict/button b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/dict/button similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/dict/button rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/dict/button diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/dict/menu b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/dict/menu similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/dict/menu rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/dict/menu diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/menu/button b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/menu/button similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/menu/button rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/menu/button diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/menu/menu b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/menu/menu similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/menu/menu rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/menu/menu diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/post/button b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/post/button similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/post/button rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/post/button diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/post/menu b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/post/menu similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/post/menu rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/post/menu diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/role/button b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/role/button similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/role/button rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/role/button diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/role/menu b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/role/menu similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/role/menu rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/role/menu diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/user/button b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/user/button similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/user/button rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/user/button diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/user/menu b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/user/menu similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_menu/system/user/menu rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_menu/system/user/menu diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_post_data b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_post_data similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_post_data rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_post_data diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_role_data b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_role_data similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_role_data rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_role_data diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_user_data b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_user_data similarity index 100% rename from qiaoba-modules/qiaoba-module-tenant/src/main/resources/data/sys_user_data rename to qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/data/sys_user_data diff --git a/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/table/base_tables b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/table/base_tables new file mode 100644 index 0000000..7418ea9 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-tenant/src/main/resources/MySQL/table/base_tables @@ -0,0 +1,186 @@ +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +DROP TABLE IF EXISTS `sys_config`; +CREATE TABLE `sys_config` ( + `config_id` bigint NOT NULL COMMENT '参数主键', + `config_name` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '参数名称', + `config_key` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '参数键名', + `config_value` varchar(500) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '参数键值', + `config_type` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'N' COMMENT '系统内置(Y是 N否)', + `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 '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `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 = 1666019098658177025 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '参数配置表' ROW_FORMAT = DYNAMIC; + +DROP TABLE IF EXISTS `sys_dept`; +CREATE TABLE `sys_dept` ( + `dept_id` bigint NOT NULL COMMENT '部门id', + `parent_id` bigint NULL DEFAULT 0 COMMENT '父部门id', + `ancestors` varchar(500) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '0' COMMENT '祖级列表', + `dept_name` varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '部门名称', + `order_num` int NULL DEFAULT 0 COMMENT '显示顺序', + `leader` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '负责人ID', + `phone` varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '手机号', + `email` varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '邮箱', + `status` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '0' COMMENT '部门状态(1正常 0停用)', + `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 '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '备注', + `tenant_id` bigint NULL DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`dept_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '部门表' ROW_FORMAT = DYNAMIC; + +DROP TABLE IF EXISTS `sys_dict_data`; +CREATE TABLE `sys_dict_data` ( + `dict_code` bigint NOT NULL COMMENT '字典编码', + `dict_sort` int NULL DEFAULT 0 COMMENT '字典排序', + `dict_label` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '字典标签', + `dict_value` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '字典键值', + `dict_type` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '字典类型', + `css_class` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '样式属性(其他样式扩展)', + `list_class` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '表格回显样式', + `is_default` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'N' COMMENT '是否默认(Y是 N否)', + `status` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)', + `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 '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '备注', + `tenant_id` bigint NULL DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`dict_code`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1665587655929507842 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '字典数据表' ROW_FORMAT = DYNAMIC; + +DROP TABLE IF EXISTS `sys_dict_type`; +CREATE TABLE `sys_dict_type` ( + `dict_id` bigint NOT NULL COMMENT '字典主键', + `dict_name` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '字典名称', + `dict_type` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '字典类型', + `status` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)', + `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 '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '备注', + `tenant_id` bigint NULL DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`dict_id`) USING BTREE, + UNIQUE INDEX `dict_type`(`dict_type`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1665587609699889155 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '字典类型表' ROW_FORMAT = DYNAMIC; + +DROP TABLE IF EXISTS `sys_menu`; +CREATE TABLE `sys_menu` ( + `menu_id` bigint NOT NULL COMMENT '菜单ID', + `menu_name` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '菜单名称', + `parent_id` bigint NULL DEFAULT 0 COMMENT '父菜单ID', + `order_num` int NULL DEFAULT 0 COMMENT '显示顺序', + `path` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '路由地址', + `component` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '组件路径', + `query` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '路由参数', + `is_frame` int NULL DEFAULT 1 COMMENT '是否为外链(1是 0否)', + `is_cache` int NULL DEFAULT 0 COMMENT '是否缓存(1缓存 0不缓存)', + `menu_type` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)', + `is_visible` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '0' COMMENT '菜单状态(1显示 0隐藏)', + `perms` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '权限标识', + `icon` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '#' 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 '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '备注', + `tenant_id` bigint NULL DEFAULT NULL, + PRIMARY KEY (`menu_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '菜单权限表' ROW_FORMAT = DYNAMIC; + +DROP TABLE IF EXISTS `sys_post`; +CREATE TABLE `sys_post` ( + `post_id` bigint NOT NULL COMMENT '岗位ID', + `post_code` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '岗位编码', + `post_name` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '岗位名称', + `post_sort` int NOT NULL COMMENT '显示顺序', + `status` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '状态(1正常 0停用)', + `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 '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '备注', + `tenant_id` bigint NULL DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`post_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '岗位信息表' ROW_FORMAT = DYNAMIC; + +DROP TABLE IF EXISTS `sys_role`; +CREATE TABLE `sys_role` ( + `role_id` bigint NOT NULL COMMENT '角色ID', + `role_name` varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '角色名称', + `role_key` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '角色权限字符串', + `role_sort` int NOT NULL COMMENT '显示顺序', + `data_scope` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '1' COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', + `status` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '角色状态(1正常 0停用)', + `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 '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '备注', + `tenant_id` bigint NULL DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`role_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '角色信息表' ROW_FORMAT = DYNAMIC; + +DROP TABLE IF EXISTS `sys_role_dept`; +CREATE TABLE `sys_role_dept` ( + `role_id` bigint NOT NULL COMMENT '角色ID', + `dept_id` bigint NOT NULL COMMENT '部门ID', + `tenant_id` bigint NOT NULL COMMENT '租户ID', + PRIMARY KEY (`role_id`, `dept_id`, `tenant_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '角色和部门关联表' ROW_FORMAT = DYNAMIC; + +DROP TABLE IF EXISTS `sys_role_menu`; +CREATE TABLE `sys_role_menu` ( + `role_id` bigint NOT NULL COMMENT '角色ID', + `menu_id` bigint NOT NULL COMMENT '菜单ID', + `tenant_id` bigint NOT NULL COMMENT '租户ID', + PRIMARY KEY (`role_id`, `menu_id`, `tenant_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '角色和菜单关联表' ROW_FORMAT = DYNAMIC; + +DROP TABLE IF EXISTS `sys_user`; +CREATE TABLE `sys_user` ( + `user_id` bigint NOT NULL COMMENT '用户ID', + `dept_id` bigint NULL DEFAULT NULL COMMENT '部门ID', + `username` varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '用户账号', + `nickname` varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '用户昵称', + `email` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '用户邮箱', + `phone` varchar(11) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '手机号码', + `gender` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)', + `avatar` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '头像地址', + `password` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '密码', + `status` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '0' COMMENT '帐号状态(1正常 0停用)', + `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 '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '备注', + `tenant_id` bigint NULL DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`user_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1660830718629277698 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '用户信息表' ROW_FORMAT = DYNAMIC; + +DROP TABLE IF EXISTS `sys_user_post`; +CREATE TABLE `sys_user_post` ( + `user_id` bigint NOT NULL COMMENT '用户ID', + `post_id` bigint NOT NULL COMMENT '岗位ID', + `tenant_id` bigint NOT NULL COMMENT '租户ID', + PRIMARY KEY (`user_id`, `post_id`, `tenant_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '用户与岗位关联表' ROW_FORMAT = DYNAMIC; + +DROP TABLE IF EXISTS `sys_user_role`; +CREATE TABLE `sys_user_role` ( + `user_id` bigint NOT NULL COMMENT '用户ID', + `role_id` bigint NOT NULL COMMENT '角色ID', + `tenant_id` bigint NOT NULL COMMENT '租户ID', + PRIMARY KEY (`user_id`, `role_id`, `tenant_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '用户和角色关联表' ROW_FORMAT = DYNAMIC; + +SET FOREIGN_KEY_CHECKS = 1;