diff --git a/README.md b/README.md index 3f787620..a3fe734f 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ star Build Status Build Status - Downloads + Downloads

diff --git a/_doc/ChangeLog.md b/_doc/ChangeLog.md index 19d3357f..46adedf5 100644 --- a/_doc/ChangeLog.md +++ b/_doc/ChangeLog.md @@ -1,4 +1,6 @@ # CHANGELOG +## [v3.0.0.beta5] 2025-03-15 + ## [v3.0.0.beta4] 2025-01-10 - 新增: 微信服务商支付支持 - 新增: 支付宝服务商支付支持 diff --git a/_doc/Task.md b/_doc/Task.md index a3d75417..9691d913 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -1,5 +1,5 @@ # 单商户 -## 3.0.0.beta4 功能优化和服务商支付 +## 3.0.0.beta5 功能优化和服务商支付 - [ ] 网关配套移动端开发 - [ ] 同步回调页 - [x] 对各种交易增加新的同步失败异常处理, 防止同步失败后无限进行同步 diff --git a/bootx-platform/bootx-platform-common/common-cache/pom.xml b/bootx-platform/bootx-platform-common/common-cache/pom.xml index 58fb9b93..5ca4882c 100644 --- a/bootx-platform/bootx-platform-common/common-cache/pom.xml +++ b/bootx-platform/bootx-platform-common/common-cache/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta4 + 3.0.0.beta5 common-cache diff --git a/bootx-platform/bootx-platform-common/common-cache/src/main/java/cn/bootx/platform/common/cache/manager/CachingConfiguration.java b/bootx-platform/bootx-platform-common/common-cache/src/main/java/cn/bootx/platform/common/cache/manager/CachingConfiguration.java index f967c099..72e8b3de 100644 --- a/bootx-platform/bootx-platform-common/common-cache/src/main/java/cn/bootx/platform/common/cache/manager/CachingConfiguration.java +++ b/bootx-platform/bootx-platform-common/common-cache/src/main/java/cn/bootx/platform/common/cache/manager/CachingConfiguration.java @@ -7,7 +7,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cache.CacheManager; -import org.springframework.cache.annotation.CachingConfigurer; +import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.context.annotation.Bean; @@ -31,7 +31,7 @@ import java.time.Duration; @EnableConfigurationProperties(CachingProperties.class) @ConditionalOnClass(CacheManager.class) @ConditionalOnProperty(prefix = "bootx-platform.cache", value = "enabled", havingValue = "true", matchIfMissing = true) -public class CachingConfiguration implements CachingConfigurer { +public class CachingConfiguration extends CachingConfigurerSupport { private final CachingProperties cachingProperties; diff --git a/bootx-platform/bootx-platform-common/common-config/pom.xml b/bootx-platform/bootx-platform-common/common-config/pom.xml index 599f84a5..4d5fc6d4 100644 --- a/bootx-platform/bootx-platform-common/common-config/pom.xml +++ b/bootx-platform/bootx-platform-common/common-config/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta4 + 3.0.0.beta5 common-config diff --git a/bootx-platform/bootx-platform-common/common-config/src/main/java/cn/bootx/platform/common/config/BootxConfigProperties.java b/bootx-platform/bootx-platform-common/common-config/src/main/java/cn/bootx/platform/common/config/BootxConfigProperties.java index 1c4e3a71..a7786de0 100644 --- a/bootx-platform/bootx-platform-common/common-config/src/main/java/cn/bootx/platform/common/config/BootxConfigProperties.java +++ b/bootx-platform/bootx-platform-common/common-config/src/main/java/cn/bootx/platform/common/config/BootxConfigProperties.java @@ -1,11 +1,15 @@ package cn.bootx.platform.common.config; +import cn.bootx.platform.common.config.enums.DeployMode; import lombok.Getter; import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; +import java.util.ArrayList; +import java.util.List; + /** - * swagger配置 + * 系统配置配置 * * @author xxm * @since 2020/4/9 13:36 @@ -16,6 +20,15 @@ import org.springframework.boot.context.properties.ConfigurationProperties; public class BootxConfigProperties { /** 终端编码 */ + @Deprecated private String clientCode = ""; + /** + * 终端列表, 开启融合模式后才会生效, 表示当前系统集成了哪些终端模块 + */ + private List clientCodes = new ArrayList<>(); + + /** 系统部署方式 */ + private DeployMode deployMode = DeployMode.FUSION; + } diff --git a/bootx-platform/bootx-platform-common/common-config/src/main/java/cn/bootx/platform/common/config/enums/DeployMode.java b/bootx-platform/bootx-platform-common/common-config/src/main/java/cn/bootx/platform/common/config/enums/DeployMode.java new file mode 100644 index 00000000..df51dd95 --- /dev/null +++ b/bootx-platform/bootx-platform-common/common-config/src/main/java/cn/bootx/platform/common/config/enums/DeployMode.java @@ -0,0 +1,18 @@ +package cn.bootx.platform.common.config.enums; + +/** + * 部署模式 + * @author xxm + * @since 2025/1/31 + */ +public enum DeployMode { + + /** + * 分模块部署, 如果有多个业务系统, 每套业务系统都是构建为独立的jar进行部署, 不同业务系统天生进行隔离 + */ + MODULE, + /** + * 融合部署, 如果有多个业务系统, 但打包成一个jar进行部署的模式, 自行处理业务系统的隔离 + */ + FUSION; +} diff --git a/bootx-platform/bootx-platform-common/common-exception-handler/pom.xml b/bootx-platform/bootx-platform-common/common-exception-handler/pom.xml index 2592c412..54bf777b 100644 --- a/bootx-platform/bootx-platform-common/common-exception-handler/pom.xml +++ b/bootx-platform/bootx-platform-common/common-exception-handler/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta4 + 3.0.0.beta5 common-exception-handler diff --git a/bootx-platform/bootx-platform-common/common-exception-handler/src/main/java/cn/bootx/platform/common/exceptionhandler/handler/RestExceptionHandler.java b/bootx-platform/bootx-platform-common/common-exception-handler/src/main/java/cn/bootx/platform/common/exceptionhandler/handler/RestExceptionHandler.java index b06096bf..27c25780 100644 --- a/bootx-platform/bootx-platform-common/common-exception-handler/src/main/java/cn/bootx/platform/common/exceptionhandler/handler/RestExceptionHandler.java +++ b/bootx-platform/bootx-platform-common/common-exception-handler/src/main/java/cn/bootx/platform/common/exceptionhandler/handler/RestExceptionHandler.java @@ -18,6 +18,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.http.converter.HttpMessageConversionException; import org.springframework.validation.BindException; import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @@ -86,6 +87,19 @@ public class RestExceptionHandler { return Res.response(CommonErrorCode.VALIDATE_PARAMETERS_ERROR, message.toString(), MDC.get(CommonCode.TRACE_ID)); } + /** + * 请求参数校验未通过 + */ + @ExceptionHandler({ MethodArgumentNotValidException.class }) + public Result handleBusinessException(MethodArgumentNotValidException ex) { + log.info(ex.getMessage(), ex); + StringBuilder message = new StringBuilder(); + for (var violation : ex.getAllErrors()) { + message.append(violation.getDefaultMessage()).append(System.lineSeparator()); + } + return Res.response(CommonErrorCode.VALIDATE_PARAMETERS_ERROR, message.toString(), MDC.get(CommonCode.TRACE_ID)); + } + /** * 不支持 HTTP 请求方法异常 */ diff --git a/bootx-platform/bootx-platform-common/common-header-holder/pom.xml b/bootx-platform/bootx-platform-common/common-header-holder/pom.xml index f75fdba9..2a3d6664 100644 --- a/bootx-platform/bootx-platform-common/common-header-holder/pom.xml +++ b/bootx-platform/bootx-platform-common/common-header-holder/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta4 + 3.0.0.beta5 common-header-holder diff --git a/bootx-platform/bootx-platform-common/common-header-holder/src/main/java/cn/bootx/platform/common/headerholder/HeaderHolder.java b/bootx-platform/bootx-platform-common/common-header-holder/src/main/java/cn/bootx/platform/common/headerholder/HeaderHolder.java index 53e4ed84..ca6bd96d 100644 --- a/bootx-platform/bootx-platform-common/common-header-holder/src/main/java/cn/bootx/platform/common/headerholder/HeaderHolder.java +++ b/bootx-platform/bootx-platform-common/common-header-holder/src/main/java/cn/bootx/platform/common/headerholder/HeaderHolder.java @@ -1,7 +1,6 @@ package cn.bootx.platform.common.headerholder; import cn.bootx.platform.common.headerholder.local.HolderContextHolder; -import cn.bootx.platform.core.code.WebHeaderCode; import jakarta.servlet.http.HttpServletRequest; import lombok.experimental.UtilityClass; import org.springframework.web.context.request.RequestAttributes; @@ -19,12 +18,6 @@ import java.util.Objects; @UtilityClass public class HeaderHolder { - /** - * 获取幂等令牌 - */ - public String getIdempotentToken() { - return getHeader(WebHeaderCode.IDEMPOTENT_TOKEN); - } /** * 获取请求头参数 diff --git a/bootx-platform/bootx-platform-common/common-header-holder/src/main/java/cn/bootx/platform/common/headerholder/filter/WebHeaderHolderInterceptor.java b/bootx-platform/bootx-platform-common/common-header-holder/src/main/java/cn/bootx/platform/common/headerholder/filter/WebHeaderHolderInterceptor.java index 42c059ef..1ee3ce3e 100644 --- a/bootx-platform/bootx-platform-common/common-header-holder/src/main/java/cn/bootx/platform/common/headerholder/filter/WebHeaderHolderInterceptor.java +++ b/bootx-platform/bootx-platform-common/common-header-holder/src/main/java/cn/bootx/platform/common/headerholder/filter/WebHeaderHolderInterceptor.java @@ -8,20 +8,26 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.boot.web.servlet.filter.OrderedFilter; import org.springframework.web.filter.OncePerRequestFilter; import java.io.IOException; import java.util.Enumeration; /** - * 请求头保存 + * 请求头数据保存, 放在过滤链最前方 * * @author xxm * @since 2021/4/20 */ @RequiredArgsConstructor @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) -public class WebHeaderHolderInterceptor extends OncePerRequestFilter { +public class WebHeaderHolderInterceptor extends OncePerRequestFilter implements OrderedFilter { + + @Override + public int getOrder() { + return HIGHEST_PRECEDENCE; + } @Override public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) @@ -36,7 +42,8 @@ public class WebHeaderHolderInterceptor extends OncePerRequestFilter { Enumeration headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String header = headerNames.nextElement(); - HolderContextHolder.put(header, request.getHeader(header)); + // key值统一转换为小写 + HolderContextHolder.put(header.toLowerCase(), request.getHeader(header)); } chain.doFilter(request, response); } @@ -44,5 +51,4 @@ public class WebHeaderHolderInterceptor extends OncePerRequestFilter { HolderContextHolder.clear(); } } - } diff --git a/bootx-platform/bootx-platform-common/common-jackson/pom.xml b/bootx-platform/bootx-platform-common/common-jackson/pom.xml index 1a436243..5e628f5c 100644 --- a/bootx-platform/bootx-platform-common/common-jackson/pom.xml +++ b/bootx-platform/bootx-platform-common/common-jackson/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta4 + 3.0.0.beta5 common-jackson diff --git a/bootx-platform/bootx-platform-common/common-log/pom.xml b/bootx-platform/bootx-platform-common/common-log/pom.xml index 53ad9fe2..d354ff03 100644 --- a/bootx-platform/bootx-platform-common/common-log/pom.xml +++ b/bootx-platform/bootx-platform-common/common-log/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta4 + 3.0.0.beta5 common-log diff --git a/bootx-platform/bootx-platform-common/common-log/src/main/java/cn/bootx/platform/common/log/handler/LogTraceHeaderHolderFilter.java b/bootx-platform/bootx-platform-common/common-log/src/main/java/cn/bootx/platform/common/log/handler/LogTraceHeaderHolderFilter.java index e1ee7179..e23a64b6 100644 --- a/bootx-platform/bootx-platform-common/common-log/src/main/java/cn/bootx/platform/common/log/handler/LogTraceHeaderHolderFilter.java +++ b/bootx-platform/bootx-platform-common/common-log/src/main/java/cn/bootx/platform/common/log/handler/LogTraceHeaderHolderFilter.java @@ -9,7 +9,7 @@ import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.slf4j.MDC; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; -import org.springframework.core.annotation.Order; +import org.springframework.boot.web.servlet.filter.OrderedFilter; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; @@ -21,11 +21,10 @@ import java.io.IOException; * @author xxm * @since 2021/4/20 */ -@Order(value = Integer.MIN_VALUE) @Component @RequiredArgsConstructor @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) -public class LogTraceHeaderHolderFilter extends OncePerRequestFilter { +public class LogTraceHeaderHolderFilter extends OncePerRequestFilter implements OrderedFilter { @Override public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) @@ -41,4 +40,8 @@ public class LogTraceHeaderHolderFilter extends OncePerRequestFilter { } } + @Override + public int getOrder() { + return HIGHEST_PRECEDENCE+100; + } } diff --git a/bootx-platform/bootx-platform-common/common-mybatis-plus/pom.xml b/bootx-platform/bootx-platform-common/common-mybatis-plus/pom.xml index d9b25dc2..6edaca6a 100644 --- a/bootx-platform/bootx-platform-common/common-mybatis-plus/pom.xml +++ b/bootx-platform/bootx-platform-common/common-mybatis-plus/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta4 + 3.0.0.beta5 common-mybatis-plus @@ -22,9 +22,8 @@ com.baomidou mybatis-plus-spring-boot3-starter - ${mybatis-plus.version} - + com.baomidou mybatis-plus-jsqlparser @@ -59,8 +58,12 @@ easy-trans-mybatis-plus-extend ${easytrans.version} + + cn.bootx.platform + common-spring + ${bootx-platform.version} + - diff --git a/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/aspect/DataPermScopeAspect.java b/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/aspect/DataPermScopeAspect.java new file mode 100644 index 00000000..0fe3f876 --- /dev/null +++ b/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/aspect/DataPermScopeAspect.java @@ -0,0 +1,40 @@ +package cn.bootx.platform.common.mybatisplus.aspect; + +import cn.bootx.platform.common.mybatisplus.local.DataPermContextHolder; +import cn.bootx.platform.common.spring.util.AopUtil; +import cn.bootx.platform.core.annotation.DataPermScope; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; + +/** + * 数据权限注解处理切面 + * @author xxm + * @since 2025/2/2 + */ +@Slf4j +@Aspect +@Component +@RequiredArgsConstructor +public class DataPermScopeAspect { + + /** + * 数据权限注解切面,用栈的方式进行储存, 处理数据权限注解嵌套的情况 + */ + @Around("@annotation(dataPermScope)||@within(dataPermScope)") + public Object doAround(ProceedingJoinPoint pjp, DataPermScope dataPermScope) throws Throwable { + Object obj; + var methodAnnotation = AopUtil.getMethodAnnotation(pjp, DataPermScope.class); + DataPermContextHolder.push(methodAnnotation); + try { + obj = pjp.proceed(); + } + finally { + DataPermContextHolder.pop(); + } + return obj; + } +} diff --git a/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/IgnoreTenantAspectHandler.java b/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/aspect/IgnoreTenantAspectHandler.java similarity index 72% rename from bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/IgnoreTenantAspectHandler.java rename to bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/aspect/IgnoreTenantAspectHandler.java index 8e336238..fec50a27 100644 --- a/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/IgnoreTenantAspectHandler.java +++ b/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/aspect/IgnoreTenantAspectHandler.java @@ -1,5 +1,6 @@ -package cn.bootx.platform.common.mybatisplus.handler; +package cn.bootx.platform.common.mybatisplus.aspect; +import cn.bootx.platform.core.annotation.IgnoreTenant; import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; import lombok.RequiredArgsConstructor; @@ -10,7 +11,7 @@ import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; /** - * 商户租户切面 + * 忽略租户(商户)数据权限切面服务商 * @author xxm * @since 2024/6/25 */ @@ -20,8 +21,8 @@ import org.springframework.stereotype.Component; @RequiredArgsConstructor public class IgnoreTenantAspectHandler { - @Around("@annotation(cn.bootx.platform.core.annotation.IgnoreTenant)||within(@cn.bootx.platform.core.annotation.IgnoreTenant *)") - public Object doAround(ProceedingJoinPoint pjp) throws Throwable { + @Around("@annotation(ignoreTenant)||@within(ignoreTenant)") + public Object doAround(ProceedingJoinPoint pjp, IgnoreTenant ignoreTenant) throws Throwable { // 设置忽略租户插件 InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build()); try { diff --git a/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/IntegerListTypeHandler.java b/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/IntegerListTypeHandler.java index 1027b8e8..c64631c3 100644 --- a/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/IntegerListTypeHandler.java +++ b/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/IntegerListTypeHandler.java @@ -20,11 +20,14 @@ import java.util.List; @MappedJdbcTypes({JdbcType.VARCHAR,JdbcType.LONGVARCHAR}) public class IntegerListTypeHandler extends AbstractJsonTypeHandler> { - + /** + * 默认初始化 + */ public IntegerListTypeHandler(Class type) { super(type); } + public IntegerListTypeHandler(Class type, Field field) { super(type, field); } diff --git a/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/LongListTypeHandler.java b/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/LongListTypeHandler.java index 7c887596..f9681287 100644 --- a/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/LongListTypeHandler.java +++ b/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/LongListTypeHandler.java @@ -20,7 +20,6 @@ import java.util.List; @MappedJdbcTypes({JdbcType.VARCHAR,JdbcType.LONGVARCHAR}) public class LongListTypeHandler extends AbstractJsonTypeHandler> { - public LongListTypeHandler(Class type) { super(type); } diff --git a/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/StringListTypeHandler.java b/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/StringListTypeHandler.java index c0b82ad2..68d0ee47 100644 --- a/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/StringListTypeHandler.java +++ b/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/StringListTypeHandler.java @@ -28,10 +28,11 @@ public class StringListTypeHandler extends AbstractJsonTypeHandler> public StringListTypeHandler(Class type, Field field) { super(type, field); } + @Override public List parse(String json) { if (StrUtil.isNotBlank(json)){ - return JsonUtil.toBean(json, new TypeReference<>() {}, false); + return JSONUtil.toBean(json, new TypeReference<>() {}, false); } return List.of(); } diff --git a/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/interceptor/MpInterceptorConfiguration.java b/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/interceptor/MpInterceptorConfiguration.java index bb7eea63..10c637bb 100644 --- a/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/interceptor/MpInterceptorConfiguration.java +++ b/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/interceptor/MpInterceptorConfiguration.java @@ -1,7 +1,6 @@ package cn.bootx.platform.common.mybatisplus.interceptor; import com.baomidou.mybatisplus.annotation.DbType; -import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; @@ -34,12 +33,4 @@ public class MpInterceptorConfiguration { return new MpInterceptor(new OptimisticLockerInnerInterceptor(), 1); } - /** - * 防止全表更新与删除 - */ - @Bean - public MpInterceptor blockAttackInnerInterceptor() { - return new MpInterceptor(new BlockAttackInnerInterceptor(), 2); - } - } diff --git a/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/local/DataPermContextHolder.java b/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/local/DataPermContextHolder.java new file mode 100644 index 00000000..0a392468 --- /dev/null +++ b/bootx-platform/bootx-platform-common/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/local/DataPermContextHolder.java @@ -0,0 +1,55 @@ +package cn.bootx.platform.common.mybatisplus.local; + +import cn.bootx.platform.core.annotation.DataPermScope; +import cn.hutool.core.collection.CollUtil; +import com.alibaba.ttl.TransmittableThreadLocal; + +import java.util.Optional; +import java.util.Stack; + +/** + * 忽略鉴权数据上下文 + * + * @author xxm + * @since 2021/12/22 + */ +public class DataPermContextHolder { + + private static final ThreadLocal> PERMISSION_LOCAL = new TransmittableThreadLocal<>(); + + + /** + * 设置 数据权限控制注解 + */ + public static void push(DataPermScope permission) { + Stack stack = Optional.ofNullable(PERMISSION_LOCAL.get()) + .orElse(new Stack<>()); + stack.push(permission); + PERMISSION_LOCAL.set(stack); + } + + /** + * 获取 数据权限控制注解 + */ + public static DataPermScope peek() { + return PERMISSION_LOCAL.get().peek(); + } + + /** + * 弹出 + */ + public static void pop() { + Stack stack = PERMISSION_LOCAL.get(); + if (CollUtil.isNotEmpty(stack)) { + stack.pop(); + } + } + + /** + * 清除线程变量(数据权限控制和用户信息) + */ + public static void clear() { + PERMISSION_LOCAL.remove(); + } + +} diff --git a/bootx-platform/bootx-platform-common/common-redis/pom.xml b/bootx-platform/bootx-platform-common/common-redis/pom.xml index f957e841..72bbedde 100644 --- a/bootx-platform/bootx-platform-common/common-redis/pom.xml +++ b/bootx-platform/bootx-platform-common/common-redis/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta4 + 3.0.0.beta5 common-redis diff --git a/bootx-platform/bootx-platform-common/common-spring/pom.xml b/bootx-platform/bootx-platform-common/common-spring/pom.xml index 0e70fed9..89254a12 100644 --- a/bootx-platform/bootx-platform-common/common-spring/pom.xml +++ b/bootx-platform/bootx-platform-common/common-spring/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta4 + 3.0.0.beta5 common-spring diff --git a/bootx-platform/bootx-platform-common/common-swagger/pom.xml b/bootx-platform/bootx-platform-common/common-swagger/pom.xml index 0fd7f4de..06a30464 100644 --- a/bootx-platform/bootx-platform-common/common-swagger/pom.xml +++ b/bootx-platform/bootx-platform-common/common-swagger/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta4 + 3.0.0.beta5 common-swagger @@ -14,8 +14,9 @@ 接口文档 + - com.github.xiaoymin + com.github.xingfudeshi knife4j-openapi3-jakarta-spring-boot-starter ${knife4j.version} diff --git a/bootx-platform/bootx-platform-common/common-swagger/src/main/java/cn/bootx/platform/common/swagger/SwaggerAutoConfiguration.java b/bootx-platform/bootx-platform-common/common-swagger/src/main/java/cn/bootx/platform/common/swagger/SwaggerAutoConfiguration.java index 9673d187..094b01e0 100644 --- a/bootx-platform/bootx-platform-common/common-swagger/src/main/java/cn/bootx/platform/common/swagger/SwaggerAutoConfiguration.java +++ b/bootx-platform/bootx-platform-common/common-swagger/src/main/java/cn/bootx/platform/common/swagger/SwaggerAutoConfiguration.java @@ -1,30 +1,17 @@ package cn.bootx.platform.common.swagger; -import cn.hutool.core.util.ArrayUtil; import io.swagger.v3.oas.models.ExternalDocumentation; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Contact; import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.info.License; -import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springdoc.core.models.GroupedOpenApi; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; -import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.context.properties.bind.BindResult; -import org.springframework.boot.context.properties.bind.Binder; -import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; - -import java.util.concurrent.atomic.AtomicInteger; /** * swagger 自动配置 @@ -36,20 +23,9 @@ import java.util.concurrent.atomic.AtomicInteger; @Configuration @EnableConfigurationProperties(SwaggerProperties.class) @RequiredArgsConstructor -public class SwaggerAutoConfiguration implements BeanDefinitionRegistryPostProcessor, EnvironmentAware { +public class SwaggerAutoConfiguration { - private final String swaggerPropertiesPrefix = "bootx-platform.common.swagger"; - - private SwaggerProperties swaggerProperties; - - /** - * 创建swagger文档模块 - * @param name 模块名称 - * @param basePackage 扫描路径数组 - */ - private GroupedOpenApi createApi(String name, String... basePackage) { - return GroupedOpenApi.builder().group(name).packagesToScan(basePackage).build(); - } + private final SwaggerProperties swaggerProperties; /** * 空白分组(防止knife4j报错) @@ -58,7 +34,7 @@ public class SwaggerAutoConfiguration implements BeanDefinitionRegistryPostProce @ConditionalOnProperty(prefix = "bootx-platform.common.swagger", value = "enabled", havingValue = "true", matchIfMissing = true) public GroupedOpenApi blankApi() { - return this.createApi(" 空白页", "null.null"); + return GroupedOpenApi.builder().group("空白页").packagesToScan("null.null").build(); } @Bean @@ -73,34 +49,4 @@ public class SwaggerAutoConfiguration implements BeanDefinitionRegistryPostProce .license(new License().name(swaggerProperties.getLicenseName()).url(swaggerProperties.getLicenseUrl()))) .externalDocs(new ExternalDocumentation().url(swaggerProperties.getTermsOfServiceUrl())); } - - /** - * 手动注册swagger docket bean, 如果晚于swagger加载后, 再注入的bean将不会生效 - */ - @Override - public void postProcessBeanDefinitionRegistry(@NotNull BeanDefinitionRegistry registry) throws BeansException { - var basePackages = this.swaggerProperties.getBasePackages(); - AtomicInteger atomicInteger = new AtomicInteger(96); - basePackages.forEach((name, basePackage) -> { - var packages = ArrayUtil.toArray(basePackage, String.class); - var bean = new RootBeanDefinition(GroupedOpenApi.class, () -> this.createApi(name, packages)); - registry.registerBeanDefinition((char) atomicInteger.incrementAndGet() + "ModelAPi", bean); - }); - } - - @Override - public void postProcessBeanFactory(@NotNull ConfigurableListableBeanFactory beanFactory) throws BeansException { - - } - - /** - * 获取环境变量并设置到swaggerProperties对象中, bean注册时, 参数还未进行绑定 - */ - @Override - public void setEnvironment(@NotNull Environment environment) { - BindResult bind = Binder.get(environment) - .bind(swaggerPropertiesPrefix, SwaggerProperties.class); - this.swaggerProperties = bind.orElse(new SwaggerProperties()); - } - } diff --git a/bootx-platform/bootx-platform-common/common-swagger/src/main/java/cn/bootx/platform/common/swagger/SwaggerPostConfiguration.java b/bootx-platform/bootx-platform-common/common-swagger/src/main/java/cn/bootx/platform/common/swagger/SwaggerPostConfiguration.java new file mode 100644 index 00000000..f9c8ba2a --- /dev/null +++ b/bootx-platform/bootx-platform-common/common-swagger/src/main/java/cn/bootx/platform/common/swagger/SwaggerPostConfiguration.java @@ -0,0 +1,64 @@ +package cn.bootx.platform.common.swagger; + +import cn.hutool.core.util.ArrayUtil; +import jakarta.validation.constraints.NotNull; +import lombok.extern.slf4j.Slf4j; +import org.springdoc.core.models.GroupedOpenApi; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; +import org.springframework.beans.factory.support.RootBeanDefinition; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.context.properties.bind.BindResult; +import org.springframework.boot.context.properties.bind.Binder; +import org.springframework.context.EnvironmentAware; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import java.util.concurrent.atomic.AtomicInteger; + +/** + * swagger 自动配置 + * @author xxm + * @since 2025/2/6 + */ +@Slf4j +@Component +@EnableConfigurationProperties(SwaggerProperties.class) +public class SwaggerPostConfiguration implements BeanDefinitionRegistryPostProcessor, EnvironmentAware { + + private final String swaggerPropertiesPrefix = "bootx-platform.common.swagger"; + + private SwaggerProperties swaggerProperties; + + /** + * 手动注册swagger docket bean, 如果晚于swagger加载后, 再注入的bean将不会生效 + */ + @Override + public void postProcessBeanDefinitionRegistry(@NotNull BeanDefinitionRegistry registry) throws BeansException { + var basePackages = this.swaggerProperties.getBasePackages(); + AtomicInteger atomicInteger = new AtomicInteger(96); + basePackages.forEach((name, basePackage) -> { + var packages = ArrayUtil.toArray(basePackage, String.class); + var bean = new RootBeanDefinition(GroupedOpenApi.class, () -> GroupedOpenApi.builder().group(name).packagesToScan(packages).build()); + registry.registerBeanDefinition((char) atomicInteger.incrementAndGet() + "ModelAPi", bean); + }); + } + + @Override + public void postProcessBeanFactory(@NotNull ConfigurableListableBeanFactory beanFactory) throws BeansException { + + } + + /** + * 获取环境变量并设置到swaggerProperties对象中, bean注册时, 参数还未进行绑定 + */ + @Override + public void setEnvironment(@NotNull Environment environment) { + BindResult bind = Binder.get(environment) + .bind(swaggerPropertiesPrefix, SwaggerProperties.class); + this.swaggerProperties = bind.orElse(new SwaggerProperties()); + } + +} diff --git a/bootx-platform/bootx-platform-common/pom.xml b/bootx-platform/bootx-platform-common/pom.xml index 2c91863b..afd4bf46 100644 --- a/bootx-platform/bootx-platform-common/pom.xml +++ b/bootx-platform/bootx-platform-common/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform - 3.0.0.beta4 + 3.0.0.beta5 4.0.0 diff --git a/bootx-platform/bootx-platform-core/pom.xml b/bootx-platform/bootx-platform-core/pom.xml index a36a81d8..3ca43022 100644 --- a/bootx-platform/bootx-platform-core/pom.xml +++ b/bootx-platform/bootx-platform-core/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform - 3.0.0.beta4 + 3.0.0.beta5 4.0.0 diff --git a/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/annotation/ClientCode.java b/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/annotation/ClientCode.java new file mode 100644 index 00000000..630908b4 --- /dev/null +++ b/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/annotation/ClientCode.java @@ -0,0 +1,22 @@ +package cn.bootx.platform.core.annotation; + +import java.lang.annotation.*; + +/** + * 终端类型注解, 如果添加控制器上添加了该类型. 进行访问时将会自动验证终端类型是否匹配, 不添加默认所有终端类型都可以访问 + * 终端可以约等于业务系统概念, 但不是完全一对一的关系 + * 在控制器类和方法上都可以使用该注解, 同时标注时会以方法上的为准, 并不会取这两者的终端合集, 而是方法上的直接覆盖掉类的注解 + * @author xxm + * @since 2025/1/31 + */ +@Target({ ElementType.TYPE, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface ClientCode { + + /** + * 终端编码 + */ + String[] value(); +} diff --git a/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/annotation/DataPermScope.java b/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/annotation/DataPermScope.java new file mode 100644 index 00000000..bb126045 --- /dev/null +++ b/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/annotation/DataPermScope.java @@ -0,0 +1,37 @@ +package cn.bootx.platform.core.annotation; + +import java.lang.annotation.*; + +/** + * 数据权限控制注解 可以放在服务类和方法上,支持嵌套使用,嵌套使用时可以通过添加多个数据来控制不同作用域实现不同的控制 + * A 使用部门数据权限控制 + * ----- 根据部门进行控制 + * - B 关闭数据权限 + * ----- 数据权限不生效 + * -- C 使用终端数据权限 + * ----- 根据终端进行控制 + * -- C 使用终端数据权限使用结束 + * ----- 数据权限不生效 + * - B 开启数据权限控制 + * ----- 根据部门进行控制 + * A 执行结束 + * @author xxm + * @since 2021/12/22 + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface DataPermScope { + + /** + * 是否开启数据权限, 在嵌套情况下, 可以通过设置为false来临时关闭数据权限的控制 + */ + boolean dataScope() default true; + + /** + * 数据权限类型,不同类型需要有不同的数据权限处理实现 + */ + String value(); + +} diff --git a/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/annotation/OperateLog.java b/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/annotation/OperateLog.java index 192809f2..08cb0d1d 100644 --- a/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/annotation/OperateLog.java +++ b/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/annotation/OperateLog.java @@ -66,6 +66,11 @@ public @interface OperateLog { */ GRANT, + /** + * 同步 + */ + SYNC, + /** * 导出 */ diff --git a/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/annotation/RequestGroup.java b/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/annotation/RequestGroup.java index 4da370e7..828ff7c2 100644 --- a/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/annotation/RequestGroup.java +++ b/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/annotation/RequestGroup.java @@ -15,6 +15,8 @@ import java.lang.annotation.*; *
* 路径: 对应具体的一个具体请求方式(GET/POST)的请求路径 * + * 如果在多业务系统(终端)融合部署时, 可以通过添加 {@link ClientCode} 注解来区分不同的终端(业务系统), 来使当前请求路径归类带哪个终端中 + * * @author xxm * @since 2024/7/4 */ @@ -42,5 +44,4 @@ public @interface RequestGroup { * 分组名称, 多次标注注解时, 同样的分组编码, 可以只写一个分组名称, 其他未写的会自动使用这个 */ String groupName() default ""; - } diff --git a/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/code/CommonCode.java b/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/code/CommonCode.java index 17a57e39..1547e2d7 100644 --- a/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/code/CommonCode.java +++ b/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/code/CommonCode.java @@ -53,6 +53,9 @@ public interface CommonCode { /** 追踪Id */ String TRACE_ID = "traceId"; + /** 终端 */ + String CLIENT = "x-client-code"; + /** 用户 */ String USER = "user"; diff --git a/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/util/DateTimeUtil.java b/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/util/DateTimeUtil.java index 6936bb18..2c5ae6ef 100644 --- a/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/util/DateTimeUtil.java +++ b/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/util/DateTimeUtil.java @@ -1,5 +1,6 @@ package cn.bootx.platform.core.util; +import cn.hutool.core.date.DatePattern; import lombok.experimental.UtilityClass; import java.time.Instant; @@ -82,4 +83,11 @@ public class DateTimeUtil { return instant.toEpochMilli(); } + /** + * 格式化为标准时间日期 + */ + public String formatDateTime(LocalDateTime localDateTime) { + return localDateTime.format(DatePattern.NORM_DATETIME_FORMATTER); + } + } diff --git a/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/util/JsonUtil.java b/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/util/JsonUtil.java index da2a2341..a1c6bddc 100644 --- a/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/util/JsonUtil.java +++ b/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/util/JsonUtil.java @@ -5,8 +5,11 @@ import cn.hutool.core.lang.TypeReference; import cn.hutool.json.*; import lombok.experimental.UtilityClass; +import java.util.Collection; + /** - * json工具类, 基于hutool的进行封装, 对java8的LocalDateTime时间格式进行转换, 但无法处理LocalDate, LocalTime格式, 需要使用JacksonUtil进行处理 + * json工具类, 基于hutool的进行封装, + * 对java8的LocalDateTime时间格式进行转换, 但无法处理LocalDate, LocalTime格式, 需要使用JacksonUtil进行处理 * @author xxm * @since 2024/6/28 */ @@ -49,6 +52,14 @@ public class JsonUtil { return JSONUtil.toJsonStr(jsonObject); } + /** + * 序列化为字符串 + */ + public String toJsonStr(Collection object){ + JSONArray jsonObject = new JSONArray(object, JSON_CONFIG); + return JSONUtil.toJsonStr(jsonObject); + } + /** * JSON字符串转JSONObject对象 */ diff --git a/bootx-platform/bootx-platform-service/pom.xml b/bootx-platform/bootx-platform-service/pom.xml index 2215eee6..b6274aba 100644 --- a/bootx-platform/bootx-platform-service/pom.xml +++ b/bootx-platform/bootx-platform-service/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform - 3.0.0.beta4 + 3.0.0.beta5 service-baseapi diff --git a/bootx-platform/bootx-platform-service/service-baseapi/pom.xml b/bootx-platform/bootx-platform-service/service-baseapi/pom.xml index 85aa43c3..ad9ca39a 100644 --- a/bootx-platform/bootx-platform-service/service-baseapi/pom.xml +++ b/bootx-platform/bootx-platform-service/service-baseapi/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-service - 3.0.0.beta4 + 3.0.0.beta5 service-baseapi @@ -55,12 +55,6 @@ hutool-cache ${hutool.version}
- - - cn.hutool - hutool-http - ${hutool.version} - cn.bootx.platform diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/controller/BaseController.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/controller/BaseController.java index 83c96964..81361ad6 100644 --- a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/controller/BaseController.java +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/controller/BaseController.java @@ -8,7 +8,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestPart; @@ -22,7 +22,7 @@ import java.nio.charset.StandardCharsets; * @author xxm * @since 2023/10/14 */ -@Slf4j +@Validated @Tag(name = "系统基础接口") @RestController @RequiredArgsConstructor @@ -54,7 +54,7 @@ public class BaseController { @IgnoreAuth @Operation(summary = "将文件转换成base64") @PostMapping("/readBase64") - public Result readBase64(MultipartFile file){ + public Result readBase64(@RequestPart MultipartFile file){ return Res.ok(Base64.encode(file.getBytes())); } diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/controller/dict/DictionaryController.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/controller/dict/DictionaryController.java index 3a984261..3bc2088c 100644 --- a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/controller/dict/DictionaryController.java +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/controller/dict/DictionaryController.java @@ -3,18 +3,21 @@ package cn.bootx.platform.baseapi.controller.dict; import cn.bootx.platform.baseapi.param.dict.DictionaryParam; import cn.bootx.platform.baseapi.result.dict.DictionaryResult; import cn.bootx.platform.baseapi.service.dict.DictionaryService; +import cn.bootx.platform.core.annotation.OperateLog; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; -import cn.bootx.platform.core.validation.ValidationGroup; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; import cn.bootx.platform.core.util.ValidationUtil; +import cn.bootx.platform.core.validation.ValidationGroup; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; -import org.springdoc.core.annotations.ParameterObject; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -25,9 +28,10 @@ import java.util.List; * @author xxm * @since 2021/8/4 */ +@Validated @Tag(name = "字典") @RestController -@RequestGroup(groupCode = "dict", groupName = "字典管理", moduleCode = "baseapi", moduleName = "基础API" ) +@RequestGroup(groupCode = "dict", groupName = "字典管理", moduleCode = "baseapi" ) @RequestMapping("/dict") @RequiredArgsConstructor public class DictionaryController { @@ -37,6 +41,7 @@ public class DictionaryController { @RequestPath("添加字典") @Operation(summary = "添加字典") @PostMapping("/add") + @OperateLog(title = "添加字典", businessType = OperateLog.BusinessType.ADD, saveParam = true) public Result add(@RequestBody DictionaryParam param) { ValidationUtil.validateParam(param, ValidationGroup.add.class); return Res.ok(dictionaryService.add(param)); @@ -45,7 +50,8 @@ public class DictionaryController { @RequestPath("根据主键删除字典") @Operation(summary = "根据主键删除") @PostMapping("/delete") - public Result delete(Long id) { + @OperateLog(title = "删除字典", businessType = OperateLog.BusinessType.DELETE, saveParam = true) + public Result delete(@NotNull(message = "主键不可为空") Long id) { dictionaryService.delete(id); return Res.ok(); } @@ -53,6 +59,7 @@ public class DictionaryController { @RequestPath("更新字典") @Operation(summary = "更新字典") @PostMapping("/update") + @OperateLog(title = "更新字典", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) public Result update(@RequestBody DictionaryParam param) { ValidationUtil.validateParam(param, ValidationGroup.edit.class); return Res.ok(dictionaryService.update(param)); @@ -61,7 +68,7 @@ public class DictionaryController { @RequestPath("根据主键获取字典") @Operation(summary = "根据主键获取字典") @GetMapping("/findById") - public Result findById(Long id) { + public Result findById(@NotNull(message = "主键不可为空") Long id) { return Res.ok(dictionaryService.findById(id)); } @@ -75,21 +82,21 @@ public class DictionaryController { @RequestPath("字典分页") @Operation(summary = "字典分页") @GetMapping("/page") - public Result> page(@ParameterObject PageParam pageParam, DictionaryParam param) { + public Result> page(PageParam pageParam, DictionaryParam param) { return Res.ok(dictionaryService.page(pageParam, param)); } @RequestPath("字典编码是否被使用") @Operation(summary = "字典编码是否被使用") @GetMapping("/existsByCode") - public Result existsByCode(String code) { + public Result existsByCode(@NotBlank(message = "字典编码不可为空") String code) { return Res.ok(dictionaryService.existsByCode(code)); } @RequestPath("编码是否被使用(不包含自己)") @Operation(summary = "编码是否被使用(不包含自己)") @GetMapping("/existsByCodeNotId") - public Result existsByCode(String code, Long id) { + public Result existsByCode(@NotBlank(message = "字典编码不可为空") String code, @NotNull(message = "主键不可为空") Long id) { return Res.ok(dictionaryService.existsByCode(code, id)); } diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/controller/dict/DictionaryItemController.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/controller/dict/DictionaryItemController.java index f457cd18..9868f52a 100644 --- a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/controller/dict/DictionaryItemController.java +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/controller/dict/DictionaryItemController.java @@ -4,18 +4,21 @@ import cn.bootx.platform.baseapi.param.dict.DictionaryItemParam; import cn.bootx.platform.baseapi.result.dict.DictionaryItemResult; import cn.bootx.platform.baseapi.service.dict.DictionaryItemService; import cn.bootx.platform.core.annotation.IgnoreAuth; +import cn.bootx.platform.core.annotation.OperateLog; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; -import cn.bootx.platform.core.validation.ValidationGroup; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; -import cn.bootx.platform.core.util.ValidationUtil; +import cn.bootx.platform.core.validation.ValidationGroup; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -24,8 +27,9 @@ import java.util.List; * @author xxm * @since 2020/4/18 19:03 */ +@Validated @Tag(name = "字典项") -@RequestGroup(groupCode = "dict", groupName = "字典管理", moduleCode = "baseapi", moduleName = "基础API" ) +@RequestGroup(groupCode = "dict", groupName = "字典管理", moduleCode = "baseapi", moduleName = "(Bootx)基础模块API" ) @RestController @RequestMapping("/dict/item") @AllArgsConstructor @@ -36,17 +40,17 @@ public class DictionaryItemController { @RequestPath("添加字典项") @Operation(summary = "添加字典项") @PostMapping("/add") - public Result add(@RequestBody DictionaryItemParam param) { - ValidationUtil.validateParam(param, ValidationGroup.add.class); + @OperateLog(title = "添加字典项", businessType = OperateLog.BusinessType.ADD, saveParam = true) + public Result add(@RequestBody @Validated(ValidationGroup.add.class) DictionaryItemParam param) { dictionaryItemService.add(param); return Res.ok(); } - @RequestPath("添加字典项") - @Operation(summary = "修改字典项(返回字典项对象)") + @RequestPath("修改字典项") + @Operation(summary = "修改字典项") @PostMapping(value = "/update") - public Result update(@RequestBody DictionaryItemParam param) { - ValidationUtil.validateParam(param, ValidationGroup.edit.class); + @OperateLog(title = "修改字典项", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) + public Result update(@RequestBody @Validated(ValidationGroup.edit.class) DictionaryItemParam param) { dictionaryItemService.update(param); return Res.ok(); } @@ -54,7 +58,8 @@ public class DictionaryItemController { @RequestPath("删除字典项") @Operation(summary = "删除字典项") @PostMapping(value = "/delete") - public Result delete(Long id) { + @OperateLog(title = "删除字典项", businessType = OperateLog.BusinessType.DELETE, saveParam = true) + public Result delete(@NotNull(message = "主键不可为空") Long id) { dictionaryItemService.delete(id); return Res.ok(); } @@ -62,14 +67,14 @@ public class DictionaryItemController { @RequestPath("查询字典项") @Operation(summary = "根据字典项ID查询") @GetMapping("/findById") - public Result findById(@Parameter(description = "字典项ID") Long id) { + public Result findById(@NotNull(message = "字典项主键不可为空") Long id) { return Res.ok(dictionaryItemService.findById(id)); } @RequestPath("查询字典项列表") @Operation(summary = "查询指定字典ID下的所有字典项") @GetMapping("/findByDictionaryId") - public Result> findByDictionaryId(@Parameter(description = "字典ID") Long dictId) { + public Result> findByDictionaryId(@NotNull(message = "字典主键不可为空") Long dictId) { return Res.ok(dictionaryItemService.findByDictionaryId(dictId)); } @@ -97,16 +102,18 @@ public class DictionaryItemController { @RequestPath("字典项编码是否被使用") @Operation(summary = "字典项编码是否被使用") @GetMapping("/existsByCode") - public Result existsByCode(@Parameter(description = "编码") String code,@Parameter(description = "字典ID") Long dictId) { + public Result existsByCode( + @Parameter(description = "编码") @NotBlank(message = "字典编码不可为空") String code, + @Parameter(description = "字典ID") @NotNull(message = "字典主键不可为空") Long dictId) { return Res.ok(dictionaryItemService.existsByCode(code, dictId)); } @RequestPath("字典项编码是否被使用(不包含自己)") @Operation(summary = "字典项编码是否被使用(不包含自己)") @GetMapping("/existsByCodeNotId") - public Result existsByCode(@Parameter(description = "编码") String code, - @Parameter(description = "字典ID") Long dictId, - @Parameter(description = "字典项ID") Long id) { + public Result existsByCode(@Parameter(description = "编码") @NotBlank(message = "字典编码不可为空") String code, + @Parameter(description = "字典ID") @NotNull(message = "字典主键不可为空") Long dictId, + @Parameter(description = "字典项ID") @NotNull(message = "字典项主键不可为空") Long id) { return Res.ok(dictionaryItemService.existsByCode(code, dictId, id)); } diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/controller/parameter/SystemParamController.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/controller/parameter/SystemParamController.java index 04a0448d..4fae9ede 100644 --- a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/controller/parameter/SystemParamController.java +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/controller/parameter/SystemParamController.java @@ -4,18 +4,20 @@ import cn.bootx.platform.baseapi.param.parameter.SystemParameterParam; import cn.bootx.platform.baseapi.result.parameter.SystemParameterResult; import cn.bootx.platform.baseapi.service.parameter.SystemParamService; import cn.bootx.platform.core.annotation.IgnoreAuth; +import cn.bootx.platform.core.annotation.OperateLog; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; -import cn.bootx.platform.core.util.ValidationUtil; import cn.bootx.platform.core.validation.ValidationGroup; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; /** @@ -24,6 +26,7 @@ import org.springframework.web.bind.annotation.*; * @author xxm * @since 2021/10/25 */ +@Validated @Tag(name = "系统参数") @RequestGroup(groupCode = "params", groupName = "系统参数", moduleCode = "baseapi" ) @RestController @@ -36,8 +39,8 @@ public class SystemParamController { @RequestPath("添加") @Operation(summary = "添加") @PostMapping("/add") - public Result add(@RequestBody SystemParameterParam param) { - ValidationUtil.validateParam(param, ValidationGroup.add.class); + @OperateLog(title = "添加系统参数", businessType = OperateLog.BusinessType.ADD, saveParam = true) + public Result add(@RequestBody @Validated(ValidationGroup.add.class) SystemParameterParam param) { systemParamService.add(param); return Res.ok(); } @@ -45,8 +48,8 @@ public class SystemParamController { @RequestPath("更新") @Operation(summary = "更新") @PostMapping("/update") - public Result update(@RequestBody SystemParameterParam param) { - ValidationUtil.validateParam(param, ValidationGroup.edit.class); + @OperateLog(title = "更新系统参数", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) + public Result update(@RequestBody @Validated(ValidationGroup.edit.class) SystemParameterParam param) { systemParamService.update(param); return Res.ok(); } @@ -61,14 +64,15 @@ public class SystemParamController { @RequestPath("获取单条") @Operation(summary = "获取单条") @GetMapping("/findById") - public Result findById(@Parameter(description = "主键") Long id) { + public Result findById(@NotNull(message = "主键不可为空") Long id) { return Res.ok(systemParamService.findById(id)); } @RequestPath("删除") @Operation(summary = "删除") @PostMapping("/delete") - public Result delete(Long id) { + @OperateLog(title = "删除系统参数", businessType = OperateLog.BusinessType.DELETE, saveParam = true) + public Result delete(@NotNull(message = "主键不可为空") Long id) { systemParamService.delete(id); return Res.ok(); } @@ -76,21 +80,21 @@ public class SystemParamController { @RequestPath("判断编码是否存在") @Operation(summary = "判断编码是否存在") @GetMapping("/existsByKey") - public Result existsByKey(String key) { + public Result existsByKey(@NotBlank(message = "key不可为空") String key) { return Res.ok(systemParamService.existsByKey(key)); } @RequestPath("判断编码是否存在(不包含自己)") @Operation(summary = "判断编码是否存在(不包含自己)") @GetMapping("/existsByKeyNotId") - public Result existsByKeyNotId(String key, Long id) { + public Result existsByKeyNotId(@NotBlank(message = "key不可为空") String key,@NotNull(message = "主键不可为空") Long id) { return Res.ok(systemParamService.existsByKey(key, id)); } @IgnoreAuth @Operation(summary = "根据键名获取键值") @GetMapping("/findByKey") - public Result findByKey(String key) { + public Result findByKey(@NotBlank(message = "key不可为空") String key) { return Res.ok(systemParamService.findByKey(key)); } diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/controller/region/ChinaRegionController.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/controller/region/ChinaRegionController.java new file mode 100644 index 00000000..5e349ee4 --- /dev/null +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/controller/region/ChinaRegionController.java @@ -0,0 +1,60 @@ +package cn.bootx.platform.baseapi.controller.region; + +import cn.bootx.platform.baseapi.result.region.RegionResult; +import cn.bootx.platform.baseapi.service.region.ChinaRegionService; +import cn.bootx.platform.core.annotation.IgnoreAuth; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.result.Result; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 行政区划控制器 + * @author xxm + * @since 2024/11/12 + */ +@Validated +@IgnoreAuth +@Tag(name = "行政区划控制器") +@RestController +@RequestMapping("/china/region") +@RequiredArgsConstructor +public class ChinaRegionController { + + private final ChinaRegionService chinaRegionService; + + /** + * 获取所有省份 + */ + @Operation(summary = "获取省份") + @GetMapping("/findAllProvince") + public Result> findAllProvince() { + return Res.ok(chinaRegionService.findAllProvince()); + } + + @Operation(summary = "获取省市联动列表") + @GetMapping("/findAllProvinceAndCity") + public Result> findAllProvinceAndCity() { + return Res.ok(chinaRegionService.findAllProvinceAndCity()); + } + + @Operation(summary = "获取省市区县联动列表") + @GetMapping("/findAllProvinceAndCityAndArea") + public Result> findAllProvinceAndCityAndArea() { + return Res.ok(chinaRegionService.findAllProvinceAndCityAndArea()); + } + + @Operation(summary = "根据区划代码获取下级行政区划的列表") + @GetMapping("/findAllRegionByParentCode") + public Result> findAllRegionByParentCode(@NotBlank(message = "区划代码不可为空") String code) { + return Res.ok(chinaRegionService.findAllRegionByParentCode(code)); + } +} diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/parameter/SystemParamManager.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/parameter/SystemParamManager.java index 0c51f707..12f99f70 100644 --- a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/parameter/SystemParamManager.java +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/parameter/SystemParamManager.java @@ -30,21 +30,21 @@ public class SystemParamManager extends BaseManager findByKey(String key) { - return this.findByField(SystemParameter::getParamKey, key); + return this.findByField(SystemParameter::getKey, key); } /** * key重复检查 */ public boolean existsByKey(String key) { - return existedByField(SystemParameter::getParamKey, key); + return existedByField(SystemParameter::getKey, key); } /** * key重复检查 */ public boolean existsByKey(String key, Long id) { - return existedByField(SystemParameter::getParamKey, key, id); + return existedByField(SystemParameter::getKey, key, id); } /** @@ -54,7 +54,7 @@ public class SystemParamManager extends BaseManager mpPage = MpUtil.getMpPage(pageParam); return lambdaQuery().orderByDesc(MpIdEntity::getId) .like(StrUtil.isNotBlank(param.getName()), SystemParameter::getName, param.getName()) - .like(StrUtil.isNotBlank(param.getParamKey()), SystemParameter::getParamKey, param.getParamKey()) + .like(StrUtil.isNotBlank(param.getKey()), SystemParameter::getKey, param.getKey()) .page(mpPage); } diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/AreaManager.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/AreaManager.java new file mode 100644 index 00000000..36f54f0c --- /dev/null +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/AreaManager.java @@ -0,0 +1,24 @@ +package cn.bootx.platform.baseapi.dao.region; + +import cn.bootx.platform.baseapi.entity.region.Area; +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 区域表 + * + * @author xxm + * @since 2022-12-24 + */ +@Repository +@RequiredArgsConstructor +public class AreaManager extends BaseManager { + + public List findAllByCityCode(String cityCode) { + return findAllByField(Area::getCityCode, cityCode); + } + +} diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/AreaMapper.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/AreaMapper.java new file mode 100644 index 00000000..b164cc30 --- /dev/null +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/AreaMapper.java @@ -0,0 +1,16 @@ +package cn.bootx.platform.baseapi.dao.region; + +import cn.bootx.platform.baseapi.entity.region.Area; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 区域表 + * + * @author xxm + * @since 2022-12-24 + */ +@Mapper +public interface AreaMapper extends MPJBaseMapper { + +} diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/CityManager.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/CityManager.java new file mode 100644 index 00000000..79c4bb61 --- /dev/null +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/CityManager.java @@ -0,0 +1,24 @@ +package cn.bootx.platform.baseapi.dao.region; + +import cn.bootx.platform.baseapi.entity.region.City; +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 城市表 + * + * @author xxm + * @since 2022-12-24 + */ +@Repository +@RequiredArgsConstructor +public class CityManager extends BaseManager { + + public List findAllByProvinceCode(String provinceCode) { + return findAllByField(City::getProvinceCode, provinceCode); + } + +} diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/CityMapper.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/CityMapper.java new file mode 100644 index 00000000..16a3d793 --- /dev/null +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/CityMapper.java @@ -0,0 +1,16 @@ +package cn.bootx.platform.baseapi.dao.region; + +import cn.bootx.platform.baseapi.entity.region.City; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 城市表 + * + * @author xxm + * @since 2022-12-24 + */ +@Mapper +public interface CityMapper extends MPJBaseMapper { + +} diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/ProvinceManager.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/ProvinceManager.java new file mode 100644 index 00000000..379b3732 --- /dev/null +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/ProvinceManager.java @@ -0,0 +1,18 @@ +package cn.bootx.platform.baseapi.dao.region; + +import cn.bootx.platform.baseapi.entity.region.Province; +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +/** + * 省份表 + * + * @author xxm + * @since 2022-12-24 + */ +@Repository +@RequiredArgsConstructor +public class ProvinceManager extends BaseManager { + +} diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/ProvinceMapper.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/ProvinceMapper.java new file mode 100644 index 00000000..29200b2c --- /dev/null +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/ProvinceMapper.java @@ -0,0 +1,16 @@ +package cn.bootx.platform.baseapi.dao.region; + +import cn.bootx.platform.baseapi.entity.region.Province; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 省份表 + * + * @author xxm + * @since 2022-12-24 + */ +@Mapper +public interface ProvinceMapper extends MPJBaseMapper { + +} diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/StreetManager.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/StreetManager.java new file mode 100644 index 00000000..b6bf7515 --- /dev/null +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/StreetManager.java @@ -0,0 +1,24 @@ +package cn.bootx.platform.baseapi.dao.region; + +import cn.bootx.platform.baseapi.entity.region.Street; +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 街道表 + * + * @author xxm + * @since 2022-12-24 + */ +@Repository +@RequiredArgsConstructor +public class StreetManager extends BaseManager { + + public List findAllByAreaCode(String areaCode) { + return findAllByField(Street::getAreaCode, areaCode); + } + +} diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/StreetMapper.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/StreetMapper.java new file mode 100644 index 00000000..fe1b9acb --- /dev/null +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/dao/region/StreetMapper.java @@ -0,0 +1,16 @@ +package cn.bootx.platform.baseapi.dao.region; + +import cn.bootx.platform.baseapi.entity.region.Street; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 街道表 + * + * @author xxm + * @since 2022-12-24 + */ +@Mapper +public interface StreetMapper extends MPJBaseMapper { + +} diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/entity/parameter/SystemParameter.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/entity/parameter/SystemParameter.java index 59c798b7..c7bf4628 100644 --- a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/entity/parameter/SystemParameter.java +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/entity/parameter/SystemParameter.java @@ -28,7 +28,7 @@ public class SystemParameter extends MpBaseEntity implements ToResult { + + /** 县区编码 */ + @TableId + private String code; + + /** 名称 */ + private String name; + + /** 城市code */ + private String cityCode; + + @Override + public RegionResult toResult() { + return new RegionResult(code, name, 3).setParentCode(cityCode); + } + +} diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/entity/region/City.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/entity/region/City.java new file mode 100644 index 00000000..f0010f1e --- /dev/null +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/entity/region/City.java @@ -0,0 +1,34 @@ +package cn.bootx.platform.baseapi.entity.region; + +import cn.bootx.platform.baseapi.result.region.RegionResult; +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 城市表 + * + * @author xxm + * @since 2022-12-24 + */ +@Data +@TableName("base_city") +public class City implements ToResult { + + /** 市/地区编码 */ + @TableId + private String code; + + /** 城市名称 */ + private String name; + + /** 省份code */ + private String provinceCode; + + @Override + public RegionResult toResult() { + return new RegionResult(code, name, 2).setParentCode(provinceCode); + } + +} diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/entity/region/Province.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/entity/region/Province.java new file mode 100644 index 00000000..d0e3d7c1 --- /dev/null +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/entity/region/Province.java @@ -0,0 +1,32 @@ +package cn.bootx.platform.baseapi.entity.region; + +import cn.bootx.platform.baseapi.result.region.RegionResult; +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 省份表 + * + * @author xxm + * @since 2022-12-24 + */ +@Data +@TableName("base_province") +public class Province implements ToResult { + + /** 省份编码 */ + @TableId + private String code; + + /** 省份名称 */ + private String name; + + + @Override + public RegionResult toResult() { + return new RegionResult(code, name, 1); + } + +} diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/entity/region/Street.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/entity/region/Street.java new file mode 100644 index 00000000..847600fe --- /dev/null +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/entity/region/Street.java @@ -0,0 +1,34 @@ +package cn.bootx.platform.baseapi.entity.region; + +import cn.bootx.platform.baseapi.result.region.RegionResult; +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 街道/乡镇表 + * + * @author xxm + * @since 2022-12-24 + */ +@Data +@TableName("base_street") +public class Street implements ToResult { + + /** 街道code */ + @TableId + private String code; + + /** 街道名称 */ + private String name; + + /** 区县code */ + private String areaCode; + + @Override + public RegionResult toResult() { + return new RegionResult(code, name, 4).setParentCode(areaCode); + } + +} diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/enums/ChinaRegionEnum.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/enums/ChinaRegionEnum.java new file mode 100644 index 00000000..38c369e7 --- /dev/null +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/enums/ChinaRegionEnum.java @@ -0,0 +1,47 @@ +package cn.bootx.platform.baseapi.enums; + +import cn.bootx.platform.core.exception.BizException; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 中国行政区划 + * + * @author xxm + * @since 2023/2/7 + */ +@Getter +@AllArgsConstructor +public enum ChinaRegionEnum { + + /** 省份 */ + IMPORT_TYPE_PROVINCE("province", 1, 2), + /** 城市 */ + IMPORT_TYPE_CITY("city", 2, 4), + /** 县区 */ + IMPORT_TYPE_AREA("area", 3, 6), + /** 街道乡镇 */ + IMPORT_TYPE_STREET("street", 4, 9); + + /** 类型 */ + private final String type; + + /** 级别 */ + private final int level; + + /** 长度 */ + private final int length; + + /** + * 根据编码判断级别 + */ + public static ChinaRegionEnum findByCode(String code) { + return Arrays.stream(values()) + .filter(e -> e.length == code.length()) + .findFirst() + .orElseThrow(() -> new BizException("不支持的类型")); + } + +} diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/param/dict/DictionaryItemParam.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/param/dict/DictionaryItemParam.java index 9158315c..f68d5fdf 100644 --- a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/param/dict/DictionaryItemParam.java +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/param/dict/DictionaryItemParam.java @@ -2,6 +2,7 @@ package cn.bootx.platform.baseapi.param.dict; import cn.bootx.platform.core.validation.ValidationGroup; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Null; @@ -31,11 +32,11 @@ public class DictionaryItemParam { @Schema(description = "字典编码") private String dictCode; - @NotEmpty(message = "字典项编码不可为空", groups = ValidationGroup.add.class) + @NotBlank(message = "字典项编码不可为空", groups = ValidationGroup.add.class) @Schema(description = "字典项编码") private String code; - @NotEmpty(message = "字典项编码不可为空", groups = ValidationGroup.add.class) + @NotBlank(message = "字典项编码不可为空", groups = ValidationGroup.add.class) @Schema(description = "名称") private String name; diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/param/dict/DictionaryParam.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/param/dict/DictionaryParam.java index 8be1d4a5..4d14ba2e 100644 --- a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/param/dict/DictionaryParam.java +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/param/dict/DictionaryParam.java @@ -2,7 +2,7 @@ package cn.bootx.platform.baseapi.param.dict; import cn.bootx.platform.core.validation.ValidationGroup; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Null; import lombok.Data; @@ -24,11 +24,11 @@ public class DictionaryParam implements Serializable { @Schema(description = "主键") private Long id; - @NotEmpty(message = "编码不可以为空", groups = ValidationGroup.add.class) + @NotBlank(message = "编码不可以为空", groups = ValidationGroup.add.class) @Schema(description = "编码") private String code; - @NotEmpty(message = "编码不可以为空", groups = ValidationGroup.add.class) + @NotBlank(message = "编码不可以为空", groups = ValidationGroup.add.class) @Schema(description = "名称") private String name; diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/param/parameter/SystemParameterParam.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/param/parameter/SystemParameterParam.java index 327a5bba..0fb23b2f 100644 --- a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/param/parameter/SystemParameterParam.java +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/param/parameter/SystemParameterParam.java @@ -2,6 +2,7 @@ package cn.bootx.platform.baseapi.param.parameter; import cn.bootx.platform.core.validation.ValidationGroup; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Null; @@ -25,15 +26,15 @@ public class SystemParameterParam { @Schema(description = "主键") private Long id; - @NotEmpty(message = "参数名称不可为空", groups = ValidationGroup.add.class) + @NotBlank(message = "参数名称不可为空", groups = ValidationGroup.add.class) @Schema(description = "参数名称") private String name; - @NotEmpty(message = "参数键名不可为空", groups = ValidationGroup.add.class) + @NotBlank(message = "参数键名不可为空", groups = ValidationGroup.add.class) @Schema(description = "参数键名") - private String paramKey; + private String key; - @NotEmpty(message = "参数值不可为空", groups = ValidationGroup.add.class) + @NotBlank(message = "参数值不可为空", groups = ValidationGroup.add.class) @Schema(description = "参数值") private String value; diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/result/parameter/SystemParameterResult.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/result/parameter/SystemParameterResult.java index 2eacff00..9fa3bed1 100644 --- a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/result/parameter/SystemParameterResult.java +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/result/parameter/SystemParameterResult.java @@ -24,7 +24,7 @@ public class SystemParameterResult { private String name; @Schema(description = "参数键名") - private String paramKey; + private String key; @Schema(description = "参数值") private String value; diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/result/region/RegionResult.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/result/region/RegionResult.java new file mode 100644 index 00000000..d8cec712 --- /dev/null +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/result/region/RegionResult.java @@ -0,0 +1,43 @@ +package cn.bootx.platform.baseapi.result.region; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 中国行政区域通用对象 + * + * @author xxm + * @since 2022/12/24 + */ +@Data +@Accessors(chain = true) +@Schema(title = "中国行政区域通用对象") +@RequiredArgsConstructor +@NoArgsConstructor +public class RegionResult { + + @Schema(description = "主键编码") + @NonNull + private String code; + + @Schema(description = "名称") + @NonNull + private String name; + + @Schema(description = "级别") + @NonNull + private Integer level; + + @Schema(description = "上级id") + private String parentCode; + + @Schema(description = "下一级行政区域") + private List children; + +} diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/service/parameter/SystemParamService.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/service/parameter/SystemParamService.java index eb32f504..bb1eb68b 100644 --- a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/service/parameter/SystemParamService.java +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/service/parameter/SystemParamService.java @@ -36,7 +36,7 @@ public class SystemParamService { */ public void add(SystemParameterParam param) { SystemParameter systemParameter = SystemParameter.init(param); - if (systemParamManager.existsByKey(systemParameter.getParamKey())) { + if (systemParamManager.existsByKey(systemParameter.getKey())) { throw new BizException("key重复"); } // 默认非内置 @@ -52,7 +52,7 @@ public class SystemParamService { SystemParameter systemParameter = systemParamManager.findById(param.getId()) .orElseThrow(() -> new BizException("参数项不存在")); - if (systemParamManager.existsByKey(param.getParamKey(), param.getId())) { + if (systemParamManager.existsByKey(param.getKey(), param.getId())) { throw new BizException("key重复"); } BeanUtil.copyProperties(param, systemParameter, CopyOptions.create().ignoreNullValue()); diff --git a/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/service/region/ChinaRegionService.java b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/service/region/ChinaRegionService.java new file mode 100644 index 00000000..c145cc5f --- /dev/null +++ b/bootx-platform/bootx-platform-service/service-baseapi/src/main/java/cn/bootx/platform/baseapi/service/region/ChinaRegionService.java @@ -0,0 +1,101 @@ +package cn.bootx.platform.baseapi.service.region; + +import cn.bootx.platform.baseapi.dao.region.AreaManager; +import cn.bootx.platform.baseapi.dao.region.CityManager; +import cn.bootx.platform.baseapi.dao.region.ProvinceManager; +import cn.bootx.platform.baseapi.dao.region.StreetManager; +import cn.bootx.platform.baseapi.entity.region.Area; +import cn.bootx.platform.baseapi.entity.region.City; +import cn.bootx.platform.baseapi.entity.region.Province; +import cn.bootx.platform.baseapi.entity.region.Street; +import cn.bootx.platform.baseapi.enums.ChinaRegionEnum; +import cn.bootx.platform.baseapi.result.region.RegionResult; +import cn.bootx.platform.core.util.TreeBuildUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 中国行政区划 + * + * @author xxm + * @since 2022/12/24 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class ChinaRegionService { + + private final ProvinceManager provinceManager; + + private final CityManager cityManager; + + private final AreaManager areaManager; + + private final StreetManager streetManager; + + /** + * 根据区划代码获取下级行政区划的列表 + */ + public List findAllRegionByParentCode(String parentCode) { + if (parentCode.length() == ChinaRegionEnum.IMPORT_TYPE_PROVINCE.getLength()) { + return cityManager.findAllByProvinceCode(parentCode).stream().map(City::toResult).collect(Collectors.toList()); + } + else if (parentCode.length() == ChinaRegionEnum.IMPORT_TYPE_CITY.getLength()) { + return areaManager.findAllByCityCode(parentCode).stream().map(Area::toResult).collect(Collectors.toList()); + } + else if (parentCode.length() == ChinaRegionEnum.IMPORT_TYPE_AREA.getLength()) { + return streetManager.findAllByAreaCode(parentCode).stream().map(Street::toResult).collect(Collectors.toList()); + } + else { + return new ArrayList<>(0); + } + } + + /** + * 获取一级行政区 + */ + public List findAllProvince() { + return provinceManager.findAll().stream().map(Province::toResult).collect(Collectors.toList()); + } + + /** + * 获取省市联动列表 + */ + public List findAllProvinceAndCity() { + List provinceList = provinceManager.findAll() + .stream() + .map(Province::toResult) + .toList(); + List regionList = cityManager.findAll().stream().map(City::toResult).toList(); + List regions = new ArrayList<>(regionList.size() + regionList.size()); + regions.addAll(provinceList); + regions.addAll(regionList); + // 构建树 + return TreeBuildUtil.build(regions, null, RegionResult::getCode, RegionResult::getParentCode, RegionResult::setChildren); + } + + /** + * 获取省市区县联动列表 + */ + public List findAllProvinceAndCityAndArea() { + List provinceList = provinceManager.findAll() + .stream() + .map(Province::toResult) + .toList(); + List regionList = cityManager.findAll().stream().map(City::toResult).toList(); + List areaList = areaManager.findAll().stream().map(Area::toResult).toList(); + List regions = new ArrayList<>(regionList.size() + regionList.size() + areaList.size()); + regions.addAll(provinceList); + regions.addAll(regionList); + regions.addAll(areaList); + + // 构建树 + return TreeBuildUtil.build(regions, null, RegionResult::getCode, RegionResult::getParentCode, RegionResult::setChildren); + } + +} diff --git a/bootx-platform/bootx-platform-service/service-iam/pom.xml b/bootx-platform/bootx-platform-service/service-iam/pom.xml index f7d7d51d..a324823f 100644 --- a/bootx-platform/bootx-platform-service/service-iam/pom.xml +++ b/bootx-platform/bootx-platform-service/service-iam/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-service - 3.0.0.beta4 + 3.0.0.beta5 service-iam diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/auth/handler/LoginFailureHandlerImpl.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/auth/handler/LoginFailureHandlerImpl.java index 670ecc50..e62e6faf 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/auth/handler/LoginFailureHandlerImpl.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/auth/handler/LoginFailureHandlerImpl.java @@ -2,14 +2,13 @@ package cn.bootx.platform.iam.auth.handler; import cn.bootx.platform.common.spring.util.WebServletUtil; import cn.bootx.platform.core.code.WebHeaderCode; -import cn.bootx.platform.starter.audit.log.service.ip2region.IpToRegionService; import cn.bootx.platform.starter.audit.log.param.LoginLogParam; +import cn.bootx.platform.starter.audit.log.service.ip2region.IpToRegionService; import cn.bootx.platform.starter.audit.log.service.log.LoginLogService; import cn.bootx.platform.starter.auth.exception.LoginFailureException; import cn.bootx.platform.starter.auth.handler.LoginFailureHandler; import cn.bootx.platform.starter.auth.util.SecurityUtil; import cn.hutool.extra.servlet.JakartaServletUtil; -import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgentUtil; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -36,7 +35,7 @@ public class LoginFailureHandlerImpl implements LoginFailureHandler { @Override public void onLoginFailure(HttpServletRequest request, HttpServletResponse response, LoginFailureException e) { - UserAgent userAgent = UserAgentUtil.parse(request.getHeader(WebHeaderCode.USER_AGENT)); + var userAgent = UserAgentUtil.parse(request.getHeader(WebHeaderCode.USER_AGENT)); // ip信息 String ip = "未知"; String location = "未知"; diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/auth/handler/LoginSuccessHandlerImpl.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/auth/handler/LoginSuccessHandlerImpl.java index d360846b..052f58d1 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/auth/handler/LoginSuccessHandlerImpl.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/auth/handler/LoginSuccessHandlerImpl.java @@ -2,13 +2,12 @@ package cn.bootx.platform.iam.auth.handler; import cn.bootx.platform.common.spring.util.WebServletUtil; import cn.bootx.platform.core.code.WebHeaderCode; -import cn.bootx.platform.starter.audit.log.service.ip2region.IpToRegionService; import cn.bootx.platform.starter.audit.log.param.LoginLogParam; +import cn.bootx.platform.starter.audit.log.service.ip2region.IpToRegionService; import cn.bootx.platform.starter.audit.log.service.log.LoginLogService; import cn.bootx.platform.starter.auth.entity.AuthInfoResult; import cn.bootx.platform.starter.auth.handler.LoginSuccessHandler; import cn.hutool.extra.servlet.JakartaServletUtil; -import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgentUtil; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -36,16 +35,16 @@ public class LoginSuccessHandlerImpl implements LoginSuccessHandler { @Override public void onLoginSuccess(HttpServletRequest request, HttpServletResponse response, AuthInfoResult authInfoResult) { - UserAgent userAgent = UserAgentUtil.parse(request.getHeader(WebHeaderCode.USER_AGENT)); + var userAgent = UserAgentUtil.parse(request.getHeader(WebHeaderCode.USER_AGENT)); // ip信息 - String ip = "未知"; - String location = "未知"; + var ip = "未知"; + var location = "未知"; Optional ipOpt = Optional.ofNullable(WebServletUtil.getRequest()).map(JakartaServletUtil::getClientIP); if (ipOpt.isPresent()){ ip = ipOpt.get(); location = ipToRegionService.getRegionStrByIp(ip); } - LoginLogParam loginLog = new LoginLogParam().setLogin(true) + var loginLog = new LoginLogParam().setLogin(true) .setUserId(authInfoResult.getUserDetail().getId()) .setClient(authInfoResult.getClient()) .setLoginType(authInfoResult.getLoginType()) @@ -56,7 +55,6 @@ public class LoginSuccessHandlerImpl implements LoginSuccessHandler { .setBrowser(userAgent.getBrowser().getName() + " " + userAgent.getVersion()) .setLoginTime(LocalDateTime.now()); loginLogService.add(loginLog); -// userExpandInfoService.updateLoginTime(loginlog.getUserId()); } } diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/auth/login/PasswordLoginHandler.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/auth/login/PasswordLoginHandler.java index e924df47..24028a67 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/auth/login/PasswordLoginHandler.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/auth/login/PasswordLoginHandler.java @@ -2,7 +2,7 @@ package cn.bootx.platform.iam.auth.login; import cn.bootx.platform.core.entity.UserDetail; import cn.bootx.platform.iam.result.user.UserInfoResult; -import cn.bootx.platform.iam.service.service.UserQueryService; +import cn.bootx.platform.iam.service.user.UserQueryService; import cn.bootx.platform.starter.auth.authentication.AbstractAuthentication; import cn.bootx.platform.starter.auth.code.AuthLoginTypeCode; import cn.bootx.platform.starter.auth.entity.AuthInfoResult; diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/auth/service/AuthAssistService.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/auth/service/AuthAssistService.java index d012c4d1..8391f32c 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/auth/service/AuthAssistService.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/auth/service/AuthAssistService.java @@ -34,7 +34,7 @@ public class AuthAssistService { public void sendSmsCaptcha(String phone) { // 判断用户是否存在 UserInfo userInfo = userInfoManager.findByPhone(phone).orElseThrow(UserInfoNotExistsException::new); - if (!Objects.equals(userInfo.getStatus(), UserStatusEnum.NORMAL.getCode())) { + if (!Objects.equals(userInfo.getStatus(), UserStatusEnum.NORMAL)) { throw new BizException("用户状态异常"); } } diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/bo/permission/RequestPathBo.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/bo/permission/RequestPathBo.java index 2a8c540e..ffdbe9ca 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/bo/permission/RequestPathBo.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/bo/permission/RequestPathBo.java @@ -4,6 +4,8 @@ import cn.hutool.core.util.StrUtil; import lombok.Data; import lombok.experimental.Accessors; +import java.util.List; + /** * 请求路径信息类 * @author xxm @@ -16,6 +18,12 @@ public class RequestPathBo { /** 主键, 只有通过数据库数据生成的才会有值 */ private Long id; + /** 是否归属所有终端 */ + private boolean allClient; + + /** 终端编码 */ + private List clientCodes; + /** 功能模块编码 */ private String moduleCode; diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/code/UserStatusEnum.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/code/UserStatusEnum.java index 5a37b98a..c66c9d9b 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/code/UserStatusEnum.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/code/UserStatusEnum.java @@ -4,8 +4,8 @@ import lombok.AllArgsConstructor; import lombok.Getter; /** - * 用户状态码 - * + * 用户状态 + * 字典 user_status * @author xxm * @since 2021/9/9 */ diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/client/ClientController.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/client/ClientController.java index 49146890..8ec9395b 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/client/ClientController.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/client/ClientController.java @@ -1,18 +1,24 @@ package cn.bootx.platform.iam.controller.client; import cn.bootx.platform.core.annotation.InternalPath; +import cn.bootx.platform.core.annotation.OperateLog; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; +import cn.bootx.platform.core.validation.ValidationGroup; import cn.bootx.platform.iam.param.client.ClientParam; import cn.bootx.platform.iam.result.client.ClientResult; import cn.bootx.platform.iam.service.client.ClientService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -23,11 +29,12 @@ import java.util.List; * @author xxm * @since 2022-06-27 */ +@Validated @Tag(name = "认证终端") @RestController @RequestMapping("/client") @RequiredArgsConstructor -@RequestGroup(groupCode = "client", groupName = "终端管理", moduleCode = "iam", moduleName = "身份识别与访问管理" ) +@RequestGroup(groupCode = "client", groupName = "终端管理", moduleCode = "iam", moduleName = "(Bootx)身份识别与访问管理" ) public class ClientController { private final ClientService clientService; @@ -35,7 +42,8 @@ public class ClientController { @InternalPath @Operation(summary = "添加终端") @PostMapping(value = "/add") - public Result add(@RequestBody ClientParam param) { + @OperateLog(title = "添加终端", businessType = OperateLog.BusinessType.ADD, saveParam = true) + public Result add(@RequestBody @Validated(ValidationGroup.add.class) ClientParam param) { clientService.add(param); return Res.ok(); } @@ -43,7 +51,8 @@ public class ClientController { @InternalPath @Operation(summary = "修改") @PostMapping(value = "/update") - public Result update(@RequestBody ClientParam param) { + @OperateLog(title = "修改终端", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) + public Result update(@RequestBody @Validated(ValidationGroup.edit.class) ClientParam param) { clientService.update(param); return Res.ok(); } @@ -51,7 +60,8 @@ public class ClientController { @InternalPath @Operation(summary = "删除") @PostMapping(value = "/delete") - public Result delete(Long id) { + @OperateLog(title = "删除终端", businessType = OperateLog.BusinessType.DELETE, saveParam = true) + public Result delete(@NotNull(message = "主键不可为空") Long id) { clientService.delete(id); return Res.ok(); } @@ -59,7 +69,7 @@ public class ClientController { @RequestPath("通过ID查询终端") @Operation(summary = "通过ID查询") @GetMapping(value = "/findById") - public Result findById(Long id) { + public Result findById(@NotNull(message = "主键不可为空") Long id) { return Res.ok(clientService.findById(id)); } @@ -80,14 +90,16 @@ public class ClientController { @RequestPath("编码是否被使用") @Operation(summary = "编码是否被使用") @GetMapping("/existsByCode") - public Result existsByCode(String code) { + public Result existsByCode(@NotBlank(message = "编码不可为空") @Parameter(description = "编码") String code) { return Res.ok(clientService.existsByCode(code)); } @RequestPath("编码是否被使用(不包含自己)") @Operation(summary = "编码是否被使用(不包含自己)") @GetMapping("/existsByCodeNotId") - public Result existsByCode(String code, Long id) { + public Result existsByCode( + @NotBlank(message = "编码不可为空") @Parameter(description = "编码") String code, + @NotNull(message = "主键不可为空") @Parameter(description = "主键") Long id) { return Res.ok(clientService.existsByCode(code, id)); } diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/permission/PermCodeController.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/permission/PermCodeController.java index cff7976f..2e2bd97b 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/permission/PermCodeController.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/permission/PermCodeController.java @@ -1,20 +1,22 @@ package cn.bootx.platform.iam.controller.permission; -import cn.bootx.platform.core.annotation.IgnoreAuth; -import cn.bootx.platform.core.annotation.InternalPath; -import cn.bootx.platform.core.annotation.RequestGroup; -import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.annotation.*; import cn.bootx.platform.core.entity.UserDetail; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.result.Result; +import cn.bootx.platform.core.validation.ValidationGroup; import cn.bootx.platform.iam.param.permission.PermCodeParam; import cn.bootx.platform.iam.result.permission.PermCodeResult; import cn.bootx.platform.iam.service.permission.PermCodeService; import cn.bootx.platform.iam.service.upms.UserRolePremService; import cn.bootx.platform.starter.auth.util.SecurityUtil; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -24,6 +26,7 @@ import java.util.List; * @author xxm * @since 2024/7/7 */ +@Validated @Tag(name = "权限码管理") @RestController @RequestMapping("/perm/code") @@ -38,14 +41,15 @@ public class PermCodeController { @RequestPath("权限码详情") @Operation(summary = "权限码详情") @GetMapping("/findById") - public Result findById(Long id) { + public Result findById(@NotNull(message = "主键不可为空") Long id) { return Res.ok(permCodeService.findById(id)); } @InternalPath @Operation(summary = "添加权限码") @PostMapping("/add") - public Result add(@RequestBody PermCodeParam param) { + @OperateLog(title = "添加权限码", businessType = OperateLog.BusinessType.ADD, saveParam = true) + public Result add(@RequestBody @Validated(ValidationGroup.add.class) PermCodeParam param) { permCodeService.add(param); return Res.ok(); } @@ -53,7 +57,8 @@ public class PermCodeController { @InternalPath @Operation(summary = "更新权限码") @PostMapping("/update") - public Result update(@RequestBody PermCodeParam param) { + @OperateLog(title = "更新权限码", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) + public Result update(@RequestBody @Validated(ValidationGroup.edit.class) PermCodeParam param) { permCodeService.update(param); return Res.ok(); } @@ -61,7 +66,8 @@ public class PermCodeController { @InternalPath @Operation(summary = "删除权限码") @PostMapping("/delete") - public Result delete(Long id) { + @OperateLog(title = "删除权限码", businessType = OperateLog.BusinessType.DELETE, saveParam = true) + public Result delete(@NotNull(message = "主键不可为空") Long id) { permCodeService.delete(id); return Res.ok(); } @@ -99,14 +105,16 @@ public class PermCodeController { @RequestPath("编码是否被使用") @Operation(summary = "编码是否被使用") @GetMapping("/existsByCode") - public Result existsByPermCode(String code) { + public Result existsByPermCode(@NotBlank(message = "编码不可为空") @Parameter(description = "编码") String code) { return Res.ok(permCodeService.existsByCode(code)); } @RequestPath("编码是否被使用(不包含自己)") @Operation(summary = "编码是否被使用(不包含自己)") @GetMapping("/existsByCodeNotId") - public Result existsByPermCode(String code, Long id) { + public Result existsByPermCode( + @NotBlank(message = "编码不可为空") @Parameter(description = "编码") String code, + @NotNull(message = "主键不可为空") @Parameter(description = "主键") Long id) { return Res.ok(permCodeService.existsByPermCode(code, id)); } } diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/permission/PermMenuController.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/permission/PermMenuController.java index 6e0e9733..fbc6ec68 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/permission/PermMenuController.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/permission/PermMenuController.java @@ -1,20 +1,22 @@ package cn.bootx.platform.iam.controller.permission; -import cn.bootx.platform.core.annotation.IgnoreAuth; -import cn.bootx.platform.core.annotation.InternalPath; -import cn.bootx.platform.core.annotation.RequestGroup; -import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.annotation.*; import cn.bootx.platform.core.entity.UserDetail; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.result.Result; +import cn.bootx.platform.core.validation.ValidationGroup; import cn.bootx.platform.iam.param.permission.PermMenuParam; import cn.bootx.platform.iam.result.permission.PermMenuResult; import cn.bootx.platform.iam.service.permission.PermMenuService; import cn.bootx.platform.iam.service.upms.UserRolePremService; import cn.bootx.platform.starter.auth.util.SecurityUtil; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -24,6 +26,7 @@ import java.util.List; * @author xxm * @since 2020/5/11 9:36 */ +@Validated @Tag(name = "菜单权限管理") @RestController @RequestMapping("/perm/menu") @@ -38,7 +41,8 @@ public class PermMenuController { @InternalPath @Operation(summary = "添加菜单权限") @PostMapping("/add") - public Result add(@RequestBody PermMenuParam param) { + @OperateLog(title = "添加菜单权限", businessType = OperateLog.BusinessType.ADD, saveParam = true) + public Result add(@RequestBody @Validated(ValidationGroup.add.class) PermMenuParam param) { permMenuService.add(param); return Res.ok(); } @@ -46,16 +50,16 @@ public class PermMenuController { @InternalPath @Operation(summary = "修改菜单权限") @PostMapping("/update") - public Result update(@RequestBody PermMenuParam param) { + @OperateLog(title = "修改菜单权限", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) + public Result update(@RequestBody @Validated(ValidationGroup.edit.class) PermMenuParam param) { permMenuService.update(param); return Res.ok(); } - @IgnoreAuth @Operation(summary = "获取菜单树") @GetMapping("/tree") - public Result> menuTree(String clientCode) { + public Result> menuTree(@NotBlank(message = "终端编码不可为空") @Parameter(description = "终端编码") String clientCode) { UserDetail user = SecurityUtil.getUser(); if (user.isAdmin()){ return Res.ok(permMenuService.tree(clientCode)); @@ -66,14 +70,15 @@ public class PermMenuController { @RequestPath("根据id查询菜单") @Operation(summary = "根据id查询") @GetMapping("/findById") - public Result findById(Long id) { + public Result findById(@NotNull(message = "主键不可为空") Long id) { return Res.ok(permMenuService.findById(id)); } @InternalPath - @Operation(summary = "删除") + @Operation(summary = "删除菜单权限") @PostMapping("/delete") - public Result delete(Long id) { + @OperateLog(title = "删除菜单权限", businessType = OperateLog.BusinessType.DELETE, saveParam = true) + public Result delete(@NotNull(message = "主键不可为空") Long id) { permMenuService.delete(id); return Res.ok(); } diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/permission/PermPathController.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/permission/PermPathController.java index ede9cee7..c99032d0 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/permission/PermPathController.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/permission/PermPathController.java @@ -1,6 +1,7 @@ package cn.bootx.platform.iam.controller.permission; import cn.bootx.platform.core.annotation.InternalPath; +import cn.bootx.platform.core.annotation.OperateLog; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.entity.UserDetail; @@ -12,7 +13,10 @@ import cn.bootx.platform.iam.service.permission.PermPathSyncService; import cn.bootx.platform.iam.service.upms.UserRolePremService; import cn.bootx.platform.starter.auth.util.SecurityUtil; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; @@ -41,16 +45,16 @@ public class PermPathController { private final PermPathSyncService permPathSyncService; @RequestPath("获取请求权限详情") - @Operation(summary = "获取详情") + @Operation(summary = "获取请求权限详情") @GetMapping("/findById") - public Result findById(Long id) { + public Result findById(@NotNull(message = "主键不可为空") Long id) { return Res.ok(pathService.findById(id)); } @RequestPath("请求权限树") @Operation(summary = "请求权限树") @GetMapping("/tree") - public Result> tree(String clientCode) { + public Result> tree(@NotBlank(message = "终端编码不可为空") @Parameter(description = "终端编码") String clientCode) { UserDetail user = SecurityUtil.getUser(); if (user.isAdmin()){ return Res.ok(pathService.tree(clientCode)); @@ -61,6 +65,7 @@ public class PermPathController { @InternalPath @Operation(summary = "根据系统配置同步请求权限数据") @PostMapping("/sync") + @OperateLog(title = "根据系统配置同步请求权限数据", businessType = OperateLog.BusinessType.SYNC, saveParam = true) public Result sync() { permPathSyncService.sync(); return Res.ok(); diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/role/RoleController.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/role/RoleController.java index 94ff2478..dd918df3 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/role/RoleController.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/role/RoleController.java @@ -1,19 +1,25 @@ package cn.bootx.platform.iam.controller.role; import cn.bootx.platform.core.annotation.IgnoreAuth; +import cn.bootx.platform.core.annotation.OperateLog; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.dto.KeyValue; import cn.bootx.platform.core.rest.result.Result; import cn.bootx.platform.core.util.ValidationUtil; +import cn.bootx.platform.core.validation.ValidationGroup; import cn.bootx.platform.iam.param.role.RoleParam; import cn.bootx.platform.iam.result.role.RoleResult; import cn.bootx.platform.iam.service.role.RoleQueryService; import cn.bootx.platform.iam.service.role.RoleService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -22,6 +28,7 @@ import java.util.List; * @author xxm * @since 2021/6/9 */ +@Validated @Tag(name = "角色管理") @RestController @RequestMapping("/role") @@ -33,29 +40,32 @@ public class RoleController { private final RoleQueryService roleQueryService; - @IgnoreAuth + @RequestPath("添加角色") @Operation(summary = "添加角色") @PostMapping(value = "/add") - public Result add(@RequestBody RoleParam roleParam) { + @OperateLog(title = "添加角色", businessType = OperateLog.BusinessType.ADD, saveParam = true) + public Result add(@RequestBody @Validated(ValidationGroup.add.class) RoleParam roleParam) { ValidationUtil.validateParam(roleParam); roleService.add(roleParam); return Res.ok(); } - @IgnoreAuth - @Operation(summary = "删除角色") - @PostMapping(value = "/delete") - public Result delete(Long id) { - roleService.delete(id); + @RequestPath("修改角色") + @Operation(summary = "修改角色") + @PostMapping(value = "/update") + @OperateLog(title = "修改角色", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) + public Result update(@RequestBody @Validated(ValidationGroup.edit.class) RoleParam roleParam) { + ValidationUtil.validateParam(roleParam); + roleService.update(roleParam); return Res.ok(); } - @IgnoreAuth - @Operation(summary = "修改角色") - @PostMapping(value = "/update") - public Result update(@RequestBody RoleParam roleParam) { - ValidationUtil.validateParam(roleParam); - roleService.update(roleParam); + @RequestPath("删除角色") + @Operation(summary = "删除角色") + @PostMapping(value = "/delete") + @OperateLog(title = "删除角色", businessType = OperateLog.BusinessType.DELETE, saveParam = true) + public Result delete(@NotNull(message = "主键不可为空") Long id) { + roleService.delete(id); return Res.ok(); } @@ -69,7 +79,7 @@ public class RoleController { @RequestPath("通过ID查询角色") @Operation(summary = "通过ID查询角色") @GetMapping(value = "/findById") - public Result findById(Long id) { + public Result findById(@NotNull(message = "主键不可为空") Long id) { return Res.ok(roleQueryService.findById(id)); } @@ -90,28 +100,32 @@ public class RoleController { @RequestPath("编码是否被使用") @Operation(summary = "编码是否被使用") @GetMapping("/existsByCode") - public Result existsByCode(String code) { + public Result existsByCode(@NotBlank(message = "角色编码不可为空") @Parameter(description = "编码") String code) { return Res.ok(roleQueryService.existsByCode(code)); } @RequestPath("编码是否被使用(不包含自己)") @Operation(summary = "编码是否被使用(不包含自己)") @GetMapping("/existsByCodeNotId") - public Result existsByCode(String code, Long id) { + public Result existsByCode( + @NotBlank(message = "编码不可为空") @Parameter(description = "编码") String code, + @NotNull(message = "主键不可为空") @Parameter(description = "主键") Long id) { return Res.ok(roleQueryService.existsByCode(code, id)); } @RequestPath("名称是否被使用") @Operation(summary = "名称是否被使用") @GetMapping("/existsByName") - public Result existsByName(String name) { + public Result existsByName(@NotBlank(message = "角色名称不可为空") @Parameter(description = "角色名称") String name) { return Res.ok(roleQueryService.existsByName(name)); } @RequestPath("名称是否被使用(不包含自己)") @Operation(summary = "名称是否被使用(不包含自己)") @GetMapping("/existsByNameNotId") - public Result existsByName(String name, Long id) { + public Result existsByName( + @NotBlank(message = "角色名称不可为空") @Parameter(description = "角色名称") String name, + @NotNull(message = "主键不可为空") @Parameter(description = "主键") Long id) { return Res.ok(roleQueryService.existsByName(name, id)); } diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/upms/RoleCodeController.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/upms/RoleCodeController.java index 21d28229..0e58f8eb 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/upms/RoleCodeController.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/upms/RoleCodeController.java @@ -1,5 +1,6 @@ package cn.bootx.platform.iam.controller.upms; +import cn.bootx.platform.core.annotation.OperateLog; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; @@ -9,6 +10,7 @@ import cn.bootx.platform.iam.result.permission.PermCodeResult; import cn.bootx.platform.iam.service.upms.RoleCodeService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -32,6 +34,7 @@ public class RoleCodeController { @RequestPath("保存请求权限关系") @Operation(summary = "保存请求权限关系") @PostMapping("/save") + @OperateLog(title = "保存请求权限关系", businessType = OperateLog.BusinessType.GRANT, saveParam = true) public Result save(@RequestBody @Validated PermCodeAssignParam param) { roleCodeService.saveAssign(param); return Res.ok(true); @@ -40,14 +43,14 @@ public class RoleCodeController { @RequestPath("指定角色下的请求权限树(分配时用)") @Operation(summary = "指定角色下的请求权限树(分配时用)") @GetMapping("/treeByRole") - public Result> treeByRole(Long roleId) { + public Result> treeByRole(@NotNull(message = "角色id不可为空") Long roleId) { return Res.ok(roleCodeService.treeByRoleAssign(roleId)); } @RequestPath("查询当前角色已经选择的菜单id") @Operation(summary = "查询当前角色已经选择的菜单id") @GetMapping("/findIdsByRole") - public Result> findIdsByRole(Long roleId) { + public Result> findIdsByRole(@NotNull(message = "角色id不可为空") Long roleId) { return Res.ok(roleCodeService.findCodeIdsByRole(roleId)); } diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/upms/RoleMenuController.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/upms/RoleMenuController.java index 81bbeaa6..255a2aab 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/upms/RoleMenuController.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/upms/RoleMenuController.java @@ -1,5 +1,6 @@ package cn.bootx.platform.iam.controller.upms; +import cn.bootx.platform.core.annotation.OperateLog; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; @@ -9,8 +10,12 @@ import cn.bootx.platform.iam.param.permission.PermMenuAssignParam; import cn.bootx.platform.iam.result.permission.PermMenuResult; import cn.bootx.platform.iam.service.upms.RoleMenuService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -21,6 +26,7 @@ import java.util.List; * @author xxm * @since 2021/7/12 */ +@Validated @Tag(name = "角色菜单权限关系") @RestController @RequestMapping("/role/menu") @@ -33,7 +39,8 @@ public class RoleMenuController { @RequestPath("保存请求权限关系") @Operation(summary = "保存请求权限关系") @PostMapping("/save") - public Result save(@RequestBody PermMenuAssignParam param) { + @OperateLog(title = "保存请求权限关系", businessType = OperateLog.BusinessType.GRANT, saveParam = true) + public Result save(@RequestBody @Validated PermMenuAssignParam param) { ValidationUtil.validateParam(param); rolePermService.saveAssign(param); return Res.ok(true); @@ -43,14 +50,18 @@ public class RoleMenuController { @RequestPath("指定角色下的菜单权限树(分配时用)") @Operation(summary = "指定角色下的菜单权限树(分配时用)") @GetMapping("/treeByRole") - public Result> treeByRole(Long roleId, String clientCode) { + public Result> treeByRole( + @NotNull(message = "角色id不可为空") @Parameter(description = "角色id") Long roleId, + @NotBlank(message = "终端编码不可为空") @Parameter(description = "终端编码") String clientCode) { return Res.ok(rolePermService.treeByRoleAssign(roleId,clientCode)); } @RequestPath("查询当前角色已经选择的菜单id") @Operation(summary = "查询当前角色已经选择的菜单id") @GetMapping("/findIdsByRole") - public Result> findIdsByRole(Long roleId, String clientCode) { + public Result> findIdsByRole( + @NotNull(message = "角色id不可为空") @Parameter(description = "角色id") Long roleId, + @NotBlank(message = "终端编码不可为空") @Parameter(description = "终端编码") String clientCode) { return Res.ok(rolePermService.findIdsByRoleAndClient(roleId,clientCode)); } diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/upms/RolePathController.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/upms/RolePathController.java index b08cf21d..b9febeea 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/upms/RolePathController.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/upms/RolePathController.java @@ -1,16 +1,20 @@ package cn.bootx.platform.iam.controller.upms; +import cn.bootx.platform.core.annotation.OperateLog; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.result.Result; -import cn.bootx.platform.core.util.ValidationUtil; import cn.bootx.platform.iam.param.permission.PermPathAssignParam; import cn.bootx.platform.iam.result.permission.SimplePermPathResult; import cn.bootx.platform.iam.service.upms.RolePathService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -19,6 +23,7 @@ import java.util.List; * @author xxm * @since 2021/6/9 */ +@Validated @Tag(name = "角色请求权限消息关系") @RestController @RequestMapping("/role/path") @@ -31,8 +36,8 @@ public class RolePathController { @RequestPath("保存角色请求权限关联关系") @Operation(summary = "保存角色请求权限关联关系") @PostMapping("/save") - public Result save(@RequestBody PermPathAssignParam param) { - ValidationUtil.validateParam(param); + @OperateLog(title = "保存角色请求权限关联关系", businessType = OperateLog.BusinessType.GRANT, saveParam = true) + public Result save(@RequestBody @Validated PermPathAssignParam param) { rolePathService.saveAssign(param); return Res.ok(); } @@ -40,14 +45,18 @@ public class RolePathController { @RequestPath("指定角色下的请求权限树(分配时用)") @Operation(summary = "指定角色下的请求权限树(分配时用)") @GetMapping("/treeByRole") - public Result> treeByRoleAndClient(Long roleId, String clientCode) { + public Result> treeByRoleAndClient( + @NotNull(message = "角色id不可为空") @Parameter(description = "角色id") Long roleId, + @NotBlank(message = "终端编码不可为空") @Parameter(description = "终端编码") String clientCode) { return Res.ok(rolePathService.treeByRoleAssign(roleId,clientCode)); } @RequestPath("查询当前角色已经选择的请求路径") @Operation(summary = "查询当前角色已经选择的请求路径") @GetMapping("/findIdsByRole") - public Result> findIdsByRole(Long roleId, String clientCode) { + public Result> findIdsByRole( + @NotNull(message = "角色id不可为空") @Parameter(description = "角色id") Long roleId, + @NotBlank(message = "终端编码不可为空") @Parameter(description = "终端编码") String clientCode) { return Res.ok(rolePathService.findIdsByRole(roleId, clientCode)); } diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/upms/UserRoleController.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/upms/UserRoleController.java index 96bdfec3..92479a3e 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/upms/UserRoleController.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/upms/UserRoleController.java @@ -1,16 +1,18 @@ package cn.bootx.platform.iam.controller.upms; +import cn.bootx.platform.core.annotation.OperateLog; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.result.Result; -import cn.bootx.platform.core.util.ValidationUtil; import cn.bootx.platform.iam.param.upms.UserRoleBatchParam; import cn.bootx.platform.iam.param.upms.UserRoleParam; import cn.bootx.platform.iam.result.role.RoleResult; import cn.bootx.platform.iam.service.upms.UserRoleService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -21,6 +23,7 @@ import java.util.List; * @author xxm * @since 2020/5/1 18:09 */ +@Validated @Tag(name = "用户角色管理") @RestController @RequestMapping("/user/role") @@ -33,6 +36,7 @@ public class UserRoleController { @RequestPath("给用户分配角色") @Operation(summary = "给用户分配角色") @PostMapping(value = "/saveAssign") + @OperateLog(title = "给用户分配角色", businessType = OperateLog.BusinessType.GRANT, saveParam = true) public Result saveAssign(@Validated @RequestBody UserRoleParam param) { userRoleService.saveAssign(param.getUserId(), param.getRoleIds()); return Res.ok(); @@ -41,8 +45,8 @@ public class UserRoleController { @RequestPath("给用户分配角色(批量)") @Operation(summary = "给用户分配角色(批量)") @PostMapping(value = "/saveAssignBatch") - public Result saveAssignBatch(@RequestBody UserRoleBatchParam param) { - ValidationUtil.validateParam(param); + @OperateLog(title = "给用户分配角色(批量)", businessType = OperateLog.BusinessType.GRANT, saveParam = true) + public Result saveAssignBatch(@RequestBody @Validated UserRoleBatchParam param) { userRoleService.saveAssignBatch(param.getUserIds(), param.getRoleIds()); return Res.ok(); } @@ -50,14 +54,14 @@ public class UserRoleController { @RequestPath("根据用户ID获取到角色集合") @Operation(summary = "根据用户ID获取到角色集合") @GetMapping(value = "/findRolesByUser") - public Result> findRolesByUser(Long userId) { + public Result> findRolesByUser(@NotNull(message = "用户ID不可为空") @Parameter(description = "用户ID") Long userId) { return Res.ok(userRoleService.findRolesByUser(userId)); } @RequestPath("根据用户ID获取到角色id集合") @Operation(summary = "根据用户ID获取到角色id集合") @GetMapping(value = "/findRoleIdsByUser") - public Result> findRoleIdsByUser(Long userId) { + public Result> findRoleIdsByUser(@NotNull(message = "用户ID不可为空") @Parameter(description = "用户ID") Long userId) { return Res.ok(userRoleService.findRoleIdsByUser(userId)); } diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/user/UserAdminController.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/user/UserAdminController.java index 1726a99d..7ef37035 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/user/UserAdminController.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/user/UserAdminController.java @@ -14,8 +14,8 @@ import cn.bootx.platform.iam.param.user.UserInfoParam; import cn.bootx.platform.iam.param.user.UserInfoQuery; import cn.bootx.platform.iam.result.user.UserInfoResult; import cn.bootx.platform.iam.result.user.UserWholeInfoResult; -import cn.bootx.platform.iam.service.service.UserAdminService; -import cn.bootx.platform.iam.service.service.UserQueryService; +import cn.bootx.platform.iam.service.user.UserAdminService; +import cn.bootx.platform.iam.service.user.UserQueryService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotEmpty; @@ -45,13 +45,14 @@ public class UserAdminController { @RequestPath("根据用户id查询用户 ") @Operation(summary = "根据用户id查询用户") @GetMapping("/findById") - public Result findById(Long id) { + public Result findById(@NotNull(message = "主键不可为空") Long id) { return Res.ok(userQueryService.findById(id)); } @RequestPath("添加用户") @Operation(summary = "添加用户") @PostMapping("/add") + @OperateLog(title = "添加用户", businessType = OperateLog.BusinessType.ADD, saveParam = true) public Result add(@RequestBody @Validated(ValidationGroup.add.class) UserInfoParam userInfoParam) { userAdminService.add(userInfoParam); return Res.ok(); @@ -60,6 +61,7 @@ public class UserAdminController { @RequestPath("修改用户") @Operation(summary = "修改用户") @PostMapping("/update") + @OperateLog(title = "修改用户", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) public Result update(@RequestBody @Validated(ValidationGroup.edit.class) UserInfoParam userInfoParam) { userAdminService.update(userInfoParam); return Res.ok(); @@ -67,8 +69,8 @@ public class UserAdminController { @RequestPath("重置密码") @Operation(summary = "重置密码") - @OperateLog(title = "重置密码", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) @PostMapping("/restartPassword") + @OperateLog(title = "重置密码", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) public Result restartPassword(@RequestBody @Validated RestartPwdParam param) { userAdminService.restartPassword(param.getUserId(), param.getNewPassword()); return Res.ok(); @@ -76,44 +78,44 @@ public class UserAdminController { @RequestPath("批量重置密码") @Operation(summary = "批量重置密码") - @OperateLog(title = "批量重置密码", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) @PostMapping("/restartPasswordBatch") + @OperateLog(title = "批量重置密码", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) public Result restartPasswordBatch(@RequestBody @Validated RestartPwdBatchParam param) { userAdminService.restartPasswordBatch(param.getUserIds(), param.getNewPassword()); return Res.ok(); } @RequestPath("封禁用户") - @OperateLog(title = "封禁用户", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) @Operation(summary = "封禁用户") @PostMapping("/ban") - public Result ban(Long userId) { + @OperateLog(title = "封禁用户", businessType = OperateLog.BusinessType.GRANT, saveParam = true) + public Result ban(@NotNull(message = "用户不可为空") Long userId) { userAdminService.ban(userId); return Res.ok(); } @RequestPath("批量封禁用户") - @OperateLog(title = "批量封禁用户", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) @Operation(summary = "批量封禁用户") @PostMapping("/banBatch") + @OperateLog(title = "批量封禁用户", businessType = OperateLog.BusinessType.GRANT, saveParam = true) public Result banBatch(@RequestBody @NotEmpty(message = "用户集合不可为空") List userIds) { userAdminService.banBatch(userIds); return Res.ok(); } @RequestPath("解锁用户") - @OperateLog(title = "解锁用户", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) @Operation(summary = "解锁用户") @PostMapping("/unlock") + @OperateLog(title = "解锁用户", businessType = OperateLog.BusinessType.GRANT, saveParam = true) public Result unlock(@NotNull(message = "用户不可为空") Long userId) { userAdminService.unlock(userId); return Res.ok(); } @RequestPath("批量解锁用户") - @OperateLog(title = "批量解锁用户", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) @Operation(summary = "批量解锁用户") @PostMapping("/unlockBatch") + @OperateLog(title = "批量解锁用户", businessType = OperateLog.BusinessType.GRANT, saveParam = true) public Result unlockBatch(@RequestBody @NotEmpty(message = "用户集合不可为空") List userIds) { userAdminService.unlockBatch(userIds); return Res.ok(); @@ -125,5 +127,4 @@ public class UserAdminController { public Result> page(PageParam pageParam, UserInfoQuery query) { return Res.ok(userAdminService.page(pageParam, query)); } - } diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/user/UserInfoController.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/user/UserInfoController.java index 087276e3..9ca322da 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/user/UserInfoController.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/controller/user/UserInfoController.java @@ -1,16 +1,19 @@ package cn.bootx.platform.iam.controller.user; import cn.bootx.platform.core.annotation.IgnoreAuth; +import cn.bootx.platform.core.annotation.OperateLog; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.result.Result; import cn.bootx.platform.iam.param.user.UserBaseInfoParam; import cn.bootx.platform.iam.result.user.LoginAfterUserInfoResult; import cn.bootx.platform.iam.result.user.UserBaseInfoResult; -import cn.bootx.platform.iam.service.service.UserInfoService; -import cn.bootx.platform.iam.service.service.UserQueryService; +import cn.bootx.platform.iam.service.user.UserInfoService; +import cn.bootx.platform.iam.service.user.UserQueryService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -34,43 +37,50 @@ public class UserInfoController { @Operation(summary = "账号是否被使用") @GetMapping("/existsAccount") - public Result existsAccount(String account) { + public Result existsAccount(@NotBlank(message = "账号不能为空") String account) { return Res.ok(userQueryService.existsAccount(account)); } @Operation(summary = "账号是否被使用(不包含自己)") @GetMapping("/existsAccountNotId") - public Result existsAccount(String account, Long id) { + public Result existsAccount( + @NotBlank(message = "账号不能为空") @Parameter(description = "账号") String account, + @NotNull(message = "用户ID不能为空") @Parameter(description = "用户ID") Long id) { return Res.ok(userQueryService.existsAccount(account, id)); } @Operation(summary = "手机号是否被使用") @GetMapping("/existsPhone") - public Result existsPhone(String phone) { + public Result existsPhone(@NotBlank(message = "手机号不能为空") String phone) { return Res.ok(userQueryService.existsPhone(phone)); } @Operation(summary = "手机号是否被使用(不包含自己)") @GetMapping("/existsPhoneNotId") - public Result existsPhone(String phone, Long id) { + public Result existsPhone( + @NotBlank(message = "手机号不能为空") @Parameter(description = "手机号") String phone, + @NotNull(message = "用户ID不能为空") @Parameter(description = "用户ID") Long id) { return Res.ok(userQueryService.existsPhone(phone, id)); } @Operation(summary = "邮箱是否被使用") @GetMapping("/existsEmail") - public Result existsEmail(String email) { + public Result existsEmail(@NotBlank(message = "邮箱不能为空") @Parameter(description = "邮箱") String email) { return Res.ok(userQueryService.existsEmail(email)); } @Operation(summary = "邮箱是否被使用(不包含自己)") @GetMapping("/existsEmailNotId") - public Result existsEmail(String email, Long id) { + public Result existsEmail( + @NotBlank(message = "邮箱不能为空") @Parameter(description = "邮箱") String email, + @NotNull(message = "用户ID不能为空") @Parameter(description = "用户ID") Long id) { return Res.ok(userQueryService.existsEmail(email, id)); } @Operation(summary = "修改密码") @PostMapping("/updatePassword") + @OperateLog(title = "修改密码", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) public Result updatePassword(@NotBlank(message = "旧密码不能为空") String password, @NotBlank(message = "新密码不能为空") String newPassword) { userInfoService.updatePassword(password, newPassword); return Res.ok(); @@ -84,6 +94,7 @@ public class UserInfoController { @Operation(summary = "修改用户基础信息") @PostMapping("/updateBaseInfo") + @OperateLog(title = "修改用户基础信息", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) public Result updateBaseInfo(@RequestBody @Validated UserBaseInfoParam param) { userInfoService.updateUserBaseInfo(param); return Res.ok(); diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/dao/permission/PermPathManager.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/dao/permission/PermPathManager.java index a14db71e..db033706 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/dao/permission/PermPathManager.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/dao/permission/PermPathManager.java @@ -19,7 +19,7 @@ import java.util.List; public class PermPathManager extends BaseManager { /** - * 根据节点类型查询查询 + * 根据节点类型和终端编码查询 */ public List findAllByLeafAndClient(boolean isLeaf, String clientCode) { return lambdaQuery() @@ -27,6 +27,14 @@ public class PermPathManager extends BaseManager { .eq(PermPath::getClientCode, clientCode) .list(); } + /** + * 根据节点类型查询 + */ + public List findAllByLeafAndClient(boolean isLeaf) { + return lambdaQuery() + .eq(PermPath::isLeaf, isLeaf) + .list(); + } /** * 根据终端类型查询 diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/entity/client/System.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/entity/client/System.java new file mode 100644 index 00000000..e5b95789 --- /dev/null +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/entity/client/System.java @@ -0,0 +1,19 @@ +package cn.bootx.platform.iam.entity.client; + +import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * + * @author xxm + * @since 2025/1/31 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "") +public class System extends MpBaseEntity { +} diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/handler/InternalRouterCheck.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/handler/InternalRouterCheck.java index 94601ed0..73aa9dd7 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/handler/InternalRouterCheck.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/handler/InternalRouterCheck.java @@ -38,7 +38,7 @@ public class InternalRouterCheck implements RouterCheck { } // internalPath 不为空 if (Objects.nonNull(internalPath)) { - // + // 判断当前用户是否为超级管理员 if (!SecurityUtil.getUser().isAdmin()){ throw new BizWarnException("内部接口不允许普通用户进行调用!"); } diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/handler/UserInfoStatusCheckImpl.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/handler/UserInfoStatusCheckImpl.java index 1759e864..418f1dbd 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/handler/UserInfoStatusCheckImpl.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/handler/UserInfoStatusCheckImpl.java @@ -2,7 +2,7 @@ package cn.bootx.platform.iam.handler; import cn.bootx.platform.core.entity.UserDetail; import cn.bootx.platform.iam.code.UserStatusEnum; -import cn.bootx.platform.iam.service.service.UserAdminService; +import cn.bootx.platform.iam.service.user.UserAdminService; import cn.bootx.platform.starter.auth.authentication.UserInfoStatusCheck; import cn.bootx.platform.starter.auth.configuration.AuthProperties; import cn.bootx.platform.starter.auth.entity.AuthClient; @@ -45,7 +45,7 @@ public class UserInfoStatusCheckImpl implements UserInfoStatusCheck { return; } // 判断用户是否被禁用 - if (Objects.equals(userDetail.getStatus(), UserStatusEnum.BAN.getCode())){ + if (Objects.equals(userDetail.getStatus(), UserStatusEnum.BAN)){ throw new LoginFailureException("该用户已被禁用"); } } diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/handler/UserPathRouterCheck.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/handler/UserPathRouterCheck.java index 6fb0f3c6..10dba2cf 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/handler/UserPathRouterCheck.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/handler/UserPathRouterCheck.java @@ -1,8 +1,8 @@ package cn.bootx.platform.iam.handler; -import cn.bootx.platform.common.config.BootxConfigProperties; import cn.bootx.platform.common.spring.util.WebServletUtil; import cn.bootx.platform.core.entity.UserDetail; +import cn.bootx.platform.iam.service.client.ClientCodeService; import cn.bootx.platform.iam.service.upms.UserRolePremService; import cn.bootx.platform.starter.auth.service.RouterCheck; import cn.bootx.platform.starter.auth.util.SecurityUtil; @@ -25,7 +25,7 @@ public class UserPathRouterCheck implements RouterCheck { private final UserRolePremService userRoleService; - private final BootxConfigProperties configProperties; + private final ClientCodeService clientCodeService; private final AntPathMatcher matcher = new AntPathMatcher(); @@ -45,7 +45,7 @@ public class UserPathRouterCheck implements RouterCheck { } UserDetail userDetail = UserDetailOpt.get(); // 获取用户拥有的请求路径权限 - List paths = userRoleService.findPathByUser(userDetail.getId(), method, configProperties.getClientCode()); + List paths = userRoleService.findPathByUser(userDetail.getId(), method, clientCodeService.getClientCode()); return paths.stream().anyMatch(pattern -> matcher.match(pattern, path)); } diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/client/ClientParam.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/client/ClientParam.java index f2bd248b..5250f1db 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/client/ClientParam.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/client/ClientParam.java @@ -1,8 +1,10 @@ package cn.bootx.platform.iam.param.client; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.experimental.Accessors; +import org.apache.ibatis.annotations.Update; /** * 认证应用 @@ -15,12 +17,15 @@ import lombok.experimental.Accessors; @Accessors(chain = true) public class ClientParam { + @NotNull(message = "主键不可为空", groups = {Update.class}) @Schema(description = "主键") private Long id; + @NotNull(message = "编码不可为空") @Schema(description = "编码") private String code; + @NotNull(message = "名称不可为空") @Schema(description = "名称") private String name; diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermCodeAssignParam.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermCodeAssignParam.java index 22acafb6..465ec448 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermCodeAssignParam.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermCodeAssignParam.java @@ -1,6 +1,7 @@ package cn.bootx.platform.iam.param.permission; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.experimental.Accessors; @@ -17,6 +18,7 @@ import java.util.List; public class PermCodeAssignParam { /** 角色ID */ + @NotNull(message = "角色ID不可为空") @Schema(description = "角色ID") private Long roleId; /** 菜单ID */ diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermCodeParam.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermCodeParam.java index 2cc03d44..bbff1728 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermCodeParam.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermCodeParam.java @@ -1,8 +1,10 @@ package cn.bootx.platform.iam.param.permission; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.experimental.Accessors; +import org.apache.ibatis.annotations.Update; /** * 权限码 @@ -14,15 +16,18 @@ import lombok.experimental.Accessors; @Schema(title = "权限码") public class PermCodeParam { + @NotNull(message = "主键不可为空", groups = {Update.class}) @Schema(description = "id") private Long id; @Schema(description = "父id") private Long pid; + @NotNull(message = "编码不可为空") @Schema(description = "权限码") private String code; + @NotNull(message = "名称不可为空") @Schema(description = "名称") private String name; diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermMenuAssignParam.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermMenuAssignParam.java index d6d7394a..2ac1ca8b 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermMenuAssignParam.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermMenuAssignParam.java @@ -1,6 +1,8 @@ package cn.bootx.platform.iam.param.permission; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.experimental.Accessors; @@ -17,9 +19,11 @@ import java.util.List; public class PermMenuAssignParam { /** 角色ID */ + @NotNull(message = "角色ID不可为空") @Schema(description = "角色ID") private Long roleId; /** 终端编码 */ + @NotBlank(message = "终端编码不可为空") @Schema(description = "终端编码") private String clientCode; /** 菜单ID */ diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermMenuParam.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermMenuParam.java index 07143b76..cf7e5a49 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermMenuParam.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermMenuParam.java @@ -2,9 +2,8 @@ package cn.bootx.platform.iam.param.permission; import cn.bootx.platform.core.validation.ValidationGroup; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Null; import lombok.Data; import lombok.experimental.Accessors; @@ -17,18 +16,18 @@ import lombok.experimental.Accessors; @Schema(title = "菜单权限") public class PermMenuParam { - @Null(groups = { ValidationGroup.edit.class }) - @NotNull(groups = { ValidationGroup.add.class }) + @NotNull(groups = { ValidationGroup.edit.class }, message = "主键不可为空") @Schema(description = "主键") private Long id; @Schema(description = "父id") private Long pid; - @NotEmpty(groups = { ValidationGroup.add.class, ValidationGroup.edit.class }) + @NotBlank(message = "关联应用code不可为空") @Schema(description = "关联应用code") private String clientCode; + @NotBlank(message = "菜单标题不可为空") @Schema(description = "菜单标题") private String title; diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermPathAssignParam.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermPathAssignParam.java index 9e6afc8d..1994e11f 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermPathAssignParam.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/permission/PermPathAssignParam.java @@ -1,6 +1,7 @@ package cn.bootx.platform.iam.param.permission; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.experimental.Accessors; @@ -17,9 +18,11 @@ import java.util.List; public class PermPathAssignParam { /** 角色ID */ + @NotNull(message = "角色ID不可为空") @Schema(description = "角色ID") private Long roleId; /** 终端编码 */ + @NotNull(message = "终端编码不可为空") @Schema(description = "终端编码") private String clientCode; /** 路径ID */ diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/role/RoleParam.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/role/RoleParam.java index 87ae1002..01cd1aea 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/role/RoleParam.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/role/RoleParam.java @@ -1,6 +1,9 @@ package cn.bootx.platform.iam.param.role; +import cn.bootx.platform.core.validation.ValidationGroup; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.experimental.Accessors; @@ -13,15 +16,18 @@ import lombok.experimental.Accessors; @Schema(title = "角色") public class RoleParam { + @NotNull(groups = { ValidationGroup.edit.class }, message = "主键不可为空") @Schema(description = "角色id") private Long id; @Schema(description = "父级Id") private Long pid; + @NotBlank(message = "编码不可为空") @Schema(description = "角色code") private String code; + @NotBlank(message = "角色名称不可为空") @Schema(description = "角色名称") private String name; diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/UserRoleParam.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/UserRoleParam.java index e6e447ec..a201467a 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/UserRoleParam.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/UserRoleParam.java @@ -19,7 +19,6 @@ public class UserRoleParam { private Long userId; @Schema(description = "角色的ID集合") - @NotNull(message = "roleIds 不能为空") private List roleIds; } diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/user/UserInfoParam.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/user/UserInfoParam.java index d4214b35..faf16097 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/user/UserInfoParam.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/param/user/UserInfoParam.java @@ -28,14 +28,14 @@ public class UserInfoParam { @Schema(description = "登录账号") private String account; + @NotBlank(groups = ValidationGroup.add.class, message = "密码不可为空") + @Schema(description = "密码") + private String password; + @Schema(description = "手机号") private String phone; @Schema(description = "邮箱") private String email; - @NotBlank(groups = ValidationGroup.add.class, message = "登录账号不可为空") - @Schema(description = "密码") - private String password; - } diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/client/ClientCodeService.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/client/ClientCodeService.java new file mode 100644 index 00000000..668e3171 --- /dev/null +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/client/ClientCodeService.java @@ -0,0 +1,20 @@ +package cn.bootx.platform.iam.service.client; + +import cn.bootx.platform.common.headerholder.local.HolderContextHolder; +import cn.bootx.platform.core.code.CommonCode; + +/** + * 获取终端编码 + * @author xxm + * @since 2025/1/31 + */ +public interface ClientCodeService { + + /** + * 获取终端编码 + */ + default String getClientCode(){ + // 从请求头获取当前终端类型 + return HolderContextHolder.get(CommonCode.CLIENT); + } +} diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/permission/PermPathService.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/permission/PermPathService.java index 16d3891e..ca2a0ec9 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/permission/PermPathService.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/permission/PermPathService.java @@ -8,6 +8,7 @@ import cn.bootx.platform.iam.result.permission.PermPathResult; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; +import java.util.Comparator; import java.util.List; /** @@ -29,10 +30,15 @@ public class PermPathService { return permPathManager.findById(id).map(PermPath::toResult).orElseThrow(DataNotExistException::new); } + /** + * 请求权限树 + */ public List tree(String clientCode) { List permPaths = permPathManager.findAllByField(PermPath::getClientCode, clientCode).stream() .map(PermPath::toResult) .toList(); - return TreeBuildUtil.build(permPaths,null, PermPathResult::getCode, PermPathResult::getParentCode, PermPathResult::setChildren); + var tree = TreeBuildUtil.build(permPaths, null, PermPathResult::getCode, PermPathResult::getParentCode, PermPathResult::setChildren); + tree.sort(Comparator.comparing(PermPathResult::getName)); + return tree; } } diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/permission/PermPathSyncService.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/permission/PermPathSyncService.java index 1044d860..a7741b90 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/permission/PermPathSyncService.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/permission/PermPathSyncService.java @@ -1,11 +1,15 @@ package cn.bootx.platform.iam.service.permission; import cn.bootx.platform.common.config.BootxConfigProperties; +import cn.bootx.platform.common.config.enums.DeployMode; +import cn.bootx.platform.core.annotation.ClientCode; import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.iam.bo.permission.RequestPathBo; import cn.bootx.platform.iam.dao.permission.PermPathManager; import cn.bootx.platform.iam.dao.upms.RolePathManager; -import cn.bootx.platform.iam.bo.permission.RequestPathBo; import cn.bootx.platform.iam.entity.permission.PermPath; +import cn.bootx.platform.iam.service.client.ClientCodeService; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; @@ -43,6 +47,8 @@ public class PermPathSyncService { private final BootxConfigProperties bootxConfigProperties; + private final ClientCodeService clientCodeService; + private final static String REQUEST_MAPPING_HANDLER_MAPPING = "requestMappingHandlerMapping"; /** @@ -50,11 +56,30 @@ public class PermPathSyncService { */ @CacheEvict(value = "cache:permPath", allEntries = true) public void sync() { - String clientCode = bootxConfigProperties.getClientCode(); - // 获取系统中的请求路径 - List requestPathBos = this.getRequestPath(); + // 判断使用融合部署模式还是分模块模式同步 + if (bootxConfigProperties.getDeployMode() == DeployMode.FUSION){ + // 融合同步 + List clientCodes = bootxConfigProperties.getClientCodes(); + // 查询数据中的数据并转换为请求信息列表 + for (String clientCode : clientCodes) { + sync(clientCode); + } + } else { + // 分模块模式同步 + String clientCode = clientCodeService.getClientCode(); + sync(clientCode); + } + } - // 查询数据中的数据并转换为请求信息列表 + /** + * 数据同步 + */ + private void sync(String clientCode){ + // 获取系统中的请求路径 + List requestPathBos = this.getRequestPath().stream() + // 查询是否包含所有 + .filter(o -> o.isAllClient() || CollUtil.contains(o.getClientCodes(),clientCode)) + .toList(); List permPaths = permPathManager.findAllByLeafAndClient(true,clientCode); var requestPathMap = requestPathBos.stream() .collect(Collectors.toMap(o -> o.getPath() + ":" + o.getMethod(), Function.identity())); @@ -91,7 +116,6 @@ public class PermPathSyncService { // 设置终端编码 list.forEach(o -> o.setClientCode(clientCode)); permPathManager.saveAll(list); - } /** @@ -198,7 +222,7 @@ public class PermPathSyncService { .stream() .filter(pathKey -> { HandlerMethod handlerMethod = map.get(pathKey); - return Objects.nonNull(handlerMethod.getMethodAnnotation(cn.bootx.platform.core.annotation.RequestPath.class)) + return Objects.nonNull(handlerMethod.getMethodAnnotation(RequestPath.class)) &&Objects.nonNull(handlerMethod.getBeanType().getAnnotation(RequestGroup.class)); }).toList(); @@ -240,15 +264,23 @@ public class PermPathSyncService { .toList(); // 读取控制器注解和请求方法注解 - RequestGroup requestGroup = beanClass.getAnnotation(RequestGroup.class); - cn.bootx.platform.core.annotation.RequestPath requestPath = method.getAnnotation(cn.bootx.platform.core.annotation.RequestPath.class); + var requestGroup = beanClass.getAnnotation(RequestGroup.class); + var requestPath = method.getAnnotation(RequestPath.class); + // 判断所属的终端, 如果有@ClientCode注解说明该请求只属于部分终端 + var clientCodes = Optional.ofNullable(method.getAnnotation(ClientCode.class)) + .or(()-> Optional.ofNullable(beanClass.getAnnotation(ClientCode.class))) + .map(ClientCode::value) + .map(CollUtil::newArrayList) + .orElse(null); // 设置通用属性 for (RequestPathBo path : list) { path.setModuleCode(requestGroup.moduleCode()) .setModuleName(requestGroup.moduleName()) .setGroupCode(requestGroup.groupCode()) .setGroupName(requestGroup.groupName()) + .setAllClient(Objects.isNull(clientCodes)) + .setClientCodes(clientCodes) .setName(requestPath.value()); } return list; diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/role/RoleQueryService.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/role/RoleQueryService.java index 468981e7..c413a980 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/role/RoleQueryService.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/role/RoleQueryService.java @@ -148,7 +148,7 @@ public class RoleQueryService { // 获取关联的角色和子角色 List unfold = TreeBuildUtil.unfold(tree, RoleResult::getChildren).stream() .filter(role -> roleIds.contains(role.getId())) - .collect(Collectors.toList()); + .collect(Collectors.toList());; var list = new ArrayList<>(unfold); // 将子孙级别的角色移除, 只保留根角色 for (var out : unfold) { diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/role/RoleService.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/role/RoleService.java index 48707ae9..f23116fa 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/role/RoleService.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/role/RoleService.java @@ -46,7 +46,6 @@ public class RoleService { */ @Transactional(rollbackFor = Exception.class) public void add(RoleParam roleParam) { - // 判断是否有权限修改 if (!userRoleService.checkUserRole(roleParam.getPid())){ throw new ValidationFailedException("你没有权限创建该角色"); diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/upms/RoleCodeService.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/upms/RoleCodeService.java index 1e1e6075..484c35b2 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/upms/RoleCodeService.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/upms/RoleCodeService.java @@ -152,7 +152,7 @@ public class RoleCodeService { // 权限码列表 List permCodes = allPermCodes.stream() .filter(PermCode::isLeaf) - .toList(); + .toList();; // 如果有有上级角色, 显示上级角色已分配的权限 if (Objects.nonNull(role.getPid())){ List codeIds = roleCodeManager.findAllByRole(role.getPid()) diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/upms/UserRolePremService.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/upms/UserRolePremService.java index aecf29fa..6e5caf48 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/upms/UserRolePremService.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/upms/UserRolePremService.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Collection; +import java.util.Comparator; import java.util.List; /** @@ -64,7 +65,7 @@ public class UserRolePremService { } /** - * 获取请求路径树 + * 获取用户有权限的请求路径树 */ public List pathTreeByUser(Long userId, String clientCode){ // 获取用户角色 @@ -77,7 +78,9 @@ public class UserRolePremService { .toList(); // 获取目录节点, 进行合并后生成树 List catalogCodes = permPathManager.findAllByLeafAndClient(false, clientCode); - return rolePathService.buildPathTree(leafList, catalogCodes); + var tree = rolePathService.buildPathTree(leafList, catalogCodes); + tree.sort(Comparator.comparing(PermPathResult::getName)); + return tree; } /** diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/upms/UserRoleService.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/upms/UserRoleService.java index f1737e8f..a7bf6ea5 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/upms/UserRoleService.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/upms/UserRoleService.java @@ -4,14 +4,13 @@ import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.entity.UserDetail; import cn.bootx.platform.core.exception.BizException; import cn.bootx.platform.core.exception.ValidationFailedException; -import cn.bootx.platform.core.util.TreeBuildUtil; import cn.bootx.platform.iam.dao.role.RoleManager; import cn.bootx.platform.iam.dao.upms.UserRoleManager; import cn.bootx.platform.iam.dao.user.UserInfoManager; +import cn.bootx.platform.iam.entity.role.Role; import cn.bootx.platform.iam.entity.upms.UserRole; import cn.bootx.platform.iam.entity.user.UserInfo; import cn.bootx.platform.iam.result.role.RoleResult; -import cn.bootx.platform.iam.service.role.RoleQueryService; import cn.bootx.platform.starter.auth.util.SecurityUtil; import cn.hutool.core.collection.CollUtil; import lombok.RequiredArgsConstructor; @@ -37,8 +36,6 @@ public class UserRoleService { private final RoleManager roleManager; - private final RoleQueryService roleQueryService; - private final UserInfoManager userInfoManager; private final UserRoleManager userRoleManager; @@ -49,12 +46,7 @@ public class UserRoleService { @Transactional(rollbackFor = Exception.class) public void saveAssign(Long userId, List roleIds) { // 判断是否越权 - List roleTree = roleQueryService.tree(); - List roleIdsByUser = TreeBuildUtil.unfold(roleTree, RoleResult::getChildren) - .stream() - .distinct() - .map(RoleResult::getId) - .toList(); + List roleIdsByUser = this.findRoleIdsByUser(); if (!CollUtil.containsAll(roleIdsByUser, roleIds)){ throw new ValidationFailedException("角色分配超出了可分配的范围"); } @@ -71,13 +63,7 @@ public class UserRoleService { */ @Transactional(rollbackFor = Exception.class) public void saveAssignBatch(List userIds, List roleIds) { - // 判断是否越权 - List roleTree = roleQueryService.tree(); - List roleIdsByUser = TreeBuildUtil.unfold(roleTree, RoleResult::getChildren) - .stream() - .distinct() - .map(RoleResult::getId) - .toList(); + List roleIdsByUser = this.findRoleIdsByUser(); if (!CollUtil.containsAll(roleIdsByUser, roleIds)){ throw new ValidationFailedException("角色分配超出了可分配的范围"); } @@ -120,6 +106,18 @@ public class UserRoleService { .toList(); } + /** + * 查询用户关联的角色, 超级管理员返回全部 + */ + private List findRoleIdsByUser() { + UserDetail user = SecurityUtil.getUser(); + if (user.isAdmin()){ + return roleManager.findAll().stream().map(Role::getId).toList(); + } else { + return findRoleIdsByUser(user.getId()); + } + } + /** * 判断当前登录用户和指定角色是否为符合下列条件 * 1. 为超级管理员 diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/service/UserAdminService.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/user/UserAdminService.java similarity index 98% rename from bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/service/UserAdminService.java rename to bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/user/UserAdminService.java index 8a95c1bb..e10383bc 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/service/UserAdminService.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/user/UserAdminService.java @@ -1,4 +1,4 @@ -package cn.bootx.platform.iam.service.service; +package cn.bootx.platform.iam.service.user; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.exception.BizException; @@ -111,7 +111,7 @@ public class UserAdminService { * 批量解锁用户 */ public void unlockBatch(List userIds) { - userInfoManager.setUpStatusBatch(userIds, UserStatusEnum.NORMAL.getName()); + userInfoManager.setUpStatusBatch(userIds, UserStatusEnum.NORMAL.getCode()); } /** @@ -122,7 +122,6 @@ public class UserAdminService { if (userQueryService.existsAccount(userInfoParam.getAccount())) { throw new BizException("账号已存在"); } - // 注册时间 UserInfo userInfo = UserInfo.init(userInfoParam); userInfo.setAdministrator(false) .setStatus(UserStatusEnum.NORMAL.getCode()) diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/service/UserInfoService.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/user/UserInfoService.java similarity index 98% rename from bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/service/UserInfoService.java rename to bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/user/UserInfoService.java index 9b76c71b..80af7f47 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/service/UserInfoService.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/user/UserInfoService.java @@ -1,4 +1,4 @@ -package cn.bootx.platform.iam.service.service; +package cn.bootx.platform.iam.service.user; import cn.bootx.platform.core.exception.BizException; import cn.bootx.platform.iam.dao.user.UserExpandInfoManager; diff --git a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/service/UserQueryService.java b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/user/UserQueryService.java similarity index 98% rename from bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/service/UserQueryService.java rename to bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/user/UserQueryService.java index f4adf042..6efda7d4 100644 --- a/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/service/UserQueryService.java +++ b/bootx-platform/bootx-platform-service/service-iam/src/main/java/cn/bootx/platform/iam/service/user/UserQueryService.java @@ -1,4 +1,4 @@ -package cn.bootx.platform.iam.service.service; +package cn.bootx.platform.iam.service.user; import cn.bootx.platform.iam.dao.user.UserInfoManager; import cn.bootx.platform.iam.entity.user.UserInfo; diff --git a/bootx-platform/bootx-platform-starter/pom.xml b/bootx-platform/bootx-platform-starter/pom.xml index 8f16d9bc..35e4a6c8 100644 --- a/bootx-platform/bootx-platform-starter/pom.xml +++ b/bootx-platform/bootx-platform-starter/pom.xml @@ -6,11 +6,12 @@ cn.bootx.platform bootx-platform - 3.0.0.beta4 + 3.0.0.beta5 starter-auth - starter-quartz + + starter-audit-log starter-file starter-delay-queue @@ -25,7 +26,7 @@ cn.bootx.platform bootx-platform-core - 3.0.0.beta4 + 3.0.0.beta5 diff --git a/bootx-platform/bootx-platform-starter/starter-audit-log/pom.xml b/bootx-platform/bootx-platform-starter/starter-audit-log/pom.xml index e5f6b220..7c97ad12 100644 --- a/bootx-platform/bootx-platform-starter/starter-audit-log/pom.xml +++ b/bootx-platform/bootx-platform-starter/starter-audit-log/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-starter - 3.0.0.beta4 + 3.0.0.beta5 starter-audit-log @@ -53,6 +53,12 @@ ip2region ${ip2region.version} + + + cn.hutool + hutool-http + ${hutool.version} +
diff --git a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/controller/LoginLogController.java b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/controller/LoginLogController.java index 405c63e2..b22da9e4 100644 --- a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/controller/LoginLogController.java +++ b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/controller/LoginLogController.java @@ -6,14 +6,16 @@ import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; +import cn.bootx.platform.starter.audit.log.param.LoginLogQuery; import cn.bootx.platform.starter.audit.log.result.LoginLogResult; -import cn.bootx.platform.starter.audit.log.param.LoginLogParam; import cn.bootx.platform.starter.audit.log.service.log.LoginLogService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -21,10 +23,11 @@ import org.springframework.web.bind.annotation.RestController; * @author xxm * @since 2021/9/7 */ +@Validated @Tag(name = "登录日志") @RestController @RequestMapping("/log/login") -@RequestGroup(groupCode = "loginLog", groupName = "登录日志", moduleCode = "starter", moduleName = "starter模块") +@RequestGroup(groupCode = "loginLog", groupName = "登录日志", moduleCode = "starter", moduleName = "(Bootx)starter模块") @RequiredArgsConstructor public class LoginLogController { @@ -33,21 +36,21 @@ public class LoginLogController { @RequestPath("登录日志分页") @Operation(summary = "分页") @GetMapping("/page") - public Result> page(PageParam pageParam, LoginLogParam loginLogParam) { - return Res.ok(loginLogService.page(pageParam, loginLogParam)); + public Result> page(PageParam pageParam, LoginLogQuery query) { + return Res.ok(loginLogService.page(pageParam, query)); } @RequestPath("获取登录日志") @Operation(summary = "获取") @GetMapping("/findById") - public Result findById(Long id) { + public Result findById(@NotNull(message = "主键不可为空") Long id) { return Res.ok(loginLogService.findById(id)); } @RequestPath("清除指定天数之前的登录日志") @Operation(summary = "清除指定天数之前的日志") @PostMapping("/deleteByDay") - public Result deleteByDay(int deleteDay){ + public Result deleteByDay(@NotNull(message = "天数不可为空") Integer deleteDay){ loginLogService.deleteByDay(deleteDay); return Res.ok(); } diff --git a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/controller/OperateLogController.java b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/controller/OperateLogController.java index 9744ca9a..538e0850 100644 --- a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/controller/OperateLogController.java +++ b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/controller/OperateLogController.java @@ -6,14 +6,16 @@ import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; +import cn.bootx.platform.starter.audit.log.param.OperateLogQuery; import cn.bootx.platform.starter.audit.log.result.OperateLogResult; -import cn.bootx.platform.starter.audit.log.param.OperateLogParam; import cn.bootx.platform.starter.audit.log.service.log.OperateLogService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -23,10 +25,11 @@ import org.springframework.web.bind.annotation.RestController; * @author xxm * @since 2021/9/8 */ +@Validated @Tag(name = "操作日志") @RestController @RequestMapping("/log/operate") -@RequestGroup(groupCode = "operateLog", groupName = "操作日志", moduleCode = "starter", moduleName = "starter模块") +@RequestGroup(groupCode = "operateLog", groupName = "操作日志", moduleCode = "starter") @RequiredArgsConstructor public class OperateLogController { @@ -35,14 +38,14 @@ public class OperateLogController { @RequestPath("操作日志分页") @Operation(summary = "分页") @GetMapping("/page") - public Result> page(PageParam pageParam, OperateLogParam operateLogParam) { + public Result> page(PageParam pageParam, OperateLogQuery operateLogParam) { return Res.ok(operateLogService.page(pageParam, operateLogParam)); } @RequestPath("获取日志分页") @Operation(summary = "获取") @GetMapping("/findById") - public Result findById(Long id) { + public Result findById(@NotNull(message = "主键不可为空") Long id) { return Res.ok(operateLogService.findById(id)); } @@ -50,8 +53,8 @@ public class OperateLogController { @RequestPath("清除指定天数的操作日志") @Operation(summary = "清除指定天数的日志") @PostMapping("/deleteByDay") - public Result deleteByDay(Integer type){ - operateLogService.deleteByDay(type); + public Result deleteByDay(@NotNull(message = "天数不可为空") Integer deleteDay){ + operateLogService.deleteByDay(deleteDay); return Res.ok(); } } diff --git a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/dao/LoginLogDbManager.java b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/dao/LoginLogDbManager.java index 8ccd5592..d9b49361 100644 --- a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/dao/LoginLogDbManager.java +++ b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/dao/LoginLogDbManager.java @@ -1,11 +1,12 @@ package cn.bootx.platform.starter.audit.log.dao; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.starter.audit.log.entity.LoginLogDb; -import cn.bootx.platform.starter.audit.log.param.LoginLogParam; -import cn.hutool.core.util.StrUtil; +import cn.bootx.platform.starter.audit.log.param.LoginLogQuery; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -24,14 +25,10 @@ import java.time.LocalDateTime; @RequiredArgsConstructor public class LoginLogDbManager extends BaseManager { - public Page page(PageParam pageParam, LoginLogParam loginLogParam) { - Page mpPage = MpUtil.getMpPage(pageParam); - return lambdaQuery().orderByDesc(LoginLogDb::getId) - .like(StrUtil.isNotBlank(loginLogParam.getAccount()), LoginLogDb::getAccount, loginLogParam.getAccount()) - .like(StrUtil.isNotBlank(loginLogParam.getClient()), LoginLogDb::getClient, loginLogParam.getClient()) - .like(StrUtil.isNotBlank(loginLogParam.getLoginType()), LoginLogDb::getLoginType, - loginLogParam.getLoginType()) - .page(mpPage); + public Page page(PageParam pageParam, LoginLogQuery query) { + var mpPage = MpUtil.getMpPage(pageParam, LoginLogDb.class); + QueryWrapper generator = QueryGenerator.generator(query); + return this.page(mpPage, generator); } public void deleteByOffset(LocalDateTime offset) { diff --git a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/dao/OperateLogDbManager.java b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/dao/OperateLogDbManager.java index 8a908bec..f38e5420 100644 --- a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/dao/OperateLogDbManager.java +++ b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/dao/OperateLogDbManager.java @@ -1,18 +1,18 @@ package cn.bootx.platform.starter.audit.log.dao; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.starter.audit.log.entity.OperateLogDb; -import cn.bootx.platform.starter.audit.log.param.OperateLogParam; -import cn.hutool.core.util.StrUtil; +import cn.bootx.platform.starter.audit.log.param.OperateLogQuery; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.time.LocalDateTime; -import java.util.Objects; /** * 操作日志 @@ -25,16 +25,13 @@ import java.util.Objects; @RequiredArgsConstructor public class OperateLogDbManager extends BaseManager { - public Page page(PageParam pageParam, OperateLogParam operateLogParam) { + /** + * 分页 + */ + public Page page(PageParam pageParam, OperateLogQuery query) { + QueryWrapper generator = QueryGenerator.generator(query); Page mpPage = MpUtil.getMpPage(pageParam); - return lambdaQuery() - .like(StrUtil.isNotBlank(operateLogParam.getAccount()), OperateLogDb::getAccount, - operateLogParam.getAccount()) - .like(StrUtil.isNotBlank(operateLogParam.getTitle()), OperateLogDb::getTitle, operateLogParam.getTitle()) - .eq(Objects.nonNull(operateLogParam.getBusinessType()), OperateLogDb::getBusinessType, - operateLogParam.getBusinessType()) - .orderByDesc(OperateLogDb::getOperateTime) - .page(mpPage); + return this.page(mpPage,generator); } /** diff --git a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/entity/OperateLogDb.java b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/entity/OperateLogDb.java index a962e89f..9ba237a6 100644 --- a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/entity/OperateLogDb.java +++ b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/entity/OperateLogDb.java @@ -32,6 +32,15 @@ public class OperateLogDb extends MpIdEntity implements ToResult logs = getMethodAnnotation(joinPoint); if (CollUtil.isEmpty(logs)) { return; } // ip信息 - String ip = "未知"; + var ip = "未知"; String location = "未知"; Optional ipOpt = Optional.ofNullable(WebServletUtil.getRequest()).map(JakartaServletUtil::getClientIP); if (ipOpt.isPresent()){ ip = ipOpt.get(); location = ipToRegionService.getRegionStrByIp(ip); } + // 获取终端 + String clientCode = HolderContextHolder.get(CommonCode.CLIENT); + + var userAgent = UserAgentUtil.parse(HeaderHolder.getHeader(WebHeaderCode.USER_AGENT)); + // 登录用户 Optional currentUser = SecurityUtil.getCurrentUser(); // 设置方法名称 - String className = joinPoint.getTarget().getClass().getName(); - String methodName = joinPoint.getSignature().getName(); + var className = joinPoint.getTarget().getClass().getName(); + var methodName = joinPoint.getSignature().getName(); for (OperateLog log : logs) { OperateLogParam operateLog = new OperateLogParam().setTitle(log.title()) @@ -101,24 +107,26 @@ public class OperateLogAspectHandler { .setOperateUrl(HeaderHolder.getHeader(ServletCode.REQUEST_URI)) .setMethod(className + "#" + methodName) .setRequestMethod(HeaderHolder.getHeader(ServletCode.METHOD)) + .setClient(clientCode) + .setOs(userAgent.getOs().getName()) + .setBrowser(userAgent.getBrowser().getName() + " " + userAgent.getVersion()) .setSuccess(true) .setOperateIp(ip) .setOperateLocation(location) .setOperateTime(LocalDateTime.now()); - // 异常流 if (Objects.nonNull(e)) { operateLog.setSuccess(false).setErrorMsg(e.getMessage()); } // 参数 - if (log.saveParam()) { + if (log.saveParam() && Objects.nonNull(joinPoint.getArgs())) { Object[] args = joinPoint.getArgs(); operateLog.setOperateParam(JacksonUtil.toJson(args)); } // 返回值 - if (log.saverReturn()) { + if (log.saverReturn()&& Objects.nonNull(o)) { operateLog.setOperateReturn(JacksonUtil.toJson(o)); } operateLogService.add(operateLog); diff --git a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/param/LoginLogQuery.java b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/param/LoginLogQuery.java new file mode 100644 index 00000000..4a8cadb1 --- /dev/null +++ b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/param/LoginLogQuery.java @@ -0,0 +1,49 @@ +package cn.bootx.platform.starter.audit.log.param; + +import cn.bootx.platform.core.annotation.QueryParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * + * @author xxm + * @since 2025/2/12 + */ +@QueryParam(type = QueryParam.CompareTypeEnum.LIKE) +@Data +@Accessors(chain = true) +@Schema(description = "登录日志") +public class LoginLogQuery { + + @Schema(description = "用户账号id") + private Long userId; + + @Schema(description = "用户账号") + private String account; + + @QueryParam(type = QueryParam.CompareTypeEnum.EQ) + @Schema(description = "登录成功状态") + private Boolean login; + + @QueryParam(type = QueryParam.CompareTypeEnum.EQ) + @Schema(description = "登录终端") + private String client; + + @QueryParam(type = QueryParam.CompareTypeEnum.EQ) + @Schema(description = "登录方式") + private String loginType; + + @Schema(description = "登录IP地址") + private String ip; + + @Schema(description = "登录地点") + private String loginLocation; + + @Schema(description = "浏览器类型") + private String browser; + + @Schema(description = "操作系统") + private String os; + +} diff --git a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/param/OperateLogParam.java b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/param/OperateLogParam.java index 3c143424..6f74bfe2 100644 --- a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/param/OperateLogParam.java +++ b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/param/OperateLogParam.java @@ -26,6 +26,15 @@ public class OperateLogParam { @Schema(description = "操作人员账号") private String account; + @Schema(description = "终端编码") + private String client; + + @Schema(description = "浏览器类型") + private String browser; + + @Schema(description = "操作系统") + private String os; + @Schema(description = "业务类型") private String businessType; diff --git a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/param/OperateLogQuery.java b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/param/OperateLogQuery.java new file mode 100644 index 00000000..3d50c860 --- /dev/null +++ b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/param/OperateLogQuery.java @@ -0,0 +1,60 @@ +package cn.bootx.platform.starter.audit.log.param; + +import cn.bootx.platform.core.annotation.QueryParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 操作日志查询参数 + * @author xxm + * @since 2025/2/12 + */ +@QueryParam(type = QueryParam.CompareTypeEnum.LIKE) +@Data +@Accessors(chain = true) +@Schema(description = "操作日志") +public class OperateLogQuery { + + @Schema(description = "操作模块") + private String title; + + @Schema(description = "操作人员账号") + private String account; + + @QueryParam(type = QueryParam.CompareTypeEnum.EQ) + @Schema(description = "终端编码") + private String client; + + @Schema(description = "浏览器类型") + private String browser; + + @Schema(description = "操作系统") + private String os; + + @QueryParam(type = QueryParam.CompareTypeEnum.EQ) + @Schema(description = "业务类型") + private String businessType; + + @QueryParam(type = QueryParam.CompareTypeEnum.EQ) + @Schema(description = "请求方法") + private String method; + + @QueryParam(type = QueryParam.CompareTypeEnum.EQ) + @Schema(description = "请求方式") + private String requestMethod; + + @Schema(description = "请求url") + private String operateUrl; + + @Schema(description = "操作ip") + private String operateIp; + + @Schema(description = "操作地点") + private String operateLocation; + + @QueryParam(type = QueryParam.CompareTypeEnum.EQ) + @Schema(description = "操作状态") + private Boolean success; + +} diff --git a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/result/OperateLogResult.java b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/result/OperateLogResult.java index a110af1b..669d370c 100644 --- a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/result/OperateLogResult.java +++ b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/result/OperateLogResult.java @@ -28,9 +28,18 @@ public class OperateLogResult { @Schema(description = "操作人员id") private Long operateId; + @Schema(description = "浏览器类型") + private String browser; + + @Schema(description = "操作系统") + private String os; + @Schema(description = "操作人员账号") private String account; + @Schema(description = "登录终端") + private String client; + @Schema(description = "请求方法") private String method; diff --git a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/service/ip2region/IpToRegionService.java b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/service/ip2region/IpToRegionService.java index 03683301..1ac2f7f1 100644 --- a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/service/ip2region/IpToRegionService.java +++ b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/service/ip2region/IpToRegionService.java @@ -36,7 +36,7 @@ public class IpToRegionService { private Searcher getSearcherByFile(){ try { return Searcher.newWithFileOnly(auditLogProperties.getIp2region().getFilePath()); - } catch (IOException e) { + } catch (Exception e) { return null; } } @@ -52,7 +52,7 @@ public class IpToRegionService { XDB_INDEX = Searcher.loadVectorIndexFromFile(filePath); } return Searcher.newWithVectorIndex(filePath, XDB_INDEX); - } catch (IOException e) { + } catch (Exception e) { return null; } } @@ -68,7 +68,7 @@ public class IpToRegionService { XDB_BUFF = Searcher.loadContentFromFile(filePath); } return Searcher.newWithBuffer(XDB_BUFF); - } catch (IOException e) { + } catch (Exception e) { return null; } } @@ -100,7 +100,7 @@ public class IpToRegionService { }; // 无法进行查询 if (Objects.isNull(searcher)){ - log.warn(""); + log.warn("无法进行查询"); return null; } diff --git a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/service/log/LoginLogService.java b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/service/log/LoginLogService.java index d97c707e..a8ab78de 100644 --- a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/service/log/LoginLogService.java +++ b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/service/log/LoginLogService.java @@ -8,6 +8,7 @@ import cn.bootx.platform.starter.audit.log.convert.LogConvert; import cn.bootx.platform.starter.audit.log.dao.LoginLogDbManager; import cn.bootx.platform.starter.audit.log.entity.LoginLogDb; import cn.bootx.platform.starter.audit.log.param.LoginLogParam; +import cn.bootx.platform.starter.audit.log.param.LoginLogQuery; import cn.bootx.platform.starter.audit.log.result.LoginLogResult; import cn.hutool.core.date.LocalDateTimeUtil; import lombok.RequiredArgsConstructor; @@ -50,8 +51,8 @@ public class LoginLogService { /** * 分页 */ - public PageResult page(PageParam pageParam, LoginLogParam loginLogParam) { - return MpUtil.toPageResult(loginLogManager.page(pageParam, loginLogParam)); + public PageResult page(PageParam pageParam, LoginLogQuery query) { + return MpUtil.toPageResult(loginLogManager.page(pageParam, query)); } /** diff --git a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/service/log/OperateLogService.java b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/service/log/OperateLogService.java index 95a88146..8cbe9ada 100644 --- a/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/service/log/OperateLogService.java +++ b/bootx-platform/bootx-platform-starter/starter-audit-log/src/main/java/cn/bootx/platform/starter/audit/log/service/log/OperateLogService.java @@ -8,6 +8,7 @@ import cn.bootx.platform.starter.audit.log.convert.LogConvert; import cn.bootx.platform.starter.audit.log.dao.OperateLogDbManager; import cn.bootx.platform.starter.audit.log.entity.OperateLogDb; import cn.bootx.platform.starter.audit.log.param.OperateLogParam; +import cn.bootx.platform.starter.audit.log.param.OperateLogQuery; import cn.bootx.platform.starter.audit.log.result.OperateLogResult; import cn.hutool.core.date.LocalDateTimeUtil; import lombok.RequiredArgsConstructor; @@ -49,7 +50,7 @@ public class OperateLogService { /** * 分页 */ - public PageResult page(PageParam pageParam, OperateLogParam operateLogParam) { + public PageResult page(PageParam pageParam, OperateLogQuery operateLogParam) { return MpUtil.toPageResult(operateLogManager.page(pageParam, operateLogParam)); } diff --git a/bootx-platform/bootx-platform-starter/starter-auth/pom.xml b/bootx-platform/bootx-platform-starter/starter-auth/pom.xml index 7d63d0f4..0346e9a0 100644 --- a/bootx-platform/bootx-platform-starter/starter-auth/pom.xml +++ b/bootx-platform/bootx-platform-starter/starter-auth/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-starter - 3.0.0.beta4 + 3.0.0.beta5 starter-auth diff --git a/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/cache/SessionCacheFilter.java b/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/cache/SessionCacheFilter.java index 0f6aac24..c30285cf 100644 --- a/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/cache/SessionCacheFilter.java +++ b/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/cache/SessionCacheFilter.java @@ -6,7 +6,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; -import org.springframework.core.annotation.Order; +import org.springframework.boot.web.servlet.filter.OrderedFilter; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; @@ -18,11 +18,10 @@ import java.io.IOException; * @author xxm * @since 2022/1/8 */ -@Order(value = Integer.MIN_VALUE + 1) @Component @RequiredArgsConstructor @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) -public class SessionCacheFilter extends OncePerRequestFilter { +public class SessionCacheFilter extends OncePerRequestFilter implements OrderedFilter { @Override public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) @@ -35,4 +34,10 @@ public class SessionCacheFilter extends OncePerRequestFilter { } } + + @Override + public int getOrder() { + return HIGHEST_PRECEDENCE+100; + } + } diff --git a/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/endpoint/TokenEndpoint.java b/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/endpoint/TokenEndpoint.java index df2b41c5..3306e1c6 100644 --- a/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/endpoint/TokenEndpoint.java +++ b/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/endpoint/TokenEndpoint.java @@ -7,6 +7,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -18,6 +19,7 @@ import org.springframework.web.bind.annotation.RestController; * @author xxm * @since 2021/7/30 */ +@Validated @Tag(name = "认证相关") @RestController @RequestMapping("/token") @@ -29,7 +31,6 @@ public class TokenEndpoint { @Operation(summary = "普通登录") @PostMapping("/login") public Result login(HttpServletRequest request, HttpServletResponse response) { -// return Res.ok("cs"); return Res.ok(tokenService.login(request, response)); } diff --git a/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/endpoint/TokenService.java b/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/endpoint/TokenService.java index 19e3363f..e811de0e 100644 --- a/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/endpoint/TokenService.java +++ b/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/endpoint/TokenService.java @@ -83,7 +83,8 @@ public class TokenService { try { loginSuccessHandler.onLoginSuccess(request, response, authInfoResult); } - catch (Exception ignored) { + catch (Exception exception) { + log.error("登录成功处理出现异常: {}", exception.getMessage(), exception); } } } @@ -97,7 +98,8 @@ public class TokenService { try { loginFailureHandler.onLoginFailure(request, response, e); } - catch (Exception ignored) { + catch (Exception exception) { + log.error("登录失败处理出现异常: {}", exception.getMessage(), exception); } } } diff --git a/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/exception/RouterCheckException.java b/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/exception/RouterCheckException.java index 71a36733..d116989d 100644 --- a/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/exception/RouterCheckException.java +++ b/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/exception/RouterCheckException.java @@ -11,7 +11,10 @@ import cn.bootx.platform.core.exception.BizInfoException; public class RouterCheckException extends BizInfoException { public RouterCheckException() { - super("未登录或不拥有改请求路径的请求权限"); + super("没有对应请求路径的权限"); + } + public RouterCheckException(String message) { + super(message); } } diff --git a/bootx-platform/bootx-platform-starter/starter-delay-queue/pom.xml b/bootx-platform/bootx-platform-starter/starter-delay-queue/pom.xml index 40c8bc44..6940096b 100644 --- a/bootx-platform/bootx-platform-starter/starter-delay-queue/pom.xml +++ b/bootx-platform/bootx-platform-starter/starter-delay-queue/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-starter - 3.0.0.beta4 + 3.0.0.beta5 starter-delay-queue diff --git a/bootx-platform/bootx-platform-starter/starter-delay-queue/src/main/java/cn/bootx/platform/starter/redis/delay/controller/DelayQueueController.java b/bootx-platform/bootx-platform-starter/starter-delay-queue/src/main/java/cn/bootx/platform/starter/redis/delay/controller/DelayQueueController.java index e1874094..8e6cff72 100644 --- a/bootx-platform/bootx-platform-starter/starter-delay-queue/src/main/java/cn/bootx/platform/starter/redis/delay/controller/DelayQueueController.java +++ b/bootx-platform/bootx-platform-starter/starter-delay-queue/src/main/java/cn/bootx/platform/starter/redis/delay/controller/DelayQueueController.java @@ -1,5 +1,6 @@ package cn.bootx.platform.starter.redis.delay.controller; +import cn.bootx.platform.core.annotation.OperateLog; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; @@ -12,7 +13,9 @@ import cn.bootx.platform.starter.redis.delay.result.TopicResult; import cn.bootx.platform.starter.redis.delay.service.DelayQueueService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -25,8 +28,9 @@ import java.util.List; * @author xxm * @since 2024/9/20 */ +@Validated @Tag(name = "延时队列管理") -@RequestGroup(groupCode = "delay", groupName = "延时队列管理", moduleCode = "starter", moduleName = "starter模块") +@RequestGroup(groupCode = "delay", groupName = "延时队列管理", moduleCode = "starter") @RestController @RequestMapping("/delay/queue") @RequiredArgsConstructor @@ -41,9 +45,9 @@ public class DelayQueueController { } @RequestPath("获取死信主题列表") - @Operation(summary = "获取桶任务分页") + @Operation(summary = "获取死信主题列表") @GetMapping("/pageBucketJob") - public Result> pageBucketJob(String bucketName, PageParam pageParam) { + public Result> pageBucketJob(@NotBlank(message = "死信主题不可为空") String bucketName, PageParam pageParam) { return Res.ok(delayQueueService.pageBucketJob(bucketName, pageParam)); } @@ -57,14 +61,14 @@ public class DelayQueueController { @RequestPath("获取就绪主题任务分页") @Operation(summary = "获取就绪任务分页") @GetMapping("/pageReadyJob") - public Result> pageReadyJob(String topic, PageParam pageParam) { + public Result> pageReadyJob(@NotBlank(message = "就绪主题不可为空") String topic, PageParam pageParam) { return Res.ok(delayQueueService.pageReadyJob(topic, pageParam)); } @RequestPath("获取任务详情") @Operation(summary = "获取任务详情") @PostMapping("/getJobDetail") - public Result getJobDetail(String jobId) { + public Result getJobDetail(@NotBlank(message = "任务ID不可为空") String jobId) { return Res.ok(delayQueueService.getJobDetail(jobId)); } @@ -78,21 +82,22 @@ public class DelayQueueController { @RequestPath("获取死信主题任务分页") @Operation(summary = "获取死信主题任务分页") @GetMapping("/pageDeadJob") - public Result> pageDeadJob(String topic, PageParam pageParam) { + public Result> pageDeadJob(@NotBlank(message = "主题不可为空") String topic, PageParam pageParam) { return Res.ok(delayQueueService.pageDeadJob(topic, pageParam)); } @RequestPath("获取死信任务详情") @Operation(summary = "获取死信任务详情") @PostMapping("/getDeadJobDetail") - public Result resetDeadJob(String jobId) { + public Result resetDeadJob(@NotBlank(message = "死信任务Id不可为空") String jobId) { return Res.ok(delayQueueService.getDeadJobDetail(jobId)); } @RequestPath("删除死信任务") @Operation(summary = "删除死信任务") @PostMapping("/removeDeadJob") - public Result removeDeadJob(String jobId) { + @OperateLog(title = "删除死信任务", businessType = OperateLog.BusinessType.DELETE, saveParam = true) + public Result removeDeadJob(@NotBlank(message = "死信任务Id不可为空") String jobId) { delayQueueService.removeDeadJob(jobId); return Res.ok(); } diff --git a/bootx-platform/bootx-platform-starter/starter-file/pom.xml b/bootx-platform/bootx-platform-starter/starter-file/pom.xml index 271e9f0e..218fd75a 100644 --- a/bootx-platform/bootx-platform-starter/starter-file/pom.xml +++ b/bootx-platform/bootx-platform-starter/starter-file/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-starter - 3.0.0.beta4 + 3.0.0.beta5 starter-file diff --git a/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java b/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java index bfb15636..d2e55ad9 100644 --- a/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java +++ b/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java @@ -1,6 +1,9 @@ package cn.bootx.platform.starter.file.controller; import cn.bootx.platform.core.annotation.IgnoreAuth; +import cn.bootx.platform.core.annotation.OperateLog; +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; @@ -12,8 +15,11 @@ import com.fhs.core.trans.anno.TransMethodResult; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -23,16 +29,18 @@ import org.springframework.web.multipart.MultipartFile; * @author xxm * @since 2022/1/12 */ +@Validated @Tag(name = "文件上传") @RestController +@RequestGroup(groupCode = "FIleUpLoad", groupName = "文件上传管理", moduleCode = "starter") @RequestMapping("/file") @RequiredArgsConstructor public class FIleUpLoadController { private final FileUploadService uploadService; - @IgnoreAuth @TransMethodResult + @RequestPath("分页") @Operation(summary = "分页") @GetMapping("/page") public Result> page(PageParam pageParam, UploadFileQuery param) { @@ -40,22 +48,25 @@ public class FIleUpLoadController { } @TransMethodResult + @RequestPath("获取单条详情") @Operation(summary = "获取单条详情") @GetMapping("/findById") - public Result findById(Long id) { + public Result findById(@NotNull(message = "主键不可为空") Long id) { return Res.ok(uploadService.findById(id)); } @IgnoreAuth @Operation(summary = "根据URL获取单条详情") @GetMapping("/findByUrl") - public Result findById(String url) { + public Result findById(@NotBlank(message = "文件URL不可为空") String url) { return Res.ok(uploadService.findById(url)); } @Operation(summary = "删除") + @RequestPath("删除") @PostMapping("/delete") - public Result delete(Long id) { + @OperateLog(title = "删除文件", businessType = OperateLog.BusinessType.DELETE, saveParam = true) + public Result delete(@NotNull(message = "主键不可为空") Long id) { uploadService.delete(id); return Res.ok(); } diff --git a/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FilePlatformController.java b/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FilePlatformController.java index 31e3678b..a9b5865d 100644 --- a/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FilePlatformController.java +++ b/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FilePlatformController.java @@ -1,11 +1,11 @@ package cn.bootx.platform.starter.file.controller; import cn.bootx.platform.core.annotation.IgnoreAuth; +import cn.bootx.platform.core.annotation.OperateLog; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.result.Result; -import cn.bootx.platform.core.util.ValidationUtil; import cn.bootx.platform.starter.file.param.FilePlatformParam; import cn.bootx.platform.starter.file.result.FilePlatformResult; import cn.bootx.platform.starter.file.service.FilePlatformService; @@ -24,7 +24,7 @@ import java.util.List; * @since 2024/8/12 */ @Validated -@RequestGroup(groupCode = "file", groupName = "文件存储管理", moduleCode = "starter", moduleName = "starter模块") +@RequestGroup(groupCode = "FilePlatfor", groupName = "文件存储平台管理", moduleCode = "starter") @Tag(name = "文件存储平台") @RestController @RequestMapping("/file/platform") @@ -39,17 +39,18 @@ public class FilePlatformController { return Res.ok(filePlatformService.findAll()); } + @RequestPath("详情") @Operation(summary = "详情") @GetMapping("/findById") - public Result findById(Long id){ + public Result findById(@NotNull(message = "主键不可为空") Long id){ return Res.ok(filePlatformService.findById(id)); } @RequestPath("更新文件存储平台地址") @Operation(summary = "更新文件存储平台地址") @PostMapping("/updateUrl") - public Result update(@RequestBody FilePlatformParam filePlatform){ - ValidationUtil.validateParam(filePlatform); + @OperateLog(title = "更新文件存储平台地址", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) + public Result update(@RequestBody @Validated FilePlatformParam filePlatform){ filePlatformService.updateUrl(filePlatform); return Res.ok(); } @@ -57,6 +58,7 @@ public class FilePlatformController { @RequestPath("设置默认存储平台地址") @Operation(summary = "设置默认存储平台地址") @PostMapping("/setDefault") + @OperateLog(title = "设置默认存储平台地址", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) public Result setDefault(@NotNull(message = "主键不可为空") Long id){ filePlatformService.setDefault(id); return Res.ok(); diff --git a/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UploadFileManager.java b/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UploadFileManager.java index 964802f3..1dad57c6 100644 --- a/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UploadFileManager.java +++ b/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UploadFileManager.java @@ -1,17 +1,17 @@ package cn.bootx.platform.starter.file.dao; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.starter.file.entity.UploadFileInfo; import cn.bootx.platform.starter.file.param.UploadFileQuery; -import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; -import java.util.Objects; import java.util.Optional; /** @@ -41,15 +41,10 @@ public class UploadFileManager extends BaseManager page(PageParam pageParam, UploadFileQuery param) { + public Page page(PageParam pageParam, UploadFileQuery query) { Page mpPage = MpUtil.getMpPage(pageParam); - return lambdaQuery() - .like(StrUtil.isNotBlank(param.getOriginalFilename()), UploadFileInfo::getOriginalFilename, param.getOriginalFilename()) - .like(StrUtil.isNotBlank(param.getExt()), UploadFileInfo::getExt, param.getExt()) - .like(StrUtil.isNotBlank(param.getContentType()), UploadFileInfo::getContentType, param.getContentType()) - .ge(Objects.nonNull(param.getStartTime()), UploadFileInfo::getCreateTime, param.getStartTime()) - .le(Objects.nonNull(param.getEndTime()), UploadFileInfo::getCreateTime, param.getEndTime()) - .orderByDesc(UploadFileInfo::getId).page(mpPage); + QueryWrapper generator = QueryGenerator.generator(query); + return this.page(mpPage,generator); } } diff --git a/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/param/UploadFileQuery.java b/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/param/UploadFileQuery.java index c1a63ef6..0270092b 100644 --- a/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/param/UploadFileQuery.java +++ b/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/param/UploadFileQuery.java @@ -1,33 +1,33 @@ package cn.bootx.platform.starter.file.param; +import cn.bootx.platform.core.annotation.QueryParam; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; -import java.time.LocalDateTime; - /** * 上传文件查询参数 * @author xxm * @since 2023/11/15 */ +@QueryParam(type = QueryParam.CompareTypeEnum.LIKE) @Data @Accessors(chain = true) @Schema(title = "上传文件查询参数") public class UploadFileQuery { + /** 文件访问地址 */ + @Schema(description = "文件访问地址") + private String url; + + /** 文件名称 */ + @Schema(description = "文件名称") + private String filename; + /** 原始文件名 */ @Schema(description = "原始文件名") private String originalFilename; - /** 开始时间 */ - @Schema(description = "开始时间") - private LocalDateTime startTime; - - /** 结束时间 */ - @Schema(description = "结束时间") - private LocalDateTime endTime; - /** 文件扩展名 */ @Schema(description = "文件扩展名") private String ext; diff --git a/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/result/UploadFileResult.java b/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/result/UploadFileResult.java index b441614b..dfee3a54 100644 --- a/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/result/UploadFileResult.java +++ b/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/result/UploadFileResult.java @@ -156,11 +156,11 @@ public class UploadFileResult extends BaseResult implements TransPojo { * owner.setId("ownerid"); * acl.setOwner(owner); * // 保留Owner的完全控制权限(注:如果不设置该权限,该对象Owner自身将没有访问权限) - * acl.grantPermission(new CanonicalGrantee("ownerid"), Permission.PERMISSION_FULL_CONTROL); + * acl.grantPermission(new CanonicalGrantee("ownerid"), DataPermScope.PERMISSION_FULL_CONTROL); * // 为指定用户设置完全控制权限 - * acl.grantPermission(new CanonicalGrantee("userid"), Permission.PERMISSION_FULL_CONTROL); + * acl.grantPermission(new CanonicalGrantee("userid"), DataPermScope.PERMISSION_FULL_CONTROL); * // 为所有用户设置读权限 - * acl.grantPermission(GroupGrantee.ALL_USERS, Permission.PERMISSION_READ); + * acl.grantPermission(GroupGrantee.ALL_USERS, DataPermScope.PERMISSION_READ); * setFileAcl(acl); *
      */
diff --git a/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java b/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java
index 8d5ffcbe..3a4ac1f0 100644
--- a/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java
+++ b/bootx-platform/bootx-platform-starter/starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java
@@ -95,7 +95,7 @@ public class FileUploadService {
         if (StrUtil.isNotBlank(fileName)){
             uploadPretreatment.setOriginalFilename(fileName);
         }
-        // 按年月日进行分目录, 因为目录拼接的情况, 所以开头不可以为 /
+        // 按年月日进行分目录
         uploadPretreatment.setPath(LocalDateTimeUtil.format(LocalDateTime.now(), "yyyy/MM/dd/"));
 
         FileInfo upload = uploadPretreatment.upload();
@@ -104,6 +104,7 @@ public class FileUploadService {
 
     /**
      * 文件预览
+     * TODO url需要使用URl
      */
     @SneakyThrows
     public void preview(Long id, HttpServletResponse response) {
diff --git a/bootx-platform/bootx-platform-starter/starter-quartz/pom.xml b/bootx-platform/bootx-platform-starter/starter-quartz/pom.xml
index 5153d26f..52d2a995 100644
--- a/bootx-platform/bootx-platform-starter/starter-quartz/pom.xml
+++ b/bootx-platform/bootx-platform-starter/starter-quartz/pom.xml
@@ -6,7 +6,7 @@
     
         cn.bootx.platform
         bootx-platform-starter
-        3.0.0.beta4
+        3.0.0.beta5
     
 
     starter-quartz
diff --git a/bootx-platform/bootx-platform-starter/starter-quartz/src/main/java/cn/bootx/platform/starter/quartz/controller/QuartzJobController.java b/bootx-platform/bootx-platform-starter/starter-quartz/src/main/java/cn/bootx/platform/starter/quartz/controller/QuartzJobController.java
index f5903028..cdc34896 100644
--- a/bootx-platform/bootx-platform-starter/starter-quartz/src/main/java/cn/bootx/platform/starter/quartz/controller/QuartzJobController.java
+++ b/bootx-platform/bootx-platform-starter/starter-quartz/src/main/java/cn/bootx/platform/starter/quartz/controller/QuartzJobController.java
@@ -11,6 +11,7 @@ import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.parameters.RequestBody;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 /**
@@ -19,6 +20,7 @@ import org.springframework.web.bind.annotation.*;
  * @author xxm
  * @since 2021/11/2
  */
+@Validated
 @Tag(name = "定时任务")
 @RestController
 @RequestMapping("/quartz")
@@ -49,7 +51,7 @@ public class QuartzJobController {
 
     @Operation(summary = "单条")
     @GetMapping("/findById")
-    public Result findById(Long id) {
+    public Result findById(@NotNull(message = "主键不可为空") Long id) {
         return Res.ok(quartzJobService.findById(id));
     }
 
@@ -76,7 +78,7 @@ public class QuartzJobController {
 
     @Operation(summary = "删除")
     @PostMapping("/delete")
-    public Result delete(Long id) {
+    public Result delete(@NotNull(message = "主键不可为空") Long id) {
         quartzJobService.delete(id);
         return Res.ok();
     }
diff --git a/bootx-platform/bootx-platform-starter/starter-quartz/src/main/java/cn/bootx/platform/starter/quartz/controller/QuartzJobLogController.java b/bootx-platform/bootx-platform-starter/starter-quartz/src/main/java/cn/bootx/platform/starter/quartz/controller/QuartzJobLogController.java
index d378ee87..3aaca4ca 100644
--- a/bootx-platform/bootx-platform-starter/starter-quartz/src/main/java/cn/bootx/platform/starter/quartz/controller/QuartzJobLogController.java
+++ b/bootx-platform/bootx-platform-starter/starter-quartz/src/main/java/cn/bootx/platform/starter/quartz/controller/QuartzJobLogController.java
@@ -10,6 +10,7 @@ import cn.bootx.platform.starter.quartz.param.QuartzJobLogQuery;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -18,6 +19,7 @@ import org.springframework.web.bind.annotation.RestController;
  * @author xxm
  * @since 2022/5/2
  */
+@Validated
 @Tag(name = "定时任务执行日志")
 @RestController
 @RequestMapping("/quartz/log")
@@ -34,7 +36,7 @@ public class QuartzJobLogController {
 
     @Operation(summary = "单条")
     @GetMapping("/findById")
-    public Result findById(Long id) {
+    public Result findById(@NotNull(message = "主键不可为空") Long id) {
         return Res.ok(quartzJobLogService.findById(id));
     }
 
diff --git a/bootx-platform/bootx-platform-starter/starter-quartz/src/main/java/cn/bootx/platform/starter/quartz/handler/JobLogAspectHandler.java b/bootx-platform/bootx-platform-starter/starter-quartz/src/main/java/cn/bootx/platform/starter/quartz/handler/JobLogAspectHandler.java
index 015410a4..e4265263 100644
--- a/bootx-platform/bootx-platform-starter/starter-quartz/src/main/java/cn/bootx/platform/starter/quartz/handler/JobLogAspectHandler.java
+++ b/bootx-platform/bootx-platform-starter/starter-quartz/src/main/java/cn/bootx/platform/starter/quartz/handler/JobLogAspectHandler.java
@@ -40,7 +40,7 @@ public class JobLogAspectHandler {
     @Around("logPointCut()")
     public Object doAfterReturning(ProceedingJoinPoint pjp) throws Throwable {
 //        Class clazz = pjp.getTarget().getClass();
-//        JobLog jobLog = clazz.getAnnotation(Joblog.class);
+//        JobLog jobLog = clazz.getAnnotation(JobLog.class);
 //        LocalDateTime start = LocalDateTime.now();
 //        try {
             Object result = pjp.proceed();
diff --git a/bootx-platform/pom.xml b/bootx-platform/pom.xml
index 26dd47fd..6eddedf8 100644
--- a/bootx-platform/pom.xml
+++ b/bootx-platform/pom.xml
@@ -7,13 +7,13 @@
     
         org.springframework.boot
         spring-boot-starter-parent
-        3.3.4
+        3.4.3
          
     
 
     cn.bootx.platform
     bootx-platform
-    3.0.0.beta4
+    3.0.0.beta5
     pom
     基础脚手架服务
 
@@ -25,12 +25,12 @@
     
 
     
-        3.0.0.beta4
-        
-        2.5.0
-        5.8.35
-        1.79
-        4.5.0
+        3.0.0.beta5
+        
+        2.7.0
+        5.8.31
+        1.78.1
+        4.6.0
         3.5.9
         1.4.13
         4.3.1
diff --git a/daxpay-single-channel/daxpay-single-alipay/pom.xml b/daxpay-single-channel/daxpay-single-alipay/pom.xml
index 3d633c38..235e67f9 100644
--- a/daxpay-single-channel/daxpay-single-alipay/pom.xml
+++ b/daxpay-single-channel/daxpay-single-alipay/pom.xml
@@ -7,7 +7,7 @@
     
         org.dromara.daxpay
         daxpay-single-channel
-        3.0.0.beta4
+        3.0.0.beta5
     
 
     daxpay-single-alipay
diff --git a/daxpay-single-channel/daxpay-single-union/pom.xml b/daxpay-single-channel/daxpay-single-union/pom.xml
index 12f5a2c5..042ccf42 100644
--- a/daxpay-single-channel/daxpay-single-union/pom.xml
+++ b/daxpay-single-channel/daxpay-single-union/pom.xml
@@ -7,7 +7,7 @@
     
         org.dromara.daxpay
         daxpay-single-channel
-        3.0.0.beta4
+        3.0.0.beta5
     
 
     daxpay-single-union
diff --git a/daxpay-single-channel/daxpay-single-wechat/pom.xml b/daxpay-single-channel/daxpay-single-wechat/pom.xml
index b1f742fa..4604ac85 100644
--- a/daxpay-single-channel/daxpay-single-wechat/pom.xml
+++ b/daxpay-single-channel/daxpay-single-wechat/pom.xml
@@ -7,7 +7,7 @@
     
         org.dromara.daxpay
         daxpay-single-channel
-        3.0.0.beta4
+        3.0.0.beta5
     
 
     daxpay-single-wechat
diff --git a/daxpay-single-channel/pom.xml b/daxpay-single-channel/pom.xml
index c232e50c..ce6e642c 100644
--- a/daxpay-single-channel/pom.xml
+++ b/daxpay-single-channel/pom.xml
@@ -6,14 +6,14 @@
     
         org.springframework.boot
         spring-boot-starter-parent
-        3.3.4
+        3.4.3
          
     
 
 
     org.dromara.daxpay
     daxpay-single-channel
-    3.0.0.beta4
+    3.0.0.beta5
     pom
     单商户支付通道功能实现
 
@@ -35,8 +35,8 @@
         1.4.8
         4.5.0
 
-        3.0.0.beta4
-        3.0.0.beta4
+        3.0.0.beta5
+        3.0.0.beta5
     
 
     
@@ -67,7 +67,7 @@
         
             org.dromara.daxpay
             daxpay-single-service
-            3.0.0.beta4
+            3.0.0.beta5
         
     
 
diff --git a/daxpay-single-sdk/pom.xml b/daxpay-single-sdk/pom.xml
index df5ecd07..443abc54 100644
--- a/daxpay-single-sdk/pom.xml
+++ b/daxpay-single-sdk/pom.xml
@@ -5,7 +5,7 @@
     4.0.0
     org.dromara.daxpay
     daxpay-single-sdk
-    3.0.0.beta4
+    3.0.0.beta5
     jar
 
     
diff --git a/daxpay-single-server/pom.xml b/daxpay-single-server/pom.xml
index 22ff3290..435cc300 100644
--- a/daxpay-single-server/pom.xml
+++ b/daxpay-single-server/pom.xml
@@ -6,14 +6,14 @@
     
         org.springframework.boot
         spring-boot-starter-parent
-        3.3.4
+        3.4.3
          
     
 
     org.dromara.daxpay
     daxpay-single-server
     jar
-    3.0.0.beta4
+    3.0.0.beta5
     daxpay服务端
 
     
@@ -29,8 +29,8 @@
         4.5.0
         8.5.2
 
-        3.0.0.beta4
-        3.0.0.beta4
+        3.0.0.beta5
+        3.0.0.beta5
     
 
     
diff --git a/daxpay-single-server/src/main/java/org/dromara/daxpay/DaxpayServer.java b/daxpay-single-server/src/main/java/org/dromara/daxpay/start/DaxpayServer.java
similarity index 98%
rename from daxpay-single-server/src/main/java/org/dromara/daxpay/DaxpayServer.java
rename to daxpay-single-server/src/main/java/org/dromara/daxpay/start/DaxpayServer.java
index eb216900..7472d5b4 100644
--- a/daxpay-single-server/src/main/java/org/dromara/daxpay/DaxpayServer.java
+++ b/daxpay-single-server/src/main/java/org/dromara/daxpay/start/DaxpayServer.java
@@ -1,4 +1,4 @@
-package org.dromara.daxpay;
+package org.dromara.daxpay.start;
 
 import cn.hutool.core.util.StrUtil;
 import lombok.extern.slf4j.Slf4j;
diff --git a/daxpay-single-server/src/main/java/org/dromara/daxpay/FrontController.java b/daxpay-single-server/src/main/java/org/dromara/daxpay/start/controller/FrontController.java
similarity index 92%
rename from daxpay-single-server/src/main/java/org/dromara/daxpay/FrontController.java
rename to daxpay-single-server/src/main/java/org/dromara/daxpay/start/controller/FrontController.java
index 761f10cd..878f74ab 100644
--- a/daxpay-single-server/src/main/java/org/dromara/daxpay/FrontController.java
+++ b/daxpay-single-server/src/main/java/org/dromara/daxpay/start/controller/FrontController.java
@@ -1,4 +1,4 @@
-package org.dromara.daxpay;
+package org.dromara.daxpay.start.controller;
 
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
diff --git a/daxpay-single-server/src/main/java/org/dromara/daxpay/FrontWebConfig.java b/daxpay-single-server/src/main/java/org/dromara/daxpay/start/controller/FrontWebConfig.java
similarity index 89%
rename from daxpay-single-server/src/main/java/org/dromara/daxpay/FrontWebConfig.java
rename to daxpay-single-server/src/main/java/org/dromara/daxpay/start/controller/FrontWebConfig.java
index c4b341e3..df8725cf 100644
--- a/daxpay-single-server/src/main/java/org/dromara/daxpay/FrontWebConfig.java
+++ b/daxpay-single-server/src/main/java/org/dromara/daxpay/start/controller/FrontWebConfig.java
@@ -1,6 +1,8 @@
-package org.dromara.daxpay;
+package org.dromara.daxpay.start.controller;
 
 import lombok.RequiredArgsConstructor;
+import org.dromara.daxpay.start.handler.FrontH5Interceptor;
+import org.dromara.daxpay.start.handler.FrontWebInterceptor;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
diff --git a/daxpay-single-server/src/main/java/org/dromara/daxpay/FrontH5Interceptor.java b/daxpay-single-server/src/main/java/org/dromara/daxpay/start/handler/FrontH5Interceptor.java
similarity index 95%
rename from daxpay-single-server/src/main/java/org/dromara/daxpay/FrontH5Interceptor.java
rename to daxpay-single-server/src/main/java/org/dromara/daxpay/start/handler/FrontH5Interceptor.java
index 5a535f84..08ea8796 100644
--- a/daxpay-single-server/src/main/java/org/dromara/daxpay/FrontH5Interceptor.java
+++ b/daxpay-single-server/src/main/java/org/dromara/daxpay/start/handler/FrontH5Interceptor.java
@@ -1,4 +1,4 @@
-package org.dromara.daxpay;
+package org.dromara.daxpay.start.handler;
 
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
diff --git a/daxpay-single-server/src/main/java/org/dromara/daxpay/FrontWebInterceptor.java b/daxpay-single-server/src/main/java/org/dromara/daxpay/start/handler/FrontWebInterceptor.java
similarity index 95%
rename from daxpay-single-server/src/main/java/org/dromara/daxpay/FrontWebInterceptor.java
rename to daxpay-single-server/src/main/java/org/dromara/daxpay/start/handler/FrontWebInterceptor.java
index 25bb8e14..d3e00676 100644
--- a/daxpay-single-server/src/main/java/org/dromara/daxpay/FrontWebInterceptor.java
+++ b/daxpay-single-server/src/main/java/org/dromara/daxpay/start/handler/FrontWebInterceptor.java
@@ -1,4 +1,4 @@
-package org.dromara.daxpay;
+package org.dromara.daxpay.start.handler;
 
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
diff --git a/daxpay-single-server/src/main/java/org/dromara/daxpay/start/service/ClientCodeServiceImpl.java b/daxpay-single-server/src/main/java/org/dromara/daxpay/start/service/ClientCodeServiceImpl.java
new file mode 100644
index 00000000..2280a058
--- /dev/null
+++ b/daxpay-single-server/src/main/java/org/dromara/daxpay/start/service/ClientCodeServiceImpl.java
@@ -0,0 +1,18 @@
+package org.dromara.daxpay.start.service;
+
+import cn.bootx.platform.iam.service.client.ClientCodeService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * 终端获取类
+ * @author xxm
+ * @since 2025/1/31
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class ClientCodeServiceImpl implements ClientCodeService {
+
+}
diff --git a/daxpay-single/daxpay-single-core/pom.xml b/daxpay-single/daxpay-single-core/pom.xml
index 5dfb9ea3..0449056e 100644
--- a/daxpay-single/daxpay-single-core/pom.xml
+++ b/daxpay-single/daxpay-single-core/pom.xml
@@ -6,7 +6,7 @@
     
         org.dromara.daxpay
         daxpay-single
-        3.0.0.beta4
+        3.0.0.beta5
     
 
     daxpay-single-core
diff --git a/daxpay-single/daxpay-single-service/pom.xml b/daxpay-single/daxpay-single-service/pom.xml
index a83f4a72..064280c7 100644
--- a/daxpay-single/daxpay-single-service/pom.xml
+++ b/daxpay-single/daxpay-single-service/pom.xml
@@ -6,7 +6,7 @@
     
         org.dromara.daxpay
         daxpay-single
-        3.0.0.beta4
+        3.0.0.beta5
     
 
     daxpay-single-service
diff --git a/daxpay-single/daxpay-single-unisdk/pom.xml b/daxpay-single/daxpay-single-unisdk/pom.xml
index f415e27f..750f1aed 100644
--- a/daxpay-single/daxpay-single-unisdk/pom.xml
+++ b/daxpay-single/daxpay-single-unisdk/pom.xml
@@ -6,7 +6,7 @@
     
         org.dromara.daxpay
         daxpay-single
-        3.0.0.beta4
+        3.0.0.beta5
     
 
     daxpay-single-unisdk
diff --git a/daxpay-single/pom.xml b/daxpay-single/pom.xml
index 5a436ce3..956d8a43 100644
--- a/daxpay-single/pom.xml
+++ b/daxpay-single/pom.xml
@@ -7,13 +7,13 @@
     
         org.springframework.boot
         spring-boot-starter-parent
-        3.3.4
+        3.4.3
          
     
 
     org.dromara.daxpay
     daxpay-single
-    3.0.0.beta4
+    3.0.0.beta5
     pom
     单商户支付核心功能实现
 
@@ -33,8 +33,8 @@
         0.2.0
         8.5.2
 
-        3.0.0.beta4
-        3.0.0.beta4
+        3.0.0.beta5
+        3.0.0.beta5
     
 
     
diff --git a/docker-compose.yml b/docker-compose.yml
index cb8eb4fd..af443f00 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,7 +1,7 @@
 version: '3'
 services:
   daxpay-single:
-    image: daxpay/daxpay-single:3.0.0.beta4
+    image: daxpay/daxpay-single:3.0.0.beta5
     restart: always
     # window上不支持host网络模式, 需要更改为 bridge 网络模式, 然后走端口映射
     network_mode: host
diff --git a/pom.xml b/pom.xml
index 037782d1..c2646c00 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
 
     org.dromara.daxpay
     daxpay
-    3.0.0.beta4
+    3.0.0.beta5
     pom
 
     dax-pay-single