Pārlūkot izejas kodu

!182 发布 2.2.0
Merge pull request !182 from 疯狂的狮子Li/dev

疯狂的狮子Li 2 gadi atpakaļ
vecāks
revīzija
71b6b04d62
60 mainītis faili ar 457 papildinājumiem un 170 dzēšanām
  1. 2 2
      config/nacos/application-common.yml
  2. 2 0
      config/nacos/ruoyi-gateway.yml
  3. 1 1
      docker/rabbitmq/Dockerfile
  4. BIN
      docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-1.7.1.jar
  5. BIN
      docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-2.1.0.jar
  6. 1 1
      pom.xml
  7. 1 1
      ruoyi-api/ruoyi-api-bom/pom.xml
  8. 8 0
      ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileServiceMock.java
  9. 5 0
      ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageService.java
  10. 7 0
      ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageServiceStub.java
  11. 8 2
      ruoyi-auth/Dockerfile
  12. 2 3
      ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SocialAuthStrategy.java
  13. 1 1
      ruoyi-common/ruoyi-common-alibaba-bom/pom.xml
  14. 22 2
      ruoyi-common/ruoyi-common-bom/pom.xml
  15. 6 1
      ruoyi-common/ruoyi-common-bus/pom.xml
  16. 28 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java
  17. 7 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ValidatorUtils.java
  18. 1 1
      ruoyi-common/ruoyi-common-dubbo/pom.xml
  19. 59 2
      ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java
  20. 0 37
      ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/MailConfig.java
  21. 1 1
      ruoyi-common/ruoyi-common-nacos/pom.xml
  22. 6 0
      ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/RedisUtils.java
  23. 1 1
      ruoyi-common/ruoyi-common-satoken/pom.xml
  24. 5 1
      ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java
  25. 1 4
      ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java
  26. 9 3
      ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java
  27. 4 2
      ruoyi-gateway/Dockerfile
  28. 4 2
      ruoyi-modules/ruoyi-gen/Dockerfile
  29. 22 2
      ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/service.java.vm
  30. 23 3
      ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm
  31. 9 1
      ruoyi-modules/ruoyi-gen/src/main/resources/vm/ts/types.ts.vm
  32. 4 2
      ruoyi-modules/ruoyi-job/Dockerfile
  33. 4 2
      ruoyi-modules/ruoyi-resource/Dockerfile
  34. 1 0
      ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java
  35. 1 0
      ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteMailServiceImpl.java
  36. 4 2
      ruoyi-modules/ruoyi-system/Dockerfile
  37. 0 4
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java
  38. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java
  39. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDeptServiceImpl.java
  40. 6 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDictServiceImpl.java
  41. 10 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteLogServiceImpl.java
  42. 16 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteSocialServiceImpl.java
  43. 53 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java
  44. 0 7
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java
  45. 23 8
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysSocialService.java
  46. 0 14
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java
  47. 1 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java
  48. 28 12
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java
  49. 3 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
  50. 1 1
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml
  51. 8 2
      ruoyi-modules/ruoyi-workflow/Dockerfile
  52. 2 1
      ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java
  53. 11 11
      ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java
  54. 2 14
      ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java
  55. 2 1
      ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskBackNodeServiceImpl.java
  56. 4 2
      ruoyi-visual/ruoyi-monitor/Dockerfile
  57. 4 2
      ruoyi-visual/ruoyi-nacos/Dockerfile
  58. 4 2
      ruoyi-visual/ruoyi-seata-server/Dockerfile
  59. 4 2
      ruoyi-visual/ruoyi-sentinel-dashboard/Dockerfile
  60. 4 2
      ruoyi-visual/ruoyi-snailjob-server/Dockerfile

+ 2 - 2
config/nacos/application-common.yml

@@ -100,8 +100,8 @@ spring:
     redis:
       host: localhost
       port: 6379
-      # 密码(如没有密码请注释掉)
-      # password:
+      # redis 密码必须配置
+      password: ruoyi123
       database: 0
       timeout: 10s
       ssl.enabled: false

+ 2 - 0
config/nacos/ruoyi-gateway.yml

@@ -92,6 +92,8 @@ spring:
             server-addr: ${spring.cloud.nacos.server-addr}
             dataId: sentinel-${spring.application.name}.json
             groupId: ${spring.cloud.nacos.config.group}
+            username: ${spring.cloud.nacos.username}
+            password: ${spring.cloud.nacos.password}
             namespace: ${spring.profiles.active}
             data-type: json
             rule-type: gw-flow

+ 1 - 1
docker/rabbitmq/Dockerfile

@@ -1,6 +1,6 @@
 FROM rabbitmq:3.13.3-management
 
-MAINTAINER Lion Li
+LABEL maintainer="Lion Li"
 
 ADD ./rabbitmq_delayed_message_exchange-3.13.0.ez /plugins
 

BIN
docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-1.7.1.jar


BIN
docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-2.1.0.jar


+ 1 - 1
pom.xml

@@ -13,7 +13,7 @@
     <description>RuoYi-Cloud-Plus微服务系统</description>
 
     <properties>
-        <revision>2.2.0-BETA2</revision>
+        <revision>2.2.0</revision>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <java.version>17</java.version>

+ 1 - 1
ruoyi-api/ruoyi-api-bom/pom.xml

@@ -15,7 +15,7 @@
     </description>
 
     <properties>
-        <revision>2.2.0-BETA2</revision>
+        <revision>2.2.0</revision>
     </properties>
 
     <dependencyManagement>

+ 8 - 0
ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileServiceMock.java

@@ -20,6 +20,7 @@ public class RemoteFileServiceMock implements RemoteFileService {
      * @param file 文件信息
      * @return 结果
      */
+    @Override
     public RemoteFile upload(String name, String originalFilename, String contentType, byte[] file) {
         log.warn("服务调用异常 -> 降级处理");
         return null;
@@ -31,11 +32,18 @@ public class RemoteFileServiceMock implements RemoteFileService {
      * @param ossIds ossId串逗号分隔
      * @return url串逗号分隔
      */
+    @Override
     public String selectUrlByIds(String ossIds) {
         log.warn("服务调用异常 -> 降级处理");
         return StringUtils.EMPTY;
     }
 
+    /**
+     * 通过ossId查询列表
+     *
+     * @param ossIds ossId串逗号分隔
+     * @return 列表
+     */
     @Override
     public List<RemoteFile> selectByIds(String ossIds) {
         log.warn("服务调用异常 -> 降级处理");

+ 5 - 0
ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageService.java

@@ -15,5 +15,10 @@ public interface RemoteMessageService {
      */
     void publishMessage(Long sessionKey, String message);
 
+    /**
+     * 发布订阅的消息(群发)
+     *
+     * @param message 消息内容
+     */
     void publishAll(String message);
 }

+ 7 - 0
ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageServiceStub.java

@@ -20,6 +20,7 @@ public class RemoteMessageServiceStub implements RemoteMessageService {
      * @param sessionKey session主键 一般为用户id
      * @param message    消息文本
      */
+    @Override
     public void publishMessage(Long sessionKey, String message) {
         try {
             remoteMessageService.publishMessage(sessionKey, message);
@@ -28,6 +29,12 @@ public class RemoteMessageServiceStub implements RemoteMessageService {
         }
     }
 
+    /**
+     * 发布订阅的消息(群发)
+     *
+     * @param message 消息内容
+     */
+    @Override
     public void publishAll(String message) {
         try {
             remoteMessageService.publishAll(message);

+ 8 - 2
ruoyi-auth/Dockerfile

@@ -1,7 +1,9 @@
+# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
+FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
+#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
 #FROM findepi/graalvm:java17-native
-FROM openjdk:17.0.2-oraclelinux8
 
-MAINTAINER Lion Li
+LABEL maintainer="Lion Li"
 
 RUN mkdir -p /ruoyi/auth/logs  \
     /ruoyi/auth/temp  \
@@ -9,6 +11,10 @@ RUN mkdir -p /ruoyi/auth/logs  \
 
 WORKDIR /ruoyi/auth
 
+# 补全alpine镜像缺失字体问题
+RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
+RUN apk add fontconfig && apk add --update ttf-dejavu && fc-cache --force
+
 ENV SERVER_PORT=9210 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
 
 EXPOSE ${SERVER_PORT}

+ 2 - 3
ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SocialAuthStrategy.java

@@ -14,8 +14,8 @@ import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.auth.domain.vo.LoginVo;
 import org.dromara.auth.form.SocialLoginBody;
 import org.dromara.auth.service.IAuthStrategy;
-import org.dromara.auth.service.SysLoginService;
 import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.StreamUtils;
 import org.dromara.common.core.utils.ValidatorUtils;
 import org.dromara.common.json.utils.JsonUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
@@ -43,7 +43,6 @@ import java.util.Optional;
 public class SocialAuthStrategy implements IAuthStrategy {
 
     private final SocialProperties socialProperties;
-    private final SysLoginService loginService;
 
     @DubboReference
     private RemoteSocialService remoteSocialService;
@@ -83,7 +82,7 @@ public class SocialAuthStrategy implements IAuthStrategy {
         }
         RemoteSocialVo socialVo;
         if (TenantHelper.isEnable()) {
-            Optional<RemoteSocialVo> opt = list.stream().filter(x -> x.getTenantId().equals(loginBody.getTenantId())).findAny();
+            Optional<RemoteSocialVo> opt = StreamUtils.findAny(list, x -> x.getTenantId().equals(loginBody.getTenantId()));
             if (opt.isEmpty()) {
                 throw new ServiceException("对不起,你没有权限登录当前租户!");
             }

+ 1 - 1
ruoyi-common/ruoyi-common-alibaba-bom/pom.xml

@@ -14,7 +14,7 @@
     </description>
 
     <properties>
-        <revision>2.2.0-BETA2</revision>
+        <revision>2.2.0</revision>
         <spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version>
         <sentinel.version>1.8.8</sentinel.version>
         <seata.version>1.7.1</seata.version>

+ 22 - 2
ruoyi-common/ruoyi-common-bom/pom.xml

@@ -14,7 +14,7 @@
     </description>
 
     <properties>
-        <revision>2.2.0-BETA2</revision>
+        <revision>2.2.0</revision>
     </properties>
 
     <dependencyManagement>
@@ -40,6 +40,7 @@
                 <version>${revision}</version>
             </dependency>
 
+            <!-- 权限认证服务 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-satoken</artifactId>
@@ -88,91 +89,105 @@
                 <version>${revision}</version>
             </dependency>
 
+            <!-- 定时任务 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-job</artifactId>
                 <version>${revision}</version>
             </dependency>
 
+            <!-- RPC服务 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-dubbo</artifactId>
                 <version>${revision}</version>
             </dependency>
 
+            <!-- 分布式事务 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-seata</artifactId>
                 <version>${revision}</version>
             </dependency>
 
+            <!-- 自定义负载均衡 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-loadbalancer</artifactId>
                 <version>${revision}</version>
             </dependency>
 
+            <!-- oss服务 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-oss</artifactId>
                 <version>${revision}</version>
             </dependency>
 
-            <!-- 限流 -->
+            <!-- 限流功能 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-ratelimiter</artifactId>
                 <version>${revision}</version>
             </dependency>
 
+            <!-- 幂等功能 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-idempotent</artifactId>
                 <version>${revision}</version>
             </dependency>
 
+            <!-- 邮件模块 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-mail</artifactId>
                 <version>${revision}</version>
             </dependency>
 
+            <!-- 短信模块 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-sms</artifactId>
                 <version>${revision}</version>
             </dependency>
 
+            <!-- logstash日志推送模块 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-logstash</artifactId>
                 <version>${revision}</version>
             </dependency>
 
+            <!-- ES搜索引擎服务 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-elasticsearch</artifactId>
                 <version>${revision}</version>
             </dependency>
 
+            <!-- 限流模块 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-sentinel</artifactId>
                 <version>${revision}</version>
             </dependency>
 
+            <!-- skywalking日志收集模块 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-skylog</artifactId>
                 <version>${revision}</version>
             </dependency>
 
+            <!-- prometheus监控 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-prometheus</artifactId>
                 <version>${revision}</version>
             </dependency>
 
+            <!-- 通用翻译功能 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-translation</artifactId>
@@ -193,6 +208,7 @@
                 <version>${revision}</version>
             </dependency>
 
+            <!-- 数据加解密模块 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-encrypt</artifactId>
@@ -206,24 +222,28 @@
                 <version>${revision}</version>
             </dependency>
 
+            <!-- websocket模块 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-websocket</artifactId>
                 <version>${revision}</version>
             </dependency>
 
+            <!-- 授权认证 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-social</artifactId>
                 <version>${revision}</version>
             </dependency>
 
+            <!-- 配置中心 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-nacos</artifactId>
                 <version>${revision}</version>
             </dependency>
 
+            <!-- 消息总线模块 -->
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-common-bus</artifactId>

+ 6 - 1
ruoyi-common/ruoyi-common-bus/pom.xml

@@ -12,7 +12,7 @@
     <artifactId>ruoyi-common-bus</artifactId>
 
     <description>
-        ruoyi-common-bus 模块
+        ruoyi-common-bus 消息总线模块
     </description>
 
     <dependencies>
@@ -25,6 +25,11 @@
 <!--        <dependency>-->
 <!--            <groupId>org.springframework.cloud</groupId>-->
 <!--            <artifactId>spring-cloud-starter-bus-kafka</artifactId>-->
+<!--        </dependency>-->
+        <!-- rocketmq -->
+<!--        <dependency>-->
+<!--            <groupId>com.alibaba.cloud</groupId>-->
+<!--            <artifactId>spring-cloud-starter-bus-rocketmq</artifactId>-->
 <!--        </dependency>-->
     </dependencies>
 </project>

+ 28 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java

@@ -34,6 +34,34 @@ public class StreamUtils {
         return collection.stream().filter(function).collect(Collectors.toList());
     }
 
+    /**
+     * 找到流中满足条件的第一个元素
+     *
+     * @param collection 需要查询的集合
+     * @param function   过滤方法
+     * @return 找到符合条件的第一个元素,没有则返回null
+     */
+    public static <E> E findFirst(Collection<E> collection, Predicate<E> function) {
+        if (CollUtil.isEmpty(collection)) {
+            return null;
+        }
+        return collection.stream().filter(function).findFirst().orElse(null);
+    }
+
+    /**
+     * 找到流中任意一个满足条件的元素
+     *
+     * @param collection 需要查询的集合
+     * @param function   过滤方法
+     * @return 找到符合条件的任意一个元素,没有则返回null
+     */
+    public static <E> Optional<E> findAny(Collection<E> collection, Predicate<E> function) {
+        if (CollUtil.isEmpty(collection)) {
+            return Optional.empty();
+        }
+        return collection.stream().filter(function).findAny();
+    }
+
     /**
      * 将collection拼接
      *

+ 7 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ValidatorUtils.java

@@ -18,6 +18,13 @@ public class ValidatorUtils {
 
     private static final Validator VALID = SpringUtils.getBean(Validator.class);
 
+    /**
+     * 对给定对象进行参数校验,并根据指定的校验组进行校验
+     *
+     * @param object 要进行校验的对象
+     * @param groups 校验组
+     * @throws ConstraintViolationException 如果校验不通过,则抛出参数校验异常
+     */
     public static <T> void validate(T object, Class<?>... groups) {
         Set<ConstraintViolation<T>> validate = VALID.validate(object, groups);
         if (!validate.isEmpty()) {

+ 1 - 1
ruoyi-common/ruoyi-common-dubbo/pom.xml

@@ -12,7 +12,7 @@
     <artifactId>ruoyi-common-dubbo</artifactId>
 
     <description>
-        ruoyi-common-dubbo
+        ruoyi-common-dubbo RPC服务
     </description>
 
     <dependencies>

+ 59 - 2
ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java

@@ -7,10 +7,10 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.exc.MismatchedInputException;
-import org.dromara.common.core.utils.SpringUtils;
-import org.dromara.common.core.utils.StringUtils;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.dromara.common.core.utils.SpringUtils;
+import org.dromara.common.core.utils.StringUtils;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -30,6 +30,13 @@ public class JsonUtils {
         return OBJECT_MAPPER;
     }
 
+    /**
+     * 将对象转换为JSON格式的字符串
+     *
+     * @param object 要转换的对象
+     * @return JSON格式的字符串,如果对象为null,则返回null
+     * @throws RuntimeException 如果转换过程中发生JSON处理异常,则抛出运行时异常
+     */
     public static String toJsonString(Object object) {
         if (ObjectUtil.isNull(object)) {
             return null;
@@ -41,6 +48,15 @@ public class JsonUtils {
         }
     }
 
+    /**
+     * 将JSON格式的字符串转换为指定类型的对象
+     *
+     * @param text  JSON格式的字符串
+     * @param clazz 要转换的目标对象类型
+     * @param <T>   目标对象的泛型类型
+     * @return 转换后的对象,如果字符串为空则返回null
+     * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常
+     */
     public static <T> T parseObject(String text, Class<T> clazz) {
         if (StringUtils.isEmpty(text)) {
             return null;
@@ -52,6 +68,15 @@ public class JsonUtils {
         }
     }
 
+    /**
+     * 将字节数组转换为指定类型的对象
+     *
+     * @param bytes 字节数组
+     * @param clazz 要转换的目标对象类型
+     * @param <T>   目标对象的泛型类型
+     * @return 转换后的对象,如果字节数组为空则返回null
+     * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常
+     */
     public static <T> T parseObject(byte[] bytes, Class<T> clazz) {
         if (ArrayUtil.isEmpty(bytes)) {
             return null;
@@ -63,6 +88,15 @@ public class JsonUtils {
         }
     }
 
+    /**
+     * 将JSON格式的字符串转换为指定类型的对象,支持复杂类型
+     *
+     * @param text          JSON格式的字符串
+     * @param typeReference 指定类型的TypeReference对象
+     * @param <T>           目标对象的泛型类型
+     * @return 转换后的对象,如果字符串为空则返回null
+     * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常
+     */
     public static <T> T parseObject(String text, TypeReference<T> typeReference) {
         if (StringUtils.isBlank(text)) {
             return null;
@@ -74,6 +108,13 @@ public class JsonUtils {
         }
     }
 
+    /**
+     * 将JSON格式的字符串转换为Dict对象
+     *
+     * @param text JSON格式的字符串
+     * @return 转换后的Dict对象,如果字符串为空或者不是JSON格式则返回null
+     * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常
+     */
     public static Dict parseMap(String text) {
         if (StringUtils.isBlank(text)) {
             return null;
@@ -88,6 +129,13 @@ public class JsonUtils {
         }
     }
 
+    /**
+     * 将JSON格式的字符串转换为Dict对象的列表
+     *
+     * @param text JSON格式的字符串
+     * @return 转换后的Dict对象的列表,如果字符串为空则返回null
+     * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常
+     */
     public static List<Dict> parseArrayMap(String text) {
         if (StringUtils.isBlank(text)) {
             return null;
@@ -99,6 +147,15 @@ public class JsonUtils {
         }
     }
 
+    /**
+     * 将JSON格式的字符串转换为指定类型对象的列表
+     *
+     * @param text  JSON格式的字符串
+     * @param clazz 要转换的目标对象类型
+     * @param <T>   目标对象的泛型类型
+     * @return 转换后的对象的列表,如果字符串为空则返回空列表
+     * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常
+     */
     public static <T> List<T> parseArray(String text, Class<T> clazz) {
         if (StringUtils.isEmpty(text)) {
             return new ArrayList<>();

+ 0 - 37
ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/MailConfig.java

@@ -1,37 +0,0 @@
-package org.dromara.common.mail.config;
-
-import org.dromara.common.mail.config.properties.MailProperties;
-import org.dromara.common.mail.utils.MailAccount;
-import org.springframework.boot.autoconfigure.AutoConfiguration;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-
-/**
- * JavaMail 配置
- *
- * @author Michelle.Chung
- */
-@AutoConfiguration
-@EnableConfigurationProperties(MailProperties.class)
-public class MailConfig {
-
-    @Bean
-    @ConditionalOnProperty(value = "mail.enabled", havingValue = "true")
-    public MailAccount mailAccount(MailProperties mailProperties) {
-        MailAccount account = new MailAccount();
-        account.setHost(mailProperties.getHost());
-        account.setPort(mailProperties.getPort());
-        account.setAuth(mailProperties.getAuth());
-        account.setFrom(mailProperties.getFrom());
-        account.setUser(mailProperties.getUser());
-        account.setPass(mailProperties.getPass());
-        account.setSocketFactoryPort(mailProperties.getPort());
-        account.setStarttlsEnable(mailProperties.getStarttlsEnable());
-        account.setSslEnable(mailProperties.getSslEnable());
-        account.setTimeout(mailProperties.getTimeout());
-        account.setConnectionTimeout(mailProperties.getConnectionTimeout());
-        return account;
-    }
-
-}

+ 1 - 1
ruoyi-common/ruoyi-common-nacos/pom.xml

@@ -11,7 +11,7 @@
     <artifactId>ruoyi-common-nacos</artifactId>
 
     <description>
-        ruoyi-common-nacos
+        ruoyi-common-nacos 配置中心
     </description>
 
     <dependencies>

+ 6 - 0
ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/RedisUtils.java

@@ -65,6 +65,12 @@ public class RedisUtils {
         consumer.accept(msg);
     }
 
+    /**
+     * 发布消息到指定的频道
+     *
+     * @param channelKey 通道key
+     * @param msg        发送数据
+     */
     public static <T> void publish(String channelKey, T msg) {
         RTopic topic = CLIENT.getTopic(channelKey);
         topic.publish(msg);

+ 1 - 1
ruoyi-common/ruoyi-common-satoken/pom.xml

@@ -12,7 +12,7 @@
     <artifactId>ruoyi-common-satoken</artifactId>
 
     <description>
-        ruoyi-common-satoken
+        ruoyi-common-satoken 权限认证服务
     </description>
 
     <dependencies>

+ 5 - 1
ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java

@@ -193,7 +193,11 @@ public class LoginHelper {
      * @return 结果
      */
     public static boolean isLogin() {
-        return getLoginUser() != null;
+        try {
+            return getLoginUser() != null;
+        } catch (Exception e) {
+            return false;
+        }
     }
 
 }

+ 1 - 4
ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java

@@ -16,15 +16,12 @@ import org.springframework.core.task.VirtualThreadTaskExecutor;
 @AutoConfiguration
 public class UndertowConfig implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> {
 
-    /**
-     * 设置 Undertow 的 websocket 缓冲池
-     */
     @Override
     public void customize(UndertowServletWebServerFactory factory) {
         // 默认不直接分配内存 如果项目中使用了 websocket 建议直接分配
         factory.addDeploymentInfoCustomizers(deploymentInfo -> {
             WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo();
-            webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(false, 512));
+            webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(true, 1024));
             deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo);
             // 使用虚拟线程
             if (SpringUtils.isVirtual()) {

+ 9 - 3
ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java

@@ -1,5 +1,6 @@
 package org.dromara.common.websocket.interceptor;
 
+import cn.dev33.satoken.exception.NotLoginException;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.system.api.model.LoginUser;
@@ -31,9 +32,14 @@ public class PlusWebSocketInterceptor implements HandshakeInterceptor {
      */
     @Override
     public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) {
-        LoginUser loginUser = LoginHelper.getLoginUser();
-        attributes.put(LOGIN_USER_KEY, loginUser);
-        return true;
+        try {
+            LoginUser loginUser = LoginHelper.getLoginUser();
+            attributes.put(LOGIN_USER_KEY, loginUser);
+            return true;
+        } catch (NotLoginException e) {
+            log.error("WebSocket 认证失败'{}',无法访问系统资源", e.getMessage());
+            return false;
+        }
     }
 
     /**

+ 4 - 2
ruoyi-gateway/Dockerfile

@@ -1,7 +1,9 @@
+# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
+FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
+#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
 #FROM findepi/graalvm:java17-native
-FROM openjdk:17.0.2-oraclelinux8
 
-MAINTAINER Lion Li
+LABEL maintainer="Lion Li"
 
 RUN mkdir -p /ruoyi/gateway/logs  \
     /ruoyi/gateway/temp  \

+ 4 - 2
ruoyi-modules/ruoyi-gen/Dockerfile

@@ -1,7 +1,9 @@
+# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
+FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
+#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
 #FROM findepi/graalvm:java17-native
-FROM openjdk:17.0.2-oraclelinux8
 
-MAINTAINER Lion Li
+LABEL maintainer="Lion Li"
 
 RUN mkdir -p /ruoyi/gen/logs
 

+ 22 - 2
ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/service.java.vm

@@ -21,33 +21,53 @@ public interface I${ClassName}Service {
 
     /**
      * 查询${functionName}
+     *
+     * @param ${pkColumn.javaField} 主键
+     * @return ${functionName}
      */
     ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField});
 
 #if($table.crud)
     /**
-     * 查询${functionName}列表
+     * 分页查询${functionName}列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return ${functionName}分页列表
      */
     TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery);
 #end
 
     /**
-     * 查询${functionName}列表
+     * 查询符合条件的${functionName}列表
+     *
+     * @param bo 查询条件
+     * @return ${functionName}列表
      */
     List<${ClassName}Vo> queryList(${ClassName}Bo bo);
 
     /**
      * 新增${functionName}
+     *
+     * @param bo ${functionName}
+     * @return 是否新增成功
      */
     Boolean insertByBo(${ClassName}Bo bo);
 
     /**
      * 修改${functionName}
+     *
+     * @param bo ${functionName}
+     * @return 是否修改成功
      */
     Boolean updateByBo(${ClassName}Bo bo);
 
     /**
      * 校验并批量删除${functionName}信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid);
 }

+ 23 - 3
ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm

@@ -35,6 +35,9 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
 
     /**
      * 查询${functionName}
+     *
+     * @param ${pkColumn.javaField} 主键
+     * @return ${functionName}
      */
     @Override
     public ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField}){
@@ -43,7 +46,11 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
 
 #if($table.crud)
     /**
-     * 查询${functionName}列表
+     * 分页查询${functionName}列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return ${functionName}分页列表
      */
     @Override
     public TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery) {
@@ -54,7 +61,10 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
 #end
 
     /**
-     * 查询${functionName}列表
+     * 查询符合条件的${functionName}列表
+     *
+     * @param bo 查询条件
+     * @return ${functionName}列表
      */
     @Override
     public List<${ClassName}Vo> queryList(${ClassName}Bo bo) {
@@ -91,6 +101,9 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
 
     /**
      * 新增${functionName}
+     *
+     * @param bo ${functionName}
+     * @return 是否新增成功
      */
     @Override
     public Boolean insertByBo(${ClassName}Bo bo) {
@@ -106,6 +119,9 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
 
     /**
      * 修改${functionName}
+     *
+     * @param bo ${functionName}
+     * @return 是否修改成功
      */
     @Override
     public Boolean updateByBo(${ClassName}Bo bo) {
@@ -122,7 +138,11 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
     }
 
     /**
-     * 批量删除${functionName}
+     * 校验并批量删除${functionName}信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
      */
     @Override
     public Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid) {

+ 9 - 1
ruoyi-modules/ruoyi-gen/src/main/resources/vm/ts/types.ts.vm

@@ -1,6 +1,6 @@
 export interface ${BusinessName}VO {
 #foreach ($column in $columns)
-#if($column.insert || $column.edit)
+#if($column.list)
   /**
    * $column.columnComment
    */
@@ -35,6 +35,7 @@ export interface ${BusinessName}Form extends BaseEntity {
 }
 
 export interface ${BusinessName}Query #if(!${treeCode})extends PageQuery #end{
+
 #foreach ($column in $columns)
 #if($column.query)
   /**
@@ -47,4 +48,11 @@ export interface ${BusinessName}Query #if(!${treeCode})extends PageQuery #end{
                     #end
 #end
 #end
+    /**
+     * 日期范围参数
+     */
+    params?: any;
 }
+
+
+

+ 4 - 2
ruoyi-modules/ruoyi-job/Dockerfile

@@ -1,7 +1,9 @@
+# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
+FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
+#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
 #FROM findepi/graalvm:java17-native
-FROM openjdk:17.0.2-oraclelinux8
 
-MAINTAINER Lion Li
+LABEL maintainer="Lion Li"
 
 RUN mkdir -p /ruoyi/job/logs \
     /ruoyi/job/temp \

+ 4 - 2
ruoyi-modules/ruoyi-resource/Dockerfile

@@ -1,7 +1,9 @@
+# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
+FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
+#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
 #FROM findepi/graalvm:java17-native
-FROM openjdk:17.0.2-oraclelinux8
 
-MAINTAINER Lion Li
+LABEL maintainer="Lion Li"
 
 RUN mkdir -p /ruoyi/resource/logs \
     /ruoyi/resource/temp \

+ 1 - 0
ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java

@@ -81,6 +81,7 @@ public class RemoteFileServiceImpl implements RemoteFileService {
      * @param ossIds ossId串逗号分隔
      * @return 列表
      */
+    @Override
     public List<RemoteFile> selectByIds(String ossIds){
         List<SysOssVo> sysOssVos = sysOssService.listByIds(StringUtils.splitTo(ossIds, Convert::toLong));
         return MapstructUtils.convert(sysOssVos, RemoteFile.class);

+ 1 - 0
ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteMailServiceImpl.java

@@ -26,6 +26,7 @@ public class RemoteMailServiceImpl implements RemoteMailService {
      * @param subject 标题
      * @param text    内容
      */
+    @Override
     public void send(String to, String subject, String text) throws ServiceException {
         MailUtils.sendText(to, subject, text);
     }

+ 4 - 2
ruoyi-modules/ruoyi-system/Dockerfile

@@ -1,7 +1,9 @@
+# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
+FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
+#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
 #FROM findepi/graalvm:java17-native
-FROM openjdk:17.0.2-oraclelinux8
 
-MAINTAINER Lion Li
+LABEL maintainer="Lion Li"
 
 RUN mkdir -p /ruoyi/system/logs \
     /ruoyi/system/temp \

+ 0 - 4
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java

@@ -75,8 +75,6 @@ public class SysDeptController extends BaseController {
     public R<Void> add(@Validated @RequestBody SysDeptBo dept) {
         if (!deptService.checkDeptNameUnique(dept)) {
             return R.fail("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
-        } else if (StringUtils.isNotBlank(dept.getDeptCategory()) && !deptService.checkDeptCategoryUnique(dept)) {
-            return R.fail("新增部门'" + dept.getDeptName() + "'失败,部门类别编码已存在");
         }
         return toAjax(deptService.insertDept(dept));
     }
@@ -92,8 +90,6 @@ public class SysDeptController extends BaseController {
         deptService.checkDeptDataScope(deptId);
         if (!deptService.checkDeptNameUnique(dept)) {
             return R.fail("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在");
-        } else if (StringUtils.isNotBlank(dept.getDeptCategory()) && !deptService.checkDeptCategoryUnique(dept)) {
-            return R.fail("修改部门'" + dept.getDeptName() + "'失败,部门类别编码已存在");
         } else if (dept.getParentId().equals(deptId)) {
             return R.fail("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己");
         } else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus())) {

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java

@@ -103,6 +103,11 @@ public class SysUserBo extends BaseEntity {
      */
     private Long roleId;
 
+    /**
+     * 排除不查询的用户(工作流用)
+     */
+    private String excludeUserIds;
+
     public SysUserBo(Long userId) {
         this.userId = userId;
     }

+ 6 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDeptServiceImpl.java

@@ -18,6 +18,12 @@ public class RemoteDeptServiceImpl implements RemoteDeptService {
 
     private final ISysDeptService sysDeptService;
 
+    /**
+     * 通过部门ID查询部门名称
+     *
+     * @param deptIds 部门ID串逗号分隔
+     * @return 部门名称串逗号分隔
+     */
     @Override
     public String selectDeptNameByIds(String deptIds) {
         return sysDeptService.selectDeptNameByIds(deptIds);

+ 6 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDictServiceImpl.java

@@ -23,7 +23,12 @@ public class RemoteDictServiceImpl implements RemoteDictService {
 
     private final ISysDictTypeService sysDictTypeService;
 
-
+    /**
+     * 根据字典类型查询字典数据
+     *
+     * @param dictType 字典类型
+     * @return 字典数据集合信息
+     */
     @Override
     public List<RemoteDictDataVo> selectDictDataByType(String dictType) {
         List<SysDictDataVo> list = sysDictTypeService.selectDictDataByType(dictType);

+ 10 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteLogServiceImpl.java

@@ -26,6 +26,11 @@ public class RemoteLogServiceImpl implements RemoteLogService {
     private final ISysOperLogService operLogService;
     private final ISysLogininforService logininforService;
 
+    /**
+     * 保存系统日志
+     *
+     * @param remoteOperLogBo 日志实体
+     */
     @Async
     @Override
     public void saveLog(RemoteOperLogBo remoteOperLogBo) {
@@ -33,6 +38,11 @@ public class RemoteLogServiceImpl implements RemoteLogService {
         operLogService.insertOperlog(sysOperLogBo);
     }
 
+    /**
+     * 保存访问记录
+     *
+     * @param remoteLogininforBo 访问实体
+     */
     @Async
     @Override
     public void saveLogininfor(RemoteLogininforBo remoteLogininforBo) {

+ 16 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteSocialServiceImpl.java

@@ -26,7 +26,10 @@ public class RemoteSocialServiceImpl implements RemoteSocialService {
     private final ISysSocialService sysSocialService;
 
     /**
-     * 根据 authId 查询用户信息
+     * 根据 authId 查询用户授权信息
+     *
+     * @param authId 认证id
+     * @return 授权信息
      */
     @Override
     public List<RemoteSocialVo> selectByAuthId(String authId) {
@@ -34,6 +37,11 @@ public class RemoteSocialServiceImpl implements RemoteSocialService {
         return MapstructUtils.convert(list, RemoteSocialVo.class);
     }
 
+    /**
+     * 查询列表
+     *
+     * @param bo 社会化关系业务对象
+     */
     @Override
     public List<RemoteSocialVo> queryList(RemoteSocialBo bo) {
         SysSocialBo params = MapstructUtils.convert(bo, SysSocialBo.class);
@@ -43,6 +51,8 @@ public class RemoteSocialServiceImpl implements RemoteSocialService {
 
     /**
      * 保存社会化关系
+     *
+     * @param bo 社会化关系业务对象
      */
     @Override
     public void insertByBo(RemoteSocialBo bo) {
@@ -51,6 +61,8 @@ public class RemoteSocialServiceImpl implements RemoteSocialService {
 
     /**
      * 更新社会化关系
+     *
+     * @param bo 社会化关系业务对象
      */
     @Override
     public void updateByBo(RemoteSocialBo bo) {
@@ -59,6 +71,9 @@ public class RemoteSocialServiceImpl implements RemoteSocialService {
 
     /**
      * 删除社会化关系
+     *
+     * @param socialId 社会化关系ID
+     * @return 结果
      */
     @Override
     public Boolean deleteWithValidById(Long socialId) {

+ 53 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java

@@ -46,6 +46,13 @@ public class RemoteUserServiceImpl implements RemoteUserService {
     private final ISysDeptService deptService;
     private final SysUserMapper userMapper;
 
+    /**
+     * 通过用户名查询用户信息
+     *
+     * @param username 用户名
+     * @param tenantId 租户id
+     * @return 结果
+     */
     @Override
     public LoginUser getUserInfo(String username, String tenantId) throws UserException {
         return TenantHelper.dynamic(tenantId, () -> {
@@ -62,6 +69,13 @@ public class RemoteUserServiceImpl implements RemoteUserService {
         });
     }
 
+    /**
+     * 通过用户id查询用户信息
+     *
+     * @param userId   用户id
+     * @param tenantId 租户id
+     * @return 结果
+     */
     @Override
     public LoginUser getUserInfo(Long userId, String tenantId) throws UserException {
         return TenantHelper.dynamic(tenantId, () -> {
@@ -78,6 +92,13 @@ public class RemoteUserServiceImpl implements RemoteUserService {
         });
     }
 
+    /**
+     * 通过手机号查询用户信息
+     *
+     * @param phonenumber 手机号
+     * @param tenantId    租户id
+     * @return 结果
+     */
     @Override
     public LoginUser getUserInfoByPhonenumber(String phonenumber, String tenantId) throws UserException {
         return TenantHelper.dynamic(tenantId, () -> {
@@ -94,6 +115,13 @@ public class RemoteUserServiceImpl implements RemoteUserService {
         });
     }
 
+    /**
+     * 通过邮箱查询用户信息
+     *
+     * @param email    邮箱
+     * @param tenantId 租户id
+     * @return 结果
+     */
     @Override
     public LoginUser getUserInfoByEmail(String email, String tenantId) throws UserException {
         return TenantHelper.dynamic(tenantId, () -> {
@@ -110,6 +138,12 @@ public class RemoteUserServiceImpl implements RemoteUserService {
         });
     }
 
+    /**
+     * 通过openid查询用户信息
+     *
+     * @param openid openid
+     * @return 结果
+     */
     @Override
     public XcxLoginUser getUserInfoByOpenid(String openid) throws UserException {
         // todo 自行实现 userService.selectUserByOpenid(openid);
@@ -131,6 +165,12 @@ public class RemoteUserServiceImpl implements RemoteUserService {
         return loginUser;
     }
 
+    /**
+     * 注册用户信息
+     *
+     * @param remoteUserBo 用户信息
+     * @return 结果
+     */
     @Override
     public Boolean registerUserInfo(RemoteUserBo remoteUserBo) throws UserException, ServiceException {
         SysUserBo sysUserBo = MapstructUtils.convert(remoteUserBo, SysUserBo.class);
@@ -219,7 +259,7 @@ public class RemoteUserServiceImpl implements RemoteUserService {
         loginUser.setRolePermission(permissionService.getRolePermission(userVo.getUserId()));
         TenantHelper.dynamic(userVo.getTenantId(), () -> {
             SysDeptVo dept = null;
-            if (ObjectUtil.isNotNull(userVo.getUserId())) {
+            if (ObjectUtil.isNotNull(userVo.getDeptId())) {
                 dept = deptService.selectDeptById(userVo.getDeptId());
             }
             loginUser.setDeptName(ObjectUtil.isNull(dept) ? "" : dept.getDeptName());
@@ -246,12 +286,24 @@ public class RemoteUserServiceImpl implements RemoteUserService {
         DataPermissionHelper.ignore(() -> userMapper.updateById(sysUser));
     }
 
+    /**
+     * 通过用户ID查询用户列表
+     *
+     * @param userIds 用户ids
+     * @return 用户列表
+     */
     @Override
     public List<RemoteUserVo> selectListByIds(List<Long> userIds) {
         List<SysUserVo> sysUserVos = userService.selectUserByIds(userIds, null);
         return MapstructUtils.convert(sysUserVos, RemoteUserVo.class);
     }
 
+    /**
+     * 通过角色ID查询用户ID
+     *
+     * @param roleIds 角色ids
+     * @return 用户ids
+     */
     @Override
     public List<Long> selectUserIdsByRoleIds(List<Long> roleIds) {
         return userService.selectUserIdsByRoleIds(roleIds);

+ 0 - 7
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java

@@ -100,13 +100,6 @@ public interface ISysDeptService {
      */
     boolean checkDeptNameUnique(SysDeptBo dept);
 
-    /**
-     * 校验部门类别编码是否唯一
-     *
-     * @param dept 部门信息
-     * @return 结果
-     */
-    boolean checkDeptCategoryUnique(SysDeptBo dept);
 
     /**
      * 校验部门是否有数据权限

+ 23 - 8
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysSocialService.java

@@ -12,45 +12,60 @@ import java.util.List;
  */
 public interface ISysSocialService {
 
-
     /**
-     * 查询社会化关系
+     * 根据ID查询社会化关系
+     *
+     * @param id 社会化关系的唯一标识符
+     * @return 返回与给定ID对应的SysSocialVo对象,如果未找到则返回null
      */
     SysSocialVo queryById(String id);
 
     /**
      * 查询社会化关系列表
+     *
+     * @param bo 用于过滤查询条件的SysSocialBo对象
+     * @return 返回符合条件的SysSocialVo对象列表
      */
     List<SysSocialVo> queryList(SysSocialBo bo);
 
     /**
-     * 查询社会化关系列表
+     * 根据用户ID查询社会化关系列表
+     *
+     * @param userId 用户的唯一标识符
+     * @return 返回与给定用户ID相关联的SysSocialVo对象列表
      */
     List<SysSocialVo> queryListByUserId(Long userId);
 
     /**
      * 新增授权关系
+     *
+     * @param bo 包含新增授权关系信息的SysSocialBo对象
+     * @return 返回新增操作的结果,成功返回true,失败返回false
      */
     Boolean insertByBo(SysSocialBo bo);
 
     /**
      * 更新社会化关系
+     *
+     * @param bo 包含更新信息的SysSocialBo对象
+     * @return 返回更新操作的结果,成功返回true,失败返回false
      */
-
     Boolean updateByBo(SysSocialBo bo);
 
     /**
      * 删除社会化关系信息
+     *
+     * @param id 要删除的社会化关系的唯一标识符
+     * @return 返回删除操作的结果,成功返回true,失败返回false
      */
     Boolean deleteWithValidById(Long id);
 
-
     /**
-     * 根据 authId 查询 SysSocial 表和 SysUser 表,返回 SysSocialAuthResult 映射的对象
+     * 根据认证ID查询社会化关系和用户信息
+     *
      * @param authId 认证ID
-     * @return SysSocial
+     * @return 返回包含SysSocial和用户信息的SysSocialVo对象列表
      */
     List<SysSocialVo> selectByAuthId(String authId);
 
-
 }

+ 0 - 14
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java

@@ -223,20 +223,6 @@ public class SysDeptServiceImpl implements ISysDeptService {
         return !exist;
     }
 
-    /**
-     * 校验部门类别编码是否唯一
-     *
-     * @param dept 部门信息
-     * @return 结果
-     */
-    @Override
-    public boolean checkDeptCategoryUnique(SysDeptBo dept) {
-        boolean exist = baseMapper.exists(new LambdaQueryWrapper<SysDept>()
-            .eq(SysDept::getDeptCategory, dept.getDeptCategory())
-            .ne(ObjectUtil.isNotNull(dept.getDeptId()), SysDept::getDeptId, dept.getDeptId()));
-        return !exist;
-    }
-
     /**
      * 校验部门是否有数据权限
      *

+ 1 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java

@@ -37,7 +37,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * 角色 业务层处理
@@ -106,7 +105,7 @@ public class SysRoleServiceImpl implements ISysRoleService {
         List<SysRoleVo> userRoles = baseMapper.selectRolesByUserId(userId);
         List<SysRoleVo> roles = selectRoleAll();
         // 使用HashSet提高查找效率
-        Set<Long> userRoleIds = userRoles.stream().map(SysRoleVo::getRoleId).collect(Collectors.toSet());
+        Set<Long> userRoleIds = StreamUtils.toSet(userRoles, SysRoleVo::getRoleId);
         for (SysRoleVo role : roles) {
             if (userRoleIds.contains(role.getRoleId())) {
                 role.setFlag(true);

+ 28 - 12
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java

@@ -26,9 +26,11 @@ public class SysSocialServiceImpl implements ISysSocialService {
 
     private final SysSocialMapper baseMapper;
 
-
     /**
-     * 查询社会化关系
+     * 根据ID查询社会化关系
+     *
+     * @param id 社会化关系的唯一标识符
+     * @return 返回与给定ID对应的SysSocialVo对象,如果未找到则返回null
      */
     @Override
     public SysSocialVo queryById(String id) {
@@ -36,7 +38,10 @@ public class SysSocialServiceImpl implements ISysSocialService {
     }
 
     /**
-     * 授权列表
+     * 查询社会化关系列表
+     *
+     * @param bo 用于过滤查询条件的SysSocialBo对象
+     * @return 返回符合条件的SysSocialVo对象列表
      */
     @Override
     public List<SysSocialVo> queryList(SysSocialBo bo) {
@@ -47,14 +52,22 @@ public class SysSocialServiceImpl implements ISysSocialService {
         return baseMapper.selectVoList(lqw);
     }
 
+    /**
+     * 根据用户ID查询社会化关系列表
+     *
+     * @param userId 用户的唯一标识符
+     * @return 返回与给定用户ID相关联的SysSocialVo对象列表
+     */
     @Override
     public List<SysSocialVo> queryListByUserId(Long userId) {
         return baseMapper.selectVoList(new LambdaQueryWrapper<SysSocial>().eq(SysSocial::getUserId, userId));
     }
 
-
     /**
-     * 新增社会化关系
+     * 新增授权关系
+     *
+     * @param bo 包含新增授权关系信息的SysSocialBo对象
+     * @return 返回新增操作的结果,成功返回true,失败返回false
      */
     @Override
     public Boolean insertByBo(SysSocialBo bo) {
@@ -73,6 +86,9 @@ public class SysSocialServiceImpl implements ISysSocialService {
 
     /**
      * 更新社会化关系
+     *
+     * @param bo 包含更新信息的SysSocialBo对象
+     * @return 返回更新操作的结果,成功返回true,失败返回false
      */
     @Override
     public Boolean updateByBo(SysSocialBo bo) {
@@ -81,7 +97,6 @@ public class SysSocialServiceImpl implements ISysSocialService {
         return baseMapper.updateById(update) > 0;
     }
 
-
     /**
      * 保存前的数据校验
      */
@@ -89,21 +104,22 @@ public class SysSocialServiceImpl implements ISysSocialService {
         //TODO 做一些数据校验,如唯一约束
     }
 
-
     /**
-     * 删除社会化关系
+     * 删除社会化关系信息
+     *
+     * @param id 要删除的社会化关系的唯一标识符
+     * @return 返回删除操作的结果,成功返回true,失败返回false
      */
     @Override
     public Boolean deleteWithValidById(Long id) {
         return baseMapper.deleteById(id) > 0;
     }
 
-
     /**
-     * 根据 authId 查询用户信息
+     * 根据认证ID查询社会化关系和用户信息
      *
-     * @param authId 认证id
-     * @return 授权信息
+     * @param authId 认证ID
+     * @return 返回包含SysSocial和用户信息的SysSocialVo对象列表
      */
     @Override
     public List<SysSocialVo> selectByAuthId(String authId) {

+ 3 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

@@ -95,6 +95,9 @@ public class SysUserServiceImpl implements ISysUserService {
                 ids.add(user.getDeptId());
                 w.in("u.dept_id", ids);
             }).orderByAsc("u.user_id");
+        if (StringUtils.isNotBlank(user.getExcludeUserIds())) {
+            wrapper.notIn("u.user_id", StringUtils.splitList(user.getExcludeUserIds()));
+        }
         return wrapper;
     }
 

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml

@@ -12,7 +12,7 @@
         m.perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
         from sys_menu m
         left join sys_role_menu rm on m.menu_id = rm.menu_id
-        left join sys_role r on sur.role_id = r.role_id
+        left join sys_role r on rm.role_id = r.role_id
         ${ew.getCustomSqlSegment}
     </select>
 

+ 8 - 2
ruoyi-modules/ruoyi-workflow/Dockerfile

@@ -1,7 +1,9 @@
+# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
+FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
+#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
 #FROM findepi/graalvm:java17-native
-FROM openjdk:17.0.2-oraclelinux8
 
-MAINTAINER Lion Li
+LABEL maintainer="Lion Li"
 
 RUN mkdir -p /ruoyi/workflow/logs \
     /ruoyi/workflow/temp \
@@ -9,6 +11,10 @@ RUN mkdir -p /ruoyi/workflow/logs \
 
 WORKDIR /ruoyi/workflow
 
+# 补全alpine镜像缺失字体问题
+RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
+RUN apk add fontconfig && apk add --update ttf-dejavu && fc-cache --force
+
 ENV SERVER_PORT=9205 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
 
 EXPOSE ${SERVER_PORT}

+ 2 - 1
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java

@@ -2,6 +2,7 @@ package org.dromara.workflow.flowable.cmd;
 
 import cn.hutool.core.util.ObjectUtil;
 import lombok.AllArgsConstructor;
+import org.dromara.common.core.utils.StreamUtils;
 import org.flowable.common.engine.impl.interceptor.Command;
 import org.flowable.common.engine.impl.interceptor.CommandContext;
 import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
@@ -59,7 +60,7 @@ public class DeleteSequenceMultiInstanceCmd implements Command<Void> {
         }
         List<Long> userIdList = new ArrayList<>();
         userIds.forEach(e -> {
-            Long userId = assignees.stream().filter(id -> ObjectUtil.equals(id, e)).findFirst().orElse(null);
+            Long userId = StreamUtils.findFirst(assignees, id -> ObjectUtil.equals(id, e));
             if (userId == null) {
                 userIdList.add(e);
             }

+ 11 - 11
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java

@@ -259,23 +259,23 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
         List<HistoricActivityInstance> highLightedFlowList = QueryUtils.hisActivityInstanceQuery(processInstanceId).orderByHistoricActivityInstanceStartTime().asc().list();
         for (HistoricActivityInstance tempActivity : highLightedFlowList) {
             Map<String, Object> task = new HashMap<>();
-            if (!FlowConstant.SEQUENCE_FLOW.equals(tempActivity.getActivityType()) &&
-                !FlowConstant.PARALLEL_GATEWAY.equals(tempActivity.getActivityType()) &&
-                !FlowConstant.EXCLUSIVE_GATEWAY.equals(tempActivity.getActivityType()) &&
-                !FlowConstant.INCLUSIVE_GATEWAY.equals(tempActivity.getActivityType())
-            ) {
-                task.put("key", tempActivity.getActivityId());
-                task.put("completed", tempActivity.getEndTime() != null);
-                task.put("activityType", tempActivity.getActivityType());
-                taskList.add(task);
+            switch (tempActivity.getActivityType()) {
+                case FlowConstant.SEQUENCE_FLOW, FlowConstant.PARALLEL_GATEWAY,
+                     FlowConstant.EXCLUSIVE_GATEWAY, FlowConstant.INCLUSIVE_GATEWAY -> {}
+                default -> {
+                    task.put("key", tempActivity.getActivityId());
+                    task.put("completed", tempActivity.getEndTime() != null);
+                    task.put("activityType", tempActivity.getActivityType());
+                    taskList.add(task);
+                }
             }
         }
         ProcessInstance processInstance = QueryUtils.instanceQuery(processInstanceId).singleResult();
         if (processInstance != null) {
-            taskList = taskList.stream().filter(e -> !e.get("activityType").equals(FlowConstant.END_EVENT)).collect(Collectors.toList());
+            taskList = StreamUtils.filter(taskList, e -> !e.get("activityType").equals(FlowConstant.END_EVENT));
         }
         //查询出运行中节点
-        List<Map<String, Object>> runtimeNodeList = taskList.stream().filter(e -> !(Boolean) e.get("completed")).collect(Collectors.toList());
+        List<Map<String, Object>> runtimeNodeList = StreamUtils.filter(taskList, e -> !(Boolean) e.get("completed"));
         if (CollUtil.isNotEmpty(runtimeNodeList)) {
             Iterator<Map<String, Object>> iterator = taskList.iterator();
             while (iterator.hasNext()) {

+ 2 - 14
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java

@@ -263,7 +263,8 @@ public class ActTaskServiceImpl implements IActTaskService {
         String userId = String.valueOf(LoginHelper.getUserId());
         queryWrapper.eq("t.business_status_", BusinessStatusEnum.WAITING.getStatus());
         queryWrapper.eq(TenantHelper.isEnable(), "t.tenant_id_", TenantHelper.getTenantId());
-        queryWrapper.and(w1 -> w1.eq("t.assignee_", userId).or(w2 -> w2.isNull("t.assignee_").apply("exists ( select LINK.ID_ from ACT_RU_IDENTITYLINK LINK where LINK.TASK_ID_ = t.ID_ and LINK.TYPE_ = 'candidate' " + "and (LINK.USER_ID_ = {0} or ( LINK.GROUP_ID_ IN " + getInParam(roleIds) + " ) ))", userId)));
+        String ids = StreamUtils.join(roleIds, x -> "'" + x + "'");
+        queryWrapper.and(w1 -> w1.eq("t.assignee_", userId).or(w2 -> w2.isNull("t.assignee_").apply("exists ( select LINK.ID_ from ACT_RU_IDENTITYLINK LINK where LINK.TASK_ID_ = t.ID_ and LINK.TYPE_ = 'candidate' and (LINK.USER_ID_ = {0} or ( LINK.GROUP_ID_ IN ({1}) ) ))", userId, ids)));
         if (StringUtils.isNotBlank(taskBo.getName())) {
             queryWrapper.like("t.name_", taskBo.getName());
         }
@@ -292,19 +293,6 @@ public class ActTaskServiceImpl implements IActTaskService {
         return TableDataInfo.build(page);
     }
 
-    private String getInParam(List<String> param) {
-        StringBuilder sb = new StringBuilder();
-        sb.append("(");
-        for (int i = 0; i < param.size(); i++) {
-            sb.append("'").append(param.get(i)).append("'");
-            if (i != param.size() - 1) {
-                sb.append(",");
-            }
-        }
-        sb.append(")");
-        return sb.toString();
-    }
-
     /**
      * 查询当前租户所有待办任务
      *

+ 2 - 1
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskBackNodeServiceImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.StreamUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.workflow.domain.WfTaskBackNode;
@@ -56,7 +57,7 @@ public class WfTaskBackNodeServiceImpl implements IWfTaskBackNodeService {
             wfTaskBackNode.setOrderNo(0);
             wfTaskBackNodeMapper.insert(wfTaskBackNode);
         } else {
-            WfTaskBackNode taskNode = list.stream().filter(e -> e.getNodeId().equals(wfTaskBackNode.getNodeId()) && e.getOrderNo() == 0).findFirst().orElse(null);
+            WfTaskBackNode taskNode = StreamUtils.findFirst(list, e -> e.getNodeId().equals(wfTaskBackNode.getNodeId()) && e.getOrderNo() == 0);
             if (ObjectUtil.isEmpty(taskNode)) {
                 wfTaskBackNode.setOrderNo(list.get(0).getOrderNo() + 1);
                 WfTaskBackNode node = getListByInstanceIdAndNodeId(wfTaskBackNode.getInstanceId(), wfTaskBackNode.getNodeId());

+ 4 - 2
ruoyi-visual/ruoyi-monitor/Dockerfile

@@ -1,7 +1,9 @@
+# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
+FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
+#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
 #FROM findepi/graalvm:java17-native
-FROM openjdk:17.0.2-oraclelinux8
 
-MAINTAINER Lion Li
+LABEL maintainer="Lion Li"
 
 RUN mkdir -p /ruoyi/monitor/logs
 

+ 4 - 2
ruoyi-visual/ruoyi-nacos/Dockerfile

@@ -1,7 +1,9 @@
+# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
+FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
+#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
 #FROM findepi/graalvm:java17-native
-FROM openjdk:17.0.2-oraclelinux8
 
-MAINTAINER Lion Li
+LABEL maintainer="Lion Li"
 
 RUN mkdir -p /ruoyi/nacos
 

+ 4 - 2
ruoyi-visual/ruoyi-seata-server/Dockerfile

@@ -1,7 +1,9 @@
+# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
+FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
+#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
 #FROM findepi/graalvm:java17-native
-FROM openjdk:17.0.2-oraclelinux8
 
-MAINTAINER Lion Li
+LABEL maintainer="Lion Li"
 
 RUN mkdir -p /ruoyi/seata-server/logs \
     /ruoyi/skywalking/agent

+ 4 - 2
ruoyi-visual/ruoyi-sentinel-dashboard/Dockerfile

@@ -1,7 +1,9 @@
+# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
+FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
+#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
 #FROM findepi/graalvm:java17-native
-FROM openjdk:17.0.2-oraclelinux8
 
-MAINTAINER Lion Li
+LABEL maintainer="Lion Li"
 
 RUN mkdir -p /ruoyi/sentinel-dashboard/logs \
     /ruoyi/skywalking/agent

+ 4 - 2
ruoyi-visual/ruoyi-snailjob-server/Dockerfile

@@ -1,7 +1,9 @@
+# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
+FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
+#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
 #FROM findepi/graalvm:java17-native
-FROM openjdk:17.0.2-oraclelinux8
 
-MAINTAINER Lion Li
+LABEL maintainer="Lion Li"
 
 RUN mkdir -p /ruoyi/snailjob/logs