Compare commits
30 Commits
5037c741a9
...
d5a1e5c157
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d5a1e5c157 | ||
|
|
53a0293b7c | ||
|
|
af7f103a38 | ||
|
|
2280d29fb6 | ||
|
|
71e63519ae | ||
|
|
c8dca75943 | ||
|
|
2eb09ff35d | ||
|
|
c1f12dfe5e | ||
|
|
428c9a60b1 | ||
|
|
4efa894c8f | ||
|
|
f02745454d | ||
|
|
d9fa921fda | ||
|
|
b6951a4c6b | ||
|
|
3e5a0a4845 | ||
|
|
49a54e2199 | ||
|
|
e00086c6e8 | ||
|
|
9c99750dd8 | ||
|
|
bd56cb0405 | ||
|
|
c399bdf720 | ||
|
|
1a34cbc678 | ||
|
|
81fb8eea8f | ||
|
|
8423775582 | ||
|
|
aa159638b9 | ||
|
|
2c4f46b6de | ||
|
|
03c76b071a | ||
|
|
a6b87f01a7 | ||
|
|
3312ed328d | ||
|
|
7d74ff7acc | ||
|
|
b7f07ba8da | ||
|
|
3c19722cbd |
288
deployment.yaml
288
deployment.yaml
File diff suppressed because it is too large
Load Diff
@@ -32,6 +32,8 @@
|
||||
<spring.boot.version>3.4.5</spring.boot.version>
|
||||
<spring.cloud.version>2024.0.1</spring.cloud.version>
|
||||
<spring.cloud.alibaba.version>2023.0.3.2</spring.cloud.alibaba.version>
|
||||
<!-- 分布式事务相关 -->
|
||||
<seata.version>2.4.0</seata.version>
|
||||
<!-- Web 相关 -->
|
||||
<springdoc.version>2.8.3</springdoc.version>
|
||||
<knife4j.version>4.6.0</knife4j.version>
|
||||
@@ -86,6 +88,8 @@
|
||||
<netty.version>4.1.116.Final</netty.version>
|
||||
<mqtt.version>1.2.5</mqtt.version>
|
||||
<pf4j-spring.version>0.9.0</pf4j-spring.version>
|
||||
<docx4j.version>11.4.7</docx4j.version>
|
||||
<docx4j-jaxb.version>11.4.7</docx4j-jaxb.version>
|
||||
<!-- 规则引擎 -->
|
||||
<liteflow.version>2.15.1</liteflow.version>
|
||||
<vertx.version>4.5.13</vertx.version>
|
||||
@@ -131,6 +135,20 @@
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- 分布式事务:Seata -->
|
||||
<!-- 显式覆盖 Spring Cloud Alibaba BOM 中的 Seata 1.8.0,升级到 2.4.0 以支持达梦数据库 -->
|
||||
<!-- 注意:Seata 2.2.0+ 改为使用 org.apache.seata groupId -->
|
||||
<dependency>
|
||||
<groupId>org.apache.seata</groupId>
|
||||
<artifactId>seata-all</artifactId>
|
||||
<version>${seata.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.seata</groupId>
|
||||
<artifactId>seata-spring-boot-starter</artifactId>
|
||||
<version>${seata.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 业务组件 -->
|
||||
<dependency>
|
||||
<groupId>io.github.mouzt</groupId>
|
||||
@@ -706,6 +724,17 @@
|
||||
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
|
||||
<version>${mqtt.version}</version>
|
||||
</dependency>
|
||||
<!-- docx4j - Word文档处理 -->
|
||||
<dependency>
|
||||
<groupId>org.docx4j</groupId>
|
||||
<artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
|
||||
<version>${docx4j-jaxb.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.docx4j</groupId>
|
||||
<artifactId>docx4j-core</artifactId>
|
||||
<version>${docx4j.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ public class CompanyDeptInfo {
|
||||
/**
|
||||
* 公司Id
|
||||
*/
|
||||
private Long companyId;
|
||||
private String companyId;
|
||||
/**
|
||||
* 公司名称
|
||||
*/
|
||||
@@ -19,7 +19,7 @@ public class CompanyDeptInfo {
|
||||
/**
|
||||
* 部门Id
|
||||
*/
|
||||
private Long deptId;
|
||||
private String deptId;
|
||||
/**
|
||||
* 部门名称
|
||||
*/
|
||||
|
||||
@@ -81,10 +81,12 @@ public class AsyncLatchUtils {
|
||||
|
||||
System.out.println("主流程开始,准备分发异步任务...");
|
||||
|
||||
System.out.println("主线程id:" + Thread.currentThread().getId());
|
||||
// 2. 提交多个异步任务
|
||||
// 任务一:获取用户信息
|
||||
AsyncLatchUtils.submitTask(executorService, () -> {
|
||||
try {
|
||||
System.out.println("任务一子线程id:" + Thread.currentThread().getId());
|
||||
System.out.println("开始获取用户信息...");
|
||||
Thread.sleep(1000); // 模拟耗时
|
||||
System.out.println("获取用户信息成功!");
|
||||
@@ -96,6 +98,7 @@ public class AsyncLatchUtils {
|
||||
// 任务二:获取订单信息
|
||||
AsyncLatchUtils.submitTask(executorService, () -> {
|
||||
try {
|
||||
System.out.println("任务二子线程id:" + Thread.currentThread().getId());
|
||||
System.out.println("开始获取订单信息...");
|
||||
Thread.sleep(1500); // 模拟耗时
|
||||
System.out.println("获取订单信息成功!");
|
||||
@@ -107,6 +110,7 @@ public class AsyncLatchUtils {
|
||||
// 任务三:获取商品信息
|
||||
AsyncLatchUtils.submitTask(executorService, () -> {
|
||||
try {
|
||||
System.out.println("任务三子线程id:" + Thread.currentThread().getId());
|
||||
System.out.println("开始获取商品信息...");
|
||||
Thread.sleep(500); // 模拟耗时
|
||||
System.out.println("获取商品信息成功!");
|
||||
|
||||
@@ -19,11 +19,11 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||
public class ZtBusinessAutoConfiguration implements WebMvcConfigurer {
|
||||
@Override
|
||||
public void addInterceptors(InterceptorRegistry registry) {
|
||||
// 只拦截增删改和 set 相关的 url
|
||||
// 拦截所有 url,统一进行业务与文件上传请求头校验
|
||||
registry.addInterceptor(new BusinessHeaderInterceptor())
|
||||
.addPathPatterns("/**/add**", "/**/create**", "/**/update**", "/**/edit**", "/**/set**");
|
||||
.addPathPatterns("/**");
|
||||
registry.addInterceptor(new FileUploadHeaderInterceptor())
|
||||
.addPathPatterns("/**/add**", "/**/create**", "/**/update**", "/**/edit**", "/**/set**");
|
||||
.addPathPatterns("/**");
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -107,11 +107,11 @@ class BusinessHeaderInterceptorTest {
|
||||
|
||||
// 构造 loginUser,包含多个公司部门
|
||||
CompanyDeptInfo deptInfo1 = new CompanyDeptInfo();
|
||||
deptInfo1.setCompanyId(1L);
|
||||
deptInfo1.setDeptId(2L);
|
||||
deptInfo1.setCompanyId(String.valueOf(1L));
|
||||
deptInfo1.setDeptId(String.valueOf(2L));
|
||||
CompanyDeptInfo deptInfo2 = new CompanyDeptInfo();
|
||||
deptInfo2.setCompanyId(2L);
|
||||
deptInfo2.setDeptId(3L);
|
||||
deptInfo2.setCompanyId(String.valueOf(2L));
|
||||
deptInfo2.setDeptId(String.valueOf(3L));
|
||||
Set<CompanyDeptInfo> deptSet = new HashSet<>();
|
||||
deptSet.add(deptInfo1);
|
||||
deptSet.add(deptInfo2);
|
||||
@@ -141,8 +141,8 @@ class BusinessHeaderInterceptorTest {
|
||||
|
||||
// 构造 loginUser,只有一个公司且公司下只有一个部门
|
||||
CompanyDeptInfo deptInfo = new CompanyDeptInfo();
|
||||
deptInfo.setCompanyId(100L);
|
||||
deptInfo.setDeptId(200L);
|
||||
deptInfo.setCompanyId(String.valueOf(100L));
|
||||
deptInfo.setDeptId(String.valueOf(200L));
|
||||
Set<CompanyDeptInfo> deptSet = new HashSet<>();
|
||||
deptSet.add(deptInfo);
|
||||
LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L)
|
||||
@@ -155,9 +155,9 @@ class BusinessHeaderInterceptorTest {
|
||||
setLoginUserForTest(loginUser);
|
||||
|
||||
boolean result = interceptor.preHandle(request, response, handlerMethod);
|
||||
assertFalse(result);
|
||||
// 可选:verify(request).setAttribute("visit-company-id", String.valueOf(deptInfo.getCompanyId()));
|
||||
// 可选:verify(request).setAttribute("visit-dept-id", String.valueOf(deptInfo.getDeptId()));
|
||||
assertTrue(result);
|
||||
verify(request).setAttribute(eq("visit-company-id"), eq(deptInfo.getCompanyId()));
|
||||
verify(request).setAttribute(eq("visit-dept-id"), eq(deptInfo.getDeptId()));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -172,11 +172,11 @@ class BusinessHeaderInterceptorTest {
|
||||
|
||||
// 构造 loginUser,多个公司部门
|
||||
CompanyDeptInfo deptInfo1 = new CompanyDeptInfo();
|
||||
deptInfo1.setCompanyId(1L);
|
||||
deptInfo1.setDeptId(2L);
|
||||
deptInfo1.setCompanyId(String.valueOf(1L));
|
||||
deptInfo1.setDeptId(String.valueOf(2L));
|
||||
CompanyDeptInfo deptInfo2 = new CompanyDeptInfo();
|
||||
deptInfo2.setCompanyId(2L);
|
||||
deptInfo2.setDeptId(3L);
|
||||
deptInfo2.setCompanyId(String.valueOf(2L));
|
||||
deptInfo2.setDeptId(String.valueOf(3L));
|
||||
Set<CompanyDeptInfo> deptSet = new HashSet<>();
|
||||
deptSet.add(deptInfo1);
|
||||
deptSet.add(deptInfo2);
|
||||
@@ -207,11 +207,11 @@ class BusinessHeaderInterceptorTest {
|
||||
|
||||
// 构造 loginUser,只有其他公司部门
|
||||
CompanyDeptInfo deptInfo1 = new CompanyDeptInfo();
|
||||
deptInfo1.setCompanyId(1L);
|
||||
deptInfo1.setDeptId(2L);
|
||||
deptInfo1.setCompanyId(String.valueOf(1L));
|
||||
deptInfo1.setDeptId(String.valueOf(2L));
|
||||
CompanyDeptInfo deptInfo2 = new CompanyDeptInfo();
|
||||
deptInfo2.setCompanyId(2L);
|
||||
deptInfo2.setDeptId(3L);
|
||||
deptInfo2.setCompanyId(String.valueOf(2L));
|
||||
deptInfo2.setDeptId(String.valueOf(3L));
|
||||
Set<CompanyDeptInfo> deptSet = new HashSet<>();
|
||||
deptSet.add(deptInfo1);
|
||||
deptSet.add(deptInfo2);
|
||||
|
||||
@@ -29,6 +29,9 @@ import java.time.Duration;
|
||||
* @author ZT
|
||||
*/
|
||||
public class S3FileClient extends AbstractFileClient<S3FileClientConfig> {
|
||||
|
||||
private static final Duration DEFAULT_PRESIGNED_EXPIRATION = Duration.ofHours(24);
|
||||
private static final String PRESIGN_EXPIRE_SECONDS_PROPERTY = "zt.file.download-expire-seconds";
|
||||
/**
|
||||
* 生成临时下载地址(预签名下载 URL)
|
||||
* @param path 文件路径
|
||||
@@ -37,17 +40,7 @@ public class S3FileClient extends AbstractFileClient<S3FileClientConfig> {
|
||||
*/
|
||||
@Override
|
||||
public String getPresignedDownloadUrl(String path, Duration expiration) {
|
||||
Duration realExpiration = expiration;
|
||||
if (realExpiration == null) {
|
||||
long expireSeconds = 30; // 默认 30 秒
|
||||
try {
|
||||
String val = SpringUtils.getProperty("zt.file.download-expire-seconds");
|
||||
if (val != null && !val.isEmpty()) {
|
||||
expireSeconds = Long.parseLong(val);
|
||||
}
|
||||
} catch (Exception ignored) {}
|
||||
realExpiration = Duration.ofSeconds(expireSeconds);
|
||||
}
|
||||
Duration realExpiration = expiration != null ? expiration : resolveDefaultExpiration();
|
||||
if (path == null){
|
||||
return StringUtils.EMPTY;
|
||||
}
|
||||
@@ -135,10 +128,25 @@ public class S3FileClient extends AbstractFileClient<S3FileClientConfig> {
|
||||
|
||||
@Override
|
||||
public FilePresignedUrlRespDTO getPresignedObjectUrl(String path) {
|
||||
Duration expiration = Duration.ofHours(24);
|
||||
Duration expiration = resolveDefaultExpiration();
|
||||
return new FilePresignedUrlRespDTO(getPresignedUrl(path, expiration), config.getDomain() + "/" + path);
|
||||
}
|
||||
|
||||
private Duration resolveDefaultExpiration() {
|
||||
String propertyValue = SpringUtils.getProperty(PRESIGN_EXPIRE_SECONDS_PROPERTY);
|
||||
if (StringUtils.isNotEmpty(propertyValue)) {
|
||||
try {
|
||||
long seconds = Long.parseLong(propertyValue);
|
||||
if (seconds > 0) {
|
||||
return Duration.ofSeconds(seconds);
|
||||
}
|
||||
} catch (NumberFormatException ignored) {
|
||||
// ignore invalid config values and fall back to default
|
||||
}
|
||||
}
|
||||
return DEFAULT_PRESIGNED_EXPIRATION;
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成动态的预签名上传 URL
|
||||
*
|
||||
|
||||
@@ -148,6 +148,8 @@ zt:
|
||||
key: "0123456789abcdef0123456789abcdef"
|
||||
# 附件预览
|
||||
kkfile: "http://172.16.46.63:30012/onlinePreview?url="
|
||||
file:
|
||||
download-expire-seconds: 86400 # 对象存储预签名地址默认有效期(秒)
|
||||
info:
|
||||
version: 1.0.0
|
||||
base-package: com.zt.plat.module.infra
|
||||
|
||||
@@ -212,4 +212,7 @@ public interface ErrorCodeConstants {
|
||||
// ========== 系统序列号记录 1-002-032-000 ==========
|
||||
ErrorCode SEQUENCE_RECORD_NOT_EXISTS = new ErrorCode(1_002_032_000, "系统序列号记录不存在");
|
||||
|
||||
// ========== 门户网站 1-002-033-000 ==========
|
||||
ErrorCode PORTAL_NOT_EXISTS = new ErrorCode(1_002_033_000, "门户不存在");
|
||||
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user