diff --git a/.run/ruoyi-auth.run.xml b/.run/ruoyi-auth.run.xml index dbbbdd096..5c82d89b0 100644 --- a/.run/ruoyi-auth.run.xml +++ b/.run/ruoyi-auth.run.xml @@ -2,7 +2,7 @@ - diff --git a/.run/ruoyi-gateway.run.xml b/.run/ruoyi-gateway.run.xml index 208d1e972..d981e28e2 100644 --- a/.run/ruoyi-gateway.run.xml +++ b/.run/ruoyi-gateway.run.xml @@ -2,7 +2,7 @@ - diff --git a/.run/ruoyi-gen.run.xml b/.run/ruoyi-gen.run.xml index 67fcee179..10a03ce71 100644 --- a/.run/ruoyi-gen.run.xml +++ b/.run/ruoyi-gen.run.xml @@ -2,7 +2,7 @@ - diff --git a/.run/ruoyi-job.run.xml b/.run/ruoyi-job.run.xml index 0cc3a765c..3f64c8c55 100644 --- a/.run/ruoyi-job.run.xml +++ b/.run/ruoyi-job.run.xml @@ -2,7 +2,7 @@ - diff --git a/.run/ruoyi-monitor.run.xml b/.run/ruoyi-monitor.run.xml index ebbbcb1f3..aa2b96337 100644 --- a/.run/ruoyi-monitor.run.xml +++ b/.run/ruoyi-monitor.run.xml @@ -2,7 +2,7 @@ - diff --git a/.run/ruoyi-nacos.run.xml b/.run/ruoyi-nacos.run.xml index a87b1fba8..e311a8a03 100644 --- a/.run/ruoyi-nacos.run.xml +++ b/.run/ruoyi-nacos.run.xml @@ -2,7 +2,7 @@ - diff --git a/.run/ruoyi-resource.run.xml b/.run/ruoyi-resource.run.xml index a24b6e5a0..9ddcb1a6f 100644 --- a/.run/ruoyi-resource.run.xml +++ b/.run/ruoyi-resource.run.xml @@ -2,7 +2,7 @@ - diff --git a/.run/ruoyi-seata-server.run.xml b/.run/ruoyi-seata-server.run.xml index f54949e69..adf938ea5 100644 --- a/.run/ruoyi-seata-server.run.xml +++ b/.run/ruoyi-seata-server.run.xml @@ -2,7 +2,7 @@ - diff --git a/.run/ruoyi-sentinel-dashboard.run.xml b/.run/ruoyi-sentinel-dashboard.run.xml index b63ea0ca7..4c08241b8 100644 --- a/.run/ruoyi-sentinel-dashboard.run.xml +++ b/.run/ruoyi-sentinel-dashboard.run.xml @@ -2,7 +2,7 @@ - diff --git a/.run/ruoyi-snailjob-server.run.xml b/.run/ruoyi-snailjob-server.run.xml index 9ecfb6ed8..42a250fab 100644 --- a/.run/ruoyi-snailjob-server.run.xml +++ b/.run/ruoyi-snailjob-server.run.xml @@ -2,7 +2,7 @@ - diff --git a/.run/ruoyi-system.run.xml b/.run/ruoyi-system.run.xml index dfe119a9d..709d4540e 100644 --- a/.run/ruoyi-system.run.xml +++ b/.run/ruoyi-system.run.xml @@ -2,7 +2,7 @@ - diff --git a/.run/ruoyi-workflow.run.xml b/.run/ruoyi-workflow.run.xml index 00836a8a8..4c0e419d8 100644 --- a/.run/ruoyi-workflow.run.xml +++ b/.run/ruoyi-workflow.run.xml @@ -2,7 +2,7 @@ - diff --git a/README.md b/README.md index 28faee67e..5b28e71ec 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/dromara/RuoYi-Cloud-Plus/blob/2.X/LICENSE) [![使用IntelliJ IDEA开发维护](https://img.shields.io/badge/IntelliJ%20IDEA-提供支持-blue.svg)](https://www.jetbrains.com/?from=RuoYi-Cloud-Plus)
-[![RuoYi-Cloud-Plus](https://img.shields.io/badge/RuoYi_Cloud_Plus-2.4.0-success.svg)](https://gitee.com/dromara/RuoYi-Cloud-Plus) +[![RuoYi-Cloud-Plus](https://img.shields.io/badge/RuoYi_Cloud_Plus-2.4.1-success.svg)](https://gitee.com/dromara/RuoYi-Cloud-Plus) [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.4-blue.svg)]() [![JDK-17](https://img.shields.io/badge/JDK-17-green.svg)]() [![JDK-21](https://img.shields.io/badge/JDK-21-green.svg)]() diff --git a/pom.xml b/pom.xml index b221dff1d..3eeb91ecc 100644 --- a/pom.xml +++ b/pom.xml @@ -13,11 +13,11 @@ Dromara RuoYi-Cloud-Plus微服务系统 - 2.4.0 + 2.4.1 UTF-8 UTF-8 17 - 3.4.6 + 3.4.7 2024.0.0 3.4.7 3.5.16 @@ -29,14 +29,14 @@ 2.8.8 0.15.0 1.2.0 - 5.8.35 - 3.45.1 + 5.8.38 + 3.50.0 2.2.7 1.5.0 - 1.42.0 + 1.44.0 1.18.36 7.4 - 2.1.0 + 3.0.0 9.3.0 1.80 1.4.8 @@ -46,22 +46,20 @@ 2.7.0 1.2.83 - 2.28.22 - 3.3.4 - 8.7.2-20250101 + 8.7.2-20250603 - 1.7.3 + 1.7.4 2.3.0 - 3.11.0 - 3.1.2 + 3.14.0 + 3.5.3 1.3.0 true diff --git a/ruoyi-api/ruoyi-api-bom/pom.xml b/ruoyi-api/ruoyi-api-bom/pom.xml index dc105a7e6..a1bb7214a 100644 --- a/ruoyi-api/ruoyi-api-bom/pom.xml +++ b/ruoyi-api/ruoyi-api-bom/pom.xml @@ -15,7 +15,7 @@ - 2.4.0 + 2.4.1 diff --git a/ruoyi-api/ruoyi-api-workflow/pom.xml b/ruoyi-api/ruoyi-api-workflow/pom.xml index 45c32d066..2d648e12c 100644 --- a/ruoyi-api/ruoyi-api-workflow/pom.xml +++ b/ruoyi-api/ruoyi-api-workflow/pom.xml @@ -22,9 +22,12 @@ org.dromara ruoyi-common-core + + org.dromara ruoyi-common-bus + true diff --git a/ruoyi-auth/Dockerfile b/ruoyi-auth/Dockerfile index 8555931b3..c24c9e8a8 100644 --- a/ruoyi-auth/Dockerfile +++ b/ruoyi-auth/Dockerfile @@ -1,6 +1,6 @@ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-debian:17.0.11-cds -#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds +FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds +#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds #FROM findepi/graalvm:java17-native LABEL maintainer="Lion Li" diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java b/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java index 3f30c42ad..416f7a492 100644 --- a/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java +++ b/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java @@ -103,7 +103,7 @@ public class TokenController { Long userId = LoginHelper.getUserId(); scheduledExecutorService.schedule(() -> { remoteMessageService.publishMessage(List.of(userId), "欢迎登录RuoYi-Cloud-Plus微服务管理系统"); - }, 3, TimeUnit.SECONDS); + }, 5, TimeUnit.SECONDS); return R.ok(loginVo); } diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/listener/UserActionListener.java b/ruoyi-auth/src/main/java/org/dromara/auth/listener/UserActionListener.java index 6e22e1991..471539993 100644 --- a/ruoyi-auth/src/main/java/org/dromara/auth/listener/UserActionListener.java +++ b/ruoyi-auth/src/main/java/org/dromara/auth/listener/UserActionListener.java @@ -162,7 +162,7 @@ public class UserActionListener implements SaTokenListener { * 每次Token续期时触发 */ @Override - public void doRenewTimeout(String tokenValue, Object loginId, long timeout) { + public void doRenewTimeout(String loginType, Object loginId, String tokenValue, long timeout) { } } diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SocialAuthStrategy.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SocialAuthStrategy.java index bcfb45f2f..074f02e3e 100644 --- a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SocialAuthStrategy.java +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SocialAuthStrategy.java @@ -3,9 +3,6 @@ package org.dromara.auth.service.impl; import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.parameter.SaLoginParameter; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.http.HttpUtil; -import cn.hutool.http.Method; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.model.AuthResponse; @@ -66,15 +63,6 @@ public class SocialAuthStrategy implements IAuthStrategy { throw new ServiceException(response.getMsg()); } AuthUser authUserData = response.getData(); - if ("GITEE".equals(authUserData.getSource())) { - // 如用户使用 gitee 登录顺手 star 给作者一点支持 拒绝白嫖 - HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Vue-Plus") - .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken())) - .executeAsync(); - HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Cloud-Plus") - .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken())) - .executeAsync(); - } List list = remoteSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid()); if (CollUtil.isEmpty(list)) { diff --git a/ruoyi-common/ruoyi-common-alibaba-bom/pom.xml b/ruoyi-common/ruoyi-common-alibaba-bom/pom.xml index 9ec6b088b..51a935abb 100644 --- a/ruoyi-common/ruoyi-common-alibaba-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-alibaba-bom/pom.xml @@ -14,14 +14,13 @@ - 2.4.0 - 2023.0.1.2 + 2.4.1 + 2023.0.3.3 1.8.8 - 2.3.0 + 2.4.0 2.5.1 - 3.3.4 + 3.3.5 3.3.1 - 1.0.11 @@ -177,12 +176,6 @@ dubbo-metadata-report-redis ${dubbo-extensions.version} - - - com.alibaba.spring - spring-context-support - ${spring.context.support.version} - diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml index 3e6764f6f..449a1a7f4 100644 --- a/ruoyi-common/ruoyi-common-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-bom/pom.xml @@ -14,7 +14,7 @@ - 2.4.0 + 2.4.1 diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/NetUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/NetUtils.java new file mode 100644 index 000000000..72fdf4033 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/NetUtils.java @@ -0,0 +1,84 @@ +package org.dromara.common.core.utils; + +import cn.hutool.core.lang.PatternPool; +import cn.hutool.core.net.NetUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.regex.RegexUtils; + +import java.net.Inet6Address; +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * 增强网络相关工具类 + * + * @author 秋辞未寒 + */ +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class NetUtils extends NetUtil { + + /** + * 判断是否为IPv6地址 + * + * @param ip IP地址 + * @return 是否为IPv6地址 + */ + public static boolean isIPv6(String ip) { + try { + // 判断是否为IPv6地址 + return InetAddress.getByName(ip) instanceof Inet6Address; + } catch (UnknownHostException e) { + return false; + } + } + + /** + * 判断IPv6地址是否为内网地址 + *

+ * 以下地址将归类为本地地址,如有业务场景有需要,请根据需求自行处理: + *
+     * 通配符地址 0:0:0:0:0:0:0:0
+     * 链路本地地址 fe80::/10
+     * 唯一本地地址 fec0::/10
+     * 环回地址 ::1
+     * 
+ * + * @param ip IP地址 + * @return 是否为内网地址 + */ + public static boolean isInnerIPv6(String ip) { + try { + // 判断是否为IPv6地址 + if (InetAddress.getByName(ip) instanceof Inet6Address inet6Address) { + // isAnyLocalAddress 判断是否为通配符地址,通常不会将其视为内网地址,根据业务场景自行处理判断 + // isLinkLocalAddress 判断是否为链路本地地址,通常不算内网地址,是否划分归属于内网需要根据业务场景自行处理判断 + // isLoopbackAddress 判断是否为环回地址,与IPv4的 127.0.0.1 同理,用于表示本机 + // isSiteLocalAddress 判断是否为本地站点地址,IPv6唯一本地地址(Unique Local Addresses,简称ULA) + if (inet6Address.isAnyLocalAddress() + || inet6Address.isLinkLocalAddress() + || inet6Address.isLoopbackAddress() + || inet6Address.isSiteLocalAddress()) { + return true; + } + } + } catch (UnknownHostException e) { + // 注意,isInnerIPv6方法和isIPv6方法的适用范围不同,所以此处不能忽略其异常信息。 + throw new IllegalArgumentException("Invalid IPv6 address!", e); + } + return false; + } + + /** + * 判断是否为IPv4地址 + * + * @param ip IP地址 + * @return 是否为IPv4地址 + */ + public static boolean isIPv4(String ip) { + return RegexUtils.isMatch(PatternPool.IPV4, ip); + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java index 2ab42cbc1..1f2b99c9c 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java @@ -10,6 +10,9 @@ import lombok.NoArgsConstructor; import org.dromara.common.core.utils.reflect.ReflectUtils; import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -60,6 +63,38 @@ public class TreeBuildUtils extends TreeUtil { return TreeUtil.build(list, parentId, DEFAULT_CONFIG, nodeParser); } + /** + * 构建多根节点的树结构(支持多个顶级节点) + * + * @param list 原始数据列表 + * @param getId 获取节点 ID 的方法引用,例如:node -> node.getId() + * @param getParentId 获取节点父级 ID 的方法引用,例如:node -> node.getParentId() + * @param parser 树节点属性映射器,用于将原始节点 T 转为 Tree 节点 + * @param 原始数据类型(如实体类、DTO 等) + * @param 节点 ID 类型(如 Long、String) + * @return 构建完成的树形结构(可能包含多个顶级根节点) + */ + public static List> buildMultiRoot(List list, Function getId, Function getParentId, NodeParser parser) { + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + + // 提取所有节点 ID,用于后续判断哪些节点为根节点(即 parentId 不在其中) + Set allIds = StreamUtils.toSet(list, getId); + + // 筛选出所有 parentId 不在 allIds 中的节点,这些节点的 parentId 可认为是根节点 + Set rootParentIds = list.stream() + .map(getParentId) + .filter(Objects::nonNull) + .filter(pid -> !allIds.contains(pid)) + .collect(Collectors.toSet()); + + // 使用流处理,遍历每个顶级 parentId,构建对应树,并合并为一个列表返回 + return rootParentIds.stream() + .flatMap(rootParentId -> TreeUtil.build(list, rootParentId, parser).stream()) + .collect(Collectors.toList()); + } + /** * 获取节点列表中所有节点的叶子节点 * diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java index 3f7cd57a9..2fe3bd7b6 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java @@ -1,11 +1,11 @@ package org.dromara.common.core.utils.ip; -import cn.hutool.core.net.NetUtil; import cn.hutool.http.HtmlUtil; -import org.dromara.common.core.utils.StringUtils; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.NetUtils; +import org.dromara.common.core.utils.StringUtils; /** * 获取地址类 @@ -16,18 +16,55 @@ import lombok.extern.slf4j.Slf4j; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class AddressUtils { + // 未知IP + public static final String UNKNOWN_IP = "XX XX"; + // 内网地址 + public static final String LOCAL_ADDRESS = "内网IP"; // 未知地址 - public static final String UNKNOWN = "XX XX"; + public static final String UNKNOWN_ADDRESS = "未知"; public static String getRealAddressByIP(String ip) { - if (StringUtils.isBlank(ip)) { - return UNKNOWN; + // 处理空串并过滤HTML标签 + ip = HtmlUtil.cleanHtmlTag(StringUtils.blankToDefault(ip,"")); + // 判断是否为IPv4 + if (NetUtils.isIPv4(ip)) { + return resolverIPv4Region(ip); } + // 判断是否为IPv6 + if (NetUtils.isIPv6(ip)) { + return resolverIPv6Region(ip); + } + // 如果不是IPv4或IPv6,则返回未知IP + return UNKNOWN_IP; + } + + /** + * 根据IPv4地址查询IP归属行政区域 + * @param ip ipv4地址 + * @return 归属行政区域 + */ + private static String resolverIPv4Region(String ip){ // 内网不查询 - ip = StringUtils.contains(ip, "0:0:0:0:0:0:0:1") ? "127.0.0.1" : HtmlUtil.cleanHtmlTag(ip); - if (NetUtil.isInnerIP(ip)) { - return "内网IP"; + if (NetUtils.isInnerIP(ip)) { + return LOCAL_ADDRESS; } return RegionUtils.getCityInfo(ip); } + + /** + * 根据IPv6地址查询IP归属行政区域 + * @param ip ipv6地址 + * @return 归属行政区域 + */ + private static String resolverIPv6Region(String ip){ + // 内网不查询 + if (NetUtils.isInnerIPv6(ip)) { + return LOCAL_ADDRESS; + } + log.warn("ip2region不支持IPV6地址解析:{}", ip); + // 不支持IPv6,不再进行没有必要的IP地址信息的解析,直接返回 + // 如有需要,可自行实现IPv6地址信息解析逻辑,并在这里返回 + return UNKNOWN_ADDRESS; + } + } diff --git a/ruoyi-common/ruoyi-common-dubbo/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ContextFilter.java b/ruoyi-common/ruoyi-common-dubbo/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ContextFilter.java deleted file mode 100644 index 3f81b6001..000000000 --- a/ruoyi-common/ruoyi-common-dubbo/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ContextFilter.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2020-2099 sa-token.cc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package cn.dev33.satoken.context.dubbo3.filter; - -import cn.dev33.satoken.SaManager; -import cn.dev33.satoken.context.SaHolder; -import cn.dev33.satoken.context.dubbo3.util.SaTokenContextDubbo3Util; -import cn.dev33.satoken.util.SaTokenConsts; -import org.apache.dubbo.common.constants.CommonConstants; -import org.apache.dubbo.common.extension.Activate; -import org.apache.dubbo.rpc.*; - -/** - * Sa-Token 整合 Dubbo3 上下文初始化过滤器 - * - * @author click33 - * @since 1.42.0 - */ -@Activate(group = {CommonConstants.PROVIDER}, order = SaTokenConsts.RPC_CONTEXT_FILTER_ORDER) -public class SaTokenDubbo3ContextFilter implements Filter { - - @Override - public Result invoke(Invoker invoker, Invocation invocation) { - if(SaHolder.getContext().isValid()) { - return invoker.invoke(invocation); - } else { - try { - SaTokenContextDubbo3Util.setContext(RpcContext.getServiceContext()); - return invoker.invoke(invocation); - } finally { - SaManager.getSaTokenContext().clearContext(); - } - } - } - -} diff --git a/ruoyi-common/ruoyi-common-elasticsearch/src/main/java/org/dromara/easyes/spring/config/EasyEsConfiguration.java b/ruoyi-common/ruoyi-common-elasticsearch/src/main/java/org/dromara/easyes/spring/config/EasyEsConfiguration.java deleted file mode 100644 index 0a6ecc611..000000000 --- a/ruoyi-common/ruoyi-common-elasticsearch/src/main/java/org/dromara/easyes/spring/config/EasyEsConfiguration.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.dromara.easyes.spring.config; - -import lombok.Setter; -import org.dromara.easyes.common.property.EasyEsDynamicProperties; -import org.dromara.easyes.common.property.EasyEsProperties; -import org.dromara.easyes.common.strategy.AutoProcessIndexStrategy; -import org.dromara.easyes.common.utils.RestHighLevelClientUtils; -import org.dromara.easyes.core.index.AutoProcessIndexNotSmoothlyStrategy; -import org.dromara.easyes.core.index.AutoProcessIndexSmoothlyStrategy; -import org.dromara.easyes.spring.factory.IndexStrategyFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.util.Assert; - -import java.util.Map; - -/** - * @author MoJie - * @since 2.0 - */ -@Setter -@Configuration -@ConditionalOnProperty(value = "easy-es.enable", havingValue = "true") -public class EasyEsConfiguration implements InitializingBean { - - private EasyEsProperties easyEsProperties; - - private EasyEsDynamicProperties easyEsDynamicProperties; - - @Autowired - public EasyEsConfiguration(EasyEsProperties easyEsProperties, EasyEsDynamicProperties easyEsDynamicProperties) { - this.easyEsProperties = easyEsProperties; - this.easyEsDynamicProperties = easyEsDynamicProperties; - } - - @Override - public void afterPropertiesSet() throws Exception { - Assert.notNull(this.easyEsProperties, "easyEsProperties must is A bean. easy-es配置类必须给配置一个bean"); - } - - @Bean - public IndexStrategyFactory indexStrategyFactory() { - return new IndexStrategyFactory(); - } - - @Bean - public RestHighLevelClientUtils restHighLevelClientUtils() { - RestHighLevelClientUtils restHighLevelClientUtils = new RestHighLevelClientUtils(); - if (this.easyEsDynamicProperties == null) { - this.easyEsDynamicProperties = new EasyEsDynamicProperties(); - } - Map datasourceMap = this.easyEsDynamicProperties.getDatasource(); - if (datasourceMap.isEmpty()) { - // 设置默认数据源,兼容不使用多数据源配置场景的老用户使用习惯 - datasourceMap.put(RestHighLevelClientUtils.DEFAULT_DS, this.easyEsProperties); - } - for (String key : datasourceMap.keySet()) { - EasyEsProperties easyEsConfigProperties = datasourceMap.get(key); - RestHighLevelClientUtils.registerRestHighLevelClient(key, RestHighLevelClientUtils - .restHighLevelClient(easyEsConfigProperties)); - } - return restHighLevelClientUtils; - } - - /** - * 索引策略注册 - * - * @return {@link AutoProcessIndexStrategy} - * @author MoJie - */ - @Bean - public AutoProcessIndexStrategy autoProcessIndexSmoothlyStrategy() { - return new AutoProcessIndexSmoothlyStrategy(); - } - - @Bean - public AutoProcessIndexStrategy autoProcessIndexNotSmoothlyStrategy() { - return new AutoProcessIndexNotSmoothlyStrategy(); - } - -} diff --git a/ruoyi-common/ruoyi-common-elasticsearch/src/main/java/org/dromara/easyes/starter/config/GeneratorConfiguration.java b/ruoyi-common/ruoyi-common-elasticsearch/src/main/java/org/dromara/easyes/starter/config/GeneratorConfiguration.java deleted file mode 100644 index f5fa560e8..000000000 --- a/ruoyi-common/ruoyi-common-elasticsearch/src/main/java/org/dromara/easyes/starter/config/GeneratorConfiguration.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.dromara.easyes.starter.config; - -import org.dromara.easyes.core.config.GeneratorConfig; -import org.dromara.easyes.core.toolkit.Generator; -import org.elasticsearch.client.RestHighLevelClient; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Component; - -/** - * 代码生成注册 - * @author MoJie - * @since 2.0 - */ -@Component -@ConditionalOnProperty(value = "easy-es.enable", havingValue = "true") -public class GeneratorConfiguration extends Generator { - - @Autowired - private RestHighLevelClient client; - - @Override - public Boolean generate(GeneratorConfig config) { - super.generateEntity(config, this.client); - return Boolean.TRUE; - } -} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java index 460aa360e..d5faae715 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java @@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.executor.parameter.ParameterHandler; import org.apache.ibatis.executor.resultset.ResultSetHandler; import org.apache.ibatis.plugin.*; import org.dromara.common.core.utils.StringUtils; @@ -39,12 +40,23 @@ public class MybatisDecryptInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { + // 开始进行参数解密 + ResultSetHandler resultSetHandler = (ResultSetHandler) invocation.getTarget(); + Field parameterHandlerField = resultSetHandler.getClass().getDeclaredField("parameterHandler"); + parameterHandlerField.setAccessible(true); + Object target = parameterHandlerField.get(resultSetHandler); + if (target instanceof ParameterHandler parameterHandler) { + Object parameterObject = parameterHandler.getParameterObject(); + if (ObjectUtil.isNotNull(parameterObject) && !(parameterObject instanceof String)) { + this.decryptHandler(parameterObject); + } + } // 获取执行mysql执行结果 Object result = invocation.proceed(); if (result == null) { return null; } - decryptHandler(result); + this.decryptHandler(result); return result; } diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelNotation.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelNotation.java index f358afcd6..bcc3afec8 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelNotation.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelNotation.java @@ -13,10 +13,6 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) public @interface ExcelNotation { - /** - * col index - */ - int index() default -1; /** * 批注内容 */ diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelRequired.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelRequired.java index 15784e140..fbd31ccef 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelRequired.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelRequired.java @@ -15,10 +15,6 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) public @interface ExcelRequired { - /** - * col index - */ - int index() default -1; /** * 字体颜色 */ diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java index 259f8225b..3770f8032 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java @@ -1,6 +1,7 @@ package org.dromara.common.excel.handler; import cn.hutool.core.collection.CollUtil; +import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.metadata.data.DataFormatData; import cn.idev.excel.metadata.data.WriteCellData; import cn.idev.excel.util.StyleUtil; @@ -13,7 +14,6 @@ import cn.idev.excel.write.metadata.style.WriteFont; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFRichTextString; -import org.dromara.common.core.utils.reflect.ReflectUtils; import org.dromara.common.excel.annotation.ExcelNotation; import org.dromara.common.excel.annotation.ExcelRequired; @@ -31,12 +31,12 @@ public class DataWriteHandler implements SheetWriteHandler, CellWriteHandler { /** * 批注 */ - private final Map notationMap; + private final Map notationMap; /** * 头列字体颜色 */ - private final Map headColumnMap; + private final Map headColumnMap; public DataWriteHandler(Class clazz) { @@ -49,15 +49,16 @@ public class DataWriteHandler implements SheetWriteHandler, CellWriteHandler { if (CollUtil.isEmpty(notationMap) && CollUtil.isEmpty(headColumnMap)) { return; } + // 第一行 WriteCellData cellData = context.getFirstCellData(); + // 第一个格子 WriteCellStyle writeCellStyle = cellData.getOrCreateStyle(); - DataFormatData dataFormatData = new DataFormatData(); - // 单元格设置为文本格式 - dataFormatData.setIndex((short) 49); - writeCellStyle.setDataFormatData(dataFormatData); - if (context.getHead()) { + DataFormatData dataFormatData = new DataFormatData(); + // 单元格设置为文本格式 + dataFormatData.setIndex((short) 49); + writeCellStyle.setDataFormatData(dataFormatData); Cell cell = context.getCell(); WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder(); Sheet sheet = writeSheetHolder.getSheet(); @@ -67,17 +68,17 @@ public class DataWriteHandler implements SheetWriteHandler, CellWriteHandler { WriteFont headWriteFont = new WriteFont(); // 加粗 headWriteFont.setBold(true); - if (CollUtil.isNotEmpty(headColumnMap) && headColumnMap.containsKey(cell.getColumnIndex())) { + if (CollUtil.isNotEmpty(headColumnMap) && headColumnMap.containsKey(cell.getStringCellValue())) { // 设置字体颜色 - headWriteFont.setColor(headColumnMap.get(cell.getColumnIndex())); + headWriteFont.setColor(headColumnMap.get(cell.getStringCellValue())); } writeCellStyle.setWriteFont(headWriteFont); CellStyle cellStyle = StyleUtil.buildCellStyle(workbook, null, writeCellStyle); cell.setCellStyle(cellStyle); - if (CollUtil.isNotEmpty(notationMap) && notationMap.containsKey(cell.getColumnIndex())) { + if (CollUtil.isNotEmpty(notationMap) && notationMap.containsKey(cell.getStringCellValue())) { // 批注内容 - String notationContext = notationMap.get(cell.getColumnIndex()); + String notationContext = notationMap.get(cell.getStringCellValue()); // 创建绘图对象 Comment comment = drawing.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), 0, (short) 5, 5)); comment.setString(new XSSFRichTextString(notationContext)); @@ -89,23 +90,16 @@ public class DataWriteHandler implements SheetWriteHandler, CellWriteHandler { /** * 获取必填列 */ - private static Map getRequiredMap(Class clazz) { - Map requiredMap = new HashMap<>(); + private static Map getRequiredMap(Class clazz) { + Map requiredMap = new HashMap<>(); Field[] fields = clazz.getDeclaredFields(); - // 检查 fields 数组是否为空 - if (fields.length == 0) { - return requiredMap; - } - Field[] filteredFields = ReflectUtils.getFields(clazz, field -> !"serialVersionUID".equals(field.getName())); - - for (int i = 0; i < filteredFields.length; i++) { - Field field = filteredFields[i]; + for (Field field : fields) { if (!field.isAnnotationPresent(ExcelRequired.class)) { continue; } ExcelRequired excelRequired = field.getAnnotation(ExcelRequired.class); - int columnIndex = excelRequired.index() == -1 ? i : excelRequired.index(); - requiredMap.put(columnIndex, excelRequired.fontColor().getIndex()); + ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class); + requiredMap.put(excelProperty.value()[0], excelRequired.fontColor().getIndex()); } return requiredMap; } @@ -113,22 +107,16 @@ public class DataWriteHandler implements SheetWriteHandler, CellWriteHandler { /** * 获取批注 */ - private static Map getNotationMap(Class clazz) { - Map notationMap = new HashMap<>(); + private static Map getNotationMap(Class clazz) { + Map notationMap = new HashMap<>(); Field[] fields = clazz.getDeclaredFields(); - // 检查 fields 数组是否为空 - if (fields.length == 0) { - return notationMap; - } - Field[] filteredFields = ReflectUtils.getFields(clazz, field -> !"serialVersionUID".equals(field.getName())); - for (int i = 0; i < filteredFields.length; i++) { - Field field = filteredFields[i]; + for (Field field : fields) { if (!field.isAnnotationPresent(ExcelNotation.class)) { continue; } ExcelNotation excelNotation = field.getAnnotation(ExcelNotation.class); - int columnIndex = excelNotation.index() == -1 ? i : excelNotation.index(); - notationMap.put(columnIndex, excelNotation.value()); + ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class); + notationMap.put(excelProperty.value()[0], excelNotation.value()); } return notationMap; } diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java index d13f75d2a..0d0c5d04e 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java @@ -21,6 +21,11 @@ import java.util.Date; @Slf4j public class InjectionMetaObjectHandler implements MetaObjectHandler { + /** + * 如果用户不存在默认注入-1代表无用户 + */ + private static final Long DEFAULT_USER_ID = -1L; + /** * 插入填充方法,用于在插入数据时自动填充实体对象中的创建时间、更新时间、创建人、更新人等信息 * @@ -44,6 +49,11 @@ public class InjectionMetaObjectHandler implements MetaObjectHandler { baseEntity.setCreateBy(userId); baseEntity.setUpdateBy(userId); baseEntity.setCreateDept(ObjectUtils.notNull(baseEntity.getCreateDept(), loginUser.getDeptId())); + } else { + // 填充创建人、更新人和创建部门信息 + baseEntity.setCreateBy(DEFAULT_USER_ID); + baseEntity.setUpdateBy(DEFAULT_USER_ID); + baseEntity.setCreateDept(ObjectUtils.notNull(baseEntity.getCreateDept(), DEFAULT_USER_ID)); } } } else { @@ -73,6 +83,8 @@ public class InjectionMetaObjectHandler implements MetaObjectHandler { Long userId = LoginHelper.getUserId(); if (ObjectUtil.isNotNull(userId)) { baseEntity.setUpdateBy(userId); + } else { + baseEntity.setUpdateBy(DEFAULT_USER_ID); } } else { this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); @@ -92,7 +104,6 @@ public class InjectionMetaObjectHandler implements MetaObjectHandler { try { loginUser = LoginHelper.getLoginUser(); } catch (Exception e) { - log.warn("自动注入警告 => 用户未登录"); return null; } return loginUser; diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java index 951f3dfe1..ffb864cfe 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java @@ -87,11 +87,14 @@ public class DataPermissionHelper { * @throws NullPointerException 如果数据权限上下文类型异常,则抛出NullPointerException */ public static Map getContext() { - SaStorage saStorage = SaHolder.getStorage(); - Object attribute = saStorage.get(DATA_PERMISSION_KEY); - if (ObjectUtil.isNull(attribute)) { - saStorage.set(DATA_PERMISSION_KEY, new HashMap<>()); + Object attribute = new HashMap<>(); + if (SaHolder.getContext().isValid()) { + SaStorage saStorage = SaHolder.getStorage(); attribute = saStorage.get(DATA_PERMISSION_KEY); + if (ObjectUtil.isNull(attribute)) { + saStorage.set(DATA_PERMISSION_KEY, new HashMap<>()); + attribute = saStorage.get(DATA_PERMISSION_KEY); + } } if (attribute instanceof Map map) { return map; diff --git a/ruoyi-common/ruoyi-common-seata/src/main/java/org/dromara/common/seata/config/SeataConfiguration.java b/ruoyi-common/ruoyi-common-seata/src/main/java/org/dromara/common/seata/config/SeataConfiguration.java index 6b4ddb20d..0d065de0c 100644 --- a/ruoyi-common/ruoyi-common-seata/src/main/java/org/dromara/common/seata/config/SeataConfiguration.java +++ b/ruoyi-common/ruoyi-common-seata/src/main/java/org/dromara/common/seata/config/SeataConfiguration.java @@ -1,8 +1,6 @@ package org.dromara.common.seata.config; -import org.dromara.common.core.factory.YmlPropertySourceFactory; import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.context.annotation.PropertySource; /** * seata 配置 @@ -10,7 +8,6 @@ import org.springframework.context.annotation.PropertySource; * @author Lion Li */ @AutoConfiguration -@PropertySource(value = "classpath:common-seata.yml", factory = YmlPropertySourceFactory.class) public class SeataConfiguration { } diff --git a/ruoyi-common/ruoyi-common-seata/src/main/resources/common-seata.yml b/ruoyi-common/ruoyi-common-seata/src/main/resources/common-seata.yml deleted file mode 100644 index 56be998a0..000000000 --- a/ruoyi-common/ruoyi-common-seata/src/main/resources/common-seata.yml +++ /dev/null @@ -1,23 +0,0 @@ -# 内置配置 不允许修改 如需修改请在 nacos 上写相同配置覆盖 -# seata配置 -seata: - config: - type: nacos - nacos: - server-addr: ${spring.cloud.nacos.server-addr} - group: ${spring.cloud.nacos.config.group} - namespace: ${spring.profiles.active} - username: ${spring.cloud.nacos.username} - password: ${spring.cloud.nacos.password} - data-id: seata-server.properties - registry: - type: nacos - nacos: - application: ruoyi-seata-server - server-addr: ${spring.cloud.nacos.server-addr} - group: ${spring.cloud.nacos.discovery.group} - username: ${spring.cloud.nacos.username} - password: ${spring.cloud.nacos.password} - namespace: ${spring.profiles.active} - # 关闭自动代理 - enable-auto-data-source-proxy: false diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/me/zhyd/oauth/request/AbstractAuthWeChatEnterpriseRequest.java b/ruoyi-common/ruoyi-common-social/src/main/java/me/zhyd/oauth/request/AbstractAuthWeChatEnterpriseRequest.java new file mode 100644 index 000000000..9fd80677a --- /dev/null +++ b/ruoyi-common/ruoyi-common-social/src/main/java/me/zhyd/oauth/request/AbstractAuthWeChatEnterpriseRequest.java @@ -0,0 +1,153 @@ +package me.zhyd.oauth.request; + +import com.alibaba.fastjson.JSONObject; +import me.zhyd.oauth.cache.AuthStateCache; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.config.AuthSource; +import me.zhyd.oauth.enums.AuthResponseStatus; +import me.zhyd.oauth.enums.AuthUserGender; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthToken; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.utils.HttpUtils; +import me.zhyd.oauth.utils.StringUtils; +import me.zhyd.oauth.utils.UrlBuilder; + +/** + *

+ * 企业微信登录父类 + *

+ * + * @author liguanhua (347826496(a)qq.com) + * @since 1.15.9 + */ +public abstract class AbstractAuthWeChatEnterpriseRequest extends AuthDefaultRequest { + + public AbstractAuthWeChatEnterpriseRequest(AuthConfig config, AuthSource source) { + super(config,source); + } + + + public AbstractAuthWeChatEnterpriseRequest(AuthConfig config, AuthSource source, AuthStateCache authStateCache) { + super(config, source, authStateCache); + } + + @Override + public AuthToken getAccessToken(AuthCallback authCallback) { + String response = doGetAuthorizationCode(accessTokenUrl(null)); + + JSONObject object = this.checkResponse(response); + + return AuthToken.builder() + .accessToken(object.getString("access_token")) + .expireIn(object.getIntValue("expires_in")) + .code(authCallback.getCode()) + .build(); + } + + @Override + public AuthUser getUserInfo(AuthToken authToken) { + String response = doGetUserInfo(authToken); + JSONObject object = this.checkResponse(response); + + // 返回 OpenId 或其他,均代表非当前企业用户,不支持 + if (!object.containsKey("UserId")) { + throw new AuthException(AuthResponseStatus.UNIDENTIFIED_PLATFORM, source); + } + String userId = object.getString("UserId"); + String userTicket = object.getString("user_ticket"); + JSONObject userDetail = getUserDetail(authToken.getAccessToken(), userId, userTicket); + + return AuthUser.builder() + .rawUserInfo(userDetail) + .username(userDetail.getString("name")) + .nickname(userDetail.getString("alias")) + .avatar(userDetail.getString("avatar")) + .location(userDetail.getString("address")) + .email(userDetail.getString("email")) + .uuid(userId) + .gender(AuthUserGender.getWechatRealGender(userDetail.getString("gender"))) + .token(authToken) + .source(source.toString()) + .build(); + } + + /** + * 校验请求结果 + * + * @param response 请求结果 + * @return 如果请求结果正常,则返回JSONObject + */ + private JSONObject checkResponse(String response) { + JSONObject object = JSONObject.parseObject(response); + + if (object.containsKey("errcode") && object.getIntValue("errcode") != 0) { + throw new AuthException(object.getString("errmsg"), source); + } + + return object; + } + + + /** + * 返回获取accessToken的url + * + * @param code 授权码 + * @return 返回获取accessToken的url + */ + @Override + protected String accessTokenUrl(String code) { + return UrlBuilder.fromBaseUrl(source.accessToken()) + .queryParam("corpid", config.getClientId()) + .queryParam("corpsecret", config.getClientSecret()) + .build(); + } + + /** + * 返回获取userInfo的url + * + * @param authToken 用户授权后的token + * @return 返回获取userInfo的url + */ + @Override + protected String userInfoUrl(AuthToken authToken) { + return UrlBuilder.fromBaseUrl(source.userInfo()) + .queryParam("access_token", authToken.getAccessToken()) + .queryParam("code", authToken.getCode()) + .build(); + } + + /** + * 用户详情 + * + * @param accessToken accessToken + * @param userId 企业内用户id + * @param userTicket 成员票据,用于获取用户信息或敏感信息 + * @return 用户详情 + */ + private JSONObject getUserDetail(String accessToken, String userId, String userTicket) { + // 用户基础信息 + String userInfoUrl = UrlBuilder.fromBaseUrl("https://qyapi.weixin.qq.com/cgi-bin/user/get") + .queryParam("access_token", accessToken) + .queryParam("userid", userId) + .build(); + String userInfoResponse = new HttpUtils(config.getHttpConfig()).get(userInfoUrl).getBody(); + JSONObject userInfo = checkResponse(userInfoResponse); + + // 用户敏感信息 + if (StringUtils.isNotEmpty(userTicket)) { + String userDetailUrl = UrlBuilder.fromBaseUrl("https://qyapi.weixin.qq.com/cgi-bin/auth/getuserdetail") + .queryParam("access_token", accessToken) + .build(); + JSONObject param = new JSONObject(); + param.put("user_ticket", userTicket); + String userDetailResponse = new HttpUtils(config.getHttpConfig()).post(userDetailUrl, param.toJSONString()).getBody(); + JSONObject userDetail = checkResponse(userDetailResponse); + + userInfo.putAll(userDetail); + } + return userInfo; + } + +} diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index cb9442850..bc19460f8 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -38,8 +38,8 @@ public class SseEmitterManager { // 每个用户可以有多个 SSE 连接,通过 token 进行区分 Map emitters = USER_TOKEN_EMITTERS.computeIfAbsent(userId, k -> new ConcurrentHashMap<>()); - // 创建一个新的 SseEmitter 实例,超时时间设置为 0 表示无限制 - SseEmitter emitter = new SseEmitter(0L); + // 创建一个新的 SseEmitter 实例,超时时间设置为一天 避免连接之后直接关闭浏览器导致连接停滞 + SseEmitter emitter = new SseEmitter(86400000L); emitters.put(token, emitter); diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java index d518becbc..f6d224bd6 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java @@ -48,7 +48,7 @@ public class PlusTenantLineHandler implements TenantLineHandler { "gen_table_column" ); tables.addAll(excludes); - return StringUtils.containsAnyIgnoreCase(tableName, tables.toArray(new String[0])); + return StringUtils.equalsAnyIgnoreCase(tableName, tables.toArray(new String[0])); } return true; } diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java index 8803dca7e..8dbb589dc 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java @@ -1,12 +1,17 @@ package org.dromara.common.web.config; +import cn.hutool.core.date.DateUtil; +import org.dromara.common.core.utils.StringUtils; import org.dromara.common.web.handler.GlobalExceptionHandler; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.annotation.Bean; +import org.springframework.format.FormatterRegistry; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import java.util.Date; + /** * 通用配置 * @@ -20,6 +25,17 @@ public class ResourcesConfig implements WebMvcConfigurer { } + @Override + public void addFormatters(FormatterRegistry registry) { + // 全局日期格式转换配置 + registry.addConverter(String.class, Date.class, source -> { + if (StringUtils.isBlank(source)) { + return null; + } + return DateUtil.parse(source); + }); + } + @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { } diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java index 2896f6c63..56a15ffb0 100644 --- a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java @@ -58,4 +58,9 @@ public class TestDemoBo extends BaseEntity { @NotBlank(message = "值不能为空", groups = {AddGroup.class, EditGroup.class}) private String value; + /** + * 版本 + */ + private Long version; + } diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java index c6595b0e2..642e0f746 100644 --- a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java @@ -2,6 +2,7 @@ package org.dromara.demo.domain.vo; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.format.DateTimeFormat; import org.dromara.common.excel.annotation.ExcelNotation; import org.dromara.common.excel.annotation.ExcelRequired; import org.dromara.common.translation.annotation.Translation; @@ -46,7 +47,7 @@ public class TestDemoVo implements Serializable { * 用户id */ @ExcelRequired - @ExcelProperty(value = "用户id") + @ExcelProperty(value = "用户id", index = 5) private Long userId; /** @@ -73,6 +74,8 @@ public class TestDemoVo implements Serializable { /** * 创建时间 */ + @ExcelRequired + @DateTimeFormat("yyyy-MM-dd HH:mm:ss") @ExcelProperty(value = "创建时间") private Date createTime; @@ -108,4 +111,9 @@ public class TestDemoVo implements Serializable { @ExcelProperty(value = "更新人账号") private String updateByName; + /** + * 版本 + */ + private Long version; + } diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/application.yml b/ruoyi-example/ruoyi-demo/src/main/resources/application.yml index 711df67da..4313f433d 100644 --- a/ruoyi-example/ruoyi-demo/src/main/resources/application.yml +++ b/ruoyi-example/ruoyi-demo/src/main/resources/application.yml @@ -77,6 +77,8 @@ spring: easy-es: # 是否开启EE自动配置 enable: false + # 兼容模式 + compatible: true # es连接地址+端口 格式必须为ip:port,如果是集群则可用逗号隔开 address : localhost:9200 # 默认为http diff --git a/ruoyi-gateway/Dockerfile b/ruoyi-gateway/Dockerfile index 2009e09c0..01eeb0378 100644 --- a/ruoyi-gateway/Dockerfile +++ b/ruoyi-gateway/Dockerfile @@ -1,6 +1,6 @@ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-debian:17.0.11-cds -#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds +FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds +#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds #FROM findepi/graalvm:java17-native LABEL maintainer="Lion Li" diff --git a/ruoyi-modules/ruoyi-gen/Dockerfile b/ruoyi-modules/ruoyi-gen/Dockerfile index f9f8d0611..4427cc226 100644 --- a/ruoyi-modules/ruoyi-gen/Dockerfile +++ b/ruoyi-modules/ruoyi-gen/Dockerfile @@ -1,6 +1,6 @@ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-debian:17.0.11-cds -#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds +FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds +#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds #FROM findepi/graalvm:java17-native LABEL maintainer="Lion Li" diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/controller/GenController.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/controller/GenController.java index c7daa07d1..160374945 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/controller/GenController.java +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/controller/GenController.java @@ -80,11 +80,8 @@ public class GenController extends BaseController { @SaCheckPermission("tool:gen:list") @GetMapping(value = "/column/{tableId}") public TableDataInfo columnList(@PathVariable("tableId") Long tableId) { - TableDataInfo dataInfo = new TableDataInfo<>(); List list = genTableService.selectGenTableColumnListByTableId(tableId); - dataInfo.setRows(list); - dataInfo.setTotal(list.size()); - return dataInfo; + return TableDataInfo.build(list); } /** diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java index d3808ba78..569b2683d 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java @@ -297,13 +297,13 @@ public class GenTableServiceImpl implements IGenTableService { List tableColumns = new ArrayList<>(); columns.forEach((columnName, column) -> { GenTableColumn tableColumn = new GenTableColumn(); - tableColumn.setIsPk(String.valueOf(column.isPrimaryKey())); + tableColumn.setIsPk(column.isPrimaryKey() ? "1" : "0"); tableColumn.setColumnName(column.getName()); tableColumn.setColumnComment(column.getComment()); tableColumn.setColumnType(column.getOriginType().toLowerCase()); tableColumn.setSort(column.getPosition()); - tableColumn.setIsRequired(column.isNullable() == 0 ? "1" : "0"); - tableColumn.setIsIncrement(column.isAutoIncrement() == -1 ? "0" : "1"); + tableColumn.setIsRequired(column.isNullable() ? "1" : "0"); + tableColumn.setIsIncrement(column.isAutoIncrement() ? "1" : "0"); tableColumns.add(tableColumn); }); return tableColumns; diff --git a/ruoyi-modules/ruoyi-job/Dockerfile b/ruoyi-modules/ruoyi-job/Dockerfile index d1d68e3f9..ebb1f9d36 100644 --- a/ruoyi-modules/ruoyi-job/Dockerfile +++ b/ruoyi-modules/ruoyi-job/Dockerfile @@ -1,6 +1,6 @@ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-debian:17.0.11-cds -#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds +FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds +#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds #FROM findepi/graalvm:java17-native LABEL maintainer="Lion Li" diff --git a/ruoyi-modules/ruoyi-resource/Dockerfile b/ruoyi-modules/ruoyi-resource/Dockerfile index f845d5cbe..4708c1a32 100644 --- a/ruoyi-modules/ruoyi-resource/Dockerfile +++ b/ruoyi-modules/ruoyi-resource/Dockerfile @@ -1,6 +1,6 @@ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-debian:17.0.11-cds -#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds +FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds +#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds #FROM findepi/graalvm:java17-native LABEL maintainer="Lion Li" diff --git a/ruoyi-modules/ruoyi-system/Dockerfile b/ruoyi-modules/ruoyi-system/Dockerfile index 7bf60168e..ffc92a6db 100644 --- a/ruoyi-modules/ruoyi-system/Dockerfile +++ b/ruoyi-modules/ruoyi-system/Dockerfile @@ -1,6 +1,6 @@ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-debian:17.0.11-cds -#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds +FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds +#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds #FROM findepi/graalvm:java17-native LABEL maintainer="Lion Li" diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java index cebba60ac..69fd2ab96 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java @@ -6,6 +6,7 @@ import org.dromara.common.core.domain.R; import org.dromara.common.core.utils.StringUtils; import org.redisson.spring.data.connection.RedissonConnectionFactory; import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.core.RedisConnectionUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -31,21 +32,25 @@ public class CacheController { @GetMapping() public R getInfo() throws Exception { RedisConnection connection = connectionFactory.getConnection(); - Properties commandStats = connection.commands().info("commandstats"); - - List> pieList = new ArrayList<>(); - if (commandStats != null) { - commandStats.stringPropertyNames().forEach(key -> { - Map data = new HashMap<>(2); - String property = commandStats.getProperty(key); - data.put("name", StringUtils.removeStart(key, "cmdstat_")); - data.put("value", StringUtils.substringBetween(property, "calls=", ",usec")); - pieList.add(data); - }); + try { + Properties commandStats = connection.commands().info("commandstats"); + List> pieList = new ArrayList<>(); + if (commandStats != null) { + commandStats.stringPropertyNames().forEach(key -> { + Map data = new HashMap<>(2); + String property = commandStats.getProperty(key); + data.put("name", StringUtils.removeStart(key, "cmdstat_")); + data.put("value", StringUtils.substringBetween(property, "calls=", ",usec")); + pieList.add(data); + }); + } + return R.ok(new CacheListInfoVo( + connection.commands().info(), + connection.commands().dbSize(), pieList)); + } finally { + // 归还连接给连接池 + RedisConnectionUtils.releaseConnection(connection, connectionFactory); } - return R.ok(new CacheListInfoVo( - connection.commands().info(), - connection.commands().dbSize(), pieList)); } public record CacheListInfoVo(Properties info, Long dbSize, List> commandStats) {} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java index 1d7878b84..1427833bd 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java @@ -16,6 +16,8 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import jakarta.servlet.http.HttpServletResponse; + +import java.util.Arrays; import java.util.List; /** @@ -120,7 +122,7 @@ public class SysConfigController extends BaseController { @Log(title = "参数管理", businessType = BusinessType.DELETE) @DeleteMapping("/{configIds}") public R remove(@PathVariable Long[] configIds) { - configService.deleteConfigByIds(configIds); + configService.deleteConfigByIds(Arrays.asList(configIds)); return R.ok(); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java index 917d9931e..ae70e35a3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java @@ -19,6 +19,7 @@ import org.springframework.web.bind.annotation.*; import jakarta.servlet.http.HttpServletResponse; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** @@ -117,7 +118,7 @@ public class SysDictDataController extends BaseController { @Log(title = "字典类型", businessType = BusinessType.DELETE) @DeleteMapping("/{dictCodes}") public R remove(@PathVariable Long[] dictCodes) { - dictDataService.deleteDictDataByIds(dictCodes); + dictDataService.deleteDictDataByIds(Arrays.asList(dictCodes)); return R.ok(); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java index 1e51539c0..2fe3d3b43 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java @@ -16,6 +16,8 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import jakarta.servlet.http.HttpServletResponse; + +import java.util.Arrays; import java.util.List; /** @@ -99,7 +101,7 @@ public class SysDictTypeController extends BaseController { @Log(title = "字典类型", businessType = BusinessType.DELETE) @DeleteMapping("/{dictIds}") public R remove(@PathVariable Long[] dictIds) { - dictTypeService.deleteDictTypeByIds(dictIds); + dictTypeService.deleteDictTypeByIds(Arrays.asList(dictIds)); return R.ok(); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java index 8f0eae1f6..29d33601e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java @@ -21,6 +21,7 @@ import org.dromara.system.service.ISysMenuService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.ArrayList; import java.util.List; /** @@ -111,9 +112,14 @@ public class SysMenuController extends BaseController { @GetMapping(value = "/tenantPackageMenuTreeselect/{packageId}") public R tenantPackageMenuTreeselect(@PathVariable("packageId") Long packageId) { List menus = menuService.selectMenuList(LoginHelper.getUserId()); - MenuTreeSelectVo selectVo = new MenuTreeSelectVo( - menuService.selectMenuListByPackageId(packageId), - menuService.buildMenuTreeSelect(menus)); + List> list = menuService.buildMenuTreeSelect(menus); + // 删除租户管理菜单 + list.removeIf(menu -> menu.getId() == 6L); + List ids = new ArrayList<>(); + if (packageId > 0L) { + ids = menuService.selectMenuListByPackageId(packageId); + } + MenuTreeSelectVo selectVo = new MenuTreeSelectVo(ids, list); return R.ok(selectVo); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteTaskAssigneeServiceImpl.java index 4011c597f..87d1c6e28 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteTaskAssigneeServiceImpl.java @@ -3,6 +3,7 @@ package org.dromara.system.dubbo; import cn.hutool.core.convert.Convert; import lombok.RequiredArgsConstructor; import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.system.api.RemoteTaskAssigneeService; @@ -53,6 +54,7 @@ public class RemoteTaskAssigneeServiceImpl implements RemoteTaskAssigneeService SysRoleBo bo = new SysRoleBo(); bo.setRoleKey(taskQuery.getHandlerCode()); bo.setRoleName(taskQuery.getHandlerName()); + bo.setStatus(SystemConstants.NORMAL); Map params = bo.getParams(); params.put("beginTime", taskQuery.getBeginTime()); params.put("endTime", taskQuery.getEndTime()); @@ -75,6 +77,7 @@ public class RemoteTaskAssigneeServiceImpl implements RemoteTaskAssigneeService SysPostBo bo = new SysPostBo(); bo.setPostCategory(taskQuery.getHandlerCode()); bo.setPostName(taskQuery.getHandlerName()); + bo.setStatus(SystemConstants.NORMAL); Map params = bo.getParams(); params.put("beginTime", taskQuery.getBeginTime()); params.put("endTime", taskQuery.getEndTime()); @@ -98,6 +101,7 @@ public class RemoteTaskAssigneeServiceImpl implements RemoteTaskAssigneeService SysDeptBo bo = new SysDeptBo(); bo.setDeptCategory(taskQuery.getHandlerCode()); bo.setDeptName(taskQuery.getHandlerName()); + bo.setStatus(SystemConstants.NORMAL); Map params = bo.getParams(); params.put("beginTime", taskQuery.getBeginTime()); params.put("endTime", taskQuery.getEndTime()); @@ -109,7 +113,6 @@ public class RemoteTaskAssigneeServiceImpl implements RemoteTaskAssigneeService return new RemoteTaskAssigneeVo(page.getTotal(), handlers); } - /** * 查询用户并返回任务指派的列表,支持分页 * @@ -122,6 +125,7 @@ public class RemoteTaskAssigneeServiceImpl implements RemoteTaskAssigneeService SysUserBo bo = new SysUserBo(); bo.setUserName(taskQuery.getHandlerCode()); bo.setNickName(taskQuery.getHandlerName()); + bo.setStatus(SystemConstants.NORMAL); Map params = bo.getParams(); params.put("beginTime", taskQuery.getBeginTime()); params.put("endTime", taskQuery.getEndTime()); diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java index aad3b1a30..23fd16b44 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java @@ -312,7 +312,10 @@ public class RemoteUserServiceImpl implements RemoteUserService { return new ArrayList<>(); } List list = userMapper.selectVoList(new LambdaQueryWrapper() - .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName, SysUser::getEmail, SysUser::getPhonenumber) + .select(SysUser::getUserId, SysUser::getDeptId, SysUser::getUserName, + SysUser::getNickName, SysUser::getUserType, SysUser::getEmail, + SysUser::getPhonenumber, SysUser::getSex, SysUser::getStatus, + SysUser::getCreateTime) .eq(SysUser::getStatus, SystemConstants.NORMAL) .in(SysUser::getUserId, userIds)); return MapstructUtils.convert(list, RemoteUserVo.class); diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java index b69624cf0..cbfdf32f0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java @@ -2,7 +2,6 @@ package org.dromara.system.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.annotation.DataColumn; @@ -30,19 +29,22 @@ public interface SysDeptMapper extends BaseMapperPlus { @DataPermission({ @DataColumn(key = "deptName", value = "dept_id") }) - List selectDeptList(@Param(Constants.WRAPPER) Wrapper queryWrapper); - + default List selectDeptList(Wrapper queryWrapper) { + return this.selectVoList(queryWrapper); + } /** * 分页查询部门管理数据 * + * @param page 分页参数 * @param queryWrapper 查询条件 * @return 部门信息集合 */ @DataPermission({ @DataColumn(key = "deptName", value = "dept_id"), }) - Page selectPageDeptList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - + default Page selectPageDeptList(Page page, Wrapper queryWrapper) { + return this.selectVoPage(page, queryWrapper); + } /** * 统计指定部门ID的部门数量 * @@ -52,8 +54,9 @@ public interface SysDeptMapper extends BaseMapperPlus { @DataPermission({ @DataColumn(key = "deptName", value = "dept_id") }) - long countDeptById(Long deptId); - + default long countDeptById(Long deptId) { + return this.selectCount(new LambdaQueryWrapper().eq(SysDept::getDeptId, deptId)); + } /** * 根据父部门ID查询其所有子部门的列表 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java index f9bf13485..2efa5c888 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java @@ -1,9 +1,7 @@ package org.dromara.system.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.annotation.DataColumn; import org.dromara.common.mybatis.annotation.DataPermission; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; @@ -23,7 +21,9 @@ public interface SysPostMapper extends BaseMapperPlus { @DataColumn(key = "deptName", value = "dept_id"), @DataColumn(key = "userName", value = "create_by") }) - Page selectPagePostList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + default Page selectPagePostList(Page page, Wrapper queryWrapper) { + return this.selectVoPage(page, queryWrapper); + } /** * 查询用户所属岗位组 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java index d754303d3..8aa9dd3ea 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java @@ -16,12 +16,11 @@ public interface SysRoleMenuMapper extends BaseMapperPlus menuIds) { - LambdaUpdateWrapper lqw = new LambdaUpdateWrapper() - .in(SysRoleMenu::getMenuId, menuIds); - return this.delete(lqw); + return this.delete(new LambdaUpdateWrapper().in(SysRoleMenu::getMenuId, menuIds)); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java index fc7fc6e16..851b13a5a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java @@ -1,6 +1,7 @@ package org.dromara.system.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; @@ -21,16 +22,20 @@ import java.util.List; public interface SysUserMapper extends BaseMapperPlus { @DataPermission({ - @DataColumn(key = "deptName", value = "u.dept_id"), - @DataColumn(key = "userName", value = "u.user_id") + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") }) - Page selectPageUserList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + default Page selectPageUserList(Page page, Wrapper queryWrapper) { + return this.selectVoPage(page, queryWrapper); + } @DataPermission({ @DataColumn(key = "deptName", value = "dept_id"), @DataColumn(key = "userName", value = "user_id") }) - List selectUserList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + default List selectUserList(Wrapper queryWrapper) { + return this.selectVoList(queryWrapper); + } /** * 根据条件分页查询用户列表 @@ -47,6 +52,7 @@ public interface SysUserMapper extends BaseMapperPlus { /** * 根据条件分页查询已配用户角色列表 * + * @param page 分页信息 * @param queryWrapper 查询条件 * @return 用户信息集合信息 */ @@ -72,7 +78,9 @@ public interface SysUserMapper extends BaseMapperPlus { @DataColumn(key = "deptName", value = "dept_id"), @DataColumn(key = "userName", value = "user_id") }) - long countUserById(Long userId); + default long countUserById(Long userId) { + return this.selectCount(new LambdaQueryWrapper().eq(SysUser::getUserId, userId)); + } @Override @DataPermission({ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java index f7efda7af..60863b8d3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java @@ -69,7 +69,7 @@ public interface ISysConfigService { * * @param configIds 需要删除的参数ID */ - void deleteConfigByIds(Long[] configIds); + void deleteConfigByIds(List configIds); /** * 重置参数缓存数据 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java index 0e697db60..2ff49bc77 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java @@ -47,7 +47,7 @@ public interface ISysDictDataService { * * @param dictCodes 需要删除的字典数据ID */ - void deleteDictDataByIds(Long[] dictCodes); + void deleteDictDataByIds(List dictCodes); /** * 新增保存字典数据信息 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java index 3b32d6cbb..c2704db09 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java @@ -62,7 +62,7 @@ public interface ISysDictTypeService { * * @param dictIds 需要删除的字典ID */ - void deleteDictTypeByIds(Long[] dictIds); + void deleteDictTypeByIds(List dictIds); /** * 重置字典缓存数据 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java index 98e41d7fe..36390a7ce 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.system.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.crypto.SecureUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -42,11 +43,10 @@ public class SysClientServiceImpl implements ISysClientService { @Override public SysClientVo queryById(Long id) { SysClientVo vo = baseMapper.selectVoById(id); - vo.setGrantTypeList(List.of(vo.getGrantType().split(","))); + vo.setGrantTypeList(StringUtils.splitList(vo.getGrantType())); return vo; } - /** * 查询客户端管理 */ @@ -63,7 +63,7 @@ public class SysClientServiceImpl implements ISysClientService { public TableDataInfo queryPageList(SysClientBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - result.getRecords().forEach(r -> r.setGrantTypeList(List.of(r.getGrantType().split(",")))); + result.getRecords().forEach(r -> r.setGrantTypeList(StringUtils.splitList(r.getGrantType()))); return TableDataInfo.build(result); } @@ -92,8 +92,7 @@ public class SysClientServiceImpl implements ISysClientService { @Override public Boolean insertByBo(SysClientBo bo) { SysClient add = MapstructUtils.convert(bo, SysClient.class); - validEntityBeforeSave(add); - add.setGrantType(String.join(",", bo.getGrantTypeList())); + add.setGrantType(CollUtil.join(bo.getGrantTypeList(), StringUtils.SEPARATOR)); // 生成clientId String clientKey = bo.getClientKey(); String clientSecret = bo.getClientSecret(); @@ -112,7 +111,6 @@ public class SysClientServiceImpl implements ISysClientService { @Override public Boolean updateByBo(SysClientBo bo) { SysClient update = MapstructUtils.convert(bo, SysClient.class); - validEntityBeforeSave(update); update.setGrantType(String.join(",", bo.getGrantTypeList())); return baseMapper.updateById(update) > 0; } @@ -129,22 +127,12 @@ public class SysClientServiceImpl implements ISysClientService { .eq(SysClient::getClientId, clientId)); } - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(SysClient entity) { - //TODO 做一些数据校验,如唯一约束 - } - /** * 批量删除客户端管理 */ @CacheEvict(cacheNames = CacheNames.SYS_CLIENT, allEntries = true) @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - //TODO 做一些业务上的校验,判断是否需要校验 - } return baseMapper.deleteByIds(ids) > 0; } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java index 226f4ddc4..04ecd1375 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java @@ -2,7 +2,6 @@ package org.dromara.system.service.impl; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; -import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -26,7 +25,6 @@ import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; -import java.util.Arrays; import java.util.List; import java.util.Map; @@ -55,7 +53,6 @@ public class SysConfigServiceImpl implements ISysConfigService { * @return 参数配置信息 */ @Override - @DS("master") public SysConfigVo selectConfigById(Long configId) { return baseMapper.selectVoById(configId); } @@ -81,14 +78,10 @@ public class SysConfigServiceImpl implements ISysConfigService { */ @Override public boolean selectRegisterEnabled(String tenantId) { - SysConfig retConfig = TenantHelper.dynamic(tenantId, () -> { - return baseMapper.selectOne(new LambdaQueryWrapper() - .eq(SysConfig::getConfigKey, "sys.account.registerUser")); - }); - if (ObjectUtil.isNull(retConfig)) { - return false; - } - return Convert.toBool(retConfig.getConfigValue()); + String configValue = TenantHelper.dynamic(tenantId, () -> + this.selectConfigByKey("sys.account.registerUser") + ); + return Convert.toBool(configValue); } /** @@ -166,15 +159,15 @@ public class SysConfigServiceImpl implements ISysConfigService { * @param configIds 需要删除的参数ID */ @Override - public void deleteConfigByIds(Long[] configIds) { - for (Long configId : configIds) { - SysConfig config = baseMapper.selectById(configId); + public void deleteConfigByIds(List configIds) { + List list = baseMapper.selectByIds(configIds); + list.forEach(config -> { if (StringUtils.equals(SystemConstants.YES, config.getConfigType())) { - throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey())); + throw new ServiceException(String.format("内置参数【%s】不能删除", config.getConfigKey())); } CacheUtils.evict(CacheNames.SYS_CONFIG, config.getConfigKey()); - } - baseMapper.deleteByIds(Arrays.asList(configIds)); + }); + baseMapper.deleteByIds(configIds); } /** @@ -193,12 +186,10 @@ public class SysConfigServiceImpl implements ISysConfigService { */ @Override public boolean checkConfigKeyUnique(SysConfigBo config) { - long configId = ObjectUtils.notNull(config.getConfigId(), -1L); - SysConfig info = baseMapper.selectOne(new LambdaQueryWrapper().eq(SysConfig::getConfigKey, config.getConfigKey())); - if (ObjectUtil.isNotNull(info) && info.getConfigId() != configId) { - return false; - } - return true; + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysConfig::getConfigKey, config.getConfigKey()) + .ne(ObjectUtil.isNotNull(config.getConfigId()), SysConfig::getConfigId, config.getConfigId())); + return !exist; } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index 95e07e1ee..7107b4ac2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -128,23 +128,17 @@ public class SysDeptServiceImpl implements ISysDeptService { if (CollUtil.isEmpty(depts)) { return CollUtil.newArrayList(); } - // 获取当前列表中每一个节点的parentId,然后在列表中查找是否有id与其parentId对应,若无对应,则表明此时节点列表中,该节点在当前列表中属于顶级节点 - List> treeList = CollUtil.newArrayList(); - for (SysDeptVo d : depts) { - Long parentId = d.getParentId(); - SysDeptVo sysDeptVo = depts.stream().filter(it -> it.getDeptId().longValue() == parentId).findFirst().orElse(null); - if (sysDeptVo == null) { - List> trees = TreeBuildUtils.build(depts, parentId, (dept, tree) -> - tree.setId(dept.getDeptId()) - .setParentId(dept.getParentId()) - .setName(dept.getDeptName()) - .setWeight(dept.getOrderNum()) - .putExtra("disabled", SystemConstants.DISABLE.equals(dept.getStatus()))); - Tree tree = StreamUtils.findFirst(trees, it -> it.getId().longValue() == d.getDeptId()); - treeList.add(tree); - } - } - return treeList; + return TreeBuildUtils.buildMultiRoot( + depts, + SysDeptVo::getDeptId, + SysDeptVo::getParentId, + (node, treeNode) -> treeNode + .setId(node.getDeptId()) + .setParentId(node.getParentId()) + .setName(node.getDeptName()) + .setWeight(node.getOrderNum()) + .putExtra("disabled", SystemConstants.DISABLE.equals(node.getStatus())) + ); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java index 07c8227f2..baf1bba99 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java @@ -8,7 +8,6 @@ import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.ObjectUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -95,12 +94,10 @@ public class SysDictDataServiceImpl implements ISysDictDataService { * @param dictCodes 需要删除的字典数据ID */ @Override - public void deleteDictDataByIds(Long[] dictCodes) { - for (Long dictCode : dictCodes) { - SysDictData data = baseMapper.selectById(dictCode); - baseMapper.deleteById(dictCode); - CacheUtils.evict(CacheNames.SYS_DICT, data.getDictType()); - } + public void deleteDictDataByIds(List dictCodes) { + List list = baseMapper.selectByIds(dictCodes); + baseMapper.deleteByIds(dictCodes); + list.forEach(x -> CacheUtils.evict(CacheNames.SYS_DICT, x.getDictType())); } /** @@ -145,13 +142,11 @@ public class SysDictDataServiceImpl implements ISysDictDataService { */ @Override public boolean checkDictDataUnique(SysDictDataBo dict) { - Long dictCode = ObjectUtils.notNull(dict.getDictCode(), -1L); - SysDictData entity = baseMapper.selectOne(new LambdaQueryWrapper() - .eq(SysDictData::getDictType, dict.getDictType()).eq(SysDictData::getDictValue, dict.getDictValue())); - if (ObjectUtil.isNotNull(entity) && !dictCode.equals(entity.getDictCode())) { - return false; - } - return true; + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysDictData::getDictType, dict.getDictType()) + .eq(SysDictData::getDictValue, dict.getDictValue()) + .ne(ObjectUtil.isNotNull(dict.getDictCode()), SysDictData::getDictCode, dict.getDictCode())); + return !exist; } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java index fa5059517..b079b06f1 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java @@ -28,7 +28,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Map; @@ -94,10 +93,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService { @Override public List selectDictDataByType(String dictType) { List dictDatas = dictDataMapper.selectDictDataByType(dictType); - if (CollUtil.isNotEmpty(dictDatas)) { - return dictDatas; - } - return null; + return CollUtil.isNotEmpty(dictDatas) ? dictDatas : null; } /** @@ -129,17 +125,20 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService { * @param dictIds 需要删除的字典ID */ @Override - public void deleteDictTypeByIds(Long[] dictIds) { - for (Long dictId : dictIds) { - SysDictType dictType = baseMapper.selectById(dictId); - if (dictDataMapper.exists(new LambdaQueryWrapper() - .eq(SysDictData::getDictType, dictType.getDictType()))) { - throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName())); + public void deleteDictTypeByIds(List dictIds) { + List list = baseMapper.selectByIds(dictIds); + list.forEach(x -> { + boolean assigned = dictDataMapper.exists(new LambdaQueryWrapper() + .eq(SysDictData::getDictType, x.getDictType())); + if (assigned) { + throw new ServiceException(String.format("%1$s已分配,不能删除", x.getDictName())); } - CacheUtils.evict(CacheNames.SYS_DICT, dictType.getDictType()); - CacheUtils.evict(CacheNames.SYS_DICT_TYPE, dictType.getDictType()); - } - baseMapper.deleteByIds(Arrays.asList(dictIds)); + }); + baseMapper.deleteByIds(dictIds); + list.forEach(x -> { + CacheUtils.evict(CacheNames.SYS_DICT, x.getDictType()); + CacheUtils.evict(CacheNames.SYS_DICT_TYPE, x.getDictType()); + }); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java index 3e82953f8..89a09f7f4 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.Constants; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StreamUtils; @@ -142,7 +143,7 @@ public class SysMenuServiceImpl implements ISysMenuService { } else { menus = baseMapper.selectMenuTreeByUserId(userId); } - return getChildPerms(menus, 0); + return getChildPerms(menus, Constants.TOP_PARENT_ID); } /** @@ -221,7 +222,7 @@ public class SysMenuServiceImpl implements ISysMenuService { children.setQuery(menu.getQueryParam()); childrenList.add(children); router.setChildren(childrenList); - } else if (menu.getParentId().intValue() == 0 && menu.isInnerLink()) { + } else if (menu.getParentId().equals(Constants.TOP_PARENT_ID) && menu.isInnerLink()) { router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); router.setPath("/"); List childrenList = new ArrayList<>(); @@ -375,11 +376,11 @@ public class SysMenuServiceImpl implements ISysMenuService { * @param parentId 传入的父节点ID * @return String */ - private List getChildPerms(List list, int parentId) { + private List getChildPerms(List list, Long parentId) { List returnList = new ArrayList<>(); for (SysMenu t : list) { // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 - if (t.getParentId() == parentId) { + if (t.getParentId().equals(parentId)) { recursionFn(list, t); returnList.add(t); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index e7e8407ed..f4c4ccad2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -67,15 +67,9 @@ public class SysUserServiceImpl implements ISysUserService { */ @Override public List selectUserExportList(SysUserBo user) { - return baseMapper.selectUserExportList(this.buildQueryWrapper(user)); - } - - private Wrapper buildQueryWrapper(SysUserBo user) { Map params = user.getParams(); QueryWrapper wrapper = Wrappers.query(); wrapper.eq("u.del_flag", SystemConstants.NORMAL) - .eq(ObjectUtil.isNotNull(user.getUserId()), "u.user_id", user.getUserId()) - .in(StringUtils.isNotBlank(user.getUserIds()), "u.user_id", StringUtils.splitTo(user.getUserIds(), Convert::toLong)) .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) .like(StringUtils.isNotBlank(user.getNickName()), "u.nick_name", user.getNickName()) .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus()) @@ -88,8 +82,29 @@ public class SysUserServiceImpl implements ISysUserService { ids.add(user.getDeptId()); w.in("u.dept_id", ids); }).orderByAsc("u.user_id"); + return baseMapper.selectUserExportList(wrapper); + } + + private Wrapper buildQueryWrapper(SysUserBo user) { + Map params = user.getParams(); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(SysUser::getDelFlag, SystemConstants.NORMAL) + .eq(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId()) + .in(StringUtils.isNotBlank(user.getUserIds()), SysUser::getUserId, StringUtils.splitTo(user.getUserIds(), Convert::toLong)) + .like(StringUtils.isNotBlank(user.getUserName()), SysUser::getUserName, user.getUserName()) + .like(StringUtils.isNotBlank(user.getNickName()), SysUser::getNickName, user.getNickName()) + .eq(StringUtils.isNotBlank(user.getStatus()), SysUser::getStatus, user.getStatus()) + .like(StringUtils.isNotBlank(user.getPhonenumber()), SysUser::getPhonenumber, user.getPhonenumber()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + SysUser::getCreateTime, params.get("beginTime"), params.get("endTime")) + .and(ObjectUtil.isNotNull(user.getDeptId()), w -> { + List deptList = deptMapper.selectListByParentId(user.getDeptId()); + List ids = StreamUtils.toList(deptList, SysDept::getDeptId); + ids.add(user.getDeptId()); + w.in(SysUser::getDeptId, ids); + }).orderByAsc(SysUser::getUserId); if (StringUtils.isNotBlank(user.getExcludeUserIds())) { - wrapper.notIn("u.user_id", StringUtils.splitList(user.getExcludeUserIds())); + wrapper.notIn(SysUser::getUserId, StringUtils.splitList(user.getExcludeUserIds())); } return wrapper; } diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml index 9057a0e22..6c5d89d92 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -7,32 +7,6 @@ - - - - - - - select - - ${ew.getSqlSelect} - - - * - - from sys_post ${ew.getCustomSqlSegment} - - - select - - ${ew.getSqlSelect} - - - u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, - u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark - - from sys_user u - ${ew.getCustomSqlSegment} - - - - - - - diff --git a/ruoyi-modules/ruoyi-workflow/Dockerfile b/ruoyi-modules/ruoyi-workflow/Dockerfile index fad7f3c28..f3738cab3 100644 --- a/ruoyi-modules/ruoyi-workflow/Dockerfile +++ b/ruoyi-modules/ruoyi-workflow/Dockerfile @@ -1,6 +1,6 @@ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-debian:17.0.11-cds -#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds +FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds +#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds #FROM findepi/graalvm:java17-native LABEL maintainer="Lion Li" diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index 5528ff21e..1fee0bdbb 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -87,6 +87,12 @@ org.dromara ruoyi-api-workflow + + + org.dromara + ruoyi-common-bus + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java index f3290b841..aaa640bfb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java @@ -73,4 +73,9 @@ public interface FlowConstant { */ String MESSAGE_NOTICE = "messageNotice"; + /** + * 任务状态 + */ + String WF_TASK_STATUS = "wf_task_status"; + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java index 5feb8dbcb..360fc3b81 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java @@ -65,13 +65,13 @@ public class CompleteTaskBo implements Serializable { /** * 扩展变量(此处为逗号分隔的ossId) - * @return */ private String ext; public Map getVariables() { if (variables == null) { - return new HashMap<>(16); + variables = new HashMap<>(16); + return variables; } variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); return variables; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java index 57777edde..4c9b4e936 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java @@ -42,14 +42,12 @@ public class TestLeaveVo implements Serializable { * 开始时间 */ @ExcelProperty(value = "开始时间") - @JsonFormat(pattern = "yyyy-MM-dd") private Date startDate; /** * 结束时间 */ @ExcelProperty(value = "结束时间") - @JsonFormat(pattern = "yyyy-MM-dd") private Date endDate; /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java index d2c0b3a4d..4a59f258a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java @@ -29,7 +29,9 @@ public interface FlwCategoryMapper extends BaseMapperPlus().eq(FlowCategory::getCategoryId, categoryId)); + } /** * 根据父流程分类ID查询其所有子流程分类的列表 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java index 8c73b59ee..883a967aa 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java @@ -26,12 +26,6 @@ public class CategoryNameTranslationImpl implements TranslationInterface @Override public String translation(Object key, String other) { - Long id = null; - if (key instanceof String categoryId) { - id = Convert.toLong(categoryId); - } else if (key instanceof Long categoryId) { - id = categoryId; - } - return flwCategoryService.selectCategoryNameById(id); + return flwCategoryService.selectCategoryNameById(Convert.toLong(key)); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java index db1b7b7f0..dc8d6c833 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java @@ -95,27 +95,20 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService { */ @Override public List> selectCategoryTreeList(FlowCategoryBo category) { - LambdaQueryWrapper lqw = buildQueryWrapper(category); - List categorys = baseMapper.selectVoList(lqw); - if (CollUtil.isEmpty(categorys)) { + List categoryList = this.queryList(category); + if (CollUtil.isEmpty(categoryList)) { return CollUtil.newArrayList(); } - // 获取当前列表中每一个节点的parentId,然后在列表中查找是否有id与其parentId对应,若无对应,则表明此时节点列表中,该节点在当前列表中属于顶级节点 - List> treeList = CollUtil.newArrayList(); - for (FlowCategoryVo d : categorys) { - String parentId = d.getParentId().toString(); - FlowCategoryVo categoryVo = StreamUtils.findFirst(categorys, it -> it.getCategoryId().toString().equals(parentId)); - if (ObjectUtil.isNull(categoryVo)) { - List> trees = TreeBuildUtils.build(categorys, parentId, (dept, tree) -> - tree.setId(dept.getCategoryId().toString()) - .setParentId(dept.getParentId().toString()) - .setName(dept.getCategoryName()) - .setWeight(dept.getOrderNum())); - Tree tree = StreamUtils.findFirst(trees, it -> it.getId().equals(d.getCategoryId().toString())); - treeList.add(tree); - } - } - return treeList; + return TreeBuildUtils.buildMultiRoot( + categoryList, + node -> String.valueOf(node.getCategoryId()), + node -> String.valueOf(node.getParentId()), + (node, treeNode) -> treeNode + .setId(String.valueOf(node.getCategoryId())) + .setParentId(String.valueOf(node.getParentId())) + .setName(node.getCategoryName()) + .setWeight(node.getOrderNum()) + ); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java new file mode 100644 index 000000000..ba4319b87 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java @@ -0,0 +1,251 @@ +package org.dromara.workflow.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.service.DictService; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.ServletUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.system.api.RemoteDeptService; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.vo.RemoteUserVo; +import org.dromara.warm.flow.core.dto.DefJson; +import org.dromara.warm.flow.core.dto.NodeJson; +import org.dromara.warm.flow.core.dto.PromptContent; +import org.dromara.warm.flow.core.enums.NodeType; +import org.dromara.warm.flow.core.utils.MapUtil; +import org.dromara.warm.flow.orm.entity.FlowHisTask; +import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; +import org.dromara.warm.flow.ui.service.ChartExtService; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.dromara.workflow.common.constant.FlowConstant; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 流程图提示信息 + * + * @author AprilWind + */ +@ConditionalOnEnable +@Slf4j +@RequiredArgsConstructor +@Service +public class FlwChartExtServiceImpl implements ChartExtService { + + private final FlowHisTaskMapper flowHisTaskMapper; + private final DictService dictService; + + @DubboReference + private RemoteUserService remoteUserService; + @DubboReference + private RemoteDeptService remoteDeptService; + + /** + * 设置流程图提示信息 + * + * @param defJson 流程定义json对象 + */ + @Override + public void execute(DefJson defJson) { + // 临时修复 后续版本将通过defjson获取流程实例ID + String[] parts = ServletUtils.getRequest().getRequestURI().split("/"); + Long instanceId = Convert.toLong(parts[parts.length - 1]); + + // 根据流程实例ID查询所有相关的历史任务列表 + List flowHisTasks = this.getHisTaskGroupedByNode(instanceId); + if (CollUtil.isEmpty(flowHisTasks)) { + return; + } + + // 按节点编号(nodeCode)对历史任务进行分组 + Map> groupedByNode = StreamUtils.groupByKey(flowHisTasks, FlowHisTask::getNodeCode); + + // 批量查询所有审批人的用户信息 + List userDTOList = remoteUserService.selectListByIds(StreamUtils.toList(flowHisTasks, e -> Convert.toLong(e.getApprover()))); + + // 将查询到的用户列表转换为以用户ID为key的映射 + Map userMap = StreamUtils.toIdentityMap(userDTOList, RemoteUserVo::getUserId); + + Map dictType = dictService.getAllDictByDictType(FlowConstant.WF_TASK_STATUS); + + // 遍历流程定义中的每个节点,调用处理方法,将对应节点的任务列表及用户信息传入,生成扩展提示内容 + for (NodeJson nodeJson : defJson.getNodeList()) { + // 获取当前节点对应的历史任务列表,如果没有则返回空列表避免空指针 + List taskList = groupedByNode.get(nodeJson.getNodeCode()); + if (CollUtil.isEmpty(taskList)) { + continue; + } + // 处理当前节点的扩展信息,包括构建审批人提示内容等 + this.processNodeExtInfo(nodeJson, taskList, userMap, dictType); + } + } + + /** + * 初始化流程图提示信息 + * + * @param defJson 流程定义json对象 + */ + @Override + public void initPromptContent(DefJson defJson) { + defJson.setTopText("流程名称: " + defJson.getFlowName()); + defJson.getNodeList().forEach(nodeJson -> { + nodeJson.setPromptContent( + new PromptContent() + // 提示信息 + .setInfo( + CollUtil.newArrayList( + new PromptContent.InfoItem() + .setPrefix("任务名称: ") + .setContent(nodeJson.getNodeName()) + .setContentStyle(Map.of( + "border", "1px solid #d1e9ff", + "backgroundColor", "#e8f4ff", + "padding", "4px 8px", + "borderRadius", "4px" + )) + .setRowStyle(Map.of( + "fontWeight", "bold", + "margin", "0 0 6px 0", + "padding", "0 0 8px 0", + "borderBottom", "1px solid #ccc" + )) + ) + ) + // 弹窗样式 + .setDialogStyle(MapUtil.mergeAll( + "position", "absolute", + "backgroundColor", "#fff", + "border", "1px solid #ccc", + "borderRadius", "4px", + "boxShadow", "0 2px 8px rgba(0, 0, 0, 0.15)", + "padding", "8px 12px", + "fontSize", "14px", + "zIndex", "1000", + "maxWidth", "500px", + "overflowY", "visible", + "overflowX", "hidden", + "color", "#333", + "pointerEvents", "auto", + "scrollbarWidth", "thin" + )) + ); + }); + } + + /** + * 处理节点的扩展信息,构建用于流程图悬浮提示的内容 + * + * @param nodeJson 当前节点对象 + * @param taskList 当前节点对应的历史审批任务列表 + */ + private void processNodeExtInfo(NodeJson nodeJson, List taskList, Map userMap, Map dictType) { + + // 获取节点提示内容对象中的 info 列表,用于追加提示项 + List info = nodeJson.getPromptContent().getInfo(); + + // 遍历所有任务记录,构建提示内容 + for (FlowHisTask task : taskList) { + RemoteUserVo userDTO = userMap.get(Convert.toLong(task.getApprover())); + if (ObjectUtil.isEmpty(userDTO)) { + continue; + } + + // 查询用户所属部门名称 + String deptName = remoteDeptService.selectDeptNameByIds(Convert.toStr(userDTO.getDeptId())); + + // 添加标题项,如:👤 张三(市场部) + info.add(new PromptContent.InfoItem() + .setPrefix(StringUtils.format("👥 {}({})", userDTO.getNickName(), deptName)) + .setPrefixStyle(Map.of( + "fontWeight", "bold", + "fontSize", "15px", + "color", "#333" + )) + .setRowStyle(Map.of( + "margin", "8px 0", + "borderBottom", "1px dashed #ccc" + )) + ); + + // 添加具体信息项:账号、耗时、时间 + info.add(buildInfoItem("用户账号", userDTO.getUserName())); + info.add(buildInfoItem("审批状态", dictType.get(task.getFlowStatus()))); + info.add(buildInfoItem("审批耗时", DateUtils.getTimeDifference(task.getUpdateTime(), task.getCreateTime()))); + info.add(buildInfoItem("办理时间", DateUtils.formatDateTime(task.getUpdateTime()))); + } + } + + /** + * 构建单条提示内容对象 InfoItem,用于悬浮窗显示(key: value) + * + * @param key 字段名(作为前缀) + * @param value 字段值 + * @return 提示项对象 + */ + private PromptContent.InfoItem buildInfoItem(String key, String value) { + return new PromptContent.InfoItem() + // 前缀 + .setPrefix(key + ": ") + // 前缀样式 + .setPrefixStyle(Map.of( + "textAlign", "right", + "color", "#444", + "userSelect", "none", + "display", "inline-block", + "width", "100px", + "paddingRight", "8px", + "fontWeight", "500", + "fontSize", "14px", + "lineHeight", "24px", + "verticalAlign", "middle" + )) + // 内容 + .setContent(value) + // 内容样式 + .setContentStyle(Map.of( + "backgroundColor", "#f7faff", + "color", "#005cbf", + "padding", "4px 8px", + "fontSize", "14px", + "borderRadius", "4px", + "whiteSpace", "normal", + "border", "1px solid #d0e5ff", + "userSelect", "text", + "lineHeight", "20px" + )) + // 行样式 + .setRowStyle(Map.of( + "color", "#222", + "alignItems", "center", + "display", "flex", + "marginBottom", "6px", + "fontWeight", "400", + "fontSize", "14px" + )); + } + + /** + * 根据流程实例ID获取历史任务列表 + * + * @param instanceId 流程实例ID + * @return 历史任务列表 + */ + public List getHisTaskGroupedByNode(Long instanceId) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(FlowHisTask::getInstanceId, instanceId) + .eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()) + .orderByDesc(FlowHisTask::getCreateTime, FlowHisTask::getUpdateTime); + return flowHisTaskMapper.selectList(wrapper); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index 7936210d0..a82b833e7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -96,10 +96,8 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { LambdaQueryWrapper wrapper = buildQueryWrapper(flowDefinition); wrapper.in(FlowDefinition::getIsPublish, Arrays.asList(PublishStatus.UNPUBLISHED.getKey(), PublishStatus.EXPIRED.getKey())); Page page = flowDefinitionMapper.selectPage(pageQuery.build(), wrapper); - TableDataInfo build = TableDataInfo.build(); - build.setRows(BeanUtil.copyToList(page.getRecords(), FlowDefinitionVo.class)); - build.setTotal(page.getTotal()); - return build; + List list = BeanUtil.copyToList(page.getRecords(), FlowDefinitionVo.class); + return new TableDataInfo<>(list, page.getTotal()); } private LambdaQueryWrapper buildQueryWrapper(FlowDefinition flowDefinition) { diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index b86d0f36c..0c1f21b7c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -304,9 +304,9 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { } //历史任务 LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.eq(FlowHisTask::getInstanceId, instanceId); - wrapper.eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()); - wrapper.orderByDesc(FlowHisTask::getCreateTime).orderByDesc(FlowHisTask::getUpdateTime); + wrapper.eq(FlowHisTask::getInstanceId, instanceId) + .eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()) + .orderByDesc(FlowHisTask::getCreateTime, FlowHisTask::getUpdateTime); List flowHisTasks = flowHisTaskMapper.selectList(wrapper); if (CollUtil.isNotEmpty(flowHisTasks)) { list.addAll(BeanUtil.copyToList(flowHisTasks, FlowHisTaskVo.class)); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java index 03dcf2d0a..ccb5106e7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java @@ -2,6 +2,7 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Pair; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; @@ -238,13 +239,21 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand * @return Pair(TaskAssigneeEnum, Long),如果格式非法返回 null */ private Pair parseStorageId(String storageId) { + if (StringUtils.isBlank(storageId)) { + return null; + } + // 跳过以 $ 或 # 开头的字符串 + if (StringUtils.startsWith(storageId, "$") || StringUtils.startsWith(storageId, "#")) { + log.debug("跳过 storageId 解析,检测到内置变量表达式:{}", storageId); + return null; + } try { String[] parts = storageId.split(StrUtil.COLON, 2); if (parts.length < 2) { - return Pair.of(TaskAssigneeEnum.USER, Long.valueOf(parts[0])); + return Pair.of(TaskAssigneeEnum.USER, Convert.toLong(parts[0])); } else { TaskAssigneeEnum type = TaskAssigneeEnum.fromCode(parts[0] + StrUtil.COLON); - return Pair.of(type, Long.valueOf(parts[1])); + return Pair.of(type, Convert.toLong(parts[1])); } } catch (Exception e) { log.warn("解析 storageId 失败,格式非法:{},错误信息:{}", storageId, e.getMessage()); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 07db03dde..1e4972def 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -534,7 +534,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService { //构建以下节点数据 List buildNextTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, FlowParams.build())); //办理人变量替换 - ExpressionUtil.evalVariable(buildNextTaskList, mergeVariable); + ExpressionUtil.evalVariable(buildNextTaskList, + FlowParams.build() + .variable(mergeVariable) + ); for (FlowNode flowNode : nextFlowNodes) { buildNextTaskList.stream().filter(t -> t.getNodeCode().equals(flowNode.getNodeCode())).findFirst().ifPresent(t -> { if (CollUtil.isNotEmpty(t.getPermissionList())) { @@ -718,7 +721,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { for (Map.Entry> entry : listMap.entrySet()) { List value = entry.getValue(); if (CollUtil.isNotEmpty(value)) { - List userDtoList = remoteUserService.selectListByIds(StreamUtils.toList(value, e -> Long.valueOf(e.getProcessedBy()))); + List userDtoList = remoteUserService.selectListByIds(StreamUtils.toList(value, e -> Convert.toLong(e.getProcessedBy()))); map.put(entry.getKey(), userDtoList); } } @@ -737,7 +740,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { if (CollUtil.isEmpty(userList)) { return Collections.emptyList(); } - return remoteUserService.selectListByIds(StreamUtils.toList(userList, e -> Long.valueOf(e.getProcessedBy()))); + return remoteUserService.selectListByIds(StreamUtils.toList(userList, e -> Convert.toLong(e.getProcessedBy()))); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java index 0b227a4de..4cb2f4c4a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java @@ -147,7 +147,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService { public void processHandler(ProcessEvent processEvent) { TenantHelper.dynamic(processEvent.getTenantId(), () -> { log.info("当前任务执行了{}", processEvent.toString()); - TestLeave testLeave = baseMapper.selectById(Long.valueOf(processEvent.getBusinessId())); + TestLeave testLeave = baseMapper.selectById(Convert.toLong(processEvent.getBusinessId())); testLeave.setStatus(processEvent.getStatus()); // 用于例如审批附件 审批意见等 存储到业务表内 自行根据业务实现存储流程 Map params = processEvent.getParams(); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwCategoryMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwCategoryMapper.xml index e9918f1f2..10c948d85 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwCategoryMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwCategoryMapper.xml @@ -4,8 +4,4 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - diff --git a/ruoyi-visual/ruoyi-monitor/Dockerfile b/ruoyi-visual/ruoyi-monitor/Dockerfile index db3787344..0b9c718d8 100644 --- a/ruoyi-visual/ruoyi-monitor/Dockerfile +++ b/ruoyi-visual/ruoyi-monitor/Dockerfile @@ -1,6 +1,6 @@ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-debian:17.0.11-cds -#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds +FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds +#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds #FROM findepi/graalvm:java17-native LABEL maintainer="Lion Li" diff --git a/ruoyi-visual/ruoyi-nacos/Dockerfile b/ruoyi-visual/ruoyi-nacos/Dockerfile index 68aac228c..9b14944ec 100644 --- a/ruoyi-visual/ruoyi-nacos/Dockerfile +++ b/ruoyi-visual/ruoyi-nacos/Dockerfile @@ -1,6 +1,6 @@ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-debian:17.0.11-cds -#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds +FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds +#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds #FROM findepi/graalvm:java17-native LABEL maintainer="Lion Li" diff --git a/ruoyi-visual/ruoyi-nacos/pom.xml b/ruoyi-visual/ruoyi-nacos/pom.xml index 6212624a5..b59bb4898 100644 --- a/ruoyi-visual/ruoyi-nacos/pom.xml +++ b/ruoyi-visual/ruoyi-nacos/pom.xml @@ -213,17 +213,17 @@ org.apache.tomcat.embed tomcat-embed-websocket - 9.0.98 + 9.0.105 org.apache.tomcat.embed tomcat-embed-core - 9.0.98 + 9.0.105 org.apache.tomcat.embed tomcat-embed-el - 9.0.98 + 9.0.105 org.springframework.boot diff --git a/ruoyi-visual/ruoyi-seata-server/Dockerfile b/ruoyi-visual/ruoyi-seata-server/Dockerfile index ea6f2d38c..3e004a534 100644 --- a/ruoyi-visual/ruoyi-seata-server/Dockerfile +++ b/ruoyi-visual/ruoyi-seata-server/Dockerfile @@ -1,6 +1,6 @@ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-debian:17.0.11-cds -#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds +FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds +#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds #FROM findepi/graalvm:java17-native LABEL maintainer="Lion Li" diff --git a/ruoyi-visual/ruoyi-seata-server/pom.xml b/ruoyi-visual/ruoyi-seata-server/pom.xml index cff7c2440..6491fffa3 100644 --- a/ruoyi-visual/ruoyi-seata-server/pom.xml +++ b/ruoyi-visual/ruoyi-seata-server/pom.xml @@ -27,11 +27,11 @@ jar - 2.3.0 + 2.4.0 2.7.18 5.3.39 2.0 - 9.0.98 + 9.0.105 7.2 3.8.0 1.9.13 @@ -161,6 +161,12 @@ ${seata.version} + + org.apache.seata + seata-all + ${seata.version} + + org.apache.seata seata-core @@ -199,11 +205,11 @@ ${seata.version} - - org.apache.seata - seata-console - ${seata.version} - + + + + + diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/org/apache/seata/core/store/db/AbstractDataSourceProvider.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/org/apache/seata/core/store/db/AbstractDataSourceProvider.java index 4603d2cb6..a1aa3c1da 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/org/apache/seata/core/store/db/AbstractDataSourceProvider.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/org/apache/seata/core/store/db/AbstractDataSourceProvider.java @@ -16,13 +16,14 @@ */ package org.apache.seata.core.store.db; +import org.apache.seata.common.ConfigurationKeys; +import org.apache.seata.common.exception.ShouldNeverHappenException; import org.apache.seata.common.exception.StoreException; import org.apache.seata.common.executor.Initialize; import org.apache.seata.common.util.ConfigTools; import org.apache.seata.common.util.StringUtils; import org.apache.seata.config.Configuration; import org.apache.seata.config.ConfigurationFactory; -import org.apache.seata.core.constants.ConfigurationKeys; import org.apache.seata.core.constants.DBType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,13 +56,13 @@ public abstract class AbstractDataSourceProvider implements DataSourceProvider, */ protected static final Configuration CONFIG = ConfigurationFactory.getInstance(); - private final static String MYSQL_DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver"; + private static final String MYSQL_DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver"; - private final static String MYSQL8_DRIVER_CLASS_NAME = "com.mysql.cj.jdbc.Driver"; + private static final String MYSQL8_DRIVER_CLASS_NAME = "com.mysql.cj.jdbc.Driver"; - private final static String MYSQL_DRIVER_FILE_PREFIX = "mysql-connector-java-"; + private static final String MYSQL_DRIVER_FILE_PREFIX = "mysql-connector-j"; - private final static Map MYSQL_DRIVER_LOADERS; + private static final Map MYSQL_DRIVER_LOADERS; private static final long DEFAULT_DB_MAX_WAIT = 5000; @@ -85,7 +86,7 @@ public abstract class AbstractDataSourceProvider implements DataSourceProvider, } public void validate() { - //valid driver class name + // valid driver class name String driverClassName = getDriverClassName(); // ClassLoader loader = getDriverClassLoader(); // if (null == loader) { @@ -95,15 +96,31 @@ public abstract class AbstractDataSourceProvider implements DataSourceProvider, // loader.loadClass(driverClassName); Class.forName(driverClassName); } catch (ClassNotFoundException exx) { - String driverClassPath = null; String folderPath = System.getProperty("loader.path"); - if (null != folderPath) { - driverClassPath = folderPath + "/jdbc/"; + if (folderPath == null) { + folderPath = System.getProperty("java.class.path"); } + String driverClassPath = Stream.of(folderPath.split(File.pathSeparator)) + .map(File::new) + .filter(File::exists) + .map(file -> file.isFile() ? file.getParentFile() : file) + .filter(Objects::nonNull) + .filter(File::isDirectory) + // Only the MySQL driver needs to be placed in the jdbc folder. + .map(file -> (MYSQL8_DRIVER_CLASS_NAME.equals(driverClassName) + || MYSQL_DRIVER_CLASS_NAME.equals(driverClassName)) + ? new File(file, "jdbc") + : file) + .filter(File::exists) + .filter(File::isDirectory) + .distinct() + .findAny() + .map(File::getAbsolutePath) + .orElseThrow(() -> new ShouldNeverHappenException("cannot find jdbc folder")); throw new StoreException(String.format( - "The driver {%s} cannot be found in the path %s. Please ensure that the appropriate database driver dependencies are included in the classpath.", driverClassName, driverClassPath)); + "The driver {%s} cannot be found in the path %s. Please ensure that the appropriate database driver dependencies are included in the classpath.", + driverClassName, driverClassPath)); } - } /** * generate the datasource @@ -140,17 +157,20 @@ public abstract class AbstractDataSourceProvider implements DataSourceProvider, * @return the db max wait */ protected Long getMaxWait() { - Long maxWait = CONFIG.getLong(ConfigurationKeys.STORE_DB_MAX_WAIT, DEFAULT_DB_MAX_WAIT); - return maxWait; + return CONFIG.getLong(ConfigurationKeys.STORE_DB_MAX_WAIT, DEFAULT_DB_MAX_WAIT); } protected ClassLoader getDriverClassLoader() { - return MYSQL_DRIVER_LOADERS.getOrDefault(getDriverClassName(), ClassLoader.getSystemClassLoader()); + return MYSQL_DRIVER_LOADERS.getOrDefault( + getDriverClassName(), this.getClass().getClassLoader()); } private static Map createMysqlDriverClassLoaders() { Map loaders = new HashMap<>(); - String cp = System.getProperty("java.class.path"); + String cp = System.getProperty("loader.path"); + if (cp == null) { + cp = System.getProperty("java.class.path"); + } if (cp == null || cp.isEmpty()) { return loaders; } @@ -178,7 +198,7 @@ public abstract class AbstractDataSourceProvider implements DataSourceProvider, } try { URL url = file.toURI().toURL(); - ClassLoader loader = new URLClassLoader(new URL[]{url}, ClassLoader.getSystemClassLoader()); + ClassLoader loader = new URLClassLoader(new URL[] {url}, ClassLoader.getSystemClassLoader()); try { loader.loadClass(MYSQL8_DRIVER_CLASS_NAME); loaders.putIfAbsent(MYSQL8_DRIVER_CLASS_NAME, loader); @@ -279,5 +299,4 @@ public abstract class AbstractDataSourceProvider implements DataSourceProvider, protected String getPublicKey() { return CONFIG.getConfig(ConfigurationKeys.STORE_PUBLIC_KEY); } - } diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/application.yml b/ruoyi-visual/ruoyi-seata-server/src/main/resources/application.yml index 663b11d9d..190bf7aa1 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/resources/application.yml +++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/application.yml @@ -19,11 +19,6 @@ logging: # bootstrap-servers: 127.0.0.1:9092 # topic: logback_to_logstash -console: - user: - username: seata - password: seata - seata: config: # support: nacos 、 consul 、 apollo 、 zk 、 etcd3 @@ -52,9 +47,3 @@ seata: ##if use MSE Nacos with auth, mutex with username/password attribute #access-key: "" #secret-key: "" - security: - secretKey: rE7bYayhpvduYwCxuhckybEPDXyna6xwm5m7MZjtjrdXjVxAbXAMccXHyaJvB346 - tokenValidityInMilliseconds: 1800000 - csrf-ignore-urls: /metadata/v1/** - ignore: - urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login,/version.json,/health,/error,/vgroup/v1/** diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/lib/seata-server-2.3.0.jar b/ruoyi-visual/ruoyi-seata-server/src/main/resources/lib/seata-server-2.3.0.jar deleted file mode 100644 index 89cff2951..000000000 Binary files a/ruoyi-visual/ruoyi-seata-server/src/main/resources/lib/seata-server-2.3.0.jar and /dev/null differ diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/lib/seata-server-2.4.0.jar b/ruoyi-visual/ruoyi-seata-server/src/main/resources/lib/seata-server-2.4.0.jar new file mode 100644 index 000000000..da7bf12d6 Binary files /dev/null and b/ruoyi-visual/ruoyi-seata-server/src/main/resources/lib/seata-server-2.4.0.jar differ diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/Dockerfile b/ruoyi-visual/ruoyi-sentinel-dashboard/Dockerfile index 87967aa27..e5707f9f9 100644 --- a/ruoyi-visual/ruoyi-sentinel-dashboard/Dockerfile +++ b/ruoyi-visual/ruoyi-sentinel-dashboard/Dockerfile @@ -1,6 +1,6 @@ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-debian:17.0.11-cds -#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds +FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds +#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds #FROM findepi/graalvm:java17-native LABEL maintainer="Lion Li" diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/pom.xml b/ruoyi-visual/ruoyi-sentinel-dashboard/pom.xml index 79ba90f66..007751da1 100644 --- a/ruoyi-visual/ruoyi-sentinel-dashboard/pom.xml +++ b/ruoyi-visual/ruoyi-sentinel-dashboard/pom.xml @@ -99,17 +99,17 @@ org.apache.tomcat.embed tomcat-embed-websocket - 9.0.98 + 9.0.105 org.apache.tomcat.embed tomcat-embed-core - 9.0.98 + 9.0.105 org.apache.tomcat.embed tomcat-embed-el - 9.0.98 + 9.0.105 diff --git a/ruoyi-visual/ruoyi-snailjob-server/Dockerfile b/ruoyi-visual/ruoyi-snailjob-server/Dockerfile index 6f4484d33..ef85eb2c9 100644 --- a/ruoyi-visual/ruoyi-snailjob-server/Dockerfile +++ b/ruoyi-visual/ruoyi-snailjob-server/Dockerfile @@ -1,6 +1,6 @@ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-debian:17.0.11-cds -#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds +FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds +#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds #FROM findepi/graalvm:java17-native LABEL maintainer="Lion Li" @@ -9,7 +9,7 @@ RUN mkdir -p /ruoyi/snailjob/logs WORKDIR /ruoyi/snailjob -ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="-Xms512m -Xmx1024m" +ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" EXPOSE 8800 EXPOSE 17888 diff --git a/script/config/nacos/application-common.yml b/script/config/nacos/application-common.yml index ac4771d2c..39aa2911d 100644 --- a/script/config/nacos/application-common.yml +++ b/script/config/nacos/application-common.yml @@ -266,6 +266,26 @@ seata: application-id: ${spring.application.name} # Seata 事务组编号,用于 TC 集群名 tx-service-group: ${spring.application.name}-group + config: + type: nacos + nacos: + server-addr: ${spring.cloud.nacos.server-addr} + group: ${spring.cloud.nacos.config.group} + namespace: ${spring.profiles.active} + username: ${spring.cloud.nacos.username} + password: ${spring.cloud.nacos.password} + data-id: seata-server.properties + registry: + type: nacos + nacos: + application: ruoyi-seata-server + server-addr: ${spring.cloud.nacos.server-addr} + group: ${spring.cloud.nacos.discovery.group} + username: ${spring.cloud.nacos.username} + password: ${spring.cloud.nacos.password} + namespace: ${spring.profiles.active} + # 关闭自动代理 + enable-auto-data-source-proxy: false # 多租户配置 tenant: diff --git a/script/docker/docker-compose.yml b/script/docker/docker-compose.yml index b4e555491..399aac8dd 100644 --- a/script/docker/docker-compose.yml +++ b/script/docker/docker-compose.yml @@ -27,7 +27,7 @@ services: network_mode: "host" nacos: - image: ruoyi/ruoyi-nacos:2.4.0 + image: ruoyi/ruoyi-nacos:2.4.1 container_name: nacos ports: - "8848:8848" @@ -95,7 +95,7 @@ services: network_mode: "host" seata-server: - image: ruoyi/ruoyi-seata-server:2.4.0 + image: ruoyi/ruoyi-seata-server:2.4.1 container_name: seata-server ports: - "7091:7091" @@ -134,7 +134,7 @@ services: network_mode: "host" sentinel: - image: ruoyi/ruoyi-sentinel-dashboard:2.4.0 + image: ruoyi/ruoyi-sentinel-dashboard:2.4.1 container_name: sentinel environment: TZ: Asia/Shanghai @@ -149,7 +149,7 @@ services: network_mode: "host" ruoyi-monitor: - image: ruoyi/ruoyi-monitor:2.4.0 + image: ruoyi/ruoyi-monitor:2.4.1 container_name: ruoyi-monitor environment: # 时区上海 @@ -165,7 +165,7 @@ services: network_mode: "host" ruoyi-snailjob-server: - image: ruoyi/ruoyi-snailjob-server:2.4.0 + image: ruoyi/ruoyi-snailjob-server:2.4.1 container_name: ruoyi-snailjob-server environment: # 时区上海 @@ -179,7 +179,7 @@ services: network_mode: "host" ruoyi-gateway: - image: ruoyi/ruoyi-gateway:2.4.0 + image: ruoyi/ruoyi-gateway:2.4.1 container_name: ruoyi-gateway environment: # 时区上海 @@ -195,7 +195,7 @@ services: network_mode: "host" ruoyi-auth: - image: ruoyi/ruoyi-auth:2.4.0 + image: ruoyi/ruoyi-auth:2.4.1 container_name: ruoyi-auth environment: # 时区上海 @@ -211,7 +211,7 @@ services: network_mode: "host" ruoyi-system: - image: ruoyi/ruoyi-system:2.4.0 + image: ruoyi/ruoyi-system:2.4.1 container_name: ruoyi-system environment: # 时区上海 @@ -227,7 +227,7 @@ services: network_mode: "host" ruoyi-gen: - image: ruoyi/ruoyi-gen:2.4.0 + image: ruoyi/ruoyi-gen:2.4.1 container_name: ruoyi-gen environment: # 时区上海 @@ -243,7 +243,7 @@ services: network_mode: "host" ruoyi-job: - image: ruoyi/ruoyi-job:2.4.0 + image: ruoyi/ruoyi-job:2.4.1 container_name: ruoyi-job environment: # 时区上海 @@ -261,7 +261,7 @@ services: network_mode: "host" ruoyi-resource: - image: ruoyi/ruoyi-resource:2.4.0 + image: ruoyi/ruoyi-resource:2.4.1 container_name: ruoyi-resource environment: # 时区上海 @@ -277,7 +277,7 @@ services: network_mode: "host" ruoyi-workflow: - image: ruoyi/ruoyi-workflow:2.4.0 + image: ruoyi/ruoyi-workflow:2.4.1 container_name: ruoyi-workflow environment: # 时区上海 diff --git a/script/docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-2.3.0.jar b/script/docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-2.4.0.jar similarity index 60% rename from script/docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-2.3.0.jar rename to script/docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-2.4.0.jar index 6e52867ea..156cc284a 100644 Binary files a/script/docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-2.3.0.jar and b/script/docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-2.4.0.jar differ diff --git a/script/sql/oracle/oracle_ry_cloud.sql b/script/sql/oracle/oracle_ry_cloud.sql index 7fd8c3658..0431b24d4 100644 --- a/script/sql/oracle/oracle_ry_cloud.sql +++ b/script/sql/oracle/oracle_ry_cloud.sql @@ -452,10 +452,10 @@ insert into sys_menu values('115', '代码生成', '3', '2', 'gen', insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, sysdate, null, null, '租户管理菜单'); insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate, null, null, '租户套餐管理菜单'); insert into sys_menu values('123', '客户端管理', '1', '11', 'client', 'system/client/index', '', 1, 0, 'C', '0', '0', 'system:client:list', 'international', 103, 1, sysdate, null, null, '客户端管理菜单'); -insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\\d+)', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate, null, null, ''); -insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\\d+)', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate, null, null, ''); -insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId(\\d+)', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate, null, null, ''); -insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\\d+)', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate, null, null, ''); +insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate, null, null, ''); +insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate, null, null, ''); +insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate, null, null, ''); +insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate, null, null, ''); insert into sys_menu values('133', '文件配置管理', '1', '10', 'oss-config/index', 'system/oss/config', '', 1, 1, 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, sysdate, null, null, ''); -- springboot-admin监控 diff --git a/script/sql/oracle/oracle_ry_job.sql b/script/sql/oracle/oracle_ry_job.sql index c00558842..1e5c899cc 100644 --- a/script/sql/oracle/oracle_ry_job.sql +++ b/script/sql/oracle/oracle_ry_job.sql @@ -410,7 +410,7 @@ CREATE TABLE sj_distributed_lock ); ALTER TABLE sj_distributed_lock - ADD CONSTRAINT pk_sj_distributed_lock PRIMARY KEY (id); + ADD CONSTRAINT pk_sj_distributed_lock PRIMARY KEY (name); COMMENT ON COLUMN sj_distributed_lock.name IS '锁名称'; COMMENT ON COLUMN sj_distributed_lock.lock_until IS '锁定时长'; diff --git a/script/sql/oracle/oracle_ry_workflow.sql b/script/sql/oracle/oracle_ry_workflow.sql index 08fb357e0..97029ffe3 100644 --- a/script/sql/oracle/oracle_ry_workflow.sql +++ b/script/sql/oracle/oracle_ry_workflow.sql @@ -1,3 +1,6 @@ +-- ---------------------------- +-- 0、warm-flow-all.sql,地址:https://gitee.com/dromara/warm-flow/blob/master/sql/oracle/oracle-wram-flow-all.sql +-- ---------------------------- create table FLOW_DEFINITION ( ID NUMBER(20) not null, @@ -18,7 +21,8 @@ create table FLOW_DEFINITION TENANT_ID VARCHAR2(40) ); -alter table FLOW_DEFINITION add constraint PK_FLOW_DEFINITION primary key (ID); +alter table FLOW_DEFINITION + add constraint PK_FLOW_DEFINITION primary key (ID); comment on table FLOW_DEFINITION is '流程定义表'; comment on column FLOW_DEFINITION.ID is '主键id'; @@ -57,13 +61,14 @@ create table FLOW_NODE VERSION VARCHAR2(20), CREATE_TIME DATE, UPDATE_TIME DATE, - EXT VARCHAR2(500), + EXT CLOB, DEL_FLAG VARCHAR2(1) default '0', TENANT_ID VARCHAR2(40), PERMISSION_FLAG VARCHAR2(200) ); -alter table FLOW_NODE add constraint PK_FLOW_NODE primary key (ID); +alter table FLOW_NODE + add constraint PK_FLOW_NODE primary key (ID); comment on table FLOW_NODE is '流程节点表'; comment on column FLOW_NODE.ID is '主键id'; @@ -83,10 +88,10 @@ comment on column FLOW_NODE.FORM_PATH is '审批表单路径'; comment on column FLOW_NODE.VERSION is '版本'; comment on column FLOW_NODE.CREATE_TIME is '创建时间'; comment on column FLOW_NODE.UPDATE_TIME is '更新时间'; -comment on column FLOW_NODE.EXT is '扩展属性'; +comment on column FLOW_NODE.EXT is '节点扩展属性'; comment on column FLOW_NODE.DEL_FLAG is '删除标志'; comment on column FLOW_NODE.TENANT_ID is '租户id'; -comment on column FLOW_NODE.PERMISSION_FLAG is '权限标识(权限类型:权限标识,可以多个,用逗号隔开)'; +comment on column FLOW_NODE.PERMISSION_FLAG is '权限标识(权限类型:权限标识,可以多个,用@@隔开)'; create table FLOW_SKIP ( @@ -106,7 +111,8 @@ create table FLOW_SKIP TENANT_ID VARCHAR2(40) ); -alter table FLOW_SKIP add constraint PK_FLOW_SKIP primary key (ID); +alter table FLOW_SKIP + add constraint PK_FLOW_SKIP primary key (ID); comment on table FLOW_SKIP is '节点跳转关联表'; comment on column FLOW_SKIP.ID is '主键id'; @@ -144,7 +150,8 @@ create table FLOW_INSTANCE TENANT_ID VARCHAR2(40) ); -alter table FLOW_INSTANCE add constraint PK_FLOW_INSTANCE primary key (ID); +alter table FLOW_INSTANCE + add constraint PK_FLOW_INSTANCE primary key (ID); comment on table FLOW_INSTANCE is '流程实例表'; comment on column FLOW_INSTANCE.ID is '主键id'; @@ -181,7 +188,8 @@ create table FLOW_TASK TENANT_ID VARCHAR2(40) ); -alter table FLOW_TASK add constraint PK_FLOW_TASK primary key (ID); +alter table FLOW_TASK + add constraint PK_FLOW_TASK primary key (ID); comment on table FLOW_TASK is '待办任务表'; comment on column FLOW_TASK.ID is '主键id'; @@ -218,7 +226,7 @@ create table FLOW_HIS_TASK FORM_PATH VARCHAR2(100), MESSAGE VARCHAR2(500), VARIABLE CLOB, - EXT VARCHAR2(500), + EXT CLOB, CREATE_TIME DATE, UPDATE_TIME DATE, DEL_FLAG VARCHAR2(1) default '0', @@ -226,7 +234,8 @@ create table FLOW_HIS_TASK ); -alter table FLOW_HIS_TASK add constraint PK_FLOW_HIS_TASK primary key (ID); +alter table FLOW_HIS_TASK + add constraint PK_FLOW_HIS_TASK primary key (ID); comment on table FLOW_HIS_TASK is '历史任务记录表'; comment on column FLOW_HIS_TASK.ID is '主键id'; @@ -266,7 +275,8 @@ create table FLOW_USER TENANT_ID VARCHAR2(40) ); -alter table FLOW_USER add constraint PK_FLOW_USER primary key (ID); +alter table FLOW_USER + add constraint PK_FLOW_USER primary key (ID); comment on table FLOW_USER is '待办任务表'; comment on column FLOW_USER.ID is '主键id'; diff --git a/script/sql/postgres/postgres_ry_cloud.sql b/script/sql/postgres/postgres_ry_cloud.sql index 66225bc69..98618079d 100644 --- a/script/sql/postgres/postgres_ry_cloud.sql +++ b/script/sql/postgres/postgres_ry_cloud.sql @@ -454,10 +454,10 @@ insert into sys_menu values('115', '代码生成', '3', '2', 'gen', insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', '1', '0', 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, now(), null, null, '租户管理菜单'); insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', '1', '0', 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, now(), null, null, '租户套餐管理菜单'); insert into sys_menu values('123', '客户端管理', '1', '11', 'client', 'system/client/index', '', '1', '0', 'C', '0', '0', 'system:client:list', 'international', 103, 1, now(), null, null, '客户端管理菜单'); -insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\\d+)', 'tool/gen/editTable', '', '1', '1', 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, now(), null, null, ''); -insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\\d+)', 'system/role/authUser', '', '1', '1', 'C', '1', '0', 'system:role:edit', '#', 103, 1, now(), null, null, ''); -insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId(\\d+)', 'system/user/authRole', '', '1', '1', 'C', '1', '0', 'system:user:edit', '#', 103, 1, now(), null, null, ''); -insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\\d+)', 'system/dict/data', '', '1', '1', 'C', '1', '0', 'system:dict:list', '#', 103, 1, now(), null, null, ''); +insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId', 'tool/gen/editTable', '', '1', '1', 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, now(), null, null, ''); +insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId', 'system/role/authUser', '', '1', '1', 'C', '1', '0', 'system:role:edit', '#', 103, 1, now(), null, null, ''); +insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId', 'system/user/authRole', '', '1', '1', 'C', '1', '0', 'system:user:edit', '#', 103, 1, now(), null, null, ''); +insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId', 'system/dict/data', '', '1', '1', 'C', '1', '0', 'system:dict:list', '#', 103, 1, now(), null, null, ''); insert into sys_menu values('133', '文件配置管理', '1', '10', 'oss-config/index', 'system/oss/config', '', '1', '1', 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, now(), null, null, ''); -- oss菜单 diff --git a/script/sql/postgres/postgres_ry_workflow.sql b/script/sql/postgres/postgres_ry_workflow.sql index cc231a31d..9ce6c3f0a 100644 --- a/script/sql/postgres/postgres_ry_workflow.sql +++ b/script/sql/postgres/postgres_ry_workflow.sql @@ -47,7 +47,7 @@ CREATE TABLE flow_node definition_id int8 NOT NULL, -- 流程定义id node_code varchar(100) NOT NULL, -- 流程节点编码 node_name varchar(100) NULL, -- 流程节点名称 - permission_flag varchar(200) NULL, -- 权限标识(权限类型:权限标识,可以多个,用逗号隔开) + permission_flag varchar(200) NULL, -- 权限标识(权限类型:权限标识,可以多个,用@@隔开) node_ratio numeric(6, 3) NULL, -- 流程签署比例值 coordinate varchar(100) NULL, -- 坐标 any_node_skip varchar(100) NULL, -- 任意结点跳转 @@ -60,7 +60,7 @@ CREATE TABLE flow_node "version" varchar(20) NOT NULL, -- 版本 create_time timestamp NULL, -- 创建时间 update_time timestamp NULL, -- 更新时间 - ext varchar(500) NULL, -- 扩展属性 + ext text NULL, -- 扩展属性 del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 tenant_id varchar(40) NULL, -- 租户id CONSTRAINT flow_node_pkey PRIMARY KEY (id) @@ -72,7 +72,7 @@ COMMENT ON COLUMN flow_node.node_type IS '节点类型(0开始节点 1中间 COMMENT ON COLUMN flow_node.definition_id IS '流程定义id'; COMMENT ON COLUMN flow_node.node_code IS '流程节点编码'; COMMENT ON COLUMN flow_node.node_name IS '流程节点名称'; -COMMENT ON COLUMN flow_node.permission_flag IS '权限标识(权限类型:权限标识,可以多个,用逗号隔开)'; +COMMENT ON COLUMN flow_node.permission_flag IS '权限标识(权限类型:权限标识,可以多个,用@@隔开)'; COMMENT ON COLUMN flow_node.node_ratio IS '流程签署比例值'; COMMENT ON COLUMN flow_node.coordinate IS '坐标'; COMMENT ON COLUMN flow_node.any_node_skip IS '任意结点跳转'; @@ -85,7 +85,7 @@ COMMENT ON COLUMN flow_node.form_path IS '审批表单路径'; COMMENT ON COLUMN flow_node."version" IS '版本'; COMMENT ON COLUMN flow_node.create_time IS '创建时间'; COMMENT ON COLUMN flow_node.update_time IS '更新时间'; -COMMENT ON COLUMN flow_node.ext IS '扩展属性'; +COMMENT ON COLUMN flow_node.ext IS '节点扩展属性'; COMMENT ON COLUMN flow_node.del_flag IS '删除标志'; COMMENT ON COLUMN flow_node.tenant_id IS '租户id'; @@ -215,7 +215,7 @@ CREATE TABLE flow_his_task flow_status varchar(20) NOT NULL, -- 流程状态(0待提交 1审批中 2 审批通过 8已完成 9已退回 10失效) form_custom bpchar(1) NULL DEFAULT 'N':: character varying, -- 审批表单是否自定义(Y是 N否) form_path varchar(100) NULL, -- 审批表单路径 - ext varchar(500) NULL, -- 扩展字段,预留给业务系统使用 + ext text NULL, -- 扩展字段,预留给业务系统使用 message varchar(500) NULL, -- 审批意见 variable text NULL, -- 任务变量 create_time timestamp NULL, -- 创建时间 @@ -265,7 +265,6 @@ CREATE TABLE flow_user ); CREATE INDEX user_processed_type ON flow_user USING btree (processed_by, type); CREATE INDEX user_associated_idx ON FLOW_USER USING btree (associated); - COMMENT ON TABLE flow_user IS '流程用户表'; COMMENT ON COLUMN flow_user.id IS '主键id'; diff --git a/script/sql/ry-cloud.sql b/script/sql/ry-cloud.sql index d4e8fe01a..1138c7042 100644 --- a/script/sql/ry-cloud.sql +++ b/script/sql/ry-cloud.sql @@ -288,10 +288,10 @@ insert into sys_menu values('115', '代码生成', '3', '2', 'gen', insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, sysdate(), null, null, '租户管理菜单'); insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate(), null, null, '租户套餐管理菜单'); insert into sys_menu values('123', '客户端管理', '1', '11', 'client', 'system/client/index', '', 1, 0, 'C', '0', '0', 'system:client:list', 'international', 103, 1, sysdate(), null, null, '客户端管理菜单'); -insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\\d+)', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\\d+)', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId(\\d+)', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\\d+)', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('133', '文件配置管理', '1', '10', 'oss-config/index', 'system/oss/config', '', 1, 1, 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, sysdate(), null, null, ''); -- oss菜单 diff --git a/script/sql/ry-workflow.sql b/script/sql/ry-workflow.sql index 23893ddba..68557aa17 100644 --- a/script/sql/ry-workflow.sql +++ b/script/sql/ry-workflow.sql @@ -29,7 +29,7 @@ CREATE TABLE `flow_node` `definition_id` bigint NOT NULL COMMENT '流程定义id', `node_code` varchar(100) NOT NULL COMMENT '流程节点编码', `node_name` varchar(100) DEFAULT NULL COMMENT '流程节点名称', - `permission_flag` varchar(200) DEFAULT NULL COMMENT '权限标识(权限类型:权限标识,可以多个,用逗号隔开)', + `permission_flag` varchar(200) DEFAULT NULL COMMENT '权限标识(权限类型:权限标识,可以多个,用@@隔开)', `node_ratio` decimal(6, 3) DEFAULT NULL COMMENT '流程签署比例值', `coordinate` varchar(100) DEFAULT NULL COMMENT '坐标', `any_node_skip` varchar(100) DEFAULT NULL COMMENT '任意结点跳转', @@ -42,7 +42,7 @@ CREATE TABLE `flow_node` `version` varchar(20) NOT NULL COMMENT '版本', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `ext` text COMMENT '扩展属性', + `ext` text COMMENT '节点扩展属性', `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', `tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id', PRIMARY KEY (`id`) USING BTREE @@ -108,25 +108,25 @@ CREATE TABLE `flow_task` CREATE TABLE `flow_his_task` ( - `id` bigint(20) NOT NULL COMMENT '主键id', - `definition_id` bigint(20) NOT NULL COMMENT '对应flow_definition表的id', - `instance_id` bigint(20) NOT NULL COMMENT '对应flow_instance表的id', - `task_id` bigint(20) NOT NULL COMMENT '对应flow_task表的id', + `id` bigint(20) NOT NULL COMMENT '主键id', + `definition_id` bigint(20) NOT NULL COMMENT '对应flow_definition表的id', + `instance_id` bigint(20) NOT NULL COMMENT '对应flow_instance表的id', + `task_id` bigint(20) NOT NULL COMMENT '对应flow_task表的id', `node_code` varchar(100) DEFAULT NULL COMMENT '开始节点编码', `node_name` varchar(100) DEFAULT NULL COMMENT '开始节点名称', `node_type` tinyint(1) DEFAULT NULL COMMENT '开始节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', `target_node_code` varchar(200) DEFAULT NULL COMMENT '目标节点编码', `target_node_name` varchar(200) DEFAULT NULL COMMENT '结束节点名称', `approver` varchar(40) DEFAULT NULL COMMENT '审批者', - `cooperate_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)', + `cooperate_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)', `collaborator` varchar(40) DEFAULT NULL COMMENT '协作人', - `skip_type` varchar(10) NOT NULL COMMENT '流转类型(PASS通过 REJECT退回 NONE无动作)', - `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', + `skip_type` varchar(10) NOT NULL COMMENT '流转类型(PASS通过 REJECT退回 NONE无动作)', + `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', `form_custom` char(1) DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)', `form_path` varchar(100) DEFAULT NULL COMMENT '审批表单路径', `message` varchar(500) DEFAULT NULL COMMENT '审批意见', `variable` TEXT DEFAULT NULL COMMENT '任务变量', - `ext` varchar(500) DEFAULT NULL COMMENT '业务详情 存业务表对象json字符串', + `ext` TEXT DEFAULT NULL COMMENT '业务详情 存业务表对象json字符串', `create_time` datetime DEFAULT NULL COMMENT '任务开始时间', `update_time` datetime DEFAULT NULL COMMENT '审批完成时间', `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', diff --git a/script/sql/update/oracle/update_2.3.0-2.4.0.sql b/script/sql/update/oracle/update_2.3.0-2.4.0.sql index d0d049932..3561f4d94 100644 --- a/script/sql/update/oracle/update_2.3.0-2.4.0.sql +++ b/script/sql/update/oracle/update_2.3.0-2.4.0.sql @@ -9,10 +9,10 @@ ALTER TABLE sys_social MODIFY (access_token VARCHAR2(2000 BYTE)) MODIFY (refresh_token VARCHAR2(2000 BYTE)); -INSERT INTO sys_menu VALUES ('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\\d+)', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate, null, null, ''); -INSERT INTO sys_menu VALUES ('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\\d+)', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate, null, null, ''); -INSERT INTO sys_menu VALUES ('131', '分配角色', '1', '1', 'user-auth/role/:userId(\\d+)', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate, null, null, ''); -INSERT INTO sys_menu VALUES ('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\\d+)', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate, null, null, ''); +INSERT INTO sys_menu VALUES ('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate, null, null, ''); +INSERT INTO sys_menu VALUES ('130', '分配用户', '1', '2', 'role-auth/user/:roleId', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate, null, null, ''); +INSERT INTO sys_menu VALUES ('131', '分配角色', '1', '1', 'user-auth/role/:userId', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate, null, null, ''); +INSERT INTO sys_menu VALUES ('132', '字典数据', '1', '6', 'dict-data/index/:dictId', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate, null, null, ''); INSERT INTO sys_menu VALUES ('133', '文件配置管理', '1', '10', 'oss-config/index', 'system/oss/config', '', 1, 1, 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, sysdate, null, null, ''); INSERT INTO sys_menu VALUES ('11700', '流程设计', '11616', '5', 'design/index', 'workflow/processDefinition/design', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, SYSDATE, NULL, NULL, ''); INSERT INTO sys_menu VALUES ('11701', '请假申请', '11616', '6', 'leaveEdit/index', 'workflow/leave/leaveEdit', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, SYSDATE, NULL, NULL, ''); diff --git a/script/sql/update/postgres/update_2.3.0-2.4.0.sql b/script/sql/update/postgres/update_2.3.0-2.4.0.sql index 476229c84..e0b67e2dc 100644 --- a/script/sql/update/postgres/update_2.3.0-2.4.0.sql +++ b/script/sql/update/postgres/update_2.3.0-2.4.0.sql @@ -9,10 +9,10 @@ ALTER TABLE sys_social ALTER COLUMN access_token TYPE varchar(2000), ALTER COLUMN refresh_token TYPE varchar(2000); -INSERT INTO sys_menu VALUES ('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\\d+)', 'tool/gen/editTable', '', '1', '1', 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, now(), null, null, ''); -INSERT INTO sys_menu VALUES ('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\\d+)', 'system/role/authUser', '', '1', '1', 'C', '1', '0', 'system:role:edit', '#', 103, 1, now(), null, null, ''); -INSERT INTO sys_menu VALUES ('131', '分配角色', '1', '1', 'user-auth/role/:userId(\\d+)', 'system/user/authRole', '', '1', '1', 'C', '1', '0', 'system:user:edit', '#', 103, 1, now(), null, null, ''); -INSERT INTO sys_menu VALUES ('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\\d+)', 'system/dict/data', '', '1', '1', 'C', '1', '0', 'system:dict:list', '#', 103, 1, now(), null, null, ''); +INSERT INTO sys_menu VALUES ('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId', 'tool/gen/editTable', '', '1', '1', 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, now(), null, null, ''); +INSERT INTO sys_menu VALUES ('130', '分配用户', '1', '2', 'role-auth/user/:roleId', 'system/role/authUser', '', '1', '1', 'C', '1', '0', 'system:role:edit', '#', 103, 1, now(), null, null, ''); +INSERT INTO sys_menu VALUES ('131', '分配角色', '1', '1', 'user-auth/role/:userId', 'system/user/authRole', '', '1', '1', 'C', '1', '0', 'system:user:edit', '#', 103, 1, now(), null, null, ''); +INSERT INTO sys_menu VALUES ('132', '字典数据', '1', '6', 'dict-data/index/:dictId', 'system/dict/data', '', '1', '1', 'C', '1', '0', 'system:dict:list', '#', 103, 1, now(), null, null, ''); INSERT INTO sys_menu VALUES ('133', '文件配置管理', '1', '10', 'oss-config/index', 'system/oss/config', '', '1', '1', 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, now(), null, null, ''); INSERT INTO sys_menu VALUES ('11700', '流程设计', '11616', '5', 'design/index', 'workflow/processDefinition/design', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, now(), NULL, NULL, ''); INSERT INTO sys_menu VALUES ('11701', '请假申请', '11616', '6', 'leaveEdit/index', 'workflow/leave/leaveEdit', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, now(), NULL, NULL, ''); diff --git a/script/sql/update/update_2.3.0-2.4.0.sql b/script/sql/update/update_2.3.0-2.4.0.sql index d5062c31b..058f6fcba 100644 --- a/script/sql/update/update_2.3.0-2.4.0.sql +++ b/script/sql/update/update_2.3.0-2.4.0.sql @@ -12,10 +12,10 @@ ALTER TABLE `sys_social` ALTER TABLE `sys_social` MODIFY COLUMN `refresh_token` varchar(2000) DEFAULT NULL COMMENT '刷新令牌,部分平台可能没有' AFTER `expire_in`; -insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\\d+)', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\\d+)', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId(\\d+)', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\\d+)', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('133', '文件配置管理', '1', '10', 'oss-config/index', 'system/oss/config', '', 1, 1, 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('11700', '流程设计', '11616', '5', 'design/index', 'workflow/processDefinition/design', '', 1, 1, 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('11701', '请假申请', '11616', '6', 'leaveEdit/index', 'workflow/leave/leaveEdit', '', 1, 1, 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, sysdate(), null, null, '');