From 11b8427ddbad60bba90f7a6ef055582f4113a5c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=91=E5=B9=B4=E6=A2=A6=E4=B8=8E=E7=A0=96?= <2847127106@qq.com> Date: Sat, 21 Sep 2024 19:29:37 +0800 Subject: [PATCH] =?UTF-8?q?saas=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../muyu/auth/controller/TokenController.java | 2 +- .../java/com/muyu/auth/form/LoginBody.java | 21 +- .../muyu/auth/service/SysLoginService.java | 10 +- cloud-auth/src/main/resources/bootstrap.yml | 4 +- .../core/constant/SecurityConstants.java | 5 + .../core/constant/ServiceNameConstants.java | 7 + .../core/context/SecurityContextHolder.java | 8 + .../core/exception/ServiceException.java | 4 +- .../com/muyu/common/core/utils/JwtUtils.java | 11 + cloud-common/cloud-common-saas/pom.xml | 34 ++ .../many/datasource/ManyDataSource.java | 120 +++++ .../constents/DatasourceContent.java | 19 + .../domain/model/DataSourceInfo.java | 60 +++ .../factory/DruidDataSourceFactory.java | 40 ++ .../holder/DynamicDataSourceHolder.java | 42 ++ .../datasource/role/DynamicDataSource.java | 60 +++ .../common/saas/contents/SaaSConstant.java | 12 + .../common/saas/domain/model/EntInfo.java | 31 ++ .../common/saas/exception/SaaSException.java | 28 ++ .../saas/interceptor/SaaSInterceptor.java | 57 +++ .../saas/interceptor/WebMvcSaaSConfig.java | 31 ++ ...ot.autoconfigure.AutoConfiguration.imports | 3 + .../interceptor/HeaderInterceptor.java | 1 + .../common/security/service/TokenService.java | 3 +- .../common/security/utils/SecurityUtils.java | 4 + .../muyu/common/system/domain/LoginUser.java | 2 + .../muyu/common/system/domain/SysDept.java | 2 + .../com/muyu/common/system/domain/SysEnt.java | 37 ++ .../common/system/domain/SysFirmUser.java | 25 + .../muyu/common/system/domain/SysUser.java | 5 + .../system/remote/RemoteEntService.java | 23 + .../system/remote/RemoteUserService.java | 15 +- .../factory/RemoteEntFallbackFactory.java | 34 ++ .../factory/RemoteUserFallbackFactory.java | 19 +- ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../com/muyu/common/xxl/XXLJobConfig.java | 4 +- cloud-common/pom.xml | 1 + cloud-firm/pom.xml | 105 ++++ .../com/muyu/cloud/firm/FirmApplication.java | 25 + .../firm/controller/SysFirmController.java | 107 +++++ .../com/muyu/cloud/firm/domain/SysFirm.java | 72 +++ .../muyu/cloud/firm/mapper/SysFirmMapper.java | 19 + .../cloud/firm/service/ISysFirmService.java | 39 ++ .../firm/service/impl/SysFirmServiceImpl.java | 70 +++ cloud-firm/src/main/resources/banner.txt | 2 + cloud-firm/src/main/resources/bootstrap.yml | 58 +++ cloud-firm/src/main/resources/logback/dev.xml | 74 +++ .../src/main/resources/logback/prod.xml | 81 ++++ .../src/main/resources/logback/test.xml | 81 ++++ .../resources/mapper/firm/SysFirmMapper.xml | 94 ++++ cloud-gateway/pom.xml | 1 - .../com/muyu/gateway/filter/AuthFilter.java | 2 + .../muyu/gateway/utils/WebFrameworkUtils.java | 8 - .../src/main/resources/bootstrap.yml | 4 +- .../src/main/resources/bootstrap.yml | 6 +- .../com/muyu/gen/CloudGenApplication.java | 1 + .../muyu/gen/controller/GenController.java | 107 +++-- .../java/com/muyu/gen/domain/GenTable.java | 2 + .../com/muyu/gen/domain/GenTableResp.java | 43 ++ .../muyu/gen/mapper/GenTableColumnMapper.java | 27 +- .../com/muyu/gen/mapper/GenTableMapper.java | 39 +- .../service/GenTableColumnServiceImpl.java | 58 ++- .../muyu/gen/service/GenTableServiceImpl.java | 250 ++++++---- .../gen/service/IGenTableColumnService.java | 19 +- .../muyu/gen/service/IGenTableService.java | 50 +- .../src/main/resources/bootstrap.yml | 17 +- .../mapper/generator/GenTableColumnMapper.xml | 183 +++---- .../mapper/generator/GenTableMapper.xml | 453 +++++++----------- .../main/resources/vm/java/controller.java.vm | 43 +- .../src/main/resources/vm/java/domain.java.vm | 40 +- .../src/main/resources/vm/java/mapper.java.vm | 81 +--- .../main/resources/vm/java/service.java.vm | 40 +- .../resources/vm/java/serviceImpl.java.vm | 184 +++---- .../main/resources/vm/java/sub-domain.java.vm | 3 +- .../src/main/resources/vm/vue/index.vue.vm | 8 +- cloud-modules/cloud-modules-system/pom.xml | 4 - .../muyu/system/CloudSystemApplication.java | 2 + .../system/controller/SysDeptController.java | 1 + .../system/controller/SysEntController.java | 39 ++ .../controller/SysProfileController.java | 12 +- .../system/controller/SysUserController.java | 14 +- .../com/muyu/system/mapper/SysEntMapper.java | 21 + .../com/muyu/system/mapper/SysUserMapper.java | 5 +- .../com/muyu/system/rabbit/RabbitTest.java | 106 ++-- .../muyu/system/service/SysEntService.java | 18 + .../muyu/system/service/SysUserService.java | 5 +- .../service/impl/SysEntServiceImpl.java | 35 ++ .../service/impl/SysUserServiceImpl.java | 32 +- .../src/main/resources/bootstrap.yml | 7 +- .../resources/mapper/system/SysDeptMapper.xml | 8 + .../resources/mapper/system/SysEntMapper.xml | 7 + .../resources/mapper/system/SysUserMapper.xml | 19 +- .../src/main/resources/bootstrap.yml | 4 +- pom.xml | 13 + xxl-job/job-admin/depXXLAdmin.sh | 1 + 95 files changed, 2637 insertions(+), 997 deletions(-) create mode 100644 cloud-common/cloud-common-saas/pom.xml create mode 100644 cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/ManyDataSource.java create mode 100644 cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/constents/DatasourceContent.java create mode 100644 cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/domain/model/DataSourceInfo.java create mode 100644 cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/factory/DruidDataSourceFactory.java create mode 100644 cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/holder/DynamicDataSourceHolder.java create mode 100644 cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/role/DynamicDataSource.java create mode 100644 cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/contents/SaaSConstant.java create mode 100644 cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/domain/model/EntInfo.java create mode 100644 cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/exception/SaaSException.java create mode 100644 cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/interceptor/SaaSInterceptor.java create mode 100644 cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/interceptor/WebMvcSaaSConfig.java create mode 100644 cloud-common/cloud-common-saas/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/SysEnt.java create mode 100644 cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/SysFirmUser.java create mode 100644 cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/remote/RemoteEntService.java create mode 100644 cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/remote/factory/RemoteEntFallbackFactory.java create mode 100644 cloud-firm/pom.xml create mode 100644 cloud-firm/src/main/java/com/muyu/cloud/firm/FirmApplication.java create mode 100644 cloud-firm/src/main/java/com/muyu/cloud/firm/controller/SysFirmController.java create mode 100644 cloud-firm/src/main/java/com/muyu/cloud/firm/domain/SysFirm.java create mode 100644 cloud-firm/src/main/java/com/muyu/cloud/firm/mapper/SysFirmMapper.java create mode 100644 cloud-firm/src/main/java/com/muyu/cloud/firm/service/ISysFirmService.java create mode 100644 cloud-firm/src/main/java/com/muyu/cloud/firm/service/impl/SysFirmServiceImpl.java create mode 100644 cloud-firm/src/main/resources/banner.txt create mode 100644 cloud-firm/src/main/resources/bootstrap.yml create mode 100644 cloud-firm/src/main/resources/logback/dev.xml create mode 100644 cloud-firm/src/main/resources/logback/prod.xml create mode 100644 cloud-firm/src/main/resources/logback/test.xml create mode 100644 cloud-firm/src/main/resources/mapper/firm/SysFirmMapper.xml create mode 100644 cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/domain/GenTableResp.java create mode 100644 cloud-modules/cloud-modules-system/src/main/java/com/muyu/system/controller/SysEntController.java create mode 100644 cloud-modules/cloud-modules-system/src/main/java/com/muyu/system/mapper/SysEntMapper.java create mode 100644 cloud-modules/cloud-modules-system/src/main/java/com/muyu/system/service/SysEntService.java create mode 100644 cloud-modules/cloud-modules-system/src/main/java/com/muyu/system/service/impl/SysEntServiceImpl.java create mode 100644 cloud-modules/cloud-modules-system/src/main/resources/mapper/system/SysEntMapper.xml diff --git a/cloud-auth/src/main/java/com/muyu/auth/controller/TokenController.java b/cloud-auth/src/main/java/com/muyu/auth/controller/TokenController.java index d870762..b4a964d 100644 --- a/cloud-auth/src/main/java/com/muyu/auth/controller/TokenController.java +++ b/cloud-auth/src/main/java/com/muyu/auth/controller/TokenController.java @@ -34,7 +34,7 @@ public class TokenController { @PostMapping("login") public Result login (@RequestBody LoginBody form) { // 用户登录 - LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword()); + LoginUser userInfo = sysLoginService.login(form); // 获取登录token return Result.success(tokenService.createToken(userInfo)); } diff --git a/cloud-auth/src/main/java/com/muyu/auth/form/LoginBody.java b/cloud-auth/src/main/java/com/muyu/auth/form/LoginBody.java index 999ad44..be8e264 100644 --- a/cloud-auth/src/main/java/com/muyu/auth/form/LoginBody.java +++ b/cloud-auth/src/main/java/com/muyu/auth/form/LoginBody.java @@ -1,11 +1,16 @@ package com.muyu.auth.form; +import lombok.Data; + /** * 用户登录对象 * * @author muyu */ +@Data public class LoginBody { + + private String firmCode; /** * 用户名 */ @@ -15,20 +20,4 @@ public class LoginBody { * 用户密码 */ private String password; - - public String getUsername () { - return username; - } - - public void setUsername (String username) { - this.username = username; - } - - public String getPassword () { - return password; - } - - public void setPassword (String password) { - this.password = password; - } } diff --git a/cloud-auth/src/main/java/com/muyu/auth/service/SysLoginService.java b/cloud-auth/src/main/java/com/muyu/auth/service/SysLoginService.java index ff0af1a..328646b 100644 --- a/cloud-auth/src/main/java/com/muyu/auth/service/SysLoginService.java +++ b/cloud-auth/src/main/java/com/muyu/auth/service/SysLoginService.java @@ -1,5 +1,6 @@ package com.muyu.auth.service; +import com.muyu.auth.form.LoginBody; import com.muyu.common.core.constant.CacheConstants; import com.muyu.common.core.constant.Constants; import com.muyu.common.core.constant.SecurityConstants; @@ -40,9 +41,12 @@ public class SysLoginService { /** * 登录 */ - public LoginUser login (String username, String password) { + public LoginUser login (LoginBody form) { + String firmCode = form.getFirmCode(); + String username = form.getUsername(); + String password = form.getPassword(); // 用户名或密码为空 错误 - if (StringUtils.isAnyBlank(username, password)) { + if (StringUtils.isAnyBlank(firmCode, username, password)) { recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户/密码必须填写"); throw new ServiceException("用户/密码必须填写"); } @@ -65,7 +69,7 @@ public class SysLoginService { throw new ServiceException("很遗憾,访问IP已被列入系统黑名单"); } // 查询用户信息 - Result userResult = remoteUserService.getUserInfo(username, SecurityConstants.INNER); + Result userResult = remoteUserService.getUserInfo(firmCode, username, SecurityConstants.INNER); if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData())) { recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "登录用户不存在"); diff --git a/cloud-auth/src/main/resources/bootstrap.yml b/cloud-auth/src/main/resources/bootstrap.yml index 336f7e1..c025eb4 100644 --- a/cloud-auth/src/main/resources/bootstrap.yml +++ b/cloud-auth/src/main/resources/bootstrap.yml @@ -4,10 +4,10 @@ server: # nacos线上地址 nacos: - addr: 106.54.193.225:8848 + addr: 47.116.173.119:8848 user-name: nacos password: nacos - namespace: one + namespace: one-saas # Spring spring: application: diff --git a/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/constant/SecurityConstants.java b/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/constant/SecurityConstants.java index c862929..0e9b22d 100644 --- a/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/constant/SecurityConstants.java +++ b/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/constant/SecurityConstants.java @@ -45,4 +45,9 @@ public class SecurityConstants { * 角色权限 */ public static final String ROLE_PERMISSION = "role_permission"; + + /** + * SAAS请求头的key + */ + public static final String SAAS_KEY = "ent-code"; } diff --git a/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/constant/ServiceNameConstants.java b/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/constant/ServiceNameConstants.java index bb59b70..6095cbf 100644 --- a/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/constant/ServiceNameConstants.java +++ b/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/constant/ServiceNameConstants.java @@ -20,4 +20,11 @@ public class ServiceNameConstants { * 文件服务的serviceid */ public static final String FILE_SERVICE = "cloud-file"; + + /** + * 智能车联服务 + */ + public static final String SMART_SERVICE = "cloud-smart-car"; + + public static final String ENT_SERVICE = "cloud-ent"; } diff --git a/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/context/SecurityContextHolder.java b/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/context/SecurityContextHolder.java index 80ea42b..f8866f7 100644 --- a/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/context/SecurityContextHolder.java +++ b/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/context/SecurityContextHolder.java @@ -80,4 +80,12 @@ public class SecurityContextHolder { public static void remove () { THREAD_LOCAL.remove(); } + + public static String getSaasKey() { + return get(SecurityConstants.SAAS_KEY); + } + public static void setSaasKey(String saasKey) { + set(SecurityConstants.SAAS_KEY,saasKey); + } + } diff --git a/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/exception/ServiceException.java b/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/exception/ServiceException.java index 5039bc0..9c86969 100644 --- a/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/exception/ServiceException.java +++ b/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/exception/ServiceException.java @@ -5,7 +5,7 @@ package com.muyu.common.core.exception; * * @author muyu */ -public final class ServiceException extends RuntimeException { +public class ServiceException extends RuntimeException { private static final long serialVersionUID = 1L; /** @@ -21,7 +21,7 @@ public final class ServiceException extends RuntimeException { /** * 错误明细,内部调试错误 *

- * 和 {@link CommonResult#getDetailMessage()} 一致的设计 + * 和 {CommonResult#getDetailMessage()} 一致的设计 */ private String detailMessage; diff --git a/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/utils/JwtUtils.java b/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/utils/JwtUtils.java index 62816cb..c94e051 100644 --- a/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/utils/JwtUtils.java +++ b/cloud-common/cloud-common-core/src/main/java/com/muyu/common/core/utils/JwtUtils.java @@ -162,4 +162,15 @@ public class JwtUtils { public static String getValue (Claims claims, String key) { return Convert.toStr(claims.get(key), ""); } + + /** + * 根据身份信息获取SAASKey + * + * @param claims 身份信息 + * + * @return saas_key + */ + public static String getSaasKey(Claims claims) { + return getValue(claims, SecurityConstants.SAAS_KEY); + } } diff --git a/cloud-common/cloud-common-saas/pom.xml b/cloud-common/cloud-common-saas/pom.xml new file mode 100644 index 0000000..60b4041 --- /dev/null +++ b/cloud-common/cloud-common-saas/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + com.muyu + cloud-common + 3.6.3 + + + cloud-common-saas + + + 17 + 17 + UTF-8 + + + + + + com.muyu + cloud-common-datasource + + + + + com.muyu + cloud-common-security + + + + diff --git a/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/ManyDataSource.java b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/ManyDataSource.java new file mode 100644 index 0000000..7c4fda3 --- /dev/null +++ b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/ManyDataSource.java @@ -0,0 +1,120 @@ +package com.muyu.cloud.common.many.datasource; + +import cn.hutool.json.JSONObject; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import com.muyu.cloud.common.many.datasource.constents.DatasourceContent; +import com.muyu.cloud.common.saas.domain.model.EntInfo; +import com.muyu.cloud.common.many.datasource.factory.DruidDataSourceFactory; +import com.muyu.cloud.common.many.datasource.domain.model.DataSourceInfo; +import com.muyu.cloud.common.many.datasource.role.DynamicDataSource; +import com.muyu.cloud.common.saas.exception.SaaSException; +import com.muyu.common.core.domain.Result; +import com.muyu.common.core.utils.SpringUtils; +import com.muyu.common.core.web.page.TableDataInfo; +import com.muyu.common.system.domain.SysEnt; +import com.muyu.common.system.domain.SysFirmUser; +import com.muyu.common.system.domain.SysUser; +import com.muyu.common.system.remote.RemoteEntService; +import com.muyu.common.system.remote.RemoteUserService; +import lombok.extern.log4j.Log4j2; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @Author: DongZeLiang + * @date: 2024/6/3 + * @Description: 多数据源 + * @Version: 1.0 + */ +@Log4j2 +@AutoConfiguration(before = {MybatisPlusAutoConfiguration.class, MybatisAutoConfiguration.class}) +@Component +public class ManyDataSource implements ApplicationRunner{ + + + private List dataSourceInfoList(){ + RemoteUserService remoteUserService = SpringUtils.getBean(RemoteUserService.class); + Result> listResult = remoteUserService.list(new SysEnt()); + if (listResult==null){ + throw new SaaSException("saas远调数据源错误"); + } + List data = listResult.getData(); + System.out.println(data); + if (listResult.getCode() == Result.SUCCESS && data !=null){ + List list = new ArrayList<>(); + for (SysEnt row : data) { + list.add( + EntInfo.builder() + .entCode(row.getEntCode()) + .dbName(row.getDbName()) + .ip(row.getIp()) + .port(row.getPort()) + .userName(row.getUserName()) + .password(row.getPassword()) + .build() + ); + } + return list; + }else { + log.error("远调数据源错误,远调数据为:{}", JSON.toJSONString(listResult)); + return null; + } + } + + + @Bean + public DynamicDataSource dynamicDataSource(DruidDataSourceFactory druidDataSourceFactory) { + // 企业列表 企业CODE,端口,IP + Map dataSourceMap = new HashMap<>(); + dataSourceInfoList() + .stream() + .map(DataSourceInfo::hostAndPortBuild) + .forEach(dataSourceInfo -> { + dataSourceMap.put(dataSourceInfo.getKey(), druidDataSourceFactory.create(dataSourceInfo)); + }); + //设置动态数据源 + DynamicDataSource dynamicDataSource = new DynamicDataSource(); +// dynamicDataSource.setDefaultTargetDataSource(masterDataSource()); + dynamicDataSource.setTargetDataSources(dataSourceMap); + //将数据源信息备份在defineTargetDataSources中 + dynamicDataSource.setDefineTargetDataSources(dataSourceMap); + log.info("动态数据源加载完成,持有key:{}",dynamicDataSource.getKeys()); + return dynamicDataSource; + } + + @Override + public void run(ApplicationArguments args) { + DruidDataSourceFactory druidDataSourceFactory = SpringUtils.getBean(DruidDataSourceFactory.class); + DynamicDataSource dynamicDataSource = SpringUtils.getBean(DynamicDataSource.class); + for (EntInfo entInfo : dataSourceInfoList()) { + DataSourceInfo dataSourceInfo = DataSourceInfo.hostAndPortBuild(entInfo); + DruidDataSource druidDataSource = druidDataSourceFactory.create(dataSourceInfo); + dynamicDataSource.put(dataSourceInfo.getKey(), druidDataSource); + log.info("存储数据连接池为:key:{}",dataSourceInfo.getKey()); + } + } + +// @Bean +// public SqlSessionFactory sqlSessionFactory(DynamicDataSource dataSource) throws Exception { +// SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); +// sessionFactory.setDataSource(dataSource); +// return sessionFactory.getObject(); +// } +} diff --git a/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/constents/DatasourceContent.java b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/constents/DatasourceContent.java new file mode 100644 index 0000000..daf0bf4 --- /dev/null +++ b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/constents/DatasourceContent.java @@ -0,0 +1,19 @@ +package com.muyu.cloud.common.many.datasource.constents; + +/** + * @author DongZl + * @description: 数据源常量 + * @Date 2023-8-1 上午 11:02 + */ +public class DatasourceContent { + + public final static String DATASOURCE_URL = "jdbc:mysql://{}:{}/{}?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8"; + + public final static String USER_NAME = "root"; + + public final static String PASSWORD = "bawei2112A"; + + public final static String IP = "47.116.173.119"; + + public final static Integer PORT = 3306; +} diff --git a/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/domain/model/DataSourceInfo.java b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/domain/model/DataSourceInfo.java new file mode 100644 index 0000000..8f9d221 --- /dev/null +++ b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/domain/model/DataSourceInfo.java @@ -0,0 +1,60 @@ +package com.muyu.cloud.common.many.datasource.domain.model; + +import com.muyu.cloud.common.many.datasource.constents.DatasourceContent; +import com.muyu.cloud.common.saas.domain.model.EntInfo; +import com.muyu.common.core.utils.StringUtils; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author DongZl + * @description: 数据源实体类 + * @Date 2023-8-1 上午 11:15 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DataSourceInfo { + + /** + * 键 + */ + private String key; + + /** + * 地址 + */ + private String url; + + /** + * 用户名 + */ + private String userName; + + /** + * 密码 + */ + private String password; + + +// public static DataSourceInfo hostAndPortBuild(String key, String host, Integer port) { +// return DataSourceInfo.builder() +// .key(key) +// .url(StringUtils.format(DatasourceContent.DATASOURCE_URL, host, port, key)) +// .password(DatasourceContent.PASSWORD) +// .userName(DatasourceContent.USER_NAME) +// .build(); +// } + + public static DataSourceInfo hostAndPortBuild(EntInfo entInfo) { + return DataSourceInfo.builder() + .key(entInfo.getEntCode()) + .url(StringUtils.format(DatasourceContent.DATASOURCE_URL, entInfo.getIp(), entInfo.getPort(), entInfo.getDbName())) + .userName(entInfo.getUserName()) + .password(entInfo.getPassword()) + .build(); + } +} diff --git a/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/factory/DruidDataSourceFactory.java b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/factory/DruidDataSourceFactory.java new file mode 100644 index 0000000..7ceb782 --- /dev/null +++ b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/factory/DruidDataSourceFactory.java @@ -0,0 +1,40 @@ +package com.muyu.cloud.common.many.datasource.factory; + +import com.alibaba.druid.pool.DruidDataSource; +import com.muyu.cloud.common.many.datasource.domain.model.DataSourceInfo; +import lombok.extern.log4j.Log4j2; +import org.springframework.stereotype.Component; + +import java.sql.SQLException; + +/** + * @Author: DongZeLiang + * @date: 2024/6/3 + * @Description: Druid工厂 + * @Version: 1.0 + */ +@Log4j2 +@Component +public class DruidDataSourceFactory { + + /** + * @Description: 根据传递的数据源信息测试数据库连接 + * @Author Dongzl + */ + public DruidDataSource create(DataSourceInfo dataSourceInfo) { + DruidDataSource druidDataSource = new DruidDataSource(); + druidDataSource.setUrl(dataSourceInfo.getUrl()); + druidDataSource.setUsername(dataSourceInfo.getUserName()); + druidDataSource.setPassword(dataSourceInfo.getPassword()); + druidDataSource.setBreakAfterAcquireFailure(true); + druidDataSource.setConnectionErrorRetryAttempts(0); + try { + druidDataSource.getConnection(2000); + log.info("{} -> 数据源连接成功", dataSourceInfo.getKey()); + return druidDataSource; + } catch (SQLException throwables) { + log.error("数据源 {} 连接失败,用户名:{},密码 {}",dataSourceInfo.getUrl(),dataSourceInfo.getUserName(),dataSourceInfo.getPassword()); + return null; + } + } +} diff --git a/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/holder/DynamicDataSourceHolder.java b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/holder/DynamicDataSourceHolder.java new file mode 100644 index 0000000..e53229a --- /dev/null +++ b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/holder/DynamicDataSourceHolder.java @@ -0,0 +1,42 @@ +package com.muyu.cloud.common.many.datasource.holder; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.Assert; + +/** + * 数据源切换处理 + * + * @author Dongzl + */ +@Slf4j +public class DynamicDataSourceHolder { + /** + * 保存动态数据源名称 + */ + private static final ThreadLocal DYNAMIC_DATASOURCE_KEY = new ThreadLocal<>(); + + /** + * 设置/切换数据源,决定当前线程使用哪个数据源 + */ + public static void setDynamicDataSourceKey(String key){ + log.info("数据源切换为:{}",key); + DYNAMIC_DATASOURCE_KEY.set(key); + } + + /** + * 获取动态数据源名称,默认使用mater数据源 + */ + public static String getDynamicDataSourceKey(){ + String key = DYNAMIC_DATASOURCE_KEY.get(); + Assert.notNull(key, "请携带数据标识"); + return key; + } + + /** + * 移除当前数据源 + */ + public static void removeDynamicDataSourceKey(){ + log.info("移除数据源:{}",DYNAMIC_DATASOURCE_KEY.get()); + DYNAMIC_DATASOURCE_KEY.remove(); + } +} diff --git a/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/role/DynamicDataSource.java b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/role/DynamicDataSource.java new file mode 100644 index 0000000..694bb41 --- /dev/null +++ b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/many/datasource/role/DynamicDataSource.java @@ -0,0 +1,60 @@ +package com.muyu.cloud.common.many.datasource.role; + +import com.alibaba.druid.pool.DruidDataSource; +import com.muyu.cloud.common.many.datasource.holder.DynamicDataSourceHolder; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +import java.util.List; +import java.util.Map; + +/** + * 动态数据源 + * 调用AddDefineDataSource组件的addDefineDynamicDataSource()方法,获取原来targetdatasources的map,并将新的数据源信息添加到map中,并替换targetdatasources中的map + * 切换数据源时可以使用@DataSource(value = "数据源名称"),或者DynamicDataSourceContextHolder.setContextKey("数据源名称") + * @author Dongzl + */ +@EqualsAndHashCode(callSuper = true) +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DynamicDataSource extends AbstractRoutingDataSource { + /** + * 备份所有数据源信息 备份的是个 指针 !!! + */ + private Map defineTargetDataSources; + + /** + * 判定键是否出站了 + * @param key 键 + * @return 存在结果 true存在 false不存在 + */ + public boolean hashKey(String key){ + return defineTargetDataSources.containsKey(key); + } + + /** + * 添加数据库 + * @param key 键 + * @param value 数据源 + */ + public void put(String key, DruidDataSource value) { + defineTargetDataSources.put(key, value); + this.afterPropertiesSet(); + } + + /** + * 决定当前线程使用哪个数据源 + */ + @Override + protected Object determineCurrentLookupKey() { + return DynamicDataSourceHolder.getDynamicDataSourceKey(); + } + + public List getKeys() { + return defineTargetDataSources.keySet().stream().toList(); + } +} diff --git a/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/contents/SaaSConstant.java b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/contents/SaaSConstant.java new file mode 100644 index 0000000..241ce32 --- /dev/null +++ b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/contents/SaaSConstant.java @@ -0,0 +1,12 @@ +package com.muyu.cloud.common.saas.contents; + +/** + * @Author: DongZeLiang + * @date: 2024/6/3 + * @Description: SAAS常量 + * @Version: 1.0 + */ +public class SaaSConstant { + + public final static String SAAS_KEY = "ent-code"; +} diff --git a/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/domain/model/EntInfo.java b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/domain/model/EntInfo.java new file mode 100644 index 0000000..c44dd56 --- /dev/null +++ b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/domain/model/EntInfo.java @@ -0,0 +1,31 @@ +package com.muyu.cloud.common.saas.domain.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author: DongZeLiang + * @date: 2024/6/3 + * @Description: 企业信息 + * @Version: 1.0 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EntInfo { + + private String entCode; + + private String ip; + + private Integer port; + + private String dbName; + + private String userName; + + private String password; +} diff --git a/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/exception/SaaSException.java b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/exception/SaaSException.java new file mode 100644 index 0000000..b2b4cc7 --- /dev/null +++ b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/exception/SaaSException.java @@ -0,0 +1,28 @@ +package com.muyu.cloud.common.saas.exception; + + +import com.muyu.common.core.exception.ServiceException; + +/** + * @Author: DongZeLiang + * @date: 2024/6/3 + * @Description: SaaS异常类 + * @Version: 1.0 + */ +public class SaaSException extends ServiceException { + + public SaaSException (String message, Integer code) { + super(message, code); + } + + public SaaSException (String message) { + super(message); + } + + /** + * 空构造方法,避免反序列化问题 + */ + public SaaSException () { + super(); + } +} diff --git a/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/interceptor/SaaSInterceptor.java b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/interceptor/SaaSInterceptor.java new file mode 100644 index 0000000..520b53b --- /dev/null +++ b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/interceptor/SaaSInterceptor.java @@ -0,0 +1,57 @@ +package com.muyu.cloud.common.saas.interceptor; + +import com.alibaba.fastjson2.JSONObject; +import com.muyu.cloud.common.saas.contents.SaaSConstant; +import com.muyu.cloud.common.many.datasource.holder.DynamicDataSourceHolder; +import com.muyu.cloud.common.saas.exception.SaaSException; +import com.muyu.cloud.common.many.datasource.role.DynamicDataSource; +import com.muyu.common.core.context.SecurityContextHolder; +import com.muyu.common.core.utils.ServletUtils; +import com.muyu.common.core.utils.SpringUtils; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.AsyncHandlerInterceptor; + + +/** + * @Author: DongZeLiang + * @date: 2024/6/3 + * @Description: SAAS拦截器 + * @Version: 1.0 + */ +@Slf4j +public class SaaSInterceptor implements AsyncHandlerInterceptor { + + /** + * 之前 + */ + @Override + public boolean preHandle (HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + if (!(handler instanceof HandlerMethod)) { + return true; + } + + String saasKey = ServletUtils.getHeader(request, SaaSConstant.SAAS_KEY); + log.info("访问路径:{},携带SaaSKey:{}",request.getRequestURI(),saasKey); + if (saasKey == null) { + throw new SaaSException("SaaS非法访问"); + }else { + DynamicDataSource dynamicDataSource = SpringUtils.getBean(DynamicDataSource.class); + if (!dynamicDataSource.hashKey(saasKey)){ + throw new SaaSException("SaaS非法访问"); + } + } + DynamicDataSourceHolder.setDynamicDataSourceKey(saasKey); + return true; + } + + /** + * 之后 + */ + @Override + public void afterConcurrentHandlingStarted (HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + DynamicDataSourceHolder.removeDynamicDataSourceKey(); + } +} diff --git a/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/interceptor/WebMvcSaaSConfig.java b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/interceptor/WebMvcSaaSConfig.java new file mode 100644 index 0000000..4c79417 --- /dev/null +++ b/cloud-common/cloud-common-saas/src/main/java/com/muyu/cloud/common/saas/interceptor/WebMvcSaaSConfig.java @@ -0,0 +1,31 @@ +package com.muyu.cloud.common.saas.interceptor; + +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * 拦截器配置 + * + * @author muyu + */ +public class WebMvcSaaSConfig implements WebMvcConfigurer { + /** + * 不需要拦截的地址 + */ + public static final String[] excludeUrls = {"/login", "/logout", "/refresh"}; + + @Override + public void addInterceptors (InterceptorRegistry registry) { + registry.addInterceptor(getHeaderInterceptor()) + .addPathPatterns("/**") + .excludePathPatterns(excludeUrls) + .order(-10); + } + + /** + * 自定义请求头拦截器 + */ + public SaaSInterceptor getHeaderInterceptor () { + return new SaaSInterceptor(); + } +} diff --git a/cloud-common/cloud-common-saas/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/cloud-common/cloud-common-saas/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..70148cf --- /dev/null +++ b/cloud-common/cloud-common-saas/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,3 @@ +com.muyu.cloud.common.saas.interceptor.WebMvcSaaSConfig +com.muyu.cloud.common.many.datasource.ManyDataSource +com.muyu.cloud.common.many.datasource.factory.DruidDataSourceFactory diff --git a/cloud-common/cloud-common-security/src/main/java/com/muyu/common/security/interceptor/HeaderInterceptor.java b/cloud-common/cloud-common-security/src/main/java/com/muyu/common/security/interceptor/HeaderInterceptor.java index 0b1938d..44cff61 100644 --- a/cloud-common/cloud-common-security/src/main/java/com/muyu/common/security/interceptor/HeaderInterceptor.java +++ b/cloud-common/cloud-common-security/src/main/java/com/muyu/common/security/interceptor/HeaderInterceptor.java @@ -28,6 +28,7 @@ public class HeaderInterceptor implements AsyncHandlerInterceptor { } SecurityContextHolder.setUserId(ServletUtils.getHeader(request, SecurityConstants.DETAILS_USER_ID)); + SecurityContextHolder.setSaasKey(ServletUtils.getHeader(request, SecurityConstants.SAAS_KEY)); SecurityContextHolder.setUserName(ServletUtils.getHeader(request, SecurityConstants.DETAILS_USERNAME)); SecurityContextHolder.setUserKey(ServletUtils.getHeader(request, SecurityConstants.USER_KEY)); diff --git a/cloud-common/cloud-common-security/src/main/java/com/muyu/common/security/service/TokenService.java b/cloud-common/cloud-common-security/src/main/java/com/muyu/common/security/service/TokenService.java index 3955ddc..30d2af7 100644 --- a/cloud-common/cloud-common-security/src/main/java/com/muyu/common/security/service/TokenService.java +++ b/cloud-common/cloud-common-security/src/main/java/com/muyu/common/security/service/TokenService.java @@ -55,10 +55,11 @@ public class TokenService { claimsMap.put(SecurityConstants.USER_KEY, token); claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId); claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName); - + claimsMap.put(SecurityConstants.SAAS_KEY,loginUser.getSysUser().getFirmCode()); // 接口返回信息 Map rspMap = new HashMap(); rspMap.put("access_token", JwtUtils.createToken(claimsMap)); + rspMap.put("ent_code", loginUser.getSysUser().getFirmCode()); rspMap.put("expires_in", expireTime); return rspMap; } diff --git a/cloud-common/cloud-common-security/src/main/java/com/muyu/common/security/utils/SecurityUtils.java b/cloud-common/cloud-common-security/src/main/java/com/muyu/common/security/utils/SecurityUtils.java index 6e3f92b..89b57a6 100644 --- a/cloud-common/cloud-common-security/src/main/java/com/muyu/common/security/utils/SecurityUtils.java +++ b/cloud-common/cloud-common-security/src/main/java/com/muyu/common/security/utils/SecurityUtils.java @@ -30,6 +30,10 @@ public class SecurityUtils { return SecurityContextHolder.getUserName(); } + public static String getSaasKey () { + return SecurityContextHolder.getSaasKey(); + } + /** * 获取用户key */ diff --git a/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/LoginUser.java b/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/LoginUser.java index a18af37..4c8aa05 100644 --- a/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/LoginUser.java +++ b/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/LoginUser.java @@ -63,4 +63,6 @@ public class LoginUser implements Serializable { */ private SysUser sysUser; + + } diff --git a/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/SysDept.java b/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/SysDept.java index 65ada9e..6c2f7c2 100644 --- a/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/SysDept.java +++ b/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/SysDept.java @@ -34,6 +34,8 @@ public class SysDept extends BaseEntity { */ private Long parentId; + private String firmCode; + /** * 祖级列表 */ diff --git a/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/SysEnt.java b/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/SysEnt.java new file mode 100644 index 0000000..0c145d5 --- /dev/null +++ b/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/SysEnt.java @@ -0,0 +1,37 @@ +package com.muyu.common.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author: DongZeLiang + * @date: 2024/6/3 + * @Description: 企业信息 + * @Version: 1.0 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName("sys_ent") +public class SysEnt { + @TableId( type = IdType.AUTO) + private Integer id; + + private String entCode; + + private String ip; + + private Integer port; + + private String dbName; + + private String userName; + + private String password; +} diff --git a/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/SysFirmUser.java b/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/SysFirmUser.java new file mode 100644 index 0000000..0bba83a --- /dev/null +++ b/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/SysFirmUser.java @@ -0,0 +1,25 @@ +package com.muyu.common.system.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * @Author WangXin + * @Data 2024/9/18 + * @Description 企业用户 + * @Version 1.0.0 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@SuperBuilder +@AllArgsConstructor +@NoArgsConstructor +public class SysFirmUser extends SysUser { + /** + * 用户数据库 + */ + private String databaseName; +} diff --git a/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/SysUser.java b/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/SysUser.java index 999b22c..dda384b 100644 --- a/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/SysUser.java +++ b/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/domain/SysUser.java @@ -49,6 +49,9 @@ public class SysUser extends BaseEntity { @Excel(name = "登录名称") private String userName; + + private String firmCode; + /** * 用户昵称 */ @@ -135,6 +138,8 @@ public class SysUser extends BaseEntity { */ private Long roleId; + + public SysUser (Long userId) { this.userId = userId; } diff --git a/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/remote/RemoteEntService.java b/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/remote/RemoteEntService.java new file mode 100644 index 0000000..ba0bf52 --- /dev/null +++ b/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/remote/RemoteEntService.java @@ -0,0 +1,23 @@ +package com.muyu.common.system.remote; + +import com.muyu.common.core.constant.ServiceNameConstants; +import com.muyu.common.core.domain.Result; +import com.muyu.common.system.domain.SysEnt; +import com.muyu.common.system.remote.factory.RemoteEntFallbackFactory; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * 文件服务 + * + * @author muyu + */ +@FeignClient(contextId = "remoteEntService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteEntFallbackFactory.class) +public interface RemoteEntService { + + +} diff --git a/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/remote/RemoteUserService.java b/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/remote/RemoteUserService.java index cb968e0..5a1936e 100644 --- a/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/remote/RemoteUserService.java +++ b/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/remote/RemoteUserService.java @@ -3,12 +3,17 @@ package com.muyu.common.system.remote; import com.muyu.common.core.constant.SecurityConstants; import com.muyu.common.core.constant.ServiceNameConstants; import com.muyu.common.core.domain.Result; +import com.muyu.common.core.web.page.TableDataInfo; +import com.muyu.common.system.domain.SysEnt; +import com.muyu.common.system.domain.SysFirmUser; import com.muyu.common.system.domain.SysUser; import com.muyu.common.system.remote.factory.RemoteUserFallbackFactory; import com.muyu.common.system.domain.LoginUser; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** * 用户服务 * @@ -24,8 +29,8 @@ public interface RemoteUserService { * * @return 结果 */ - @GetMapping("/user/info/{username}") - public Result getUserInfo (@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + @GetMapping("/user/info") + public Result getUserInfo (@RequestParam("firmCode") String firmCode,@RequestParam("username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); /** * 注册用户信息 @@ -37,4 +42,10 @@ public interface RemoteUserService { */ @PostMapping("/user/register") public Result registerUserInfo (@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + @GetMapping("/user/companyList") + public Result> companyList (); + + @PostMapping("/ent/list") + public Result> list (@RequestBody SysEnt sysEnt); } diff --git a/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/remote/factory/RemoteEntFallbackFactory.java b/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/remote/factory/RemoteEntFallbackFactory.java new file mode 100644 index 0000000..c733432 --- /dev/null +++ b/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/remote/factory/RemoteEntFallbackFactory.java @@ -0,0 +1,34 @@ +package com.muyu.common.system.remote.factory; +/** + * @Author: 胡杨 + * @Name: RemoteEntFallbackFactory + * @Description: + * @CreatedDate: 2024/9/20 下午3:11 + * @FilePath: com.muyu.common.system.remote + */ + + +import com.muyu.common.core.domain.Result; +import com.muyu.common.system.domain.SysEnt; +import com.muyu.common.system.remote.RemoteEntService; +import org.springframework.cloud.openfeign.FallbackFactory; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @Author: 胡杨 + * @Name: RemoteEntFallbackFactory + * @Description: + * @CreatedDate: 2024/9/20 下午3:11 + * @FilePath: com.muyu.common.system.remote + */ +@Component +public class RemoteEntFallbackFactory implements FallbackFactory { + @Override + public RemoteEntService create(Throwable cause) { + return new RemoteEntService() { + + }; + } +} diff --git a/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/remote/factory/RemoteUserFallbackFactory.java b/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/remote/factory/RemoteUserFallbackFactory.java index b7f4d60..0d219ea 100644 --- a/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/remote/factory/RemoteUserFallbackFactory.java +++ b/cloud-common/cloud-common-system/src/main/java/com/muyu/common/system/remote/factory/RemoteUserFallbackFactory.java @@ -1,6 +1,9 @@ package com.muyu.common.system.remote.factory; import com.muyu.common.core.domain.Result; +import com.muyu.common.core.web.page.TableDataInfo; +import com.muyu.common.system.domain.SysEnt; +import com.muyu.common.system.domain.SysFirmUser; import com.muyu.common.system.remote.RemoteUserService; import com.muyu.common.system.domain.SysUser; import com.muyu.common.system.domain.LoginUser; @@ -9,6 +12,8 @@ import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; +import java.util.List; + /** * 用户服务降级处理 * @@ -22,8 +27,9 @@ public class RemoteUserFallbackFactory implements FallbackFactory getUserInfo (String username, String source) { + public Result getUserInfo(String firmCode, String username, String source) { return Result.error("获取用户失败:" + throwable.getMessage()); } @@ -31,6 +37,17 @@ public class RemoteUserFallbackFactory implements FallbackFactory registerUserInfo (SysUser sysUser, String source) { return Result.error("注册用户失败:" + throwable.getMessage()); } + + @Override + public Result> companyList() { + return Result.error("获取企业列表失败:" + throwable.getMessage()); + } + + @Override + public Result> list(SysEnt sysEnt) { + return Result.error("获取企业列表失败:" + throwable.getMessage()); + } + }; } } diff --git a/cloud-common/cloud-common-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/cloud-common/cloud-common-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index b9a11b8..b1c8d8c 100644 --- a/cloud-common/cloud-common-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/cloud-common/cloud-common-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,3 +1,4 @@ com.muyu.common.system.remote.factory.RemoteUserFallbackFactory com.muyu.common.system.remote.factory.RemoteLogFallbackFactory com.muyu.common.system.remote.factory.RemoteFileFallbackFactory +com.muyu.common.system.remote.factory.RemoteEntFallbackFactory diff --git a/cloud-common/cloud-common-xxl/src/main/java/com/muyu/common/xxl/XXLJobConfig.java b/cloud-common/cloud-common-xxl/src/main/java/com/muyu/common/xxl/XXLJobConfig.java index 0bf4362..85ebf6f 100644 --- a/cloud-common/cloud-common-xxl/src/main/java/com/muyu/common/xxl/XXLJobConfig.java +++ b/cloud-common/cloud-common-xxl/src/main/java/com/muyu/common/xxl/XXLJobConfig.java @@ -7,9 +7,9 @@ import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; @Log4j2 -@Component +//@Component public class XXLJobConfig { - @Bean +// @Bean public XxlJobSpringExecutor xxlJobExecutor(XxlJobProperties xxlJobProperties) { if (StringUtils.isEmpty(xxlJobProperties.getAdminAddresses())){ throw new RuntimeException("请在bootstrap.yml当中配置shared-configs项,xxl-job共享配置[application-xxl-config]"); diff --git a/cloud-common/pom.xml b/cloud-common/pom.xml index d00dfc6..a7a40be 100644 --- a/cloud-common/pom.xml +++ b/cloud-common/pom.xml @@ -20,6 +20,7 @@ cloud-common-system cloud-common-xxl cloud-common-rabbit + cloud-common-saas cloud-common diff --git a/cloud-firm/pom.xml b/cloud-firm/pom.xml new file mode 100644 index 0000000..edd81ae --- /dev/null +++ b/cloud-firm/pom.xml @@ -0,0 +1,105 @@ + + + 4.0.0 + + com.muyu + cloud-server + 3.6.3 + + + cloud-firm + + + 17 + 17 + UTF-8 + + + + + + com.muyu + cloud-common-saas + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + com.mysql + mysql-connector-j + + + + + com.muyu + cloud-common-datasource + + + + + com.muyu + cloud-common-datascope + + + + + com.muyu + cloud-common-log + + + + + com.muyu + cloud-common-api-doc + + + + + com.muyu + cloud-common-xxl + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + diff --git a/cloud-firm/src/main/java/com/muyu/cloud/firm/FirmApplication.java b/cloud-firm/src/main/java/com/muyu/cloud/firm/FirmApplication.java new file mode 100644 index 0000000..4733b8a --- /dev/null +++ b/cloud-firm/src/main/java/com/muyu/cloud/firm/FirmApplication.java @@ -0,0 +1,25 @@ +package com.muyu.cloud.firm; + +import com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration; +import com.muyu.common.security.annotation.EnableCustomConfig; +import com.muyu.common.security.annotation.EnableMyFeignClients; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; + +@EnableCustomConfig +@EnableMyFeignClients +@SpringBootApplication( + exclude = { + DataSourceAutoConfiguration.class, + DruidDataSourceAutoConfigure.class, + DynamicDataSourceAutoConfiguration.class + } +) +public class FirmApplication { + public static void main(String[] args) { + SpringApplication.run(FirmApplication.class, args); + } +} diff --git a/cloud-firm/src/main/java/com/muyu/cloud/firm/controller/SysFirmController.java b/cloud-firm/src/main/java/com/muyu/cloud/firm/controller/SysFirmController.java new file mode 100644 index 0000000..fc32a10 --- /dev/null +++ b/cloud-firm/src/main/java/com/muyu/cloud/firm/controller/SysFirmController.java @@ -0,0 +1,107 @@ +package com.muyu.cloud.firm.controller; + +import com.muyu.cloud.firm.service.ISysFirmService; +import com.muyu.common.core.domain.Result; +import com.muyu.common.core.utils.poi.ExcelUtil; +import com.muyu.common.core.web.controller.BaseController; +import com.muyu.common.core.web.page.TableDataInfo; +import com.muyu.common.security.annotation.RequiresPermissions; +import com.muyu.common.security.utils.SecurityUtils; +import com.muyu.cloud.firm.domain.SysFirm; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.List; + +/** + * 企业基础信息Controller + * + * @author muyu + * @date 2024-09-18 + */ +@RestController +@RequestMapping("/firmInfo") +public class SysFirmController extends BaseController +{ + @Resource + private ISysFirmService sysFirmService; + + + /** + * 查询企业基础信息列表 + */ + @RequiresPermissions("firm:firmInfo:list") + @GetMapping("/list") + public Result> list(SysFirm sysFirm) + { + startPage(); + List list = sysFirmService.selectSysFirmList(sysFirm); + return getDataTable(list); + } + + /** + * 导出企业基础信息列表 + */ + @RequiresPermissions("firm:firmInfo:export") + @PostMapping("/export") + public void export(HttpServletResponse response, SysFirm sysFirm) + { + List list = sysFirmService.selectSysFirmList(sysFirm); + ExcelUtil util = new ExcelUtil(SysFirm.class); + util.exportExcel(response, list, "企业基础信息数据"); + } + + /** + * 获取企业基础信息详细信息 + */ + @RequiresPermissions("firm:firmInfo:query") + @GetMapping(value = "/{id}") + public Result> getInfo(@PathVariable("id") Long id) + { + return success(sysFirmService.selectSysFirmById(id)); + } + + /** + * 新增企业基础信息 + */ + @RequiresPermissions("firm:firmInfo:add") + @PostMapping + public Result add( + @Validated @RequestBody SysFirm sysFirm) + { + if (sysFirmService.checkIdUnique(sysFirm)) { + return error("新增 企业基础信息 '" + sysFirm + "'失败,企业基础信息已存在"); + } + sysFirm.setCreateBy(SecurityUtils.getUsername()); + return toAjax(sysFirmService.save(sysFirm)); + } + + /** + * 修改企业基础信息 + */ + @RequiresPermissions("firm:firmInfo:edit") + @PutMapping + public Result edit( + @Validated @RequestBody SysFirm sysFirm) + { + if (!sysFirmService.checkIdUnique(sysFirm)) { + return error("修改 企业基础信息 '" + sysFirm + "'失败,企业基础信息不存在"); + } + sysFirm.setUpdateBy(SecurityUtils.getUsername()); + return toAjax(sysFirmService.updateById(sysFirm)); + } + + /** + * 删除企业基础信息 + */ + @RequiresPermissions("firm:firmInfo:remove") + @DeleteMapping("/{ids}") + public Result remove(@PathVariable("ids") Long[] ids) + { + sysFirmService.removeBatchByIds(Arrays.asList(ids)); + return success(); + } +} diff --git a/cloud-firm/src/main/java/com/muyu/cloud/firm/domain/SysFirm.java b/cloud-firm/src/main/java/com/muyu/cloud/firm/domain/SysFirm.java new file mode 100644 index 0000000..0517fd8 --- /dev/null +++ b/cloud-firm/src/main/java/com/muyu/cloud/firm/domain/SysFirm.java @@ -0,0 +1,72 @@ +package com.muyu.cloud.firm.domain; + +import com.muyu.common.core.annotation.Excel; +import com.muyu.common.core.web.domain.BaseEntity; +import lombok.*; +import lombok.experimental.SuperBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; + +/** + * 企业基础信息对象 sys_firm + * + * @author muyu + * @date 2024-09-18 + */ + +@Data +@Setter +@Getter +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@TableName("sys_firm") +public class SysFirm extends BaseEntity{ + private static final long serialVersionUID = 1L; + + /** 自增主键 */ + @TableId( type = IdType.AUTO) + private Long id; + + /** 统一社会信用代码 */ + @Excel(name = "统一社会信用代码") + private String firmCreditCode; + + /** 企业编码 */ + @Excel(name = "企业编码") + private String firmCode; + + /** 企业名称 */ + @Excel(name = "企业名称") + private String firmName; + + /** 企业logs */ + @Excel(name = "企业logs") + private String firmLogs; + + /** 启用状态(1.开业 2.停业 3.休业) */ + @Excel(name = "启用状态(1.开业 2.停业 3.休业)") + private String state; + + + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("firmCreditCode", getFirmCreditCode()) + .append("firmCode", getFirmCode()) + .append("firmName", getFirmName()) + .append("firmLogs", getFirmLogs()) + .append("state", getState()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/cloud-firm/src/main/java/com/muyu/cloud/firm/mapper/SysFirmMapper.java b/cloud-firm/src/main/java/com/muyu/cloud/firm/mapper/SysFirmMapper.java new file mode 100644 index 0000000..60c0bfc --- /dev/null +++ b/cloud-firm/src/main/java/com/muyu/cloud/firm/mapper/SysFirmMapper.java @@ -0,0 +1,19 @@ +package com.muyu.cloud.firm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.muyu.cloud.firm.domain.SysFirm; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 企业基础信息Mapper接口 + * + * @author muyu + * @date 2024-09-18 + */ +@Mapper +public interface SysFirmMapper extends BaseMapper{ + + List selectSysFirmList(SysFirm sysFirm); +} diff --git a/cloud-firm/src/main/java/com/muyu/cloud/firm/service/ISysFirmService.java b/cloud-firm/src/main/java/com/muyu/cloud/firm/service/ISysFirmService.java new file mode 100644 index 0000000..04246c4 --- /dev/null +++ b/cloud-firm/src/main/java/com/muyu/cloud/firm/service/ISysFirmService.java @@ -0,0 +1,39 @@ +package com.muyu.cloud.firm.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.muyu.cloud.firm.domain.SysFirm; + +import java.util.List; + +/** + * 企业基础信息Service接口 + * + * @author muyu + * @date 2024-09-18 + */ +public interface ISysFirmService extends IService { + /** + * 精确查询企业基础信息 + * + * @param id 企业基础信息主键 + * @return 企业基础信息 + */ + public SysFirm selectSysFirmById(Long id); + + /** + * 查询企业基础信息列表 + * + * @param sysFirm 企业基础信息 + * @return 企业基础信息集合 + */ + public List selectSysFirmList(SysFirm sysFirm); + + /** + * 判断 企业基础信息 id是否唯一 + * + * @param sysFirm 企业基础信息 + * @return 结果 + */ + Boolean checkIdUnique(SysFirm sysFirm); + +} diff --git a/cloud-firm/src/main/java/com/muyu/cloud/firm/service/impl/SysFirmServiceImpl.java b/cloud-firm/src/main/java/com/muyu/cloud/firm/service/impl/SysFirmServiceImpl.java new file mode 100644 index 0000000..6857c9f --- /dev/null +++ b/cloud-firm/src/main/java/com/muyu/cloud/firm/service/impl/SysFirmServiceImpl.java @@ -0,0 +1,70 @@ +package com.muyu.cloud.firm.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.muyu.cloud.firm.domain.SysFirm; +import com.muyu.cloud.firm.mapper.SysFirmMapper; +import com.muyu.cloud.firm.service.ISysFirmService; +import com.muyu.common.core.utils.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 企业基础信息Service业务层处理 + * + * @author muyu + * @date 2024-09-18 + */ +@Service +public class SysFirmServiceImpl + extends ServiceImpl + implements ISysFirmService { + + @Resource + private SysFirmMapper sysFirmMapper; + + /** + * 精确查询企业基础信息 + * + * @param id 企业基础信息主键 + * @return 企业基础信息 + */ + @Override + public SysFirm selectSysFirmById(Long id) + { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + Assert.notNull(id, "id不可为空"); + queryWrapper.eq(SysFirm::getId, id); + return this.getOne(queryWrapper); + } + + + /** + * 查询企业基础信息列表 + * + * @param sysFirm 企业基础信息 + * @return 企业基础信息 + */ + @Override + public List selectSysFirmList(SysFirm sysFirm) { + return sysFirmMapper.selectSysFirmList(sysFirm); + } + + /** + * 唯一 判断 + * @param sysFirm 企业基础信息 + * @return 企业基础信息 + */ + @Override + public Boolean checkIdUnique(SysFirm sysFirm) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysFirm::getId, sysFirm.getId()); + return this.count(queryWrapper) > 0; + } + + + +} diff --git a/cloud-firm/src/main/resources/banner.txt b/cloud-firm/src/main/resources/banner.txt new file mode 100644 index 0000000..0dd5eee --- /dev/null +++ b/cloud-firm/src/main/resources/banner.txt @@ -0,0 +1,2 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} diff --git a/cloud-firm/src/main/resources/bootstrap.yml b/cloud-firm/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..47c824e --- /dev/null +++ b/cloud-firm/src/main/resources/bootstrap.yml @@ -0,0 +1,58 @@ +# Tomcat +server: + port: 49701 + +# nacos线上地址 +nacos: + addr: 47.116.173.119:8848 + user-name: nacos + password: nacos + namespace: one-saas +# SPRING_AMQP_DESERIALIZATION_TRUST_ALL=true spring.amqp.deserialization.trust.all +# Spring +spring: + amqp: + deserialization: + trust: + all: true + main: + allow-bean-definition-overriding: true + application: + # 应用名称 + name: cloud-platform-firm + profiles: + # 环境配置 + active: dev + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: ${nacos.addr} + # nacos用户名 + username: ${nacos.user-name} + # nacos密码 + password: ${nacos.password} + # 命名空间 + namespace: ${nacos.namespace} + config: + # 服务注册地址 + server-addr: ${nacos.addr} + # nacos用户名 + username: ${nacos.user-name} + # nacos密码 + password: ${nacos.password} + # 命名空间 + namespace: ${nacos.namespace} + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + # 系统共享配置 + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + # 系统环境Config共享配置 + - application-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + + +logging: + level: + com.muyu.cloud.mapper: DEBUG diff --git a/cloud-firm/src/main/resources/logback/dev.xml b/cloud-firm/src/main/resources/logback/dev.xml new file mode 100644 index 0000000..621579c --- /dev/null +++ b/cloud-firm/src/main/resources/logback/dev.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + + + + + + + + + + + + diff --git a/cloud-firm/src/main/resources/logback/prod.xml b/cloud-firm/src/main/resources/logback/prod.xml new file mode 100644 index 0000000..2419bf9 --- /dev/null +++ b/cloud-firm/src/main/resources/logback/prod.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + ${log.sky.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + + + ERROR + + ACCEPT + + DENY + + + + + + + + ${log.sky.pattern} + + + + + + + + + + + + + + + + + + + + diff --git a/cloud-firm/src/main/resources/logback/test.xml b/cloud-firm/src/main/resources/logback/test.xml new file mode 100644 index 0000000..2419bf9 --- /dev/null +++ b/cloud-firm/src/main/resources/logback/test.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + ${log.sky.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + + + ERROR + + ACCEPT + + DENY + + + + + + + + ${log.sky.pattern} + + + + + + + + + + + + + + + + + + + + diff --git a/cloud-firm/src/main/resources/mapper/firm/SysFirmMapper.xml b/cloud-firm/src/main/resources/mapper/firm/SysFirmMapper.xml new file mode 100644 index 0000000..32f06d4 --- /dev/null +++ b/cloud-firm/src/main/resources/mapper/firm/SysFirmMapper.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + select id, firm_credit_code, firm_code, firm_name, firm_logs , state, create_by, create_time, update_by, update_time, remark from sys_firm + + + + + + + + + insert into sys_firm + + firm_credit_code, + firm_code, + firm_name, + firm_logs, + state, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{firmCreditCode}, + #{firmCode}, + #{firmName}, + #{firmLogs}, + #{state}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update sys_firm + + firm_credit_code = #{firmCreditCode}, + firm_code = #{firmCode}, + firm_name = #{firmName}, + firm_logs = #{firmLogs}, + state = #{state}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + delete from sys_firm where id = #{id} + + + + delete from sys_firm where id in + + #{id} + + + diff --git a/cloud-gateway/pom.xml b/cloud-gateway/pom.xml index 106c740..8aa98ed 100644 --- a/cloud-gateway/pom.xml +++ b/cloud-gateway/pom.xml @@ -81,7 +81,6 @@ knife4j-gateway-spring-boot-starter 4.5.0 - diff --git a/cloud-gateway/src/main/java/com/muyu/gateway/filter/AuthFilter.java b/cloud-gateway/src/main/java/com/muyu/gateway/filter/AuthFilter.java index 47e073f..bda6f2f 100644 --- a/cloud-gateway/src/main/java/com/muyu/gateway/filter/AuthFilter.java +++ b/cloud-gateway/src/main/java/com/muyu/gateway/filter/AuthFilter.java @@ -63,6 +63,7 @@ public class AuthFilter implements GlobalFilter, Ordered { } String userid = JwtUtils.getUserId(claims); String username = JwtUtils.getUserName(claims); + String saasKey = JwtUtils.getSaasKey(claims); if (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username)) { return unauthorizedResponse(exchange, "令牌验证失败"); } @@ -71,6 +72,7 @@ public class AuthFilter implements GlobalFilter, Ordered { addHeader(mutate, SecurityConstants.USER_KEY, userkey); addHeader(mutate, SecurityConstants.DETAILS_USER_ID, userid); addHeader(mutate, SecurityConstants.DETAILS_USERNAME, username); + addHeader(mutate,SecurityConstants.SAAS_KEY,saasKey); // 内部请求来源参数清除 removeHeader(mutate, SecurityConstants.FROM_SOURCE); return chain.filter(exchange.mutate().request(mutate.build()).build()); diff --git a/cloud-gateway/src/main/java/com/muyu/gateway/utils/WebFrameworkUtils.java b/cloud-gateway/src/main/java/com/muyu/gateway/utils/WebFrameworkUtils.java index 2443e13..68b0a19 100644 --- a/cloud-gateway/src/main/java/com/muyu/gateway/utils/WebFrameworkUtils.java +++ b/cloud-gateway/src/main/java/com/muyu/gateway/utils/WebFrameworkUtils.java @@ -4,8 +4,6 @@ import cn.hutool.core.net.NetUtil; import cn.hutool.core.util.ArrayUtil; import com.alibaba.fastjson2.JSONObject; import lombok.extern.log4j.Log4j2; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.cloud.gateway.route.Route; import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; import org.springframework.core.io.buffer.DataBufferFactory; @@ -18,8 +16,6 @@ import reactor.core.publisher.Mono; /** * Web 工具类 - * - * */ @Log4j2 public class WebFrameworkUtils { @@ -72,8 +68,6 @@ public class WebFrameworkUtils { /** * 获得客户端 IP - * - * * @param exchange 请求 * @param otherHeaderNames 其它 header 名字的数组 * @return 客户端 IP @@ -91,7 +85,6 @@ public class WebFrameworkUtils { return NetUtil.getMultistageReverseProxyIp(ip); } } - // 方式二,通过 remoteAddress 获取 if (exchange.getRequest().getRemoteAddress() == null) { return null; @@ -102,7 +95,6 @@ public class WebFrameworkUtils { /** * 获得请求匹配的 Route 路由 - * * @param exchange 请求 * @return 路由 */ diff --git a/cloud-gateway/src/main/resources/bootstrap.yml b/cloud-gateway/src/main/resources/bootstrap.yml index a9f1fd5..1c20d8f 100644 --- a/cloud-gateway/src/main/resources/bootstrap.yml +++ b/cloud-gateway/src/main/resources/bootstrap.yml @@ -4,10 +4,10 @@ server: # nacos线上地址 nacos: - addr: 106.54.193.225:8848 + addr: 47.116.173.119:8848 user-name: nacos password: nacos - namespace: one + namespace: one-saas # Spring spring: diff --git a/cloud-modules/cloud-modules-file/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-file/src/main/resources/bootstrap.yml index 51e4a3e..a36bd1b 100644 --- a/cloud-modules/cloud-modules-file/src/main/resources/bootstrap.yml +++ b/cloud-modules/cloud-modules-file/src/main/resources/bootstrap.yml @@ -1,13 +1,13 @@ # Tomcat server: - port: 9300 + port: 9301 # nacos线上地址 nacos: - addr: 106.54.193.225:8848 + addr: 47.116.173.119:8848 user-name: nacos password: nacos - namespace: one + namespace: one-saas # Spring spring: diff --git a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/CloudGenApplication.java b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/CloudGenApplication.java index da3eb43..3cb1f39 100644 --- a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/CloudGenApplication.java +++ b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/CloudGenApplication.java @@ -16,5 +16,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; public class CloudGenApplication { public static void main (String[] args) { SpringApplication.run(CloudGenApplication.class, args); + System.out.println("CloudGen 模块启动成功!"); } } diff --git a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/controller/GenController.java b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/controller/GenController.java index 1dfe039..f93075e 100644 --- a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/controller/GenController.java +++ b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/controller/GenController.java @@ -1,22 +1,24 @@ package com.muyu.gen.controller; +import com.muyu.common.core.domain.Result; import com.muyu.common.core.text.Convert; import com.muyu.common.core.web.controller.BaseController; -import com.muyu.common.core.domain.Result; import com.muyu.common.core.web.page.TableDataInfo; import com.muyu.common.log.annotation.Log; import com.muyu.common.log.enums.BusinessType; import com.muyu.common.security.annotation.RequiresPermissions; import com.muyu.gen.domain.GenTable; import com.muyu.gen.domain.GenTableColumn; +import com.muyu.gen.domain.GenTableResp; import com.muyu.gen.service.IGenTableColumnService; import com.muyu.gen.service.IGenTableService; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; -import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import jakarta.servlet.http.HttpServletResponse; +import javax.annotation.Resource; import java.io.IOException; import java.util.HashMap; import java.util.List; @@ -25,15 +27,19 @@ import java.util.Map; /** * 代码生成 操作处理 * - * @author muyu + * @author ruoyi */ @RequestMapping("/gen") @RestController -public class GenController extends BaseController { - @Autowired +public class GenController extends BaseController +{ + @Resource private IGenTableService genTableService; - @Autowired + @Resource + private HttpServletResponse response; + + @Resource private IGenTableColumnService genTableColumnService; /** @@ -41,7 +47,8 @@ public class GenController extends BaseController { */ @RequiresPermissions("tool:gen:list") @GetMapping("/list") - public Result> genList (GenTable genTable) { + public Result genList(GenTable genTable) + { startPage(); List list = genTableService.selectGenTableList(genTable); return getDataTable(list); @@ -52,7 +59,8 @@ public class GenController extends BaseController { */ @RequiresPermissions("tool:gen:query") @GetMapping(value = "/{tableId}") - public Result getInfo (@PathVariable("tableId") Long tableId) { + public Result getInfo(@PathVariable("tableId") Long tableId) + { GenTable table = genTableService.selectGenTableById(tableId); List tables = genTableService.selectGenTableAll(); List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); @@ -63,12 +71,14 @@ public class GenController extends BaseController { return success(map); } + /** * 查询数据库列表 */ @RequiresPermissions("tool:gen:list") @GetMapping("/db/list") - public Result> dataList (GenTable genTable) { + public Result dataList(GenTable genTable) + { startPage(); List list = genTableService.selectDbTableList(genTable); return getDataTable(list); @@ -78,26 +88,26 @@ public class GenController extends BaseController { * 查询数据表字段列表 */ @GetMapping(value = "/column/{tableId}") - public Result> columnList (Long tableId) { + public Result columnList(@PathVariable("tableId") Long tableId) + { + TableDataInfo dataInfo = new TableDataInfo(); List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); - return Result.success( - TableDataInfo.builder() - .total(list.size()) - .rows(list) - .build() - ); + dataInfo.setRows(list); + dataInfo.setTotal(list.size()); + return success(dataInfo); } /** * 导入表结构(保存) */ - @RequiresPermissions("tool:gen:import") +// @RequiresPermissions("tool:gen:import") @Log(title = "代码生成", businessType = BusinessType.IMPORT) @PostMapping("/importTable") - public Result importTableSave (String tables) { + public Result importTableSave(@RequestParam("tables") String tables, @RequestParam("dbName") String dbName) + { String[] tableNames = Convert.toStrArray(tables); // 查询表信息 - List tableList = genTableService.selectDbTableListByNames(tableNames); + List tableList = genTableService.selectDbTableListByNames(tableNames,dbName); genTableService.importGenTable(tableList); return success(); } @@ -108,7 +118,8 @@ public class GenController extends BaseController { @RequiresPermissions("tool:gen:edit") @Log(title = "代码生成", businessType = BusinessType.UPDATE) @PutMapping - public Result editSave (@Validated @RequestBody GenTable genTable) { + public Result editSave(@Validated @RequestBody GenTable genTable) + { genTableService.validateEdit(genTable); genTableService.updateGenTable(genTable); return success(); @@ -120,7 +131,8 @@ public class GenController extends BaseController { @RequiresPermissions("tool:gen:remove") @Log(title = "代码生成", businessType = BusinessType.DELETE) @DeleteMapping("/{tableIds}") - public Result remove (@PathVariable("tableIds") Long[] tableIds) { + public Result remove(@PathVariable("tableIds") Long[] tableIds) + { genTableService.deleteGenTableByIds(tableIds); return success(); } @@ -130,7 +142,8 @@ public class GenController extends BaseController { */ @RequiresPermissions("tool:gen:preview") @GetMapping("/preview/{tableId}") - public Result preview (@PathVariable("tableId") Long tableId) throws IOException { + public Result preview(@PathVariable("tableId") Long tableId) throws IOException + { Map dataMap = genTableService.previewCode(tableId); return success(dataMap); } @@ -141,7 +154,8 @@ public class GenController extends BaseController { @RequiresPermissions("tool:gen:code") @Log(title = "代码生成", businessType = BusinessType.GENCODE) @GetMapping("/download/{tableName}") - public void download (HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException { + public void download(@PathVariable("tableName") String tableName) throws IOException + { byte[] data = genTableService.downloadCode(tableName); genCode(response, data); } @@ -152,7 +166,8 @@ public class GenController extends BaseController { @RequiresPermissions("tool:gen:code") @Log(title = "代码生成", businessType = BusinessType.GENCODE) @GetMapping("/genCode/{tableName}") - public Result genCode (@PathVariable("tableName") String tableName) { + public Result genCode(@PathVariable("tableName") String tableName) + { genTableService.generatorCode(tableName); return success(); } @@ -162,9 +177,10 @@ public class GenController extends BaseController { */ @RequiresPermissions("tool:gen:edit") @Log(title = "代码生成", businessType = BusinessType.UPDATE) - @GetMapping("/synchDb/{tableName}") - public Result synchDb (@PathVariable("tableName") String tableName) { - genTableService.synchDb(tableName); + @GetMapping("/synchDb/{tableName}/{dbName}") + public Result synchDb(@PathVariable("tableName") String tableName,@PathVariable("dbName") String dbName) + { + genTableService.synchDb(tableName,dbName); return success(); } @@ -174,7 +190,8 @@ public class GenController extends BaseController { @RequiresPermissions("tool:gen:code") @Log(title = "代码生成", businessType = BusinessType.GENCODE) @GetMapping("/batchGenCode") - public void batchGenCode (HttpServletResponse response, String tables) throws IOException { + public void batchGenCode(@RequestParam("tables") String tables) throws IOException + { String[] tableNames = Convert.toStrArray(tables); byte[] data = genTableService.downloadCode(tableNames); genCode(response, data); @@ -183,11 +200,37 @@ public class GenController extends BaseController { /** * 生成zip文件 */ - private void genCode (HttpServletResponse response, byte[] data) throws IOException { + private void genCode(HttpServletResponse response, byte[] data) throws IOException + { response.reset(); - response.setHeader("Content-Disposition", "attachment; filename=\"muyu.zip\""); - response.addHeader("Content-Length", String.valueOf(data.length)); + response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\""); + response.addHeader("Content-Length", "" + data.length); response.setContentType("application/octet-stream; charset=UTF-8"); IOUtils.write(data, response.getOutputStream()); } + + /** + * 查询所有数据库名称 + */ + @GetMapping("/db/selDbNameAll") + public Result> selDbNameAll(){ + return Result.success(genTableService.selDbNameAll()); + } + + /** + * 查询所有表,不分数据库 + */ + @GetMapping("/db/listAll") + public Result> genListAll() { + return success(genTableService.selectDbTableListAll()); + } + + /** + * 根据数据库名称与表名称查询表字段 + */ + @GetMapping("/selectDbTableColumnsByName") + public Result> selTableAll(@RequestParam("dbName") String dbName,@RequestParam("table") String table){ + List genTableColumns = genTableColumnService.selectDbTableColumnsByName(table, dbName); + return Result.success(genTableColumns); + } } diff --git a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/domain/GenTable.java b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/domain/GenTable.java index edb6510..c906725 100644 --- a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/domain/GenTable.java +++ b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/domain/GenTable.java @@ -35,6 +35,8 @@ public class GenTable extends BaseEntity { */ private Long tableId; + private String dbName; + /** * 表名称 */ diff --git a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/domain/GenTableResp.java b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/domain/GenTableResp.java new file mode 100644 index 0000000..70b30dc --- /dev/null +++ b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/domain/GenTableResp.java @@ -0,0 +1,43 @@ +package com.muyu.gen.domain; + +import com.muyu.common.core.constant.GenConstants; +import com.muyu.common.core.utils.StringUtils; +import com.muyu.common.core.web.domain.BaseEntity; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.apache.commons.lang3.ArrayUtils; + +import java.util.List; + + +/** + * 业务表 gen_table + * + * @author muyu + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class GenTableResp extends BaseEntity { + + private String dbName; + + /** + * 表名称 + */ + private String tableName; + + /** + * 表描述 + */ + private String tableComment; + + +} diff --git a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/mapper/GenTableColumnMapper.java b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/mapper/GenTableColumnMapper.java index 5825d59..76f5909 100644 --- a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/mapper/GenTableColumnMapper.java +++ b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/mapper/GenTableColumnMapper.java @@ -1,67 +1,64 @@ package com.muyu.gen.mapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.muyu.gen.domain.GenTableColumn; +import org.apache.ibatis.annotations.Param; import java.util.List; + /** * 业务字段 数据层 * - * @author muyu + * @author ruoyi */ -public interface GenTableColumnMapper extends BaseMapper { +public interface GenTableColumnMapper +{ /** * 根据表名称查询列信息 * * @param tableName 表名称 - * + * @param dbName * @return 列信息 */ - List selectDbTableColumnsByName (String tableName); + public List selectDbTableColumnsByName(@Param("tableName") String tableName, @Param("dbName") String dbName); /** * 查询业务字段列表 * * @param tableId 业务字段编号 - * * @return 业务字段集合 */ - List selectGenTableColumnListByTableId (Long tableId); + public List selectGenTableColumnListByTableId(@Param("tableId") Long tableId); /** * 新增业务字段 * * @param genTableColumn 业务字段信息 - * * @return 结果 */ - int insertGenTableColumn (GenTableColumn genTableColumn); + public int insertGenTableColumn(GenTableColumn genTableColumn); /** * 修改业务字段 * * @param genTableColumn 业务字段信息 - * * @return 结果 */ - int updateGenTableColumn (GenTableColumn genTableColumn); + public int updateGenTableColumn(GenTableColumn genTableColumn); /** * 删除业务字段 * * @param genTableColumns 列数据 - * * @return 结果 */ - int deleteGenTableColumns (List genTableColumns); + public int deleteGenTableColumns(@Param("genTableColumns") List genTableColumns); /** * 批量删除业务字段 * * @param ids 需要删除的数据ID - * * @return 结果 */ - int deleteGenTableColumnByIds (Long[] ids); + public int deleteGenTableColumnByIds(@Param("ids") Long[] ids); } diff --git a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/mapper/GenTableMapper.java b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/mapper/GenTableMapper.java index 66858cb..aa49b3f 100644 --- a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/mapper/GenTableMapper.java +++ b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/mapper/GenTableMapper.java @@ -1,92 +1,91 @@ package com.muyu.gen.mapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.muyu.gen.domain.GenTable; +import com.muyu.gen.domain.GenTableResp; +import org.apache.ibatis.annotations.Param; import java.util.List; /** * 业务 数据层 * - * @author muyu + * @author ruoyi */ -public interface GenTableMapper extends BaseMapper { +public interface GenTableMapper +{ /** * 查询业务列表 * * @param genTable 业务信息 - * * @return 业务集合 */ - List selectGenTableList (GenTable genTable); + public List selectGenTableList(GenTable genTable); /** * 查询据库列表 * * @param genTable 业务信息 - * * @return 数据库表集合 */ - List selectDbTableList (GenTable genTable); + public List selectDbTableList(GenTable genTable); /** * 查询据库列表 * * @param tableNames 表名称组 - * + * @param dbName * @return 数据库表集合 */ - List selectDbTableListByNames (String[] tableNames); + public List selectDbTableListByNames(@Param("tableNames") String[] tableNames, @Param("dbName") String dbName); /** * 查询所有表信息 * * @return 表信息集合 */ - List selectGenTableAll (); + public List selectGenTableAll(); /** * 查询表ID业务信息 * * @param id 业务ID - * * @return 业务信息 */ - GenTable selectGenTableById (Long id); + public GenTable selectGenTableById(@Param("id") Long id); /** * 查询表名称业务信息 * * @param tableName 表名称 - * * @return 业务信息 */ - GenTable selectGenTableByName (String tableName); + public GenTable selectGenTableByName(@Param("tableName") String tableName); /** * 新增业务 * * @param genTable 业务信息 - * * @return 结果 */ - int insertGenTable (GenTable genTable); + public int insertGenTable(GenTable genTable); /** * 修改业务 * * @param genTable 业务信息 - * * @return 结果 */ - int updateGenTable (GenTable genTable); + public int updateGenTable(GenTable genTable); /** * 批量删除业务 * * @param ids 需要删除的数据ID - * * @return 结果 */ - int deleteGenTableByIds (Long[] ids); + public int deleteGenTableByIds(@Param("ids") Long[] ids); + + List selDbNameAll(); + + List selectDbTableListAll(); } diff --git a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/service/GenTableColumnServiceImpl.java b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/service/GenTableColumnServiceImpl.java index 895b1ed..043c83b 100644 --- a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/service/GenTableColumnServiceImpl.java +++ b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/service/GenTableColumnServiceImpl.java @@ -3,7 +3,7 @@ package com.muyu.gen.service; import com.muyu.common.core.text.Convert; import com.muyu.gen.domain.GenTableColumn; import com.muyu.gen.mapper.GenTableColumnMapper; -import org.springframework.beans.factory.annotation.Autowired; + import javax.annotation.Resource; import org.springframework.stereotype.Service; import java.util.List; @@ -11,58 +11,64 @@ import java.util.List; /** * 业务字段 服务层实现 * - * @author muyu + * @author ruoyi */ @Service -public class GenTableColumnServiceImpl implements IGenTableColumnService { - @Autowired - private GenTableColumnMapper genTableColumnMapper; +public class GenTableColumnServiceImpl implements IGenTableColumnService +{ + @Resource + private GenTableColumnMapper genTableColumnMapper; - /** + /** * 查询业务字段列表 * * @param tableId 业务字段编号 - * * @return 业务字段集合 */ - @Override - public List selectGenTableColumnListByTableId (Long tableId) { - return genTableColumnMapper.selectGenTableColumnListByTableId(tableId); - } + @Override + public List selectGenTableColumnListByTableId(Long tableId) + { + return genTableColumnMapper.selectGenTableColumnListByTableId(tableId); + } /** * 新增业务字段 * * @param genTableColumn 业务字段信息 - * * @return 结果 */ - @Override - public int insertGenTableColumn (GenTableColumn genTableColumn) { - return genTableColumnMapper.insertGenTableColumn(genTableColumn); - } + @Override + public int insertGenTableColumn(GenTableColumn genTableColumn) + { + return genTableColumnMapper.insertGenTableColumn(genTableColumn); + } - /** + /** * 修改业务字段 * * @param genTableColumn 业务字段信息 - * * @return 结果 */ - @Override - public int updateGenTableColumn (GenTableColumn genTableColumn) { - return genTableColumnMapper.updateGenTableColumn(genTableColumn); - } + @Override + public int updateGenTableColumn(GenTableColumn genTableColumn) + { + return genTableColumnMapper.updateGenTableColumn(genTableColumn); + } - /** + /** * 删除业务字段对象 * * @param ids 需要删除的数据ID - * * @return 结果 */ + @Override + public int deleteGenTableColumnByIds(String ids) + { + return genTableColumnMapper.deleteGenTableColumnByIds(Convert.toLongArray(ids)); + } + @Override - public int deleteGenTableColumnByIds (String ids) { - return genTableColumnMapper.deleteGenTableColumnByIds(Convert.toLongArray(ids)); + public List selectDbTableColumnsByName(String table, String dbName) { + return genTableColumnMapper.selectDbTableColumnsByName(table,dbName); } } diff --git a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/service/GenTableServiceImpl.java b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/service/GenTableServiceImpl.java index 6273779..8cdefc5 100644 --- a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/service/GenTableServiceImpl.java +++ b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/service/GenTableServiceImpl.java @@ -10,6 +10,7 @@ import com.muyu.common.core.utils.StringUtils; import com.muyu.common.security.utils.SecurityUtils; import com.muyu.gen.domain.GenTable; import com.muyu.gen.domain.GenTableColumn; +import com.muyu.gen.domain.GenTableResp; import com.muyu.gen.mapper.GenTableColumnMapper; import com.muyu.gen.mapper.GenTableMapper; import com.muyu.gen.util.GenUtils; @@ -22,7 +23,7 @@ import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; + import javax.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -41,43 +42,28 @@ import java.util.zip.ZipOutputStream; /** * 业务 服务层实现 * - * @author muyu + * @author ruoyi */ @Service -public class GenTableServiceImpl implements IGenTableService { +public class GenTableServiceImpl implements IGenTableService +{ private static final Logger log = LoggerFactory.getLogger(GenTableServiceImpl.class); - @Autowired + @Resource private GenTableMapper genTableMapper; - @Autowired + @Resource private GenTableColumnMapper genTableColumnMapper; - /** - * 获取代码生成地址 - * - * @param table 业务表信息 - * @param template 模板文件路径 - * - * @return 生成地址 - */ - public static String getGenPath (GenTable table, String template) { - String genPath = table.getGenPath(); - if (StringUtils.equals(genPath, "/")) { - return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); - } - return genPath + File.separator + VelocityUtils.getFileName(template, table); - } - /** * 查询业务信息 * * @param id 业务ID - * * @return 业务信息 */ @Override - public GenTable selectGenTableById (Long id) { + public GenTable selectGenTableById(Long id) + { GenTable genTable = genTableMapper.selectGenTableById(id); setTableFromOptions(genTable); return genTable; @@ -87,11 +73,11 @@ public class GenTableServiceImpl implements IGenTableService { * 查询业务列表 * * @param genTable 业务信息 - * * @return 业务集合 */ @Override - public List selectGenTableList (GenTable genTable) { + public List selectGenTableList(GenTable genTable) + { return genTableMapper.selectGenTableList(genTable); } @@ -99,11 +85,11 @@ public class GenTableServiceImpl implements IGenTableService { * 查询据库列表 * * @param genTable 业务信息 - * * @return 数据库表集合 */ @Override - public List selectDbTableList (GenTable genTable) { + public List selectDbTableList(GenTable genTable) + { return genTableMapper.selectDbTableList(genTable); } @@ -111,12 +97,13 @@ public class GenTableServiceImpl implements IGenTableService { * 查询据库列表 * * @param tableNames 表名称组 - * + * @param dbName * @return 数据库表集合 */ @Override - public List selectDbTableListByNames (String[] tableNames) { - return genTableMapper.selectDbTableListByNames(tableNames); + public List selectDbTableListByNames(String[] tableNames, String dbName) + { + return genTableMapper.selectDbTableListByNames(tableNames,dbName); } /** @@ -125,7 +112,8 @@ public class GenTableServiceImpl implements IGenTableService { * @return 表信息集合 */ @Override - public List selectGenTableAll () { + public List selectGenTableAll() + { return genTableMapper.selectGenTableAll(); } @@ -133,17 +121,19 @@ public class GenTableServiceImpl implements IGenTableService { * 修改业务 * * @param genTable 业务信息 - * * @return 结果 */ @Override @Transactional(rollbackFor = Exception.class) - public void updateGenTable (GenTable genTable) { + public void updateGenTable(GenTable genTable) + { String options = JSON.toJSONString(genTable.getParams()); genTable.setOptions(options); int row = genTableMapper.updateGenTable(genTable); - if (row > 0) { - for (GenTableColumn cenTableColumn : genTable.getColumns()) { + if (row > 0) + { + for (GenTableColumn cenTableColumn : genTable.getColumns()) + { genTableColumnMapper.updateGenTableColumn(cenTableColumn); } } @@ -153,12 +143,12 @@ public class GenTableServiceImpl implements IGenTableService { * 删除业务对象 * * @param tableIds 需要删除的数据ID - * * @return 结果 */ @Override @Transactional(rollbackFor = Exception.class) - public void deleteGenTableByIds (Long[] tableIds) { + public void deleteGenTableByIds(Long[] tableIds) + { genTableMapper.deleteGenTableByIds(tableIds); genTableColumnMapper.deleteGenTableColumnByIds(tableIds); } @@ -170,23 +160,31 @@ public class GenTableServiceImpl implements IGenTableService { */ @Override @Transactional(rollbackFor = Exception.class) - public void importGenTable (List tableList) { + public void importGenTable(List tableList) + { String operName = SecurityUtils.getUsername(); - try { - for (GenTable table : tableList) { + try + { + for (GenTable table : tableList) + { + String dbName = table.getDbName(); String tableName = table.getTableName(); GenUtils.initTable(table, operName); int row = genTableMapper.insertGenTable(table); - if (row > 0) { + if (row > 0) + { // 保存列信息 - List genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); - for (GenTableColumn column : genTableColumns) { + List genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName, dbName); + for (GenTableColumn column : genTableColumns) + { GenUtils.initColumnField(column, table); genTableColumnMapper.insertGenTableColumn(column); } } } - } catch (Exception e) { + } + catch (Exception e) + { throw new ServiceException("导入失败:" + e.getMessage()); } } @@ -195,11 +193,11 @@ public class GenTableServiceImpl implements IGenTableService { * 预览代码 * * @param tableId 表编号 - * * @return 预览数据列表 */ @Override - public Map previewCode (Long tableId) { + public Map previewCode(Long tableId) + { Map dataMap = new LinkedHashMap<>(); // 查询表信息 GenTable table = genTableMapper.selectGenTableById(tableId); @@ -213,7 +211,8 @@ public class GenTableServiceImpl implements IGenTableService { // 获取模板列表 List templates = VelocityUtils.getTemplateList(table.getTplCategory()); - for (String template : templates) { + for (String template : templates) + { // 渲染模板 StringWriter sw = new StringWriter(); Template tpl = Velocity.getTemplate(template, Constants.UTF8); @@ -227,11 +226,11 @@ public class GenTableServiceImpl implements IGenTableService { * 生成代码(下载方式) * * @param tableName 表名称 - * * @return 数据 */ @Override - public byte[] downloadCode (String tableName) { + public byte[] downloadCode(String tableName) + { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(outputStream); generatorCode(tableName, zip); @@ -245,7 +244,8 @@ public class GenTableServiceImpl implements IGenTableService { * @param tableName 表名称 */ @Override - public void generatorCode (String tableName) { + public void generatorCode(String tableName) + { // 查询表信息 GenTable table = genTableMapper.selectGenTableByName(tableName); // 设置主子表信息 @@ -259,16 +259,21 @@ public class GenTableServiceImpl implements IGenTableService { // 获取模板列表 List templates = VelocityUtils.getTemplateList(table.getTplCategory()); - for (String template : templates) { - if (!StringUtils.containsAny(template, "sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm")) { + for (String template : templates) + { + if (!StringUtils.containsAny(template, "sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm")) + { // 渲染模板 StringWriter sw = new StringWriter(); Template tpl = Velocity.getTemplate(template, Constants.UTF8); tpl.merge(context, sw); - try { + try + { String path = getGenPath(table, template); FileUtils.writeStringToFile(new File(path), sw.toString(), CharsetKit.UTF_8); - } catch (IOException e) { + } + catch (IOException e) + { throw new ServiceException("渲染模板失败,表名:" + table.getTableName()); } } @@ -279,45 +284,54 @@ public class GenTableServiceImpl implements IGenTableService { * 同步数据库 * * @param tableName 表名称 + * @param dbName */ @Override @Transactional(rollbackFor = Exception.class) - public void synchDb (String tableName) { + public void synchDb(String tableName, String dbName) + { GenTable table = genTableMapper.selectGenTableByName(tableName); List tableColumns = table.getColumns(); Map tableColumnMap = tableColumns.stream().collect(Collectors.toMap(GenTableColumn::getColumnName, Function.identity())); - List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); - if (StringUtils.isEmpty(dbTableColumns)) { + List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName, dbName); + if (StringUtils.isEmpty(dbTableColumns)) + { throw new ServiceException("同步数据失败,原表结构不存在"); } List dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); dbTableColumns.forEach(column -> { GenUtils.initColumnField(column, table); - if (tableColumnMap.containsKey(column.getColumnName())) { + if (tableColumnMap.containsKey(column.getColumnName())) + { GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName()); column.setColumnId(prevColumn.getColumnId()); - if (column.isList()) { + if (column.isList()) + { // 如果是列表,继续保留查询方式/字典类型选项 column.setDictType(prevColumn.getDictType()); column.setQueryType(prevColumn.getQueryType()); } if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk() && (column.isInsert() || column.isEdit()) - && ((column.isUsableColumn()) || (!column.isSuperColumn()))) { + && ((column.isUsableColumn()) || (!column.isSuperColumn()))) + { // 如果是(新增/修改&非主键/非忽略及父属性),继续保留必填/显示类型选项 column.setIsRequired(prevColumn.getIsRequired()); column.setHtmlType(prevColumn.getHtmlType()); } genTableColumnMapper.updateGenTableColumn(column); - } else { + } + else + { genTableColumnMapper.insertGenTableColumn(column); } }); List delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList()); - if (StringUtils.isNotEmpty(delColumns)) { + if (StringUtils.isNotEmpty(delColumns)) + { genTableColumnMapper.deleteGenTableColumns(delColumns); } } @@ -326,14 +340,15 @@ public class GenTableServiceImpl implements IGenTableService { * 批量生成代码(下载方式) * * @param tableNames 表数组 - * * @return 数据 */ @Override - public byte[] downloadCode (String[] tableNames) { + public byte[] downloadCode(String[] tableNames) + { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(outputStream); - for (String tableName : tableNames) { + for (String tableName : tableNames) + { generatorCode(tableName, zip); } IOUtils.closeQuietly(zip); @@ -343,7 +358,8 @@ public class GenTableServiceImpl implements IGenTableService { /** * 查询表信息并生成代码 */ - private void generatorCode (String tableName, ZipOutputStream zip) { + private void generatorCode(String tableName, ZipOutputStream zip) + { // 查询表信息 GenTable table = genTableMapper.selectGenTableByName(tableName); // 设置主子表信息 @@ -357,19 +373,23 @@ public class GenTableServiceImpl implements IGenTableService { // 获取模板列表 List templates = VelocityUtils.getTemplateList(table.getTplCategory()); - for (String template : templates) { + for (String template : templates) + { // 渲染模板 StringWriter sw = new StringWriter(); Template tpl = Velocity.getTemplate(template, Constants.UTF8); tpl.merge(context, sw); - try { + try + { // 添加到zip zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table))); IOUtils.write(sw.toString(), zip, Constants.UTF8); IOUtils.closeQuietly(sw); zip.flush(); zip.closeEntry(); - } catch (IOException e) { + } + catch (IOException e) + { log.error("渲染模板失败,表名:" + table.getTableName(), e); } } @@ -381,49 +401,80 @@ public class GenTableServiceImpl implements IGenTableService { * @param genTable 业务信息 */ @Override - public void validateEdit (GenTable genTable) { - if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) { + public void validateEdit(GenTable genTable) + { + if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) + { String options = JSON.toJSONString(genTable.getParams()); JSONObject paramsObj = JSON.parseObject(options); - if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) { + if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) + { throw new ServiceException("树编码字段不能为空"); - } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) { + } + else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) + { throw new ServiceException("树父编码字段不能为空"); - } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) { + } + else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) + { throw new ServiceException("树名称字段不能为空"); - } else if (GenConstants.TPL_SUB.equals(genTable.getTplCategory())) { - if (StringUtils.isEmpty(genTable.getSubTableName())) { + } + else if (GenConstants.TPL_SUB.equals(genTable.getTplCategory())) + { + if (StringUtils.isEmpty(genTable.getSubTableName())) + { throw new ServiceException("关联子表的表名不能为空"); - } else if (StringUtils.isEmpty(genTable.getSubTableFkName())) { + } + else if (StringUtils.isEmpty(genTable.getSubTableFkName())) + { throw new ServiceException("子表关联的外键名不能为空"); } } } } + @Override + public List selDbNameAll() { + return genTableMapper.selDbNameAll(); + } + + @Override + public List selectDbTableListAll() { + return genTableMapper.selectDbTableListAll(); + } + + /** * 设置主键列信息 * * @param table 业务表信息 */ - public void setPkColumn (GenTable table) { - for (GenTableColumn column : table.getColumns()) { - if (column.isPk()) { + public void setPkColumn(GenTable table) + { + for (GenTableColumn column : table.getColumns()) + { + if (column.isPk()) + { table.setPkColumn(column); break; } } - if (StringUtils.isNull(table.getPkColumn())) { + if (StringUtils.isNull(table.getPkColumn())) + { table.setPkColumn(table.getColumns().get(0)); } - if (GenConstants.TPL_SUB.equals(table.getTplCategory())) { - for (GenTableColumn column : table.getSubTable().getColumns()) { - if (column.isPk()) { + if (GenConstants.TPL_SUB.equals(table.getTplCategory())) + { + for (GenTableColumn column : table.getSubTable().getColumns()) + { + if (column.isPk()) + { table.getSubTable().setPkColumn(column); break; } } - if (StringUtils.isNull(table.getSubTable().getPkColumn())) { + if (StringUtils.isNull(table.getSubTable().getPkColumn())) + { table.getSubTable().setPkColumn(table.getSubTable().getColumns().get(0)); } } @@ -434,9 +485,11 @@ public class GenTableServiceImpl implements IGenTableService { * * @param table 业务表信息 */ - public void setSubTable (GenTable table) { + public void setSubTable(GenTable table) + { String subTableName = table.getSubTableName(); - if (StringUtils.isNotEmpty(subTableName)) { + if (StringUtils.isNotEmpty(subTableName)) + { table.setSubTable(genTableMapper.selectGenTableByName(subTableName)); } } @@ -446,9 +499,11 @@ public class GenTableServiceImpl implements IGenTableService { * * @param genTable 设置后的生成对象 */ - public void setTableFromOptions (GenTable genTable) { + public void setTableFromOptions(GenTable genTable) + { JSONObject paramsObj = JSON.parseObject(genTable.getOptions()); - if (StringUtils.isNotNull(paramsObj)) { + if (StringUtils.isNotNull(paramsObj)) + { String treeCode = paramsObj.getString(GenConstants.TREE_CODE); String treeParentCode = paramsObj.getString(GenConstants.TREE_PARENT_CODE); String treeName = paramsObj.getString(GenConstants.TREE_NAME); @@ -462,4 +517,21 @@ public class GenTableServiceImpl implements IGenTableService { genTable.setParentMenuName(parentMenuName); } } + + /** + * 获取代码生成地址 + * + * @param table 业务表信息 + * @param template 模板文件路径 + * @return 生成地址 + */ + public static String getGenPath(GenTable table, String template) + { + String genPath = table.getGenPath(); + if (StringUtils.equals(genPath, "/")) + { + return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); + } + return genPath + File.separator + VelocityUtils.getFileName(template, table); + } } diff --git a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/service/IGenTableColumnService.java b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/service/IGenTableColumnService.java index b60ea57..e6d4d55 100644 --- a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/service/IGenTableColumnService.java +++ b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/service/IGenTableColumnService.java @@ -7,42 +7,41 @@ import java.util.List; /** * 业务字段 服务层 * - * @author muyu + * @author ruoyi */ -public interface IGenTableColumnService { +public interface IGenTableColumnService +{ /** * 查询业务字段列表 * * @param tableId 业务字段编号 - * * @return 业务字段集合 */ - List selectGenTableColumnListByTableId (Long tableId); + public List selectGenTableColumnListByTableId(Long tableId); /** * 新增业务字段 * * @param genTableColumn 业务字段信息 - * * @return 结果 */ - int insertGenTableColumn (GenTableColumn genTableColumn); + public int insertGenTableColumn(GenTableColumn genTableColumn); /** * 修改业务字段 * * @param genTableColumn 业务字段信息 - * * @return 结果 */ - int updateGenTableColumn (GenTableColumn genTableColumn); + public int updateGenTableColumn(GenTableColumn genTableColumn); /** * 删除业务字段信息 * * @param ids 需要删除的数据ID - * * @return 结果 */ - int deleteGenTableColumnByIds (String ids); + public int deleteGenTableColumnByIds(String ids); + + List selectDbTableColumnsByName(String table, String dbName); } diff --git a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/service/IGenTableService.java b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/service/IGenTableService.java index f34dc37..f79d5e8 100644 --- a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/service/IGenTableService.java +++ b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/service/IGenTableService.java @@ -1,6 +1,7 @@ package com.muyu.gen.service; import com.muyu.gen.domain.GenTable; +import com.muyu.gen.domain.GenTableResp; import java.util.List; import java.util.Map; @@ -8,124 +9,121 @@ import java.util.Map; /** * 业务 服务层 * - * @author muyu + * @author ruoyi */ -public interface IGenTableService { +public interface IGenTableService +{ /** * 查询业务列表 * * @param genTable 业务信息 - * * @return 业务集合 */ - List selectGenTableList (GenTable genTable); + public List selectGenTableList(GenTable genTable); /** * 查询据库列表 * * @param genTable 业务信息 - * * @return 数据库表集合 */ - List selectDbTableList (GenTable genTable); + public List selectDbTableList(GenTable genTable); /** * 查询据库列表 * * @param tableNames 表名称组 - * + * @param dbName * @return 数据库表集合 */ - List selectDbTableListByNames (String[] tableNames); + public List selectDbTableListByNames(String[] tableNames, String dbName); /** * 查询所有表信息 * * @return 表信息集合 */ - List selectGenTableAll (); + public List selectGenTableAll(); /** * 查询业务信息 * * @param id 业务ID - * * @return 业务信息 */ - GenTable selectGenTableById (Long id); + public GenTable selectGenTableById(Long id); /** * 修改业务 * * @param genTable 业务信息 - * * @return 结果 */ - void updateGenTable (GenTable genTable); + public void updateGenTable(GenTable genTable); /** * 删除业务信息 * * @param tableIds 需要删除的表数据ID - * * @return 结果 */ - void deleteGenTableByIds (Long[] tableIds); + public void deleteGenTableByIds(Long[] tableIds); /** * 导入表结构 * * @param tableList 导入表列表 */ - void importGenTable (List tableList); + public void importGenTable(List tableList); /** * 预览代码 * * @param tableId 表编号 - * * @return 预览数据列表 */ - Map previewCode (Long tableId); + public Map previewCode(Long tableId); /** * 生成代码(下载方式) * * @param tableName 表名称 - * * @return 数据 */ - byte[] downloadCode (String tableName); + public byte[] downloadCode(String tableName); /** * 生成代码(自定义路径) * * @param tableName 表名称 - * * @return 数据 */ - void generatorCode (String tableName); + public void generatorCode(String tableName); /** * 同步数据库 * * @param tableName 表名称 + * @param dbName */ - void synchDb (String tableName); + public void synchDb(String tableName, String dbName); /** * 批量生成代码(下载方式) * * @param tableNames 表数组 - * * @return 数据 */ - byte[] downloadCode (String[] tableNames); + public byte[] downloadCode(String[] tableNames); /** * 修改保存参数校验 * * @param genTable 业务信息 */ - void validateEdit (GenTable genTable); + public void validateEdit(GenTable genTable); + + List selDbNameAll(); + + List selectDbTableListAll(); } diff --git a/cloud-modules/cloud-modules-gen/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-gen/src/main/resources/bootstrap.yml index 1c734ba..47acae2 100644 --- a/cloud-modules/cloud-modules-gen/src/main/resources/bootstrap.yml +++ b/cloud-modules/cloud-modules-gen/src/main/resources/bootstrap.yml @@ -1,16 +1,20 @@ # Tomcat server: - port: 9202 + port: 9709 # nacos线上地址 nacos: - addr: 106.54.193.225:8848 + addr: 47.116.173.119:8848 user-name: nacos password: nacos - namespace: one - + namespace: one-saas +# SPRING_AMQP_DESERIALIZATION_TRUST_ALL=true spring.amqp.deserialization.trust.all # Spring spring: + amqp: + deserialization: + trust: + all: true main: allow-bean-definition-overriding: true application: @@ -49,3 +53,8 @@ spring: - application-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} # xxl-job 配置文件 - application-xxl-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + # rabbit 配置文件 + - application-rabbit-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} +logging: + level: + com.muyu.system.mapper: DEBUG diff --git a/cloud-modules/cloud-modules-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/cloud-modules/cloud-modules-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml index fb9800e..ea0616b 100644 --- a/cloud-modules/cloud-modules-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml +++ b/cloud-modules/cloud-modules-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -1,58 +1,36 @@ +PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" +"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - select column_id, - table_id, - column_name, - column_comment, - column_type, - java_type, - java_field, - is_pk, - is_increment, - is_required, - is_insert, - is_edit, - is_list, - is_query, - query_type, - html_type, - dict_type, - sort, - create_by, - create_time, - update_by, - update_time - from gen_table_column + + select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column + select column_name, (case when (is_nullable = 'no' column_key != 'PRI') then '1' else null end) as is_required, (case when column_key = 'PRI' then '1' else '0' end) as is_pk, ordinal_position as sort, column_comment, (case when extra = 'auto_increment' then '1' else '0' end) as is_increment, column_type + from information_schema.columns where + + and table_name = (#{tableName}) + order by ordinal_position + insert into gen_table_column ( - table_id, - column_name, - column_comment, - column_type, - java_type, - java_field, - is_pk, - is_increment, - is_required, - is_insert, - is_edit, - is_list, - is_query, - query_type, - html_type, - dict_type, - sort, - create_by, - create_time - )values( - #{tableId}, - #{columnName}, - #{columnComment}, - #{columnType}, - #{javaType}, - #{javaField}, - #{isPk}, - #{isIncrement}, - #{isRequired}, - #{isInsert}, - #{isEdit}, - #{isList}, - #{isQuery}, - #{queryType}, - #{htmlType}, - #{dictType}, - #{sort}, - #{createBy}, - sysdate() - ) + table_id, + column_name, + column_comment, + column_type, + java_type, + java_field, + is_pk, + is_increment, + is_required, + is_insert, + is_edit, + is_list, + is_query, + query_type, + html_type, + dict_type, + sort, + create_by, + create_time + )values( + #{tableId}, + #{columnName}, + #{columnComment}, + #{columnType}, + #{javaType}, + #{javaField}, + #{isPk}, + #{isIncrement}, + #{isRequired}, + #{isInsert}, + #{isEdit}, + #{isList}, + #{isQuery}, + #{queryType}, + #{htmlType}, + #{dictType}, + #{sort}, + #{createBy}, + sysdate() + ) @@ -141,17 +113,20 @@ - delete from gen_table_column where table_id in - + delete from gen_table_column where table_id in ( + #{tableId} + ) + - delete from gen_table_column where column_id in - + delete from gen_table_column where column_id in ( + #{item.columnId} + ) diff --git a/cloud-modules/cloud-modules-gen/src/main/resources/mapper/generator/GenTableMapper.xml b/cloud-modules/cloud-modules-gen/src/main/resources/mapper/generator/GenTableMapper.xml index 42ab2cf..ba9b0cf 100644 --- a/cloud-modules/cloud-modules-gen/src/main/resources/mapper/generator/GenTableMapper.xml +++ b/cloud-modules/cloud-modules-gen/src/main/resources/mapper/generator/GenTableMapper.xml @@ -1,291 +1,208 @@ +PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" +"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - select table_id, - table_name, - table_comment, - sub_table_name, - sub_table_fk_name, - class_name, - tpl_category, - package_name, - module_name, - business_name, - function_name, - function_author, - gen_type, - gen_path, - options, - create_by, - create_time, - update_by, - update_time, - remark - from gen_table + + select table_id, db_name, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table + + + + table_schema in (#{dbName}) + + + table_schema = (select database()) + + + + + + + + AND lower(table_name) like lower(concat('%', #{tableName}, '%')) + + + AND lower(table_comment) like lower(concat('%', #{tableComment}, '%')) + + + AND date_format(create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d') + + + AND date_format(create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d') + + + - + select table_name, table_comment, create_time, update_time from information_schema.tables + where + + AND table_name NOT LIKE 'qrtz_%' AND table_name NOT LIKE 'gen_%' + AND table_name NOT IN (select table_name from gen_table) + + AND lower(table_name) like lower(concat('%', #{tableName}, '%')) + + + AND lower(table_comment) like lower(concat('%', #{tableComment}, '%')) + + + AND date_format(create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d') + + + AND date_format(create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d') + order by create_time desc - + - + select table_name, table_schema db_name, table_comment, create_time, update_time from information_schema.tables + where table_name NOT LIKE 'qrtz_%' and table_name NOT LIKE 'gen_%' + and + and table_name in + + #{name} - + - + - + - + - + + + + + + insert into gen_table ( - table_name, - table_comment, - class_name, - tpl_category, - package_name, - module_name, - business_name, - function_name, - function_author, - gen_type, - gen_path, - remark, - create_by, - create_time - )values( - #{tableName}, - #{tableComment}, - #{className}, - #{tplCategory}, - #{packageName}, - #{moduleName}, - #{businessName}, - #{functionName}, - #{functionAuthor}, - #{genType}, - #{genPath}, - #{remark}, - #{createBy}, - sysdate() - ) + db_name, + table_name, + table_comment, + class_name, + tpl_category, + package_name, + module_name, + business_name, + function_name, + function_author, + gen_type, + gen_path, + remark, + create_by, + create_time + )values( + #{dbName}, + #{tableName}, + #{tableComment}, + #{className}, + #{tplCategory}, + #{packageName}, + #{moduleName}, + #{businessName}, + #{functionName}, + #{functionAuthor}, + #{genType}, + #{genPath}, + #{remark}, + #{createBy}, + sysdate() + ) update gen_table + db_name = #{dbName}, table_name = #{tableName}, table_comment = #{tableComment}, sub_table_name = #{subTableName}, @@ -294,8 +211,7 @@ function_author = #{functionAuthor}, gen_type = #{genType}, gen_path = #{genPath}, - tpl_category = #{tplCategory}, - package_name = #{packageName}, + tpl_category = #{tplCategory}, package_name = #{packageName}, module_name = #{moduleName}, business_name = #{businessName}, function_name = #{functionName}, @@ -308,10 +224,11 @@ - delete from gen_table where table_id in - + delete from gen_table where table_id in ( + #{tableId} + ) diff --git a/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/controller.java.vm b/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/controller.java.vm index 1df5be0..c62cc8b 100644 --- a/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/controller.java.vm +++ b/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/controller.java.vm @@ -1,9 +1,9 @@ package ${packageName}.controller; +import java.util.Arrays; import java.util.List; -import java.io.IOException; import jakarta.servlet.http.HttpServletResponse; -import org.springframework.beans.factory.annotation.Autowired; +import javax.annotation.Resource; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; @@ -12,14 +12,14 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.muyu.common.log.annotation.Log; -import com.muyu.common.log.enums.BusinessType; import com.muyu.common.security.annotation.RequiresPermissions; import ${packageName}.domain.${ClassName}; import ${packageName}.service.I${ClassName}Service; import com.muyu.common.core.web.controller.BaseController; import com.muyu.common.core.domain.Result; import com.muyu.common.core.utils.poi.ExcelUtil; +import com.muyu.common.security.utils.SecurityUtils; +import org.springframework.validation.annotation.Validated; #if($table.crud || $table.sub) import com.muyu.common.core.web.page.TableDataInfo; #elseif($table.tree) @@ -35,7 +35,7 @@ import com.muyu.common.core.web.page.TableDataInfo; @RequestMapping("/${businessName}") public class ${ClassName}Controller extends BaseController { - @Autowired + @Resource private I${ClassName}Service ${className}Service; /** @@ -44,14 +44,14 @@ public class ${ClassName}Controller extends BaseController @RequiresPermissions("${permissionPrefix}:list") @GetMapping("/list") #if($table.crud || $table.sub) - public Result list(${ClassName} ${className}) + public Result> list(${ClassName} ${className}) { startPage(); List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); return getDataTable(list); } #elseif($table.tree) - public Result list(${ClassName} ${className}) + public Result<${ClassName}> list(${ClassName} ${className}) { List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); return success(list); @@ -62,7 +62,6 @@ public class ${ClassName}Controller extends BaseController * 导出${functionName}列表 */ @RequiresPermissions("${permissionPrefix}:export") - @Log(title = "${functionName}", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, ${ClassName} ${className}) { @@ -76,7 +75,7 @@ public class ${ClassName}Controller extends BaseController */ @RequiresPermissions("${permissionPrefix}:query") @GetMapping(value = "/{${pkColumn.javaField}}") - public Result getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) + public Result> getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) { return success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); } @@ -85,32 +84,40 @@ public class ${ClassName}Controller extends BaseController * 新增${functionName} */ @RequiresPermissions("${permissionPrefix}:add") - @Log(title = "${functionName}", businessType = BusinessType.INSERT) @PostMapping - public Result add(@RequestBody ${ClassName} ${className}) + public Result add( + @Validated @RequestBody ${ClassName} ${className}) { - return toAjax(${className}Service.insert${ClassName}(${className})); + if (${className}Service.checkIdUnique(${className})) { + return error("新增 ${functionName} '" + ${className} + "'失败,${functionName}已存在"); + } + ${className}.setCreateBy(SecurityUtils.getUsername()); + return toAjax(${className}Service.save(${className})); } /** * 修改${functionName} */ @RequiresPermissions("${permissionPrefix}:edit") - @Log(title = "${functionName}", businessType = BusinessType.UPDATE) @PutMapping - public Result edit(@RequestBody ${ClassName} ${className}) + public Result edit( + @Validated @RequestBody ${ClassName} ${className}) { - return toAjax(${className}Service.update${ClassName}(${className})); + if (!${className}Service.checkIdUnique(${className})) { + return error("修改 ${functionName} '" + ${className} + "'失败,${functionName}不存在"); + } + ${className}.setUpdateBy(SecurityUtils.getUsername()); + return toAjax(${className}Service.updateById(${className})); } /** * 删除${functionName} */ @RequiresPermissions("${permissionPrefix}:remove") - @Log(title = "${functionName}", businessType = BusinessType.DELETE) @DeleteMapping("/{${pkColumn.javaField}s}") - public Result remove(@PathVariable("${pkColumn.javaField}s") ${pkColumn.javaType}[] ${pkColumn.javaField}s) + public Result remove(@PathVariable("${pkColumn.javaField}s") ${pkColumn.javaType}[] ${pkColumn.javaField}s) { - return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s)); + ${className}Service.removeBatchByIds(Arrays.asList(${pkColumn.javaField}s)); + return success(); } } diff --git a/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/domain.java.vm b/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/domain.java.vm index 1292991..4c89918 100644 --- a/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/domain.java.vm +++ b/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/domain.java.vm @@ -9,6 +9,13 @@ import com.muyu.common.core.web.domain.BaseEntity; #elseif($table.tree) import com.muyu.common.core.web.domain.TreeEntity; #end +import lombok.*; +import lombok.experimental.SuperBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; /** * ${functionName}对象 ${tableName} @@ -16,13 +23,20 @@ import com.muyu.common.core.web.domain.TreeEntity; * @author ${author} * @date ${datetime} */ + #if($table.crud || $table.sub) #set($Entity="BaseEntity") #elseif($table.tree) #set($Entity="TreeEntity") #end -public class ${ClassName} extends ${Entity} -{ +@Data +@Setter +@Getter +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@TableName("${tableName}") +public class ${ClassName} extends ${Entity}{ private static final long serialVersionUID = 1L; #foreach ($column in $columns) @@ -44,33 +58,19 @@ public class ${ClassName} extends ${Entity} @Excel(name = "${comment}") #end #end + #if($column.javaField == $pkColumn.javaField) + @TableId( type = IdType.AUTO) + #end private $column.javaType $column.javaField; #end #end + #if($table.sub) /** $table.subTable.functionName信息 */ private List<${subClassName}> ${subclassName}List; #end -#foreach ($column in $columns) -#if(!$table.isSuperColumn($column.javaField)) -#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) -#set($AttrName=$column.javaField) -#else -#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) -#end - public void set${AttrName}($column.javaType $column.javaField) - { - this.$column.javaField = $column.javaField; - } - - public $column.javaType get${AttrName}() - { - return $column.javaField; - } -#end -#end #if($table.sub) public List<${subClassName}> get${subClassName}List() diff --git a/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/mapper.java.vm b/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/mapper.java.vm index 7e7d7c2..e6f420b 100644 --- a/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/mapper.java.vm +++ b/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/mapper.java.vm @@ -5,87 +5,16 @@ import ${packageName}.domain.${ClassName}; #if($table.sub) import ${packageName}.domain.${subClassName}; #end +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; /** * ${functionName}Mapper接口 - * + * * @author ${author} * @date ${datetime} */ -public interface ${ClassName}Mapper -{ - /** - * 查询${functionName} - * - * @param ${pkColumn.javaField} ${functionName}主键 - * @return ${functionName} - */ - public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); +@Mapper +public interface ${ClassName}Mapper extends BaseMapper<${ClassName}>{ - /** - * 查询${functionName}列表 - * - * @param ${className} ${functionName} - * @return ${functionName}集合 - */ - public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); - - /** - * 新增${functionName} - * - * @param ${className} ${functionName} - * @return 结果 - */ - public int insert${ClassName}(${ClassName} ${className}); - - /** - * 修改${functionName} - * - * @param ${className} ${functionName} - * @return 结果 - */ - public int update${ClassName}(${ClassName} ${className}); - - /** - * 删除${functionName} - * - * @param ${pkColumn.javaField} ${functionName}主键 - * @return 结果 - */ - public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); - - /** - * 批量删除${functionName} - * - * @param ${pkColumn.javaField}s 需要删除的数据主键集合 - * @return 结果 - */ - public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); -#if($table.sub) - - /** - * 批量删除${subTable.functionName} - * - * @param ${pkColumn.javaField}s 需要删除的数据主键集合 - * @return 结果 - */ - public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); - - /** - * 批量新增${subTable.functionName} - * - * @param ${subclassName}List ${subTable.functionName}列表 - * @return 结果 - */ - public int batch${subClassName}(List<${subClassName}> ${subclassName}List); - - - /** - * 通过${functionName}主键删除${subTable.functionName}信息 - * - * @param ${pkColumn.javaField} ${functionName}ID - * @return 结果 - */ - public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField}); -#end } diff --git a/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/service.java.vm b/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/service.java.vm index 264882b..1a01fae 100644 --- a/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/service.java.vm +++ b/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/service.java.vm @@ -2,18 +2,18 @@ package ${packageName}.service; import java.util.List; import ${packageName}.domain.${ClassName}; +import com.baomidou.mybatisplus.extension.service.IService; /** * ${functionName}Service接口 - * + * * @author ${author} * @date ${datetime} */ -public interface I${ClassName}Service -{ +public interface I${ClassName}Service extends IService<${ClassName}> { /** - * 查询${functionName} - * + * 精确查询${functionName} + * * @param ${pkColumn.javaField} ${functionName}主键 * @return ${functionName} */ @@ -21,41 +21,17 @@ public interface I${ClassName}Service /** * 查询${functionName}列表 - * + * * @param ${className} ${functionName} * @return ${functionName}集合 */ public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); /** - * 新增${functionName} - * + * 判断 ${functionName} id是否唯一 * @param ${className} ${functionName} * @return 结果 */ - public int insert${ClassName}(${ClassName} ${className}); + Boolean checkIdUnique(${ClassName} ${className}); - /** - * 修改${functionName} - * - * @param ${className} ${functionName} - * @return 结果 - */ - public int update${ClassName}(${ClassName} ${className}); - - /** - * 批量删除${functionName} - * - * @param ${pkColumn.javaField}s 需要删除的${functionName}主键集合 - * @return 结果 - */ - public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); - - /** - * 删除${functionName}信息 - * - * @param ${pkColumn.javaField} ${functionName}主键 - * @return 结果 - */ - public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); } diff --git a/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/serviceImpl.java.vm b/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/serviceImpl.java.vm index 3904af5..38f1eca 100644 --- a/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/serviceImpl.java.vm +++ b/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/serviceImpl.java.vm @@ -7,7 +7,6 @@ import com.muyu.common.core.utils.DateUtils; #break #end #end -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; #if($table.sub) import java.util.ArrayList; @@ -18,6 +17,10 @@ import ${packageName}.domain.${subClassName}; import ${packageName}.mapper.${ClassName}Mapper; import ${packageName}.domain.${ClassName}; import ${packageName}.service.I${ClassName}Service; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.muyu.common.core.utils.StringUtils; +import org.springframework.util.Assert; /** * ${functionName}Service业务层处理 @@ -26,13 +29,12 @@ import ${packageName}.service.I${ClassName}Service; * @date ${datetime} */ @Service -public class ${ClassName}ServiceImpl implements I${ClassName}Service -{ - @Autowired - private ${ClassName}Mapper ${className}Mapper; +public class ${ClassName}ServiceImpl + extends ServiceImpl<${ClassName}Mapper, ${ClassName}> + implements I${ClassName}Service { /** - * 查询${functionName} + * 精确查询${functionName} * * @param ${pkColumn.javaField} ${functionName}主键 * @return ${functionName} @@ -40,9 +42,13 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service @Override public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) { - return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + LambdaQueryWrapper<${ClassName}> queryWrapper = new LambdaQueryWrapper<>(); + Assert.notNull(${pkColumn.javaField}, "${pkColumn.javaField}不可为空"); + queryWrapper.eq(${ClassName}::get${pkColumn.capJavaField}, ${pkColumn.javaField}); + return this.getOne(queryWrapper); } + /** * 查询${functionName}列表 * @@ -52,118 +58,58 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service @Override public List<${ClassName}> select${ClassName}List(${ClassName} ${className}) { - return ${className}Mapper.select${ClassName}List(${className}); - } - - /** - * 新增${functionName} - * - * @param ${className} ${functionName} - * @return 结果 - */ -#if($table.sub) - @Transactional -#end - @Override - public int insert${ClassName}(${ClassName} ${className}) - { -#foreach ($column in $columns) -#if($column.javaField == 'createTime') - ${className}.setCreateTime(DateUtils.getNowDate()); -#end -#end -#if($table.sub) - int rows = ${className}Mapper.insert${ClassName}(${className}); - insert${subClassName}(${className}); - return rows; -#else - return ${className}Mapper.insert${ClassName}(${className}); -#end - } - - /** - * 修改${functionName} - * - * @param ${className} ${functionName} - * @return 结果 - */ -#if($table.sub) - @Transactional -#end - @Override - public int update${ClassName}(${ClassName} ${className}) - { -#foreach ($column in $columns) -#if($column.javaField == 'updateTime') - ${className}.setUpdateTime(DateUtils.getNowDate()); -#end -#end -#if($table.sub) - ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}()); - insert${subClassName}(${className}); -#end - return ${className}Mapper.update${ClassName}(${className}); - } - - /** - * 批量删除${functionName} - * - * @param ${pkColumn.javaField}s 需要删除的${functionName}主键 - * @return 结果 - */ -#if($table.sub) - @Transactional -#end - @Override - public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s) - { -#if($table.sub) - ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s); -#end - return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s); - } - - /** - * 删除${functionName}信息 - * - * @param ${pkColumn.javaField} ${functionName}主键 - * @return 结果 - */ -#if($table.sub) - @Transactional -#end - @Override - public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) - { -#if($table.sub) - ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField}); -#end - return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); - } -#if($table.sub) - - /** - * 新增${subTable.functionName}信息 - * - * @param ${className} ${functionName}对象 - */ - public void insert${subClassName}(${ClassName} ${className}) - { - List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List(); - ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}(); - if (StringUtils.isNotNull(${subclassName}List)) - { - List<${subClassName}> list = new ArrayList<${subClassName}>(); - for (${subClassName} ${subclassName} : ${subclassName}List) - { - ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField}); - list.add(${subclassName}); - } - if (list.size() > 0) - { - ${className}Mapper.batch${subClassName}(list); - } + LambdaQueryWrapper<${ClassName}> queryWrapper = new LambdaQueryWrapper<>(); +#foreach($column in $columns) + #set($queryType=$column.queryType) + #set($javaField=$column.javaField) + #set($javaType=$column.javaType) + #set($columnName=$column.columnName) + #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + #if($column.query) + #if($column.queryType == "EQ") + if (StringUtils.isNotEmpty(${className}.get${AttrName}())){ + queryWrapper.eq(${ClassName}::get${AttrName}, ${className}.get${AttrName}()); } - } + #elseif($queryType == "NE") + if (StringUtils.isNotEmpty(${className}.get${AttrName}())){ + queryWrapper.ne(${ClassName}::get${AttrName}, ${className}.get${AttrName}()); + } + #elseif($queryType == "GT") + if (StringUtils.isNotEmpty(${className}.get${AttrName}())){ + queryWrapper.gt(${ClassName}::get${AttrName}, ${className}.get${AttrName}()); + } + #elseif($queryType == "GTE") + if (StringUtils.isNotEmpty(${className}.get${AttrName}())){ + queryWrapper.ge(${ClassName}::get${AttrName}, ${className}.get${AttrName}()); + } + #elseif($queryType == "LT") + if (StringUtils.isNotEmpty(${className}.get${AttrName}())){ + queryWrapper.lt(${ClassName}::get${AttrName}, ${className}.get${AttrName}()); + } + #elseif($queryType == "LTE") + if (StringUtils.isNotEmpty(${className}.get${AttrName}())){ + queryWrapper.le(${ClassName}::get${AttrName}, ${className}.get${AttrName}()); + } + #elseif($queryType == "LIKE") + if (StringUtils.isNotEmpty(${className}.get${AttrName}())){ + queryWrapper.like(${ClassName}::get${AttrName}, ${className}.get${AttrName}()); + } + #end + #end #end + return this.list(queryWrapper); + } + + /** + * 唯一 判断 + * @param ${className} ${functionName} + * @return ${functionName} + */ + @Override + public Boolean checkIdUnique(${ClassName} ${className}) { + LambdaQueryWrapper<${ClassName}> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(${ClassName}::get${pkColumn.capJavaField}, ${className}.get${pkColumn.capJavaField}()); + return this.count(queryWrapper) > 0; + } + } diff --git a/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/sub-domain.java.vm b/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/sub-domain.java.vm index a5c170c..61c6273 100644 --- a/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/sub-domain.java.vm +++ b/cloud-modules/cloud-modules-gen/src/main/resources/vm/java/sub-domain.java.vm @@ -17,8 +17,7 @@ import com.muyu.common.core.web.domain.BaseEntity; @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = true) -public class ${subClassName} extends BaseEntity -{ +public class ${subClassName} extends BaseEntity { private static final long serialVersionUID = 1L; #foreach ($column in $subTable.columns) diff --git a/cloud-modules/cloud-modules-gen/src/main/resources/vm/vue/index.vue.vm b/cloud-modules/cloud-modules-gen/src/main/resources/vm/vue/index.vue.vm index 6296014..cf9b3b0 100644 --- a/cloud-modules/cloud-modules-gen/src/main/resources/vm/vue/index.vue.vm +++ b/cloud-modules/cloud-modules-gen/src/main/resources/vm/vue/index.vue.vm @@ -170,7 +170,7 @@ - +