chore: 升级依赖并切换 WxJava 到 HttpClient5

升级 Spring Boot 3.5.15、Netty、Redisson、Tika、Hutool、jsch、AWS SDK、Alipay、weixin-java 等依赖。

- easy-trans 迁移到 org.dromara 并同步 Java import
- 新增 system-server 的 WxJava 配置类和 mp-server 的 MP-only 配置类
- 将 WxJava http-client-type 切换为 HttpComponents
- 移除显式 httpclient4 依赖
- 补充 cloud 项目 fastjson2 依赖管理
master-jdk17
YunaiV 2026-06-26 09:12:39 -07:00
parent 0936e04df3
commit bf2de0a304
33 changed files with 263 additions and 77 deletions

1
.gitignore vendored
View File

@ -73,3 +73,4 @@ functions/mock
screenshot screenshot
.firebase .firebase
sessionStore sessionStore
outputs/

View File

@ -46,7 +46,7 @@
<flatten-maven-plugin.version>1.7.2</flatten-maven-plugin.version> <flatten-maven-plugin.version>1.7.2</flatten-maven-plugin.version>
<!-- maven-surefire-plugin 暂时无法通过 bom 的依赖读取(兼容老版本 IDEA 2024 及以前版本) --> <!-- maven-surefire-plugin 暂时无法通过 bom 的依赖读取(兼容老版本 IDEA 2024 及以前版本) -->
<lombok.version>1.18.46</lombok.version> <lombok.version>1.18.46</lombok.version>
<spring.boot.version>3.5.9</spring.boot.version> <spring.boot.version>3.5.15</spring.boot.version>
<mapstruct.version>1.6.3</mapstruct.version> <mapstruct.version>1.6.3</mapstruct.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>

View File

@ -17,7 +17,7 @@
<revision>2026.05-SNAPSHOT</revision> <revision>2026.05-SNAPSHOT</revision>
<flatten-maven-plugin.version>1.7.2</flatten-maven-plugin.version> <flatten-maven-plugin.version>1.7.2</flatten-maven-plugin.version>
<!-- 统一依赖管理 --> <!-- 统一依赖管理 -->
<spring.boot.version>3.5.14</spring.boot.version> <spring.boot.version>3.5.15</spring.boot.version>
<spring.cloud.version>2025.0.1</spring.cloud.version> <spring.cloud.version>2025.0.1</spring.cloud.version>
<spring.cloud.alibaba.version>2025.0.0.0</spring.cloud.alibaba.version> <spring.cloud.alibaba.version>2025.0.0.0</spring.cloud.alibaba.version>
<!-- Web 相关 --> <!-- Web 相关 -->
@ -29,14 +29,14 @@
<mybatis-plus.version>3.5.16</mybatis-plus.version> <mybatis-plus.version>3.5.16</mybatis-plus.version>
<mybatis-plus-join.version>1.5.7</mybatis-plus-join.version> <mybatis-plus-join.version>1.5.7</mybatis-plus-join.version>
<dynamic-datasource.version>4.5.0</dynamic-datasource.version> <dynamic-datasource.version>4.5.0</dynamic-datasource.version>
<easy-trans.version>3.0.6</easy-trans.version> <easy-trans.version>3.1.5</easy-trans.version>
<redisson.version>4.4.0</redisson.version> <redisson.version>4.6.1</redisson.version>
<dm8.jdbc.version>8.1.3.140</dm8.jdbc.version> <dm8.jdbc.version>8.1.3.140</dm8.jdbc.version>
<kingbase.jdbc.version>9.0.1.jre7</kingbase.jdbc.version> <kingbase.jdbc.version>9.0.1.jre7</kingbase.jdbc.version>
<opengauss.jdbc.version>7.0.0-RC3-og</opengauss.jdbc.version> <opengauss.jdbc.version>7.0.0-RC3-og</opengauss.jdbc.version>
<taos.version>3.8.3</taos.version> <taos.version>3.8.4</taos.version>
<!-- 消息队列 --> <!-- 消息队列 -->
<rocketmq-spring.version>2.3.5</rocketmq-spring.version> <rocketmq-spring.version>2.3.6</rocketmq-spring.version>
<!-- RPC 相关 --> <!-- RPC 相关 -->
<!-- Config 配置中心相关 --> <!-- Config 配置中心相关 -->
<!-- Job 定时任务相关 --> <!-- Job 定时任务相关 -->
@ -45,11 +45,11 @@
<lock4j.version>2.2.7</lock4j.version> <lock4j.version>2.2.7</lock4j.version>
<!-- 监控相关 --> <!-- 监控相关 -->
<skywalking.version>9.6.0</skywalking.version> <skywalking.version>9.6.0</skywalking.version>
<spring-boot-admin.version>3.5.8</spring-boot-admin.version> <spring-boot-admin.version>3.5.9</spring-boot-admin.version>
<opentracing.version>0.33.0</opentracing.version> <opentracing.version>0.33.0</opentracing.version>
<!-- Test 测试相关 --> <!-- Test 测试相关 -->
<podam.version>8.0.2.RELEASE</podam.version> <podam.version>8.0.2.RELEASE</podam.version>
<jedis-mock.version>1.1.12</jedis-mock.version> <jedis-mock.version>1.1.15</jedis-mock.version>
<mockito-inline.version>5.2.0</mockito-inline.version> <mockito-inline.version>5.2.0</mockito-inline.version>
<!-- Bpm 工作流相关 --> <!-- Bpm 工作流相关 -->
<flowable.version>8.0.0</flowable.version> <flowable.version>8.0.0</flowable.version>
@ -60,35 +60,36 @@
<pinyin4j.version>2.5.1</pinyin4j.version> <pinyin4j.version>2.5.1</pinyin4j.version>
<lombok.version>1.18.46</lombok.version> <lombok.version>1.18.46</lombok.version>
<mapstruct.version>1.6.3</mapstruct.version> <mapstruct.version>1.6.3</mapstruct.version>
<hutool-5.version>5.8.44</hutool-5.version> <hutool-5.version>5.8.46</hutool-5.version>
<hutool-6.version>6.0.0-M22</hutool-6.version> <hutool-6.version>6.0.0-M22</hutool-6.version>
<fastexcel.version>1.3.0</fastexcel.version> <fastexcel.version>1.3.0</fastexcel.version>
<velocity.version>2.4.1</velocity.version> <velocity.version>2.4.1</velocity.version>
<fastjson.version>1.2.83</fastjson.version> <fastjson.version>1.2.83</fastjson.version>
<fastjson2.version>2.0.62</fastjson2.version>
<guava.version>33.6.0-jre</guava.version> <guava.version>33.6.0-jre</guava.version>
<transmittable-thread-local.version>2.14.5</transmittable-thread-local.version> <transmittable-thread-local.version>2.14.5</transmittable-thread-local.version>
<commons-net.version>3.13.0</commons-net.version> <commons-net.version>3.13.0</commons-net.version>
<commons-lang3.version>3.20.0</commons-lang3.version> <commons-lang3.version>3.20.0</commons-lang3.version>
<jsch.version>2.28.2</jsch.version> <jsch.version>2.28.3</jsch.version>
<tika-core.version>3.3.0</tika-core.version> <tika-core.version>3.3.1</tika-core.version>
<ip2region.version>2.7.0</ip2region.version> <ip2region.version>2.7.0</ip2region.version>
<bizlog-sdk.version>3.0.6</bizlog-sdk.version> <bizlog-sdk.version>3.0.6</bizlog-sdk.version>
<reflections.version>0.10.2</reflections.version> <reflections.version>0.10.2</reflections.version>
<netty.version>4.2.14.Final</netty.version> <netty.version>4.2.15.Final</netty.version>
<mqtt.version>1.2.5</mqtt.version> <mqtt.version>1.2.5</mqtt.version>
<vertx.version>4.5.26</vertx.version> <vertx.version>4.5.26</vertx.version>
<okhttp.version>4.12.0</okhttp.version> <okhttp.version>4.12.0</okhttp.version>
<californium.version>3.14.0</californium.version> <californium.version>3.14.0</californium.version>
<j2mod.version>3.3.0</j2mod.version> <j2mod.version>3.3.0</j2mod.version>
<!-- 三方云服务相关 --> <!-- 三方云服务相关 -->
<awssdk.version>2.44.0</awssdk.version> <awssdk.version>2.46.17</awssdk.version>
<justauth.version>1.16.7</justauth.version> <justauth.version>1.16.7</justauth.version>
<justauth-starter.version>1.4.0</justauth-starter.version> <justauth-starter.version>1.4.0</justauth-starter.version>
<jimureport.version>2.3.4</jimureport.version> <jimureport.version>2.3.4</jimureport.version>
<jimubi.version>2.3.2</jimubi.version> <jimubi.version>2.3.2</jimubi.version>
<weixin-java.version>4.8.2-20260501.180637</weixin-java.version> <weixin-java.version>4.8.4-20260623.211820</weixin-java.version>
<bouncycastle.version>1.80</bouncycastle.version> <bouncycastle.version>1.80</bouncycastle.version>
<alipay-sdk-java.version>4.40.806.ALL</alipay-sdk-java.version> <alipay-sdk-java.version>4.40.865.ALL</alipay-sdk-java.version>
</properties> </properties>
<dependencyManagement> <dependencyManagement>
@ -251,7 +252,7 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.fhs-opensource</groupId> <!-- VO 数据翻译 --> <groupId>org.dromara</groupId> <!-- VO 数据翻译 -->
<artifactId>easy-trans-spring-boot-starter</artifactId> <artifactId>easy-trans-spring-boot-starter</artifactId>
<version>${easy-trans.version}</version> <version>${easy-trans.version}</version>
<exclusions> <exclusions>
@ -266,12 +267,12 @@
</exclusions> </exclusions>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.fhs-opensource</groupId> <groupId>org.dromara</groupId>
<artifactId>easy-trans-mybatis-plus-extend</artifactId> <artifactId>easy-trans-mybatis-plus-extend</artifactId>
<version>${easy-trans.version}</version> <version>${easy-trans.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.fhs-opensource</groupId> <groupId>org.dromara</groupId>
<artifactId>easy-trans-anno</artifactId> <artifactId>easy-trans-anno</artifactId>
<version>${easy-trans.version}</version> <version>${easy-trans.version}</version>
</dependency> </dependency>
@ -549,6 +550,11 @@
<artifactId>fastjson</artifactId> <artifactId>fastjson</artifactId>
<version>${fastjson.version}</version> <version>${fastjson.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>${fastjson2.version}</version>
</dependency>
<dependency> <dependency>
<groupId>com.google.guava</groupId> <groupId>com.google.guava</groupId>

View File

@ -141,7 +141,7 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.fhs-opensource</groupId> <!-- VO 数据翻译 --> <groupId>org.dromara</groupId> <!-- VO 数据翻译 -->
<artifactId>easy-trans-anno</artifactId> <!-- 默认引入的原因,方便 xxx-module-api 包使用 --> <artifactId>easy-trans-anno</artifactId> <!-- 默认引入的原因,方便 xxx-module-api 包使用 -->
</dependency> </dependency>

View File

@ -1,6 +1,6 @@
package com.fhs.trans.service; package org.dromara.trans.service;
import com.fhs.core.trans.vo.VO; import org.dromara.core.trans.vo.VO;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;

View File

@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission; import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
import cn.iocoder.yudao.framework.datapermission.core.aop.DataPermissionContextHolder; import cn.iocoder.yudao.framework.datapermission.core.aop.DataPermissionContextHolder;
import com.fhs.trans.service.impl.SimpleTransService; import org.dromara.trans.service.impl.SimpleTransService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import java.util.Collections; import java.util.Collections;
@ -65,7 +65,7 @@ public class DataPermissionRuleFactoryImpl implements DataPermissionRuleFactory
} }
/** /**
* {@link com.fhs.core.trans.anno.Trans} * {@link org.dromara.core.trans.anno.Trans}
* *
* easy-trans * easy-trans
* *

View File

@ -93,11 +93,11 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.fhs-opensource</groupId> <!-- VO 数据翻译 --> <groupId>org.dromara</groupId> <!-- VO 数据翻译 -->
<artifactId>easy-trans-spring-boot-starter</artifactId> <artifactId>easy-trans-spring-boot-starter</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.fhs-opensource</groupId> <groupId>org.dromara</groupId>
<artifactId>easy-trans-mybatis-plus-extend</artifactId> <artifactId>easy-trans-mybatis-plus-extend</artifactId>
</dependency> </dependency>

View File

@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableLogic;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fhs.core.trans.vo.TransPojo; import org.dromara.core.trans.vo.TransPojo;
import lombok.Data; import lombok.Data;
import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.JdbcType;

View File

@ -1,15 +1,17 @@
package cn.iocoder.yudao.framework.translate.config; package cn.iocoder.yudao.framework.translate.config;
import cn.iocoder.yudao.framework.translate.core.TranslateUtils; import cn.iocoder.yudao.framework.translate.core.TranslateUtils;
import com.fhs.trans.service.impl.TransService; import org.dromara.trans.service.impl.TransService;
import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
@AutoConfiguration @AutoConfiguration
public class YudaoTranslateAutoConfiguration { public class YudaoTranslateAutoConfiguration {
@Bean @Bean
@SuppressWarnings({"InstantiationOfUtilityClass", "SpringJavaInjectionPointsAutowiringInspection"}) @ConditionalOnBean(TransService.class)
@SuppressWarnings("InstantiationOfUtilityClass")
public TranslateUtils translateUtils(TransService transService) { public TranslateUtils translateUtils(TransService transService) {
TranslateUtils.init(transService); TranslateUtils.init(transService);
return new TranslateUtils(); return new TranslateUtils();

View File

@ -1,8 +1,8 @@
package cn.iocoder.yudao.framework.translate.core; package cn.iocoder.yudao.framework.translate.core;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import com.fhs.core.trans.vo.VO; import org.dromara.core.trans.vo.VO;
import com.fhs.trans.service.impl.TransService; import org.dromara.trans.service.impl.TransService;
import java.util.List; import java.util.List;

View File

@ -36,17 +36,6 @@
<groupId>io.github.openfeign</groupId> <groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId> <artifactId>feign-okhttp</artifactId>
</dependency> </dependency>
<!--
TODO 芋艿WxJava 4.8.x 的 AbstractWxMpConfigStorageConfiguration 仍引用了 HttpClient 4.x 的
org.apache.http.ssl.TrustStrategy 类。升级 Spring Cloud Alibaba 到 2025.0.0.0 后Nacos 不再
传递 HttpClient 4.xhttpcore导致 ClassNotFoundException。
临时解决:显式引入 httpclient 4.x。待 WxJava 修复后移除。
-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.14</version>
</dependency>
<!-- 工具相关 --> <!-- 工具相关 -->
<dependency> <dependency>

View File

@ -35,7 +35,7 @@ import java.util.Map;
import java.util.function.Predicate; import java.util.function.Predicate;
@AutoConfiguration(beforeName = { @AutoConfiguration(beforeName = {
"com.fhs.trans.config.TransServiceConfig" // cloud 独有避免一键改包后RestTemplate 初始化的冲突。可见 https://t.zsxq.com/T4yj7 帖子 "org.dromara.trans.config.TransServiceConfig" // cloud 独有避免一键改包后RestTemplate 初始化的冲突。可见 https://t.zsxq.com/T4yj7 帖子
}) })
@EnableConfigurationProperties(WebProperties.class) @EnableConfigurationProperties(WebProperties.class)
public class YudaoWebAutoConfiguration { public class YudaoWebAutoConfiguration {

View File

@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatCo
import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO; import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO;
import cn.iocoder.yudao.module.ai.service.chat.AiChatConversationService; import cn.iocoder.yudao.module.ai.service.chat.AiChatConversationService;
import cn.iocoder.yudao.module.ai.service.chat.AiChatMessageService; import cn.iocoder.yudao.module.ai.service.chat.AiChatMessageService;
import com.fhs.core.trans.anno.TransMethodResult; import org.dromara.core.trans.anno.TransMethodResult;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;

View File

@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation;
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO; import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO;
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO; import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
import com.fhs.core.trans.anno.Trans; import org.dromara.core.trans.anno.Trans;
import com.fhs.core.trans.constant.TransType; import org.dromara.core.trans.constant.TransType;
import com.fhs.core.trans.vo.VO; import org.dromara.core.trans.vo.VO;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;

View File

@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRoleS
import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRoleSaveReqVO; import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRoleSaveReqVO;
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO; import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
import cn.iocoder.yudao.module.ai.service.model.AiChatRoleService; import cn.iocoder.yudao.module.ai.service.model.AiChatRoleService;
import com.fhs.core.trans.anno.TransMethodResult; import org.dromara.core.trans.anno.TransMethodResult;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;

View File

@ -1,9 +1,9 @@
package cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole; package cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole;
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO; import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO;
import com.fhs.core.trans.anno.Trans; import org.dromara.core.trans.anno.Trans;
import com.fhs.core.trans.constant.TransType; import org.dromara.core.trans.constant.TransType;
import com.fhs.core.trans.vo.VO; import org.dromara.core.trans.vo.VO;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;

View File

@ -14,7 +14,7 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO;
import cn.iocoder.yudao.module.crm.enums.product.CrmProductStatusEnum; import cn.iocoder.yudao.module.crm.enums.product.CrmProductStatusEnum;
import cn.iocoder.yudao.module.crm.service.product.CrmProductService; import cn.iocoder.yudao.module.crm.service.product.CrmProductService;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import com.fhs.core.trans.anno.TransMethodResult; import org.dromara.core.trans.anno.TransMethodResult;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;

View File

@ -7,9 +7,9 @@ import cn.iocoder.yudao.module.crm.enums.DictTypeConstants;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.ExcelProperty;
import com.fhs.core.trans.anno.Trans; import org.dromara.core.trans.anno.Trans;
import com.fhs.core.trans.constant.TransType; import org.dromara.core.trans.constant.TransType;
import com.fhs.core.trans.vo.VO; import org.dromara.core.trans.vo.VO;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;

View File

@ -1,6 +1,6 @@
package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware; package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware;
import com.fhs.core.trans.vo.VO; import org.dromara.core.trans.vo.VO;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;

View File

@ -1,6 +1,6 @@
package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task; package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task;
import com.fhs.core.trans.vo.VO; import org.dromara.core.trans.vo.VO;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;

View File

@ -0,0 +1,73 @@
package cn.iocoder.yudao.module.mp.framework.mp.config;
import com.binarywang.spring.starter.wxjava.mp.properties.WxMpProperties;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.redis.RedisTemplateWxRedisOps;
import me.chanjar.weixin.common.redis.WxRedisOps;
import me.chanjar.weixin.mp.config.WxMpConfigStorage;
import me.chanjar.weixin.mp.config.WxMpHostConfig;
import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
import me.chanjar.weixin.mp.config.impl.WxMpRedisConfigImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
/**
* weixin-java
*
* weixin-java 4.8.x {@code AbstractWxMpConfigStorageConfiguration} config storage
* {@code DefaultApacheHttpClientBuilder.get()} Apache HttpClient 4.x
* {@code org.apache.http.ssl.TrustStrategy} {@code NoClassDefFoundError}
* Spring Boot 4.x / Spring Cloud Alibaba HttpClient 4.x
*
* {@link WxMpConfigStorage} bean
* {@code http-client-type: HttpComponents} Apache HttpClient 5.x
*
* @author
*/
@Configuration(proxyBeanMethods = false)
@Slf4j
public class YudaoWxMpConfiguration {
@Bean
@ConditionalOnProperty(prefix = WxMpProperties.PREFIX + ".config-storage", name = "type", havingValue = "redistemplate")
@ConditionalOnClass(StringRedisTemplate.class)
@ConditionalOnMissingBean(WxMpConfigStorage.class)
public WxMpConfigStorage wxMpConfigStorage(WxMpProperties properties, ApplicationContext applicationContext) {
StringRedisTemplate redisTemplate = applicationContext.getBean(StringRedisTemplate.class);
WxRedisOps redisOps = new RedisTemplateWxRedisOps(redisTemplate);
WxMpRedisConfigImpl config = new WxMpRedisConfigImpl(redisOps, properties.getConfigStorage().getKeyPrefix());
applyWxMpConfig(config, properties);
return config;
}
private void applyWxMpConfig(WxMpDefaultConfigImpl config, WxMpProperties properties) {
config.setAppId(properties.getAppId());
config.setSecret(properties.getSecret());
config.setToken(properties.getToken());
config.setAesKey(properties.getAesKey());
config.setUseStableAccessToken(properties.isUseStableAccessToken());
WxMpProperties.ConfigStorage storage = properties.getConfigStorage();
config.setHttpProxyHost(storage.getHttpProxyHost());
config.setHttpProxyUsername(storage.getHttpProxyUsername());
config.setHttpProxyPassword(storage.getHttpProxyPassword());
if (storage.getHttpProxyPort() != null) {
config.setHttpProxyPort(storage.getHttpProxyPort());
}
if (properties.getHosts() != null && StringUtils.isNotEmpty(properties.getHosts().getApiHost())) {
WxMpHostConfig hostConfig = new WxMpHostConfig();
hostConfig.setApiHost(properties.getHosts().getApiHost());
hostConfig.setOpenHost(properties.getHosts().getOpenHost());
hostConfig.setMpHost(properties.getHosts().getMpHost());
config.setHostConfig(hostConfig);
}
}
}

View File

@ -100,7 +100,7 @@ wx:
config-storage: config-storage:
type: RedisTemplate # 采用 RedisTemplate 操作 Redis会自动从 Spring 中获取 type: RedisTemplate # 采用 RedisTemplate 操作 Redis会自动从 Spring 中获取
key-prefix: wx # Redis Key 的前缀 key-prefix: wx # Redis Key 的前缀
http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 http-client-type: HttpComponents # 采用 HttpComponentsHttpClient 5请求微信公众号平台
app-id: null # 避免 weixin-java-mp starter 报错 app-id: null # 避免 weixin-java-mp starter 报错
--- #################### 芋道相关配置 #################### --- #################### 芋道相关配置 ####################

View File

@ -1,9 +1,9 @@
package cn.iocoder.yudao.module.system.api.logger.dto; package cn.iocoder.yudao.module.system.api.logger.dto;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import com.fhs.core.trans.anno.Trans; import org.dromara.core.trans.anno.Trans;
import com.fhs.core.trans.constant.TransType; import org.dromara.core.trans.constant.TransType;
import com.fhs.core.trans.vo.VO; import org.dromara.core.trans.vo.VO;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;

View File

@ -5,8 +5,8 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.system.enums.ApiConstants; import cn.iocoder.yudao.module.system.enums.ApiConstants;
import com.fhs.core.trans.anno.AutoTrans; import org.dromara.core.trans.anno.AutoTrans;
import com.fhs.trans.service.AutoTransable; import org.dromara.trans.service.AutoTransable;
import feign.FeignIgnore; import feign.FeignIgnore;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;

View File

@ -1,6 +1,6 @@
package cn.iocoder.yudao.module.system.api.user.dto; package cn.iocoder.yudao.module.system.api.user.dto;
import com.fhs.core.trans.vo.VO; import org.dromara.core.trans.vo.VO;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;

View File

@ -11,7 +11,7 @@ import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.Oper
import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogRespVO; import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogRespVO;
import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
import cn.iocoder.yudao.module.system.service.logger.OperateLogService; import cn.iocoder.yudao.module.system.service.logger.OperateLogService;
import com.fhs.core.trans.anno.TransMethodResult; import org.dromara.core.trans.anno.TransMethodResult;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;

View File

@ -5,9 +5,9 @@ import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.ExcelProperty;
import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
import com.fhs.core.trans.anno.Trans; import org.dromara.core.trans.anno.Trans;
import com.fhs.core.trans.constant.TransType; import org.dromara.core.trans.constant.TransType;
import com.fhs.core.trans.vo.VO; import org.dromara.core.trans.vo.VO;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import lombok.Data; import lombok.Data;

View File

@ -0,0 +1,111 @@
package cn.iocoder.yudao.module.system.framework.weixin.config;
import cn.binarywang.wx.miniapp.config.WxMaConfig;
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import cn.binarywang.wx.miniapp.config.impl.WxMaRedisBetterConfigImpl;
import com.binarywang.spring.starter.wxjava.miniapp.properties.WxMaProperties;
import com.binarywang.spring.starter.wxjava.mp.properties.WxMpProperties;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.redis.RedisTemplateWxRedisOps;
import me.chanjar.weixin.common.redis.WxRedisOps;
import me.chanjar.weixin.mp.config.WxMpConfigStorage;
import me.chanjar.weixin.mp.config.WxMpHostConfig;
import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
import me.chanjar.weixin.mp.config.impl.WxMpRedisConfigImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
/**
* weixin-java
*
* weixin-java 4.8.x {@code AbstractWxMpConfigStorageConfiguration} / {@code AbstractWxMaConfigStorageConfiguration}
* config storage {@code DefaultApacheHttpClientBuilder.get()}
* Apache HttpClient 4.x {@code org.apache.http.ssl.TrustStrategy}
* {@code NoClassDefFoundError}Spring Boot 4.x / Spring Cloud Alibaba HttpClient 4.x
*
* {@link WxMpConfigStorage} / {@link WxMaConfig} bean
* {@code http-client-type: HttpComponents} Apache HttpClient 5.x
*
* @author
*/
@Configuration(proxyBeanMethods = false)
@Slf4j
public class YudaoWxClientConfiguration {
@Bean
@ConditionalOnProperty(prefix = WxMpProperties.PREFIX + ".config-storage", name = "type", havingValue = "redistemplate")
@ConditionalOnClass(StringRedisTemplate.class)
@ConditionalOnMissingBean(WxMpConfigStorage.class)
public WxMpConfigStorage wxMpConfigStorage(WxMpProperties properties, ApplicationContext applicationContext) {
StringRedisTemplate redisTemplate = applicationContext.getBean(StringRedisTemplate.class);
WxRedisOps redisOps = new RedisTemplateWxRedisOps(redisTemplate);
WxMpRedisConfigImpl config = new WxMpRedisConfigImpl(redisOps, properties.getConfigStorage().getKeyPrefix());
applyWxMpConfig(config, properties);
return config;
}
@Bean
@ConditionalOnProperty(prefix = WxMaProperties.PREFIX + ".config-storage", name = "type", havingValue = "redistemplate")
@ConditionalOnClass(StringRedisTemplate.class)
@ConditionalOnMissingBean(WxMaConfig.class)
public WxMaConfig wxMaConfig(WxMaProperties properties, ApplicationContext applicationContext) {
StringRedisTemplate redisTemplate = applicationContext.getBean(StringRedisTemplate.class);
WxRedisOps redisOps = new RedisTemplateWxRedisOps(redisTemplate);
WxMaRedisBetterConfigImpl config = new WxMaRedisBetterConfigImpl(redisOps, properties.getConfigStorage().getKeyPrefix());
applyWxMaConfig(config, properties);
return config;
}
private void applyWxMpConfig(WxMpDefaultConfigImpl config, WxMpProperties properties) {
config.setAppId(properties.getAppId());
config.setSecret(properties.getSecret());
config.setToken(properties.getToken());
config.setAesKey(properties.getAesKey());
config.setUseStableAccessToken(properties.isUseStableAccessToken());
WxMpProperties.ConfigStorage storage = properties.getConfigStorage();
config.setHttpProxyHost(storage.getHttpProxyHost());
config.setHttpProxyUsername(storage.getHttpProxyUsername());
config.setHttpProxyPassword(storage.getHttpProxyPassword());
if (storage.getHttpProxyPort() != null) {
config.setHttpProxyPort(storage.getHttpProxyPort());
}
if (properties.getHosts() != null && StringUtils.isNotEmpty(properties.getHosts().getApiHost())) {
WxMpHostConfig hostConfig = new WxMpHostConfig();
hostConfig.setApiHost(properties.getHosts().getApiHost());
hostConfig.setOpenHost(properties.getHosts().getOpenHost());
hostConfig.setMpHost(properties.getHosts().getMpHost());
config.setHostConfig(hostConfig);
}
}
private void applyWxMaConfig(WxMaDefaultConfigImpl config, WxMaProperties properties) {
WxMaProperties.ConfigStorage storage = properties.getConfigStorage();
config.setAppid(StringUtils.trimToNull(properties.getAppid()));
config.setSecret(StringUtils.trimToNull(properties.getSecret()));
config.setToken(StringUtils.trimToNull(properties.getToken()));
config.setAesKey(StringUtils.trimToNull(properties.getAesKey()));
config.setMsgDataFormat(StringUtils.trimToNull(properties.getMsgDataFormat()));
config.useStableAccessToken(properties.isUseStableAccessToken());
config.setApiHostUrl(StringUtils.trimToNull(properties.getApiHostUrl()));
config.setAccessTokenUrl(StringUtils.trimToNull(properties.getAccessTokenUrl()));
config.setHttpProxyHost(storage.getHttpProxyHost());
config.setHttpProxyUsername(storage.getHttpProxyUsername());
config.setHttpProxyPassword(storage.getHttpProxyPassword());
if (storage.getHttpProxyPort() != null) {
config.setHttpProxyPort(storage.getHttpProxyPort());
}
config.setRetrySleepMillis(Math.max(storage.getRetrySleepMillis(), 1000));
config.setMaxRetryTimes(Math.max(storage.getMaxRetryTimes(), 0));
}
}

View File

@ -0,0 +1,6 @@
/**
* weixin-java httpclient 4.x
*
* @author
*/
package cn.iocoder.yudao.module.system.framework.weixin;

View File

@ -143,7 +143,7 @@ wx:
config-storage: config-storage:
type: RedisTemplate # 采用 RedisTemplate 操作 Redis会自动从 Spring 中获取 type: RedisTemplate # 采用 RedisTemplate 操作 Redis会自动从 Spring 中获取
key-prefix: wx # Redis Key 的前缀 key-prefix: wx # Redis Key 的前缀
http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 http-client-type: HttpComponents # 采用 HttpComponentsHttpClient 5请求微信公众号平台
miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档 miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档
# appid: wx62056c0d5e8db250 # appid: wx62056c0d5e8db250
# secret: 333ae72f41552af1e998fe1f54e1584a # secret: 333ae72f41552af1e998fe1f54e1584a
@ -152,7 +152,7 @@ wx:
config-storage: config-storage:
type: RedisTemplate # 采用 RedisTemplate 操作 Redis会自动从 Spring 中获取 type: RedisTemplate # 采用 RedisTemplate 操作 Redis会自动从 Spring 中获取
key-prefix: wa # Redis Key 的前缀 key-prefix: wa # Redis Key 的前缀
http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 http-client-type: HttpComponents # 采用 HttpComponentsHttpClient 5请求微信公众号平台
--- #################### 芋道相关配置 #################### --- #################### 芋道相关配置 ####################

View File

@ -160,7 +160,7 @@ wx:
config-storage: config-storage:
type: RedisTemplate # 采用 RedisTemplate 操作 Redis会自动从 Spring 中获取 type: RedisTemplate # 采用 RedisTemplate 操作 Redis会自动从 Spring 中获取
key-prefix: wx # Redis Key 的前缀 key-prefix: wx # Redis Key 的前缀
http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 http-client-type: HttpComponents # 采用 HttpComponentsHttpClient 5请求微信公众号平台
miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档 miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档
# appid: wx62056c0d5e8db250 # 测试号(牛希尧提供的) # appid: wx62056c0d5e8db250 # 测试号(牛希尧提供的)
# secret: 333ae72f41552af1e998fe1f54e1584a # secret: 333ae72f41552af1e998fe1f54e1584a
@ -173,7 +173,7 @@ wx:
config-storage: config-storage:
type: RedisTemplate # 采用 RedisTemplate 操作 Redis会自动从 Spring 中获取 type: RedisTemplate # 采用 RedisTemplate 操作 Redis会自动从 Spring 中获取
key-prefix: wa # Redis Key 的前缀 key-prefix: wa # Redis Key 的前缀
http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 http-client-type: HttpComponents # 采用 HttpComponentsHttpClient 5请求微信公众号平台
--- #################### 芋道相关配置 #################### --- #################### 芋道相关配置 ####################

View File

@ -135,14 +135,14 @@ wx: # 参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-sta
config-storage: config-storage:
type: RedisTemplate # 采用 RedisTemplate 操作 Redis会自动从 Spring 中获取 type: RedisTemplate # 采用 RedisTemplate 操作 Redis会自动从 Spring 中获取
key-prefix: wx # Redis Key 的前缀 key-prefix: wx # Redis Key 的前缀
http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 http-client-type: HttpComponents # 采用 HttpComponentsHttpClient 5请求微信公众号平台
miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档 miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档
appid: wx63c280fe3248a3e7 appid: wx63c280fe3248a3e7
secret: 6f270509224a7ae1296bbf1c8cb97aed secret: 6f270509224a7ae1296bbf1c8cb97aed
config-storage: config-storage:
type: RedisTemplate # 采用 RedisTemplate 操作 Redis会自动从 Spring 中获取 type: RedisTemplate # 采用 RedisTemplate 操作 Redis会自动从 Spring 中获取
key-prefix: wa # Redis Key 的前缀 key-prefix: wa # Redis Key 的前缀
http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 http-client-type: HttpComponents # 采用 HttpComponentsHttpClient 5请求微信公众号平台
--- #################### 芋道相关配置 #################### --- #################### 芋道相关配置 ####################
@ -188,7 +188,6 @@ justauth:
prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE:: prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE::
timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟 timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟
--- #################### iot相关配置 TODO 芋艿:再瞅瞅 #################### --- #################### iot相关配置 TODO 芋艿:再瞅瞅 ####################
iot: iot:
emq: emq:
@ -207,7 +206,6 @@ iot:
# 清除会话(设置为false,断开连接,重连后使用原来的会话 保留订阅的主题,能接收离线期间的消息) # 清除会话(设置为false,断开连接,重连后使用原来的会话 保留订阅的主题,能接收离线期间的消息)
clearSession: true clearSession: true
# 插件配置 # 插件配置
pf4j: pf4j:
pluginsDir: ${user.home}/plugins # 插件目录 pluginsDir: ${user.home}/plugins # 插件目录

View File

@ -185,7 +185,7 @@ wx:
config-storage: config-storage:
type: RedisTemplate # 采用 RedisTemplate 操作 Redis会自动从 Spring 中获取 type: RedisTemplate # 采用 RedisTemplate 操作 Redis会自动从 Spring 中获取
key-prefix: wx # Redis Key 的前缀 key-prefix: wx # Redis Key 的前缀
http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 http-client-type: HttpComponents # 采用 HttpComponentsHttpClient 5请求微信公众号平台
miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档 miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档
# appid: wx62056c0d5e8db250 # 测试号(牛希尧提供的) # appid: wx62056c0d5e8db250 # 测试号(牛希尧提供的)
# secret: 333ae72f41552af1e998fe1f54e1584a # secret: 333ae72f41552af1e998fe1f54e1584a
@ -198,7 +198,7 @@ wx:
config-storage: config-storage:
type: RedisTemplate # 采用 RedisTemplate 操作 Redis会自动从 Spring 中获取 type: RedisTemplate # 采用 RedisTemplate 操作 Redis会自动从 Spring 中获取
key-prefix: wa # Redis Key 的前缀 key-prefix: wa # Redis Key 的前缀
http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 http-client-type: HttpComponents # 采用 HttpComponentsHttpClient 5请求微信公众号平台
--- #################### 芋道相关配置 #################### --- #################### 芋道相关配置 ####################