diff --git a/pom.xml b/pom.xml
index f021ac02..5b4d83c3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,468 +1,470 @@
-
-
- 4.0.0
-
- org.springframework.boot
- spring-boot-starter-parent
- 2.2.2.RELEASE
-
-
- com.aida
- aida
- 0.0.1-SNAPSHOT
- aida
- ai da
-
- 8
- 3.5.2
- 5.8.2
- 4.2.7.B
- 2.0.6.graal
- 1.1.1.RELEASE
- 0.9.1
- 31.1-jre
-
- 2.4.0-b180830.0359
- 4.0.0
- 4.0.0
- 1.1.1
- 1.6.2
- 2.20.43
-
- 1.5.5
- windows-x86_64
- linux-x86_64
-
-
-
-
- software.amazon.awssdk
- bom
- ${aws.java.sdk.version}
- pom
- import
-
-
-
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- org.projectlombok
- lombok
- true
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
- org.springframework.boot
- spring-boot-starter-data-redis
-
-
- org.springframework.boot
- spring-boot-configuration-processor
- true
-
-
- org.springframework.boot
- spring-boot-starter-security
-
-
- org.springframework.security
- spring-security-jwt
- ${security.jwt.version}
-
-
- mysql
- mysql-connector-java
-
-
- com.baomidou
- mybatis-plus-boot-starter
- ${mybatis.plus.version}
-
-
-
- org.springframework.boot
- spring-boot-starter-validation
-
-
-
- org.springframework.boot
- spring-boot-starter-logging
-
-
-
- cn.hutool
- hutool-all
- ${hutool.version}
-
-
- com.alibaba
- fastjson
- ${fastjson.version}
-
-
- io.jsonwebtoken
- jjwt
- ${jjwt.version}
-
-
- com.squareup.okhttp3
- okhttp
- 3.14.2
-
-
- javax.xml.bind
- jaxb-api
- ${jaxb-api}
-
-
- com.sun.xml.bind
- jaxb-impl
- ${jaxb-impl}
-
-
- com.sun.xml.bind
- jaxb-core
- ${jaxb-core}
-
-
- javax.activation
- activation
- ${activation}
-
-
- com.github.whvcse
- easy-captcha
- ${easy-captcha}
-
-
- com.google.guava
- guava
- ${guava.version}
-
-
-
- com.github.xiaoymin
- knife4j-spring-boot-starter
- 3.0.3
-
-
-
-
-
-
-
-
-
- com.tencentcloudapi
- tencentcloud-sdk-java-ses
- 3.1.572
-
-
-
-
- io.minio
- minio
- 8.0.3
-
-
-
- commons-fileupload
- commons-fileupload
- 1.4
-
-
-
- com.microsoft.sqlserver
- mssql-jdbc
- 9.2.1.jre8
-
-
-
-
- org.springframework.boot
- spring-boot-starter-amqp
-
-
-
-
- org.apache.commons
- commons-pool2
-
-
-
-
- com.alipay.sdk
- alipay-sdk-java
- 4.22.57.ALL
-
-
-
-
- com.paypal.sdk
- checkout-sdk
- 1.0.5
-
-
-
- com.paypal.sdk
- rest-api-sdk
- LATEST
-
-
-
- org.json
- json
- 20230618
-
-
-
- org.apache.logging.log4j
- log4j-api
- 2.17.1
-
-
-
-
- org.apache.poi
- poi
- 5.2.1
-
-
-
- org.apache.poi
- poi-ooxml
- 5.2.1
-
-
-
- commons-io
- commons-io
- 2.11.0
-
-
-
- org.apache.logging.log4j
- log4j-api
- 2.17.1
-
-
-
- com.stripe
- stripe-java
- 26.2.0
-
-
-
-
-
- software.amazon.awssdk
- s3
-
-
- software.amazon.awssdk
- s3-transfer-manager
- 2.17.103-PREVIEW
-
-
- software.amazon.awssdk
- kms
-
-
- software.amazon.awssdk
- s3control
-
-
-
- com.google.code.gson
- gson
- 2.10.1
-
-
-
- com.itextpdf
- itextpdf
- 5.5.13.2
-
-
-
- org.springframework.boot
- spring-boot-starter-websocket
-
-
-
- com.google.auth
- google-auth-library-oauth2-http
- 1.8.0
-
-
-
- com.google.api-client
- google-api-client
- 1.32.1
-
-
- com.google.oauth-client
- google-oauth-client
- 1.32.1
-
-
- com.google.http-client
- google-http-client-jackson2
- 1.41.5
-
-
-
-
-
- org.springframework.boot
- spring-boot-starter-thymeleaf
-
-
- org.springframework.boot
- spring-boot-starter-mail
-
-
-
- com.alibaba
- easyexcel
- 3.3.2
-
-
-
- org.apache.commons
- commons-text
- 1.10.0
-
-
-
-
-
- com.alibaba
- dashscope-sdk-java
- 2.20.1
-
-
-
-
-
-
-
- org.bytedeco
- javacv
- ${javacv.version}
-
-
- org.bytedeco
- javacpp-platform
- ${javacv.version}
-
-
-
- org.bytedeco
- opencv
- 4.5.1-${javacv.version}
-
- ${javacpp.platform.linux-x86_64}
-
-
- org.bytedeco
- openblas
- 0.3.13-${javacv.version}
-
- ${javacpp.platform.linux-x86_64}
-
-
- org.bytedeco
- flycapture
- 2.13.3.31-${javacv.version}
-
- ${javacpp.platform.linux-x86_64}
-
-
-
- org.bytedeco
- ffmpeg
- 4.4-1.5.6
-
- ${javacpp.platform.linux-x86_64}
-
-
-
- com.volcengine
- volcengine-java-sdk-ark-runtime
- 0.2.43
-
-
-
-
- com.google.auth
- google-auth-library-oauth2-http
- 1.38.0
-
-
-
-
-
- com.madgag
- animated-gif-lib
- 1.4
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
-
- org.projectlombok
- lombok
-
-
-
-
-
-
-
-
-
-
- dev
-
- dev
-
-
- true
-
-
-
-
- test
-
- test
-
-
-
-
- prod
-
- prod
-
-
-
-
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.1.6
+
+
+ com.aida
+ aida
+ 0.0.1-SNAPSHOT
+ aida
+ ai da
+
+ 21
+ 3.5.5
+ 5.8.23
+ 4.2.7.B
+ 2.0.43
+ 0.12.3
+ 32.1.3-jre
+
+ 1.6.2
+ 2.20.43
+
+ 1.5.5
+ windows-x86_64
+ linux-x86_64
+
+
+
+
+ software.amazon.awssdk
+ bom
+ ${aws.java.sdk.version}
+ pom
+ import
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ com.mysql
+ mysql-connector-j
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis.plus.version}
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+
+ org.springframework.boot
+ spring-boot-starter-logging
+
+
+
+ cn.hutool
+ hutool-all
+ ${hutool.version}
+
+
+ com.alibaba
+ fastjson
+ ${fastjson.version}
+
+
+ io.jsonwebtoken
+ jjwt-api
+ ${jjwt.version}
+
+
+ io.jsonwebtoken
+ jjwt-impl
+ ${jjwt.version}
+ runtime
+
+
+ io.jsonwebtoken
+ jjwt-jackson
+ ${jjwt.version}
+ runtime
+
+
+ com.squareup.okhttp3
+ okhttp
+ 3.14.2
+
+
+
+
+ com.github.whvcse
+ easy-captcha
+ ${easy-captcha}
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+
+ com.github.xiaoymin
+ knife4j-openapi3-spring-boot-starter
+ 4.4.0
+
+
+
+ io.swagger
+ swagger-annotations
+ 1.6.14
+
+
+
+
+
+
+
+
+
+ com.tencentcloudapi
+ tencentcloud-sdk-java-ses
+ 3.1.572
+
+
+
+
+ io.minio
+ minio
+ 8.0.3
+
+
+
+ commons-fileupload
+ commons-fileupload
+ 1.4
+
+
+
+ com.microsoft.sqlserver
+ mssql-jdbc
+ 12.4.2.jre11
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-amqp
+
+
+
+
+ org.apache.commons
+ commons-pool2
+
+
+
+
+ com.alipay.sdk
+ alipay-sdk-java
+ 4.22.57.ALL
+
+
+
+
+ com.paypal.sdk
+ checkout-sdk
+ 1.0.5
+
+
+
+ com.paypal.sdk
+ rest-api-sdk
+ LATEST
+
+
+
+ org.json
+ json
+ 20230618
+
+
+
+ org.apache.poi
+ poi
+ 5.2.4
+
+
+
+ org.apache.poi
+ poi-ooxml
+ 5.2.4
+
+
+
+ commons-io
+ commons-io
+ 2.15.1
+
+
+
+ com.stripe
+ stripe-java
+ 26.2.0
+
+
+
+
+
+ software.amazon.awssdk
+ s3
+
+
+ software.amazon.awssdk
+ s3-transfer-manager
+ 2.17.103-PREVIEW
+
+
+ software.amazon.awssdk
+ kms
+
+
+ software.amazon.awssdk
+ s3control
+
+
+
+ com.google.code.gson
+ gson
+ 2.10.1
+
+
+
+ com.itextpdf
+ itextpdf
+ 5.5.13.2
+
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+
+
+
+ com.google.auth
+ google-auth-library-oauth2-http
+ 1.8.0
+
+
+
+ com.google.api-client
+ google-api-client
+ 1.32.1
+
+
+ com.google.oauth-client
+ google-oauth-client
+ 1.32.1
+
+
+ com.google.http-client
+ google-http-client-jackson2
+ 1.41.5
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+ org.springframework.boot
+ spring-boot-starter-mail
+
+
+
+ com.alibaba
+ easyexcel
+ 3.3.3
+
+
+
+ org.apache.commons
+ commons-text
+ 1.10.0
+
+
+
+
+
+ com.alibaba
+ dashscope-sdk-java
+ 2.20.1
+
+
+
+
+
+
+
+ org.bytedeco
+ javacv
+ ${javacv.version}
+
+
+ org.bytedeco
+ javacpp-platform
+ ${javacv.version}
+
+
+
+ org.bytedeco
+ opencv
+ 4.5.1-${javacv.version}
+
+ ${javacpp.platform.linux-x86_64}
+
+
+ org.bytedeco
+ openblas
+ 0.3.13-${javacv.version}
+
+ ${javacpp.platform.linux-x86_64}
+
+
+ org.bytedeco
+ flycapture
+ 2.13.3.31-${javacv.version}
+
+ ${javacpp.platform.linux-x86_64}
+
+
+
+ org.bytedeco
+ ffmpeg
+ 4.4-1.5.6
+
+ ${javacpp.platform.linux-x86_64}
+
+
+
+ com.volcengine
+ volcengine-java-sdk-ark-runtime
+ 0.2.43
+
+
+
+
+ com.google.auth
+ google-auth-library-oauth2-http
+ 1.38.0
+
+
+
+
+
+ com.madgag
+ animated-gif-lib
+ 1.4
+
+
+
+
+ jakarta.websocket
+ jakarta.websocket-api
+ 2.1.1
+
+
+
+
+ org.springframework
+ spring-test
+
+
+
+
+ org.bouncycastle
+ bcprov-jdk18on
+ 1.78.1
+
+
+ org.bouncycastle
+ bcpkix-jdk18on
+ 1.78.1
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+
+
+
+
+
+
+ dev
+
+ dev
+
+
+ true
+
+
+
+
+ test
+
+ test
+
+
+
+
+ prod
+
+ prod
+
+
+
+
diff --git a/src/main/java/com/ai/da/common/RabbitMQ/EmailRetryConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/EmailRetryConsumer.java
index e2bec880..a776a569 100644
--- a/src/main/java/com/ai/da/common/RabbitMQ/EmailRetryConsumer.java
+++ b/src/main/java/com/ai/da/common/RabbitMQ/EmailRetryConsumer.java
@@ -13,9 +13,8 @@ import org.springframework.stereotype.Component;
import software.amazon.awssdk.core.exception.RetryableException;
import org.springframework.amqp.core.Message;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
-import javax.mail.MessagingException;
import java.io.IOException;
import java.util.Map;
import java.util.Objects;
diff --git a/src/main/java/com/ai/da/common/RabbitMQ/MQPublisher.java b/src/main/java/com/ai/da/common/RabbitMQ/MQPublisher.java
index 02c3f99f..1312ba83 100644
--- a/src/main/java/com/ai/da/common/RabbitMQ/MQPublisher.java
+++ b/src/main/java/com/ai/da/common/RabbitMQ/MQPublisher.java
@@ -5,7 +5,7 @@ import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.util.Map;
@Slf4j
diff --git a/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java
index 6b904714..b18a2b6f 100644
--- a/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java
+++ b/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java
@@ -19,7 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.HashMap;
diff --git a/src/main/java/com/ai/da/common/config/AlipayClientConfig.java b/src/main/java/com/ai/da/common/config/AlipayClientConfig.java
index 5b1ec344..13527bff 100644
--- a/src/main/java/com/ai/da/common/config/AlipayClientConfig.java
+++ b/src/main/java/com/ai/da/common/config/AlipayClientConfig.java
@@ -6,7 +6,7 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
@Configuration
//加载配置文件
diff --git a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java
index 3e6eca27..4330552c 100644
--- a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java
+++ b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java
@@ -24,6 +24,7 @@ import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
+import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.security.core.parameters.P;
@@ -32,8 +33,8 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StopWatch;
-import javax.annotation.PostConstruct;
-import javax.annotation.Resource;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.Resource;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
diff --git a/src/main/java/com/ai/da/common/config/ThreeDSave.java b/src/main/java/com/ai/da/common/config/ThreeDSave.java
index 0ac4bd3b..e01e3559 100644
--- a/src/main/java/com/ai/da/common/config/ThreeDSave.java
+++ b/src/main/java/com/ai/da/common/config/ThreeDSave.java
@@ -14,8 +14,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
-import javax.annotation.PostConstruct;
-import javax.annotation.Resource;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.Resource;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
diff --git a/src/main/java/com/ai/da/common/config/WebConfig.java b/src/main/java/com/ai/da/common/config/WebConfig.java
index de3e5c7e..43fdde9a 100644
--- a/src/main/java/com/ai/da/common/config/WebConfig.java
+++ b/src/main/java/com/ai/da/common/config/WebConfig.java
@@ -1,42 +1,42 @@
-package com.ai.da.common.config;
-
-
-import org.hibernate.validator.HibernateValidator;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
-import org.springframework.web.servlet.config.annotation.CorsRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
-
-import javax.validation.Validation;
-import javax.validation.Validator;
-import javax.validation.ValidatorFactory;
-
-@Configuration
-public class WebConfig extends WebMvcConfigurerAdapter {
-
- static final String ORIGINS[] = new String[]{"GET", "POST", "PUT", "DELETE"};
-
- @Override
- public void addCorsMappings(CorsRegistry registry) {
- registry.addMapping("/**").allowedOrigins("*").allowCredentials(true).allowedMethods(ORIGINS).maxAge(3600);
- }
-
- @Bean
- public Validator validator() {
- ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
- .configure()
- //failFast为true出现校验失败的情况,立即结束校验,不再进行后续的校验
- .failFast(true)
- .buildValidatorFactory();
-
- return validatorFactory.getValidator();
- }
-
- @Bean
- public MethodValidationPostProcessor methodValidationPostProcessor() {
- MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
- methodValidationPostProcessor.setValidator(validator());
- return methodValidationPostProcessor;
- }
-}
+package com.ai.da.common.config;
+
+
+import org.hibernate.validator.HibernateValidator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import jakarta.validation.Validation;
+import jakarta.validation.Validator;
+import jakarta.validation.ValidatorFactory;
+
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+
+ static final String ORIGINS[] = new String[]{"GET", "POST", "PUT", "DELETE"};
+
+ @Override
+ public void addCorsMappings(CorsRegistry registry) {
+ registry.addMapping("/**").allowedOriginPatterns("*").allowCredentials(true).allowedMethods(ORIGINS).maxAge(3600);
+ }
+
+ @Bean
+ public Validator validator() {
+ ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
+ .configure()
+ //failFast为true出现校验失败的情况,立即结束校验,不再进行后续的校验
+ .failFast(true)
+ .buildValidatorFactory();
+
+ return validatorFactory.getValidator();
+ }
+
+ @Bean
+ public MethodValidationPostProcessor methodValidationPostProcessor() {
+ MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
+ methodValidationPostProcessor.setValidator(validator());
+ return methodValidationPostProcessor;
+ }
+}
diff --git a/src/main/java/com/ai/da/common/config/swagger/AidaConfiguration.java b/src/main/java/com/ai/da/common/config/swagger/AidaConfiguration.java
deleted file mode 100644
index 083b4670..00000000
--- a/src/main/java/com/ai/da/common/config/swagger/AidaConfiguration.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.ai.da.common.config.swagger;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import springfox.documentation.builders.ApiInfoBuilder;
-import springfox.documentation.builders.PathSelectors;
-import springfox.documentation.builders.RequestHandlerSelectors;
-import springfox.documentation.service.Contact;
-import springfox.documentation.spi.DocumentationType;
-import springfox.documentation.spring.web.plugins.Docket;
-import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
-
-@Configuration
-@EnableSwagger2WebMvc
-public class AidaConfiguration {
-
- @Bean(value = "IntelligentCurtainApis")
- public Docket gxyd5aThemeApis() {
- Contact contact = new Contact("Mr.Y", "", "136");
-
- Docket docket = new Docket(DocumentationType.SWAGGER_2)
- .apiInfo(new ApiInfoBuilder()
- .description("aida接口文档")
- .contact(contact)
- .termsOfServiceUrl("暂无")
- .version("1.0")
- .build())
- //分组名称
- .groupName("1.0")
- .select()
- //这里指定Controller扫描包路径
- .apis(RequestHandlerSelectors.basePackage("com.ai.da.controller"))
- .paths(PathSelectors.any())
- .build();
- return docket;
- }
-}
diff --git a/src/main/java/com/ai/da/common/security/UserAuthAccessDeniedHandler.java b/src/main/java/com/ai/da/common/security/UserAuthAccessDeniedHandler.java
index 049e746a..5774f61d 100644
--- a/src/main/java/com/ai/da/common/security/UserAuthAccessDeniedHandler.java
+++ b/src/main/java/com/ai/da/common/security/UserAuthAccessDeniedHandler.java
@@ -7,8 +7,8 @@ import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.stereotype.Component;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
diff --git a/src/main/java/com/ai/da/common/security/UserAuthenticationEntryPointHandler.java b/src/main/java/com/ai/da/common/security/UserAuthenticationEntryPointHandler.java
index 280d8d8c..d6b3a324 100644
--- a/src/main/java/com/ai/da/common/security/UserAuthenticationEntryPointHandler.java
+++ b/src/main/java/com/ai/da/common/security/UserAuthenticationEntryPointHandler.java
@@ -7,9 +7,9 @@ import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
diff --git a/src/main/java/com/ai/da/common/security/UserAuthenticationManager.java b/src/main/java/com/ai/da/common/security/UserAuthenticationManager.java
index 2e572c70..61fe1a53 100644
--- a/src/main/java/com/ai/da/common/security/UserAuthenticationManager.java
+++ b/src/main/java/com/ai/da/common/security/UserAuthenticationManager.java
@@ -5,7 +5,7 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.stereotype.Component;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
/**
* @author: dangweijian
diff --git a/src/main/java/com/ai/da/common/security/UserLoginFailureHandler.java b/src/main/java/com/ai/da/common/security/UserLoginFailureHandler.java
index 137ff88c..800a4427 100644
--- a/src/main/java/com/ai/da/common/security/UserLoginFailureHandler.java
+++ b/src/main/java/com/ai/da/common/security/UserLoginFailureHandler.java
@@ -10,9 +10,9 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.stereotype.Component;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
diff --git a/src/main/java/com/ai/da/common/security/UserLoginSuccessHandler.java b/src/main/java/com/ai/da/common/security/UserLoginSuccessHandler.java
index 98de9714..787be618 100644
--- a/src/main/java/com/ai/da/common/security/UserLoginSuccessHandler.java
+++ b/src/main/java/com/ai/da/common/security/UserLoginSuccessHandler.java
@@ -8,10 +8,10 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Component;
-import javax.annotation.Resource;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.annotation.Resource;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
diff --git a/src/main/java/com/ai/da/common/security/config/SecurityConfig.java b/src/main/java/com/ai/da/common/security/config/SecurityConfig.java
index 773587c9..b5fce9f2 100644
--- a/src/main/java/com/ai/da/common/security/config/SecurityConfig.java
+++ b/src/main/java/com/ai/da/common/security/config/SecurityConfig.java
@@ -1,84 +1,97 @@
-package com.ai.da.common.security.config;
-
-import com.ai.da.common.security.*;
-import com.ai.da.common.security.filter.AuthenticationFilter;
-import com.ai.da.common.security.filter.UserAuthenticationProcessingFilter;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.builders.WebSecurity;
-import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
-import org.springframework.security.config.http.SessionCreationPolicy;
-import org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler;
-import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
-import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
-
-import javax.annotation.Resource;
-
-@EnableWebSecurity
-@EnableGlobalMethodSecurity(prePostEnabled = true)
-@EnableConfigurationProperties(SecurityProperties.class)
-public class SecurityConfig extends WebSecurityConfigurerAdapter {
-
- @Resource
- private SecurityProperties securityProperties;
- @Resource
- private UserLoginSuccessHandler userLoginSuccessHandler;
- @Resource
- private UserLoginFailureHandler userLoginFailureHandler;
- @Resource
- private UserAuthAccessDeniedHandler userAuthAccessDeniedHandler;
- @Resource
- private UserAuthenticationEntryPointHandler userAuthenticationEntryPointHandler;
- @Resource
- private UserAuthenticationManager userAuthenticationManager;
- @Resource
- private UserAuthenticationProcessingFilter userAuthenticationProcessingFilter;
-
- /**
- * 不通过注入spring管理 让Security来管理 这样自定义的Filter就不会走,.permitAll()才能起作用
- */
- @Resource
- private AuthenticationFilter authenticationFilter;
- @Resource
- private UserPermissionEvaluator userPermissionEvaluator;
-
-
- @Override
- public AuthenticationManager authenticationManagerBean() throws Exception {
- return this.userAuthenticationManager;
- }
-
- @Override
- protected void configure(HttpSecurity httpSecurity/*, WebSecurity web*/) throws Exception {
-// web.ignoring().antMatchers("/test/**");//禁止所有过滤器
- httpSecurity.cors().disable()//禁用 CSRF
- .authorizeRequests()//认证请求
- .antMatchers(securityProperties.getIgnorePaths()).permitAll()//忽略的请求
- .anyRequest().authenticated()//其余所有的请求都需要认证
- .and().headers().frameOptions().disable()// 防止iframe 造成跨域
- .and().exceptionHandling().authenticationEntryPoint(userAuthenticationEntryPointHandler)//未登录请求处理
- .accessDeniedHandler(userAuthAccessDeniedHandler)//无权限访问处理类 (此配置可以忽略,全局异常会先于Security框架处理异常,全局异常已特殊处理)
- .and().formLogin().loginProcessingUrl(securityProperties.getAuthApi())//指定认证接口
- .successHandler(userLoginSuccessHandler)//登录成功处理器
- .failureHandler(userLoginFailureHandler)//登录失败处理器
- .and().cors().and().csrf().disable();//允许跨域
- //自定义过滤器在登录时认证用户名、密码
- httpSecurity.addFilterAt(userAuthenticationProcessingFilter, UsernamePasswordAuthenticationFilter.class)
- .addFilterBefore(authenticationFilter, BasicAuthenticationFilter.class);
- //不创建session会话
- httpSecurity.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
- //取消头缓存控制
- httpSecurity.headers().cacheControl();
- }
-
- @Bean
- public DefaultWebSecurityExpressionHandler userSecurityExpressionHandler() {
- DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler();
- handler.setPermissionEvaluator(userPermissionEvaluator);
- return handler;
- }
-}
+package com.ai.da.common.security.config;
+
+import com.ai.da.common.security.*;
+import com.ai.da.common.security.filter.AuthenticationFilter;
+import com.ai.da.common.security.filter.UserAuthenticationProcessingFilter;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
+import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
+
+import jakarta.annotation.Resource;
+
+@Configuration
+@EnableWebSecurity
+@EnableMethodSecurity(prePostEnabled = true)
+@EnableConfigurationProperties(SecurityProperties.class)
+public class SecurityConfig {
+
+ @Resource
+ private SecurityProperties securityProperties;
+ @Resource
+ private UserLoginSuccessHandler userLoginSuccessHandler;
+ @Resource
+ private UserLoginFailureHandler userLoginFailureHandler;
+ @Resource
+ private UserAuthAccessDeniedHandler userAuthAccessDeniedHandler;
+ @Resource
+ private UserAuthenticationEntryPointHandler userAuthenticationEntryPointHandler;
+ @Resource
+ private UserAuthenticationManager userAuthenticationManager;
+ @Resource
+ private UserAuthenticationProcessingFilter userAuthenticationProcessingFilter;
+
+ /**
+ * 不通过注入spring管理 让Security来管理 这样自定义的Filter就不会走,.permitAll()才能起作用
+ */
+ @Resource
+ private AuthenticationFilter authenticationFilter;
+ @Resource
+ private UserPermissionEvaluator userPermissionEvaluator;
+
+ @Bean
+ public AuthenticationManager authenticationManager() throws Exception {
+ return this.userAuthenticationManager;
+ }
+
+ @Bean
+ public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
+ httpSecurity
+ .cors(AbstractHttpConfigurer::disable)
+ .authorizeHttpRequests(auth -> auth
+ .requestMatchers(securityProperties.getIgnorePaths()).permitAll()
+ .anyRequest().authenticated()
+ )
+ .headers(headers -> headers
+ .frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)
+ .cacheControl(cache -> cache.disable())
+ )
+ .exceptionHandling(exception -> exception
+ .authenticationEntryPoint(userAuthenticationEntryPointHandler)
+ .accessDeniedHandler(userAuthAccessDeniedHandler)
+ )
+ .formLogin(form -> form
+ .loginProcessingUrl(securityProperties.getAuthApi())
+ .successHandler(userLoginSuccessHandler)
+ .failureHandler(userLoginFailureHandler)
+ )
+ .cors(AbstractHttpConfigurer::disable)
+ .csrf(AbstractHttpConfigurer::disable)
+ .sessionManagement(session -> session
+ .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
+ );
+
+ //自定义过滤器在登录时认证用户名、密码
+ httpSecurity.addFilterAt(userAuthenticationProcessingFilter, UsernamePasswordAuthenticationFilter.class)
+ .addFilterBefore(authenticationFilter, BasicAuthenticationFilter.class);
+
+ return httpSecurity.build();
+ }
+
+ @Bean
+ public DefaultWebSecurityExpressionHandler userSecurityExpressionHandler() {
+ DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler();
+ handler.setPermissionEvaluator(userPermissionEvaluator);
+ return handler;
+ }
+}
diff --git a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java
index d3a053c1..0c2236e8 100644
--- a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java
+++ b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java
@@ -18,12 +18,11 @@ import org.springframework.util.StopWatch;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;
-import javax.annotation.Resource;
-import javax.security.sasl.AuthenticationException;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.annotation.Resource;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
@@ -104,7 +103,7 @@ public class AuthenticationFilter extends OncePerRequestFilter {
return authorizationHeader != null && authorizationHeader.startsWith("Bearer");
}
- private void extracted(HttpServletRequest request) throws AuthenticationException {
+ private void extracted(HttpServletRequest request) {
String jwtToken = request.getHeader(properties.getJwtTokenHeader());
// log.debug("后台检查令牌:{}", jwtToken);
diff --git a/src/main/java/com/ai/da/common/security/filter/UserAuthenticationProcessingFilter.java b/src/main/java/com/ai/da/common/security/filter/UserAuthenticationProcessingFilter.java
index f55de274..4358ca3f 100644
--- a/src/main/java/com/ai/da/common/security/filter/UserAuthenticationProcessingFilter.java
+++ b/src/main/java/com/ai/da/common/security/filter/UserAuthenticationProcessingFilter.java
@@ -1,69 +1,69 @@
-package com.ai.da.common.security.filter;
-
-import cn.hutool.core.util.StrUtil;
-import com.ai.da.common.security.UserLoginSuccessHandler;
-import com.ai.da.common.security.config.SecurityProperties;
-import com.ai.da.common.utils.RedisCacheUtils;
-import com.alibaba.fastjson.JSONObject;
-import com.ai.da.common.security.UserAuthenticationManager;
-import com.ai.da.common.security.UserLoginFailureHandler;
-import com.ai.da.common.utils.MultiReadHttpServletRequest;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.HttpMethod;
-import org.springframework.security.authentication.AuthenticationServiceException;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
-import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author: dangweijian
- * @description: 用户认证过滤器
- * @create: 2020-07-10 15:58
- **/
-@Slf4j
-@Component
-public class UserAuthenticationProcessingFilter extends AbstractAuthenticationProcessingFilter {
-
- /**
- * @param securityProperties 配置(从配置中读取登录url)
- * @param authenticationManager 认证管理器
- * @param adminAuthenticationSuccessHandler 认证成功处理器
- * @param adminAuthenticationFailureHandler 认证失败处理器
- */
- public UserAuthenticationProcessingFilter(SecurityProperties securityProperties, UserAuthenticationManager authenticationManager, UserLoginSuccessHandler adminAuthenticationSuccessHandler, UserLoginFailureHandler adminAuthenticationFailureHandler) {
- super(new AntPathRequestMatcher(securityProperties.getAuthApi(), HttpMethod.POST.name()));
- this.setAuthenticationManager(authenticationManager);
- this.setAuthenticationSuccessHandler(adminAuthenticationSuccessHandler);
- this.setAuthenticationFailureHandler(adminAuthenticationFailureHandler);
- }
-
- @Override
- public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
- if (request.getContentType() == null || !request.getContentType().contains("application/json")) {
- throw new AuthenticationServiceException("请求头类型不支持: " + request.getContentType());
- }
- UsernamePasswordAuthenticationToken authRequest;
- try {
- MultiReadHttpServletRequest wrappedRequest = new MultiReadHttpServletRequest(request);
- // 将前端传递的数据转换成jsonBean数据格式
- JSONObject jsonObject = JSONObject.parseObject(wrappedRequest.getBodyJsonStrByJson(wrappedRequest));
- String code = jsonObject.getString("code");
- String uuid = jsonObject.getString("uuid");
- if (StrUtil.isEmpty(code) || StrUtil.isEmpty(uuid) || !code.equals(RedisCacheUtils.get("code-key-" + uuid, String.class))) {
- throw new AuthenticationServiceException("验证码错误");
- }
- RedisCacheUtils.delete("code-key-" + uuid);
- authRequest = new UsernamePasswordAuthenticationToken(jsonObject.get("username"), jsonObject.get("password"), null);
- authRequest.setDetails(authenticationDetailsSource.buildDetails(wrappedRequest));
- } catch (Exception e) {
- throw new AuthenticationServiceException(e.getMessage());
- }
- return this.getAuthenticationManager().authenticate(authRequest);
- }
-}
+package com.ai.da.common.security.filter;
+
+import cn.hutool.core.util.StrUtil;
+import com.ai.da.common.security.UserLoginSuccessHandler;
+import com.ai.da.common.security.config.SecurityProperties;
+import com.ai.da.common.utils.RedisCacheUtils;
+import com.alibaba.fastjson.JSONObject;
+import com.ai.da.common.security.UserAuthenticationManager;
+import com.ai.da.common.security.UserLoginFailureHandler;
+import com.ai.da.common.utils.MultiReadHttpServletRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpMethod;
+import org.springframework.security.authentication.AuthenticationServiceException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+import org.springframework.stereotype.Component;
+
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * @author: dangweijian
+ * @description: 用户认证过滤器
+ * @create: 2020-07-10 15:58
+ **/
+@Slf4j
+@Component
+public class UserAuthenticationProcessingFilter extends AbstractAuthenticationProcessingFilter {
+
+ /**
+ * @param securityProperties 配置(从配置中读取登录url)
+ * @param authenticationManager 认证管理器
+ * @param adminAuthenticationSuccessHandler 认证成功处理器
+ * @param adminAuthenticationFailureHandler 认证失败处理器
+ */
+ public UserAuthenticationProcessingFilter(SecurityProperties securityProperties, UserAuthenticationManager authenticationManager, UserLoginSuccessHandler adminAuthenticationSuccessHandler, UserLoginFailureHandler adminAuthenticationFailureHandler) {
+ super(new AntPathRequestMatcher(securityProperties.getAuthApi(), HttpMethod.POST.name()));
+ this.setAuthenticationManager(authenticationManager);
+ this.setAuthenticationSuccessHandler(adminAuthenticationSuccessHandler);
+ this.setAuthenticationFailureHandler(adminAuthenticationFailureHandler);
+ }
+
+ @Override
+ public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
+ if (request.getContentType() == null || !request.getContentType().contains("application/json")) {
+ throw new AuthenticationServiceException("请求头类型不支持: " + request.getContentType());
+ }
+ UsernamePasswordAuthenticationToken authRequest;
+ try {
+ MultiReadHttpServletRequest wrappedRequest = new MultiReadHttpServletRequest(request);
+ // 将前端传递的数据转换成jsonBean数据格式
+ JSONObject jsonObject = JSONObject.parseObject(wrappedRequest.getBodyJsonStrByJson(wrappedRequest));
+ String code = jsonObject.getString("code");
+ String uuid = jsonObject.getString("uuid");
+ if (StrUtil.isEmpty(code) || StrUtil.isEmpty(uuid) || !code.equals(RedisCacheUtils.get("code-key-" + uuid, String.class))) {
+ throw new AuthenticationServiceException("验证码错误");
+ }
+ RedisCacheUtils.delete("code-key-" + uuid);
+ authRequest = new UsernamePasswordAuthenticationToken(jsonObject.get("username"), jsonObject.get("password"), null);
+ authRequest.setDetails(authenticationDetailsSource.buildDetails(wrappedRequest));
+ } catch (Exception e) {
+ throw new AuthenticationServiceException(e.getMessage());
+ }
+ return this.getAuthenticationManager().authenticate(authRequest);
+ }
+}
diff --git a/src/main/java/com/ai/da/common/security/jwt/JWTTokenHelper.java b/src/main/java/com/ai/da/common/security/jwt/JWTTokenHelper.java
index d536ab29..6fd76f79 100644
--- a/src/main/java/com/ai/da/common/security/jwt/JWTTokenHelper.java
+++ b/src/main/java/com/ai/da/common/security/jwt/JWTTokenHelper.java
@@ -1,87 +1,108 @@
-package com.ai.da.common.security.jwt;
-
-import cn.hutool.core.map.MapUtil;
-import cn.hutool.core.util.StrUtil;
-import com.ai.da.common.constant.CommonConstant;
-import com.ai.da.common.security.config.SecurityProperties;
-import com.ai.da.model.vo.AuthPrincipalVo;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import io.jsonwebtoken.Claims;
-import io.jsonwebtoken.Jwts;
-import io.jsonwebtoken.SignatureAlgorithm;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.Date;
-
-/**
- * @author: dangweijian
- * @description: JWT工具
- * @create: 2020-07-09 09:27
- **/
-@Slf4j
-@Component
-public class JWTTokenHelper {
-
- @Resource
- private SecurityProperties securityProperties;
-
- private static final String ISSUER = "DWJ";
- private static final String AUTHORITIES = "authorities";
- private static final String CHANGE_MAILBOX = "changeMailbox";
-
- public String createToken(AuthPrincipalVo principal) {
- String token = Jwts.builder()
- .setId(String.valueOf(principal.getId()))
- .setSubject(JSONObject.toJSONString(principal))
- .setIssuedAt(new Date())
- .setIssuer(ISSUER)
- .claim(AUTHORITIES, JSON.toJSONString(new ArrayList<>()))//自定义属性 权限
- .setExpiration(new Date(System.currentTimeMillis() + securityProperties.getJwtExpiration()))
- .signWith(SignatureAlgorithm.HS512, securityProperties.getJwtSecret())
- .compact();
- token = securityProperties.getJwtTokenPrefix() + token;
- return token;
- }
-
- public boolean validateToken(String token) {
- Claims claims = parser(token);
- if (MapUtil.isEmpty(claims)) {
- return false;
- }
- return true;
- }
-
- public AuthPrincipalVo parserToUser(String token) {
- String subject = parser(token).getSubject();
- if (StrUtil.isNotEmpty(subject)) {
- return JSONObject.parseObject(subject, AuthPrincipalVo.class);
- }
- return null;
- }
-
- public Claims parser(String token) {
- token = token.replaceAll(securityProperties.getJwtTokenPrefix(), "");
- return Jwts.parser().setSigningKey(securityProperties.getJwtSecret()).parseClaimsJws(token).getBody();
- }
-
- public String createToken(Long userId, String userEmail){
- String token = Jwts.builder()
- .setId(String.valueOf(userId))
- .setSubject(userEmail + "_" + userId)
- .setIssuedAt(new Date())
- .setIssuer(ISSUER)
- .claim(CHANGE_MAILBOX, JSON.toJSONString(new ArrayList<>()))//自定义属性 权限
- .setExpiration(new Date(System.currentTimeMillis() + CommonConstant.CHANGE_MAILBOX_LINK_VALIDITY))
- .signWith(SignatureAlgorithm.HS256, securityProperties.getJwtSecret())
- .compact();
- return token;
- }
-
- public String parseToEmailAndId(String token) {
- return parser(token).getSubject();
- }
-}
+package com.ai.da.common.security.jwt;
+
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.digest.DigestUtil;
+import com.ai.da.common.constant.CommonConstant;
+import com.ai.da.common.security.config.SecurityProperties;
+import com.ai.da.model.vo.AuthPrincipalVo;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.security.Keys;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import jakarta.annotation.Resource;
+import javax.crypto.SecretKey;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Date;
+
+/**
+ * @author: dangweijian
+ * @description: JWT工具
+ * @create: 2020-07-09 09:27
+ **/
+@Slf4j
+@Component
+public class JWTTokenHelper {
+
+ @Resource
+ private SecurityProperties securityProperties;
+
+ private static final String ISSUER = "DWJ";
+ private static final String AUTHORITIES = "authorities";
+ private static final String CHANGE_MAILBOX = "changeMailbox";
+
+ public String createToken(AuthPrincipalVo principal) {
+ SecretKey key = buildSigningKey();
+ String token = Jwts.builder()
+ .id(String.valueOf(principal.getId()))
+ .subject(JSONObject.toJSONString(principal))
+ .issuedAt(new Date())
+ .issuer(ISSUER)
+ .claim(AUTHORITIES, JSON.toJSONString(new ArrayList<>()))//自定义属性 权限
+ .expiration(new Date(System.currentTimeMillis() + securityProperties.getJwtExpiration()))
+ .signWith(key)
+ .compact();
+ token = securityProperties.getJwtTokenPrefix() + token;
+ return token;
+ }
+
+ public boolean validateToken(String token) {
+ Claims claims = parser(token);
+ if (MapUtil.isEmpty(claims)) {
+ return false;
+ }
+ return true;
+ }
+
+ public AuthPrincipalVo parserToUser(String token) {
+ String subject = parser(token).getSubject();
+ if (StrUtil.isNotEmpty(subject)) {
+ return JSONObject.parseObject(subject, AuthPrincipalVo.class);
+ }
+ return null;
+ }
+
+ public Claims parser(String token) {
+ token = token.replaceAll(securityProperties.getJwtTokenPrefix(), "");
+ SecretKey key = buildSigningKey();
+ return Jwts.parser()
+ .verifyWith(key)
+ .build()
+ .parseSignedClaims(token)
+ .getPayload();
+ }
+
+ public String createToken(Long userId, String userEmail){
+ SecretKey key = buildSigningKey();
+ String token = Jwts.builder()
+ .id(String.valueOf(userId))
+ .subject(userEmail + "_" + userId)
+ .issuedAt(new Date())
+ .issuer(ISSUER)
+ .claim(CHANGE_MAILBOX, JSON.toJSONString(new ArrayList<>()))//自定义属性 权限
+ .expiration(new Date(System.currentTimeMillis() + CommonConstant.CHANGE_MAILBOX_LINK_VALIDITY))
+ .signWith(key)
+ .compact();
+ return token;
+ }
+
+ public String parseToEmailAndId(String token) {
+ return parser(token).getSubject();
+ }
+
+ /**
+ * JWT 要求 HMAC-SHA 的密钥至少 256 bit,这里统一扩展/哈希密钥长度避免 WeakKeyException。
+ */
+ private SecretKey buildSigningKey() {
+ byte[] raw = securityProperties.getJwtSecret().getBytes(StandardCharsets.UTF_8);
+ if (raw.length < 32) {
+ raw = DigestUtil.sha256(raw);
+ }
+ return Keys.hmacShaKeyFor(raw);
+ }
+}
diff --git a/src/main/java/com/ai/da/common/task/AccountTask.java b/src/main/java/com/ai/da/common/task/AccountTask.java
index 4907014f..542837ce 100644
--- a/src/main/java/com/ai/da/common/task/AccountTask.java
+++ b/src/main/java/com/ai/da/common/task/AccountTask.java
@@ -7,7 +7,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.util.List;
@Component
diff --git a/src/main/java/com/ai/da/common/task/GenerateTask.java b/src/main/java/com/ai/da/common/task/GenerateTask.java
index 7617032b..88551175 100644
--- a/src/main/java/com/ai/da/common/task/GenerateTask.java
+++ b/src/main/java/com/ai/da/common/task/GenerateTask.java
@@ -14,7 +14,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
-import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
diff --git a/src/main/java/com/ai/da/common/task/MoveDataScheduler.java b/src/main/java/com/ai/da/common/task/MoveDataScheduler.java
index 759a9067..167b65cc 100644
--- a/src/main/java/com/ai/da/common/task/MoveDataScheduler.java
+++ b/src/main/java/com/ai/da/common/task/MoveDataScheduler.java
@@ -17,8 +17,8 @@
//import org.springframework.stereotype.Component;
//import org.springframework.util.CollectionUtils;
//
-//import javax.annotation.PostConstruct;
-//import javax.annotation.Resource;
+//import jakarta.annotation.PostConstruct;
+//import jakarta.annotation.Resource;
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.nio.file.Files;
diff --git a/src/main/java/com/ai/da/common/task/PaymentTask.java b/src/main/java/com/ai/da/common/task/PaymentTask.java
index 794c8483..0ead7b54 100644
--- a/src/main/java/com/ai/da/common/task/PaymentTask.java
+++ b/src/main/java/com/ai/da/common/task/PaymentTask.java
@@ -8,7 +8,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.time.LocalDate;
import java.util.List;
diff --git a/src/main/java/com/ai/da/common/utils/FileUtil.java b/src/main/java/com/ai/da/common/utils/FileUtil.java
index 30f4018b..9ad3edf5 100644
--- a/src/main/java/com/ai/da/common/utils/FileUtil.java
+++ b/src/main/java/com/ai/da/common/utils/FileUtil.java
@@ -1,313 +1,325 @@
-package com.ai.da.common.utils;
-
-import cn.hutool.core.exceptions.ExceptionUtil;
-import cn.hutool.core.util.IdUtil;
-import cn.hutool.core.util.StrUtil;
-import com.ai.da.common.config.exception.BusinessException;
-import com.ai.da.model.vo.FileVO;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.multipart.commons.CommonsMultipartFile;
-
-import javax.imageio.ImageIO;
-import java.awt.image.BufferedImage;
-import java.io.*;
-import java.net.URL;
-import java.text.DecimalFormat;
-import java.text.SimpleDateFormat;
-import java.util.*;
-
-public class FileUtil extends cn.hutool.core.io.FileUtil {
-
- private static final Logger log = LoggerFactory.getLogger(com.ai.da.common.utils.FileUtil.class);
-
- /**
- * 系统临时目录
- *
- * windows 包含路径分割符,但Linux 不包含,
- * 在windows \\==\ 前提下,
- * 为安全起见 同意拼装 路径分割符,
- *
- * java.io.tmpdir
- * windows : C:\Users/xxx\AppData\Local\Temp\
- * linux: /temp
- *
- */
- public static final String SYS_TEM_DIR = System.getProperty("java.io.tmpdir") + File.separator;
- /**
- * 定义GB的计算常量
- */
- private static final int GB = 1024 * 1024 * 1024;
- /**
- * 定义MB的计算常量
- */
- private static final int MB = 1024 * 1024;
- /**
- * 定义KB的计算常量
- */
- private static final int KB = 1024;
-
- /**
- * 格式化小数
- */
- private static final DecimalFormat DF = new DecimalFormat("0.00");
-
- public static final String IMAGE = "图片";
- public static final String TXT = "文档";
- public static final String MUSIC = "音乐";
- public static final String VIDEO = "视频";
- public static final String OTHER = "其他";
-
-
- /**
- * MultipartFile转File
- */
- public static File toFile(MultipartFile multipartFile) {
- // 获取文件名
- String fileName = multipartFile.getOriginalFilename();
- // 获取文件后缀
- String prefix = "." + getExtensionName(fileName);
- File file = null;
- try {
- // 用uuid作为文件名,防止生成的临时文件重复
- file = new File(SYS_TEM_DIR + IdUtil.simpleUUID() + prefix);
- // MultipartFile to File
- multipartFile.transferTo(file);
- } catch (IOException e) {
- log.error(e.getMessage(), e);
- }
- return file;
- }
-
-// public static void main(String[] args) {
-// File file = new File(
-// "http://18.162.111.141:5568/download/202211/userFile/collection/Printboard/1/a3c9838c-2171-44d7-af54-c94ee6affcd9print_2.jpg.png");
-// FileUtil.getFileSize()
-// }
-
- /**
- * 获取文件扩展名,不带 .
- */
- public static String getExtensionName(String filename) {
- if ((filename != null) && (filename.length() > 0)) {
- int dot = filename.lastIndexOf('.');
- if ((dot > -1) && (dot < (filename.length() - 1))) {
- return filename.substring(dot + 1);
- }
- }
- return filename;
- }
-
-
- /**
- * inputStream 转 File
- */
- static File inputStreamToFile(InputStream ins, String name) {
- File file = new File(SYS_TEM_DIR + name);
- if (file.exists()) {
- return file;
- }
- OutputStream os = null;
- try {
- os = new FileOutputStream(file);
- int bytesRead;
- int len = 8192;
- byte[] buffer = new byte[len];
- while ((bytesRead = ins.read(buffer, 0, len)) != -1) {
- os.write(buffer, 0, bytesRead);
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- CloseUtil.close(os);
- CloseUtil.close(ins);
- }
- return file;
- }
-
- /**
- * 获取文件尺寸
- */
- public static FileVO getFileSize(MultipartFile file) {
- int width = 0;
- int height = 0;
- try {
- // 图片对象
- BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
- // 宽度
- width = bufferedImage.getWidth();
- // 高度
- height = bufferedImage.getHeight();
- } catch (IOException ioException) {
- log.error("获取文件尺寸异常###{}", ExceptionUtil.stacktraceToString(ioException));
- }
- return new FileVO(height, width);
- }
-
- /**
- * 获取文件尺寸
- */
- public static FileVO getFileSize(InputStream inputStream) {
- int width = 0;
- int height = 0;
- try {
- // 图片对象
- BufferedImage bufferedImage = ImageIO.read(inputStream);
- // 宽度
- width = bufferedImage.getWidth();
- // 高度
- height = bufferedImage.getHeight();
- } catch (IOException ioException) {
- log.error("获取文件尺寸异常###{}", ExceptionUtil.stacktraceToString(ioException));
- }
- return new FileVO(height, width);
- }
-
- /**
- * 获取远程文件流
- */
- public static InputStream getOriginFile(String path) {
-
- try {
- //远程
- URL url = new URL(path);
- return url.openStream();
- } catch (IOException ioException) {
- log.error("获取源文件异常###{}###path##{}", ExceptionUtil.stacktraceToString(ioException), path);
- throw new BusinessException("get.file.failed");
- }
- }
-
- /**
- * 将文件名解析成文件的上传路径
- */
- public static File upload(MultipartFile file, String filePath) {
- Date date = new Date();
- SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmssS");
- String suffix = getExtensionName(file.getOriginalFilename());
- String nowStr = format.format(date) + "-";
- try {
- String fileName = file.getOriginalFilename();
- String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
- String path = filePath + fileSuffix;
- // getCanonicalFile 可解析正确各种路径
- File dest = new File(path).getCanonicalFile();
- // 检测是否存在目录
- if (!dest.getParentFile().exists()) {
- if (!dest.getParentFile().mkdirs()) {
- System.out.println("was not successful.");
- }
- }
- // 文件写入
- file.transferTo(dest);
- return dest;
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- }
- return null;
- }
-
- /**
- * 将文件名解析成文件的上传路径
- */
- public static File upload2(MultipartFile file, String filePath) {
- Date date = new Date();
- SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmssS");
- String suffix = getExtensionName(file.getOriginalFilename());
- String nowStr = format.format(date) + "-";
- try {
- String fileName = file.getOriginalFilename();
- String path = filePath + fileName;
- // getCanonicalFile 可解析正确各种路径
- File dest = new File(path).getCanonicalFile();
- // 检测是否存在目录
- if (!dest.getParentFile().exists()) {
- if (!dest.getParentFile().mkdirs()) {
- System.out.println("was not successful.");
- }
- }
- // 文件写入
- file.transferTo(dest);
- return dest;
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- }
- return null;
- }
-
- /**
- * 删除文件
- */
- public static boolean delete(String path) {
- File file = new File(path);
- if (file.exists()) {
- return file.delete();
- }
- return false;
- }
-
- /**
- * 获取指定文件夹下所有文件,不含文件夹里的文件
- *
- * @param dirFilePath 文件夹路径
- * @return
- */
- public static List getAllFile(String dirFilePath) {
- if (StrUtil.isBlank(dirFilePath)) {
- return null;
- }
- return getAllFile(new File(dirFilePath));
- }
-
- /**
- * 获取指定文件夹下所有文件,不含文件夹里的文件
- *
- * @param dirFile 文件夹
- * @return
- */
- public static List getAllFile(File dirFile) {
- // 如果文件夹不存在或着不是文件夹,则返回 null
- if (Objects.isNull(dirFile) || !dirFile.exists() || dirFile.isFile()) {
- return null;
- }
- File[] childrenFiles = dirFile.listFiles();
- if (Objects.isNull(childrenFiles) || childrenFiles.length == 0) {
- return null;
- }
- List files = new ArrayList<>();
- for (File childFile : childrenFiles) {
- // 如果是文件,直接添加到结果集合
- if (childFile.isFile()) {
- files.add(childFile);
- }
- //以下几行代码取消注释后可以将所有子文件夹里的文件也获取到列表里
- else {
- // 如果是文件夹,则将其内部文件添加进结果集合
- List cFiles = getAllFile(childFile);
- if (Objects.isNull(cFiles) || cFiles.isEmpty()) {
- continue;
- }
- files.addAll(cFiles);
- }
- }
- return files;
- }
-
- // 判断文件是否存在
- public static boolean isFileExists(String filePath) {
- File file = new File(filePath);
- return file.exists() && file.isFile();
- }
-
- // 根据路径获取文件
- public static File getFile(String filePath) {
- File file = new File(filePath);
- if (file.exists() && file.isFile()) {
- return file;
- } else {
- return null;
- }
- }
-
-}
+package com.ai.da.common.utils;
+
+import cn.hutool.core.exceptions.ExceptionUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import com.ai.da.common.config.exception.BusinessException;
+import com.ai.da.model.vo.FileVO;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.net.URL;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+public class FileUtil extends cn.hutool.core.io.FileUtil {
+
+ private static final Logger log = LoggerFactory.getLogger(com.ai.da.common.utils.FileUtil.class);
+
+ /**
+ * 系统临时目录
+ *
+ * windows 包含路径分割符,但Linux 不包含,
+ * 在windows \\==\ 前提下,
+ * 为安全起见 同意拼装 路径分割符,
+ *
+ * java.io.tmpdir
+ * windows : C:\Users/xxx\AppData\Local\Temp\
+ * linux: /temp
+ *
+ */
+ public static final String SYS_TEM_DIR = System.getProperty("java.io.tmpdir") + File.separator;
+ /**
+ * 定义GB的计算常量
+ */
+ private static final int GB = 1024 * 1024 * 1024;
+ /**
+ * 定义MB的计算常量
+ */
+ private static final int MB = 1024 * 1024;
+ /**
+ * 定义KB的计算常量
+ */
+ private static final int KB = 1024;
+
+ /**
+ * 格式化小数
+ */
+ private static final DecimalFormat DF = new DecimalFormat("0.00");
+
+ public static final String IMAGE = "图片";
+ public static final String TXT = "文档";
+ public static final String MUSIC = "音乐";
+ public static final String VIDEO = "视频";
+ public static final String OTHER = "其他";
+
+
+ /**
+ * MultipartFile转File
+ */
+ public static File toFile(MultipartFile multipartFile) {
+ // 获取文件名
+ String fileName = multipartFile.getOriginalFilename();
+ // 获取文件后缀
+ String prefix = "." + getExtensionName(fileName);
+ File file = null;
+ try {
+ // 用uuid作为文件名,防止生成的临时文件重复
+ file = new File(SYS_TEM_DIR + IdUtil.simpleUUID() + prefix);
+ // MultipartFile to File
+ multipartFile.transferTo(file);
+ } catch (IOException e) {
+ log.error(e.getMessage(), e);
+ }
+ return file;
+ }
+
+// public static void main(String[] args) {
+// File file = new File(
+// "http://18.162.111.141:5568/download/202211/userFile/collection/Printboard/1/a3c9838c-2171-44d7-af54-c94ee6affcd9print_2.jpg.png");
+// FileUtil.getFileSize()
+// }
+
+ /**
+ * 获取文件扩展名,不带 .
+ */
+ public static String getExtensionName(String filename) {
+ if ((filename != null) && (filename.length() > 0)) {
+ int dot = filename.lastIndexOf('.');
+ if ((dot > -1) && (dot < (filename.length() - 1))) {
+ return filename.substring(dot + 1);
+ }
+ }
+ return filename;
+ }
+
+
+ /**
+ * inputStream 转 File
+ */
+ static File inputStreamToFile(InputStream ins, String name) {
+ File file = new File(SYS_TEM_DIR + name);
+ if (file.exists()) {
+ return file;
+ }
+ OutputStream os = null;
+ try {
+ os = new FileOutputStream(file);
+ int bytesRead;
+ int len = 8192;
+ byte[] buffer = new byte[len];
+ while ((bytesRead = ins.read(buffer, 0, len)) != -1) {
+ os.write(buffer, 0, bytesRead);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ CloseUtil.close(os);
+ CloseUtil.close(ins);
+ }
+ return file;
+ }
+
+ /**
+ * 获取文件尺寸
+ */
+ public static FileVO getFileSize(MultipartFile file) {
+ int width = 0;
+ int height = 0;
+ try {
+ // 图片对象
+ BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
+ // 宽度
+ width = bufferedImage.getWidth();
+ // 高度
+ height = bufferedImage.getHeight();
+ } catch (IOException ioException) {
+ log.error("获取文件尺寸异常###{}", ExceptionUtil.stacktraceToString(ioException));
+ }
+ return new FileVO(height, width);
+ }
+
+ /**
+ * 获取文件尺寸
+ */
+ public static FileVO getFileSize(InputStream inputStream) {
+ int width = 0;
+ int height = 0;
+ try {
+ // 图片对象
+ BufferedImage bufferedImage = ImageIO.read(inputStream);
+ // 宽度
+ width = bufferedImage.getWidth();
+ // 高度
+ height = bufferedImage.getHeight();
+ } catch (IOException ioException) {
+ log.error("获取文件尺寸异常###{}", ExceptionUtil.stacktraceToString(ioException));
+ }
+ return new FileVO(height, width);
+ }
+
+ /**
+ * 获取远程文件流
+ */
+ public static InputStream getOriginFile(String path) {
+
+ try {
+ //远程
+ URL url = new URL(path);
+ return url.openStream();
+ } catch (IOException ioException) {
+ log.error("获取源文件异常###{}###path##{}", ExceptionUtil.stacktraceToString(ioException), path);
+ throw new BusinessException("get.file.failed");
+ }
+ }
+
+ /**
+ * 将文件名解析成文件的上传路径
+ */
+ public static File upload(MultipartFile file, String filePath) {
+ Date date = new Date();
+ SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmssS");
+ String suffix = getExtensionName(file.getOriginalFilename());
+ String nowStr = format.format(date) + "-";
+ try {
+ String fileName = file.getOriginalFilename();
+ String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
+ String path = filePath + fileSuffix;
+ // getCanonicalFile 可解析正确各种路径
+ File dest = new File(path).getCanonicalFile();
+ // 检测是否存在目录
+ if (!dest.getParentFile().exists()) {
+ if (!dest.getParentFile().mkdirs()) {
+ System.out.println("was not successful.");
+ }
+ }
+ // 文件写入
+ file.transferTo(dest);
+ return dest;
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ }
+ return null;
+ }
+
+ /**
+ * 将文件名解析成文件的上传路径
+ */
+ public static File upload2(MultipartFile file, String filePath) {
+ Date date = new Date();
+ SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmssS");
+ String suffix = getExtensionName(file.getOriginalFilename());
+ String nowStr = format.format(date) + "-";
+ try {
+ String fileName = file.getOriginalFilename();
+ String path = filePath + fileName;
+ // getCanonicalFile 可解析正确各种路径
+ File dest = new File(path).getCanonicalFile();
+ // 检测是否存在目录
+ if (!dest.getParentFile().exists()) {
+ if (!dest.getParentFile().mkdirs()) {
+ System.out.println("was not successful.");
+ }
+ }
+ // 文件写入
+ file.transferTo(dest);
+ return dest;
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ }
+ return null;
+ }
+
+ /**
+ * 删除文件
+ */
+ public static boolean delete(String path) {
+ File file = new File(path);
+ if (file.exists()) {
+ return file.delete();
+ }
+ return false;
+ }
+
+ /**
+ * 获取指定文件夹下所有文件,不含文件夹里的文件
+ *
+ * @param dirFilePath 文件夹路径
+ * @return
+ */
+ public static List getAllFile(String dirFilePath) {
+ if (StrUtil.isBlank(dirFilePath)) {
+ return null;
+ }
+ return getAllFile(new File(dirFilePath));
+ }
+
+ /**
+ * 获取指定文件夹下所有文件,不含文件夹里的文件
+ *
+ * @param dirFile 文件夹
+ * @return
+ */
+ public static List getAllFile(File dirFile) {
+ // 如果文件夹不存在或着不是文件夹,则返回 null
+ if (Objects.isNull(dirFile) || !dirFile.exists() || dirFile.isFile()) {
+ return null;
+ }
+ File[] childrenFiles = dirFile.listFiles();
+ if (Objects.isNull(childrenFiles) || childrenFiles.length == 0) {
+ return null;
+ }
+ List files = new ArrayList<>();
+ for (File childFile : childrenFiles) {
+ // 如果是文件,直接添加到结果集合
+ if (childFile.isFile()) {
+ files.add(childFile);
+ }
+ //以下几行代码取消注释后可以将所有子文件夹里的文件也获取到列表里
+ else {
+ // 如果是文件夹,则将其内部文件添加进结果集合
+ List cFiles = getAllFile(childFile);
+ if (Objects.isNull(cFiles) || cFiles.isEmpty()) {
+ continue;
+ }
+ files.addAll(cFiles);
+ }
+ }
+ return files;
+ }
+
+ // 判断文件是否存在
+ public static boolean isFileExists(String filePath) {
+ File file = new File(filePath);
+ return file.exists() && file.isFile();
+ }
+
+ // 根据路径获取文件
+ public static File getFile(String filePath) {
+ File file = new File(filePath);
+ if (file.exists() && file.isFile()) {
+ return file;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * 将 FileItem 转换为 MultipartFile
+ * 用于 Spring Boot 3.x 兼容性(CommonsMultipartFile 已移除)
+ */
+ public static MultipartFile fileItemToMultipartFile(org.apache.commons.fileupload.FileItem fileItem) {
+ String fieldName = fileItem.getFieldName();
+ String fileName = fileItem.getName();
+ String contentType = fileItem.getContentType();
+ byte[] content = fileItem.get();
+ return new MockMultipartFile(fieldName, fileName, contentType, content);
+ }
+
+}
diff --git a/src/main/java/com/ai/da/common/utils/JSONResponseUtils.java b/src/main/java/com/ai/da/common/utils/JSONResponseUtils.java
index 8caa3e5d..18b09397 100644
--- a/src/main/java/com/ai/da/common/utils/JSONResponseUtils.java
+++ b/src/main/java/com/ai/da/common/utils/JSONResponseUtils.java
@@ -4,7 +4,7 @@ import com.alibaba.fastjson.JSON;
import com.ai.da.common.response.Response;
import lombok.extern.slf4j.Slf4j;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletResponse;
import java.io.PrintWriter;
diff --git a/src/main/java/com/ai/da/common/utils/MailUtil.java b/src/main/java/com/ai/da/common/utils/MailUtil.java
index ed3325f5..846c959a 100644
--- a/src/main/java/com/ai/da/common/utils/MailUtil.java
+++ b/src/main/java/com/ai/da/common/utils/MailUtil.java
@@ -15,9 +15,9 @@ import org.springframework.stereotype.Component;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
-import javax.annotation.Resource;
-import javax.mail.MessagingException;
-import javax.mail.internet.*;
+import jakarta.annotation.Resource;
+import jakarta.mail.MessagingException;
+import jakarta.mail.internet.*;
import java.util.List;
import java.util.Objects;
diff --git a/src/main/java/com/ai/da/common/utils/MultiReadHttpServletRequest.java b/src/main/java/com/ai/da/common/utils/MultiReadHttpServletRequest.java
index f9c49cc8..d54c022e 100644
--- a/src/main/java/com/ai/da/common/utils/MultiReadHttpServletRequest.java
+++ b/src/main/java/com/ai/da/common/utils/MultiReadHttpServletRequest.java
@@ -3,11 +3,11 @@ package com.ai.da.common.utils;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
-import javax.servlet.ReadListener;
-import javax.servlet.ServletInputStream;
-import javax.servlet.ServletRequest;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
+import jakarta.servlet.ReadListener;
+import jakarta.servlet.ServletInputStream;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Enumeration;
diff --git a/src/main/java/com/ai/da/common/utils/MultiReadHttpServletResponse.java b/src/main/java/com/ai/da/common/utils/MultiReadHttpServletResponse.java
index 8b39a9bd..70a16176 100644
--- a/src/main/java/com/ai/da/common/utils/MultiReadHttpServletResponse.java
+++ b/src/main/java/com/ai/da/common/utils/MultiReadHttpServletResponse.java
@@ -3,10 +3,10 @@ package com.ai.da.common.utils;
import lombok.AllArgsConstructor;
import lombok.Data;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.WriteListener;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
+import jakarta.servlet.ServletOutputStream;
+import jakarta.servlet.WriteListener;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponseWrapper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
diff --git a/src/main/java/com/ai/da/common/utils/RedisUtil.java b/src/main/java/com/ai/da/common/utils/RedisUtil.java
index c40edac7..70be134a 100644
--- a/src/main/java/com/ai/da/common/utils/RedisUtil.java
+++ b/src/main/java/com/ai/da/common/utils/RedisUtil.java
@@ -16,7 +16,7 @@ import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.Duration;
diff --git a/src/main/java/com/ai/da/common/utils/RedisUtilEnhance.java b/src/main/java/com/ai/da/common/utils/RedisUtilEnhance.java
index d6341b38..f148905d 100644
--- a/src/main/java/com/ai/da/common/utils/RedisUtilEnhance.java
+++ b/src/main/java/com/ai/da/common/utils/RedisUtilEnhance.java
@@ -13,8 +13,8 @@ import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
-import javax.annotation.PostConstruct;
-import javax.annotation.Resource;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
diff --git a/src/main/java/com/ai/da/common/utils/RequestInfoUtil.java b/src/main/java/com/ai/da/common/utils/RequestInfoUtil.java
index ace3af37..55034d27 100644
--- a/src/main/java/com/ai/da/common/utils/RequestInfoUtil.java
+++ b/src/main/java/com/ai/da/common/utils/RequestInfoUtil.java
@@ -3,7 +3,7 @@ package com.ai.da.common.utils;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
diff --git a/src/main/java/com/ai/da/common/utils/S3Util.java b/src/main/java/com/ai/da/common/utils/S3Util.java
index da00c388..66680a1f 100644
--- a/src/main/java/com/ai/da/common/utils/S3Util.java
+++ b/src/main/java/com/ai/da/common/utils/S3Util.java
@@ -19,7 +19,7 @@ import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest;
import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest;
-import javax.annotation.PostConstruct;
+import jakarta.annotation.PostConstruct;
import java.io.*;
import java.time.Duration;
import java.util.*;
diff --git a/src/main/java/com/ai/da/common/websocket/NotificationConnection.java b/src/main/java/com/ai/da/common/websocket/NotificationConnection.java
index 595f268a..710ab1cc 100644
--- a/src/main/java/com/ai/da/common/websocket/NotificationConnection.java
+++ b/src/main/java/com/ai/da/common/websocket/NotificationConnection.java
@@ -4,11 +4,10 @@ import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
-import org.springframework.web.bind.annotation.RequestParam;
-import javax.websocket.*;
-import javax.websocket.server.PathParam;
-import javax.websocket.server.ServerEndpoint;
+import jakarta.websocket.*;
+import jakarta.websocket.server.PathParam;
+import jakarta.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -58,7 +57,7 @@ public class NotificationConnection {
//收到了客户端消息执行的操作
@OnMessage
- public void onMessage(@RequestParam String text){
+ public void onMessage(String text){
Map textMap = JSONObject.parseObject(text, Map.class);
log.info("收到了一条来自 {} 的消息:{}, sessionId:{}", this.userId, textMap.get("text"), this.session.getId());
// return "已收到你的消息";
diff --git a/src/main/java/com/ai/da/common/websocket/config/WebSocketConfig.java b/src/main/java/com/ai/da/common/websocket/config/WebSocketConfig.java
index 9feb56a1..fe22df5e 100644
--- a/src/main/java/com/ai/da/common/websocket/config/WebSocketConfig.java
+++ b/src/main/java/com/ai/da/common/websocket/config/WebSocketConfig.java
@@ -1,5 +1,7 @@
package com.ai.da.common.websocket.config;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@@ -8,6 +10,8 @@ import org.springframework.web.socket.server.standard.ServerEndpointExporter;
* Configuration of WebSocket
*/
@Configuration
+@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
+@ConditionalOnProperty(name = "websocket.enabled", havingValue = "true", matchIfMissing = true)
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
diff --git a/src/main/java/com/ai/da/controller/AccountController.java b/src/main/java/com/ai/da/controller/AccountController.java
index 2e0eca20..775b35b0 100644
--- a/src/main/java/com/ai/da/controller/AccountController.java
+++ b/src/main/java/com/ai/da/controller/AccountController.java
@@ -21,10 +21,10 @@ import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
diff --git a/src/main/java/com/ai/da/controller/AffiliateController.java b/src/main/java/com/ai/da/controller/AffiliateController.java
index 0c839d2f..b79eb068 100644
--- a/src/main/java/com/ai/da/controller/AffiliateController.java
+++ b/src/main/java/com/ai/da/controller/AffiliateController.java
@@ -19,7 +19,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
diff --git a/src/main/java/com/ai/da/controller/AliPayController.java b/src/main/java/com/ai/da/controller/AliPayController.java
index abde0710..f1674233 100644
--- a/src/main/java/com/ai/da/controller/AliPayController.java
+++ b/src/main/java/com/ai/da/controller/AliPayController.java
@@ -8,9 +8,9 @@ import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import javax.validation.Valid;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.validation.Valid;
import java.util.Map;
@CrossOrigin
diff --git a/src/main/java/com/ai/da/controller/AlipayHKController.java b/src/main/java/com/ai/da/controller/AlipayHKController.java
index 1cfdcf06..34b12370 100644
--- a/src/main/java/com/ai/da/controller/AlipayHKController.java
+++ b/src/main/java/com/ai/da/controller/AlipayHKController.java
@@ -8,9 +8,9 @@ import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import javax.validation.Valid;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.validation.Valid;
@CrossOrigin
@RestController
diff --git a/src/main/java/com/ai/da/controller/ClassificationController.java b/src/main/java/com/ai/da/controller/ClassificationController.java
index 75c4e556..1d69fb4b 100644
--- a/src/main/java/com/ai/da/controller/ClassificationController.java
+++ b/src/main/java/com/ai/da/controller/ClassificationController.java
@@ -12,8 +12,8 @@ import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
-import javax.validation.Valid;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
import java.util.List;
/**
diff --git a/src/main/java/com/ai/da/controller/ConvenientInquiryController.java b/src/main/java/com/ai/da/controller/ConvenientInquiryController.java
index f3707db8..84a2f597 100644
--- a/src/main/java/com/ai/da/controller/ConvenientInquiryController.java
+++ b/src/main/java/com/ai/da/controller/ConvenientInquiryController.java
@@ -23,10 +23,10 @@ import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
-import javax.annotation.Nullable;
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
+import jakarta.annotation.Nullable;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
import java.text.SimpleDateFormat;
import java.util.*;
diff --git a/src/main/java/com/ai/da/controller/CreditsController.java b/src/main/java/com/ai/da/controller/CreditsController.java
index ab02e57f..53fb17a7 100644
--- a/src/main/java/com/ai/da/controller/CreditsController.java
+++ b/src/main/java/com/ai/da/controller/CreditsController.java
@@ -11,8 +11,8 @@ import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
-import javax.validation.Valid;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
@CrossOrigin
@RestController
diff --git a/src/main/java/com/ai/da/controller/DesignController.java b/src/main/java/com/ai/da/controller/DesignController.java
index ea13c4e5..7c148bc2 100644
--- a/src/main/java/com/ai/da/controller/DesignController.java
+++ b/src/main/java/com/ai/da/controller/DesignController.java
@@ -13,11 +13,10 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
-import javax.validation.Valid;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
import java.math.BigDecimal;
import java.util.List;
diff --git a/src/main/java/com/ai/da/controller/DesignDetailController.java b/src/main/java/com/ai/da/controller/DesignDetailController.java
index a02e0835..bcf2aa3c 100644
--- a/src/main/java/com/ai/da/controller/DesignDetailController.java
+++ b/src/main/java/com/ai/da/controller/DesignDetailController.java
@@ -11,8 +11,8 @@ import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
-import javax.validation.Valid;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
import java.io.IOException;
diff --git a/src/main/java/com/ai/da/controller/ElementController.java b/src/main/java/com/ai/da/controller/ElementController.java
index 4e524dac..d21243de 100644
--- a/src/main/java/com/ai/da/controller/ElementController.java
+++ b/src/main/java/com/ai/da/controller/ElementController.java
@@ -16,9 +16,9 @@ import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
-import javax.annotation.Resource;
-import javax.validation.Valid;
-import javax.validation.constraints.Pattern;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.Pattern;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
diff --git a/src/main/java/com/ai/da/controller/EmailController.java b/src/main/java/com/ai/da/controller/EmailController.java
index eebe05e0..9ec0e2ec 100644
--- a/src/main/java/com/ai/da/controller/EmailController.java
+++ b/src/main/java/com/ai/da/controller/EmailController.java
@@ -9,7 +9,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thymeleaf.context.Context;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.util.Collections;
@Api(tags = "邮件模块")
diff --git a/src/main/java/com/ai/da/controller/GenerateController.java b/src/main/java/com/ai/da/controller/GenerateController.java
index 135322bf..8a574b43 100644
--- a/src/main/java/com/ai/da/controller/GenerateController.java
+++ b/src/main/java/com/ai/da/controller/GenerateController.java
@@ -13,9 +13,9 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
import java.util.List;
import java.util.Map;
diff --git a/src/main/java/com/ai/da/controller/LLMController.java b/src/main/java/com/ai/da/controller/LLMController.java
index eb25540a..54c10dbd 100644
--- a/src/main/java/com/ai/da/controller/LLMController.java
+++ b/src/main/java/com/ai/da/controller/LLMController.java
@@ -1,45 +1,20 @@
package com.ai.da.controller;
-import com.ai.da.common.config.exception.BusinessException;
import com.ai.da.common.response.PageBaseResponse;
import com.ai.da.common.response.Response;
-import com.ai.da.mapper.primary.entity.Account;
-import com.ai.da.mapper.primary.entity.AccountExtend;
import com.ai.da.mapper.primary.entity.ChatMessage;
-import com.ai.da.mapper.primary.entity.TrialOrder;
import com.ai.da.model.dto.*;
-import com.ai.da.model.vo.AccountLoginVO;
-import com.ai.da.model.vo.AccountPreLoginVO;
-import com.ai.da.model.vo.BindEmailVO;
-import com.ai.da.model.vo.PersonalHomepageVO;
-import com.ai.da.service.AccountService;
import com.ai.da.service.LLMService;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
-import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
+import jakarta.annotation.Resource;
import java.util.*;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
@Api(tags = "llm模块")
diff --git a/src/main/java/com/ai/da/controller/LibraryController.java b/src/main/java/com/ai/da/controller/LibraryController.java
index afc3e598..752a74c1 100644
--- a/src/main/java/com/ai/da/controller/LibraryController.java
+++ b/src/main/java/com/ai/da/controller/LibraryController.java
@@ -24,8 +24,8 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
-import javax.annotation.Resource;
-import javax.validation.Valid;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
import java.io.File;
import java.text.ParseException;
import java.util.*;
diff --git a/src/main/java/com/ai/da/controller/MessageCenterController.java b/src/main/java/com/ai/da/controller/MessageCenterController.java
index 3f625cb8..b2e070ab 100644
--- a/src/main/java/com/ai/da/controller/MessageCenterController.java
+++ b/src/main/java/com/ai/da/controller/MessageCenterController.java
@@ -11,8 +11,8 @@ import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
-import javax.validation.Valid;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
import java.util.List;
import java.util.Map;
diff --git a/src/main/java/com/ai/da/controller/OrderInfoController.java b/src/main/java/com/ai/da/controller/OrderInfoController.java
index 56e60a48..eb6674db 100644
--- a/src/main/java/com/ai/da/controller/OrderInfoController.java
+++ b/src/main/java/com/ai/da/controller/OrderInfoController.java
@@ -11,8 +11,8 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
-import javax.validation.Valid;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
@CrossOrigin //开放前端的跨域访问
@Api(tags = "商品订单管理")
diff --git a/src/main/java/com/ai/da/controller/PayPalCheckoutController.java b/src/main/java/com/ai/da/controller/PayPalCheckoutController.java
index 8e3eda9a..7600242c 100644
--- a/src/main/java/com/ai/da/controller/PayPalCheckoutController.java
+++ b/src/main/java/com/ai/da/controller/PayPalCheckoutController.java
@@ -11,11 +11,11 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
+import jakarta.annotation.Resource;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
import java.io.IOException;
import java.util.HashMap;
diff --git a/src/main/java/com/ai/da/controller/PortfolioController.java b/src/main/java/com/ai/da/controller/PortfolioController.java
index bfa073af..51ceae71 100644
--- a/src/main/java/com/ai/da/controller/PortfolioController.java
+++ b/src/main/java/com/ai/da/controller/PortfolioController.java
@@ -15,8 +15,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
-import javax.annotation.Resource;
-import javax.validation.Valid;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
import java.util.List;
@Api(tags = "Portfolio模块")
diff --git a/src/main/java/com/ai/da/controller/ProductController.java b/src/main/java/com/ai/da/controller/ProductController.java
index ac2e4be0..c3d83b45 100644
--- a/src/main/java/com/ai/da/controller/ProductController.java
+++ b/src/main/java/com/ai/da/controller/ProductController.java
@@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.util.Date;
import java.util.List;
diff --git a/src/main/java/com/ai/da/controller/ProjectController.java b/src/main/java/com/ai/da/controller/ProjectController.java
index b73501d9..73fc7a5b 100644
--- a/src/main/java/com/ai/da/controller/ProjectController.java
+++ b/src/main/java/com/ai/da/controller/ProjectController.java
@@ -15,9 +15,9 @@ import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
import java.io.IOException;
@Api(tags = "Project模块")
diff --git a/src/main/java/com/ai/da/controller/PythonController.java b/src/main/java/com/ai/da/controller/PythonController.java
index 895d311a..cc8311a2 100644
--- a/src/main/java/com/ai/da/controller/PythonController.java
+++ b/src/main/java/com/ai/da/controller/PythonController.java
@@ -23,7 +23,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;
diff --git a/src/main/java/com/ai/da/controller/SavedCollectionController.java b/src/main/java/com/ai/da/controller/SavedCollectionController.java
index ab26f09d..be59be70 100644
--- a/src/main/java/com/ai/da/controller/SavedCollectionController.java
+++ b/src/main/java/com/ai/da/controller/SavedCollectionController.java
@@ -27,9 +27,9 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
-import javax.annotation.Resource;
-import javax.validation.Valid;
-import javax.validation.constraints.Pattern;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.Pattern;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
diff --git a/src/main/java/com/ai/da/controller/StripeController.java b/src/main/java/com/ai/da/controller/StripeController.java
index 3f24e539..330a0cd6 100644
--- a/src/main/java/com/ai/da/controller/StripeController.java
+++ b/src/main/java/com/ai/da/controller/StripeController.java
@@ -19,13 +19,12 @@ import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
-import springfox.documentation.annotations.ApiIgnore;
-import javax.annotation.Resource;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
+import jakarta.annotation.Resource;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
import java.io.IOException;
import java.util.Date;
import java.util.List;
diff --git a/src/main/java/com/ai/da/controller/TagsController.java b/src/main/java/com/ai/da/controller/TagsController.java
index a248cfcd..f8c67821 100644
--- a/src/main/java/com/ai/da/controller/TagsController.java
+++ b/src/main/java/com/ai/da/controller/TagsController.java
@@ -10,7 +10,7 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.util.Date;
import java.util.List;
diff --git a/src/main/java/com/ai/da/controller/TaskListController.java b/src/main/java/com/ai/da/controller/TaskListController.java
index 85485d50..9e112783 100644
--- a/src/main/java/com/ai/da/controller/TaskListController.java
+++ b/src/main/java/com/ai/da/controller/TaskListController.java
@@ -12,8 +12,8 @@ import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
-import javax.validation.Valid;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
import java.util.List;
@Api(tags = "任务列表模块")
diff --git a/src/main/java/com/ai/da/controller/ThirdPartyController.java b/src/main/java/com/ai/da/controller/ThirdPartyController.java
index f0779f81..671eda82 100644
--- a/src/main/java/com/ai/da/controller/ThirdPartyController.java
+++ b/src/main/java/com/ai/da/controller/ThirdPartyController.java
@@ -1,167 +1,167 @@
-package com.ai.da.controller;
-
-import com.ai.da.common.constant.CommonConstant;
-import com.ai.da.common.response.Response;
-import com.ai.da.common.utils.MinioUtil;
-import com.ai.da.mapper.primary.entity.GoogleUser;
-import com.ai.da.model.dto.*;
-import com.ai.da.model.vo.AccountLoginVO;
-import com.ai.da.model.vo.DesignCollectionVO;
-import com.ai.da.service.AccountService;
-import com.ai.da.service.DesignService;
-import com.alibaba.fastjson.JSONObject;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.security.core.annotation.AuthenticationPrincipal;
-import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-import javax.validation.Valid;
-import java.security.cert.X509Certificate;
-
-
-@Api(tags = "Third Party Modules")
-@Slf4j
-@RestController
-@RequestMapping("/api/third/party")
-public class ThirdPartyController {
-
- @Resource
- private AccountService accountService;
-
- @Resource
- private DesignService designService;
-
- @Resource
- private MinioUtil minioUtil;
-
- /*@ApiOperation(value = "Add user information")
- @PostMapping("/addUser")
- public Response addUser(@Valid @RequestBody AccountAddDTO accountAddDTO) {
- return Response.success(accountService.addUser(accountAddDTO));
- }*/
-
- @ApiOperation(value = "Edit user information")
- @PostMapping("/editUser")
- public Response editUser(@RequestBody AccountEditDTO accountEditDTO) {
- return Response.success(accountService.editUser(accountEditDTO));
- }
-
- @CrossOrigin
- @ApiOperation(value = "Add user information")
- @PostMapping("/addTrialUser")
- public Response addTrialUser(@RequestBody AccountTrialDTO accountTrialDTO, HttpServletRequest request) {
- return Response.success(accountService.addTrialUser(accountTrialDTO, request));
- }
-
- @CrossOrigin
- @ApiOperation(value = "add No Login Required")
- @PostMapping("/addNoLoginRequired")
- public Response addNoLoginRequired(@RequestBody NoLoginRequiredDTO noLoginRequiredDTO) {
- return Response.success(accountService.addNoLoginRequired(noLoginRequiredDTO));
- }
-
- @CrossOrigin
- @ApiOperation(value = "add No Login Required")
- @PostMapping("/deleteNoLoginRequired")
- public Response deleteNoLoginRequired(@RequestBody NoLoginRequiredDTO noLoginRequiredDTO) {
- return Response.success(accountService.deleteNoLoginRequired(noLoginRequiredDTO));
- }
-
- @CrossOrigin
- @ApiOperation(value = "add No Login Required")
- @PostMapping("/existNoLoginRequired")
- public Response existNoLoginRequired(@RequestBody NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request) {
- return Response.success(accountService.existNoLoginRequired(noLoginRequiredDTO, request));
- }
-
- @GetMapping("/your-secured-endpoint")
-// @PreAuthorize("hasRole('ROLE_USER')")
- public String securedEndpoint(HttpServletRequest request, @AuthenticationPrincipal PreAuthenticatedAuthenticationToken authenticationToken) {
- // 从请求属性中获取证书
- X509Certificate[] certificates = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");
- if (certificates != null && certificates.length > 0) {
- X509Certificate clientCertificate = certificates[0];
- // 可以从 clientCertificate 中获取证书信息,例如主题、颁发者等
- String subject = clientCertificate.getSubjectX500Principal().getName();
- String issuer = clientCertificate.getIssuerX500Principal().getName();
- // 处理逻辑
- return "Secured Endpoint. Client Subject: " + subject + ", Issuer: " + issuer;
- } else {
- // 证书不存在或获取失败
- return "Failed to retrieve client certificate.";
- }
- }
-
- @CrossOrigin
- @ApiOperation(value = "add No Login Required")
- @PostMapping("/addNoLoginRequiredNew")
- public Response addNoLoginRequiredNew(@RequestBody NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request) {
- return Response.success(accountService.addNoLoginRequiredNew(noLoginRequiredDTO, request));
- }
-
- @CrossOrigin
- @ApiOperation(value = "add No Login Required")
- @PostMapping("/deleteNoLoginRequiredNew")
- public Response deleteNoLoginRequiredNew(@RequestBody NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request) {
- return Response.success(accountService.deleteNoLoginRequiredNew(noLoginRequiredDTO, request));
- }
-
- @Value("${redirect_url}")
- private String REDIRECT_URL;
- @CrossOrigin
- @ApiOperation(value = "add No Login Required")
- @PostMapping("/getRedirectUrl")
- public Response getRedirectUrl() {
- return Response.success(REDIRECT_URL);
- }
-
- @CrossOrigin
- @ApiOperation(value = "updateNoLoginRequiredNew")
- @PostMapping("/updateNoLoginRequiredNew")
- public Response updateNoLoginRequiredNew(@RequestBody NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request) {
- return Response.success(accountService.updateNoLoginRequiredNew(noLoginRequiredDTO, request));
- }
-
- @CrossOrigin
- @GetMapping("/auth/google_callback")
- public Response googleCallback(@RequestParam("code") String code, HttpSession session) {
- return Response.success(accountService.googleCallback(code, session));
- }
- @CrossOrigin
- @GetMapping("/parseGoogleCredential")
- public Response parseGoogleCredential(@RequestParam("credential") String credential, @RequestParam("type") Integer type) {
- return Response.success(accountService.parseGoogleCredential(credential, type));
- }
-
- @CrossOrigin
- @GetMapping("/parseWeChatCode")
- public Response parseWeChatCode(@RequestParam("code") String code, @RequestParam("type") Integer type) {
- return Response.success(accountService.parseWeChatCode(code, type));
- }
-
- @ApiOperation(value = "接收Design结果")
- @PostMapping("/receiveDesignResults")
- @CrossOrigin
- public Response receiveDesignResults(@Valid @RequestBody JSONObject responseObject) {
- return Response.success(designService.receiveDesignResults(responseObject));
- }
-
- @ApiOperation(value = "接收Design入参")
- @PostMapping("/receiveDesignParams")
- @CrossOrigin
- public Response receiveDesignParams(@Valid @RequestBody ReceiveDesignParam receiveDesignParam) {
- return Response.success(designService.receiveDesignParams(receiveDesignParam));
- }
-
- @ApiOperation(value = "刷新minio预签名地址")
- @GetMapping("/refreshMinioUrl")
- public Response refreshMinioUrl(@RequestParam("path") String path){
- return Response.success(minioUtil.getPreSignedUrl(path, CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
- }
-}
+package com.ai.da.controller;
+
+import com.ai.da.common.constant.CommonConstant;
+import com.ai.da.common.response.Response;
+import com.ai.da.common.utils.MinioUtil;
+import com.ai.da.mapper.primary.entity.GoogleUser;
+import com.ai.da.model.dto.*;
+import com.ai.da.model.vo.AccountLoginVO;
+import com.ai.da.model.vo.DesignCollectionVO;
+import com.ai.da.service.AccountService;
+import com.ai.da.service.DesignService;
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpSession;
+import jakarta.validation.Valid;
+import java.security.cert.X509Certificate;
+
+
+@Api(tags = "Third Party Modules")
+@Slf4j
+@RestController
+@RequestMapping("/api/third/party")
+public class ThirdPartyController {
+
+ @Resource
+ private AccountService accountService;
+
+ @Resource
+ private DesignService designService;
+
+ @Resource
+ private MinioUtil minioUtil;
+
+ /*@ApiOperation(value = "Add user information")
+ @PostMapping("/addUser")
+ public Response addUser(@Valid @RequestBody AccountAddDTO accountAddDTO) {
+ return Response.success(accountService.addUser(accountAddDTO));
+ }*/
+
+ @ApiOperation(value = "Edit user information")
+ @PostMapping("/editUser")
+ public Response editUser(@RequestBody AccountEditDTO accountEditDTO) {
+ return Response.success(accountService.editUser(accountEditDTO));
+ }
+
+ @CrossOrigin
+ @ApiOperation(value = "Add user information")
+ @PostMapping("/addTrialUser")
+ public Response addTrialUser(@RequestBody AccountTrialDTO accountTrialDTO, HttpServletRequest request) {
+ return Response.success(accountService.addTrialUser(accountTrialDTO, request));
+ }
+
+ @CrossOrigin
+ @ApiOperation(value = "add No Login Required")
+ @PostMapping("/addNoLoginRequired")
+ public Response addNoLoginRequired(@RequestBody NoLoginRequiredDTO noLoginRequiredDTO) {
+ return Response.success(accountService.addNoLoginRequired(noLoginRequiredDTO));
+ }
+
+ @CrossOrigin
+ @ApiOperation(value = "add No Login Required")
+ @PostMapping("/deleteNoLoginRequired")
+ public Response deleteNoLoginRequired(@RequestBody NoLoginRequiredDTO noLoginRequiredDTO) {
+ return Response.success(accountService.deleteNoLoginRequired(noLoginRequiredDTO));
+ }
+
+ @CrossOrigin
+ @ApiOperation(value = "add No Login Required")
+ @PostMapping("/existNoLoginRequired")
+ public Response existNoLoginRequired(@RequestBody NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request) {
+ return Response.success(accountService.existNoLoginRequired(noLoginRequiredDTO, request));
+ }
+
+ @GetMapping("/your-secured-endpoint")
+// @PreAuthorize("hasRole('ROLE_USER')")
+ public String securedEndpoint(HttpServletRequest request, @AuthenticationPrincipal PreAuthenticatedAuthenticationToken authenticationToken) {
+ // 从请求属性中获取证书
+ X509Certificate[] certificates = (X509Certificate[]) request.getAttribute("jakarta.servlet.request.X509Certificate");
+ if (certificates != null && certificates.length > 0) {
+ X509Certificate clientCertificate = certificates[0];
+ // 可以从 clientCertificate 中获取证书信息,例如主题、颁发者等
+ String subject = clientCertificate.getSubjectX500Principal().getName();
+ String issuer = clientCertificate.getIssuerX500Principal().getName();
+ // 处理逻辑
+ return "Secured Endpoint. Client Subject: " + subject + ", Issuer: " + issuer;
+ } else {
+ // 证书不存在或获取失败
+ return "Failed to retrieve client certificate.";
+ }
+ }
+
+ @CrossOrigin
+ @ApiOperation(value = "add No Login Required")
+ @PostMapping("/addNoLoginRequiredNew")
+ public Response addNoLoginRequiredNew(@RequestBody NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request) {
+ return Response.success(accountService.addNoLoginRequiredNew(noLoginRequiredDTO, request));
+ }
+
+ @CrossOrigin
+ @ApiOperation(value = "add No Login Required")
+ @PostMapping("/deleteNoLoginRequiredNew")
+ public Response deleteNoLoginRequiredNew(@RequestBody NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request) {
+ return Response.success(accountService.deleteNoLoginRequiredNew(noLoginRequiredDTO, request));
+ }
+
+ @Value("${redirect_url}")
+ private String REDIRECT_URL;
+ @CrossOrigin
+ @ApiOperation(value = "add No Login Required")
+ @PostMapping("/getRedirectUrl")
+ public Response getRedirectUrl() {
+ return Response.success(REDIRECT_URL);
+ }
+
+ @CrossOrigin
+ @ApiOperation(value = "updateNoLoginRequiredNew")
+ @PostMapping("/updateNoLoginRequiredNew")
+ public Response updateNoLoginRequiredNew(@RequestBody NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request) {
+ return Response.success(accountService.updateNoLoginRequiredNew(noLoginRequiredDTO, request));
+ }
+
+ @CrossOrigin
+ @GetMapping("/auth/google_callback")
+ public Response googleCallback(@RequestParam("code") String code, HttpSession session) {
+ return Response.success(accountService.googleCallback(code, session));
+ }
+ @CrossOrigin
+ @GetMapping("/parseGoogleCredential")
+ public Response parseGoogleCredential(@RequestParam("credential") String credential, @RequestParam("type") Integer type) {
+ return Response.success(accountService.parseGoogleCredential(credential, type));
+ }
+
+ @CrossOrigin
+ @GetMapping("/parseWeChatCode")
+ public Response parseWeChatCode(@RequestParam("code") String code, @RequestParam("type") Integer type) {
+ return Response.success(accountService.parseWeChatCode(code, type));
+ }
+
+ @ApiOperation(value = "接收Design结果")
+ @PostMapping("/receiveDesignResults")
+ @CrossOrigin
+ public Response receiveDesignResults(@Valid @RequestBody JSONObject responseObject) {
+ return Response.success(designService.receiveDesignResults(responseObject));
+ }
+
+ @ApiOperation(value = "接收Design入参")
+ @PostMapping("/receiveDesignParams")
+ @CrossOrigin
+ public Response receiveDesignParams(@Valid @RequestBody ReceiveDesignParam receiveDesignParam) {
+ return Response.success(designService.receiveDesignParams(receiveDesignParam));
+ }
+
+ @ApiOperation(value = "刷新minio预签名地址")
+ @GetMapping("/refreshMinioUrl")
+ public Response refreshMinioUrl(@RequestParam("path") String path){
+ return Response.success(minioUtil.getPreSignedUrl(path, CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
+ }
+}
diff --git a/src/main/java/com/ai/da/controller/WorkspaceController.java b/src/main/java/com/ai/da/controller/WorkspaceController.java
index ea2a8df1..7af69ee0 100644
--- a/src/main/java/com/ai/da/controller/WorkspaceController.java
+++ b/src/main/java/com/ai/da/controller/WorkspaceController.java
@@ -17,8 +17,8 @@ import io.swagger.annotations.ApiParam;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import lombok.AllArgsConstructor;
-import javax.annotation.Resource;
-import javax.validation.Valid;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
import lombok.NoArgsConstructor;
import org.springframework.web.bind.annotation.*;
diff --git a/src/main/java/com/ai/da/mapper/primary/entity/DesignBatch.java b/src/main/java/com/ai/da/mapper/primary/entity/DesignBatch.java
index 3ad4dbb5..b13a0ebb 100644
--- a/src/main/java/com/ai/da/mapper/primary/entity/DesignBatch.java
+++ b/src/main/java/com/ai/da/mapper/primary/entity/DesignBatch.java
@@ -3,7 +3,6 @@ package com.ai.da.mapper.primary.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
-import io.swagger.models.auth.In;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
diff --git a/src/main/java/com/ai/da/mapper/primary/entity/SysFile.java b/src/main/java/com/ai/da/mapper/primary/entity/SysFile.java
index 24466611..a8c36e4e 100644
--- a/src/main/java/com/ai/da/mapper/primary/entity/SysFile.java
+++ b/src/main/java/com/ai/da/mapper/primary/entity/SysFile.java
@@ -67,6 +67,11 @@ public class SysFile implements Serializable {
*/
private Date updateDate;
+ /**
+ * 风格样式
+ */
+ private String style;
+
public SysFile() {
}
diff --git a/src/main/java/com/ai/da/model/dto/AccountAddDTO.java b/src/main/java/com/ai/da/model/dto/AccountAddDTO.java
index 3679395f..c7d3d4e9 100644
--- a/src/main/java/com/ai/da/model/dto/AccountAddDTO.java
+++ b/src/main/java/com/ai/da/model/dto/AccountAddDTO.java
@@ -6,7 +6,7 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
-import javax.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotBlank;
import java.math.BigDecimal;
@Data
diff --git a/src/main/java/com/ai/da/model/dto/AccountBindEmailDTO.java b/src/main/java/com/ai/da/model/dto/AccountBindEmailDTO.java
index e9913269..182dad3d 100644
--- a/src/main/java/com/ai/da/model/dto/AccountBindEmailDTO.java
+++ b/src/main/java/com/ai/da/model/dto/AccountBindEmailDTO.java
@@ -4,7 +4,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotBlank;
@Data
@ApiModel("绑定邮箱")
diff --git a/src/main/java/com/ai/da/model/dto/AccountEditDTO.java b/src/main/java/com/ai/da/model/dto/AccountEditDTO.java
index 1338d1a2..a603c16b 100644
--- a/src/main/java/com/ai/da/model/dto/AccountEditDTO.java
+++ b/src/main/java/com/ai/da/model/dto/AccountEditDTO.java
@@ -4,9 +4,6 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-
@Data
@ApiModel("AccountEdit")
public class AccountEditDTO {
diff --git a/src/main/java/com/ai/da/model/dto/AccountLoginDTO.java b/src/main/java/com/ai/da/model/dto/AccountLoginDTO.java
index 787b0d25..10ba1dde 100644
--- a/src/main/java/com/ai/da/model/dto/AccountLoginDTO.java
+++ b/src/main/java/com/ai/da/model/dto/AccountLoginDTO.java
@@ -4,9 +4,6 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-
@Data
@ApiModel("登入")
public class AccountLoginDTO {
diff --git a/src/main/java/com/ai/da/model/dto/AccountLogoutDTO.java b/src/main/java/com/ai/da/model/dto/AccountLogoutDTO.java
index 08118849..24608dab 100644
--- a/src/main/java/com/ai/da/model/dto/AccountLogoutDTO.java
+++ b/src/main/java/com/ai/da/model/dto/AccountLogoutDTO.java
@@ -4,8 +4,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
@Data
@ApiModel("登出")
diff --git a/src/main/java/com/ai/da/model/dto/AccountPreLoginDTO.java b/src/main/java/com/ai/da/model/dto/AccountPreLoginDTO.java
index 63cbec6e..515fd4f5 100644
--- a/src/main/java/com/ai/da/model/dto/AccountPreLoginDTO.java
+++ b/src/main/java/com/ai/da/model/dto/AccountPreLoginDTO.java
@@ -4,7 +4,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotBlank;
@Data
@ApiModel("预先登入")
diff --git a/src/main/java/com/ai/da/model/dto/AccountRegisterDTO.java b/src/main/java/com/ai/da/model/dto/AccountRegisterDTO.java
index 041a9bc6..878fc63e 100644
--- a/src/main/java/com/ai/da/model/dto/AccountRegisterDTO.java
+++ b/src/main/java/com/ai/da/model/dto/AccountRegisterDTO.java
@@ -4,7 +4,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotBlank;
@Data
@ApiModel("账户")
diff --git a/src/main/java/com/ai/da/model/dto/AffiliateQueryDTO.java b/src/main/java/com/ai/da/model/dto/AffiliateQueryDTO.java
index a8fa750a..6194af4f 100644
--- a/src/main/java/com/ai/da/model/dto/AffiliateQueryDTO.java
+++ b/src/main/java/com/ai/da/model/dto/AffiliateQueryDTO.java
@@ -5,8 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.constraints.Pattern;
@EqualsAndHashCode(callSuper = true)
@Data
diff --git a/src/main/java/com/ai/da/model/dto/BasicEmailParamDTO.java b/src/main/java/com/ai/da/model/dto/BasicEmailParamDTO.java
index e973f914..68452337 100644
--- a/src/main/java/com/ai/da/model/dto/BasicEmailParamDTO.java
+++ b/src/main/java/com/ai/da/model/dto/BasicEmailParamDTO.java
@@ -2,7 +2,7 @@ package com.ai.da.model.dto;
import lombok.Data;
-import javax.mail.internet.InternetAddress;
+import jakarta.mail.internet.InternetAddress;
@Data
public class BasicEmailParamDTO {
diff --git a/src/main/java/com/ai/da/model/dto/ChatFlushDTO.java b/src/main/java/com/ai/da/model/dto/ChatFlushDTO.java
index c3ac9679..7a0d61e2 100644
--- a/src/main/java/com/ai/da/model/dto/ChatFlushDTO.java
+++ b/src/main/java/com/ai/da/model/dto/ChatFlushDTO.java
@@ -3,8 +3,8 @@ package com.ai.da.model.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
/**
* @author aida
diff --git a/src/main/java/com/ai/da/model/dto/ChatSendDTO.java b/src/main/java/com/ai/da/model/dto/ChatSendDTO.java
index 0c59658e..384209cb 100644
--- a/src/main/java/com/ai/da/model/dto/ChatSendDTO.java
+++ b/src/main/java/com/ai/da/model/dto/ChatSendDTO.java
@@ -4,8 +4,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
/**
* @author aida
diff --git a/src/main/java/com/ai/da/model/dto/CollectionColorDTO.java b/src/main/java/com/ai/da/model/dto/CollectionColorDTO.java
index d5581ee9..f7899f8e 100644
--- a/src/main/java/com/ai/da/model/dto/CollectionColorDTO.java
+++ b/src/main/java/com/ai/da/model/dto/CollectionColorDTO.java
@@ -5,9 +5,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotEmpty;
-import java.util.List;
+import jakarta.validation.constraints.NotBlank;
@Data
@ApiModel("设计Collection颜色板 入参")
diff --git a/src/main/java/com/ai/da/model/dto/CollectionDeleteFileDTO.java b/src/main/java/com/ai/da/model/dto/CollectionDeleteFileDTO.java
index d3137106..34622277 100644
--- a/src/main/java/com/ai/da/model/dto/CollectionDeleteFileDTO.java
+++ b/src/main/java/com/ai/da/model/dto/CollectionDeleteFileDTO.java
@@ -4,8 +4,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
@Data
@ApiModel("删除文件")
diff --git a/src/main/java/com/ai/da/model/dto/CollectionElementUploadDTO.java b/src/main/java/com/ai/da/model/dto/CollectionElementUploadDTO.java
index 69208225..523f167a 100644
--- a/src/main/java/com/ai/da/model/dto/CollectionElementUploadDTO.java
+++ b/src/main/java/com/ai/da/model/dto/CollectionElementUploadDTO.java
@@ -4,11 +4,10 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
-import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
import java.util.Date;
@Data
diff --git a/src/main/java/com/ai/da/model/dto/CollectionGeneratePrintDTO.java b/src/main/java/com/ai/da/model/dto/CollectionGeneratePrintDTO.java
index acc5dc68..9cb7ef96 100644
--- a/src/main/java/com/ai/da/model/dto/CollectionGeneratePrintDTO.java
+++ b/src/main/java/com/ai/da/model/dto/CollectionGeneratePrintDTO.java
@@ -4,8 +4,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
@Data
@ApiModel("生成印花")
diff --git a/src/main/java/com/ai/da/model/dto/CollectionSavePrintDTO.java b/src/main/java/com/ai/da/model/dto/CollectionSavePrintDTO.java
index e66128d0..a6c801d0 100644
--- a/src/main/java/com/ai/da/model/dto/CollectionSavePrintDTO.java
+++ b/src/main/java/com/ai/da/model/dto/CollectionSavePrintDTO.java
@@ -4,9 +4,9 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.Size;
import java.util.List;
@Data
diff --git a/src/main/java/com/ai/da/model/dto/CollectionSketchDTO.java b/src/main/java/com/ai/da/model/dto/CollectionSketchDTO.java
index 68ad0914..35b5c47d 100644
--- a/src/main/java/com/ai/da/model/dto/CollectionSketchDTO.java
+++ b/src/main/java/com/ai/da/model/dto/CollectionSketchDTO.java
@@ -1,12 +1,11 @@
package com.ai.da.model.dto;
-import com.ai.da.mapper.primary.entity.Gradient;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
@Data
@ApiModel("设计Collection Sketch 入参")
diff --git a/src/main/java/com/ai/da/model/dto/CreateCouponDTO.java b/src/main/java/com/ai/da/model/dto/CreateCouponDTO.java
index 3e1c60b5..438e8713 100644
--- a/src/main/java/com/ai/da/model/dto/CreateCouponDTO.java
+++ b/src/main/java/com/ai/da/model/dto/CreateCouponDTO.java
@@ -3,7 +3,7 @@ package com.ai.da.model.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
@Data
public class CreateCouponDTO {
diff --git a/src/main/java/com/ai/da/model/dto/DesignAttributeRetrievalDTO.java b/src/main/java/com/ai/da/model/dto/DesignAttributeRetrievalDTO.java
index 71a92ff0..77e61642 100644
--- a/src/main/java/com/ai/da/model/dto/DesignAttributeRetrievalDTO.java
+++ b/src/main/java/com/ai/da/model/dto/DesignAttributeRetrievalDTO.java
@@ -5,10 +5,6 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
-import java.math.BigDecimal;
import java.util.List;
@Data
diff --git a/src/main/java/com/ai/da/model/dto/DesignCollectionDTO.java b/src/main/java/com/ai/da/model/dto/DesignCollectionDTO.java
index c047bc64..38d120bb 100644
--- a/src/main/java/com/ai/da/model/dto/DesignCollectionDTO.java
+++ b/src/main/java/com/ai/da/model/dto/DesignCollectionDTO.java
@@ -4,9 +4,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
diff --git a/src/main/java/com/ai/da/model/dto/DesignCollectionElementDTO.java b/src/main/java/com/ai/da/model/dto/DesignCollectionElementDTO.java
index 0d0e6d1b..1e99a345 100644
--- a/src/main/java/com/ai/da/model/dto/DesignCollectionElementDTO.java
+++ b/src/main/java/com/ai/da/model/dto/DesignCollectionElementDTO.java
@@ -4,9 +4,6 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-
@Data
@ApiModel("设计Collection element other 入参")
public class DesignCollectionElementDTO {
diff --git a/src/main/java/com/ai/da/model/dto/DesignLikeDTO.java b/src/main/java/com/ai/da/model/dto/DesignLikeDTO.java
index 26ed7f18..dc0120c9 100644
--- a/src/main/java/com/ai/da/model/dto/DesignLikeDTO.java
+++ b/src/main/java/com/ai/da/model/dto/DesignLikeDTO.java
@@ -4,9 +4,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-import java.math.BigDecimal;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
@Data
@ApiModel("Design like 入参")
diff --git a/src/main/java/com/ai/da/model/dto/DesignSingleDTO.java b/src/main/java/com/ai/da/model/dto/DesignSingleDTO.java
index 8c305d6e..4cea1ebe 100644
--- a/src/main/java/com/ai/da/model/dto/DesignSingleDTO.java
+++ b/src/main/java/com/ai/da/model/dto/DesignSingleDTO.java
@@ -3,9 +3,9 @@ package com.ai.da.model.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
import java.util.List;
@Data
diff --git a/src/main/java/com/ai/da/model/dto/DesignSingleIncludeLayersDTO.java b/src/main/java/com/ai/da/model/dto/DesignSingleIncludeLayersDTO.java
index 6f923c76..eb659985 100644
--- a/src/main/java/com/ai/da/model/dto/DesignSingleIncludeLayersDTO.java
+++ b/src/main/java/com/ai/da/model/dto/DesignSingleIncludeLayersDTO.java
@@ -3,8 +3,8 @@ package com.ai.da.model.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
diff --git a/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java b/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java
index 546f24bf..56a4350e 100644
--- a/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java
+++ b/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java
@@ -4,9 +4,9 @@ import com.ai.da.mapper.primary.entity.Gradient;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
diff --git a/src/main/java/com/ai/da/model/dto/DisDesignLikeDTO.java b/src/main/java/com/ai/da/model/dto/DisDesignLikeDTO.java
index 6d6a39c9..198c17d4 100644
--- a/src/main/java/com/ai/da/model/dto/DisDesignLikeDTO.java
+++ b/src/main/java/com/ai/da/model/dto/DisDesignLikeDTO.java
@@ -4,8 +4,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
@Data
@ApiModel("Design dislike 入参")
diff --git a/src/main/java/com/ai/da/model/dto/EditReferralDTO.java b/src/main/java/com/ai/da/model/dto/EditReferralDTO.java
index 07da83e6..c3c3f128 100644
--- a/src/main/java/com/ai/da/model/dto/EditReferralDTO.java
+++ b/src/main/java/com/ai/da/model/dto/EditReferralDTO.java
@@ -4,8 +4,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
import java.math.BigDecimal;
@Data
diff --git a/src/main/java/com/ai/da/model/dto/EmailSendDTO.java b/src/main/java/com/ai/da/model/dto/EmailSendDTO.java
index 32d18d8a..9caf0b21 100644
--- a/src/main/java/com/ai/da/model/dto/EmailSendDTO.java
+++ b/src/main/java/com/ai/da/model/dto/EmailSendDTO.java
@@ -4,7 +4,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotBlank;
@Data
@ApiModel("邮箱发送")
diff --git a/src/main/java/com/ai/da/model/dto/GenerateHighDesignDTO.java b/src/main/java/com/ai/da/model/dto/GenerateHighDesignDTO.java
index 1e42707f..b9815e78 100644
--- a/src/main/java/com/ai/da/model/dto/GenerateHighDesignDTO.java
+++ b/src/main/java/com/ai/da/model/dto/GenerateHighDesignDTO.java
@@ -4,8 +4,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
@Data
@ApiModel("生成高级design 入参")
diff --git a/src/main/java/com/ai/da/model/dto/GenerateLikeDTO.java b/src/main/java/com/ai/da/model/dto/GenerateLikeDTO.java
index 9e76dae3..74a745cc 100644
--- a/src/main/java/com/ai/da/model/dto/GenerateLikeDTO.java
+++ b/src/main/java/com/ai/da/model/dto/GenerateLikeDTO.java
@@ -4,8 +4,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
@Data
@ApiModel("Generate like入参")
diff --git a/src/main/java/com/ai/da/model/dto/GenerateModifyDTO.java b/src/main/java/com/ai/da/model/dto/GenerateModifyDTO.java
index 38ddf43a..3b49a81e 100644
--- a/src/main/java/com/ai/da/model/dto/GenerateModifyDTO.java
+++ b/src/main/java/com/ai/da/model/dto/GenerateModifyDTO.java
@@ -4,9 +4,9 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
@ApiModel("修改imageToSketch提取出的sketch")
@Data
diff --git a/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java b/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java
index d245efc9..b344fadf 100644
--- a/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java
+++ b/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java
@@ -4,8 +4,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
@Data
@ApiModel("GenerateThroughImageTextDTO")
diff --git a/src/main/java/com/ai/da/model/dto/GetRgbByHsvBatchDTO.java b/src/main/java/com/ai/da/model/dto/GetRgbByHsvBatchDTO.java
index 3b679539..35a0bc9d 100644
--- a/src/main/java/com/ai/da/model/dto/GetRgbByHsvBatchDTO.java
+++ b/src/main/java/com/ai/da/model/dto/GetRgbByHsvBatchDTO.java
@@ -4,7 +4,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
@Data
@ApiModel("根据rgb数组批量获取潘通rgb")
diff --git a/src/main/java/com/ai/da/model/dto/HistoryDeleteDTO.java b/src/main/java/com/ai/da/model/dto/HistoryDeleteDTO.java
index 611c8b02..25bfef79 100644
--- a/src/main/java/com/ai/da/model/dto/HistoryDeleteDTO.java
+++ b/src/main/java/com/ai/da/model/dto/HistoryDeleteDTO.java
@@ -2,12 +2,9 @@ package com.ai.da.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
-import io.swagger.annotations.ApiParam;
import lombok.Data;
-import org.springframework.web.bind.annotation.RequestParam;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
@Data
@ApiModel("History删除")
diff --git a/src/main/java/com/ai/da/model/dto/HistoryUpdateDTO.java b/src/main/java/com/ai/da/model/dto/HistoryUpdateDTO.java
index a0e67ed6..4f28114f 100644
--- a/src/main/java/com/ai/da/model/dto/HistoryUpdateDTO.java
+++ b/src/main/java/com/ai/da/model/dto/HistoryUpdateDTO.java
@@ -6,8 +6,8 @@ import io.swagger.annotations.ApiParam;
import lombok.Data;
import org.springframework.web.bind.annotation.RequestParam;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
@Data
@ApiModel("History编辑")
diff --git a/src/main/java/com/ai/da/model/dto/LibraryDeleteDTO.java b/src/main/java/com/ai/da/model/dto/LibraryDeleteDTO.java
index 04334700..cf9e26be 100644
--- a/src/main/java/com/ai/da/model/dto/LibraryDeleteDTO.java
+++ b/src/main/java/com/ai/da/model/dto/LibraryDeleteDTO.java
@@ -4,8 +4,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.Size;
import java.util.List;
@Data
diff --git a/src/main/java/com/ai/da/model/dto/LibraryLevel2TypeUpdateDTO.java b/src/main/java/com/ai/da/model/dto/LibraryLevel2TypeUpdateDTO.java
index dfb2dba2..418889e3 100644
--- a/src/main/java/com/ai/da/model/dto/LibraryLevel2TypeUpdateDTO.java
+++ b/src/main/java/com/ai/da/model/dto/LibraryLevel2TypeUpdateDTO.java
@@ -4,9 +4,9 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.Size;
import java.util.List;
@Data
diff --git a/src/main/java/com/ai/da/model/dto/LibraryModelPointDTO.java b/src/main/java/com/ai/da/model/dto/LibraryModelPointDTO.java
index a6bdb477..556b5063 100644
--- a/src/main/java/com/ai/da/model/dto/LibraryModelPointDTO.java
+++ b/src/main/java/com/ai/da/model/dto/LibraryModelPointDTO.java
@@ -4,9 +4,9 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
diff --git a/src/main/java/com/ai/da/model/dto/LibraryUpdateDTO.java b/src/main/java/com/ai/da/model/dto/LibraryUpdateDTO.java
index 82cc2c5b..d73618f9 100644
--- a/src/main/java/com/ai/da/model/dto/LibraryUpdateDTO.java
+++ b/src/main/java/com/ai/da/model/dto/LibraryUpdateDTO.java
@@ -4,10 +4,9 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.Size;
import java.util.List;
@Data
diff --git a/src/main/java/com/ai/da/model/dto/LibraryUploadDTO.java b/src/main/java/com/ai/da/model/dto/LibraryUploadDTO.java
index 8f24f424..5edeba30 100644
--- a/src/main/java/com/ai/da/model/dto/LibraryUploadDTO.java
+++ b/src/main/java/com/ai/da/model/dto/LibraryUploadDTO.java
@@ -6,7 +6,7 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
@Data
@ApiModel("Library文件上传")
diff --git a/src/main/java/com/ai/da/model/dto/ModelsDotDTO.java b/src/main/java/com/ai/da/model/dto/ModelsDotDTO.java
index f6a20db7..41f2a154 100644
--- a/src/main/java/com/ai/da/model/dto/ModelsDotDTO.java
+++ b/src/main/java/com/ai/da/model/dto/ModelsDotDTO.java
@@ -5,9 +5,9 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
diff --git a/src/main/java/com/ai/da/model/dto/ModifyModelProportionDTO.java b/src/main/java/com/ai/da/model/dto/ModifyModelProportionDTO.java
index 9366cad7..6f08bd7d 100644
--- a/src/main/java/com/ai/da/model/dto/ModifyModelProportionDTO.java
+++ b/src/main/java/com/ai/da/model/dto/ModifyModelProportionDTO.java
@@ -4,8 +4,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
@Data
@ApiModel("ModifyModelProportionDTO")
diff --git a/src/main/java/com/ai/da/model/dto/ModuleSaveDTO.java b/src/main/java/com/ai/da/model/dto/ModuleSaveDTO.java
index 6b160b11..8251217a 100644
--- a/src/main/java/com/ai/da/model/dto/ModuleSaveDTO.java
+++ b/src/main/java/com/ai/da/model/dto/ModuleSaveDTO.java
@@ -7,10 +7,6 @@ import com.ai.da.model.vo.MoodBoardModuleChooseVO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
-import java.math.BigDecimal;
import java.util.List;
@Data
diff --git a/src/main/java/com/ai/da/model/dto/NoteSendDTO.java b/src/main/java/com/ai/da/model/dto/NoteSendDTO.java
index ccfef6a6..3efb31b4 100644
--- a/src/main/java/com/ai/da/model/dto/NoteSendDTO.java
+++ b/src/main/java/com/ai/da/model/dto/NoteSendDTO.java
@@ -4,7 +4,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotBlank;
@Data
@ApiModel("短信发送")
diff --git a/src/main/java/com/ai/da/model/dto/PortfolioDTO.java b/src/main/java/com/ai/da/model/dto/PortfolioDTO.java
index a4a24a55..a9437118 100644
--- a/src/main/java/com/ai/da/model/dto/PortfolioDTO.java
+++ b/src/main/java/com/ai/da/model/dto/PortfolioDTO.java
@@ -4,7 +4,6 @@ import com.ai.da.mapper.primary.entity.Portfolio;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotNull;
import java.util.List;
@Data
diff --git a/src/main/java/com/ai/da/model/dto/PoseTransformDTO.java b/src/main/java/com/ai/da/model/dto/PoseTransformDTO.java
index fa6ae844..153273aa 100644
--- a/src/main/java/com/ai/da/model/dto/PoseTransformDTO.java
+++ b/src/main/java/com/ai/da/model/dto/PoseTransformDTO.java
@@ -4,8 +4,8 @@ package com.ai.da.model.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
@Data
public class PoseTransformDTO {
diff --git a/src/main/java/com/ai/da/model/dto/ProductPurchaseDTO.java b/src/main/java/com/ai/da/model/dto/ProductPurchaseDTO.java
index cc545abb..d27d0037 100644
--- a/src/main/java/com/ai/da/model/dto/ProductPurchaseDTO.java
+++ b/src/main/java/com/ai/da/model/dto/ProductPurchaseDTO.java
@@ -4,7 +4,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotBlank;
@Data
@ApiModel("购买产品DTO")
diff --git a/src/main/java/com/ai/da/model/dto/QueryHistoryPageDTO.java b/src/main/java/com/ai/da/model/dto/QueryHistoryPageDTO.java
index 22eefcf9..fbb89e76 100644
--- a/src/main/java/com/ai/da/model/dto/QueryHistoryPageDTO.java
+++ b/src/main/java/com/ai/da/model/dto/QueryHistoryPageDTO.java
@@ -5,8 +5,6 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
import java.util.List;
@Data
diff --git a/src/main/java/com/ai/da/model/dto/QueryLibraryPageDTO.java b/src/main/java/com/ai/da/model/dto/QueryLibraryPageDTO.java
index 05cade70..82617fb3 100644
--- a/src/main/java/com/ai/da/model/dto/QueryLibraryPageDTO.java
+++ b/src/main/java/com/ai/da/model/dto/QueryLibraryPageDTO.java
@@ -5,7 +5,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotBlank;
import java.util.List;
@Data
diff --git a/src/main/java/com/ai/da/model/dto/QueryLibraryPageServiceDTO.java b/src/main/java/com/ai/da/model/dto/QueryLibraryPageServiceDTO.java
index 8c8c829c..3895eb98 100644
--- a/src/main/java/com/ai/da/model/dto/QueryLibraryPageServiceDTO.java
+++ b/src/main/java/com/ai/da/model/dto/QueryLibraryPageServiceDTO.java
@@ -5,7 +5,6 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
import java.util.List;
@Data
diff --git a/src/main/java/com/ai/da/model/dto/QueryLibraryTopPageDTO.java b/src/main/java/com/ai/da/model/dto/QueryLibraryTopPageDTO.java
index 5a894dcd..b4976cbb 100644
--- a/src/main/java/com/ai/da/model/dto/QueryLibraryTopPageDTO.java
+++ b/src/main/java/com/ai/da/model/dto/QueryLibraryTopPageDTO.java
@@ -5,7 +5,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotBlank;
@Data
@ApiModel("LibraryTop分页查询")
diff --git a/src/main/java/com/ai/da/model/dto/QueryTaskHistoryDTO.java b/src/main/java/com/ai/da/model/dto/QueryTaskHistoryDTO.java
index db8dbc69..84caa17d 100644
--- a/src/main/java/com/ai/da/model/dto/QueryTaskHistoryDTO.java
+++ b/src/main/java/com/ai/da/model/dto/QueryTaskHistoryDTO.java
@@ -5,7 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
-import javax.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotEmpty;
@EqualsAndHashCode(callSuper = true)
@Data
diff --git a/src/main/java/com/ai/da/model/dto/ReDesignCollectionDTO.java b/src/main/java/com/ai/da/model/dto/ReDesignCollectionDTO.java
index 75cb7c4b..6fff4c8b 100644
--- a/src/main/java/com/ai/da/model/dto/ReDesignCollectionDTO.java
+++ b/src/main/java/com/ai/da/model/dto/ReDesignCollectionDTO.java
@@ -4,9 +4,9 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
diff --git a/src/main/java/com/ai/da/model/dto/SketchesBoundingBoxDTO.java b/src/main/java/com/ai/da/model/dto/SketchesBoundingBoxDTO.java
index 3f955cb7..811d8f6e 100644
--- a/src/main/java/com/ai/da/model/dto/SketchesBoundingBoxDTO.java
+++ b/src/main/java/com/ai/da/model/dto/SketchesBoundingBoxDTO.java
@@ -4,10 +4,6 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
-import java.math.BigDecimal;
import java.util.List;
@Data
diff --git a/src/main/java/com/ai/da/model/dto/SuperResolutionDTO.java b/src/main/java/com/ai/da/model/dto/SuperResolutionDTO.java
index 36b15ce6..de12b701 100644
--- a/src/main/java/com/ai/da/model/dto/SuperResolutionDTO.java
+++ b/src/main/java/com/ai/da/model/dto/SuperResolutionDTO.java
@@ -5,7 +5,7 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
-import javax.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotBlank;
@Data
@NoArgsConstructor
diff --git a/src/main/java/com/ai/da/model/dto/TrialOrderDTO.java b/src/main/java/com/ai/da/model/dto/TrialOrderDTO.java
index 3e3982fe..f05e875e 100644
--- a/src/main/java/com/ai/da/model/dto/TrialOrderDTO.java
+++ b/src/main/java/com/ai/da/model/dto/TrialOrderDTO.java
@@ -5,8 +5,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
@Data
@ApiModel("登入")
diff --git a/src/main/java/com/ai/da/model/vo/CollectionColorVO.java b/src/main/java/com/ai/da/model/vo/CollectionColorVO.java
index 0f9608d1..5fb1ca2e 100644
--- a/src/main/java/com/ai/da/model/vo/CollectionColorVO.java
+++ b/src/main/java/com/ai/da/model/vo/CollectionColorVO.java
@@ -6,8 +6,6 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
-import javax.validation.constraints.NotBlank;
-
@Data
@EqualsAndHashCode
@ApiModel("设计Collection颜色板 响应")
diff --git a/src/main/java/com/ai/da/model/vo/CollectionGeneratePrintVO.java b/src/main/java/com/ai/da/model/vo/CollectionGeneratePrintVO.java
index 726a9906..91b4a219 100644
--- a/src/main/java/com/ai/da/model/vo/CollectionGeneratePrintVO.java
+++ b/src/main/java/com/ai/da/model/vo/CollectionGeneratePrintVO.java
@@ -2,11 +2,8 @@ package com.ai.da.model.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
-import lombok.AllArgsConstructor;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-
@Data
@ApiModel("生产印花-响应")
public class CollectionGeneratePrintVO {
diff --git a/src/main/java/com/ai/da/model/vo/CollectionSketchVO.java b/src/main/java/com/ai/da/model/vo/CollectionSketchVO.java
index fb0b507e..b6e48c6d 100644
--- a/src/main/java/com/ai/da/model/vo/CollectionSketchVO.java
+++ b/src/main/java/com/ai/da/model/vo/CollectionSketchVO.java
@@ -5,9 +5,6 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-
@Data
@ApiModel("设计Collection Sketch 入参")
public class CollectionSketchVO extends CollectionSketchDTO {
diff --git a/src/main/java/com/ai/da/model/vo/DesignSinglePrint.java b/src/main/java/com/ai/da/model/vo/DesignSinglePrint.java
index ed52c386..16ba3108 100644
--- a/src/main/java/com/ai/da/model/vo/DesignSinglePrint.java
+++ b/src/main/java/com/ai/da/model/vo/DesignSinglePrint.java
@@ -5,7 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
-import javax.validation.constraints.Min;
+import jakarta.validation.constraints.Min;
import java.io.Serializable;
import java.util.List;
diff --git a/src/main/java/com/ai/da/model/vo/PageQueryBaseVo.java b/src/main/java/com/ai/da/model/vo/PageQueryBaseVo.java
index 8986433c..fa4f8b8f 100644
--- a/src/main/java/com/ai/da/model/vo/PageQueryBaseVo.java
+++ b/src/main/java/com/ai/da/model/vo/PageQueryBaseVo.java
@@ -4,8 +4,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
+import jakarta.validation.constraints.Min;
@Data
diff --git a/src/main/java/com/ai/da/model/vo/QueryLibraryPageVO.java b/src/main/java/com/ai/da/model/vo/QueryLibraryPageVO.java
index eaff197f..b46a8159 100644
--- a/src/main/java/com/ai/da/model/vo/QueryLibraryPageVO.java
+++ b/src/main/java/com/ai/da/model/vo/QueryLibraryPageVO.java
@@ -5,8 +5,6 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.constraints.NotBlank;
-
@Data
@ApiModel("Library分页-响应")
public class QueryLibraryPageVO {
diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java
index 6d6ef75d..a97875f5 100644
--- a/src/main/java/com/ai/da/python/PythonService.java
+++ b/src/main/java/com/ai/da/python/PythonService.java
@@ -38,7 +38,7 @@ import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
diff --git a/src/main/java/com/ai/da/service/AccountService.java b/src/main/java/com/ai/da/service/AccountService.java
index cc44688e..c3c4d24c 100644
--- a/src/main/java/com/ai/da/service/AccountService.java
+++ b/src/main/java/com/ai/da/service/AccountService.java
@@ -13,9 +13,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartFile;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpSession;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
diff --git a/src/main/java/com/ai/da/service/AliPayService.java b/src/main/java/com/ai/da/service/AliPayService.java
index 450a14bb..2a9d8488 100644
--- a/src/main/java/com/ai/da/service/AliPayService.java
+++ b/src/main/java/com/ai/da/service/AliPayService.java
@@ -2,7 +2,7 @@ package com.ai.da.service;
import com.ai.da.model.dto.ProductPurchaseDTO;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import java.util.Map;
public interface AliPayService {
diff --git a/src/main/java/com/ai/da/service/AlipayHKService.java b/src/main/java/com/ai/da/service/AlipayHKService.java
index a8492c0b..68d8eed4 100644
--- a/src/main/java/com/ai/da/service/AlipayHKService.java
+++ b/src/main/java/com/ai/da/service/AlipayHKService.java
@@ -3,7 +3,7 @@ package com.ai.da.service;
import com.ai.da.model.dto.AlipayHKCallbackDTO;
import com.ai.da.model.dto.ProductPurchaseDTO;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
public interface AlipayHKService {
diff --git a/src/main/java/com/ai/da/service/ConvenientInquiryService.java b/src/main/java/com/ai/da/service/ConvenientInquiryService.java
index 0f18da5c..c09a0025 100644
--- a/src/main/java/com/ai/da/service/ConvenientInquiryService.java
+++ b/src/main/java/com/ai/da/service/ConvenientInquiryService.java
@@ -13,7 +13,7 @@ import com.ai.da.model.vo.QueryUserConditionsVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
diff --git a/src/main/java/com/ai/da/service/LLMService.java b/src/main/java/com/ai/da/service/LLMService.java
index eb844829..a93bc2c5 100644
--- a/src/main/java/com/ai/da/service/LLMService.java
+++ b/src/main/java/com/ai/da/service/LLMService.java
@@ -1,27 +1,12 @@
package com.ai.da.service;
import com.ai.da.common.response.PageBaseResponse;
-import com.ai.da.common.response.Response;
-import com.ai.da.mapper.primary.entity.Account;
-import com.ai.da.mapper.primary.entity.AccountExtend;
import com.ai.da.mapper.primary.entity.ChatMessage;
-import com.ai.da.mapper.primary.entity.TrialOrder;
import com.ai.da.model.dto.*;
-import com.ai.da.model.vo.AccountLoginVO;
-import com.ai.da.model.vo.AccountPreLoginVO;
-import com.ai.da.model.vo.BindEmailVO;
-import com.ai.da.model.vo.PersonalHomepageVO;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
import java.util.List;
-import java.util.Map;
-import java.util.Set;
/**
* 服务类
diff --git a/src/main/java/com/ai/da/service/OrderInfoService.java b/src/main/java/com/ai/da/service/OrderInfoService.java
index 62cbf35a..7c5deabf 100644
--- a/src/main/java/com/ai/da/service/OrderInfoService.java
+++ b/src/main/java/com/ai/da/service/OrderInfoService.java
@@ -8,7 +8,7 @@ import com.ai.da.mapper.primary.entity.OrderInfo;
import com.ai.da.model.dto.QueryPageByTimeDTO;
import com.baomidou.mybatisplus.extension.service.IService;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
public interface OrderInfoService extends IService {
diff --git a/src/main/java/com/ai/da/service/PayPalCheckoutService.java b/src/main/java/com/ai/da/service/PayPalCheckoutService.java
index e6256827..9cac52bb 100644
--- a/src/main/java/com/ai/da/service/PayPalCheckoutService.java
+++ b/src/main/java/com/ai/da/service/PayPalCheckoutService.java
@@ -4,9 +4,9 @@ import com.ai.da.model.dto.ProductPurchaseDTO;
import com.paypal.http.exceptions.SerializeException;
import com.paypal.orders.Order;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
diff --git a/src/main/java/com/ai/da/service/StripeService.java b/src/main/java/com/ai/da/service/StripeService.java
index 23fe2010..8ee77ccb 100644
--- a/src/main/java/com/ai/da/service/StripeService.java
+++ b/src/main/java/com/ai/da/service/StripeService.java
@@ -9,7 +9,7 @@ import com.ai.da.model.vo.CheckCouponsVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.stripe.exception.StripeException;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
diff --git a/src/main/java/com/ai/da/service/TrialOrderService.java b/src/main/java/com/ai/da/service/TrialOrderService.java
index bc62c6a9..7389e556 100644
--- a/src/main/java/com/ai/da/service/TrialOrderService.java
+++ b/src/main/java/com/ai/da/service/TrialOrderService.java
@@ -6,7 +6,7 @@ import com.ai.da.model.dto.TrialOrderDTO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
public interface TrialOrderService extends IService {
diff --git a/src/main/java/com/ai/da/service/UserLikeGroupService.java b/src/main/java/com/ai/da/service/UserLikeGroupService.java
index 093b0e03..61ea9f5f 100644
--- a/src/main/java/com/ai/da/service/UserLikeGroupService.java
+++ b/src/main/java/com/ai/da/service/UserLikeGroupService.java
@@ -10,7 +10,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import io.minio.errors.MinioException;
import org.springframework.web.multipart.MultipartFile;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
diff --git a/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java
index 827013fc..97dba879 100644
--- a/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java
+++ b/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java
@@ -9,7 +9,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
diff --git a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
index 885f3eb8..7d8335a9 100644
--- a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
+++ b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
@@ -39,6 +39,7 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Lazy;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -47,11 +48,11 @@ import org.springframework.util.CollectionUtils;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
-import javax.annotation.Resource;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
+import jakarta.annotation.Resource;
+import jakarta.servlet.ServletOutputStream;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpSession;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
@@ -94,9 +95,6 @@ public class AccountServiceImpl extends ServiceImpl impl
@Resource
private AccountLoginLogService accountLoginLogService;
- @Resource
- private ConvenientInquiryService convenientInquiryService;
-
@Resource
private LibraryService libraryService;
@@ -115,9 +113,6 @@ public class AccountServiceImpl extends ServiceImpl impl
@Resource
private QuestionnaireMapper questionnaireMapper;
- @Resource
- private CreditsService creditsService;
-
@Resource
private MinioUtil minioUtil;
@@ -137,12 +132,6 @@ public class AccountServiceImpl extends ServiceImpl impl
@Resource
private RedisUtil redisUtil;
- @Resource
- private StripeService stripeService;
-
- @Resource
- private AffiliateService affiliateService;
-
@Resource
private UserFollowService userFollowService;
@@ -201,9 +190,6 @@ public class AccountServiceImpl extends ServiceImpl impl
return new AccountPreLoginVO(account.getId());
}
- @Resource
- private PortfolioService portfolioService;
-
@Transactional(rollbackFor = Exception.class)
@Override
public AccountLoginVO login(AccountLoginDTO accountLoginDTO, HttpServletRequest request) {
@@ -1634,6 +1620,7 @@ public class AccountServiceImpl extends ServiceImpl impl
log.warn("当前用户 {} 在AiDA中没有账号", email);
throw new BusinessException("user.has.no.account", ResultEnum.PROMPT.getCode());
}
+ CreditsService creditsService = SpringUtils.getBean(CreditsService.class);
// 2、先判断当前用户是否已经填写过问卷
CreditsDetail record = creditsService.getByAccountIdAndChangeEvent(account.getId(), "Fill out the questionnaire", "+100");
if (!Objects.isNull(record)) {
@@ -2052,7 +2039,7 @@ public class AccountServiceImpl extends ServiceImpl impl
String avatar = StringUtil.isNullOrEmpty(account.getAvatar()) ? CommonConstant.DEFAULT_AVATAR : account.getAvatar();
personalHomepageVO.setAvatar(minioUtil.getPreSignedUrl(avatar, CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
- personalHomepageVO.setPortfolioCount(portfolioService.getPortfolioCount(accountId));
+ personalHomepageVO.setPortfolioCount(SpringUtils.getBean(PortfolioService.class).getPortfolioCount(accountId));
personalHomepageVO.setFolloweeCount(userFollowService.getFolloweeCount(accountId));
personalHomepageVO.setFollowerCount(userFollowService.getFollowerCount(accountId));
personalHomepageVO.setHomepageViewCount(viewPersonalHomepageCount(0L));
@@ -3142,7 +3129,7 @@ public class AccountServiceImpl extends ServiceImpl impl
response.setAccountExtendList(accountExtends);
}
response.setLanguage(Language.valueOf(account.getLanguage()).name());
- SubscriptionInfo subscriptionInfo = stripeService.getLatestSubscriptionInfoByAccountId(accountId);
+ SubscriptionInfo subscriptionInfo = SpringUtils.getBean(StripeService.class).getLatestSubscriptionInfoByAccountId(accountId);
if (!Objects.isNull(subscriptionInfo)) {
response.setSubscriptionId(subscriptionInfo.getSubscriptionId());
response.setSubscriptionType(subscriptionInfo.getType());
@@ -3151,7 +3138,7 @@ public class AccountServiceImpl extends ServiceImpl impl
response.setAutoRenewal(subscriptionInfo.getStatus().equals("active"));
}
- Affiliate affiliate = affiliateService.getByAccountId(accountId);
+ Affiliate affiliate = SpringUtils.getBean(AffiliateService.class).getByAccountId(accountId);
if (!Objects.isNull(affiliate) && affiliate.getStatus().equals("Active")) {
response.setAffiliate(true);
}
@@ -3371,6 +3358,7 @@ public class AccountServiceImpl extends ServiceImpl impl
}
accountMapper.updateById(account);
+ CreditsService creditsService = SpringUtils.getBean(CreditsService.class);
// 先判断是否已添加添加积分变更记录
CreditsDetail creditsDetail = creditsService.queryDetailByTaskId(orderNo);
if (Objects.isNull(creditsDetail)) {
@@ -3663,14 +3651,19 @@ public class AccountServiceImpl extends ServiceImpl impl
// todo 机构管理员再次订阅时,需要同步机构的激活状态
private void setOrganizationStatus(Account adminAcc, boolean isActive) {
Organization organization;
+ ConvenientInquiryService convenientInquiryService = null;
if (Objects.nonNull(adminAcc.getOrganizationId())) {
organization = organizationMapper.selectById(adminAcc.getOrganizationId());
} else if (!StringUtil.isNullOrEmpty(adminAcc.getOrganizationName())) {
+ convenientInquiryService = SpringUtils.getBean(ConvenientInquiryService.class);
organization = convenientInquiryService.checkOrganization(adminAcc.getSystemUser(), adminAcc.getOrganizationName());
} else {
return;
}
if (Objects.isNull(organization)) {
+ if (Objects.isNull(convenientInquiryService)) {
+ convenientInquiryService = SpringUtils.getBean(ConvenientInquiryService.class);
+ }
organization = convenientInquiryService.addOrganization(adminAcc.getOrganizationName(), getOrganizationTypeByRole(adminAcc.getSystemUser()));
}
if (isActive) {
diff --git a/src/main/java/com/ai/da/service/impl/AffiliateServiceImpl.java b/src/main/java/com/ai/da/service/impl/AffiliateServiceImpl.java
index ad43b76b..853f7824 100644
--- a/src/main/java/com/ai/da/service/impl/AffiliateServiceImpl.java
+++ b/src/main/java/com/ai/da/service/impl/AffiliateServiceImpl.java
@@ -26,10 +26,11 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mysql.cj.util.StringUtils;
import io.netty.util.internal.StringUtil;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
@@ -54,8 +55,6 @@ public class AffiliateServiceImpl extends ServiceImpl mailTo, JSONObject jsonObject, String templateName, String title, String fileName, InputStreamSource inputStreamSource) {
if (mailTo.size() == 1){
String receiver = mailTo.get(0);
- Account account = accountService.getBaseMapper().selectOne(new QueryWrapper().eq("user_email", receiver));
+ Account account = accountMapper.selectOne(new QueryWrapper().eq("user_email", receiver));
if (Objects.nonNull(account)){
boolean b = redisUtil.allowSend(account.getId());
if (!b){throw new BusinessException("email.count.limit", ResultEnum.PROMPT.getCode());}
diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java
index f7c1ef9b..f3fb058e 100644
--- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java
+++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java
@@ -62,7 +62,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
@@ -89,7 +89,6 @@ import static com.ai.da.common.enums.WangXiangTaskStatusEnum.UNKNOWN_W;
@RequiredArgsConstructor
public class GenerateServiceImpl extends ServiceImpl implements GenerateService {
- private final AccountService accountService;
private final APIGenerateService apiGenerateService;
private final CollectionElementMapper collectionElementMapper;
private final CollectionElementService collectionElementService;
@@ -828,7 +827,7 @@ public class GenerateServiceImpl extends ServiceImpl i
if (finishMessage != null && finishMessage.contains("Try rephrasing the prompt")) {
finishMessage = "Try rephrasing the prompt or modifying the model image. If you think this was an error, send feedback.";
LambdaQueryWrapper select = new LambdaQueryWrapper().eq(Account::getId, userId).select(Account::getLanguage);
- Account account = accountService.getOne(select);
+ Account account = getAccountService().getOne(select);
if ("CHINESE_SIMPLIFIED".equals(account.getLanguage())) {
finishMessage = "请尝试重新表述提示词,或修改模特图。若您认为这是误判,可提交反馈。";
}
@@ -1096,7 +1095,7 @@ public class GenerateServiceImpl extends ServiceImpl i
if (finishMessage != null && finishMessage.contains("Try rephrasing the prompt")) {
finishMessage = "Try rephrasing the prompt or replacing the image. If you think this was an error, send feedback.";
LambdaQueryWrapper select = new LambdaQueryWrapper().eq(Account::getId, userId).select(Account::getLanguage);
- Account account = accountService.getOne(select);
+ Account account = getAccountService().getOne(select);
if ("CHINESE_SIMPLIFIED".equals(account.getLanguage())) {
finishMessage = "请尝试重新表述提示词,或更换图片。若您认为这是误判,可提交反馈。";
}
@@ -1117,7 +1116,7 @@ public class GenerateServiceImpl extends ServiceImpl i
if (raiFilteredReason != null && raiFilteredReason.contains("Try rephrasing the prompt")) {
raiFilteredReason = "Input data may contain inappropriate content.";
LambdaQueryWrapper select = new LambdaQueryWrapper().eq(Account::getId, userId).select(Account::getLanguage);
- Account account = accountService.getOne(select);
+ Account account = getAccountService().getOne(select);
if ("CHINESE_SIMPLIFIED".equals(account.getLanguage())) {
raiFilteredReason = "输入数据可能包含不当内容。";
}
@@ -1381,7 +1380,7 @@ public class GenerateServiceImpl extends ServiceImpl i
exceptionMessage = jsonObj.getStr("message");
if ("Input data may contain inappropriate content.".equals(exceptionMessage)) {
LambdaQueryWrapper select = new LambdaQueryWrapper().eq(Account::getId, userId).select(Account::getLanguage);
- Account account = accountService.getOne(select);
+ Account account = getAccountService().getOne(select);
if ("CHINESE_SIMPLIFIED".equals(account.getLanguage())) {
exceptionMessage = "输入数据可能包含不当内容。";
}
@@ -1478,7 +1477,7 @@ public class GenerateServiceImpl extends ServiceImpl i
} catch (Exception e) {
log.error("Doubao image generation failed for taskId: {}", taskId, e);
LambdaQueryWrapper select = new LambdaQueryWrapper().eq(Account::getId, userId).select(Account::getLanguage);
- Account account = accountService.getOne(select);
+ Account account = getAccountService().getOne(select);
// 根据用户语言设置默认错误信息
String errorMessage = "图像生成失败,请稍后重试"; // 默认中文
@@ -2204,7 +2203,7 @@ public class GenerateServiceImpl extends ServiceImpl i
}
public void doCreditsSubtract(Long accountId, CreditsEventsEnum event) {
- Account account = accountService.getById(accountId);
+ Account account = getAccountService().getById(accountId);
BigDecimal existingCredits = account.getCredits();
BigDecimal subtract = existingCredits.subtract(new BigDecimal(event.getValue()));
BigDecimal creditsUsage = null;
@@ -2212,10 +2211,14 @@ public class GenerateServiceImpl extends ServiceImpl i
creditsUsage = Objects.isNull(account.getCreditsUsage()) ? BigDecimal.ZERO : account.getCreditsUsage();
creditsUsage = creditsUsage.add(new BigDecimal(event.getValue()));
}
- accountService.updateCreditsAndEndTime(account, subtract.toString(), null, creditsUsage);
+ getAccountService().updateCreditsAndEndTime(account, subtract.toString(), null, creditsUsage);
creditsService.preInsert(accountId, event.getName(), null, Boolean.FALSE, event.getValue());
}
+ private AccountService getAccountService() {
+ return SpringUtils.getBean(AccountService.class);
+ }
+
// 注入线程池(可在配置类中定义)
@Resource
private Executor asyncTaskExecutor;
diff --git a/src/main/java/com/ai/da/service/impl/LLMServiceImpl.java b/src/main/java/com/ai/da/service/impl/LLMServiceImpl.java
index b0cceeeb..532eacbb 100644
--- a/src/main/java/com/ai/da/service/impl/LLMServiceImpl.java
+++ b/src/main/java/com/ai/da/service/impl/LLMServiceImpl.java
@@ -35,7 +35,7 @@ import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
diff --git a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java
index 1296cfab..0c3aabd5 100644
--- a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java
+++ b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java
@@ -1,1110 +1,1110 @@
-package com.ai.da.service.impl;
-
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.exceptions.ExceptionUtil;
-import com.ai.da.common.config.FileProperties;
-import com.ai.da.common.config.exception.BusinessException;
-import com.ai.da.common.constant.CommonConstant;
-import com.ai.da.common.context.UserContext;
-import com.ai.da.common.enums.*;
-import com.ai.da.common.response.PageBaseResponse;
-import com.ai.da.common.response.ResultEnum;
-import com.ai.da.common.utils.*;
-import com.ai.da.mapper.primary.*;
-import com.ai.da.mapper.primary.entity.*;
-import com.ai.da.model.dto.*;
-import com.ai.da.model.enums.*;
-import com.ai.da.model.vo.*;
-import com.ai.da.python.vo.ModelPathObject;
-import com.ai.da.service.*;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONException;
-import com.alibaba.fastjson.JSONObject;
-import com.alibaba.fastjson.serializer.SerializerFeature;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import okhttp3.*;
-import org.apache.commons.fileupload.FileItem;
-import org.apache.commons.fileupload.FileItemFactory;
-import org.apache.commons.fileupload.disk.DiskFileItemFactory;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.Assert;
-import org.springframework.util.CollectionUtils;
-import org.springframework.util.StringUtils;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.multipart.commons.CommonsMultipartFile;
-
-import javax.annotation.Resource;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.nio.file.Files;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-
-import static com.ai.da.common.enums.CollectionLevel2TypeEnum.OUTWEAR;
-
-/**
- * 服务实现类
- *
- * @author yanglei
- * @since 2022-09-30
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-public class LibraryServiceImpl extends ServiceImpl implements LibraryService {
- private final AccountMapper accountMapper;
- private final BrandRelLibraryMapper brandRelLibraryMapper;
- private final ClassificationService classificationService;
- private final DesignItemDetailService designItemDetailService;
- private final EductionLibraryMapper eductionLibraryMapper;
- private final EnterpriseLibraryMapper enterpriseLibraryMapper;
- private final FileProperties fileProperties;
- private final GenerateDetailMapper generateDetailMapper;
- private final MinioUtil minioUtil;
- private final LibraryMapper libraryMapper;
- private final LibraryCopyMapper libraryCopyMapper;
- private final LibraryModelPointMapper libraryModelPointMapper;
- private final LibraryModelPointCopyMapper libraryModelPointCopyMapper;
- private final PythonTAllInfoService pythonTAllInfoService;
- private final SysFileMapper sysFileMapper;
- private final SysFileExtraMapper sysFileExtraMapper;
- private final WorkspaceService workspaceService;
-
- @Value("${minio.bucketName.users}")
- private String users;
-
- @Value("${minio.bucketName.sysImage}")
- private String sysImage;
-
- @Value("${access.python.ip:''}")
- private String accessPythonIp;
- @Value("${access.python.port:''}")
- private String accessPythonPort;
- @Value("${access.python.address}")
- private String fastApiPythonAddress;
-
- private static List top = Arrays.asList(CollectionLevel2TypeEnum.DRESS.getRealName(),
- OUTWEAR.getRealName(), CollectionLevel2TypeEnum.BLOUSE.getRealName());
- private static List bottom = Arrays.asList(CollectionLevel2TypeEnum.SKIRT.getRealName(),
- CollectionLevel2TypeEnum.TROUSERS.getRealName());
-
- @Override
- public List selectByAccountIdAnd1TypeList(Long accountId, List level1Types) {
- QueryWrapper queryWrapper = new QueryWrapper<>();
- queryWrapper.eq("account_id", accountId);
- queryWrapper.in("level1_type", level1Types);
- return CopyUtil.copyList(libraryMapper.selectList(queryWrapper), LibraryVo.class);
- }
-
- @Override
- public PageBaseResponse queryLibraryPage(QueryLibraryPageServiceDTO query) {
- AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
- // 分页数据
- QueryWrapper queryWrapper = new QueryWrapper<>();
- if (!query.getLevel1Type().equals(LibraryLevel1TypeEnum.DESIGN_ELEMENTS.getRealName())) {
- queryWrapper.eq("account_id", authPrincipalVo.getId());
- }
-
- if (!StringUtils.isEmpty(query.getLevel1Type())) {
- LibraryLevel1TypeEnum level1TypeEnum = LibraryLevel1TypeEnum.uploadOf(query.getLevel1Type());
- if (Objects.isNull(level1TypeEnum)) {
- throw new BusinessException("unknown.parameter.level1Type");
- }
- queryWrapper.eq("level1_type", query.getLevel1Type());
- }
- if (!StringUtils.isEmpty(query.getModelSex()) && query.getLevel1Type().equals(LibraryLevel1TypeEnum.SKETCH_BOARD.getRealName())) {
- queryWrapper.eq("level3_type", query.getModelSex());
- }
- if (!StringUtils.isEmpty(query.getModelSex()) && query.getLevel1Type().equals(LibraryLevel1TypeEnum.MODELS.getRealName())) {
- queryWrapper.eq("level2_type", query.getModelSex());
- }
- if (!StringUtils.isEmpty(query.getLevel2Type())) {
-// CollectionLevel2TypeEnum level2TypeEnum = CollectionLevel2TypeEnum.of(query.getLevel2Type());
-// if (Objects.isNull(level2TypeEnum)) {
-// throw new BusinessException("unknown.parameter.level2Type");
-// }
- queryWrapper.eq("level2_type", query.getLevel2Type());
- }
- if (!StringUtils.isEmpty(query.getType())) {
- LibraryTopTypeEnum libraryTopTypeEnum = LibraryTopTypeEnum.uploadOf(query.getType());
- Assert.notNull(libraryTopTypeEnum, "unknown type " + query.getType());
- if (libraryTopTypeEnum.equals(LibraryTopTypeEnum.PRINT)) {
- queryWrapper.eq("level1_type", LibraryLevel1TypeEnum.PRINT_BOARD.getRealName());
- } else {
- queryWrapper.eq("level1_type", LibraryLevel1TypeEnum.SKETCH_BOARD.getRealName());
- if (LibraryTopTypeEnum.TOP.equals(libraryTopTypeEnum)) {
- queryWrapper.in("level2_type", top);
- } else {
- queryWrapper.in("level2_type", bottom);
- }
- }
- }
- if (!StringUtils.isEmpty(query.getPictureName())) {
- queryWrapper.like("name", query.getPictureName());
- }
-
- if (!StringUtils.isEmpty(query.getAgeGroup())) {
-// queryWrapper.eq("level3_type", query.getAgeGroup());
-// queryWrapper.eq("age_group", query.getAgeGroup());
- queryWrapper.lambda().and(wrapper -> wrapper
- .eq(Library::getLevel3Type, query.getAgeGroup())
- .or()
- .eq(Library::getAgeGroup, query.getAgeGroup())
- );
- }
-
- if (query.getBrandId() != null) {
- QueryWrapper qw = new QueryWrapper<>();
- qw.lambda().eq(BrandRelLibrary::getBrandId, query.getBrandId());
- Set collect = brandRelLibraryMapper.selectList(qw).stream().map(BrandRelLibrary::getLibraryId).collect(Collectors.toSet());
- if (!CollectionUtils.isEmpty(collect)) {
- queryWrapper.in("id", collect);
- }else {
- return PageBaseResponse.success(new Page<>());
- }
- }
-
- // 新增分类过滤
- if (CollectionUtil.isNotEmpty(query.getClassificationIdList())) {
- List libraryIdList = new ArrayList<>();
- if (query.getIntersection() == 0) {
- for (Long classificationId : query.getClassificationIdList()) {
- libraryIdList.addAll(classificationService.getLibraryIdListByClassificationId(classificationId));
- }
- if (CollectionUtil.isNotEmpty(libraryIdList)) {
- queryWrapper.lambda().in(Library::getId, libraryIdList);
- }else {
- return PageBaseResponse.success(new Page<>());
- }
- }else {
- for (int i = 0; i < query.getClassificationIdList().size(); i++) {
- List libraryIdListByClassificationId = classificationService.getLibraryIdListByClassificationId(query.getClassificationIdList().get(i));
- if (i == 0) {
- libraryIdList.addAll(libraryIdListByClassificationId);
- }else {
- libraryIdList.retainAll(libraryIdListByClassificationId);
- }
- if (CollectionUtil.isEmpty(libraryIdList)) {
- return PageBaseResponse.success(new Page<>());
- }
- }
- queryWrapper.lambda().in(Library::getId, libraryIdList);
- }
- }
- queryWrapper.orderByDesc("id");
- // 1. 先查询所有符合条件的 Library 数据
- List libraryList = getBaseMapper().selectList(queryWrapper);
- if (CollectionUtils.isEmpty(libraryList)) {
- return PageBaseResponse.success(new Page<>());
- }
-
- // 2. 封装打点内容
- Map map = null;
- boolean isExist = libraryList.stream()
- .anyMatch(library -> library.getLevel1Type().equals(LibraryLevel1TypeEnum.MODELS.getRealName()));
- if (isExist) {
- List libraryIds = libraryList.stream()
- .filter(library -> library.getLevel1Type().equals(LibraryLevel1TypeEnum.MODELS.getRealName()))
- .map(Library::getId)
- .collect(Collectors.toList());
- List libraryModelPointVOS = selectByLibraryIds(libraryIds);
- if (!CollectionUtils.isEmpty(libraryModelPointVOS)) {
- map = libraryModelPointVOS.stream()
- .collect(Collectors.toMap(LibraryModelPointVO::getRelationId, v -> v));
- }
- }
- Map finalMap = map;
-
- // 3. 转换 Library 为 QueryLibraryPageVO,并通过 minioUtil 过滤掉不存在的 URL
- List convertedList = libraryList.stream()
- .map(library -> {
- QueryLibraryPageVO libraryPageVO = CopyUtil.copyObject(library, QueryLibraryPageVO.class);
- libraryPageVO.setDesignType(DesignTypeEnum.LIBRARY.getRealName());
- libraryPageVO.setMinIOPath(library.getUrl());
- String url = library.getUrl();
- if (minioUtil.doesObjectExist(url)) {
- libraryPageVO.setUrl(minioUtil.getPreSignedUrl(url, 24 * 60));
- if (finalMap != null && finalMap.containsKey(library.getId())) {
- libraryPageVO.setLibraryModelPoint(finalMap.get(library.getId()));
- }
- if (libraryPageVO.getLevel1Type().equals(LibraryLevel1TypeEnum.SKETCH_BOARD.getRealName())) {
- if (!StringUtils.isEmpty(libraryPageVO.getLevel2Type())) {
- Position position = Position.getPosition(libraryPageVO.getLevel2Type());
- libraryPageVO.setLevel2TypeEnum(new BizJson(
- position.getValue(),
- position.name(),
- BusinessException.getMessageFromResource(position.name()))
- );
- }
- }
- if (libraryPageVO.getLevel1Type().equals(LibraryLevel1TypeEnum.PRINT_BOARD.getRealName())) {
- PrintboardLevel2TypeEnum printboardLevel2TypeEnum = PrintboardLevel2TypeEnum.fromName(libraryPageVO.getLevel2Type());
- libraryPageVO.setLevel2TypeEnum(new BizJson(
- printboardLevel2TypeEnum.getValue(),
- printboardLevel2TypeEnum.name(),
- BusinessException.getMessageFromResource(printboardLevel2TypeEnum.name()))
- );
- }
- if (libraryPageVO.getLevel1Type().equals(LibraryLevel1TypeEnum.DESIGN_ELEMENTS.getRealName())) {
- DesignElementsEnum designElementsEnum = DesignElementsEnum.fromName(libraryPageVO.getLevel2Type());
- libraryPageVO.setLevel2TypeEnum(new BizJson(
- designElementsEnum.getValue(),
- designElementsEnum.name(),
- BusinessException.getMessageFromResource(designElementsEnum.name()))
- );
- }
- return libraryPageVO;
- } else {
- // 如果对应的 MinIO 文件不存在,则返回 null,后续过滤掉
- return null;
- }
- })
- .filter(Objects::nonNull)
- .collect(Collectors.toList());
-
- // 4. 手动分页
- int total = convertedList.size();
- int currentPage = query.getPage(); // 当前页码(从1开始)
- int pageSize = query.getSize(); // 每页大小
- int fromIndex = (currentPage - 1) * pageSize;
- int toIndex = Math.min(total, currentPage * pageSize);
- List pageList = new ArrayList<>();
- if (fromIndex < total) {
- pageList = convertedList.subList(fromIndex, toIndex);
- }
-
- // 5. 构造 IPage 对象(使用 MyBatis-Plus 的 Page 实现)
- IPage pageResult = new Page<>(currentPage, pageSize, total);
- pageResult.setRecords(pageList);
-
- // 6. 返回结果
- return PageBaseResponse.success(pageResult);
- }
-
- public List selectByLibraryIds(List libraryIds) {
- QueryWrapper queryWrapper = new QueryWrapper<>();
- queryWrapper.lambda().eq(LibraryModelPoint::getModelType, ModelType.LIBRARY.getValue());
- queryWrapper.in("relation_id", libraryIds);
- List libraryModelPoints = libraryModelPointMapper.selectList(queryWrapper);
- if (CollectionUtils.isEmpty(libraryModelPoints)) {
- return null;
- }
- return CopyUtil.copyList(libraryModelPoints, LibraryModelPointVO.class, (o, d) -> {
- d.setTemplateId(o.getId());
- d.setHandLeft(JSON.parseObject(o.getHandLeft(), List.class));
- d.setHandRight(JSON.parseObject(o.getHandRight(), List.class));
- d.setShoulderRight(JSON.parseObject(o.getShoulderRight(), List.class));
- d.setShoulderLeft(JSON.parseObject(o.getShoulderLeft(), List.class));
- d.setWaistbandRight(JSON.parseObject(o.getWaistbandRight(), List.class));
- d.setWaistbandLeft(JSON.parseObject(o.getWaistbandLeft(), List.class));
- });
- }
-
- @Override
- public LibraryUpdateVo upload(LibraryUploadDTO libraryUploadDTO) {
- //用户信息
- AuthPrincipalVo userInfo = UserContext.getUserHolder();
- LibraryLevel1TypeEnum level1TypeEnum = LibraryLevel1TypeEnum.uploadOf(libraryUploadDTO.getLevel1Type());
- if (Objects.isNull(level1TypeEnum)) {
- throw new BusinessException("unknown.parameter.level1Type");
- }
-// if (!StringUtils.isEmpty(libraryUploadDTO.getLevel2Type())) {
-// CollectionLevel2TypeEnum level2TypeEnum = CollectionLevel2TypeEnum.of(libraryUploadDTO.getLevel2Type());
-// if (Objects.isNull(level2TypeEnum)) {
-// throw new BusinessException("unknown.parameter.level2Type");
-// }
-// }
- if ((level1TypeEnum.equals(LibraryLevel1TypeEnum.SKETCH_BOARD) || level1TypeEnum.equals(LibraryLevel1TypeEnum.PRINT_BOARD) || level1TypeEnum.equals(LibraryLevel1TypeEnum.DESIGN_ELEMENTS)) && StringUtils.isEmpty(libraryUploadDTO.getLevel2Type())) {
- throw new BusinessException("level2Type.cannot.be.empty");
- }
- String path = calculateFileUrl(level1TypeEnum, libraryUploadDTO.getLevel2Type(), libraryUploadDTO.getModelSex(), userInfo.getId());
- String bucketName = null;
- switch (level1TypeEnum) {
- case MODELS:
- case MOOD_BOARD:
- case PRINT_BOARD:
- case SKETCH_BOARD:
- case DESIGN_ELEMENTS:
- bucketName = users;
- break;
- case MARKETING_SKETCH:
- // 走不到
- throw new BusinessException("MARKETING_SKETCH.type.have.been.removed");
- default:
- throw new BusinessException("unknown.level1TypeEnum");
- }
- //保存element元素
- if (!StringUtils.isEmpty(libraryUploadDTO.getModelType())) {
- if (libraryUploadDTO.getModelType().equals(ModelType.LIBRARY.getValue())) {
- String filePath = minioUtil.upload(bucketName, path, libraryUploadDTO.getFile());
- String newFilePath = processMannequins(filePath);
- Library library = resolveData(libraryUploadDTO, userInfo, newFilePath);
- LibraryUpdateVo libraryUpdateVo = CopyUtil.copyObject(library, LibraryUpdateVo.class);
- libraryUpdateVo.setMinIOPath(libraryUpdateVo.getUrl());
- libraryUpdateVo.setUrl(minioUtil.getPreSignedUrl(newFilePath, 24 * 60));
- libraryUpdateVo.setCheckMd5(Boolean.TRUE);
- return libraryUpdateVo;
- } else if (libraryUploadDTO.getModelType().equals(ModelType.SYSTEM.getValue())) {
- bucketName = sysImage;
- path = "models/" + libraryUploadDTO.getModelSex().toLowerCase();
- String filePath = minioUtil.upload(bucketName, path, libraryUploadDTO.getFile());
- String newFilePath = processMannequins(filePath);
-// String newFilePath = filePath;
- Library library = resolveData(libraryUploadDTO, userInfo, newFilePath);
- LibraryUpdateVo libraryUpdateVo = CopyUtil.copyObject(library, LibraryUpdateVo.class);
- libraryUpdateVo.setMinIOPath(libraryUpdateVo.getUrl());
- libraryUpdateVo.setUrl(minioUtil.getPreSignedUrl(newFilePath, 24 * 60));
- libraryUpdateVo.setCheckMd5(Boolean.TRUE);
- return libraryUpdateVo;
- } else {
- throw new BusinessException("unknown.modelType");
- }
- } else {
- String filePath = minioUtil.upload(bucketName, path, libraryUploadDTO.getFile());
- if (libraryUploadDTO.getLevel1Type().equals(LibraryLevel1TypeEnum.SKETCH_BOARD.getRealName())) {
- processSketchBoards(filePath, libraryUploadDTO.getLevel2Type());
- }
- //保存element元素
- Library library = resolveData(libraryUploadDTO, userInfo, filePath);
- LibraryUpdateVo libraryUpdateVo = CopyUtil.copyObject(library, LibraryUpdateVo.class);
- libraryUpdateVo.setMinIOPath(libraryUpdateVo.getUrl());
- libraryUpdateVo.setUrl(minioUtil.getPreSignedUrl(libraryUpdateVo.getUrl(), 24 * 60));
- libraryUpdateVo.setCheckMd5(Boolean.TRUE);
- return libraryUpdateVo;
- }
- }
-
- @Override
- public String processMannequins(String filePath) {
- ModelPathObject modelPathObject = new ModelPathObject();
- modelPathObject.setModel_path(filePath);
- OkHttpClient client = new OkHttpClient().newBuilder()
- .connectTimeout(30, TimeUnit.SECONDS)
- .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
- .readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
- .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
- .build();
- MediaType mediaType = MediaType.parse("application/json");
- //关闭FastJson的引用检测 防止出现$ref 现象
- String param = JSON.toJSONString(modelPathObject, SerializerFeature.DisableCircularReferenceDetect);
- log.info("processMannequins请求python 参数:####{}", param);
- RequestBody body = RequestBody.create(mediaType, param);
- Request request = new Request.Builder()
- .url(accessPythonIp + ":" + accessPythonPort + "/api/model_process")
-// .url(accessPythonIp + ":10200/aifda/api/v1.0/generate")
- .method("POST", body)
-// .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
- .addHeader("Content-Type", "application/json")
- .build();
- Response response = null;
- try {
- response = client.newCall(request).execute();
- } catch (IOException ioException) {
- log.error("PythonService##processMannequins异常###{}", ExceptionUtil.getThrowableList(ioException));
- throw new BusinessException("processMannequins.interface.exception");
- }
- //去除限流
-// AccessLimitUtils.validateOut("design");
- if (response.isSuccessful()) {
- try {
- if (Objects.isNull(response.body())) {
- throw new BusinessException("processMannequins.interface.exception");
- }
- String responseBody = response.body().string();
- JSONObject responseObject = JSON.parseObject(responseBody);
- String newMinioPath = responseObject.getString("data");
- return newMinioPath;
- } catch (IOException | JSONException e) {
- log.error(e.getMessage());
- throw new BusinessException("processMannequins.interface.exception");
- }
- }
- //生成失败
- throw new BusinessException("processMannequins.interface.exception");
- }
-
- /**
- * 去sketch白边
- * @param filePath
- * @param category
- */
- @Override
- public void processSketchBoards(String filePath, String category) {
- Long imageId = pythonTAllInfoService.getImageIdByPath(filePath);
- SketchesBoundingBox sketchesBoundingBox = new SketchesBoundingBox();
- List list = new ArrayList<>();
- Sketches sketches = new Sketches();
- sketches.setImage_id(String.valueOf(imageId));
- sketches.setImage_url(filePath);
- sketches.setImage_category(category);
- list.add(sketches);
- sketchesBoundingBox.setSketches(list);
-
- OkHttpClient client = new OkHttpClient().newBuilder()
- .connectTimeout(30, TimeUnit.SECONDS)
- .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
- .readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
- .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
- .build();
- MediaType mediaType = MediaType.parse("application/json");
- //关闭FastJson的引用检测 防止出现$ref 现象
- String param = JSON.toJSONString(sketchesBoundingBox, SerializerFeature.DisableCircularReferenceDetect);
- log.info("processSketchBoards请求python 参数:####{}", param);
- RequestBody body = RequestBody.create(mediaType, param);
- Request request = new Request.Builder()
-// .url(accessPythonIp + ":" + accessPythonPort + "/api/design_pre_processing")
- .url(fastApiPythonAddress + "/api/design_pre_processing")
- .method("POST", body)
-// .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
- .addHeader("Content-Type", "application/json")
- .build();
- Response response = null;
- try {
- response = client.newCall(request).execute();
- } catch (IOException ioException) {
- log.error("PythonService##processSketchBoards异常###{}", ExceptionUtil.getThrowableList(ioException));
- throw new BusinessException("processSketchBoards.interface.exception");
- }
- //去除限流
-// AccessLimitUtils.validateOut("design");
- if (response.isSuccessful()) {
- try {
- if (Objects.isNull(response.body())) {
- throw new BusinessException("processSketchBoards.interface.exception");
- }
- String responseBody = response.body().string();
- JSONObject responseObject = JSON.parseObject(responseBody);
- return;
-// String newMinioPath = responseObject.getString("data");
-// return newMinioPath;
- } catch (IOException | JSONException e) {
- log.error(e.getMessage());
- throw new BusinessException("processSketchBoards.interface.exception");
- }
- }
- //生成失败
- throw new BusinessException("processSketchBoards.interface.exception");
- }
-
- @Override
- public Boolean checkMd5(String level1Type, String level2Type, String sex, String md5) {
- AuthPrincipalVo userInfo = UserContext.getUserHolder();
- QueryWrapper qw = new QueryWrapper<>();
- qw.lambda().eq(Library::getAccountId, userInfo.getId());
- qw.lambda().eq(Library::getLevel1Type, level1Type);
- if (!StringUtils.isEmpty(sex)) {
- if (level1Type.equals(LibraryLevel1TypeEnum.SKETCH_BOARD.getRealName())) {
- qw.lambda().eq(Library::getLevel2Type, level2Type);
- qw.lambda().eq(Library::getLevel3Type, sex);
- } else {
-// qw.lambda().eq(Library::getLevel2Type, sex);
- qw.lambda().eq(Library::getLevel3Type, sex);
- }
- }
- qw.lambda().eq(Library::getMd5, md5);
- List libraryList = libraryMapper.selectList(qw);
- if (!CollectionUtils.isEmpty(libraryList)) {
-// throw new BusinessException("Your library already contains the images you uploaded, Are you sure to upload them");
- return Boolean.FALSE;
- } else {
- return Boolean.TRUE;
- }
- }
-
- @Override
- @Transactional(rollbackFor = Exception.class)
- public void batchDeleteLibrary(LibraryDeleteDTO deleteDTO) {
- List librarys = libraryMapper.selectBatchIds(deleteDTO.getLibraryIds());
- if (CollectionUtils.isEmpty(librarys)) {
- throw new BusinessException("libraryList.not.found");
- }
- List femaleModelIds = librarys.stream()
- .filter(o -> o.getLevel1Type().equals(LibraryLevel1TypeEnum.MODELS.getRealName()) && o.getLevel2Type().equals(Sex.FEMALE.getValue()))
- .map(Library::getId)
- .collect(Collectors.toList());
- List maleModelIds = librarys.stream()
- .filter(o -> o.getLevel1Type().equals(LibraryLevel1TypeEnum.MODELS.getRealName()) && o.getLevel2Type().equals(Sex.MALE.getValue()))
- .map(Library::getId)
- .collect(Collectors.toList());
- if (CollectionUtil.isNotEmpty(femaleModelIds)) {
- // 检测模特是否被工作空间引用
- checkModel(Sex.FEMALE.getValue(), femaleModelIds, deleteDTO.getDeleteModelConfirm());
- }
- if (CollectionUtil.isNotEmpty(maleModelIds)) {
- checkModel(Sex.MALE.getValue(), maleModelIds, deleteDTO.getDeleteModelConfirm());
- }
- libraryMapper.deleteBatchIds(deleteDTO.getLibraryIds());
-
- // 1、确定该libraryId是否被generateDetail引用
- List generateDetails = selectBatchByLibraryId(deleteDTO.getLibraryIds());
-
- // 2、有,则更新generateDetail表的is_like字段和library_id字段
- if (!generateDetails.isEmpty()){
- updateLikeStatusBatch(
- generateDetails.stream().map(GenerateDetail::getId).collect(Collectors.toList()),
- (byte)0,
- 0L,
- deleteDTO.getTimeZone()
- );
- }
-
- // 判断当前libraryId是否被brand_rel_library引用
- QueryWrapper brandRelLibraryQueryWrapper = new QueryWrapper<>();
- brandRelLibraryQueryWrapper.lambda().in(BrandRelLibrary::getLibraryId, deleteDTO.getLibraryIds());
-
- brandRelLibraryMapper.delete(brandRelLibraryQueryWrapper);
-// for (Library library : librarys) {
-// if (library.getUrl().startsWith(sysImage)) {
-// continue;
-// }
-// minioUtil.deleteObject(library.getUrl());
-// }
-
- }
-
- public List selectBatchByLibraryId(List libraryId) {
- QueryWrapper qw = new QueryWrapper<>();
- qw.in("library_id", libraryId);
-
- return generateDetailMapper.selectList(qw);
- }
-
- public void updateLikeStatusBatch(List generateDetailIdList, Byte hasLike, Long libraryId, String timeZone) {
- QueryWrapper queryWrapper = new QueryWrapper<>();
- queryWrapper.in("id", generateDetailIdList);
-
- GenerateDetail generateDetail = new GenerateDetail();
- generateDetail.setIsLike(hasLike);
- generateDetail.setLibraryId(libraryId);
- generateDetail.setUpdateDate(DateUtil.getByTimeZone(timeZone));
-
- generateDetailMapper.update(generateDetail, queryWrapper);
- }
-
- @Override
- public void deleteTrialData(Long userId) {
- QueryWrapper qw = new QueryWrapper<>();
- qw.lambda().eq(Library::getAccountId, userId);
- libraryMapper.delete(qw);
- }
-
- @Override
- public void moveLibraryDate() throws ParseException {
- QueryWrapper qw = new QueryWrapper<>();
- // 定义日期格式
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
- // 定义日期字符串
- String dateString = "2023-09-01 00:00:00";
- qw.gt("create_date", dateFormat.parse(dateString));
- // 生产所有数据
- List libraryList = libraryCopyMapper.selectList(qw);
- for (LibraryCopy libraryCopy : libraryList) {
- QueryWrapper one = new QueryWrapper<>();
- one.lambda().eq(Library::getAccountId, libraryCopy.getAccountId());
- one.lambda().eq(Library::getMd5, libraryCopy.getMd5());
- List libraryList1 = libraryMapper.selectList(one);
- if (CollectionUtil.isNotEmpty(libraryList1)) {
- continue;
- }
- String url = libraryCopy.getUrl();
- if (StringUtils.isEmpty(url)) {
- continue;
- }
- if (url.contains("/download/")) {
- String[] downloads = url.split("/download/");
- if (downloads.length == 2) {
- String linux = downloads[1];
- String windows = linux.replaceAll("/", "\\\\");
- String path = "C:\\workspace\\fileData\\file\\" + windows;
- File file = FileUtil.getFile(path);
- if (file != null) {
- String name = file.getName();
- System.out.println(name);
- StringBuilder sb = new StringBuilder();
- sb.append(libraryCopy.getAccountId()).append("/").append(libraryCopy.getLevel1Type().toLowerCase()).append("/");
- if (libraryCopy.getLevel1Type().equals("Sketchboard") || libraryCopy.getLevel1Type().equals("Models")) {
- sb.append("female/");
- }
- if (!StringUtils.isEmpty(libraryCopy.getLevel2Type())) {
- sb.append(libraryCopy.getLevel2Type().toLowerCase()).append("/");
- }
- sb.append(name);
- String bucketName = users;
- boolean b = minioUtil.doesObjectExist(bucketName, sb.toString());
- if (!b) {
- FileItem a = getMultipartFile(file, file.getName());
- MultipartFile multipartFile = new CommonsMultipartFile(a);
- String upload = minioUtil.upload(bucketName, sb.toString(), multipartFile, "");
- Library newInsert = CopyUtil.copyObject(libraryCopy, Library.class);
- newInsert.setId(null);
- if (libraryCopy.getLevel1Type().equals("Models")) {
- newInsert.setLevel2Type("Female");
- QueryWrapper modelCopy = new QueryWrapper<>();
- modelCopy.lambda().eq(LibraryModelPointCopy::getLibraryId, libraryCopy.getId());
- LibraryModelPointCopy libraryModelPointCopy = libraryModelPointCopyMapper.selectOne(modelCopy);
- LibraryModelPoint libraryModelPoint = CopyUtil.copyObject(libraryModelPointCopy, LibraryModelPoint.class);
- libraryModelPoint.setModelType("Library");
-
- upload = processMannequins(upload);
- newInsert.setUrl(upload);
- libraryMapper.insert(newInsert);
-
- libraryModelPoint.setRelationId(newInsert.getId());
- libraryModelPoint.setId(null);
-// libraryModelPointService.saveOrUpdate(libraryModelPoint);
- libraryModelPointMapper.insert(libraryModelPoint);
- continue;
- }
- if (libraryCopy.getLevel1Type().equals("Sketchboard")) {
- newInsert.setLevel3Type("Female");
- }
- newInsert.setUrl(upload);
- libraryMapper.insert(newInsert);
- }
- }
- }
- }
- }
- }
- private static FileItem getMultipartFile(File file, String fieldName) {
- // 使用 DiskFileItemFactory 创建一个 FileItemFactory
- FileItemFactory factory = new DiskFileItemFactory(16, null);
-
- // 使用 FileItemFactory 创建一个 FileItem 对象
- String mimeType = getMimeType(file);
- FileItem item = factory.createItem(fieldName, mimeType, true, file.getName());
-
- byte[] buffer = new byte[8192];
- int bytesRead;
-
- try (FileInputStream fis = new FileInputStream(file);
- OutputStream os = item.getOutputStream()) {
- // 从文件中读取数据并写入 FileItem
- while ((bytesRead = fis.read(buffer)) != -1) {
- os.write(buffer, 0, bytesRead);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- return item;
- }
-
- private static String getMimeType(File file) {
- try {
- return Files.probeContentType(file.toPath());
- } catch (IOException e) {
- e.printStackTrace();
- return null;
- }
- }
-
-
- @Override
- public void checkModel(String value, List modelIds, Integer deleteModelConfirm) {
- AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
- QueryWrapper qw = new QueryWrapper<>();
- qw.lambda().eq(Workspace::getAccountId, authPrincipalVo.getId());
- if (value.equals(Sex.FEMALE.getValue())) {
- qw.lambda().in(Workspace::getMannequinFemaleId, modelIds);
- }
- if (value.equals(Sex.MALE.getValue())) {
- qw.lambda().in(Workspace::getMannequinMaleId, modelIds);
- }
- // TODO:isDeleted设置
- qw.lambda().eq(Workspace::getIsDeleted, 0L);
- List workspaceList = workspaceService.list(qw);
- if (CollectionUtil.isNotEmpty(workspaceList)) {
- if (deleteModelConfirm.equals(0)) {
- throw new BusinessException("the.model.has.been.referenced.by.the.workspace", ResultEnum.WARNING.getCode());
- }
- if (value.equals(Sex.FEMALE.getValue())) {
- QueryWrapper systemFemaleQw = new QueryWrapper<>();
- systemFemaleQw.lambda().eq(SysFile::getLevel1Type, "Models");
- systemFemaleQw.lambda().eq(SysFile::getLevel2Type, "Female");
- List sysFemaleFiles = sysFileMapper.selectList(systemFemaleQw);
- if (!CollectionUtils.isEmpty(sysFemaleFiles)) {
- for (Workspace workspace : workspaceList) {
- workspace.setMannequinFemaleId(sysFemaleFiles.get(0).getId());
- workspace.setMannequinFemaleType(MannequinType.SYSTEM.getValue());
- }
- workspaceService.updateBatchById(workspaceList);
- }
- }
- if (value.equals(Sex.MALE.getValue())) {
- QueryWrapper systemMaleQw = new QueryWrapper<>();
- systemMaleQw.lambda().eq(SysFile::getLevel1Type, "Models");
- systemMaleQw.lambda().eq(SysFile::getLevel2Type, "Male");
- List sysMaleFiles = sysFileMapper.selectList(systemMaleQw);
- if (!CollectionUtils.isEmpty(sysMaleFiles)) {
- for (Workspace workspace : workspaceList) {
- workspace.setMannequinMaleId(sysMaleFiles.get(0).getId());
- workspace.setMannequinMaleType(MannequinType.SYSTEM.getValue());
- }
- workspaceService.updateBatchById(workspaceList);
- }
- }
- }
-
- }
-
- private Library resolveData(LibraryUploadDTO uploadDTO, AuthPrincipalVo userInfo, String filePath) {
- if (StringUtils.isEmpty(uploadDTO.getModelType()) || uploadDTO.getModelType().equals(ModelType.LIBRARY.getValue())) {
- Library library = CopyUtil.copyObject(uploadDTO, Library.class);
- library.setAccountId(userInfo.getId());
- String originalFilename = uploadDTO.getFile().getOriginalFilename();
- if (!StringUtils.isEmpty(originalFilename)) {
- if (originalFilename.contains(".")) {
- String name = originalFilename.substring(0,originalFilename.lastIndexOf("."));
- library.setName(name);
-// library.setName(originalFilename.split("\\.")[0]);
- }else {
- library.setName(originalFilename);
- }
- }else {
- library.setName(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
- }
- library.setUrl(filePath);
- //按时区计算
- library.setCreateDate(DateUtil.getByTimeZone(uploadDTO.getTimeZone()));
- if (uploadDTO.getModelType().equals(ModelType.LIBRARY.getValue())) {
- library.setLevel2Type(uploadDTO.getModelSex());
-// library.setLevel3Type(uploadDTO.getAgeGroup());
- } else {
- library.setLevel3Type(uploadDTO.getModelSex());
- }
- if (uploadDTO.getLevel1Type().equals(LibraryLevel1TypeEnum.SKETCH_BOARD.getRealName())&&StringUtils.isEmpty(uploadDTO.getAgeGroup())) {
- log.error("前端未传ageGroup");
- library.setAgeGroup("Adult");
- } else {
- library.setAgeGroup(uploadDTO.getAgeGroup());
- }
- libraryMapper.insert(library);
- return library;
- } else if (uploadDTO.getModelType().equals(ModelType.SYSTEM.getValue())) {
- SysFile sysFile = new SysFile();
- String originalFilename = uploadDTO.getFile().getOriginalFilename();
- if (!StringUtils.isEmpty(originalFilename)) {
- if (originalFilename.contains(".")) {
- String name = originalFilename.substring(0,originalFilename.lastIndexOf("."));
- sysFile.setName(name);
-// sysFile.setName(originalFilename.split("\\.")[0]);
- }else {
- sysFile.setName(originalFilename);
- }
- }else {
- sysFile.setName(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
- }
- sysFile.setLevel1Type("Models");
- sysFile.setLevel2Type(uploadDTO.getModelSex());
- sysFile.setUrl(filePath);
- sysFile.setMd5(uploadDTO.getMd5());
- sysFile.setCreateDate(new Date());
- sysFileMapper.insert(sysFile);
-
- SysFileExtra extra = new SysFileExtra();
- extra.setSysId(sysFile.getId());
- extra.setAgeGroup(uploadDTO.getAgeGroup());
- sysFileExtraMapper.insert(extra);
-
- Library library = new Library();
- library.setId(sysFile.getId());
- library.setUrl(sysFile.getUrl());
- return library;
- } else {
- throw new BusinessException("unknown.modelType");
- }
- }
-
- private String calculateFileUrl(LibraryLevel1TypeEnum level1TypeEnum, String level2Type, String modelSex, Long userId) {
- if (StringUtils.isEmpty(modelSex)) {
- return StringUtils.isEmpty(level2Type) ? userId + "/" + level1TypeEnum.getRealName().toLowerCase() : userId + "/" + level1TypeEnum.getRealName().toLowerCase() + "/" + level2Type;
- } else {
- return StringUtils.isEmpty(level2Type) ? userId + "/" + level1TypeEnum.getRealName().toLowerCase() + "/" + modelSex.toLowerCase() : userId + "/" + level1TypeEnum.getRealName().toLowerCase() + "/" + modelSex.toLowerCase() + "/" + level2Type;
- }
- }
-
- @Override
- public void updateLibraryName(LibraryUpdateDTO libraryUpdateDTO) {
- List librarys = getByIds(libraryUpdateDTO.getLibraryIds());
- if (CollectionUtils.isEmpty(librarys)) {
- throw new BusinessException("libraryList.not.found");
- }
- QueryWrapper queryWrapper = new QueryWrapper<>();
- queryWrapper.in("id", libraryUpdateDTO.getLibraryIds());
- Library library1 = new Library();
- library1.setName(libraryUpdateDTO.getLibraryName());
- library1.setUpdateDate(DateUtil.getByTimeZone(libraryUpdateDTO.getTimeZone()));
- libraryMapper.update(library1, queryWrapper);
- }
-
- @Override
- public List getByIds(List ids) {
- QueryWrapper queryWrapper = new QueryWrapper<>();
- queryWrapper.in("id", ids);
- return libraryMapper.selectList(queryWrapper);
- }
-
- @Override
- public List getByMD5List(List md5List) {
- QueryWrapper queryWrapper = new QueryWrapper<>();
- queryWrapper.in("md5", md5List);
- return libraryMapper.selectList(queryWrapper);
- }
-
- @Override
- public List getByUrlList(List urlList, Long userId) {
- QueryWrapper queryWrapper = new QueryWrapper<>();
- queryWrapper.in("url", urlList);
- queryWrapper.in("account_id", userId);
- return CopyUtil.copyList(libraryMapper.selectList(queryWrapper), LibraryVo.class);
- }
-
- @Override
- public Boolean updateLibraryLevel2Type(LibraryLevel2TypeUpdateDTO libraryLevel2TypeUpdateDTO) {
- Library library = new Library();
- library.setLevel2Type(libraryLevel2TypeUpdateDTO.getLevel2Type());
- QueryWrapper qw = new QueryWrapper<>();
- qw.lambda().in(Library::getId, libraryLevel2TypeUpdateDTO.getLibraryId());
- return libraryMapper.update(library, qw) == 1;
- }
-
- private Library selectById(Long id) {
- QueryWrapper queryWrapper = new QueryWrapper<>();
- queryWrapper.eq("id", id);
- return libraryMapper.selectOne(queryWrapper);
- }
-
- private Boolean exists(Long id) {
- QueryWrapper queryWrapper = new QueryWrapper<>();
- queryWrapper.eq("id", id);
- return libraryMapper.exists(queryWrapper);
- }
-
- private boolean saveOne(Library library) {
- if (libraryMapper.insert(library) <= 0) {
- throw new BusinessException("save.library.failed");
- }
- return Boolean.TRUE;
- }
-
- @Override
- public Map addSysModelToLib(long sysModelId) {
- Long accountId = UserContext.getUserHolder().getId();
- SysFile sysFile = sysFileMapper.selectById(sysModelId);
- if (Objects.isNull(sysFile)) {
- throw new BusinessException("model.not.found", ResultEnum.PROMPT.getCode());
- }
- SysFileExtra sysFileExtra = sysFileExtraMapper.selectOne(new QueryWrapper().eq("sys_id", sysFile.getId()));
-
- // 添加模特信息到library
- Library library = CopyUtil.copyObject(sysFile, Library.class);
- library.setId(null);
- library.setAccountId(accountId);
- library.setAgeGroup(sysFileExtra.getAgeGroup());
- library.setName(DateUtil.dateToStr(new Date(), DateUtil.YYYY_MM_DD));
- List imagesWidthAndHeight = minioUtil.getImagesWidthAndHeight(sysFile.getUrl());
- library.setWidth(imagesWidthAndHeight.get(0));
- library.setHigh(imagesWidthAndHeight.get(1));
- library.setCreateDate(new Date());
- library.setUpdateDate(null);
- libraryMapper.insert(library);
-
- // 添加点位信息到library
- LibraryModelPoint sysModelPoint = getByRelationId(sysModelId, "System");
- sysModelPoint.setId(null);
- sysModelPoint.setModelType("Library");
- sysModelPoint.setRelationId(library.getId());
- sysModelPoint.setCreateDate(new Date());
- libraryModelPointMapper.insert(sysModelPoint);
-
- Map resp = new HashMap<>();
- resp.put("id", library.getId().toString());
- resp.put("url", minioUtil.getPreSignedUrl(library.getUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
- return resp;
- }
-
- public LibraryModelPoint getByRelationId(Long relationId, String modelType) {
- QueryWrapper queryWrapper = new QueryWrapper<>();
- queryWrapper.lambda().eq(LibraryModelPoint::getRelationId, relationId)
- .eq(LibraryModelPoint::getModelType, modelType)
- .last("limit 1");
- List libraryModelPoints = libraryModelPointMapper.selectList(queryWrapper);
- if (CollectionUtil.isEmpty(libraryModelPoints)) {
- throw new BusinessException("modelPoint.not.found");
- }
- return libraryModelPoints.get(0);
- }
-
-
- public boolean saveToOrganizationLibrary(Long libraryId){
- // 1、判断该用户是否属于某个组织
- Long accountId = UserContext.getUserHolder().getId();
- Account account = accountMapper.selectById(accountId);
- if (Objects.nonNull(account.getOrganizationId())){
- // 2、添加元素信息到对应的住址表里
- switch(account.getSystemUser()){
- case 5:
- case 6:
- EnterpriseLibrary enterpriseLibrary = enterpriseLibraryMapper.selectOne(new QueryWrapper().eq("library_id", libraryId));
- if (Objects.nonNull(enterpriseLibrary)){
- throw new BusinessException("element.already.exists");
- }
- // 存储到企业表
- enterpriseLibrary = new EnterpriseLibrary();
- enterpriseLibrary.setEnterpriseId(account.getOrganizationId());
- enterpriseLibrary.setLibraryId(libraryId);
- enterpriseLibrary.setCreateTime(LocalDateTime.now());
- enterpriseLibraryMapper.insert(enterpriseLibrary);
- log.info("企业用户添加元素到公共库");
- return true;
- case 7:
- case 8:
- EducationLibrary educationLibrary = eductionLibraryMapper.selectOne(new QueryWrapper().eq("library_id", libraryId));
- if (Objects.nonNull(educationLibrary)){
- throw new BusinessException("element.already.exists");
- }
- // 存储到教育表
- educationLibrary = new EducationLibrary();
- educationLibrary.setEducationId(account.getOrganizationId());
- educationLibrary.setLibraryId(libraryId);
- educationLibrary.setCreateTime(LocalDateTime.now());
- eductionLibraryMapper.insert(educationLibrary);
- log.info("教育版用户添加元素到公共库");
- return true;
- default:
- return false;
- }
- }
- return false;
- }
-
- // 删除公共库中的元素
- public void deleteFromPublicLib(Long libraryId){
- // 谁有权限删除公共库里的东西?1、元素所有者 2、管理员
- Long accountId = UserContext.getUserHolder().getId();
- Account account = accountMapper.selectById(accountId);
- Library library = libraryMapper.selectById(libraryId);
-
- if (account.getSystemUser().equals(5)
- || account.getSystemUser().equals(7)
- || library.getAccountId().equals(accountId)){
- switch (account.getSystemUser()){
- case 5:
- case 6:
- enterpriseLibraryMapper.delete(new QueryWrapper().eq("library_id", libraryId));
- break;
- case 7:
- case 8:
- eductionLibraryMapper.delete(new QueryWrapper().eq("library_id", libraryId));
- break;
- }
- }else {
- throw new BusinessException("have.no.permission", ResultEnum.PROMPT.getCode());
- }
- }
-
-
- // 查询企业或教育的公共库
- public PageBaseResponse getPublicLib(String order, long page, long size){
- Long accountId = UserContext.getUserHolder().getId();
- Account account = accountMapper.selectById(accountId);
- if (Objects.isNull(account.getOrganizationId())){
- throw new BusinessException("未查询到您的组织信息,无法获取公共库的元素", ResultEnum.PROMPT.getCode());
- }
- Long organizationId = account.getOrganizationId();
- long offset = (page - 1) * size;
- List libraries = libraryMapper.selectCommonLib(organizationId, order, size, offset);
- Long count = libraryMapper.selectCommonLibCount(organizationId);
- long pages = (long) Math.ceil(count / size);
- return new PageBaseResponse<>(libraries, page, size, count, pages == 0 ? 1 : pages);
- }
-
- // 管理员查所有子账号的library
- public PageBaseResponse getAllSubAccLib(String order, long page, long size){
- // 1、判断当前账号是不是管理员
- Long accountId = UserContext.getUserHolder().getId();
- Account account = accountMapper.selectById(accountId);
- long offset = (page - 1) * size;
- switch(account.getSystemUser()){
- case 5:
- case 7:
- if (Objects.isNull(account.getOrganizationId())){
- throw new BusinessException("未查询到您的组织信息,无法获取元素", ResultEnum.PROMPT.getCode());
- }
- List libraries = libraryMapper.selectAllSubAccLib(account.getOrganizationId(), order, size, offset);
- Long count = libraryMapper.selectAllSubAccLibCount(account.getOrganizationId());
- long pages = (long) Math.ceil(count / size);
- return new PageBaseResponse<>(libraries, page, size, count, pages == 0 ? 1 : pages);
- default:
- throw new BusinessException("have.no.permission", ResultEnum.PROMPT.getCode());
- }
- }
-
- /**
- * 将系统sketch添加到个人library
- */
- public String addSysSketchToLibrary(Long clothId, String path) {
- // 1. 判断当前路径是不是系统sketch
- if (!path.startsWith("aida-sys-image/images")) {
- throw new BusinessException("Non-system Sketch file cannot be added to personal library.", ResultEnum.PROMPT.getCode());
- }
-
- // 2. 是。获取当前用户id,随机生成4位数
- String sourceObject = path.substring(path.indexOf("/") + 1);
- String subPath = sourceObject.substring(sourceObject.indexOf("images/") + "images/".length(), sourceObject.lastIndexOf("."));
- String gender = subPath.substring(0, subPath.indexOf("/")).equals("female") ? "Female" : "Male";
- String category = subPath.substring(subPath.indexOf("/") + 1, subPath.lastIndexOf("/"));
- CollectionLevel2TypeEnum collectionLevel2TypeEnum = CollectionLevel2TypeEnum.ofWithLoweCase(category);
- if (Objects.nonNull(collectionLevel2TypeEnum)){
- category = collectionLevel2TypeEnum.getRealName();
- } else {
- category = OUTWEAR.getRealName();
- }
- String suffix = sourceObject.substring(sourceObject.lastIndexOf(".") + 1);
- Long userId = UserContext.getUserHolder().getId();
- // 由于允许将同一张系统sketch多次添加到个人library,但是路径相对固定,所以这里添加随机数以作区分
- String name = subPath.substring(subPath.lastIndexOf("/") + 1) + "_" + RandomsUtil.generateVerifyCode(1000L, 9999L);
- String targetObject = userId + "/sketchboard/" + gender.toLowerCase() + "/" + category + "/" +
- name + "." + suffix;
-
- // 3. 复制图片到用户个人图片文件夹下
- minioUtil.copyObject(sysImage, sourceObject, users, targetObject);
-
- // 4. 存储到数据库中
- String targetPath = users + "/" + targetObject;
- String md5 = MD5Utils.encryptFile(minioUtil.getPreSignedUrl(targetPath, CommonConstant.MINIO_IMAGE_EXPIRE_TIME), false);
- Library library = new Library(userId, CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName(),
- category, gender, "Adult", name, targetPath, md5, new Date());
- saveOne(library);
-
- // 5. 更新designItemDetail中的图片路径
- if (Objects.nonNull(clothId)) {
- designItemDetailService.updateDetailPathById(clothId, targetPath);
- }
- return minioUtil.getPreSignedUrl(targetPath, CommonConstant.MINIO_IMAGE_EXPIRE_TIME);
- }
-
- /**
- * todo 低分辨率下载
- */
- public void downloadSysSketchWithWatermark() {
- }
-
-}
+package com.ai.da.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.exceptions.ExceptionUtil;
+import com.ai.da.common.config.FileProperties;
+import com.ai.da.common.config.exception.BusinessException;
+import com.ai.da.common.constant.CommonConstant;
+import com.ai.da.common.context.UserContext;
+import com.ai.da.common.enums.*;
+import com.ai.da.common.response.PageBaseResponse;
+import com.ai.da.common.response.ResultEnum;
+import com.ai.da.common.utils.*;
+import com.ai.da.mapper.primary.*;
+import com.ai.da.mapper.primary.entity.*;
+import com.ai.da.model.dto.*;
+import com.ai.da.model.enums.*;
+import com.ai.da.model.vo.*;
+import com.ai.da.python.vo.ModelPathObject;
+import com.ai.da.service.*;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONException;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileItemFactory;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+import static com.ai.da.common.enums.CollectionLevel2TypeEnum.OUTWEAR;
+
+/**
+ * 服务实现类
+ *
+ * @author yanglei
+ * @since 2022-09-30
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class LibraryServiceImpl extends ServiceImpl implements LibraryService {
+ private final AccountMapper accountMapper;
+ private final BrandRelLibraryMapper brandRelLibraryMapper;
+ private final ClassificationService classificationService;
+ private final DesignItemDetailService designItemDetailService;
+ private final EductionLibraryMapper eductionLibraryMapper;
+ private final EnterpriseLibraryMapper enterpriseLibraryMapper;
+ private final FileProperties fileProperties;
+ private final GenerateDetailMapper generateDetailMapper;
+ private final MinioUtil minioUtil;
+ private final LibraryMapper libraryMapper;
+ private final LibraryCopyMapper libraryCopyMapper;
+ private final LibraryModelPointMapper libraryModelPointMapper;
+ private final LibraryModelPointCopyMapper libraryModelPointCopyMapper;
+ private final PythonTAllInfoService pythonTAllInfoService;
+ private final SysFileMapper sysFileMapper;
+ private final SysFileExtraMapper sysFileExtraMapper;
+ private final WorkspaceMapper workspaceMapper;
+
+ @Value("${minio.bucketName.users}")
+ private String users;
+
+ @Value("${minio.bucketName.sysImage}")
+ private String sysImage;
+
+ @Value("${access.python.ip:''}")
+ private String accessPythonIp;
+ @Value("${access.python.port:''}")
+ private String accessPythonPort;
+ @Value("${access.python.address}")
+ private String fastApiPythonAddress;
+
+ private static List top = Arrays.asList(CollectionLevel2TypeEnum.DRESS.getRealName(),
+ OUTWEAR.getRealName(), CollectionLevel2TypeEnum.BLOUSE.getRealName());
+ private static List bottom = Arrays.asList(CollectionLevel2TypeEnum.SKIRT.getRealName(),
+ CollectionLevel2TypeEnum.TROUSERS.getRealName());
+
+ @Override
+ public List selectByAccountIdAnd1TypeList(Long accountId, List level1Types) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("account_id", accountId);
+ queryWrapper.in("level1_type", level1Types);
+ return CopyUtil.copyList(libraryMapper.selectList(queryWrapper), LibraryVo.class);
+ }
+
+ @Override
+ public PageBaseResponse queryLibraryPage(QueryLibraryPageServiceDTO query) {
+ AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
+ // 分页数据
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ if (!query.getLevel1Type().equals(LibraryLevel1TypeEnum.DESIGN_ELEMENTS.getRealName())) {
+ queryWrapper.eq("account_id", authPrincipalVo.getId());
+ }
+
+ if (!StringUtils.isEmpty(query.getLevel1Type())) {
+ LibraryLevel1TypeEnum level1TypeEnum = LibraryLevel1TypeEnum.uploadOf(query.getLevel1Type());
+ if (Objects.isNull(level1TypeEnum)) {
+ throw new BusinessException("unknown.parameter.level1Type");
+ }
+ queryWrapper.eq("level1_type", query.getLevel1Type());
+ }
+ if (!StringUtils.isEmpty(query.getModelSex()) && query.getLevel1Type().equals(LibraryLevel1TypeEnum.SKETCH_BOARD.getRealName())) {
+ queryWrapper.eq("level3_type", query.getModelSex());
+ }
+ if (!StringUtils.isEmpty(query.getModelSex()) && query.getLevel1Type().equals(LibraryLevel1TypeEnum.MODELS.getRealName())) {
+ queryWrapper.eq("level2_type", query.getModelSex());
+ }
+ if (!StringUtils.isEmpty(query.getLevel2Type())) {
+// CollectionLevel2TypeEnum level2TypeEnum = CollectionLevel2TypeEnum.of(query.getLevel2Type());
+// if (Objects.isNull(level2TypeEnum)) {
+// throw new BusinessException("unknown.parameter.level2Type");
+// }
+ queryWrapper.eq("level2_type", query.getLevel2Type());
+ }
+ if (!StringUtils.isEmpty(query.getType())) {
+ LibraryTopTypeEnum libraryTopTypeEnum = LibraryTopTypeEnum.uploadOf(query.getType());
+ Assert.notNull(libraryTopTypeEnum, "unknown type " + query.getType());
+ if (libraryTopTypeEnum.equals(LibraryTopTypeEnum.PRINT)) {
+ queryWrapper.eq("level1_type", LibraryLevel1TypeEnum.PRINT_BOARD.getRealName());
+ } else {
+ queryWrapper.eq("level1_type", LibraryLevel1TypeEnum.SKETCH_BOARD.getRealName());
+ if (LibraryTopTypeEnum.TOP.equals(libraryTopTypeEnum)) {
+ queryWrapper.in("level2_type", top);
+ } else {
+ queryWrapper.in("level2_type", bottom);
+ }
+ }
+ }
+ if (!StringUtils.isEmpty(query.getPictureName())) {
+ queryWrapper.like("name", query.getPictureName());
+ }
+
+ if (!StringUtils.isEmpty(query.getAgeGroup())) {
+// queryWrapper.eq("level3_type", query.getAgeGroup());
+// queryWrapper.eq("age_group", query.getAgeGroup());
+ queryWrapper.lambda().and(wrapper -> wrapper
+ .eq(Library::getLevel3Type, query.getAgeGroup())
+ .or()
+ .eq(Library::getAgeGroup, query.getAgeGroup())
+ );
+ }
+
+ if (query.getBrandId() != null) {
+ QueryWrapper qw = new QueryWrapper<>();
+ qw.lambda().eq(BrandRelLibrary::getBrandId, query.getBrandId());
+ Set collect = brandRelLibraryMapper.selectList(qw).stream().map(BrandRelLibrary::getLibraryId).collect(Collectors.toSet());
+ if (!CollectionUtils.isEmpty(collect)) {
+ queryWrapper.in("id", collect);
+ }else {
+ return PageBaseResponse.success(new Page<>());
+ }
+ }
+
+ // 新增分类过滤
+ if (CollectionUtil.isNotEmpty(query.getClassificationIdList())) {
+ List libraryIdList = new ArrayList<>();
+ if (query.getIntersection() == 0) {
+ for (Long classificationId : query.getClassificationIdList()) {
+ libraryIdList.addAll(classificationService.getLibraryIdListByClassificationId(classificationId));
+ }
+ if (CollectionUtil.isNotEmpty(libraryIdList)) {
+ queryWrapper.lambda().in(Library::getId, libraryIdList);
+ }else {
+ return PageBaseResponse.success(new Page<>());
+ }
+ }else {
+ for (int i = 0; i < query.getClassificationIdList().size(); i++) {
+ List libraryIdListByClassificationId = classificationService.getLibraryIdListByClassificationId(query.getClassificationIdList().get(i));
+ if (i == 0) {
+ libraryIdList.addAll(libraryIdListByClassificationId);
+ }else {
+ libraryIdList.retainAll(libraryIdListByClassificationId);
+ }
+ if (CollectionUtil.isEmpty(libraryIdList)) {
+ return PageBaseResponse.success(new Page<>());
+ }
+ }
+ queryWrapper.lambda().in(Library::getId, libraryIdList);
+ }
+ }
+ queryWrapper.orderByDesc("id");
+ // 1. 先查询所有符合条件的 Library 数据
+ List libraryList = getBaseMapper().selectList(queryWrapper);
+ if (CollectionUtils.isEmpty(libraryList)) {
+ return PageBaseResponse.success(new Page<>());
+ }
+
+ // 2. 封装打点内容
+ Map map = null;
+ boolean isExist = libraryList.stream()
+ .anyMatch(library -> library.getLevel1Type().equals(LibraryLevel1TypeEnum.MODELS.getRealName()));
+ if (isExist) {
+ List libraryIds = libraryList.stream()
+ .filter(library -> library.getLevel1Type().equals(LibraryLevel1TypeEnum.MODELS.getRealName()))
+ .map(Library::getId)
+ .collect(Collectors.toList());
+ List libraryModelPointVOS = selectByLibraryIds(libraryIds);
+ if (!CollectionUtils.isEmpty(libraryModelPointVOS)) {
+ map = libraryModelPointVOS.stream()
+ .collect(Collectors.toMap(LibraryModelPointVO::getRelationId, v -> v));
+ }
+ }
+ Map finalMap = map;
+
+ // 3. 转换 Library 为 QueryLibraryPageVO,并通过 minioUtil 过滤掉不存在的 URL
+ List convertedList = libraryList.stream()
+ .map(library -> {
+ QueryLibraryPageVO libraryPageVO = CopyUtil.copyObject(library, QueryLibraryPageVO.class);
+ libraryPageVO.setDesignType(DesignTypeEnum.LIBRARY.getRealName());
+ libraryPageVO.setMinIOPath(library.getUrl());
+ String url = library.getUrl();
+ if (minioUtil.doesObjectExist(url)) {
+ libraryPageVO.setUrl(minioUtil.getPreSignedUrl(url, 24 * 60));
+ if (finalMap != null && finalMap.containsKey(library.getId())) {
+ libraryPageVO.setLibraryModelPoint(finalMap.get(library.getId()));
+ }
+ if (libraryPageVO.getLevel1Type().equals(LibraryLevel1TypeEnum.SKETCH_BOARD.getRealName())) {
+ if (!StringUtils.isEmpty(libraryPageVO.getLevel2Type())) {
+ Position position = Position.getPosition(libraryPageVO.getLevel2Type());
+ libraryPageVO.setLevel2TypeEnum(new BizJson(
+ position.getValue(),
+ position.name(),
+ BusinessException.getMessageFromResource(position.name()))
+ );
+ }
+ }
+ if (libraryPageVO.getLevel1Type().equals(LibraryLevel1TypeEnum.PRINT_BOARD.getRealName())) {
+ PrintboardLevel2TypeEnum printboardLevel2TypeEnum = PrintboardLevel2TypeEnum.fromName(libraryPageVO.getLevel2Type());
+ libraryPageVO.setLevel2TypeEnum(new BizJson(
+ printboardLevel2TypeEnum.getValue(),
+ printboardLevel2TypeEnum.name(),
+ BusinessException.getMessageFromResource(printboardLevel2TypeEnum.name()))
+ );
+ }
+ if (libraryPageVO.getLevel1Type().equals(LibraryLevel1TypeEnum.DESIGN_ELEMENTS.getRealName())) {
+ DesignElementsEnum designElementsEnum = DesignElementsEnum.fromName(libraryPageVO.getLevel2Type());
+ libraryPageVO.setLevel2TypeEnum(new BizJson(
+ designElementsEnum.getValue(),
+ designElementsEnum.name(),
+ BusinessException.getMessageFromResource(designElementsEnum.name()))
+ );
+ }
+ return libraryPageVO;
+ } else {
+ // 如果对应的 MinIO 文件不存在,则返回 null,后续过滤掉
+ return null;
+ }
+ })
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+
+ // 4. 手动分页
+ int total = convertedList.size();
+ int currentPage = query.getPage(); // 当前页码(从1开始)
+ int pageSize = query.getSize(); // 每页大小
+ int fromIndex = (currentPage - 1) * pageSize;
+ int toIndex = Math.min(total, currentPage * pageSize);
+ List pageList = new ArrayList<>();
+ if (fromIndex < total) {
+ pageList = convertedList.subList(fromIndex, toIndex);
+ }
+
+ // 5. 构造 IPage 对象(使用 MyBatis-Plus 的 Page 实现)
+ IPage pageResult = new Page<>(currentPage, pageSize, total);
+ pageResult.setRecords(pageList);
+
+ // 6. 返回结果
+ return PageBaseResponse.success(pageResult);
+ }
+
+ public List selectByLibraryIds(List libraryIds) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.lambda().eq(LibraryModelPoint::getModelType, ModelType.LIBRARY.getValue());
+ queryWrapper.in("relation_id", libraryIds);
+ List libraryModelPoints = libraryModelPointMapper.selectList(queryWrapper);
+ if (CollectionUtils.isEmpty(libraryModelPoints)) {
+ return null;
+ }
+ return CopyUtil.copyList(libraryModelPoints, LibraryModelPointVO.class, (o, d) -> {
+ d.setTemplateId(o.getId());
+ d.setHandLeft(JSON.parseObject(o.getHandLeft(), List.class));
+ d.setHandRight(JSON.parseObject(o.getHandRight(), List.class));
+ d.setShoulderRight(JSON.parseObject(o.getShoulderRight(), List.class));
+ d.setShoulderLeft(JSON.parseObject(o.getShoulderLeft(), List.class));
+ d.setWaistbandRight(JSON.parseObject(o.getWaistbandRight(), List.class));
+ d.setWaistbandLeft(JSON.parseObject(o.getWaistbandLeft(), List.class));
+ });
+ }
+
+ @Override
+ public LibraryUpdateVo upload(LibraryUploadDTO libraryUploadDTO) {
+ //用户信息
+ AuthPrincipalVo userInfo = UserContext.getUserHolder();
+ LibraryLevel1TypeEnum level1TypeEnum = LibraryLevel1TypeEnum.uploadOf(libraryUploadDTO.getLevel1Type());
+ if (Objects.isNull(level1TypeEnum)) {
+ throw new BusinessException("unknown.parameter.level1Type");
+ }
+// if (!StringUtils.isEmpty(libraryUploadDTO.getLevel2Type())) {
+// CollectionLevel2TypeEnum level2TypeEnum = CollectionLevel2TypeEnum.of(libraryUploadDTO.getLevel2Type());
+// if (Objects.isNull(level2TypeEnum)) {
+// throw new BusinessException("unknown.parameter.level2Type");
+// }
+// }
+ if ((level1TypeEnum.equals(LibraryLevel1TypeEnum.SKETCH_BOARD) || level1TypeEnum.equals(LibraryLevel1TypeEnum.PRINT_BOARD) || level1TypeEnum.equals(LibraryLevel1TypeEnum.DESIGN_ELEMENTS)) && StringUtils.isEmpty(libraryUploadDTO.getLevel2Type())) {
+ throw new BusinessException("level2Type.cannot.be.empty");
+ }
+ String path = calculateFileUrl(level1TypeEnum, libraryUploadDTO.getLevel2Type(), libraryUploadDTO.getModelSex(), userInfo.getId());
+ String bucketName = null;
+ switch (level1TypeEnum) {
+ case MODELS:
+ case MOOD_BOARD:
+ case PRINT_BOARD:
+ case SKETCH_BOARD:
+ case DESIGN_ELEMENTS:
+ bucketName = users;
+ break;
+ case MARKETING_SKETCH:
+ // 走不到
+ throw new BusinessException("MARKETING_SKETCH.type.have.been.removed");
+ default:
+ throw new BusinessException("unknown.level1TypeEnum");
+ }
+ //保存element元素
+ if (!StringUtils.isEmpty(libraryUploadDTO.getModelType())) {
+ if (libraryUploadDTO.getModelType().equals(ModelType.LIBRARY.getValue())) {
+ String filePath = minioUtil.upload(bucketName, path, libraryUploadDTO.getFile());
+ String newFilePath = processMannequins(filePath);
+ Library library = resolveData(libraryUploadDTO, userInfo, newFilePath);
+ LibraryUpdateVo libraryUpdateVo = CopyUtil.copyObject(library, LibraryUpdateVo.class);
+ libraryUpdateVo.setMinIOPath(libraryUpdateVo.getUrl());
+ libraryUpdateVo.setUrl(minioUtil.getPreSignedUrl(newFilePath, 24 * 60));
+ libraryUpdateVo.setCheckMd5(Boolean.TRUE);
+ return libraryUpdateVo;
+ } else if (libraryUploadDTO.getModelType().equals(ModelType.SYSTEM.getValue())) {
+ bucketName = sysImage;
+ path = "models/" + libraryUploadDTO.getModelSex().toLowerCase();
+ String filePath = minioUtil.upload(bucketName, path, libraryUploadDTO.getFile());
+ String newFilePath = processMannequins(filePath);
+// String newFilePath = filePath;
+ Library library = resolveData(libraryUploadDTO, userInfo, newFilePath);
+ LibraryUpdateVo libraryUpdateVo = CopyUtil.copyObject(library, LibraryUpdateVo.class);
+ libraryUpdateVo.setMinIOPath(libraryUpdateVo.getUrl());
+ libraryUpdateVo.setUrl(minioUtil.getPreSignedUrl(newFilePath, 24 * 60));
+ libraryUpdateVo.setCheckMd5(Boolean.TRUE);
+ return libraryUpdateVo;
+ } else {
+ throw new BusinessException("unknown.modelType");
+ }
+ } else {
+ String filePath = minioUtil.upload(bucketName, path, libraryUploadDTO.getFile());
+ if (libraryUploadDTO.getLevel1Type().equals(LibraryLevel1TypeEnum.SKETCH_BOARD.getRealName())) {
+ processSketchBoards(filePath, libraryUploadDTO.getLevel2Type());
+ }
+ //保存element元素
+ Library library = resolveData(libraryUploadDTO, userInfo, filePath);
+ LibraryUpdateVo libraryUpdateVo = CopyUtil.copyObject(library, LibraryUpdateVo.class);
+ libraryUpdateVo.setMinIOPath(libraryUpdateVo.getUrl());
+ libraryUpdateVo.setUrl(minioUtil.getPreSignedUrl(libraryUpdateVo.getUrl(), 24 * 60));
+ libraryUpdateVo.setCheckMd5(Boolean.TRUE);
+ return libraryUpdateVo;
+ }
+ }
+
+ @Override
+ public String processMannequins(String filePath) {
+ ModelPathObject modelPathObject = new ModelPathObject();
+ modelPathObject.setModel_path(filePath);
+ OkHttpClient client = new OkHttpClient().newBuilder()
+ .connectTimeout(30, TimeUnit.SECONDS)
+ .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
+ .readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
+ .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
+ .build();
+ MediaType mediaType = MediaType.parse("application/json");
+ //关闭FastJson的引用检测 防止出现$ref 现象
+ String param = JSON.toJSONString(modelPathObject, SerializerFeature.DisableCircularReferenceDetect);
+ log.info("processMannequins请求python 参数:####{}", param);
+ RequestBody body = RequestBody.create(mediaType, param);
+ Request request = new Request.Builder()
+ .url(accessPythonIp + ":" + accessPythonPort + "/api/model_process")
+// .url(accessPythonIp + ":10200/aifda/api/v1.0/generate")
+ .method("POST", body)
+// .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
+ .addHeader("Content-Type", "application/json")
+ .build();
+ Response response = null;
+ try {
+ response = client.newCall(request).execute();
+ } catch (IOException ioException) {
+ log.error("PythonService##processMannequins异常###{}", ExceptionUtil.getThrowableList(ioException));
+ throw new BusinessException("processMannequins.interface.exception");
+ }
+ //去除限流
+// AccessLimitUtils.validateOut("design");
+ if (response.isSuccessful()) {
+ try {
+ if (Objects.isNull(response.body())) {
+ throw new BusinessException("processMannequins.interface.exception");
+ }
+ String responseBody = response.body().string();
+ JSONObject responseObject = JSON.parseObject(responseBody);
+ String newMinioPath = responseObject.getString("data");
+ return newMinioPath;
+ } catch (IOException | JSONException e) {
+ log.error(e.getMessage());
+ throw new BusinessException("processMannequins.interface.exception");
+ }
+ }
+ //生成失败
+ throw new BusinessException("processMannequins.interface.exception");
+ }
+
+ /**
+ * 去sketch白边
+ * @param filePath
+ * @param category
+ */
+ @Override
+ public void processSketchBoards(String filePath, String category) {
+ Long imageId = pythonTAllInfoService.getImageIdByPath(filePath);
+ SketchesBoundingBox sketchesBoundingBox = new SketchesBoundingBox();
+ List list = new ArrayList<>();
+ Sketches sketches = new Sketches();
+ sketches.setImage_id(String.valueOf(imageId));
+ sketches.setImage_url(filePath);
+ sketches.setImage_category(category);
+ list.add(sketches);
+ sketchesBoundingBox.setSketches(list);
+
+ OkHttpClient client = new OkHttpClient().newBuilder()
+ .connectTimeout(30, TimeUnit.SECONDS)
+ .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
+ .readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
+ .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
+ .build();
+ MediaType mediaType = MediaType.parse("application/json");
+ //关闭FastJson的引用检测 防止出现$ref 现象
+ String param = JSON.toJSONString(sketchesBoundingBox, SerializerFeature.DisableCircularReferenceDetect);
+ log.info("processSketchBoards请求python 参数:####{}", param);
+ RequestBody body = RequestBody.create(mediaType, param);
+ Request request = new Request.Builder()
+// .url(accessPythonIp + ":" + accessPythonPort + "/api/design_pre_processing")
+ .url(fastApiPythonAddress + "/api/design_pre_processing")
+ .method("POST", body)
+// .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
+ .addHeader("Content-Type", "application/json")
+ .build();
+ Response response = null;
+ try {
+ response = client.newCall(request).execute();
+ } catch (IOException ioException) {
+ log.error("PythonService##processSketchBoards异常###{}", ExceptionUtil.getThrowableList(ioException));
+ throw new BusinessException("processSketchBoards.interface.exception");
+ }
+ //去除限流
+// AccessLimitUtils.validateOut("design");
+ if (response.isSuccessful()) {
+ try {
+ if (Objects.isNull(response.body())) {
+ throw new BusinessException("processSketchBoards.interface.exception");
+ }
+ String responseBody = response.body().string();
+ JSONObject responseObject = JSON.parseObject(responseBody);
+ return;
+// String newMinioPath = responseObject.getString("data");
+// return newMinioPath;
+ } catch (IOException | JSONException e) {
+ log.error(e.getMessage());
+ throw new BusinessException("processSketchBoards.interface.exception");
+ }
+ }
+ //生成失败
+ throw new BusinessException("processSketchBoards.interface.exception");
+ }
+
+ @Override
+ public Boolean checkMd5(String level1Type, String level2Type, String sex, String md5) {
+ AuthPrincipalVo userInfo = UserContext.getUserHolder();
+ QueryWrapper qw = new QueryWrapper<>();
+ qw.lambda().eq(Library::getAccountId, userInfo.getId());
+ qw.lambda().eq(Library::getLevel1Type, level1Type);
+ if (!StringUtils.isEmpty(sex)) {
+ if (level1Type.equals(LibraryLevel1TypeEnum.SKETCH_BOARD.getRealName())) {
+ qw.lambda().eq(Library::getLevel2Type, level2Type);
+ qw.lambda().eq(Library::getLevel3Type, sex);
+ } else {
+// qw.lambda().eq(Library::getLevel2Type, sex);
+ qw.lambda().eq(Library::getLevel3Type, sex);
+ }
+ }
+ qw.lambda().eq(Library::getMd5, md5);
+ List libraryList = libraryMapper.selectList(qw);
+ if (!CollectionUtils.isEmpty(libraryList)) {
+// throw new BusinessException("Your library already contains the images you uploaded, Are you sure to upload them");
+ return Boolean.FALSE;
+ } else {
+ return Boolean.TRUE;
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void batchDeleteLibrary(LibraryDeleteDTO deleteDTO) {
+ List librarys = libraryMapper.selectBatchIds(deleteDTO.getLibraryIds());
+ if (CollectionUtils.isEmpty(librarys)) {
+ throw new BusinessException("libraryList.not.found");
+ }
+ List femaleModelIds = librarys.stream()
+ .filter(o -> o.getLevel1Type().equals(LibraryLevel1TypeEnum.MODELS.getRealName()) && o.getLevel2Type().equals(Sex.FEMALE.getValue()))
+ .map(Library::getId)
+ .collect(Collectors.toList());
+ List maleModelIds = librarys.stream()
+ .filter(o -> o.getLevel1Type().equals(LibraryLevel1TypeEnum.MODELS.getRealName()) && o.getLevel2Type().equals(Sex.MALE.getValue()))
+ .map(Library::getId)
+ .collect(Collectors.toList());
+ if (CollectionUtil.isNotEmpty(femaleModelIds)) {
+ // 检测模特是否被工作空间引用
+ checkModel(Sex.FEMALE.getValue(), femaleModelIds, deleteDTO.getDeleteModelConfirm());
+ }
+ if (CollectionUtil.isNotEmpty(maleModelIds)) {
+ checkModel(Sex.MALE.getValue(), maleModelIds, deleteDTO.getDeleteModelConfirm());
+ }
+ libraryMapper.deleteBatchIds(deleteDTO.getLibraryIds());
+
+ // 1、确定该libraryId是否被generateDetail引用
+ List generateDetails = selectBatchByLibraryId(deleteDTO.getLibraryIds());
+
+ // 2、有,则更新generateDetail表的is_like字段和library_id字段
+ if (!generateDetails.isEmpty()){
+ updateLikeStatusBatch(
+ generateDetails.stream().map(GenerateDetail::getId).collect(Collectors.toList()),
+ (byte)0,
+ 0L,
+ deleteDTO.getTimeZone()
+ );
+ }
+
+ // 判断当前libraryId是否被brand_rel_library引用
+ QueryWrapper brandRelLibraryQueryWrapper = new QueryWrapper<>();
+ brandRelLibraryQueryWrapper.lambda().in(BrandRelLibrary::getLibraryId, deleteDTO.getLibraryIds());
+
+ brandRelLibraryMapper.delete(brandRelLibraryQueryWrapper);
+// for (Library library : librarys) {
+// if (library.getUrl().startsWith(sysImage)) {
+// continue;
+// }
+// minioUtil.deleteObject(library.getUrl());
+// }
+
+ }
+
+ public List selectBatchByLibraryId(List libraryId) {
+ QueryWrapper qw = new QueryWrapper<>();
+ qw.in("library_id", libraryId);
+
+ return generateDetailMapper.selectList(qw);
+ }
+
+ public void updateLikeStatusBatch(List generateDetailIdList, Byte hasLike, Long libraryId, String timeZone) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.in("id", generateDetailIdList);
+
+ GenerateDetail generateDetail = new GenerateDetail();
+ generateDetail.setIsLike(hasLike);
+ generateDetail.setLibraryId(libraryId);
+ generateDetail.setUpdateDate(DateUtil.getByTimeZone(timeZone));
+
+ generateDetailMapper.update(generateDetail, queryWrapper);
+ }
+
+ @Override
+ public void deleteTrialData(Long userId) {
+ QueryWrapper qw = new QueryWrapper<>();
+ qw.lambda().eq(Library::getAccountId, userId);
+ libraryMapper.delete(qw);
+ }
+
+ @Override
+ public void moveLibraryDate() throws ParseException {
+ QueryWrapper qw = new QueryWrapper<>();
+ // 定义日期格式
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+ // 定义日期字符串
+ String dateString = "2023-09-01 00:00:00";
+ qw.gt("create_date", dateFormat.parse(dateString));
+ // 生产所有数据
+ List libraryList = libraryCopyMapper.selectList(qw);
+ for (LibraryCopy libraryCopy : libraryList) {
+ QueryWrapper one = new QueryWrapper<>();
+ one.lambda().eq(Library::getAccountId, libraryCopy.getAccountId());
+ one.lambda().eq(Library::getMd5, libraryCopy.getMd5());
+ List libraryList1 = libraryMapper.selectList(one);
+ if (CollectionUtil.isNotEmpty(libraryList1)) {
+ continue;
+ }
+ String url = libraryCopy.getUrl();
+ if (StringUtils.isEmpty(url)) {
+ continue;
+ }
+ if (url.contains("/download/")) {
+ String[] downloads = url.split("/download/");
+ if (downloads.length == 2) {
+ String linux = downloads[1];
+ String windows = linux.replaceAll("/", "\\\\");
+ String path = "C:\\workspace\\fileData\\file\\" + windows;
+ File file = FileUtil.getFile(path);
+ if (file != null) {
+ String name = file.getName();
+ System.out.println(name);
+ StringBuilder sb = new StringBuilder();
+ sb.append(libraryCopy.getAccountId()).append("/").append(libraryCopy.getLevel1Type().toLowerCase()).append("/");
+ if (libraryCopy.getLevel1Type().equals("Sketchboard") || libraryCopy.getLevel1Type().equals("Models")) {
+ sb.append("female/");
+ }
+ if (!StringUtils.isEmpty(libraryCopy.getLevel2Type())) {
+ sb.append(libraryCopy.getLevel2Type().toLowerCase()).append("/");
+ }
+ sb.append(name);
+ String bucketName = users;
+ boolean b = minioUtil.doesObjectExist(bucketName, sb.toString());
+ if (!b) {
+ FileItem a = getMultipartFile(file, file.getName());
+ MultipartFile multipartFile = FileUtil.fileItemToMultipartFile(a);
+ String upload = minioUtil.upload(bucketName, sb.toString(), multipartFile, "");
+ Library newInsert = CopyUtil.copyObject(libraryCopy, Library.class);
+ newInsert.setId(null);
+ if (libraryCopy.getLevel1Type().equals("Models")) {
+ newInsert.setLevel2Type("Female");
+ QueryWrapper modelCopy = new QueryWrapper<>();
+ modelCopy.lambda().eq(LibraryModelPointCopy::getLibraryId, libraryCopy.getId());
+ LibraryModelPointCopy libraryModelPointCopy = libraryModelPointCopyMapper.selectOne(modelCopy);
+ LibraryModelPoint libraryModelPoint = CopyUtil.copyObject(libraryModelPointCopy, LibraryModelPoint.class);
+ libraryModelPoint.setModelType("Library");
+
+ upload = processMannequins(upload);
+ newInsert.setUrl(upload);
+ libraryMapper.insert(newInsert);
+
+ libraryModelPoint.setRelationId(newInsert.getId());
+ libraryModelPoint.setId(null);
+// libraryModelPointService.saveOrUpdate(libraryModelPoint);
+ libraryModelPointMapper.insert(libraryModelPoint);
+ continue;
+ }
+ if (libraryCopy.getLevel1Type().equals("Sketchboard")) {
+ newInsert.setLevel3Type("Female");
+ }
+ newInsert.setUrl(upload);
+ libraryMapper.insert(newInsert);
+ }
+ }
+ }
+ }
+ }
+ }
+ private static FileItem getMultipartFile(File file, String fieldName) {
+ // 使用 DiskFileItemFactory 创建一个 FileItemFactory
+ FileItemFactory factory = new DiskFileItemFactory(16, null);
+
+ // 使用 FileItemFactory 创建一个 FileItem 对象
+ String mimeType = getMimeType(file);
+ FileItem item = factory.createItem(fieldName, mimeType, true, file.getName());
+
+ byte[] buffer = new byte[8192];
+ int bytesRead;
+
+ try (FileInputStream fis = new FileInputStream(file);
+ OutputStream os = item.getOutputStream()) {
+ // 从文件中读取数据并写入 FileItem
+ while ((bytesRead = fis.read(buffer)) != -1) {
+ os.write(buffer, 0, bytesRead);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ return item;
+ }
+
+ private static String getMimeType(File file) {
+ try {
+ return Files.probeContentType(file.toPath());
+ } catch (IOException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+
+ @Override
+ public void checkModel(String value, List modelIds, Integer deleteModelConfirm) {
+ AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
+ QueryWrapper qw = new QueryWrapper<>();
+ qw.lambda().eq(Workspace::getAccountId, authPrincipalVo.getId());
+ if (value.equals(Sex.FEMALE.getValue())) {
+ qw.lambda().in(Workspace::getMannequinFemaleId, modelIds);
+ }
+ if (value.equals(Sex.MALE.getValue())) {
+ qw.lambda().in(Workspace::getMannequinMaleId, modelIds);
+ }
+ // TODO:isDeleted设置
+ qw.lambda().eq(Workspace::getIsDeleted, 0L);
+ List workspaceList = workspaceMapper.selectList(qw);
+ if (CollectionUtil.isNotEmpty(workspaceList)) {
+ if (deleteModelConfirm.equals(0)) {
+ throw new BusinessException("the.model.has.been.referenced.by.the.workspace", ResultEnum.WARNING.getCode());
+ }
+ if (value.equals(Sex.FEMALE.getValue())) {
+ QueryWrapper systemFemaleQw = new QueryWrapper<>();
+ systemFemaleQw.lambda().eq(SysFile::getLevel1Type, "Models");
+ systemFemaleQw.lambda().eq(SysFile::getLevel2Type, "Female");
+ List sysFemaleFiles = sysFileMapper.selectList(systemFemaleQw);
+ if (!CollectionUtils.isEmpty(sysFemaleFiles)) {
+ for (Workspace workspace : workspaceList) {
+ workspace.setMannequinFemaleId(sysFemaleFiles.get(0).getId());
+ workspace.setMannequinFemaleType(MannequinType.SYSTEM.getValue());
+ workspaceMapper.updateById(workspace);
+ }
+ }
+ }
+ if (value.equals(Sex.MALE.getValue())) {
+ QueryWrapper systemMaleQw = new QueryWrapper<>();
+ systemMaleQw.lambda().eq(SysFile::getLevel1Type, "Models");
+ systemMaleQw.lambda().eq(SysFile::getLevel2Type, "Male");
+ List sysMaleFiles = sysFileMapper.selectList(systemMaleQw);
+ if (!CollectionUtils.isEmpty(sysMaleFiles)) {
+ for (Workspace workspace : workspaceList) {
+ workspace.setMannequinMaleId(sysMaleFiles.get(0).getId());
+ workspace.setMannequinMaleType(MannequinType.SYSTEM.getValue());
+ workspaceMapper.updateById(workspace);
+ }
+ }
+ }
+ }
+
+ }
+
+ private Library resolveData(LibraryUploadDTO uploadDTO, AuthPrincipalVo userInfo, String filePath) {
+ if (StringUtils.isEmpty(uploadDTO.getModelType()) || uploadDTO.getModelType().equals(ModelType.LIBRARY.getValue())) {
+ Library library = CopyUtil.copyObject(uploadDTO, Library.class);
+ library.setAccountId(userInfo.getId());
+ String originalFilename = uploadDTO.getFile().getOriginalFilename();
+ if (!StringUtils.isEmpty(originalFilename)) {
+ if (originalFilename.contains(".")) {
+ String name = originalFilename.substring(0,originalFilename.lastIndexOf("."));
+ library.setName(name);
+// library.setName(originalFilename.split("\\.")[0]);
+ }else {
+ library.setName(originalFilename);
+ }
+ }else {
+ library.setName(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+ }
+ library.setUrl(filePath);
+ //按时区计算
+ library.setCreateDate(DateUtil.getByTimeZone(uploadDTO.getTimeZone()));
+ if (uploadDTO.getModelType().equals(ModelType.LIBRARY.getValue())) {
+ library.setLevel2Type(uploadDTO.getModelSex());
+// library.setLevel3Type(uploadDTO.getAgeGroup());
+ } else {
+ library.setLevel3Type(uploadDTO.getModelSex());
+ }
+ if (uploadDTO.getLevel1Type().equals(LibraryLevel1TypeEnum.SKETCH_BOARD.getRealName())&&StringUtils.isEmpty(uploadDTO.getAgeGroup())) {
+ log.error("前端未传ageGroup");
+ library.setAgeGroup("Adult");
+ } else {
+ library.setAgeGroup(uploadDTO.getAgeGroup());
+ }
+ libraryMapper.insert(library);
+ return library;
+ } else if (uploadDTO.getModelType().equals(ModelType.SYSTEM.getValue())) {
+ SysFile sysFile = new SysFile();
+ String originalFilename = uploadDTO.getFile().getOriginalFilename();
+ if (!StringUtils.isEmpty(originalFilename)) {
+ if (originalFilename.contains(".")) {
+ String name = originalFilename.substring(0,originalFilename.lastIndexOf("."));
+ sysFile.setName(name);
+// sysFile.setName(originalFilename.split("\\.")[0]);
+ }else {
+ sysFile.setName(originalFilename);
+ }
+ }else {
+ sysFile.setName(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+ }
+ sysFile.setLevel1Type("Models");
+ sysFile.setLevel2Type(uploadDTO.getModelSex());
+ sysFile.setUrl(filePath);
+ sysFile.setMd5(uploadDTO.getMd5());
+ sysFile.setCreateDate(new Date());
+ sysFileMapper.insert(sysFile);
+
+ SysFileExtra extra = new SysFileExtra();
+ extra.setSysId(sysFile.getId());
+ extra.setAgeGroup(uploadDTO.getAgeGroup());
+ sysFileExtraMapper.insert(extra);
+
+ Library library = new Library();
+ library.setId(sysFile.getId());
+ library.setUrl(sysFile.getUrl());
+ return library;
+ } else {
+ throw new BusinessException("unknown.modelType");
+ }
+ }
+
+ private String calculateFileUrl(LibraryLevel1TypeEnum level1TypeEnum, String level2Type, String modelSex, Long userId) {
+ if (StringUtils.isEmpty(modelSex)) {
+ return StringUtils.isEmpty(level2Type) ? userId + "/" + level1TypeEnum.getRealName().toLowerCase() : userId + "/" + level1TypeEnum.getRealName().toLowerCase() + "/" + level2Type;
+ } else {
+ return StringUtils.isEmpty(level2Type) ? userId + "/" + level1TypeEnum.getRealName().toLowerCase() + "/" + modelSex.toLowerCase() : userId + "/" + level1TypeEnum.getRealName().toLowerCase() + "/" + modelSex.toLowerCase() + "/" + level2Type;
+ }
+ }
+
+ @Override
+ public void updateLibraryName(LibraryUpdateDTO libraryUpdateDTO) {
+ List librarys = getByIds(libraryUpdateDTO.getLibraryIds());
+ if (CollectionUtils.isEmpty(librarys)) {
+ throw new BusinessException("libraryList.not.found");
+ }
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.in("id", libraryUpdateDTO.getLibraryIds());
+ Library library1 = new Library();
+ library1.setName(libraryUpdateDTO.getLibraryName());
+ library1.setUpdateDate(DateUtil.getByTimeZone(libraryUpdateDTO.getTimeZone()));
+ libraryMapper.update(library1, queryWrapper);
+ }
+
+ @Override
+ public List getByIds(List ids) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.in("id", ids);
+ return libraryMapper.selectList(queryWrapper);
+ }
+
+ @Override
+ public List getByMD5List(List md5List) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.in("md5", md5List);
+ return libraryMapper.selectList(queryWrapper);
+ }
+
+ @Override
+ public List getByUrlList(List urlList, Long userId) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.in("url", urlList);
+ queryWrapper.in("account_id", userId);
+ return CopyUtil.copyList(libraryMapper.selectList(queryWrapper), LibraryVo.class);
+ }
+
+ @Override
+ public Boolean updateLibraryLevel2Type(LibraryLevel2TypeUpdateDTO libraryLevel2TypeUpdateDTO) {
+ Library library = new Library();
+ library.setLevel2Type(libraryLevel2TypeUpdateDTO.getLevel2Type());
+ QueryWrapper qw = new QueryWrapper<>();
+ qw.lambda().in(Library::getId, libraryLevel2TypeUpdateDTO.getLibraryId());
+ return libraryMapper.update(library, qw) == 1;
+ }
+
+ private Library selectById(Long id) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("id", id);
+ return libraryMapper.selectOne(queryWrapper);
+ }
+
+ private Boolean exists(Long id) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("id", id);
+ return libraryMapper.exists(queryWrapper);
+ }
+
+ private boolean saveOne(Library library) {
+ if (libraryMapper.insert(library) <= 0) {
+ throw new BusinessException("save.library.failed");
+ }
+ return Boolean.TRUE;
+ }
+
+ @Override
+ public Map addSysModelToLib(long sysModelId) {
+ Long accountId = UserContext.getUserHolder().getId();
+ SysFile sysFile = sysFileMapper.selectById(sysModelId);
+ if (Objects.isNull(sysFile)) {
+ throw new BusinessException("model.not.found", ResultEnum.PROMPT.getCode());
+ }
+ SysFileExtra sysFileExtra = sysFileExtraMapper.selectOne(new QueryWrapper().eq("sys_id", sysFile.getId()));
+
+ // 添加模特信息到library
+ Library library = CopyUtil.copyObject(sysFile, Library.class);
+ library.setId(null);
+ library.setAccountId(accountId);
+ library.setAgeGroup(sysFileExtra.getAgeGroup());
+ library.setName(DateUtil.dateToStr(new Date(), DateUtil.YYYY_MM_DD));
+ List imagesWidthAndHeight = minioUtil.getImagesWidthAndHeight(sysFile.getUrl());
+ library.setWidth(imagesWidthAndHeight.get(0));
+ library.setHigh(imagesWidthAndHeight.get(1));
+ library.setCreateDate(new Date());
+ library.setUpdateDate(null);
+ libraryMapper.insert(library);
+
+ // 添加点位信息到library
+ LibraryModelPoint sysModelPoint = getByRelationId(sysModelId, "System");
+ sysModelPoint.setId(null);
+ sysModelPoint.setModelType("Library");
+ sysModelPoint.setRelationId(library.getId());
+ sysModelPoint.setCreateDate(new Date());
+ libraryModelPointMapper.insert(sysModelPoint);
+
+ Map resp = new HashMap<>();
+ resp.put("id", library.getId().toString());
+ resp.put("url", minioUtil.getPreSignedUrl(library.getUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
+ return resp;
+ }
+
+ public LibraryModelPoint getByRelationId(Long relationId, String modelType) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.lambda().eq(LibraryModelPoint::getRelationId, relationId)
+ .eq(LibraryModelPoint::getModelType, modelType)
+ .last("limit 1");
+ List libraryModelPoints = libraryModelPointMapper.selectList(queryWrapper);
+ if (CollectionUtil.isEmpty(libraryModelPoints)) {
+ throw new BusinessException("modelPoint.not.found");
+ }
+ return libraryModelPoints.get(0);
+ }
+
+
+ public boolean saveToOrganizationLibrary(Long libraryId){
+ // 1、判断该用户是否属于某个组织
+ Long accountId = UserContext.getUserHolder().getId();
+ Account account = accountMapper.selectById(accountId);
+ if (Objects.nonNull(account.getOrganizationId())){
+ // 2、添加元素信息到对应的住址表里
+ switch(account.getSystemUser()){
+ case 5:
+ case 6:
+ EnterpriseLibrary enterpriseLibrary = enterpriseLibraryMapper.selectOne(new QueryWrapper().eq("library_id", libraryId));
+ if (Objects.nonNull(enterpriseLibrary)){
+ throw new BusinessException("element.already.exists");
+ }
+ // 存储到企业表
+ enterpriseLibrary = new EnterpriseLibrary();
+ enterpriseLibrary.setEnterpriseId(account.getOrganizationId());
+ enterpriseLibrary.setLibraryId(libraryId);
+ enterpriseLibrary.setCreateTime(LocalDateTime.now());
+ enterpriseLibraryMapper.insert(enterpriseLibrary);
+ log.info("企业用户添加元素到公共库");
+ return true;
+ case 7:
+ case 8:
+ EducationLibrary educationLibrary = eductionLibraryMapper.selectOne(new QueryWrapper().eq("library_id", libraryId));
+ if (Objects.nonNull(educationLibrary)){
+ throw new BusinessException("element.already.exists");
+ }
+ // 存储到教育表
+ educationLibrary = new EducationLibrary();
+ educationLibrary.setEducationId(account.getOrganizationId());
+ educationLibrary.setLibraryId(libraryId);
+ educationLibrary.setCreateTime(LocalDateTime.now());
+ eductionLibraryMapper.insert(educationLibrary);
+ log.info("教育版用户添加元素到公共库");
+ return true;
+ default:
+ return false;
+ }
+ }
+ return false;
+ }
+
+ // 删除公共库中的元素
+ public void deleteFromPublicLib(Long libraryId){
+ // 谁有权限删除公共库里的东西?1、元素所有者 2、管理员
+ Long accountId = UserContext.getUserHolder().getId();
+ Account account = accountMapper.selectById(accountId);
+ Library library = libraryMapper.selectById(libraryId);
+
+ if (account.getSystemUser().equals(5)
+ || account.getSystemUser().equals(7)
+ || library.getAccountId().equals(accountId)){
+ switch (account.getSystemUser()){
+ case 5:
+ case 6:
+ enterpriseLibraryMapper.delete(new QueryWrapper().eq("library_id", libraryId));
+ break;
+ case 7:
+ case 8:
+ eductionLibraryMapper.delete(new QueryWrapper().eq("library_id", libraryId));
+ break;
+ }
+ }else {
+ throw new BusinessException("have.no.permission", ResultEnum.PROMPT.getCode());
+ }
+ }
+
+
+ // 查询企业或教育的公共库
+ public PageBaseResponse getPublicLib(String order, long page, long size){
+ Long accountId = UserContext.getUserHolder().getId();
+ Account account = accountMapper.selectById(accountId);
+ if (Objects.isNull(account.getOrganizationId())){
+ throw new BusinessException("未查询到您的组织信息,无法获取公共库的元素", ResultEnum.PROMPT.getCode());
+ }
+ Long organizationId = account.getOrganizationId();
+ long offset = (page - 1) * size;
+ List libraries = libraryMapper.selectCommonLib(organizationId, order, size, offset);
+ Long count = libraryMapper.selectCommonLibCount(organizationId);
+ long pages = (long) Math.ceil(count / size);
+ return new PageBaseResponse<>(libraries, page, size, count, pages == 0 ? 1 : pages);
+ }
+
+ // 管理员查所有子账号的library
+ public PageBaseResponse getAllSubAccLib(String order, long page, long size){
+ // 1、判断当前账号是不是管理员
+ Long accountId = UserContext.getUserHolder().getId();
+ Account account = accountMapper.selectById(accountId);
+ long offset = (page - 1) * size;
+ switch(account.getSystemUser()){
+ case 5:
+ case 7:
+ if (Objects.isNull(account.getOrganizationId())){
+ throw new BusinessException("未查询到您的组织信息,无法获取元素", ResultEnum.PROMPT.getCode());
+ }
+ List libraries = libraryMapper.selectAllSubAccLib(account.getOrganizationId(), order, size, offset);
+ Long count = libraryMapper.selectAllSubAccLibCount(account.getOrganizationId());
+ long pages = (long) Math.ceil(count / size);
+ return new PageBaseResponse<>(libraries, page, size, count, pages == 0 ? 1 : pages);
+ default:
+ throw new BusinessException("have.no.permission", ResultEnum.PROMPT.getCode());
+ }
+ }
+
+ /**
+ * 将系统sketch添加到个人library
+ */
+ public String addSysSketchToLibrary(Long clothId, String path) {
+ // 1. 判断当前路径是不是系统sketch
+ if (!path.startsWith("aida-sys-image/images")) {
+ throw new BusinessException("Non-system Sketch file cannot be added to personal library.", ResultEnum.PROMPT.getCode());
+ }
+
+ // 2. 是。获取当前用户id,随机生成4位数
+ String sourceObject = path.substring(path.indexOf("/") + 1);
+ String subPath = sourceObject.substring(sourceObject.indexOf("images/") + "images/".length(), sourceObject.lastIndexOf("."));
+ String gender = subPath.substring(0, subPath.indexOf("/")).equals("female") ? "Female" : "Male";
+ String category = subPath.substring(subPath.indexOf("/") + 1, subPath.lastIndexOf("/"));
+ CollectionLevel2TypeEnum collectionLevel2TypeEnum = CollectionLevel2TypeEnum.ofWithLoweCase(category);
+ if (Objects.nonNull(collectionLevel2TypeEnum)){
+ category = collectionLevel2TypeEnum.getRealName();
+ } else {
+ category = OUTWEAR.getRealName();
+ }
+ String suffix = sourceObject.substring(sourceObject.lastIndexOf(".") + 1);
+ Long userId = UserContext.getUserHolder().getId();
+ // 由于允许将同一张系统sketch多次添加到个人library,但是路径相对固定,所以这里添加随机数以作区分
+ String name = subPath.substring(subPath.lastIndexOf("/") + 1) + "_" + RandomsUtil.generateVerifyCode(1000L, 9999L);
+ String targetObject = userId + "/sketchboard/" + gender.toLowerCase() + "/" + category + "/" +
+ name + "." + suffix;
+
+ // 3. 复制图片到用户个人图片文件夹下
+ minioUtil.copyObject(sysImage, sourceObject, users, targetObject);
+
+ // 4. 存储到数据库中
+ String targetPath = users + "/" + targetObject;
+ String md5 = MD5Utils.encryptFile(minioUtil.getPreSignedUrl(targetPath, CommonConstant.MINIO_IMAGE_EXPIRE_TIME), false);
+ Library library = new Library(userId, CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName(),
+ category, gender, "Adult", name, targetPath, md5, new Date());
+ saveOne(library);
+
+ // 5. 更新designItemDetail中的图片路径
+ if (Objects.nonNull(clothId)) {
+ designItemDetailService.updateDetailPathById(clothId, targetPath);
+ }
+ return minioUtil.getPreSignedUrl(targetPath, CommonConstant.MINIO_IMAGE_EXPIRE_TIME);
+ }
+
+ /**
+ * todo 低分辨率下载
+ */
+ public void downloadSysSketchWithWatermark() {
+ }
+
+}
diff --git a/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java
index 00465ac1..5fdce3a2 100644
--- a/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java
+++ b/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java
@@ -25,8 +25,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
diff --git a/src/main/java/com/ai/da/service/impl/PanToneServiceImpl.java b/src/main/java/com/ai/da/service/impl/PanToneServiceImpl.java
index 8b25f206..6fb108e4 100644
--- a/src/main/java/com/ai/da/service/impl/PanToneServiceImpl.java
+++ b/src/main/java/com/ai/da/service/impl/PanToneServiceImpl.java
@@ -19,7 +19,7 @@ import com.google.common.collect.Maps;
import io.netty.util.internal.StringUtil;
import org.springframework.stereotype.Service;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -30,8 +30,6 @@ public class PanToneServiceImpl extends ServiceImpl impl
@Resource
private PanToneMapper panToneMapper;
@Resource
- private PanToneService panToneService;
- @Resource
private ColorLoopUpTableService colorLoopUpTableService;
@Override
@@ -139,7 +137,7 @@ public class PanToneServiceImpl extends ServiceImpl impl
// 3. 查询 Pantone 数据
Set colorIndexes = colorIndexRgb.keySet();
- List panTones = panToneService.listByIds(colorIndexes);
+ List panTones = this.listByIds(colorIndexes);
// 4. 将 PanTone 转换为 PantoneVO,并处理缺失的 Pantone 数据
Map pantoneVOMap = new HashMap<>();
diff --git a/src/main/java/com/ai/da/service/impl/PayPalCheckoutServiceImpl.java b/src/main/java/com/ai/da/service/impl/PayPalCheckoutServiceImpl.java
index 8db5aef8..caa31202 100644
--- a/src/main/java/com/ai/da/service/impl/PayPalCheckoutServiceImpl.java
+++ b/src/main/java/com/ai/da/service/impl/PayPalCheckoutServiceImpl.java
@@ -27,15 +27,16 @@ import com.paypal.payments.CapturesRefundRequest;
import com.paypal.payments.RefundRequest;
import com.paypal.payments.RefundsGetRequest;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Lazy;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import javax.annotation.Resource;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.annotation.Resource;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
diff --git a/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java
index b39843ce..7d11ecaf 100644
--- a/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java
+++ b/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java
@@ -3,6 +3,7 @@ package com.ai.da.service.impl;
import com.ai.da.common.context.UserContext;
import com.ai.da.common.enums.PayTypeEnum;
import com.ai.da.common.response.PageBaseResponse;
+import com.ai.da.common.utils.SpringUtils;
import com.ai.da.mapper.primary.PaymentInfoMapper;
import com.ai.da.mapper.primary.entity.OrderInfo;
import com.ai.da.mapper.primary.entity.PaymentInfo;
@@ -25,12 +26,13 @@ import com.stripe.model.Subscription;
import com.stripe.model.checkout.Session;
import io.netty.util.internal.StringUtil;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Lazy;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
@@ -44,9 +46,6 @@ import java.util.Objects;
@Slf4j
public class PaymentInfoServiceImpl extends ServiceImpl implements PaymentInfoService {
- @Resource
- private StripeService stripeService;
-
@Resource
private OrderInfoService orderInfoService;
@@ -228,6 +227,7 @@ public class PaymentInfoServiceImpl extends ServiceImpl(uuid, "SR", name.substring(name.lastIndexOf("/") + 1), superResolutionDTO, "Waiting", LocalDateTime.now().format(dateTimeFormatter)));
+ SpringUtils.getBean(TaskListService.class).addToTaskListRedis(new TaskDTO<>(uuid, "SR", name.substring(name.lastIndexOf("/") + 1), superResolutionDTO, "Waiting", LocalDateTime.now().format(dateTimeFormatter)));
// 7、将消息发布到MQ消息队列
log.info("发送消息到SR_QUEUE,参数 :{}", jsonString);
diff --git a/src/main/java/com/ai/da/service/impl/SysFileServiceImpl.java b/src/main/java/com/ai/da/service/impl/SysFileServiceImpl.java
index 24e89777..73649906 100644
--- a/src/main/java/com/ai/da/service/impl/SysFileServiceImpl.java
+++ b/src/main/java/com/ai/da/service/impl/SysFileServiceImpl.java
@@ -26,7 +26,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
diff --git a/src/main/java/com/ai/da/service/impl/TCollectionElementRelationServiceImpl.java b/src/main/java/com/ai/da/service/impl/TCollectionElementRelationServiceImpl.java
index e15aac6b..d2be3e57 100644
--- a/src/main/java/com/ai/da/service/impl/TCollectionElementRelationServiceImpl.java
+++ b/src/main/java/com/ai/da/service/impl/TCollectionElementRelationServiceImpl.java
@@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
diff --git a/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java b/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java
index a7778835..b3b9e3c3 100644
--- a/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java
+++ b/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java
@@ -16,7 +16,7 @@ import io.netty.util.internal.StringUtil;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@@ -57,15 +57,15 @@ public class TDesignPythonOutfitDetailServiceImpl extends ServiceImpl) JSON.parse(detail.getPosition()));
- designPythonOutfitVO.setImageSize(StringUtil.isNullOrEmpty(detail.getImageSize()) ? null : (List) JSON.parse(detail.getImageSize()));
+ designPythonOutfitVO.setPosition(parseLongList(detail.getPosition()));
+ designPythonOutfitVO.setImageSize(parseLongList(detail.getImageSize()));
designPythonOutfitVO.setImageUrl(StringUtil.isNullOrEmpty(detail.getImageUrl()) ? null : minioUtil.getPreSignedUrl(detail.getImageUrl(), 24 * 60));
designPythonOutfitVO.setImageMinioUrl(StringUtil.isNullOrEmpty(detail.getImageUrl()) ? null : detail.getImageUrl());
designPythonOutfitVO.setMaskUrl(StringUtil.isNullOrEmpty(detail.getMaskUrl()) ? null : minioUtil.getPreSignedUrl(detail.getMaskUrl(), 24 * 60));
designPythonOutfitVO.setMaskMinioUrl(StringUtil.isNullOrEmpty(detail.getMaskUrl()) ? null : detail.getMaskUrl());
// designPythonOutfitVO.setScale(Float.parseFloat(detail.getScale()));
designPythonOutfitVO.setScale(modifyScale(detail.getScale()));
- designPythonOutfitVO.setOffset(StringUtil.isNullOrEmpty(detail.getOffset()) ? Arrays.asList(0L, 0L) : (List) JSON.parse(detail.getOffset()));
+ designPythonOutfitVO.setOffset(StringUtil.isNullOrEmpty(detail.getOffset()) ? Arrays.asList(0L, 0L) : parseLongList(detail.getOffset()));
designPythonOutfitVO.setPriority(Math.abs(detail.getPriority()));
// designPythonOutfitVO.setOffset(CollectionUtil.isEmpty(offset) ? Arrays.asList(0L, 0L) : offset);
@@ -107,6 +107,16 @@ public class TDesignPythonOutfitDetailServiceImpl extends ServiceImpl parseLongList(String raw) {
+ if (StringUtil.isNullOrEmpty(raw)) {
+ return null;
+ }
+ return JSON.parseArray(raw, Long.class);
+ }
+
@Override
public void deleteByDesignPythonOutfitIdLogical(Long designPythonOutfitId) {
UpdateWrapper updateWrapper = new UpdateWrapper<>();
diff --git a/src/main/java/com/ai/da/service/impl/TaskListServiceImpl.java b/src/main/java/com/ai/da/service/impl/TaskListServiceImpl.java
index 9ea82c21..b7131b1d 100644
--- a/src/main/java/com/ai/da/service/impl/TaskListServiceImpl.java
+++ b/src/main/java/com/ai/da/service/impl/TaskListServiceImpl.java
@@ -20,10 +20,11 @@ import io.netty.util.internal.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.lang.reflect.Type;
import java.time.format.DateTimeFormatter;
import java.util.*;
diff --git a/src/main/java/com/ai/da/service/impl/TrialOrderServiceImpl.java b/src/main/java/com/ai/da/service/impl/TrialOrderServiceImpl.java
index 0c7b8271..cacce405 100644
--- a/src/main/java/com/ai/da/service/impl/TrialOrderServiceImpl.java
+++ b/src/main/java/com/ai/da/service/impl/TrialOrderServiceImpl.java
@@ -7,6 +7,7 @@ import com.ai.da.common.response.ResultEnum;
import com.ai.da.common.utils.CopyUtil;
import com.ai.da.common.utils.RequestInfoUtil;
import com.ai.da.common.utils.SendEmailUtil;
+import com.ai.da.common.utils.SpringUtils;
import com.ai.da.mapper.primary.AccountMapper;
import com.ai.da.mapper.primary.TrialOrderMapper;
import com.ai.da.mapper.primary.entity.Account;
@@ -24,10 +25,11 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
+import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.time.*;
import java.time.temporal.ChronoUnit;
@@ -41,8 +43,6 @@ public class TrialOrderServiceImpl extends ServiceImpl implements UserLikeGroupService {
private final UserLikeGroupMapper userLikeGroupMapper;
- private final AccountService accountService;
+ private final AccountMapper accountMapper;
private final CollectionService collectionService;
private final UserLikeService userLikeService;
private final WorkspaceService workspaceService;
@@ -1963,7 +1963,7 @@ public class UserLikeGroupServiceImpl extends ServiceImpl> finalGroupDetailMap = groupDetailMap;
IPage convert = page.convert((Function) project -> {
if (project != null) {
@@ -1991,7 +1991,7 @@ public class UserLikeGroupServiceImpl extends ServiceImpl