diff --git a/chushang-common/chushang-common-bom/pom.xml b/chushang-common/chushang-common-bom/pom.xml index e76b677..da09dae 100644 --- a/chushang-common/chushang-common-bom/pom.xml +++ b/chushang-common/chushang-common-bom/pom.xml @@ -6,88 +6,78 @@ com.chushang chushang-common-bom - ${commonb.version} + 1.0.0 pom 17 17 UTF-8 - 1.0.0 + 1.0.0 com.chushang chushang-common-canal - ${commonb.version} + ${common.version} com.chushang chushang-common-core - ${commonb.version} + ${common.version} com.chushang chushang-common-easy-es - ${commonb.version} + ${common.version} com.chushang chushang-common-excel - ${commonb.version} + ${common.version} com.chushang chushang-common-feign - ${commonb.version} + ${common.version} com.chushang chushang-common-mail - ${commonb.version} + ${common.version} com.chushang chushang-common-mongo - ${commonb.version} + ${common.version} com.chushang chushang-common-mybatis - ${commonb.version} - - - com.chushang - chushang-common-mybatis-join - ${commonb.version} - - - com.chushang - chushang-common-oss - ${commonb.version} + ${common.version} com.chushang chushang-common-log - ${commonb.version} + ${common.version} com.chushang chushang-common-job - ${commonb.version} + ${common.version} com.chushang chushang-common-redis - ${commonb.version} + ${common.version} com.chushang chushang-common-security - ${commonb.version} + ${common.version} - \ No newline at end of file + diff --git a/chushang-common/chushang-common-core/pom.xml b/chushang-common/chushang-common-core/pom.xml index bca376e..14a7909 100644 --- a/chushang-common/chushang-common-core/pom.xml +++ b/chushang-common/chushang-common-core/pom.xml @@ -62,4 +62,4 @@ - \ No newline at end of file + diff --git a/chushang-common/chushang-common-core/src/main/java/com/chushang/common/core/constant/CommonConstants.java b/chushang-common/chushang-common-core/src/main/java/com/chushang/common/core/constant/CommonConstants.java index 64cb3cc..ad8af24 100644 --- a/chushang-common/chushang-common-core/src/main/java/com/chushang/common/core/constant/CommonConstants.java +++ b/chushang-common/chushang-common-core/src/main/java/com/chushang/common/core/constant/CommonConstants.java @@ -18,7 +18,7 @@ package com.chushang.common.core.constant; public interface CommonConstants { - String HEAD_TOKEN_KEY = "sanyi-token"; + String HEAD_TOKEN_KEY = "cs-token"; String ACCOUNT_SYMBOL = ":"; @@ -36,6 +36,10 @@ public interface CommonConstants { String AT_SYMBOL = "@"; - + /** + * 链路id + */ + String TRACE_ID = "traceId"; + String SPAN = "span"; } diff --git a/chushang-common/chushang-common-core/src/main/java/com/chushang/common/core/constant/SecurityConstants.java b/chushang-common/chushang-common-core/src/main/java/com/chushang/common/core/constant/SecurityConstants.java index b8c639e..d378d11 100644 --- a/chushang-common/chushang-common-core/src/main/java/com/chushang/common/core/constant/SecurityConstants.java +++ b/chushang-common/chushang-common-core/src/main/java/com/chushang/common/core/constant/SecurityConstants.java @@ -60,4 +60,5 @@ public interface SecurityConstants { */ String ROLE_PERMISSION = "role_permission"; + } diff --git a/chushang-common/chushang-common-core/src/main/java/com/chushang/common/core/handler/GlobalExceptionHandler.java b/chushang-common/chushang-common-core/src/main/java/com/chushang/common/core/handler/GlobalExceptionHandler.java index c572fcb..523e646 100644 --- a/chushang-common/chushang-common-core/src/main/java/com/chushang/common/core/handler/GlobalExceptionHandler.java +++ b/chushang-common/chushang-common-core/src/main/java/com/chushang/common/core/handler/GlobalExceptionHandler.java @@ -127,35 +127,4 @@ public class GlobalExceptionHandler log.error("请求地址'{}',发生系统异常.", requestURI, e); return AjaxResult.error(e.getMessage()); } - - /** - * 登录异常 - */ - @ExceptionHandler(NotLoginException.class) - public AjaxResult handlerNotLoginException(NotLoginException e, HttpServletRequest request){ - String requestURI = request.getRequestURI(); - log.error("请求地址'{}',发生系统异常.", requestURI, e); - return AjaxResult.error(e.getMessage()); - } - - - /** - * 权限异常 - */ - @ExceptionHandler(NotPermissionException.class) - public AjaxResult handlerNotPermissionException(NotPermissionException e, HttpServletRequest request){ - String requestURI = request.getRequestURI(); - log.error("请求地址'{}',发生系统异常.", requestURI, e); - return AjaxResult.error(e.getMessage()); - } - - /** - * 角色异常 - */ - @ExceptionHandler(NotRoleException.class) - public AjaxResult handlerNotRoleException(NotRoleException e, HttpServletRequest request){ - String requestURI = request.getRequestURI(); - log.error("请求地址'{}',发生系统异常.", requestURI, e); - return AjaxResult.error(e.getMessage()); - } } diff --git a/chushang-common/chushang-common-easy-es/pom.xml b/chushang-common/chushang-common-easy-es/pom.xml index 35eace9..244022e 100644 --- a/chushang-common/chushang-common-easy-es/pom.xml +++ b/chushang-common/chushang-common-easy-es/pom.xml @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/chushang-common/chushang-common-excel/pom.xml b/chushang-common/chushang-common-excel/pom.xml index 34a3e20..18f596b 100644 --- a/chushang-common/chushang-common-excel/pom.xml +++ b/chushang-common/chushang-common-excel/pom.xml @@ -21,4 +21,4 @@ easyexcel - \ No newline at end of file + diff --git a/chushang-common/chushang-common-feign/pom.xml b/chushang-common/chushang-common-feign/pom.xml index 3e60f82..72facdf 100644 --- a/chushang-common/chushang-common-feign/pom.xml +++ b/chushang-common/chushang-common-feign/pom.xml @@ -52,4 +52,4 @@ - \ No newline at end of file + diff --git a/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/feign/filter/MdcFilter.java b/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/feign/filter/MdcFilter.java index 17a758a..fd8cabe 100644 --- a/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/feign/filter/MdcFilter.java +++ b/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/feign/filter/MdcFilter.java @@ -16,30 +16,26 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import com.alibaba.fastjson2.JSONObject; +import com.chushang.common.core.constant.CommonConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; public class MdcFilter implements Filter { private static final Logger log = LoggerFactory.getLogger(MdcFilter.class); - public static final String TRECE_NAME = "trace"; - public static final String SPAN_NAME = "span"; public MdcFilter() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest)request; - String trace = req.getHeader("trace"); - String span = req.getHeader("span"); + String trace = req.getHeader(CommonConstants.TRACE_ID); + String span = req.getHeader(CommonConstants.SPAN); String uri = req.getRequestURI(); String userAgent = req.getHeader("user-agent"); if (!uri.contains(".") || userAgent.startsWith("Java")) { - MDC.put("trace", Objects.requireNonNullElseGet(trace, () -> UUID.randomUUID().toString().replaceAll("-", ""))); - - MDC.put("span", Objects.requireNonNullElseGet(span, () -> UUID.randomUUID().toString().replaceAll("-", ""))); - - log.info("Request -->URL:{},Param:{}", uri, JSONObject.toJSONString(request.getParameterMap())); + MDC.put(CommonConstants.TRACE_ID, Objects.requireNonNullElseGet(trace, () -> UUID.randomUUID().toString().replaceAll("-", ""))); + MDC.put(CommonConstants.SPAN, Objects.requireNonNullElseGet(span, () -> UUID.randomUUID().toString().replaceAll("-", ""))); } chain.doFilter(request, response); diff --git a/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/feign/interceptor/FeignHeaderInterceptor.java b/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/feign/interceptor/FeignHeaderInterceptor.java index 04a4efe..818b926 100644 --- a/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/feign/interceptor/FeignHeaderInterceptor.java +++ b/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/feign/interceptor/FeignHeaderInterceptor.java @@ -13,7 +13,7 @@ import org.springframework.core.annotation.Order; @Order(5) public class FeignHeaderInterceptor implements RequestInterceptor { public static final String attrKey = "transfer"; - private static final ThreadLocal header = ThreadLocal.withInitial(() -> new JSONObject()); + private static final ThreadLocal header = ThreadLocal.withInitial(JSONObject::new); private static final byte[] hex = "0123456789ABCDEF".getBytes(); public FeignHeaderInterceptor() { diff --git a/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/feign/interceptor/MdcInterceptor.java b/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/feign/interceptor/MdcInterceptor.java index 5d38f9f..b0776e9 100644 --- a/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/feign/interceptor/MdcInterceptor.java +++ b/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/feign/interceptor/MdcInterceptor.java @@ -5,6 +5,7 @@ package com.chushang.common.feign.interceptor; +import com.chushang.common.core.constant.CommonConstants; import feign.RequestInterceptor; import feign.RequestTemplate; import org.slf4j.MDC; @@ -14,7 +15,7 @@ public class MdcInterceptor implements RequestInterceptor { } public void apply(RequestTemplate template) { - template.header("trace", new String[]{MDC.get("trace")}); - template.header("span", new String[]{MDC.get("span")}); + template.header(CommonConstants.TRACE_ID, MDC.get(CommonConstants.TRACE_ID)); + template.header(CommonConstants.SPAN, MDC.get(CommonConstants.SPAN)); } } diff --git a/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/feign/registrar/TransferFilterRegistrar.java b/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/feign/registrar/TransferFilterRegistrar.java index cb537fd..844586e 100644 --- a/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/feign/registrar/TransferFilterRegistrar.java +++ b/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/feign/registrar/TransferFilterRegistrar.java @@ -10,7 +10,6 @@ import java.util.List; import javax.servlet.Filter; import com.chushang.common.feign.filter.TransferFilter; -import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; @@ -22,7 +21,7 @@ public class TransferFilterRegistrar implements ImportBeanDefinitionRegistrar { public TransferFilterRegistrar() { } - public void registerBeanDefinitions(@NotNull AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { + public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { Filter filter = new TransferFilter(); List patter = new ArrayList<>(); patter.add("/*"); diff --git a/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/sentinel/SentinelAutoConfiguration.java b/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/sentinel/SentinelAutoConfiguration.java index 5586ea8..2d1e2cd 100644 --- a/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/sentinel/SentinelAutoConfiguration.java +++ b/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/sentinel/SentinelAutoConfiguration.java @@ -22,7 +22,6 @@ import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHan import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser; import com.chushang.common.sentinel.handle.OnnUrlBlockHandler; import com.chushang.common.sentinel.ext.OnnSentinelFeign; -import com.chushang.common.sentinel.ext.OnnSentinelFilterConfiguration; import com.chushang.common.sentinel.parser.OnnHeaderRequestOriginParser; import feign.Feign; import org.springframework.boot.autoconfigure.AutoConfigureBefore; @@ -40,7 +39,6 @@ import org.springframework.context.annotation.Scope; * sentinel 配置 */ @Configuration(proxyBeanMethods = false) -@Import(OnnSentinelFilterConfiguration.class) @AutoConfigureBefore(SentinelFeignAutoConfiguration.class) public class SentinelAutoConfiguration { diff --git a/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/sentinel/ext/OnnSentinelFilterConfiguration.java b/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/sentinel/ext/OnnSentinelFilterConfiguration.java deleted file mode 100644 index e075eed..0000000 --- a/chushang-common/chushang-common-feign/src/main/java/com/chushang/common/sentinel/ext/OnnSentinelFilterConfiguration.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.chushang.common.sentinel.ext; - -import com.alibaba.cloud.sentinel.SentinelProperties; -import com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebInterceptor; -import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler; -import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.DefaultBlockExceptionHandler; -import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser; -import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.UrlCleaner; -import com.alibaba.csp.sentinel.adapter.spring.webmvc.config.SentinelWebMvcConfig; -import lombok.RequiredArgsConstructor; -import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.util.StringUtils; - -import java.util.Optional; - -/** - * @author lengleng - * @date 2021/12/4 - * - * 避免 spring cloud 2021 不兼容 的问题 - */ -@RequiredArgsConstructor -@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) -public class OnnSentinelFilterConfiguration { - - @Bean - public SentinelWebInterceptor sentinelWebInterceptor(SentinelWebMvcConfig sentinelWebMvcConfig) { - return new SentinelWebInterceptor(sentinelWebMvcConfig); - } - - @Bean - public SentinelWebMvcConfig sentinelWebMvcConfig(SentinelProperties properties, - Optional urlCleanerOptional, Optional blockExceptionHandlerOptional, - Optional requestOriginParserOptional) { - SentinelWebMvcConfig sentinelWebMvcConfig = new SentinelWebMvcConfig(); - sentinelWebMvcConfig.setHttpMethodSpecify(properties.getHttpMethodSpecify()); - sentinelWebMvcConfig.setWebContextUnify(properties.getWebContextUnify()); - - if (blockExceptionHandlerOptional.isPresent()) { - blockExceptionHandlerOptional.ifPresent(sentinelWebMvcConfig::setBlockExceptionHandler); - } - else { - if (StringUtils.hasText(properties.getBlockPage())) { - sentinelWebMvcConfig.setBlockExceptionHandler( - ((request, response, e) -> response.sendRedirect(properties.getBlockPage()))); - } - else { - sentinelWebMvcConfig.setBlockExceptionHandler(new DefaultBlockExceptionHandler()); - } - } - - urlCleanerOptional.ifPresent(sentinelWebMvcConfig::setUrlCleaner); - requestOriginParserOptional.ifPresent(sentinelWebMvcConfig::setOriginParser); - return sentinelWebMvcConfig; - } - -} diff --git a/chushang-common/chushang-common-job/pom.xml b/chushang-common/chushang-common-job/pom.xml index 7795d7b..51f455e 100644 --- a/chushang-common/chushang-common-job/pom.xml +++ b/chushang-common/chushang-common-job/pom.xml @@ -11,12 +11,6 @@ chushang-common-job - - 17 - 17 - UTF-8 - - 调度任务通用配置信息 @@ -30,4 +24,4 @@ spring-cloud-commons - \ No newline at end of file + diff --git a/chushang-common/chushang-common-log/pom.xml b/chushang-common/chushang-common-log/pom.xml index 3d1acf0..d8c28e9 100644 --- a/chushang-common/chushang-common-log/pom.xml +++ b/chushang-common/chushang-common-log/pom.xml @@ -11,11 +11,6 @@ 1.0.0 chushang-common-log - - 17 - 17 - - com.chushang @@ -31,4 +26,4 @@ - \ No newline at end of file + diff --git a/chushang-common/chushang-common-log/src/main/java/com/chushang/common/log/aspect/SysLogAspect.java b/chushang-common/chushang-common-log/src/main/java/com/chushang/common/log/aspect/SysLogAspect.java index 4970c51..692e7dd 100644 --- a/chushang-common/chushang-common-log/src/main/java/com/chushang/common/log/aspect/SysLogAspect.java +++ b/chushang-common/chushang-common-log/src/main/java/com/chushang/common/log/aspect/SysLogAspect.java @@ -18,7 +18,7 @@ import com.chushang.common.log.entity.SysLogEntity; import com.chushang.common.log.enums.LogTypeEnum; import com.chushang.common.log.service.SysLogService; import com.chushang.security.utils.SecurityUtils; -import com.chushang.system.entity.vo.LoginUser; +import com.chushang.security.entity.vo.LoginUser; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; @@ -53,7 +53,7 @@ public class SysLogAspect { final SysLogService sysLogService; @Pointcut("@annotation(com.chushang.common.log.annotation.SysLog)") - public void logPointCut() { + public void logPointCut() { } /** diff --git a/chushang-common/chushang-common-mail/pom.xml b/chushang-common/chushang-common-mail/pom.xml index 89db179..9f1f086 100644 --- a/chushang-common/chushang-common-mail/pom.xml +++ b/chushang-common/chushang-common-mail/pom.xml @@ -33,4 +33,4 @@ - \ No newline at end of file + diff --git a/chushang-common/chushang-common-mongo/pom.xml b/chushang-common/chushang-common-mongo/pom.xml index e2313e0..d7653fd 100644 --- a/chushang-common/chushang-common-mongo/pom.xml +++ b/chushang-common/chushang-common-mongo/pom.xml @@ -22,4 +22,4 @@ - \ No newline at end of file + diff --git a/chushang-common/chushang-common-mybatis/pom.xml b/chushang-common/chushang-common-mybatis/pom.xml index e4f691c..8a45bca 100644 --- a/chushang-common/chushang-common-mybatis/pom.xml +++ b/chushang-common/chushang-common-mybatis/pom.xml @@ -7,15 +7,9 @@ com.chushang 1.0.0 - jar 4.0.0 chushang-common-mybatis - - - 17 - 17 - @@ -44,4 +38,4 @@ - \ No newline at end of file + diff --git a/chushang-common/chushang-common-mybatis/src/main/java/com/baomidou/mybatisplus/core/config/GlobalConfig.java b/chushang-common/chushang-common-mybatis/src/main/java/com/baomidou/mybatisplus/core/config/GlobalConfig.java deleted file mode 100644 index f381965..0000000 --- a/chushang-common/chushang-common-mybatis/src/main/java/com/baomidou/mybatisplus/core/config/GlobalConfig.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright (c) 2011-2022, baomidou (jobob@qq.com). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.baomidou.mybatisplus.core.config; - -import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; -import com.baomidou.mybatisplus.core.handlers.PostInitTableInfoHandler; -import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator; -import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; -import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; -import com.baomidou.mybatisplus.core.injector.ISqlInjector; -import com.baomidou.mybatisplus.core.mapper.Mapper; -import lombok.Data; -import lombok.experimental.Accessors; -import org.apache.ibatis.session.SqlSessionFactory; - -import java.io.Serializable; -import java.util.List; -import java.util.Set; -import java.util.concurrent.ConcurrentSkipListSet; - -/** - * Mybatis 全局缓存 - * - * @author Caratacus - * @since 2016-12-06 - */ -@Data -@Accessors(chain = true) -@SuppressWarnings("serial") -public class GlobalConfig implements Serializable { - /** - * 是否开启 LOGO - */ - private boolean banner = false; - /** - * 是否初始化 SqlRunner - */ - private boolean enableSqlRunner = false; - - private boolean refreshMapper = false; - /** - * 数据库相关配置 - */ - private DbConfig dbConfig; - /** - * SQL注入器 - */ - private ISqlInjector sqlInjector = new DefaultSqlInjector(); - /** - * Mapper父类 - */ - private Class superMapperClass = Mapper.class; - /** - * 仅用于缓存 SqlSessionFactory(外部勿进行set,set了也没用) - */ - private SqlSessionFactory sqlSessionFactory; - /** - * 缓存已注入CRUD的Mapper信息 - */ - private Set mapperRegistryCache = new ConcurrentSkipListSet<>(); - /** - * 元对象字段填充控制器 - */ - private MetaObjectHandler metaObjectHandler; - /** - * 参与 TableInfo 的初始化 - */ - private PostInitTableInfoHandler postInitTableInfoHandler = new PostInitTableInfoHandler() { - }; - /** - * 主键生成器 - */ - private IdentifierGenerator identifierGenerator; - - @Data - public static class DbConfig { - /** - * 主键类型 - */ - private IdType idType = IdType.ASSIGN_ID; - /** - * 表名前缀 - */ - private String tablePrefix; - /** - * schema - * - * @since 3.1.1 - */ - private String schema; - /** - * db字段 format - *

- * 例: `%s` - *

- * 对主键无效 - * - * @since 3.1.1 - */ - private String columnFormat; - /** - * entity 的字段(property)的 format,只有在 column as property 这种情况下生效 - *

- * 例: `%s` - *

- * 对主键无效 - * - * @since 3.3.0 - */ - private String propertyFormat; - /** - * 实验性功能,占位符替换,等同于 {@link com.baomidou.mybatisplus.extension.plugins.inner.ReplacePlaceholderInnerInterceptor}, - * 只是这个属于启动时替换,用得地方多会启动慢一点点,不适用于其他的 {@link org.apache.ibatis.scripting.LanguageDriver} - * - * @since 3.4.2 - */ - private boolean replacePlaceholder; - /** - * 转义符 - *

- * 配合 {@link #replacePlaceholder} 使用时有效 - *

- * 例: " 或 ' 或 ` - * - * @since 3.4.2 - */ - private String escapeSymbol; - /** - * 表名是否使用驼峰转下划线命名,只对表名生效 - */ - private boolean tableUnderline = true; - /** - * 大写命名,对表名和字段名均生效 - */ - private boolean capitalMode = false; - /** - * 表主键生成器 - */ - private List keyGenerators; - /** - * 逻辑删除全局属性名 - */ - private String logicDeleteField; - /** - * 逻辑删除全局值(默认 1、表示已删除) - */ - private String logicDeleteValue = "1"; - /** - * 逻辑未删除全局值(默认 0、表示未删除) - */ - private String logicNotDeleteValue = "0"; - /** - * 字段验证策略之 insert - * - * @since 3.1.2 - */ - private FieldStrategy insertStrategy = FieldStrategy.NOT_NULL; - /** - * 字段验证策略之 update - * - * @since 3.1.2 - */ - private FieldStrategy updateStrategy = FieldStrategy.NOT_NULL; - - /** - * 字段验证策略之 select - * - * @since 3.1.2 - * @deprecated 3.4.4 - */ - @Deprecated - private FieldStrategy selectStrategy; - - /** - * 字段验证策略之 where - * 替代selectStrategy,保持与{@link TableField#whereStrategy()}一致 - * - * @since 3.4.4 - */ - private FieldStrategy whereStrategy = FieldStrategy.NOT_NULL; - - /** - * 重写whereStrategy的get方法,适配低版本: - * - 如果用户自定义了selectStrategy则用用户自定义的, - * - 后续版本移除selectStrategy后,直接删除该方法即可。 - * - * @return 字段作为查询条件时的验证策略 - * @since 3.4.4 - */ - public FieldStrategy getWhereStrategy() { - return selectStrategy == null ? whereStrategy : selectStrategy; - } - } -} diff --git a/chushang-common/chushang-common-mybatis/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/PaginationInnerInterceptor.java b/chushang-common/chushang-common-mybatis/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/PaginationInnerInterceptor.java deleted file mode 100644 index c1965ea..0000000 --- a/chushang-common/chushang-common-mybatis/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/PaginationInnerInterceptor.java +++ /dev/null @@ -1,483 +0,0 @@ -/* - * Copyright (c) 2011-2022, baomidou (jobob@qq.com). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.baomidou.mybatisplus.extension.plugins.inner; - -import com.baomidou.mybatisplus.annotation.DbType; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.metadata.OrderItem; -import com.baomidou.mybatisplus.core.toolkit.*; -import com.baomidou.mybatisplus.extension.plugins.pagination.DialectFactory; -import com.baomidou.mybatisplus.extension.plugins.pagination.DialectModel; -import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.IDialect; -import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils; -import com.baomidou.mybatisplus.extension.toolkit.PropertyMapper; -import com.baomidou.mybatisplus.extension.toolkit.SqlParserUtils; -import lombok.Data; -import lombok.NoArgsConstructor; -import net.sf.jsqlparser.JSQLParserException; -import net.sf.jsqlparser.expression.Alias; -import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.parser.CCJSqlParserUtil; -import net.sf.jsqlparser.schema.Column; -import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.select.*; -import org.apache.ibatis.cache.CacheKey; -import org.apache.ibatis.executor.Executor; -import org.apache.ibatis.logging.Log; -import org.apache.ibatis.logging.LogFactory; -import org.apache.ibatis.mapping.BoundSql; -import org.apache.ibatis.mapping.MappedStatement; -import org.apache.ibatis.mapping.ParameterMapping; -import org.apache.ibatis.mapping.ResultMap; -import org.apache.ibatis.session.Configuration; -import org.apache.ibatis.session.ResultHandler; -import org.apache.ibatis.session.RowBounds; - -import java.sql.SQLException; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; - -/** - * 分页拦截器 - *

- * 默认对 left join 进行优化,虽然能优化count,但是加上分页的话如果1对多本身结果条数就是不正确的 - * - * @author hubin - * @since 3.4.0 - */ -@Data -@NoArgsConstructor -@SuppressWarnings({"rawtypes"}) -public class PaginationInnerInterceptor implements InnerInterceptor { - /** - * 获取jsqlparser中count的SelectItem - */ - protected static final List COUNT_SELECT_ITEM = Collections.singletonList( - new SelectExpressionItem(new Column().withColumnName("COUNT(*)")).withAlias(new Alias("total")) - ); - protected static final Map countMsCache = new ConcurrentHashMap<>(); - protected final Log logger = LogFactory.getLog(this.getClass()); - - - /** - * 溢出总页数后是否进行处理 - */ - protected boolean overflow; - /** - * 单页分页条数限制 - */ - protected Long maxLimit; - /** - * 数据库类型 - *

- * 查看 {@link #findIDialect(Executor)} 逻辑 - */ - private DbType dbType; - /** - * 方言实现类 - *

- * 查看 {@link #findIDialect(Executor)} 逻辑 - */ - private IDialect dialect; - /** - * 生成 countSql 优化掉 join - * 现在只支持 left join - * - * @since 3.4.2 - */ - protected boolean optimizeJoin = true; - - public PaginationInnerInterceptor(DbType dbType) { - this.dbType = dbType; - } - - public PaginationInnerInterceptor(IDialect dialect) { - this.dialect = dialect; - } - - /** - * 这里进行count,如果count为0这返回false(就是不再执行sql了) - */ - @Override - public boolean willDoQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { - IPage page = ParameterUtils.findPage(parameter).orElse(null); - if (page == null || page.getSize() < 0 || !page.searchCount()) { - return true; - } - - BoundSql countSql; - MappedStatement countMs = buildCountMappedStatement(ms, page.countId()); - if (countMs != null) { - countSql = countMs.getBoundSql(parameter); - } else { - countMs = buildAutoCountMappedStatement(ms); - String countSqlStr = autoCountSql(page, boundSql.getSql()); - PluginUtils.MPBoundSql mpBoundSql = PluginUtils.mpBoundSql(boundSql); - countSql = new BoundSql(countMs.getConfiguration(), countSqlStr, mpBoundSql.parameterMappings(), parameter); - PluginUtils.setAdditionalParameter(countSql, mpBoundSql.additionalParameters()); - } - - CacheKey cacheKey = executor.createCacheKey(countMs, parameter, rowBounds, countSql); - List result = executor.query(countMs, parameter, rowBounds, resultHandler, cacheKey, countSql); - long total = 0; - if (CollectionUtils.isNotEmpty(result)) { - // 个别数据库 count 没数据不会返回 0 - Object o = result.get(0); - if (o != null) { - total = Long.parseLong(o.toString()); - } - } - page.setTotal(total); - return continuePage(page); - } - - @Override - public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { - IPage page = ParameterUtils.findPage(parameter).orElse(null); - if (null == page) { - return; - } - - // 处理 orderBy 拼接 - boolean addOrdered = false; - String buildSql = boundSql.getSql(); - List orders = page.orders(); - if (CollectionUtils.isNotEmpty(orders)) { - addOrdered = true; - buildSql = this.concatOrderBy(buildSql, orders); - } - - // size 小于 0 且不限制返回值则不构造分页sql - Long _limit = page.maxLimit() != null ? page.maxLimit() : maxLimit; - if (page.getSize() < 0 && null == _limit) { - if (addOrdered) { - PluginUtils.mpBoundSql(boundSql).sql(buildSql); - } - return; - } - - handlerLimit(page, _limit); - IDialect dialect = findIDialect(executor); - - final Configuration configuration = ms.getConfiguration(); - DialectModel model = dialect.buildPaginationSql(buildSql, page.offset(), page.getSize()); - PluginUtils.MPBoundSql mpBoundSql = PluginUtils.mpBoundSql(boundSql); - - List mappings = mpBoundSql.parameterMappings(); - Map additionalParameter = mpBoundSql.additionalParameters(); - model.consumers(mappings, configuration, additionalParameter); - mpBoundSql.sql(model.getDialectSql()); - mpBoundSql.parameterMappings(mappings); - } - - /** - * 获取分页方言类的逻辑 - * - * @param executor Executor - * @return 分页方言类 - */ - protected IDialect findIDialect(Executor executor) { - if (dialect != null) { - return dialect; - } - if (dbType != null) { - dialect = DialectFactory.getDialect(dbType); - return dialect; - } - return DialectFactory.getDialect(JdbcUtils.getDbType(executor)); - } - - /** - * 获取指定的 id 的 MappedStatement - * - * @param ms MappedStatement - * @param countId id - * @return MappedStatement - */ - protected MappedStatement buildCountMappedStatement(MappedStatement ms, String countId) { - if (StringUtils.isNotBlank(countId)) { - final String id = ms.getId(); - if (!countId.contains(StringPool.DOT)) { - countId = id.substring(0, id.lastIndexOf(StringPool.DOT) + 1) + countId; - } - final Configuration configuration = ms.getConfiguration(); - try { - return CollectionUtils.computeIfAbsent(countMsCache, countId, key -> configuration.getMappedStatement(key, false)); - } catch (Exception e) { - logger.warn(String.format("can not find this countId: [\"%s\"]", countId)); - } - } - return null; - } - - /** - * 构建 mp 自用自动的 MappedStatement - * - * @param ms MappedStatement - * @return MappedStatement - */ - protected MappedStatement buildAutoCountMappedStatement(MappedStatement ms) { - final String countId = ms.getId() + "_mpCount"; - final Configuration configuration = ms.getConfiguration(); - return CollectionUtils.computeIfAbsent(countMsCache, countId, key -> { - MappedStatement.Builder builder = new MappedStatement.Builder(configuration, key, ms.getSqlSource(), ms.getSqlCommandType()); - builder.resource(ms.getResource()); - builder.fetchSize(ms.getFetchSize()); - builder.statementType(ms.getStatementType()); - builder.timeout(ms.getTimeout()); - builder.parameterMap(ms.getParameterMap()); - builder.resultMaps(Collections.singletonList(new ResultMap.Builder(configuration, Constants.MYBATIS_PLUS, Long.class, Collections.emptyList()).build())); - builder.resultSetType(ms.getResultSetType()); - builder.cache(ms.getCache()); - builder.flushCacheRequired(ms.isFlushCacheRequired()); - builder.useCache(ms.isUseCache()); - return builder.build(); - }); - } - - /** - * 获取自动优化的 countSql - * - * @param page 参数 - * @param sql sql - * @return countSql - */ - protected String autoCountSql(IPage page, String sql) { - if (!page.optimizeCountSql()) { - return lowLevelCountSql(sql); - } - try { - Select select = (Select) CCJSqlParserUtil.parse(sql); - SelectBody selectBody = select.getSelectBody(); - // https://github.com/baomidou/mybatis-plus/issues/3920 分页增加union语法支持 - if (selectBody instanceof SetOperationList) { - return lowLevelCountSql(sql); - } - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); - Distinct distinct = plainSelect.getDistinct(); - GroupByElement groupBy = plainSelect.getGroupBy(); - List orderBy = plainSelect.getOrderByElements(); - - if (CollectionUtils.isNotEmpty(orderBy)) { - boolean canClean = true; - if (groupBy != null) { - // 包含groupBy 不去除orderBy - canClean = false; - } - if (canClean) { - for (OrderByElement order : orderBy) { - // order by 里带参数,不去除order by - Expression expression = order.getExpression(); - if (!(expression instanceof Column) && expression.toString().contains(StringPool.QUESTION_MARK)) { - canClean = false; - break; - } - } - } - if (canClean) { - plainSelect.setOrderByElements(null); - } - } - //#95 Github, selectItems contains #{} ${}, which will be translated to ?, and it may be in a function: power(#{myInt},2) - for (SelectItem item : plainSelect.getSelectItems()) { - if (item.toString().contains(StringPool.QUESTION_MARK)) { - return lowLevelCountSql(select.toString()); - } - } - // 包含 distinct、groupBy不优化 - if (distinct != null || null != groupBy) { - return lowLevelCountSql(select.toString()); - } - // 包含 join 连表,进行判断是否移除 join 连表 - if (optimizeJoin && page.optimizeJoinOfCountSql()) { - List joins = plainSelect.getJoins(); - if (CollectionUtils.isNotEmpty(joins)) { - boolean canRemoveJoin = true; - String whereS = Optional.ofNullable(plainSelect.getWhere()).map(Expression::toString).orElse(StringPool.EMPTY); - // 不区分大小写 - whereS = whereS.toLowerCase(); - for (Join join : joins) { - if (!join.isLeft()) { - canRemoveJoin = false; - break; - } - FromItem rightItem = join.getRightItem(); - String str = ""; - if (rightItem instanceof Table) { - Table table = (Table) rightItem; - str = Optional.ofNullable(table.getAlias()).map(Alias::getName).orElse(table.getName()) + StringPool.DOT; - } else if (rightItem instanceof SubSelect) { - SubSelect subSelect = (SubSelect) rightItem; - /* 如果 left join 是子查询,并且子查询里包含 ?(代表有入参) 或者 where 条件里包含使用 join 的表的字段作条件,就不移除 join */ - if (subSelect.toString().contains(StringPool.QUESTION_MARK)) { - canRemoveJoin = false; - break; - } - str = subSelect.getAlias().getName() + StringPool.DOT; - } - // 不区分大小写 - str = str.toLowerCase(); - - if (whereS.contains(str)) { - /* 如果 where 条件里包含使用 join 的表的字段作条件,就不移除 join */ - canRemoveJoin = false; - break; - } - - for (Expression expression : join.getOnExpressions()) { - if (expression.toString().contains(StringPool.QUESTION_MARK)) { - /* 如果 join 里包含 ?(代表有入参) 就不移除 join */ - canRemoveJoin = false; - break; - } - } - } - - if (canRemoveJoin) { - plainSelect.setJoins(null); - } - } - } - // 优化 SQL - plainSelect.setSelectItems(COUNT_SELECT_ITEM); - return select.toString(); - } catch (JSQLParserException e) { - // 无法优化使用原 SQL - logger.warn("optimize this sql to a count sql has exception, sql:\"" + sql + "\", exception:\n" + e.getCause()); - } catch (Exception e) { - logger.warn("optimize this sql to a count sql has error, sql:\"" + sql + "\", exception:\n" + e); - } - return lowLevelCountSql(sql); - } - - /** - * 无法进行count优化时,降级使用此方法 - * - * @param originalSql 原始sql - * @return countSql - */ - protected String lowLevelCountSql(String originalSql) { - return SqlParserUtils.getOriginalCountSql(originalSql); - } - - /** - * 查询SQL拼接Order By - * - * @param originalSql 需要拼接的SQL - * @return ignore - */ - public String concatOrderBy(String originalSql, List orderList) { - try { - Select select = (Select) CCJSqlParserUtil.parse(originalSql); - SelectBody selectBody = select.getSelectBody(); - if (selectBody instanceof PlainSelect) { - PlainSelect plainSelect = (PlainSelect) selectBody; - List orderByElements = plainSelect.getOrderByElements(); - List orderByElementsReturn = addOrderByElements(orderList, orderByElements); - plainSelect.setOrderByElements(orderByElementsReturn); - return select.toString(); - } else if (selectBody instanceof SetOperationList) { - SetOperationList setOperationList = (SetOperationList) selectBody; - List orderByElements = setOperationList.getOrderByElements(); - List orderByElementsReturn = addOrderByElements(orderList, orderByElements); - setOperationList.setOrderByElements(orderByElementsReturn); - return select.toString(); - } else if (selectBody instanceof WithItem) { - // todo: don't known how to resole - return originalSql; - } else { - return originalSql; - } - } catch (JSQLParserException e) { - logger.warn("failed to concat orderBy from IPage, exception:\n" + e.getCause()); - } catch (Exception e) { - logger.warn("failed to concat orderBy from IPage, exception:\n" + e); - } - return originalSql; - } - - protected List addOrderByElements(List orderList, List orderByElements) { - List additionalOrderBy = orderList.stream() - .filter(item -> StringUtils.isNotBlank(item.getColumn())) - .map(item -> { - OrderByElement element = new OrderByElement(); - element.setExpression(new Column(item.getColumn())); - element.setAsc(item.isAsc()); - element.setAscDescPresent(true); - return element; - }).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(orderByElements)) { - return additionalOrderBy; - } - // github pull/3550 优化排序,比如:默认 order by id 前端传了name排序,设置为 order by name,id - additionalOrderBy.addAll(orderByElements); - return additionalOrderBy; - } - - /** - * count 查询之后,是否继续执行分页 - * - * @param page 分页对象 - * @return 是否 - */ - protected boolean continuePage(IPage page) { - if (page.getTotal() <= 0) { - return false; - } - if (page.getCurrent() > page.getPages()) { - if (overflow) { - //溢出总页数处理 - handlerOverflow(page); - } else { - // 超过最大范围,未设置溢出逻辑中断 list 执行 - return false; - } - } - return true; - } - - /** - * 处理超出分页条数限制,默认归为限制数 - * - * @param page IPage - */ - protected void handlerLimit(IPage page, Long limit) { - final long size = page.getSize(); - if (limit != null && limit > 0 && (size > limit || size < 0)) { - page.setSize(limit); - } - } - - /** - * 处理页数溢出,默认设置为第一页 - * - * @param page IPage - */ - protected void handlerOverflow(IPage page) { - page.setCurrent(1); - } - - @Override - public void setProperties(Properties properties) { - PropertyMapper.newInstance(properties) - .whenNotBlank("overflow", Boolean::parseBoolean, this::setOverflow) - .whenNotBlank("dbType", DbType::getDbType, this::setDbType) - .whenNotBlank("dialect", ClassUtils::newInstance, this::setDialect) - .whenNotBlank("maxLimit", Long::parseLong, this::setMaxLimit) - .whenNotBlank("optimizeJoin", Boolean::parseBoolean, this::setOptimizeJoin); - } -} diff --git a/chushang-common/chushang-common-mybatis/src/main/java/com/chushang/common/mybatis/MybatisAutoConfiguration.java b/chushang-common/chushang-common-mybatis/src/main/java/com/chushang/common/mybatis/MybatisAutoConfiguration.java index 2396263..bf14338 100644 --- a/chushang-common/chushang-common-mybatis/src/main/java/com/chushang/common/mybatis/MybatisAutoConfiguration.java +++ b/chushang-common/chushang-common-mybatis/src/main/java/com/chushang/common/mybatis/MybatisAutoConfiguration.java @@ -28,6 +28,7 @@ import com.chushang.common.mybatis.resolver.SqlFilterArgumentResolver; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -50,8 +51,11 @@ import java.util.Set; @MapperScan({"com.chushang.**.mapper"}) public class MybatisAutoConfiguration implements WebMvcConfigurer { - @Autowired - MybatisPlusProperties mybatisPlusProperties; +// @Autowired +// MybatisPlusProperties mybatisPlusProperties; +// @Value("${mybatis-plus.global-config.refresh.enable:false}") +// private boolean refreshMapper; + /** * SQL 过滤器避免SQL 注入 @@ -84,19 +88,19 @@ public class MybatisAutoConfiguration implements WebMvcConfigurer { return new MybatisPlusMetaObjectHandler(); } - @Bean - public MybatisPlusMapperRefresh mybatisPlusMapperRefresh(ApplicationContext applicationContext, SqlSessionFactory sqlSessionFactory){ - Set mapperLocations = new LinkedHashSet<>(); - for (String xx : mybatisPlusProperties.getMapperLocations()) { - try { - mapperLocations.addAll(Arrays.asList(applicationContext.getResources(xx))); - } catch (Exception ignored) { - } - } - return new MybatisPlusMapperRefresh(mapperLocations.toArray(new Resource[mapperLocations.size()]), - sqlSessionFactory, - 10, - 5); - } +// @Bean +// public MybatisPlusMapperRefresh mybatisPlusMapperRefresh(ApplicationContext applicationContext, SqlSessionFactory sqlSessionFactory){ +// Set mapperLocations = new LinkedHashSet<>(); +// for (String xx : mybatisPlusProperties.getMapperLocations()) { +// try { +// mapperLocations.addAll(Arrays.asList(applicationContext.getResources(xx))); +// } catch (Exception ignored) { +// } +// } +// return new MybatisPlusMapperRefresh(mapperLocations.toArray(new Resource[mapperLocations.size()]), +// sqlSessionFactory, +// 10, +// 5, refreshMapper); +// } } diff --git a/chushang-common/chushang-common-mybatis/src/main/java/com/chushang/common/mybatis/config/MybatisPlusMapperRefresh.java b/chushang-common/chushang-common-mybatis/src/main/java/com/chushang/common/mybatis/config/MybatisPlusMapperRefresh.java index 5f957ac..ecdb897 100644 --- a/chushang-common/chushang-common-mybatis/src/main/java/com/chushang/common/mybatis/config/MybatisPlusMapperRefresh.java +++ b/chushang-common/chushang-common-mybatis/src/main/java/com/chushang/common/mybatis/config/MybatisPlusMapperRefresh.java @@ -53,14 +53,16 @@ public class MybatisPlusMapperRefresh implements Runnable { * 刷新间隔时间 */ private int sleepSeconds = 20; + private boolean refreshMapper; public MybatisPlusMapperRefresh(Resource[] mapperLocations, SqlSessionFactory sqlSessionFactory, int delaySeconds, - int sleepSeconds) { + int sleepSeconds, boolean refreshMapper) { this.mapperLocations = mapperLocations.clone(); this.sqlSessionFactory = sqlSessionFactory; this.delaySeconds = delaySeconds; this.sleepSeconds = sleepSeconds; this.configuration = sqlSessionFactory.getConfiguration(); + this.refreshMapper = refreshMapper; this.run(); } @@ -73,10 +75,9 @@ public class MybatisPlusMapperRefresh implements Runnable { @Override public void run() { - final GlobalConfig globalConfig = GlobalConfigUtils.getGlobalConfig(configuration); /* */ - if (globalConfig.isRefreshMapper()) { + if (refreshMapper) { beforeTime = SystemClock.now(); final MybatisPlusMapperRefresh runnable = this; new Thread(() -> { diff --git a/chushang-common/chushang-common-redis/src/main/java/com/chushang/redis/config/RedisConfiguration.java b/chushang-common/chushang-common-redis/src/main/java/com/chushang/redis/config/RedisConfiguration.java index 273c653..eec512a 100644 --- a/chushang-common/chushang-common-redis/src/main/java/com/chushang/redis/config/RedisConfiguration.java +++ b/chushang-common/chushang-common-redis/src/main/java/com/chushang/redis/config/RedisConfiguration.java @@ -7,17 +7,15 @@ import com.chushang.redis.cache.PlusSpringCacheManager; import com.chushang.redis.config.properties.RedissonProperties; import com.chushang.redis.hanlder.KeyPrefixHandler; import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.redisson.codec.JsonJacksonCodec; import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cache.CacheManager; -import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import javax.annotation.Resource; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -29,15 +27,13 @@ import java.util.stream.Collectors; * @date 2023/1/17 16:27 */ @Slf4j -@AutoConfiguration @EnableCaching -@RequiredArgsConstructor -@EnableConfigurationProperties(RedissonProperties.class) -public class RedisConfiguration extends CachingConfigurerSupport { - - private final RedissonProperties redissonProperties; - private final ObjectMapper objectMapper; - +@Component +public class RedisConfiguration { + @Resource + private RedissonProperties redissonProperties; + @Resource + private ObjectMapper objectMapper; @Bean public RedissonAutoConfigurationCustomizer redissonCustomizer() { @@ -52,6 +48,9 @@ public class RedisConfiguration extends CachingConfigurerSupport { if (ObjectUtil.isNotNull(singleServerConfig)) { String address = singleServerConfig.getAddress(); AssertUtil.invalidate(StringUtils.isEmpty(address), "redisson 配置错误"); + if (!address.contains("redis://")){ + address = "redis://" + address; + } // 使用单机模式 config.useSingleServer() .setClientName(redissonProperties.getClientName()) diff --git a/chushang-common/chushang-common-redis/src/main/java/com/chushang/redis/config/properties/RedissonProperties.java b/chushang-common/chushang-common-redis/src/main/java/com/chushang/redis/config/properties/RedissonProperties.java index 21239ca..8598612 100644 --- a/chushang-common/chushang-common-redis/src/main/java/com/chushang/redis/config/properties/RedissonProperties.java +++ b/chushang-common/chushang-common-redis/src/main/java/com/chushang/redis/config/properties/RedissonProperties.java @@ -5,6 +5,7 @@ import lombok.NoArgsConstructor; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; /** * @auther: zhao diff --git a/chushang-common/chushang-common-redis/src/main/resources/META-INF/spring.factories b/chushang-common/chushang-common-redis/src/main/resources/META-INF/spring.factories index 464ea43..83aa612 100644 --- a/chushang-common/chushang-common-redis/src/main/resources/META-INF/spring.factories +++ b/chushang-common/chushang-common-redis/src/main/resources/META-INF/spring.factories @@ -1,2 +1,3 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.chushang.redis.config.RedisConfiguration + com.chushang.redis.config.RedisConfiguration,\ + com.chushang.redis.config.properties.RedissonProperties diff --git a/chushang-common/chushang-common-security/pom.xml b/chushang-common/chushang-common-security/pom.xml index 53c2152..4fffe29 100644 --- a/chushang-common/chushang-common-security/pom.xml +++ b/chushang-common/chushang-common-security/pom.xml @@ -8,15 +8,9 @@ 1.0.0 4.0.0 - jar 1.0.0 chushang-common-security - - 17 - 17 - - com.chushang @@ -24,9 +18,8 @@ com.chushang - system-feign - 1.0.0 + chushang-common-feign - \ No newline at end of file + diff --git a/chushang-common/chushang-common-security/src/main/java/com/chushang/security/auth/AuthLogic.java b/chushang-common/chushang-common-security/src/main/java/com/chushang/security/auth/AuthLogic.java index f09eb4c..cf37458 100644 --- a/chushang-common/chushang-common-security/src/main/java/com/chushang/security/auth/AuthLogic.java +++ b/chushang-common/chushang-common-security/src/main/java/com/chushang/security/auth/AuthLogic.java @@ -11,7 +11,7 @@ import com.chushang.common.core.exception.auth.NotPermissionException; import com.chushang.common.core.exception.auth.NotRoleException; import com.chushang.common.core.util.SpringUtils; import com.chushang.common.core.util.StringUtils; -import com.chushang.system.entity.vo.LoginUser; +import com.chushang.security.entity.vo.LoginUser; import org.springframework.util.PatternMatchUtils; import java.util.Collection; @@ -19,7 +19,7 @@ import java.util.Set; /** * Token 权限验证,逻辑实现类 - * + * * @author ruoyi */ public class AuthLogic @@ -49,7 +49,7 @@ public class AuthLogic /** * 获取当前用户缓存信息, 如果未登录,则抛出异常 - * + * * @return 用户缓存信息 */ public LoginUser getLoginUser() @@ -69,7 +69,7 @@ public class AuthLogic /** * 获取当前用户缓存信息, 如果未登录,则抛出异常 - * + * * @param token 前端传递的认证信息 * @return 用户缓存信息 */ @@ -80,7 +80,7 @@ public class AuthLogic /** * 验证当前用户有效期, 如果相差不足120分钟,自动刷新缓存 - * + * * @param loginUser 当前用户信息 */ public void verifyLoginUserExpire(LoginUser loginUser) @@ -107,7 +107,7 @@ public class AuthLogic /** * 验证用户是否含有指定权限,只需包含其中一个 - * + * * @param permissions 权限码数组 */ public void checkPermiOr(String... permissions) @@ -128,7 +128,7 @@ public class AuthLogic /** * 验证用户是否含有指定角色,必须全部拥有 - * + * * @param roles 角色标识数组 */ public void checkRoleAnd(String... roles) @@ -145,7 +145,7 @@ public class AuthLogic /** * 验证用户是否含有指定角色,只需包含其中一个 - * + * * @param roles 角色标识数组 */ public void checkRoleOr(String... roles) @@ -166,7 +166,7 @@ public class AuthLogic /** * 根据注解(@RequiresRoles)鉴权 - * + * * @param at 注解对象 */ public void checkByAnnotation(RequiresRoles at) @@ -184,7 +184,7 @@ public class AuthLogic /** * 根据注解(@RequiresPermissions)鉴权 - * + * * @param at 注解对象 */ public void checkByAnnotation(RequiresPermissions at) @@ -211,7 +211,7 @@ public class AuthLogic /** * 获取当前账号的角色列表 - * + * * @return 角色列表 */ public Set getRoleList() @@ -222,7 +222,7 @@ public class AuthLogic /** * 获取当前账号的权限列表 - * + * * @return 权限列表 */ public Set getPermiList() { @@ -233,7 +233,7 @@ public class AuthLogic /** * 判断是否包含权限 - * + * * @param authorities 权限列表 * @param permission 权限字符串 * @return 用户是否具备某权限 @@ -246,7 +246,7 @@ public class AuthLogic /** * 判断是否包含角色 - * + * * @param roles 角色列表 * @param role 角色 * @return 用户是否具备某角色权限 diff --git a/chushang-common/chushang-common-security/src/main/java/com/chushang/security/auth/AuthUtil.java b/chushang-common/chushang-common-security/src/main/java/com/chushang/security/auth/AuthUtil.java index dc585ea..82800fe 100644 --- a/chushang-common/chushang-common-security/src/main/java/com/chushang/security/auth/AuthUtil.java +++ b/chushang-common/chushang-common-security/src/main/java/com/chushang/security/auth/AuthUtil.java @@ -2,11 +2,11 @@ package com.chushang.security.auth; import com.chushang.security.annotation.RequiresPermissions; import com.chushang.security.annotation.RequiresRoles; -import com.chushang.system.entity.vo.LoginUser; +import com.chushang.security.entity.vo.LoginUser; /** * Token 权限验证工具类 - * + * * @author ruoyi */ public class AuthUtil @@ -50,7 +50,7 @@ public class AuthUtil /** * 根据注解传入参数鉴权, 如果验证未通过,则抛出异常: NotRoleException - * + * * @param requiresRoles 角色权限注解 */ public static void checkRole(RequiresRoles requiresRoles) @@ -60,7 +60,7 @@ public class AuthUtil /** * 根据注解传入参数鉴权, 如果验证未通过,则抛出异常: NotPermissionException - * + * * @param requiresPermissions 权限注解 */ public static void checkPermi(RequiresPermissions requiresPermissions) diff --git a/chushang-modules/chushang-module-system/system-feign/src/main/java/com/chushang/system/entity/vo/LoginUser.java b/chushang-common/chushang-common-security/src/main/java/com/chushang/security/entity/vo/LoginUser.java similarity index 84% rename from chushang-modules/chushang-module-system/system-feign/src/main/java/com/chushang/system/entity/vo/LoginUser.java rename to chushang-common/chushang-common-security/src/main/java/com/chushang/security/entity/vo/LoginUser.java index e7f4878..06a5465 100644 --- a/chushang-modules/chushang-module-system/system-feign/src/main/java/com/chushang/system/entity/vo/LoginUser.java +++ b/chushang-common/chushang-common-security/src/main/java/com/chushang/security/entity/vo/LoginUser.java @@ -1,6 +1,5 @@ -package com.chushang.system.entity.vo; +package com.chushang.security.entity.vo; -import com.chushang.system.entity.po.SysUser; import lombok.Data; import java.io.Serializable; @@ -11,7 +10,7 @@ import java.util.Set; * by zhaowenyuan create 2022/5/19 12:09 */ @Data -public class LoginUser implements Serializable +public class LoginUser implements Serializable { private static final long serialVersionUID = 1L; @@ -58,7 +57,7 @@ public class LoginUser implements Serializable /** * 用户信息 */ - private SysUser sysUser; + private T sysUser; /** * 当前用户对应的 数据权限 diff --git a/chushang-common/chushang-common-security/src/main/java/com/chushang/security/interceptor/HeaderInterceptor.java b/chushang-common/chushang-common-security/src/main/java/com/chushang/security/interceptor/HeaderInterceptor.java index 75e993c..186c660 100644 --- a/chushang-common/chushang-common-security/src/main/java/com/chushang/security/interceptor/HeaderInterceptor.java +++ b/chushang-common/chushang-common-security/src/main/java/com/chushang/security/interceptor/HeaderInterceptor.java @@ -6,7 +6,7 @@ import com.chushang.security.utils.SecurityUtils; import com.chushang.common.core.constant.SecurityConstants; import com.chushang.common.core.util.ServletUtils; import com.chushang.common.core.util.StringUtils; -import com.chushang.system.entity.vo.LoginUser; +import com.chushang.security.entity.vo.LoginUser; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.AsyncHandlerInterceptor; diff --git a/chushang-common/chushang-common-security/src/main/java/com/chushang/security/service/TokenService.java b/chushang-common/chushang-common-security/src/main/java/com/chushang/security/service/TokenService.java index c407eee..ea3ea8f 100644 --- a/chushang-common/chushang-common-security/src/main/java/com/chushang/security/service/TokenService.java +++ b/chushang-common/chushang-common-security/src/main/java/com/chushang/security/service/TokenService.java @@ -4,7 +4,7 @@ import com.chushang.common.core.constant.CacheConstants; import com.chushang.common.core.constant.SecurityConstants; import com.chushang.common.core.util.*; import com.chushang.security.utils.SecurityUtils; -import com.chushang.system.entity.vo.LoginUser; +import com.chushang.security.entity.vo.LoginUser; import lombok.extern.slf4j.Slf4j; import org.redisson.api.RBucket; import org.redisson.api.RKeys; @@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit; /** * token验证处理 - * + * * @author ruoyi */ @Component @@ -195,4 +195,4 @@ public class TokenService log.debug("强退 {} 个用户, userId : {}.",l, userId ); } } -} \ No newline at end of file +} diff --git a/chushang-common/chushang-common-security/src/main/java/com/chushang/security/utils/SecurityUtils.java b/chushang-common/chushang-common-security/src/main/java/com/chushang/security/utils/SecurityUtils.java index e72cf73..5eb9662 100644 --- a/chushang-common/chushang-common-security/src/main/java/com/chushang/security/utils/SecurityUtils.java +++ b/chushang-common/chushang-common-security/src/main/java/com/chushang/security/utils/SecurityUtils.java @@ -6,7 +6,7 @@ import com.chushang.common.core.constant.TokenConstants; import com.chushang.common.core.util.ServletUtils; import com.chushang.common.core.util.StringUtils; import com.chushang.security.auth.AuthUtil; -import com.chushang.system.entity.vo.LoginUser; +import com.chushang.security.entity.vo.LoginUser; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import javax.servlet.http.HttpServletRequest; @@ -14,10 +14,10 @@ import java.util.Set; /** * 权限获取工具类 - * + * * @author ruoyi */ -public class SecurityUtils +public class SecurityUtils { public static final String PA_SA = "%s:%s"; /** @@ -31,7 +31,7 @@ public class SecurityUtils public static boolean isAdmin(){ Integer userId = SecurityContextHolder.getUserId(); - LoginUser loginUser = getLoginUser(); + LoginUser loginUser = getLoginUser(); Set roles = loginUser.getRoles(); // 包含 admin 的账号 或者 id == 1 的就是 admin -- 必须是 admin 的才是超管权限 boolean flag = roles.contains(AuthUtil.SUPER_ADMIN); diff --git a/chushang-common/pom.xml b/chushang-common/pom.xml index 8288dca..15cc901 100644 --- a/chushang-common/pom.xml +++ b/chushang-common/pom.xml @@ -28,4 +28,4 @@ chushang-common-redis chushang-common-security - \ No newline at end of file + diff --git a/chushang-modules/chushang-module-auth/auth-service/pom.xml b/chushang-modules/chushang-module-auth/auth-service/pom.xml index a011300..0fdb3fc 100644 --- a/chushang-modules/chushang-module-auth/auth-service/pom.xml +++ b/chushang-modules/chushang-module-auth/auth-service/pom.xml @@ -17,19 +17,7 @@ 17 - - org.redisson - redisson-spring-boot-starter - - - com.chushang - system-feign - 1.0.0 - - - com.chushang - chushang-common-security - + com.alibaba.cloud @@ -42,9 +30,12 @@ com.chushang - chushang-common-security + system-feign 1.0.0 - compile + + + com.chushang + chushang-common-redis @@ -57,4 +48,4 @@ - \ No newline at end of file + diff --git a/chushang-modules/chushang-module-auth/auth-service/src/main/java/com/chushang/AuthApplication.java b/chushang-modules/chushang-module-auth/auth-service/src/main/java/com/chushang/AuthApplication.java new file mode 100644 index 0000000..9cb0e57 --- /dev/null +++ b/chushang-modules/chushang-module-auth/auth-service/src/main/java/com/chushang/AuthApplication.java @@ -0,0 +1,43 @@ +package com.chushang; + +import com.chushang.common.core.enums.AppStartType; +import com.chushang.common.feign.annotation.EnableOnnFeignClients; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +/** + * 认证授权中心 + * + * @author ruoyi + */ +@EnableDiscoveryClient +@EnableOnnFeignClients +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class }) +@ServletComponentScan +public class AuthApplication extends SpringBootServletInitializer +{ + private final static Logger log = LoggerFactory.getLogger(AuthApplication.class); + private final static String APP_NAME = "系统鉴权服务应用"; + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + log.info(AppStartType.START_FORMAT, AppStartType.web_server.type(), APP_NAME); + SpringApplicationBuilder run = application.sources(AuthApplication.class); + log.info(AppStartType.END_FORMAT, AppStartType.web_server.type(), APP_NAME); + return run; + } + + public static void main(String[] args) throws Exception { + log.info(AppStartType.START_FORMAT, AppStartType.main.type(), APP_NAME); + SpringApplication.run(AuthApplication.class, args); + log.info(AppStartType.END_FORMAT, AppStartType.main.type(), APP_NAME); + } + +} diff --git a/chushang-modules/chushang-module-auth/auth-service/src/main/java/com/chushang/SanyiAuthApplication.java b/chushang-modules/chushang-module-auth/auth-service/src/main/java/com/chushang/SanyiAuthApplication.java deleted file mode 100644 index aed3342..0000000 --- a/chushang-modules/chushang-module-auth/auth-service/src/main/java/com/chushang/SanyiAuthApplication.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.chushang; - -import com.chushang.common.feign.annotation.EnableOnnFeignClients; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; - -/** - * 认证授权中心 - * - * @author ruoyi - */ -@EnableDiscoveryClient -@EnableOnnFeignClients -@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class }) -public class SanyiAuthApplication -{ - public static void main(String[] args) - { - SpringApplication.run(SanyiAuthApplication.class, args); - } -} diff --git a/chushang-modules/chushang-module-auth/auth-service/src/main/java/com/chushang/auth/controller/UserController.java b/chushang-modules/chushang-module-auth/auth-service/src/main/java/com/chushang/auth/controller/UserController.java index c21c792..4bd71a9 100644 --- a/chushang-modules/chushang-module-auth/auth-service/src/main/java/com/chushang/auth/controller/UserController.java +++ b/chushang-modules/chushang-module-auth/auth-service/src/main/java/com/chushang/auth/controller/UserController.java @@ -8,7 +8,7 @@ import com.chushang.security.auth.AuthUtil; import com.chushang.security.service.TokenService; import com.chushang.security.utils.SecurityUtils; import com.chushang.system.entity.bo.LoginBody; -import com.chushang.system.entity.vo.LoginUser; +import com.chushang.security.entity.vo.LoginUser; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -18,13 +18,12 @@ import javax.servlet.http.HttpServletRequest; /** * token 控制 - * + * * @author ruoyi */ @Slf4j @RestController @RequiredArgsConstructor(onConstructor_ = @Autowired) -@RequestMapping(value = "") public class UserController { final TokenService tokenService; diff --git a/chushang-modules/chushang-module-auth/auth-service/src/main/java/com/chushang/auth/service/UserService.java b/chushang-modules/chushang-module-auth/auth-service/src/main/java/com/chushang/auth/service/UserService.java index 6800ba0..cd82a64 100644 --- a/chushang-modules/chushang-module-auth/auth-service/src/main/java/com/chushang/auth/service/UserService.java +++ b/chushang-modules/chushang-module-auth/auth-service/src/main/java/com/chushang/auth/service/UserService.java @@ -9,7 +9,7 @@ import com.chushang.security.utils.SecurityUtils; import com.chushang.system.entity.enums.LoginStatusEnum; import com.chushang.system.entity.po.SysLoginInfo; import com.chushang.system.entity.po.SysUser; -import com.chushang.system.entity.vo.LoginUser; +import com.chushang.security.entity.vo.LoginUser; import com.chushang.system.feign.RemoteLoginInfoService; import com.chushang.system.feign.RemoteUserService; import lombok.extern.slf4j.Slf4j; @@ -33,11 +33,11 @@ public class UserService { /** * 登录 */ - public LoginUser login(String username, String password) + public LoginUser login(String username, String password) { // 查询用户信息 long start = System.currentTimeMillis(); - Result rLoginUser = remoteUserService.getUserInfo(username, SecurityConstants.INNER); + Result> rLoginUser = remoteUserService.getUserInfo(username, SecurityConstants.INNER); long end = System.currentTimeMillis(); log.info("time : {}",end - start); if (Result.FAIL_CODE == rLoginUser.getCode()){ @@ -48,7 +48,7 @@ public class UserService { recordLoginInfo(username, LoginStatusEnum.LOGIN_FAIL_STATUS, "登录用户不存在"); throw new ResultException("登录用户:" + username + " 不存在"); } - LoginUser loginUser = rLoginUser.getData(); + LoginUser loginUser = rLoginUser.getData(); SysUser sysUser = loginUser.getSysUser(); Boolean status = sysUser.getStatus(); if (!status) diff --git a/chushang-modules/chushang-module-auth/auth-service/src/main/resources/application.yml b/chushang-modules/chushang-module-auth/auth-service/src/main/resources/application.yml new file mode 100644 index 0000000..911b24d --- /dev/null +++ b/chushang-modules/chushang-module-auth/auth-service/src/main/resources/application.yml @@ -0,0 +1,53 @@ +server: + #开启优雅停机 + shutdown: graceful + port: 8083 + servlet: + context-path: /auth + tomcat: + uri-encoding: UTF-8 + threads: + max: 800 + min-spare: 100 +spring: + application: + name: @artifactId@ + main: + allow-circular-references: true + allow-bean-definition-overriding: true + cloud: + loadbalancer: + retry: + enabled: true +# feign 配置 +feign: + sentinel: + enabled: true + okhttp: + enabled: true + httpclient: + enabled: false + client: + config: + default: + connectTimeout: 10000 + readTimeout: 10000 + compression: + request: + enabled: true + response: + enabled: true +# 暴露监控端点 +management: + endpoints: + web: + exposure: + include: "*" + endpoint: + health: + show-details: ALWAYS +# 安全配置 +logging: + config: classpath:logback-nacos.xml + + diff --git a/chushang-modules/chushang-module-auth/auth-service/src/main/resources/bootstrap.yml b/chushang-modules/chushang-module-auth/auth-service/src/main/resources/bootstrap.yml index 7903935..22092f1 100644 --- a/chushang-modules/chushang-module-auth/auth-service/src/main/resources/bootstrap.yml +++ b/chushang-modules/chushang-module-auth/auth-service/src/main/resources/bootstrap.yml @@ -1,32 +1,29 @@ -server: - tomcat: - uri-encoding: UTF-8 - threads: - max: 1000 - min-spare: 30 - connection-timeout: 5000ms - port: 8080 - servlet: - context-path: /sanyi/auth spring: - application: - name: @artifactId@ + config: + import: + -: "classpath:application.yml" cloud: + loadbalancer: + cache: + enabled: false nacos: + server-addr: ${nacos.host} + username: ${nacos.username} + password: ${nacos.password} discovery: - server-addr: ${nacos.host} + server-addr: ${spring.cloud.nacos.server-addr} namespace: ${nacos.namespace} group: ${nacos.group} + service: ${spring.application.name} config: + server-addr: ${spring.cloud.nacos.server-addr} namespace: ${spring.cloud.nacos.discovery.namespace} group: ${spring.cloud.nacos.discovery.group} - server-addr: ${spring.cloud.nacos.discovery.server-addr} - file-extension: yml + file-extension: yaml + refresh-enabled: true shared-configs: - - dataId: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + - dataId: application-common.${spring.cloud.nacos.config.file-extension} group: ${nacos.group} + refresh: ${spring.cloud.nacos.config.refresh-enabled} profiles: active: @profiles.active@ - main: - allow-bean-definition-overriding: true -# auth 应当为单独的服务器, sys 为另一单独服务器 diff --git a/chushang-modules/chushang-module-auth/auth-service/src/main/resources/logback-nacos.xml b/chushang-modules/chushang-module-auth/auth-service/src/main/resources/logback-nacos.xml index b9afaf1..82ea381 100644 --- a/chushang-modules/chushang-module-auth/auth-service/src/main/resources/logback-nacos.xml +++ b/chushang-modules/chushang-module-auth/auth-service/src/main/resources/logback-nacos.xml @@ -15,7 +15,7 @@ + value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([%X{traceId}]) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> 500MB - %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + ${CONSOLE_LOG_PATTERN} info @@ -55,7 +55,7 @@ 500MB - %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + ${CONSOLE_LOG_PATTERN} debug @@ -70,7 +70,7 @@ 500MB - %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + ${CONSOLE_LOG_PATTERN} error @@ -78,8 +78,7 @@ - - + diff --git a/chushang-modules/chushang-module-gateway/pom.xml b/chushang-modules/chushang-module-gateway/pom.xml index 545abed..a55ece4 100644 --- a/chushang-modules/chushang-module-gateway/pom.xml +++ b/chushang-modules/chushang-module-gateway/pom.xml @@ -71,6 +71,7 @@ commons-io commons-io + @@ -82,4 +83,4 @@ - \ No newline at end of file + diff --git a/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/GatewayApplication.java b/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/GatewayApplication.java new file mode 100644 index 0000000..951c367 --- /dev/null +++ b/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/GatewayApplication.java @@ -0,0 +1,39 @@ +package com.chushang; + +import com.chushang.common.core.enums.AppStartType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +/** + * by zhaowenyuan create 2022/5/19 11:32 + */ +@EnableDiscoveryClient +@SpringBootApplication +@ServletComponentScan +public class GatewayApplication extends SpringBootServletInitializer { + + private final static Logger log = LoggerFactory.getLogger(GatewayApplication.class); + private final static String APP_NAME = "系统网关服务应用"; + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + log.info(AppStartType.START_FORMAT, AppStartType.web_server.type(), APP_NAME); + SpringApplicationBuilder run = application.sources(GatewayApplication.class); + log.info(AppStartType.END_FORMAT, AppStartType.web_server.type(), APP_NAME); + return run; + } + + public static void main(String[] args) throws Exception { + log.info(AppStartType.START_FORMAT, AppStartType.main.type(), APP_NAME); + SpringApplication.run(GatewayApplication.class, args); + log.info(AppStartType.END_FORMAT, AppStartType.main.type(), APP_NAME); + } + + +} diff --git a/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/SanyiGatewayApplication.java b/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/SanyiGatewayApplication.java deleted file mode 100644 index 3b26fb4..0000000 --- a/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/SanyiGatewayApplication.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.chushang; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; - -/** - * by zhaowenyuan create 2022/5/19 11:32 - */ -@EnableDiscoveryClient -@SpringBootApplication -public class SanyiGatewayApplication { - - public static void main(String[] args) { - SpringApplication.run(SanyiGatewayApplication.class, args); - } - - -} diff --git a/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/config/RouterFunctionConfiguration.java b/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/config/RouterFunctionConfiguration.java index 20194fa..4997ee1 100644 --- a/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/config/RouterFunctionConfiguration.java +++ b/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/config/RouterFunctionConfiguration.java @@ -24,7 +24,7 @@ public class RouterFunctionConfiguration { public RouterFunction routerFunction() { return RouterFunctions.route( RequestPredicates - .GET("/api/sanyi/captcha.jpg") + .GET("/api/captcha.jpg") .and(RequestPredicates.accept(MediaType.TEXT_PLAIN)) , validateCodeHandler ); diff --git a/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/filter/ApiLoggingFilter.java b/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/filter/ApiLoggingFilter.java index dcf8d0a..11ba544 100644 --- a/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/filter/ApiLoggingFilter.java +++ b/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/filter/ApiLoggingFilter.java @@ -1,7 +1,11 @@ package com.chushang.gateway.filter; +import cn.hutool.core.collection.CollectionUtil; import com.chushang.common.core.constant.CommonConstants; import com.chushang.common.core.util.IPUtils; +import com.chushang.common.core.util.IdUtils; +import com.chushang.common.core.util.ServletUtils; +import com.chushang.common.core.util.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; @@ -13,6 +17,8 @@ import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; +import java.util.List; + /** * @author zhangran * @date 2021/7/13 @@ -30,14 +36,15 @@ public class ApiLoggingFilter implements GlobalFilter, Ordered { @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + setTraceId(exchange); exchange.getAttributes().put(START_TIME, System.currentTimeMillis()); - return chain.filter(exchange).then(Mono.fromRunnable(() -> { + return chain.filter(exchange.mutate().build()).then(Mono.fromRunnable(() -> { + ServerHttpRequest request = exchange.getRequest(); if (log.isInfoEnabled()) { String info = String.format("Method:{%s} Host:{%s} Path:{%s} Query:{%s}", exchange.getRequest().getMethod().name(), exchange.getRequest().getURI().getHost(), exchange.getRequest().getURI().getPath(), exchange.getRequest().getQueryParams()); - ServerHttpRequest request = exchange.getRequest(); - String sanyiToken = request.getHeaders().getFirst(CommonConstants.HEAD_TOKEN_KEY); + String token = request.getHeaders().getFirst(CommonConstants.HEAD_TOKEN_KEY); Long startTime = exchange.getAttribute(START_TIME); if (startTime != null) { Long executeTime = (System.currentTimeMillis() - startTime); @@ -50,12 +57,22 @@ public class ApiLoggingFilter implements GlobalFilter, Ordered { // 状态码 int code = statusCode != null ? statusCode.value() : 500; // 此处 添加 到 plumelog 中, 进行数据统计 - log.info("来自IP地址: {}的请求接口: {}, 请求信息: {},请求人: {} , 响应状态码: {}, 请求耗时: {}ms", ip, api, info, sanyiToken, code, executeTime); + log.info("来自IP地址: {}的请求接口: {}, 请求信息: {},请求人: {} , 响应状态码: {}, 请求耗时: {}ms", ip, api, info, token, code, executeTime); } } })); } + + private void setTraceId(ServerWebExchange exchange){ + String traceId = exchange.getAttribute(CommonConstants.TRACE_ID); + if (StringUtils.isEmpty(traceId)){ + log.info("traceId : {}", traceId); + traceId = IdUtils.getId(32); + exchange.getAttributes().put(CommonConstants.TRACE_ID, ServletUtils.urlEncode(traceId)); + } + } + @Override public int getOrder() { return 0; diff --git a/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/filter/SanyiRequestGlobalFilter.java b/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/filter/RequestGlobalFilter.java similarity index 98% rename from chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/filter/SanyiRequestGlobalFilter.java rename to chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/filter/RequestGlobalFilter.java index ceaf3b8..f9231e8 100644 --- a/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/filter/SanyiRequestGlobalFilter.java +++ b/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/filter/RequestGlobalFilter.java @@ -1,5 +1,7 @@ package com.chushang.gateway.filter; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.IdUtil; import com.chushang.gateway.config.GatewayContext; import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j; @@ -43,7 +45,7 @@ import java.util.Objects; */ @Component @Slf4j -public class SanyiRequestGlobalFilter implements GlobalFilter, Ordered +public class RequestGlobalFilter implements GlobalFilter, Ordered { /** diff --git a/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/handler/GatewayExceptionHandler.java b/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/handler/GatewayExceptionHandler.java index d700b73..23d4ff1 100644 --- a/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/handler/GatewayExceptionHandler.java +++ b/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/handler/GatewayExceptionHandler.java @@ -39,9 +39,8 @@ public class GatewayExceptionHandler implements ErrorWebExceptionHandler { msg = "服务未找到"; } - else if (ex instanceof ResponseStatusException) + else if (ex instanceof ResponseStatusException responseStatusException) { - ResponseStatusException responseStatusException = (ResponseStatusException) ex; msg = responseStatusException.getMessage(); } else @@ -49,8 +48,8 @@ public class GatewayExceptionHandler implements ErrorWebExceptionHandler msg = "内部服务器错误"; } - log.error("[网关异常处理]请求路径:{},异常信息:{}", exchange.getRequest().getPath(), ex); + log.error("[网关异常处理]请求路径:{},异常信息:", exchange.getRequest().getPath(), ex); return ServletUtils.webFluxResponseWriter(response, msg); } -} \ No newline at end of file +} diff --git a/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/service/impl/ValidateCodeServiceImpl.java b/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/service/impl/ValidateCodeServiceImpl.java index 40b8692..2116a50 100644 --- a/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/service/impl/ValidateCodeServiceImpl.java +++ b/chushang-modules/chushang-module-gateway/src/main/java/com/chushang/gateway/service/impl/ValidateCodeServiceImpl.java @@ -93,7 +93,7 @@ public class ValidateCodeServiceImpl implements ValidateCodeService { @SneakyThrows @Override public void checkCaptcha(String code, String uuid) throws ResultException, ExecutionException, InterruptedException { - if (!"sanyi".equals(code)) { + if (!"chushang".equals(code)) { if (StringUtils.isEmpty(code)) { throw new ResultException("验证码不能为空"); } diff --git a/chushang-modules/chushang-module-gateway/src/main/resources/application.yml b/chushang-modules/chushang-module-gateway/src/main/resources/application.yml new file mode 100644 index 0000000..a8adc7b --- /dev/null +++ b/chushang-modules/chushang-module-gateway/src/main/resources/application.yml @@ -0,0 +1,104 @@ +server: + #开启优雅停机 + shutdown: graceful + port: 9999 + servlet: + context-path: /api + tomcat: + uri-encoding: UTF-8 + threads: + max: 800 + min-spare: 100 +spring: + application: + name: @artifactId@ + main: + allow-circular-references: true + allow-bean-definition-overriding: true + cloud: + loadbalancer: + retry: + enabled: true + gateway: + discovery: + locator: + # 配置之后访问时无需大写 + lower-case-service-id: true + enabled: true # 是否开启,默认为 false 关闭 + # 跨域配置 + globalcors: + corsConfigurations: + '[/**]': + allowedOrigins: '*' + allowedHeaders: '*' + allowedMethods: + - GET + - HEAD + - POST + - PUT + - DELETE + - OPTIONS + add-to-simple-url-handler-mapping: true + routes: + # 认证中心 + - id: auth-service + uri: lb://auth-service + predicates: + - Path=/api/auth/** + filters: + - StripPrefix=1 + # 验证码处理 + - CacheRequestFilter + - ValidateCodeFilter + # 系统模块 + - id: system-service + uri: lb://system-service + predicates: + - Path=/api/system/** + filters: + - StripPrefix=1 + # 定时任务 + - id: job-service + uri: lb://job-service + predicates: + - Path=/api/job/** + filters: + - StripPrefix=1 + #default-filters: + # - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin + # # 默认限流 + # - name: RequestRateLimiter + # args: + # # how many requests per second you want a user to be allowed to do, without any dropped requests + # # 每秒允许用户执行多少请求,不允许删除任何请求,这是令牌桶被填满的速率 + # redis-rate-limiter.replenishRate: 10 + # # the maximum number of requests a user is allowed to do in a single second + # # 用户在一秒钟内允许执行的最大请求数,这是令牌桶可以容纳的令牌数量。将此值设置为0将阻止所有请求。 + # redis-rate-limiter.burstCapacity: 20 + # # how many tokens a request costs. This is the number of tokens taken from the bucket for each request and defaults to 1. + # # 一个请求需要多少令牌 这是为每个请求从桶中获取的令牌数量,默认为1。 + # redis-rate-limiter.requestedTokens: 1 + # key-resolver: "#{@remoteAddrKeyResolver}" +# 安全配置 +security: + # 验证码 + captcha: + enabled: true + type: char + # 防止XSS攻击 + xss: + enabled: true + #excludeUrls: + # - /api/auth/login + # 不校验白名单 + ignore: + whites: + - /auth/logout + - /auth/login + - /auth/register + - /manager/remote/** + - /demo/** +logging: + config: classpath:logback-nacos.xml + + diff --git a/chushang-modules/chushang-module-gateway/src/main/resources/bootstrap.yml b/chushang-modules/chushang-module-gateway/src/main/resources/bootstrap.yml index 95c3ebf..22092f1 100644 --- a/chushang-modules/chushang-module-gateway/src/main/resources/bootstrap.yml +++ b/chushang-modules/chushang-module-gateway/src/main/resources/bootstrap.yml @@ -1,35 +1,29 @@ -server: - tomcat: - uri-encoding: UTF-8 - threads: - max: 1000 - min-spare: 30 - connection-timeout: 50000ms - port: 9999 - servlet: - context-path: /api/sanyi spring: -# codec: -# max-in-memory-size: 5242880 - application: - name: @artifactId@ + config: + import: + -: "classpath:application.yml" cloud: + loadbalancer: + cache: + enabled: false nacos: + server-addr: ${nacos.host} + username: ${nacos.username} + password: ${nacos.password} discovery: - server-addr: ${nacos.host} + server-addr: ${spring.cloud.nacos.server-addr} namespace: ${nacos.namespace} group: ${nacos.group} + service: ${spring.application.name} config: + server-addr: ${spring.cloud.nacos.server-addr} namespace: ${spring.cloud.nacos.discovery.namespace} group: ${spring.cloud.nacos.discovery.group} - server-addr: ${spring.cloud.nacos.discovery.server-addr} - file-extension: yml + file-extension: yaml + refresh-enabled: true shared-configs: - - dataId: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + - dataId: application-common.${spring.cloud.nacos.config.file-extension} group: ${nacos.group} + refresh: ${spring.cloud.nacos.config.refresh-enabled} profiles: active: @profiles.active@ - main: - allow-bean-definition-overriding: true - - diff --git a/chushang-modules/chushang-module-gateway/src/main/resources/logback-nacos.xml b/chushang-modules/chushang-module-gateway/src/main/resources/logback-nacos.xml index 01bfca5..82ea381 100644 --- a/chushang-modules/chushang-module-gateway/src/main/resources/logback-nacos.xml +++ b/chushang-modules/chushang-module-gateway/src/main/resources/logback-nacos.xml @@ -15,7 +15,7 @@ + value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([%X{traceId}]) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> 500MB - %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + ${CONSOLE_LOG_PATTERN} info @@ -55,7 +55,7 @@ 500MB - %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + ${CONSOLE_LOG_PATTERN} debug @@ -70,7 +70,7 @@ 500MB - %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + ${CONSOLE_LOG_PATTERN} error @@ -78,22 +78,21 @@ - - + - - - - + + + + - - - - - + + + + + @@ -102,6 +101,6 @@ - + diff --git a/chushang-modules/chushang-module-gateway/src/test/java/RedisTest.java b/chushang-modules/chushang-module-gateway/src/test/java/RedisTest.java index 03b45c3..3b565c2 100644 --- a/chushang-modules/chushang-module-gateway/src/test/java/RedisTest.java +++ b/chushang-modules/chushang-module-gateway/src/test/java/RedisTest.java @@ -1,4 +1,4 @@ -import com.chushang.SanyiGatewayApplication; +import com.chushang.GatewayApplication; import com.chushang.gateway.service.ValidateCodeService; import lombok.SneakyThrows; import org.junit.Test; @@ -11,7 +11,7 @@ import org.springframework.test.context.junit4.SpringRunner; * @author by zhaowenyuan create 2022/8/23 12:10 */ @RunWith(SpringRunner.class) -@SpringBootTest(classes = SanyiGatewayApplication.class) +@SpringBootTest(classes = GatewayApplication.class) public class RedisTest { @Autowired diff --git a/chushang-modules/chushang-module-oss/oss-feign/pom.xml b/chushang-modules/chushang-module-oss/oss-feign/pom.xml index 677d4d6..a9974c4 100644 --- a/chushang-modules/chushang-module-oss/oss-feign/pom.xml +++ b/chushang-modules/chushang-module-oss/oss-feign/pom.xml @@ -17,10 +17,6 @@ com.chushang chushang-common-mybatis - - com.chushang - chushang-common-redis - io.minio minio diff --git a/chushang-modules/chushang-module-oss/oss-service/pom.xml b/chushang-modules/chushang-module-oss/oss-service/pom.xml index 80baf12..7ca08ca 100644 --- a/chushang-modules/chushang-module-oss/oss-service/pom.xml +++ b/chushang-modules/chushang-module-oss/oss-service/pom.xml @@ -13,20 +13,6 @@ com.chushang oss-feign - - com.chushang - chushang-common-security - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - diff --git a/chushang-modules/chushang-module-oss/oss-service/src/main/java/com/chushang/oss/OssApplication.java b/chushang-modules/chushang-module-oss/oss-service/src/main/java/com/chushang/oss/OssApplication.java index bb1c04c..cb90c24 100644 --- a/chushang-modules/chushang-module-oss/oss-service/src/main/java/com/chushang/oss/OssApplication.java +++ b/chushang-modules/chushang-module-oss/oss-service/src/main/java/com/chushang/oss/OssApplication.java @@ -3,13 +3,15 @@ package com.chushang.oss; import com.chushang.common.core.enums.AppStartType; import com.chushang.common.feign.annotation.EnableOnnFeignClients; import com.chushang.common.feign.annotation.EnableTransferFeign; -import com.chushang.security.annotation.EnableCustomConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import javax.sql.DataSource; + /** * @auther: zhao * @date: 2024/4/29 10:50 @@ -17,7 +19,6 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @EnableOnnFeignClients @SpringBootApplication -@EnableCustomConfig @EnableTransferFeign public class OssApplication { diff --git a/chushang-modules/chushang-module-oss/oss-service/src/main/java/com/chushang/oss/service/impl/FileSourceService.java b/chushang-modules/chushang-module-oss/oss-service/src/main/java/com/chushang/oss/service/impl/FileSourceService.java index a8d253e..5f3cf30 100644 --- a/chushang-modules/chushang-module-oss/oss-service/src/main/java/com/chushang/oss/service/impl/FileSourceService.java +++ b/chushang-modules/chushang-module-oss/oss-service/src/main/java/com/chushang/oss/service/impl/FileSourceService.java @@ -1,11 +1,8 @@ package com.chushang.oss.service.impl; import lombok.extern.slf4j.Slf4j; -import org.redisson.api.RedissonClient; import org.springframework.stereotype.Service; -import javax.annotation.Resource; - /** * @auther: zhao * @date: 2024/4/29 10:25 @@ -14,7 +11,5 @@ import javax.annotation.Resource; @Service public class FileSourceService { - @Resource - RedissonClient redissonClient; } diff --git a/chushang-modules/chushang-module-oss/oss-service/src/main/resources/application.yml b/chushang-modules/chushang-module-oss/oss-service/src/main/resources/application.yml new file mode 100644 index 0000000..cb745d8 --- /dev/null +++ b/chushang-modules/chushang-module-oss/oss-service/src/main/resources/application.yml @@ -0,0 +1,91 @@ +server: + #开启优雅停机 + shutdown: graceful + port: 8085 + servlet: + context-path: /cs/system + tomcat: + uri-encoding: UTF-8 + threads: + max: 800 + min-spare: 100 +spring: + application: + name: @artifactId@ + # 如果需要使用读写分离, 此处需要改造, 有没有办法不用改? + datasource: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + username: ${conf.jdbc.cs.master.username} + password: ${conf.jdbc.cs.master.password} + url: jdbc:mysql://${conf.jdbc.cs.master.host}:${conf.jdbc.cs.master.port}/${conf.jdbc.cs.master.database}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai + hikari: + # 最大线程池数量 + maximum-pool-size: 30 + # 最小线程池数量 + minimum-idle: 5 + # 检测连接 + connection-test-query: SELECT 1 + # 连接超时时间 默认30分钟 + connection-timeout: 30000 + # 连接最大生存期间, 默认30分钟 + #max-lifetime: 300000 + devtools: + restart: + enabled: true + jackson: + default-property-inclusion: ALWAYS + time-zone: GMT+8 + date-format: yyyy-MM-dd HH:mm:ss +# mybaits-plus配置 +mybatis-plus: + # 全局刷新 mapper + mapper-locations: classpath:/mapper/**/*.xml + global-config: + refresh: + enable: true + db-config: + id-type: auto + table-underline: true + logic-delete-value: 1 + logic-not-delete-value: 0 + configuration: + map-underscore-to-camel-case: true + cache-enabled: false + call-setters-on-nulls: true + jdbc-type-for-null: 'null' + default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler + #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl +# feign 配置 +feign: + sentinel: + enabled: true + okhttp: + enabled: true + httpclient: + enabled: false + client: + config: + default: + connectTimeout: 10000 + readTimeout: 10000 + compression: + request: + enabled: true + response: + enabled: true +# 暴露监控端点 +management: + endpoints: + web: + exposure: + include: "*" + endpoint: + health: + show-details: ALWAYS + +# 日志监听配置 -- 如果启用的话,需要配置 kafka 的路径 +logging: + config: classpath:logback-nacos.xml + + diff --git a/chushang-modules/chushang-module-oss/oss-service/src/main/resources/bootstrap.yml b/chushang-modules/chushang-module-oss/oss-service/src/main/resources/bootstrap.yml index 8d050a8..274f11c 100644 --- a/chushang-modules/chushang-module-oss/oss-service/src/main/resources/bootstrap.yml +++ b/chushang-modules/chushang-module-oss/oss-service/src/main/resources/bootstrap.yml @@ -9,10 +9,19 @@ server: servlet: context-path: /sanyi/oss spring: + config: + import: + -: "classpath:application.yml" + application: name: @artifactId@ cloud: + loadbalancer: + cache: + enabled: false nacos: + username: nacos + password: nacos discovery: server-addr: ${nacos.host} namespace: ${nacos.namespace} @@ -21,10 +30,12 @@ spring: namespace: ${spring.cloud.nacos.discovery.namespace} group: ${spring.cloud.nacos.discovery.group} server-addr: ${spring.cloud.nacos.discovery.server-addr} - file-extension: yml + file-extension: yaml + refresh-enabled: true shared-configs: - dataId: application-common.${spring.cloud.nacos.config.file-extension} - group: ${nacos.group} + group: ${spring.cloud.nacos.discovery.group} + refresh: ${spring.cloud.nacos.config.refresh-enabled} profiles: active: @profiles.active@ main: diff --git a/chushang-modules/chushang-module-oss/pom.xml b/chushang-modules/chushang-module-oss/pom.xml index 411e0ef..f100b66 100644 --- a/chushang-modules/chushang-module-oss/pom.xml +++ b/chushang-modules/chushang-module-oss/pom.xml @@ -31,5 +31,20 @@ - - \ No newline at end of file + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + diff --git a/chushang-modules/chushang-module-system/pom.xml b/chushang-modules/chushang-module-system/pom.xml index f2254b9..3aac9fc 100644 --- a/chushang-modules/chushang-module-system/pom.xml +++ b/chushang-modules/chushang-module-system/pom.xml @@ -23,5 +23,34 @@ system-feign system-service + + + + de.codecentric + spring-boot-admin-starter-client + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + org.springframework.boot + spring-boot-devtools + + - \ No newline at end of file + diff --git a/chushang-modules/chushang-module-system/system-feign/pom.xml b/chushang-modules/chushang-module-system/system-feign/pom.xml index 95f536e..444e044 100644 --- a/chushang-modules/chushang-module-system/system-feign/pom.xml +++ b/chushang-modules/chushang-module-system/system-feign/pom.xml @@ -25,5 +25,9 @@ com.chushang chushang-common-feign + + com.chushang + chushang-common-security + - \ No newline at end of file + diff --git a/chushang-modules/chushang-module-system/system-feign/src/main/java/com/chushang/system/feign/RemoteUserService.java b/chushang-modules/chushang-module-system/system-feign/src/main/java/com/chushang/system/feign/RemoteUserService.java index 8616840..44f6ade 100644 --- a/chushang-modules/chushang-module-system/system-feign/src/main/java/com/chushang/system/feign/RemoteUserService.java +++ b/chushang-modules/chushang-module-system/system-feign/src/main/java/com/chushang/system/feign/RemoteUserService.java @@ -2,8 +2,9 @@ package com.chushang.system.feign; import com.chushang.common.core.constant.SecurityConstants; import com.chushang.common.core.web.Result; +import com.chushang.security.entity.vo.LoginUser; import com.chushang.system.constants.SystemConstants; -import com.chushang.system.entity.vo.LoginUser; +import com.chushang.system.entity.po.SysUser; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -26,6 +27,6 @@ public interface RemoteUserService { * @return 结果 */ @GetMapping("/info/{username}") - Result getUserInfo(@PathVariable(value = "username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + Result> getUserInfo(@PathVariable(value = "username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); } diff --git a/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/SystemApplication.java b/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/SystemApplication.java index 5b45c55..bb86853 100644 --- a/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/SystemApplication.java +++ b/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/SystemApplication.java @@ -1,22 +1,45 @@ package com.chushang.system; +import com.chushang.common.core.enums.AppStartType; import com.chushang.common.feign.annotation.EnableOnnFeignClients; +import com.chushang.common.feign.annotation.EnableTransferFeign; import com.chushang.security.annotation.EnableCustomConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.transaction.annotation.EnableTransactionManagement; /** * @author by zhaowenyuan create 2022/8/18 17:08 */ @EnableDiscoveryClient @EnableOnnFeignClients +@EnableTransactionManagement @SpringBootApplication @EnableCustomConfig -public class SystemApplication { +//启用服务调用的参数传递,包含链路追踪日志 +@EnableTransferFeign +@ServletComponentScan +public class SystemApplication extends SpringBootServletInitializer { + private final static Logger log = LoggerFactory.getLogger(SystemApplication.class); + private final static String APP_NAME = "系统管理服务应用"; - public static void main(String[] args) - { + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + log.info(AppStartType.START_FORMAT, AppStartType.web_server.type(), APP_NAME); + SpringApplicationBuilder run = application.sources(SystemApplication.class); + log.info(AppStartType.END_FORMAT, AppStartType.web_server.type(), APP_NAME); + return run; + } + + public static void main(String[] args) throws Exception { + log.info(AppStartType.START_FORMAT, AppStartType.main.type(), APP_NAME); SpringApplication.run(SystemApplication.class, args); + log.info(AppStartType.END_FORMAT, AppStartType.main.type(), APP_NAME); } } diff --git a/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/aspect/DataScopeAspect.java b/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/aspect/DataScopeAspect.java index 0cff151..4870139 100644 --- a/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/aspect/DataScopeAspect.java +++ b/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/aspect/DataScopeAspect.java @@ -10,7 +10,7 @@ import com.chushang.security.utils.SecurityUtils; import com.chushang.system.annotation.DataScope; import com.chushang.system.entity.po.SysRole; import com.chushang.system.entity.po.SysUser; -import com.chushang.system.entity.vo.LoginUser; +import com.chushang.security.entity.vo.LoginUser; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; @@ -71,7 +71,7 @@ public class DataScopeAspect { protected void handleDataScope(final JoinPoint joinPoint) { // 获取当前的用户 - LoginUser loginUser = SecurityUtils.getLoginUser(); + LoginUser loginUser = SecurityUtils.getLoginUser(); if (StringUtils.isNotNull(loginUser)) { SysUser currentUser = loginUser.getSysUser(); // 如果是超级管理员,则不过滤数据 diff --git a/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/controller/MenuController.java b/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/controller/MenuController.java index 76644da..87cb941 100644 --- a/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/controller/MenuController.java +++ b/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/controller/MenuController.java @@ -9,7 +9,7 @@ import com.chushang.security.utils.SecurityUtils; import com.chushang.system.entity.dto.ListMenuDTO; import com.chushang.system.entity.po.SysMenu; import com.chushang.system.entity.po.SysUser; -import com.chushang.system.entity.vo.LoginUser; +import com.chushang.security.entity.vo.LoginUser; import com.chushang.system.service.ISysMenuService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; @@ -153,7 +153,7 @@ public class MenuController { @GetMapping("/getRouters") public AjaxResult getRouters() { - LoginUser loginUser = SecurityUtils.getLoginUser(); + LoginUser loginUser = SecurityUtils.getLoginUser(); SysUser sysUser = loginUser.getSysUser(); List menus = menuService.selectMenuTreeByUserId(sysUser); return AjaxResult.success(menuService.buildMenus(menus)); diff --git a/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/controller/UserController.java b/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/controller/UserController.java index 471c395..23cff0b 100644 --- a/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/controller/UserController.java +++ b/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/controller/UserController.java @@ -16,7 +16,7 @@ import com.chushang.system.entity.dto.ListUserDTO; import com.chushang.system.entity.po.SysRole; import com.chushang.system.entity.po.SysUser; import com.chushang.system.entity.po.SysUserData; -import com.chushang.system.entity.vo.LoginUser; +import com.chushang.security.entity.vo.LoginUser; import com.chushang.system.feign.RemoteUserService; import com.chushang.system.service.ISysPermissionService; import com.chushang.system.service.ISysRoleService; @@ -100,7 +100,7 @@ public class UserController implements RemoteUserService { @PutMapping("/profile") public AjaxResult updateProfile(@RequestBody SysUser user) { - LoginUser loginUser = SecurityUtils.getLoginUser(); + LoginUser loginUser = SecurityUtils.getLoginUser(); String username = user.getUsername(); if (!sysUserService.checkUsername(username)){ SysUser sysUser = loginUser.getSysUser(); @@ -198,7 +198,7 @@ public class UserController implements RemoteUserService { @PutMapping("/updatePwd") public AjaxResult updatePwd(@RequestBody @Valid PasswordForm form) { - LoginUser loginUser = SecurityUtils.getLoginUser(); + LoginUser loginUser = SecurityUtils.getLoginUser(); SysUser sysUser = loginUser.getSysUser(); if (!SecurityUtils.matchesPassword(form.getOldPassword(), sysUser.getSalt(), sysUser.getPassword())){ @@ -285,7 +285,7 @@ public class UserController implements RemoteUserService { @InnerAuth @GetMapping("/info/{username}") - public Result getUserInfo(@PathVariable("username") String username, String source) + public Result> getUserInfo(@PathVariable("username") String username, String source) { SysUser sysUser = sysUserService.selectUserByUserName(username); if (StringUtils.isNull(sysUser)) { @@ -297,7 +297,7 @@ public class UserController implements RemoteUserService { // 权限集合 Set permissions = permissionService.getMenuPermission(sysUser); - LoginUser sysUserVo = new LoginUser(); + LoginUser sysUserVo = new LoginUser<>(); sysUserVo.setUserId(sysUser.getUserId()); sysUserVo.setUsername(sysUser.getUsername()); sysUserVo.setSysUser(sysUser); diff --git a/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/service/impl/SysRoleServiceImpl.java b/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/service/impl/SysRoleServiceImpl.java index 55c9b7e..e5774c2 100644 --- a/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/service/impl/SysRoleServiceImpl.java +++ b/chushang-modules/chushang-module-system/system-service/src/main/java/com/chushang/system/service/impl/SysRoleServiceImpl.java @@ -16,7 +16,7 @@ import com.chushang.system.entity.bo.CancelUserRole; import com.chushang.system.entity.dto.ListRoleDTO; import com.chushang.system.entity.po.SysRole; import com.chushang.system.entity.po.SysUser; -import com.chushang.system.entity.vo.LoginUser; +import com.chushang.security.entity.vo.LoginUser; import com.chushang.system.service.ISysRoleDeptService; import com.chushang.system.service.ISysRoleService; import com.chushang.system.service.ISysUserRoleService; @@ -106,7 +106,7 @@ public class SysRoleServiceImpl extends ServiceImpl impl @Override @Transactional public void saveRole(SysRole role) { - LoginUser loginUser = SecurityUtils.getLoginUser(); + LoginUser loginUser = SecurityUtils.getLoginUser(); SysUser sysUser = loginUser.getSysUser(); Integer deptId = sysUser.getDeptId(); diff --git a/chushang-modules/chushang-module-system/system-service/src/main/resources/application.yml b/chushang-modules/chushang-module-system/system-service/src/main/resources/application.yml index 8c2bd0c..74ce3f8 100644 --- a/chushang-modules/chushang-module-system/system-service/src/main/resources/application.yml +++ b/chushang-modules/chushang-module-system/system-service/src/main/resources/application.yml @@ -3,7 +3,7 @@ server: shutdown: graceful port: 8085 servlet: - context-path: /cs/system + context-path: /system tomcat: uri-encoding: UTF-8 threads: @@ -16,9 +16,9 @@ spring: datasource: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver - username: ${conf.jdbc.cs.master.username} - password: ${conf.jdbc.cs.master.password} - url: jdbc:mysql://${conf.jdbc.cs.master.host}:${conf.jdbc.cs.master.port}/${conf.jdbc.cs.master.database}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai + username: ${config.jdbc.cs.master.username} + password: ${config.jdbc.cs.master.password} + url: jdbc:mysql://${config.jdbc.cs.master.host}:${config.jdbc.cs.master.port}/${config.jdbc.cs.master.database}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true hikari: # 最大线程池数量 maximum-pool-size: 30 @@ -39,8 +39,11 @@ spring: date-format: yyyy-MM-dd HH:mm:ss # mybaits-plus配置 mybatis-plus: + # 全局刷新 mapper mapper-locations: classpath:/mapper/**/*.xml global-config: + refresh: + enable: true db-config: id-type: auto table-underline: true @@ -79,4 +82,10 @@ management: include: "*" endpoint: health: - show-details: ALWAYS \ No newline at end of file + show-details: ALWAYS + +# 日志监听配置 -- 如果启用的话,需要配置 kafka 的路径 +logging: + config: classpath:logback-nacos.xml + + diff --git a/chushang-modules/chushang-module-system/system-service/src/main/resources/bootstrap.yaml.b b/chushang-modules/chushang-module-system/system-service/src/main/resources/bootstrap.yaml.b new file mode 100644 index 0000000..fe77bd1 --- /dev/null +++ b/chushang-modules/chushang-module-system/system-service/src/main/resources/bootstrap.yaml.b @@ -0,0 +1,34 @@ +spring: + config: + import: + -: "classpath:application.yml" + cloud: + loadbalancer: + cache: + enabled: false + nacos: + server-addr: ${nacos.host} + username: ${nacos.username} + password: ${nacos.password} + discovery: + server-addr: ${nacos.host} + namespace: ${nacos.namespace} + group: ${nacos.group} + service: ${spring.application.name} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + namespace: ${spring.cloud.nacos.discovery.namespace} + group: ${spring.cloud.nacos.discovery.group} + file-extension: yaml + refresh-enabled: true + prefix: ${spring.application.name} + shared-configs: + - dataId: application-common.${spring.cloud.nacos.config.file-extension} + group: ${spring.cloud.nacos.discovery.group} + refresh: ${spring.cloud.nacos.config.refresh-enabled} + extension-configs: + - data-id: ${spring.application.name}.${spring.cloud.nacos.config.file-extension} + group: ${spring.cloud.nacos.discovery.group} + refresh: ${spring.cloud.nacos.config.refresh-enabled} + profiles: + active: @profiles.active@ diff --git a/chushang-modules/chushang-module-system/system-service/src/main/resources/bootstrap.yml b/chushang-modules/chushang-module-system/system-service/src/main/resources/bootstrap.yml index e74a593..22092f1 100644 --- a/chushang-modules/chushang-module-system/system-service/src/main/resources/bootstrap.yml +++ b/chushang-modules/chushang-module-system/system-service/src/main/resources/bootstrap.yml @@ -8,29 +8,22 @@ spring: enabled: false nacos: server-addr: ${nacos.host} - username: nacos - password: nacos + username: ${nacos.username} + password: ${nacos.password} discovery: - server-addr: ${nacos.host} + server-addr: ${spring.cloud.nacos.server-addr} namespace: ${nacos.namespace} group: ${nacos.group} service: ${spring.application.name} config: - server-addr: ${spring.cloud.nacos.discovery.server-addr} + server-addr: ${spring.cloud.nacos.server-addr} namespace: ${spring.cloud.nacos.discovery.namespace} group: ${spring.cloud.nacos.discovery.group} file-extension: yaml refresh-enabled: true - prefix: ${spring.application.name} shared-configs: - dataId: application-common.${spring.cloud.nacos.config.file-extension} group: ${nacos.group} refresh: ${spring.cloud.nacos.config.refresh-enabled} - extension-configs: - - data-id: ${spring.application.name}.${spring.cloud.nacos.config.file-extension} - group: ${spring.cloud.nacos.discovery.group} - refresh: ${spring.cloud.nacos.config.refresh-enabled} profiles: active: @profiles.active@ - main: - allow-bean-definition-overriding: true \ No newline at end of file diff --git a/chushang-modules/chushang-module-system/system-service/src/main/resources/logback-nacos.xml b/chushang-modules/chushang-module-system/system-service/src/main/resources/logback-nacos.xml index ac72426..82ea381 100644 --- a/chushang-modules/chushang-module-system/system-service/src/main/resources/logback-nacos.xml +++ b/chushang-modules/chushang-module-system/system-service/src/main/resources/logback-nacos.xml @@ -1,4 +1,6 @@ + + @@ -11,15 +13,24 @@ + + + + + + + - %boldCyan(%d{yyyy-MM-dd HH:mm:ss.SSS}) TRACE[%X{trace:-}/%X{span:-}] [%highlight(%-5p)][%cyan(%t)][%magenta(%c{50})-%boldMagenta(%M)][%cn] - %msg%n + ${CONSOLE_LOG_PATTERN} UTF-8 - ${log.path}/info.log @@ -29,7 +40,7 @@ 500MB - TRACE[%X{trace:-}/%X{span:-}] %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + ${CONSOLE_LOG_PATTERN} info @@ -44,7 +55,7 @@ 500MB - TRACE[%X{trace:-}/%X{span:-}] %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + ${CONSOLE_LOG_PATTERN} debug @@ -59,7 +70,7 @@ 500MB - TRACE[%X{trace:-}/%X{span:-}] %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + ${CONSOLE_LOG_PATTERN} error @@ -67,8 +78,7 @@ - - + diff --git a/chushang-modules/chushang-module-system/system-service/src/test/java/DemoTest.java b/chushang-modules/chushang-module-system/system-service/src/test/java/DemoTest.java index 9dc21fc..b1392ca 100644 --- a/chushang-modules/chushang-module-system/system-service/src/test/java/DemoTest.java +++ b/chushang-modules/chushang-module-system/system-service/src/test/java/DemoTest.java @@ -7,7 +7,7 @@ import com.chushang.system.entity.enums.AuthTypeEnum; import com.chushang.system.entity.po.SysMenu; import com.chushang.system.entity.po.SysUser; import com.chushang.system.entity.po.SysUserData; -import com.chushang.system.entity.vo.LoginUser; +import com.chushang.security.entity.vo.LoginUser; import com.chushang.system.entity.vo.RouterVo; import com.chushang.system.service.*; import lombok.extern.slf4j.Slf4j; diff --git a/chushang-modules/pom.xml b/chushang-modules/pom.xml index 266782d..cbfffb6 100644 --- a/chushang-modules/pom.xml +++ b/chushang-modules/pom.xml @@ -17,5 +17,16 @@ chushang-module-system chushang-module-oss + + + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.boot + spring-boot-devtools + + - \ No newline at end of file + diff --git a/pom.xml b/pom.xml index 09cbcbb..3674d26 100644 --- a/pom.xml +++ b/pom.xml @@ -18,12 +18,26 @@ - local-dev + cloud cloud - 192.168.116.115:8848 - cloud + 192.168.110.75:8848 + 5512c576-2976-4334-b6f5-fe7c3014f654 DEFAULT_GROUP + nacos + nacos@123 + localhost:5003 + + + + local + + local + 192.168.116.115:8848 + ece94e7d-4792-48d2-b1f8-06334b530944 + DEFAULT_GROUP + nacos + nacos localhost:5003 @@ -33,6 +47,10 @@ UTF-8 17 17 + 2.7.14 + 2021.0.5 + 2021.0.5.0 + 2.7.14 5.8.9 0.0.28 @@ -51,10 +69,7 @@ 4.3 2.0.0-beta8 7.14.0 - 2.7.14 3.6.7 - 2021.0.5 - 2021.0.5.0 8.0.33 1.21 2.3.2 @@ -83,7 +98,7 @@ 0.1.55 2.0.43 - 2.7.14 + 3.11.0 3.1.0 3.3.0 @@ -103,12 +118,6 @@ org.springframework.cloud spring-cloud-starter-bootstrap - - - com.taobao.arthas - arthas-spring-boot-starter - runtime - org.springframework.boot @@ -141,27 +150,6 @@ javax.xml.bind jaxb-api - - - de.codecentric - spring-boot-admin-starter-client - - - - org.springframework.boot - spring-boot-devtools - true - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - @@ -248,6 +236,13 @@ + + + com.taobao.arthas + arthas-spring-boot-starter + ${spring-boot.version} + runtime + mysql mysql-connector-java