diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..77deb923 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +sql/*.sql + diff --git a/aida.iml b/aida.iml new file mode 100644 index 00000000..36c73c24 --- /dev/null +++ b/aida.iml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..2847442d --- /dev/null +++ b/pom.xml @@ -0,0 +1,160 @@ + + + 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 + + + + 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 + + + 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 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/src/main/java/com/ai/da/AiDaApplication.java b/src/main/java/com/ai/da/AiDaApplication.java new file mode 100644 index 00000000..2933e83a --- /dev/null +++ b/src/main/java/com/ai/da/AiDaApplication.java @@ -0,0 +1,16 @@ +package com.ai.da; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@Slf4j +@SpringBootApplication +public class AiDaApplication { + + public static void main(String[] args) { + SpringApplication.run(AiDaApplication.class, args); + log.info("AiDaApplication 启动完成!"); + } + +} diff --git a/src/main/java/com/ai/da/common/annotation/Condition.java b/src/main/java/com/ai/da/common/annotation/Condition.java new file mode 100644 index 00000000..4c9e7969 --- /dev/null +++ b/src/main/java/com/ai/da/common/annotation/Condition.java @@ -0,0 +1,19 @@ +package com.ai.da.common.annotation; + +import com.ai.da.common.enums.ConditionType; + +import java.lang.annotation.*; + +/** + * @author: dangweijian + * @description: 条件注解 + * @create: 2020-01-15 17:24 + **/ +@Documented +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Condition { + ConditionType type() default ConditionType.EQ; + + boolean isNull() default false; +} diff --git a/src/main/java/com/ai/da/common/annotation/Order.java b/src/main/java/com/ai/da/common/annotation/Order.java new file mode 100644 index 00000000..cce623a8 --- /dev/null +++ b/src/main/java/com/ai/da/common/annotation/Order.java @@ -0,0 +1,18 @@ +package com.ai.da.common.annotation; + + +import com.ai.da.common.enums.OrderType; + +import java.lang.annotation.*; + +/** + * @author: dangweijian + * @description: 排序注解 + * @create: 2020-01-16 13:24 + **/ +@Documented +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Order { + OrderType order() default OrderType.DESC; +} diff --git a/src/main/java/com/ai/da/common/config/FileProperties.java b/src/main/java/com/ai/da/common/config/FileProperties.java new file mode 100644 index 00000000..fc962d22 --- /dev/null +++ b/src/main/java/com/ai/da/common/config/FileProperties.java @@ -0,0 +1,44 @@ +package com.ai.da.common.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * @author yanglei + */ +@Data +@Configuration +@ConfigurationProperties(prefix = "file") +public class FileProperties { + + private ElPath mac; + + private ElPath linux; + + private ElPath windows; + + private String linuxDomain; + + public ElPath getSys(){ + String os = System.getProperty("os.name"); + if(os.toLowerCase().startsWith("win")) { + return windows; + } else if(os.toLowerCase().startsWith("mac")){ + return mac; + } + return linux; + } + public String getLinuxDomain(){ + String os = System.getProperty("os.name"); + if((!os.toLowerCase().startsWith("win") )&& (!os.toLowerCase().startsWith("mac"))) { + return linuxDomain; + } + return null; + } + + @Data + public static class ElPath{ + private String path; + } +} diff --git a/src/main/java/com/ai/da/common/config/RsaProperties.java b/src/main/java/com/ai/da/common/config/RsaProperties.java new file mode 100644 index 00000000..13d2c067 --- /dev/null +++ b/src/main/java/com/ai/da/common/config/RsaProperties.java @@ -0,0 +1,17 @@ +package com.ai.da.common.config; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Data +@Component +public class RsaProperties { + + public static String privateKey; + + @Value("${rsa.private_key}") + public void setPrivateKey(String privateKey) { + RsaProperties.privateKey = privateKey; + } +} diff --git a/src/main/java/com/ai/da/common/config/WebConfig.java b/src/main/java/com/ai/da/common/config/WebConfig.java new file mode 100644 index 00000000..4c9942b3 --- /dev/null +++ b/src/main/java/com/ai/da/common/config/WebConfig.java @@ -0,0 +1,33 @@ +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 javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; + +@Configuration +public class WebConfig { + + @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/captcha/LoginCode.java b/src/main/java/com/ai/da/common/config/captcha/LoginCode.java new file mode 100644 index 00000000..44c92d9d --- /dev/null +++ b/src/main/java/com/ai/da/common/config/captcha/LoginCode.java @@ -0,0 +1,40 @@ +package com.ai.da.common.config.captcha; + +import lombok.Data; + +@Data +public class LoginCode { + + /** + * 验证码配置 + */ + private LoginCodeEnum codeType = LoginCodeEnum.arithmetic; + /** + * 验证码有效期 分钟 + */ + private Long expiration = 2L; + /** + * 验证码内容长度 + */ + private int length = 2; + /** + * 验证码宽度 + */ + private int width = 111; + /** + * 验证码高度 + */ + private int height = 36; + /** + * 验证码字体 + */ + private String fontName; + /** + * 字体大小 + */ + private int fontSize = 25; + + public LoginCodeEnum getCodeType() { + return codeType; + } +} diff --git a/src/main/java/com/ai/da/common/config/captcha/LoginCodeEnum.java b/src/main/java/com/ai/da/common/config/captcha/LoginCodeEnum.java new file mode 100644 index 00000000..cdfc3bbc --- /dev/null +++ b/src/main/java/com/ai/da/common/config/captcha/LoginCodeEnum.java @@ -0,0 +1,21 @@ +package com.ai.da.common.config.captcha; + +public enum LoginCodeEnum { + /** + * 算数 + */ + arithmetic, + /** + * 中文 + */ + chinese, + /** + * 中文闪图 + */ + chinese_gif, + /** + * 闪图 + */ + gif, + spec +} diff --git a/src/main/java/com/ai/da/common/config/exception/BusinessException.java b/src/main/java/com/ai/da/common/config/exception/BusinessException.java new file mode 100644 index 00000000..2737f2d2 --- /dev/null +++ b/src/main/java/com/ai/da/common/config/exception/BusinessException.java @@ -0,0 +1,28 @@ +package com.ai.da.common.config.exception; + +import com.ai.da.common.response.ResultEnum; +import lombok.Data; + +/** + * @author: dangweijian + * @description: 业务异常 + * @create: 2020-01-01 17:24 + **/ +@Data +public class BusinessException extends RuntimeException { + + private Integer code; + private String msg; + + public BusinessException(ResultEnum resultEnum){ + super(resultEnum.getMsg()); + this.code = resultEnum.getCode(); + this.msg = resultEnum.getMsg(); + } + + public BusinessException(String msg) { + super(msg); + this.code = ResultEnum.FAIL.getCode(); + this.msg = msg; + } +} diff --git a/src/main/java/com/ai/da/common/config/exception/ExceptionCatch.java b/src/main/java/com/ai/da/common/config/exception/ExceptionCatch.java new file mode 100644 index 00000000..2e68084f --- /dev/null +++ b/src/main/java/com/ai/da/common/config/exception/ExceptionCatch.java @@ -0,0 +1,85 @@ +package com.ai.da.common.config.exception; + +import com.ai.da.common.response.Response; +import com.google.common.collect.ImmutableMap; +import com.ai.da.common.response.ResultEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.BindException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @author: dangweijian + * @description: 全局异常捕获 + * @create: 2019-12-03 10:24 + **/ +@Slf4j +@ControllerAdvice +public class ExceptionCatch { + + /** + * 线程安全,且构建后不可更改 + */ + private static ImmutableMap, ResultEnum> EXCEPTIONS; + + /** + * 用于构建ImmutableMap + */ + private static ImmutableMap.Builder, ResultEnum> builder = ImmutableMap.builder(); + + @ResponseBody + @ExceptionHandler(BusinessException.class) + public Response businessExceptionCatch(BusinessException e) { + log.error("发生业务异常,code:[{}],msg:[{}]", e.getCode(), e.getMsg(), e); + return Response.error(e.getCode(), e.getMsg()); + } + + @ResponseBody + @ExceptionHandler(Exception.class) + public Response exceptionCatch(Exception e) { + log.error("发生系统异常,message:[{}]", e.getMessage(), e); + //如果ImmutableMap集合为空,构建ImmutableMap + if (EXCEPTIONS == null || EXCEPTIONS.size() == 0) { + EXCEPTIONS = builder.build(); + } + //获取不可预知异常自定义错误码 + if (EXCEPTIONS != null) { + ResultEnum resultEnum = EXCEPTIONS.get(e.getClass()); + if (resultEnum != null) { + return Response.error(resultEnum.getCode(), resultEnum.getMsg()); + } + } + return Response.error(ResultEnum.ERROR.getCode(), e.getMessage()==null?ResultEnum.ERROR.getMsg():e.getMessage()); + } + + /** + * 处理参数校验异常 + * @param e + * @return ResponseData + */ + @ResponseBody + @ExceptionHandler(BindException.class) + public Response bindExceptionHandler(BindException e) { + log.error("参数错误bind:{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage()); + return Response.fail(ResultEnum.FAIL.getCode(), e.getBindingResult().getAllErrors().get(0).getDefaultMessage()); + } + + /** + * 处理参数校验异常 + * @param e + * @return ResponseData + */ + @ResponseBody + @ExceptionHandler(MethodArgumentNotValidException.class) + public Response methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) { + log.error("参数错误bind:{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage()); + return Response.fail(ResultEnum.FAIL.getCode(), e.getBindingResult().getAllErrors().get(0).getDefaultMessage()); + } + + //初始化,不可预知异常自定义错误编码 + static { +// builder.put(FileNotFoundException.class, ResultEnum.FILE_NOT_EXIST); + } +} diff --git a/src/main/java/com/ai/da/common/config/mybatis/plus/CommonMapper.java b/src/main/java/com/ai/da/common/config/mybatis/plus/CommonMapper.java new file mode 100644 index 00000000..f39599e3 --- /dev/null +++ b/src/main/java/com/ai/da/common/config/mybatis/plus/CommonMapper.java @@ -0,0 +1,12 @@ +package com.ai.da.common.config.mybatis.plus; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; + +public interface CommonMapper extends BaseMapper { + + IPage voPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); +} diff --git a/src/main/java/com/ai/da/common/config/mybatis/plus/CommonServiceImpl.java b/src/main/java/com/ai/da/common/config/mybatis/plus/CommonServiceImpl.java new file mode 100644 index 00000000..795bd998 --- /dev/null +++ b/src/main/java/com/ai/da/common/config/mybatis/plus/CommonServiceImpl.java @@ -0,0 +1,48 @@ +package com.ai.da.common.config.mybatis.plus; + +import cn.hutool.core.collection.CollUtil; +import com.ai.da.common.response.PageResponse; +import com.ai.da.common.response.Response; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; + + +public class CommonServiceImpl, T, E> extends ServiceImpl { + + public PageResponse voPage(QueryCriteria criteria) { + IPage tPage = baseMapper.voPage(new Page<>(criteria.getPage(), criteria.getLimit()), criteria.buildWrapper()); + if (criteria.getMapper() != null && tPage != null && CollUtil.isNotEmpty(tPage.getRecords())) { + List convert = convert(tPage, criteria.getMapper(), criteria); + Response> response = Response.success(convert); + PageResponse pageResponse = new PageResponse<>(response, tPage.getCurrent(), tPage.getSize(), tPage.getTotal(), tPage.getPages()); + if (criteria.getPeekAllAfter() != null) { + Consumer> peekAllAfter = criteria.getPeekAllAfter(); + peekAllAfter.accept(pageResponse.getData()); + } + return pageResponse; + } + PageResponse pageResponse = new PageResponse<>(null, criteria.getPage(), criteria.getLimit(), 0, 0); + if (criteria.getPeekAllAfter() != null) { + Consumer> peekAllAfter = criteria.getPeekAllAfter(); + peekAllAfter.accept(pageResponse.getData()); + } + return pageResponse; + } + + List convert(IPage page, Function mapper, QueryCriteria criteria) { + if (criteria.getPeekBefore() != null && criteria.getPeekAfter() != null) { + return page.getRecords().stream().peek(criteria.getPeekBefore()).map(mapper).peek(criteria.getPeekAfter()).collect(Collectors.toList()); + } else if (criteria.getPeekBefore() != null && criteria.getPeekAfter() == null) { + return page.getRecords().stream().peek(criteria.getPeekBefore()).map(mapper).collect(Collectors.toList()); + } else if (criteria.getPeekBefore() == null && criteria.getPeekAfter() != null) { + return page.getRecords().stream().map(mapper).peek(criteria.getPeekAfter()).collect(Collectors.toList()); + } + return page.getRecords().stream().map(mapper).collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/ai/da/common/config/mybatis/plus/CustomerSqlInjector.java b/src/main/java/com/ai/da/common/config/mybatis/plus/CustomerSqlInjector.java new file mode 100644 index 00000000..cf81a83a --- /dev/null +++ b/src/main/java/com/ai/da/common/config/mybatis/plus/CustomerSqlInjector.java @@ -0,0 +1,19 @@ +package com.ai.da.common.config.mybatis.plus; + +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +@Configuration +public class CustomerSqlInjector extends DefaultSqlInjector { + + @Override + public List getMethodList(Class mapperClass, TableInfo tableInfo) { + List methodList = super.getMethodList(mapperClass, tableInfo); + methodList.add(new SelectVoPage()); + return methodList; + } +} diff --git a/src/main/java/com/ai/da/common/config/mybatis/plus/MybatisPlusConfig.java b/src/main/java/com/ai/da/common/config/mybatis/plus/MybatisPlusConfig.java new file mode 100644 index 00000000..a0bdb29a --- /dev/null +++ b/src/main/java/com/ai/da/common/config/mybatis/plus/MybatisPlusConfig.java @@ -0,0 +1,20 @@ +package com.ai.da.common.config.mybatis.plus; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@MapperScan("com.ai.da.mapper") +public class MybatisPlusConfig { + + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } +} diff --git a/src/main/java/com/ai/da/common/config/mybatis/plus/QueryCriteria.java b/src/main/java/com/ai/da/common/config/mybatis/plus/QueryCriteria.java new file mode 100644 index 00000000..3c49c405 --- /dev/null +++ b/src/main/java/com/ai/da/common/config/mybatis/plus/QueryCriteria.java @@ -0,0 +1,85 @@ +package com.ai.da.common.config.mybatis.plus; + +import cn.hutool.core.util.StrUtil; +import com.ai.da.common.annotation.Condition; +import com.ai.da.common.annotation.Order; +import com.ai.da.common.enums.ConditionType; +import com.ai.da.common.utils.ConvertUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.lang.reflect.Field; +import java.util.Collection; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; + +/** + * @author: dangweijian + * @description: + * @create: 2020-09-14 15:47 + **/ +@Data +@Slf4j +public abstract class QueryCriteria { + + private long page = 1; + private long limit = 10; + private Function mapper; + private Consumer> appendWrapper; + private Consumer peekBefore; + private Consumer peekAfter; + private Consumer> peekAllAfter; + + public QueryCriteria(Function mapper) { + this.mapper = mapper; + } + + public QueryWrapper buildWrapper(){ + QueryWrapper wrapper = new QueryWrapper<>(); + Field[] fields = this.getClass().getDeclaredFields(); + for (Field field : fields) { + Condition condition = field.getAnnotation(Condition.class); + if(condition != null){ + field.setAccessible(true); + Object value = null; + try { + value = field.get(this); + } catch (IllegalAccessException e) { + log.warn("reflection anomaly!"); + } + if(!StrUtil.isEmptyIfStr(value)){ + switch (condition.type()){ + case EQ: + wrapper.eq(ConvertUtil.humpToLine2(field.getName()), value); + break; + case LIKE: + wrapper.like(ConvertUtil.humpToLine2(field.getName()), value); + case BETWEEN: + if(value instanceof Collection && ((List) value).size() >= 2){ + wrapper.between(ConvertUtil.humpToLine2(field.getName()), ((List)value).get(0), ((List)value).get(1)); + } + default: + } + }else if(condition.isNull()){ + wrapper.isNull(ConvertUtil.humpToLine2(field.getName())); + } + } + Order order = field.getAnnotation(Order.class); + if(order != null){ + if(!StrUtil.isEmptyIfStr(order.order())){ + switch (order.order()){ + case DESC: + wrapper.orderByDesc(ConvertUtil.humpToLine2(field.getName())); + break; + case ASC: + wrapper.orderByAsc(ConvertUtil.humpToLine2(field.getName())); + } + } + } + } + wrapper.func(this.getAppendWrapper() != null, this.getAppendWrapper()); + return wrapper; + } +} diff --git a/src/main/java/com/ai/da/common/config/mybatis/plus/SelectVoPage.java b/src/main/java/com/ai/da/common/config/mybatis/plus/SelectVoPage.java new file mode 100644 index 00000000..968b0bc3 --- /dev/null +++ b/src/main/java/com/ai/da/common/config/mybatis/plus/SelectVoPage.java @@ -0,0 +1,22 @@ +package com.ai.da.common.config.mybatis.plus; + +import com.baomidou.mybatisplus.core.enums.SqlMethod; +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlSource; + +public class SelectVoPage extends AbstractMethod { + + private static final String MAPPER_METHOD = "voPage"; + + public SelectVoPage() { + super(MAPPER_METHOD); + } + + public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { + String sql = String.format(SqlMethod.SELECT_PAGE.getSql(), this.sqlFirst(), this.sqlSelectColumns(tableInfo, true), tableInfo.getTableName(), this.sqlWhereEntityWrapper(true, tableInfo), this.sqlOrderBy(tableInfo), this.sqlComment()); + SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass); + return this.addSelectMappedStatementForTable(mapperClass, MAPPER_METHOD, sqlSource, tableInfo); + } +} 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 new file mode 100644 index 00000000..87f7444d --- /dev/null +++ b/src/main/java/com/ai/da/common/config/swagger/AidaConfiguration.java @@ -0,0 +1,37 @@ +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/constant/ExceptionConstant.java b/src/main/java/com/ai/da/common/constant/ExceptionConstant.java new file mode 100644 index 00000000..021e1ab3 --- /dev/null +++ b/src/main/java/com/ai/da/common/constant/ExceptionConstant.java @@ -0,0 +1,9 @@ +package com.ai.da.common.constant; + +/** + * @author yanglei + * 异常类常量 + */ +public class ExceptionConstant { + public static final int DATA_SIZE_LIIMIT = 500; +} diff --git a/src/main/java/com/ai/da/common/constant/TokenConstant.java b/src/main/java/com/ai/da/common/constant/TokenConstant.java new file mode 100644 index 00000000..a665066f --- /dev/null +++ b/src/main/java/com/ai/da/common/constant/TokenConstant.java @@ -0,0 +1,14 @@ +package com.ai.da.common.constant; + +/** + * @author yanglei + * 异常类常量 + */ +public class TokenConstant { + /** + * 固定session + */ + public static final String FIX_SESSION = "qrLS_003af9d8c1363fc4_6c97e932665c4460a1fdbfbf47ce3490"; + + public static final String PERMISSIONS = "9672233956"; +} diff --git a/src/main/java/com/ai/da/common/context/UserContext.java b/src/main/java/com/ai/da/common/context/UserContext.java new file mode 100644 index 00000000..e273077b --- /dev/null +++ b/src/main/java/com/ai/da/common/context/UserContext.java @@ -0,0 +1,18 @@ +package com.ai.da.common.context; + +import com.ai.da.model.vo.AuthPrincipalVo; + +public class UserContext { + private static ThreadLocal userHolder= new ThreadLocal(); + + public static AuthPrincipalVo getUserHolder() { + return userHolder.get(); + } + public static void delete() { + userHolder.remove(); + } + + public static void setUserHolder(AuthPrincipalVo authPrincipalVo) { + userHolder.set(authPrincipalVo); + } +} diff --git a/src/main/java/com/ai/da/common/enums/CollectionLevel1TypeEnum.java b/src/main/java/com/ai/da/common/enums/CollectionLevel1TypeEnum.java new file mode 100644 index 00000000..65ee5737 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/CollectionLevel1TypeEnum.java @@ -0,0 +1,46 @@ +package com.ai.da.common.enums; + +import java.util.stream.Stream; + +/** + * @author yanglei + * @description collection 一级类型枚举 Moodboard Printboard Sketchboard MarketingSketch + * @create 2022-10-3 17:33 + **/ +public enum CollectionLevel1TypeEnum { + /** + * 情绪版 + */ + MOOD_BOARD("Moodboard"), + /** + * 印花版 + */ + PRINT_BOARD("Printboard"), + /** + * 手稿 + */ + SKETCH_BOARD("Sketchboard"), + /** + * 颜色板(js识别暂时存后端 不绑定collection) + */ + COLOR_BOARD("Colorboard"), + /** + * 市场 + */ + MARKETING_SKETCH("MarketingSketch"); + + private String realName; + + CollectionLevel1TypeEnum(String realName) { + this.realName = realName; + } + + public String getRealName() { + return realName; + } + + public static CollectionLevel1TypeEnum uploadOf(String realName){ + return Stream.of(CollectionLevel1TypeEnum.values()) + .filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); + } +} diff --git a/src/main/java/com/ai/da/common/enums/CollectionLevel2TypeEnum.java b/src/main/java/com/ai/da/common/enums/CollectionLevel2TypeEnum.java new file mode 100644 index 00000000..0253ac13 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/CollectionLevel2TypeEnum.java @@ -0,0 +1,45 @@ +package com.ai.da.common.enums; + +import java.util.stream.Stream; + +/** + * @author yanglei + * @description collection 二级类型 Outwear Dress Blouse Skirt Trousers(只争对Sketchboard) + * @create 2022-10-3 17:33 + **/ +public enum CollectionLevel2TypeEnum { + /** + * 外套 + */ + OUTWEAR("Outwear"), + /** + * 裙子 + */ + DRESS("Dress"), + /** + * 衬衫 + */ + BLOUSE("Blouse"), + /** + * 短裙 + */ + SKIRT("Skirt"), + /** + * 裤子 + */ + TROUSERS("Trousers"); + + private String realName; + + CollectionLevel2TypeEnum(String realName) { + this.realName = realName; + } + + public String getRealName() { + return realName; + } + + public static CollectionLevel2TypeEnum of(String realName) { + return Stream.of(CollectionLevel2TypeEnum.values()).filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null); + } +} diff --git a/src/main/java/com/ai/da/common/enums/ConditionType.java b/src/main/java/com/ai/da/common/enums/ConditionType.java new file mode 100644 index 00000000..379cc4e6 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/ConditionType.java @@ -0,0 +1,10 @@ +package com.ai.da.common.enums; + +/** + * @author: dangweijian + * @description: 分页条件类型 + * @create: 2020-01-14 17:33 + **/ +public enum ConditionType { + EQ,LIKE,BETWEEN; +} diff --git a/src/main/java/com/ai/da/common/enums/CurrentDesignPictureTypeEnum.java b/src/main/java/com/ai/da/common/enums/CurrentDesignPictureTypeEnum.java new file mode 100644 index 00000000..9353e4f9 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/CurrentDesignPictureTypeEnum.java @@ -0,0 +1,47 @@ +package com.ai.da.common.enums; + +import lombok.Getter; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author: yanglei + * @description: 当前的需要design的图片类型 计算用 + * @create: 2022-11-19 17:33 + **/ +@Getter +public enum CurrentDesignPictureTypeEnum { + /** + * PIN + */ + PIN(1,"PIN"), + /** + * USER_LIBRARY + */ + USER_LIBRARY(2,"userLibrary"), + /** + * SYS_FILE + */ + SYS_FILE(3,"sysFile"), + /** + * noPIN + */ + NO_PIN(4,"noPIN"); + + private Integer code; + private String desc; + + CurrentDesignPictureTypeEnum(Integer code, String desc) { + this.code = code; + this.desc = desc; + } + + public static CurrentDesignPictureTypeEnum of(String name){ + return Stream.of(CurrentDesignPictureTypeEnum.values()).filter(v ->v.name().equals(name)).findFirst().orElse(null); + } + public static List ofList(List codes){ + return Stream.of(CurrentDesignPictureTypeEnum.values()).filter(v ->codes.contains(v.code)).collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/ai/da/common/enums/CurrentDesignPrintPictureTypeEnum.java b/src/main/java/com/ai/da/common/enums/CurrentDesignPrintPictureTypeEnum.java new file mode 100644 index 00000000..4b64a8ad --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/CurrentDesignPrintPictureTypeEnum.java @@ -0,0 +1,39 @@ +package com.ai.da.common.enums; + +import lombok.Getter; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author: yanglei + * @description: 当前的需要design的Print图片类型 计算用 + * @create: 2022-11-19 17:33 + **/ +@Getter +public enum CurrentDesignPrintPictureTypeEnum { + /** + * 空白 + */ + NO(1,"空白"), + /** + * PIN + */ + PIN(2,"PIN"), + /** + * noPIN + */ + NO_PIN(3,"noPIN"); + + private Integer code; + private String desc; + + CurrentDesignPrintPictureTypeEnum(Integer code, String desc) { + this.code = code; + this.desc = desc; + } + public static List ofList(List codes){ + return Stream.of(CurrentDesignPrintPictureTypeEnum.values()).filter(v ->codes.contains(v.code)).collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/ai/da/common/enums/DataScope.java b/src/main/java/com/ai/da/common/enums/DataScope.java new file mode 100644 index 00000000..6a550f74 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/DataScope.java @@ -0,0 +1,21 @@ +package com.ai.da.common.enums; + +public enum DataScope { + + ALL("全部"), + DEPT("部门"); + + private String desc; + + DataScope(String desc) { + this.desc = desc; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } +} diff --git a/src/main/java/com/ai/da/common/enums/DesignTypeEnum.java b/src/main/java/com/ai/da/common/enums/DesignTypeEnum.java new file mode 100644 index 00000000..8741961d --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/DesignTypeEnum.java @@ -0,0 +1,33 @@ +package com.ai.da.common.enums; + +import java.util.stream.Stream; + +/** + * @author yanglei + * @description design类型 用户design生成时候区别library和collection + * @create 2022-11-8 17:33 + **/ +public enum DesignTypeEnum { + /** + * Collection + */ + COLLECTION("Collection"), + /** + * Library + */ + LIBRARY("Library"); + + private String realName; + + DesignTypeEnum(String realName) { + this.realName = realName; + } + + public String getRealName() { + return realName; + } + + public static DesignTypeEnum of(String realName) { + return Stream.of(DesignTypeEnum.values()).filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null); + } +} diff --git a/src/main/java/com/ai/da/common/enums/LibraryLevel1TypeEnum.java b/src/main/java/com/ai/da/common/enums/LibraryLevel1TypeEnum.java new file mode 100644 index 00000000..2fe61cd6 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/LibraryLevel1TypeEnum.java @@ -0,0 +1,46 @@ +package com.ai.da.common.enums; + +import java.util.stream.Stream; + +/** + * @author yanglei + * @description library 一级类型枚举 Moodboard Printboard Sketchboard MarketingSketch Models + * @create 2022-11-3 17:33 + **/ +public enum LibraryLevel1TypeEnum { + /** + * 情绪版 + */ + MOOD_BOARD("Moodboard"), + /** + * 印花版 + */ + PRINT_BOARD("Printboard"), + /** + * 手稿 + */ + SKETCH_BOARD("Sketchboard"), + /** + * 市场 + */ + MARKETING_SKETCH("MarketingSketch"), + /** + * 模特 + */ + MODELS("Models"); + + private String realName; + + LibraryLevel1TypeEnum(String realName) { + this.realName = realName; + } + + public String getRealName() { + return realName; + } + + public static LibraryLevel1TypeEnum uploadOf(String realName){ + return Stream.of(LibraryLevel1TypeEnum.values()) + .filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); + } +} diff --git a/src/main/java/com/ai/da/common/enums/LibraryTopTypeEnum.java b/src/main/java/com/ai/da/common/enums/LibraryTopTypeEnum.java new file mode 100644 index 00000000..20cc9747 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/LibraryTopTypeEnum.java @@ -0,0 +1,38 @@ +package com.ai.da.common.enums; + +import java.util.stream.Stream; + +/** + * @author yanglei + * @description Top枚举 基于CollectionLevel1TypeEnum 是Sketchboard的二级类型分类 + * @create 2022-10-3 17:33 + **/ +public enum LibraryTopTypeEnum { + /** + * TOP 包括 Outwear Dress Blouse + */ + TOP("Top"), + /** + * 包括 Skirt Trousers + */ + BOTTOM("Bottom"), + /** + * Print + */ + PRINT("Print"); + + private String realName; + + LibraryTopTypeEnum(String realName) { + this.realName = realName; + } + + public String getRealName() { + return realName; + } + public static LibraryTopTypeEnum uploadOf(String realName){ + return Stream.of(LibraryTopTypeEnum.values()) + .filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); + } + +} diff --git a/src/main/java/com/ai/da/common/enums/LoginTypeEnum.java b/src/main/java/com/ai/da/common/enums/LoginTypeEnum.java new file mode 100644 index 00000000..6fe72e58 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/LoginTypeEnum.java @@ -0,0 +1,23 @@ +package com.ai.da.common.enums; + +import java.util.stream.Stream; + +/** + * @author: yanglei + * @description: 账户类型枚举 邮箱 短信密码 + * @create: 2022-8-10 17:33 + **/ +public enum LoginTypeEnum { + /** + * 邮箱方式 + */ + EMAIL, + /** + * 密码方式 + */ + PASSWORD; + + public static LoginTypeEnum of(String name){ + return Stream.of(LoginTypeEnum.values()).filter(v ->v.name().equals(name)).findFirst().orElse(null); + } +} diff --git a/src/main/java/com/ai/da/common/enums/OperationTypeEnum.java b/src/main/java/com/ai/da/common/enums/OperationTypeEnum.java new file mode 100644 index 00000000..f7d02865 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/OperationTypeEnum.java @@ -0,0 +1,31 @@ +package com.ai.da.common.enums; + +import java.util.stream.Stream; + +/** + * @author: yanglei + * @description: 操作类型 登入 忘记密码 + * @create: 2022-8-10 17:33 + **/ +public enum OperationTypeEnum { + /** + *登入 + */ + LOGIN, + /** + * 异常ip + */ + EXCEPTION_IP, + /** + * 绑定邮箱 + */ + BIND_MAILBOX, + /** + * 忘记密码 + */ + FORGET_PWD; + + public static OperationTypeEnum of(String name){ + return Stream.of(OperationTypeEnum.values()).filter(v ->v.name().equals(name)).findFirst().orElse(null); + } +} diff --git a/src/main/java/com/ai/da/common/enums/OrderType.java b/src/main/java/com/ai/da/common/enums/OrderType.java new file mode 100644 index 00000000..6fd8008a --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/OrderType.java @@ -0,0 +1,10 @@ +package com.ai.da.common.enums; + +/** + * @author: dangweijian + * @description: 排序类型 + * @create: 2020-01-14 17:33 + **/ +public enum OrderType { + DESC,ASC; +} diff --git a/src/main/java/com/ai/da/common/enums/PythonToJavaApiOperationTypeEnum.java b/src/main/java/com/ai/da/common/enums/PythonToJavaApiOperationTypeEnum.java new file mode 100644 index 00000000..a3c4bb6a --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/PythonToJavaApiOperationTypeEnum.java @@ -0,0 +1,37 @@ +package com.ai.da.common.enums; + +import java.util.stream.Stream; + +/** + * @author yanglei + * @description python调用java 操作数类型 generatePrint ->生成印花 designCollection ->设计collection + * @create 2022-10-3 17:33 + **/ +public enum PythonToJavaApiOperationTypeEnum { + /** + * 生成印花 + */ + GENERATE_PRINT("generatePrint"), + /** + * 生成高级design + */ + GENERATE_ADVANCED_DESIGN("generateAdvancedDesign"), + /** + * 设计collection + */ + DESIGN_COLLECTION("designCollection"); + + private String realName; + + PythonToJavaApiOperationTypeEnum(String realName) { + this.realName = realName; + } + + public String getRealName() { + return realName; + } + + public static PythonToJavaApiOperationTypeEnum uploadOf(String realName){ + return Stream.of(PythonToJavaApiOperationTypeEnum.values()).filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); + } +} diff --git a/src/main/java/com/ai/da/common/enums/SingleOverallEnum.java b/src/main/java/com/ai/da/common/enums/SingleOverallEnum.java new file mode 100644 index 00000000..ce049216 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/SingleOverallEnum.java @@ -0,0 +1,33 @@ +package com.ai.da.common.enums; + +import java.util.stream.Stream; + +/** + * @author yanglei + * @description 控制生成类型的参数枚举:outfit时候传 single , 另外一个传 overall + * @create 2022-10-3 17:33 + **/ +public enum SingleOverallEnum { + /** + * 单个 + */ + SINGLE("single"), + /** + * 所有 + */ + OVERALL("overall"); + + private String realName; + + SingleOverallEnum(String realName) { + this.realName = realName; + } + + public String getRealName() { + return realName; + } + + public static SingleOverallEnum of(String realName){ + return Stream.of(SingleOverallEnum.values()).filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); + } +} diff --git a/src/main/java/com/ai/da/common/enums/SwitchCategoryEnum.java b/src/main/java/com/ai/da/common/enums/SwitchCategoryEnum.java new file mode 100644 index 00000000..2a90492e --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/SwitchCategoryEnum.java @@ -0,0 +1,46 @@ +package com.ai.da.common.enums; + +import java.util.stream.Stream; + +/** + * @author yanglei + * @description single模式下的类别选择参数枚举 有outwear,dress,blouse,skirt,trousers + * @create 2022-10-3 17:33 + **/ +public enum SwitchCategoryEnum { + /** + * 外套 + */ + OUTWEAR("Outwear"), + /** + * 连衣裙 + */ + DRESS("Dress"), + /** + * 衬衫 + */ + BLOUSE("Blouse"), + /** + * 短裙 + */ + SKIRT("Skirt"), + /** + * 裤子 + */ + TROUSERS("Trousers"), + ; + + private String realName; + + SwitchCategoryEnum(String realName) { + this.realName = realName; + } + + public String getRealName() { + return realName; + } + + public static SwitchCategoryEnum of(String realName){ + return Stream.of(SwitchCategoryEnum.values()).filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); + } +} diff --git a/src/main/java/com/ai/da/common/enums/SysFileLevel1TypeEnum.java b/src/main/java/com/ai/da/common/enums/SysFileLevel1TypeEnum.java new file mode 100644 index 00000000..bcc15710 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/SysFileLevel1TypeEnum.java @@ -0,0 +1,40 @@ +package com.ai.da.common.enums; + +import java.util.stream.Stream; + +/** + * @author yanglei + * @description 系统文件 一级类型枚举 Images icon accessories + * @create 2022-10-6 17:33 + **/ +public enum SysFileLevel1TypeEnum { + + IMAGES("Images","images"), + + ICON_C("Iconc","iconc"), + + ACCESSORIES("Accessories","accessories"); + + private String realName; + /** + * 上传路径名字 + */ + private String uploadPathName; + + SysFileLevel1TypeEnum(String realName, String uploadPathName) { + this.realName = realName; + this.uploadPathName = uploadPathName; + } + + public String getRealName() { + return realName; + } + + public String getUploadPathName() { + return uploadPathName; + } + + public static SysFileLevel1TypeEnum uploadOf(String uploadPathName){ + return Stream.of(SysFileLevel1TypeEnum.values()).filter(v ->v.getUploadPathName().equals(uploadPathName)).findFirst().orElse(null); + } +} diff --git a/src/main/java/com/ai/da/common/enums/SysFileLevel2TypeEnum.java b/src/main/java/com/ai/da/common/enums/SysFileLevel2TypeEnum.java new file mode 100644 index 00000000..824d6e34 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/SysFileLevel2TypeEnum.java @@ -0,0 +1,73 @@ +package com.ai.da.common.enums; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author yanglei + * @description 系统文件 二级类型枚举 bag earrings hairstyle shoes icon blouse dress outwear skirt trousers + * @create 2022-10-6 17:33 + **/ +public enum SysFileLevel2TypeEnum { + /** + * ICON + */ + ICON("Icon","icon"), + + BAG("Bag","bag"), + + EARRINGS("Earring","earring"), + + HAIRSTYLE("Hairstyle","hairstyle"), + + SHOES("Shoes","shoes"), + + BODY("Body","body"), + + BLOUSE("Blouse","blouse"), + + DRESS("Dress","dress"), + + OUTWEAR("Outwear","outwear"), + + SKIRT("Skirt","skirt"), + + TROUSERS("Trousers","trousers"); + + private String realName; + /** + * 上传路径名字 + */ + private String uploadPathName; + + SysFileLevel2TypeEnum(String realName, String uploadPathName) { + this.realName = realName; + this.uploadPathName = uploadPathName; + } + + public String getRealName() { + return realName; + } + + public String getUploadPathName() { + return uploadPathName; + } + + public static SysFileLevel2TypeEnum uploadOf(String uploadPathName){ + return Stream.of(SysFileLevel2TypeEnum.values()).filter(v ->v.getUploadPathName().equals(uploadPathName)).findFirst().orElse(null); + } + public static SysFileLevel2TypeEnum realNameOf(String realName){ + return Stream.of(SysFileLevel2TypeEnum.values()).filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); + } + + public static SysFileLevel2TypeEnum realNameOfPython(String realName){ + return Stream.of(BLOUSE,DRESS,OUTWEAR,SKIRT,TROUSERS).filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); + } + public static List ofPython(){ + return Stream.of(BLOUSE,DRESS,OUTWEAR,SKIRT,TROUSERS).map(SysFileLevel2TypeEnum::getRealName).collect(Collectors.toList()); + } + public static List ofPythonPath(){ + return Stream.of(BLOUSE,DRESS,OUTWEAR,SKIRT,TROUSERS).map(SysFileLevel2TypeEnum::getUploadPathName).collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/ai/da/common/httpdata/token/TokenApis.java b/src/main/java/com/ai/da/common/httpdata/token/TokenApis.java new file mode 100644 index 00000000..98772d94 --- /dev/null +++ b/src/main/java/com/ai/da/common/httpdata/token/TokenApis.java @@ -0,0 +1,33 @@ +package com.ai.da.common.httpdata.token; + +public enum TokenApis { + /** + * token + */ + GET_TOKEN("POST", "/api/openApi/v2/Weixin/QrCodeLoginCheck?session="), + GENERATE_USER("POST", "/api/openApi/v2/Welink/TopicGetjson"); + + private String method; + private String url; + + TokenApis(String method, String url) { + this.method = method; + this.url = url; + } + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } +} diff --git a/src/main/java/com/ai/da/common/httpdata/token/TokenQuery.java b/src/main/java/com/ai/da/common/httpdata/token/TokenQuery.java new file mode 100644 index 00000000..f712666d --- /dev/null +++ b/src/main/java/com/ai/da/common/httpdata/token/TokenQuery.java @@ -0,0 +1,41 @@ +package com.ai.da.common.httpdata.token; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +@Slf4j +public class TokenQuery { + + private static final String GET_TOKEN_DOMAIN = "https://www.szsige.com"; + private static final String GENERATE_USER_DOMAIN = "https://www.szsige.com"; + + public static JSONObject getToken(String session) { + String url = GET_TOKEN_DOMAIN + TokenApis.GET_TOKEN.getUrl()+ session; + log.info("获取用户token接口请求url:" + url); + HttpResponse httpResponse = HttpUtil.createPost(url).execute(); + log.info("获取用户token接口响应:" + httpResponse); + if(httpResponse.isOk() && StrUtil.isNotEmpty(httpResponse.body())){ + return JSONObject.parseObject(httpResponse.body()); + } + return null; + } + public static JSONObject generateUser(Map param,String token) { + HttpResponse httpResponse = HttpUtil.createPost(GENERATE_USER_DOMAIN + TokenApis.GENERATE_USER.getUrl()) + .body(JSONObject.toJSONString(param!=null?param:new HashMap<>())) + .header("Authorization", "Bearer "+token) + .header("X-Promiss", "9672233956") + .execute(); + log.info("生成用户信息接口响应:" + httpResponse); + if(httpResponse.isOk() && StrUtil.isNotEmpty(httpResponse.body())){ + return JSONObject.parseObject(httpResponse.body()); + } + return null; + } + +} diff --git a/src/main/java/com/ai/da/common/response/PageBaseResponse.java b/src/main/java/com/ai/da/common/response/PageBaseResponse.java new file mode 100644 index 00000000..2cbcedf0 --- /dev/null +++ b/src/main/java/com/ai/da/common/response/PageBaseResponse.java @@ -0,0 +1,45 @@ +package com.ai.da.common.response; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @ClassName PageResponse + * @Description 分页响应 + * @Author dwjian + * @Date 2020/1/13 0:26 + */ +@Data +@NoArgsConstructor +@ApiModel("分页响应结果") +public class PageBaseResponse{ + @ApiModelProperty("页码") + private long page; + @ApiModelProperty("每页数量") + private long size; + @ApiModelProperty("总页数") + private long pages; + @ApiModelProperty("总条数") + private long total; + @ApiModelProperty("结果集") + private List content; + + + + public PageBaseResponse(List list, long page, long size, long total, long pages) { + this.page = page; + this.size = size; + this.total = total; + this.pages = pages; + this.content = list; + } + + public static PageBaseResponse success(IPage page){ + return new PageBaseResponse<>(page.getRecords() , page.getCurrent(), page.getSize(), page.getTotal(), page.getPages()); + } +} diff --git a/src/main/java/com/ai/da/common/response/PageResponse.java b/src/main/java/com/ai/da/common/response/PageResponse.java new file mode 100644 index 00000000..00e9fc8b --- /dev/null +++ b/src/main/java/com/ai/da/common/response/PageResponse.java @@ -0,0 +1,52 @@ +package com.ai.da.common.response; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @ClassName PageResponse + * @Description 分页响应 + * @Author dwjian + * @Date 2020/1/13 0:26 + */ +@Data +@NoArgsConstructor +@ApiModel("分页响应结果") +public class PageResponse extends Response> { + @ApiModelProperty("页码") + private long page; + @ApiModelProperty("每页数量") + private long size; + @ApiModelProperty("总页数") + private long pages; + @ApiModelProperty("总条数") + private long total; + + @ApiModelProperty("结果集") + private List content; + + + + public PageResponse(Response> response, long page, long size, long total, long pages) { + if(response != null) { + this.setData(response.getData()); + this.setErrCode(response.getErrCode()); + this.setErrMsg(response.getErrMsg()); + } + this.page = page; + this.size = size; + this.total = total; + this.pages = pages; + this.content = response.getData(); + } + + public static PageResponse success(IPage page){ + Response> response = success(page.getRecords()); + return new PageResponse<>(response , page.getCurrent(), page.getSize(), page.getTotal(), page.getPages()); + } +} diff --git a/src/main/java/com/ai/da/common/response/Response.java b/src/main/java/com/ai/da/common/response/Response.java new file mode 100644 index 00000000..ad672dbe --- /dev/null +++ b/src/main/java/com/ai/da/common/response/Response.java @@ -0,0 +1,93 @@ +package com.ai.da.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * @ClassName Response + * @Description success代表响应成功 fail代表主动响应失败 error代表系统异常 + * @Author dwjian + * @Date 2019/9/8 21:48 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@ApiModel("响应结果") +public class Response implements Serializable { + + @ApiModelProperty("响应状态码 0:成功 -1:失败") + private int errCode; + @ApiModelProperty("提示消息") + private String errMsg; + @ApiModelProperty("数据结果") + private T data; + + public static Response success(){ + return success(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg(), null); + } + + public static Response success(String msg){ + return success(ResultEnum.SUCCESS.getCode(), msg, null); + } + + public static Response success(T data){ + return success(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg(), data); + } + + public static Response success(int code, T data){ + return success(code, ResultEnum.SUCCESS.getMsg(), data); + } + + public static Response success(int code, String msg, T data){ + return getResponse(code, msg, data); + } + + + + public static Response fail(String msg) { + return fail(ResultEnum.FAIL.getCode(), msg); + } + + public static Response fail(T data) { + return fail(ResultEnum.FAIL.getCode(), ResultEnum.FAIL.getMsg(), data); + } + + public static Response fail(ResultEnum resultEnum) { + return fail(resultEnum.getCode(), resultEnum.getMsg(), null); + } + + public static Response fail(int code, String msg) { + return fail(code, msg, null); + } + + public static Response fail(int code, String msg, T data) { + return getResponse(code, msg, data); + } + + public static Response error(String msg) { + return error(ResultEnum.ERROR.getCode(), msg); + } + + public static Response error(T data) { + return error(ResultEnum.ERROR.getCode(), ResultEnum.ERROR.getMsg(), data); + } + + public static Response error(int code, String msg) { + return error(code, msg, null); + } + + public static Response error(int code, String msg, T data) { + return getResponse(code, msg, data); + } + + private static Response getResponse(int code, String msg, T data){ + return new Response<>(code, msg, data); + } + + +} diff --git a/src/main/java/com/ai/da/common/response/ResultEnum.java b/src/main/java/com/ai/da/common/response/ResultEnum.java new file mode 100644 index 00000000..7aba4732 --- /dev/null +++ b/src/main/java/com/ai/da/common/response/ResultEnum.java @@ -0,0 +1,55 @@ +package com.ai.da.common.response; + +/** + * @ClassName ResultEnum + * @Description 响应结果枚举 + * @Author dwjian + * @Date 2019/9/8 21:58 + */ +public enum ResultEnum { + + SUCCESS(true, 0, "SUCCESS"), + FAIL(false, -1, "FAIL"), + ERROR(false, -1, "system error!"), + PARAMETER_ERROR(false, -2, "parameter error!"), + + NO_LOGIN(false,-100,"User not logged in"), + NO_PERMISSION(false,-200,"No access"), + ACCOUNT_LOCK(false,-300,"Account frozen"); + + private int code; + private String msg; + private boolean isOK; + + + + ResultEnum(boolean isOK, int code, String msg){ + this.isOK = isOK; + this.code = code; + this.msg = msg; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public boolean isOK() { + return isOK; + } + + public void setOK(boolean OK) { + isOK = OK; + } +} diff --git a/src/main/java/com/ai/da/common/security/UserAuthAccessDeniedHandler.java b/src/main/java/com/ai/da/common/security/UserAuthAccessDeniedHandler.java new file mode 100644 index 00000000..049e746a --- /dev/null +++ b/src/main/java/com/ai/da/common/security/UserAuthAccessDeniedHandler.java @@ -0,0 +1,27 @@ +package com.ai.da.common.security; + +import com.ai.da.common.response.Response; +import com.ai.da.common.response.ResultEnum; +import com.ai.da.common.utils.JSONResponseUtils; +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 java.io.IOException; + +/** + * @ClassName UserAuthAccessDeniedHandler + * @Description 无权限处理类 + * @Author dwjian + * @Date 2020/7/9 20:30 + */ +@Component +public class UserAuthAccessDeniedHandler implements AccessDeniedHandler { + @Override + public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AccessDeniedException exception) throws IOException { + Response response = Response.error(ResultEnum.NO_PERMISSION.getCode(), ResultEnum.NO_PERMISSION.getMsg()); + JSONResponseUtils.build(httpServletResponse, response); + } +} diff --git a/src/main/java/com/ai/da/common/security/UserAuthenticationEntryPointHandler.java b/src/main/java/com/ai/da/common/security/UserAuthenticationEntryPointHandler.java new file mode 100644 index 00000000..280d8d8c --- /dev/null +++ b/src/main/java/com/ai/da/common/security/UserAuthenticationEntryPointHandler.java @@ -0,0 +1,29 @@ +package com.ai.da.common.security; + +import com.ai.da.common.response.Response; +import com.ai.da.common.response.ResultEnum; +import com.ai.da.common.utils.JSONResponseUtils; +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 java.io.IOException; + +/** + * @ClassName UserAuthenticationEntryPointHandler + * @Description 未登录处理类 + * @Author dwjian + * @Date 2020/7/9 20:13 + */ +@Component +public class UserAuthenticationEntryPointHandler implements AuthenticationEntryPoint { + @Override + public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException { + Response response = Response.error(ResultEnum.NO_LOGIN.getCode(), ResultEnum.NO_LOGIN.getMsg()); + httpServletResponse.setStatus(401); + JSONResponseUtils.build(httpServletResponse, response); + } +} diff --git a/src/main/java/com/ai/da/common/security/UserAuthenticationManager.java b/src/main/java/com/ai/da/common/security/UserAuthenticationManager.java new file mode 100644 index 00000000..2e572c70 --- /dev/null +++ b/src/main/java/com/ai/da/common/security/UserAuthenticationManager.java @@ -0,0 +1,25 @@ +package com.ai.da.common.security; + +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * @author: dangweijian + * @description: 认证管理器 + * @create: 2020-07-10 15:58 + **/ +@Component +public class UserAuthenticationManager implements AuthenticationManager { + + @Resource + private UserAuthenticationProvider userAuthenticationProvider; + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + return userAuthenticationProvider.authenticate(authentication); + } +} diff --git a/src/main/java/com/ai/da/common/security/UserAuthenticationProvider.java b/src/main/java/com/ai/da/common/security/UserAuthenticationProvider.java new file mode 100644 index 00000000..43b56ef9 --- /dev/null +++ b/src/main/java/com/ai/da/common/security/UserAuthenticationProvider.java @@ -0,0 +1,59 @@ +package com.ai.da.common.security; + +import com.ai.da.common.config.RsaProperties; +import com.ai.da.common.utils.RsaDecryptUtils; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.stereotype.Component; + +/** + * @author: dangweijian + * @description: 登录校验处理类 + * @create: 2020-07-09 14:39 + **/ +@Component +public class UserAuthenticationProvider implements AuthenticationProvider { + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + String userName = (String) authentication.getPrincipal(); + String password = (String) authentication.getCredentials(); + try { + password = RsaDecryptUtils.decrypt(password, RsaProperties.privateKey); + } catch (Exception e) { + throw new BadCredentialsException("用户名或密码错误"); + } +// User user = userService.getByUsername(userName); +// if (user == null) { +// throw new UsernameNotFoundException("用户名或密码错误"); +// } +// //账号已冻结 +// if(user.getStatus() == 1){ +// throw new LockedException("账号已冻结"); +// } +// if(!passwordEncoder.matches(password, user.getPassword())){ +// throw new BadCredentialsException("用户名或密码错误"); +// } +// //超级管理员 +// Set authorities = new HashSet<>(); +// if(user.getIsAdmin()) { +// authorities.add(new SimpleGrantedAuthority("admin")); +// return new UsernamePasswordAuthenticationToken(user, password, authorities); +// }else { +// List userMenus = menuService.getRoleMenusByUserId(user.getId(), null); +// if(CollUtil.isNotEmpty(userMenus)){ +// authorities.addAll(userMenus.stream().map(RoleMenuDto::getPermission).filter(StringUtils::isNotEmpty).map(SimpleGrantedAuthority::new).collect(Collectors.toSet())); +// } +// return new UsernamePasswordAuthenticationToken(user, password, authorities); +// } + return null; + } + + @Override + public boolean supports(Class aClass) { + return UsernamePasswordAuthenticationToken.class.isAssignableFrom(aClass); + } +} diff --git a/src/main/java/com/ai/da/common/security/UserLoginFailureHandler.java b/src/main/java/com/ai/da/common/security/UserLoginFailureHandler.java new file mode 100644 index 00000000..a9bb7e4e --- /dev/null +++ b/src/main/java/com/ai/da/common/security/UserLoginFailureHandler.java @@ -0,0 +1,48 @@ +package com.ai.da.common.security; + +import com.ai.da.common.response.Response; +import com.ai.da.common.response.ResultEnum; +import com.ai.da.common.utils.JSONResponseUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.authentication.*; +import org.springframework.security.core.AuthenticationException; +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 java.io.IOException; + +/** + * @ClassName UserLoginFailureHandler + * @Description 登录失败处理类 + * @Author dwjian + * @Date 2020/7/9 20:17 + */ +@Slf4j +@Component +public class UserLoginFailureHandler implements AuthenticationFailureHandler { + @Override + public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException { + Response response; + if (e instanceof UsernameNotFoundException || e instanceof BadCredentialsException) { + response = Response.fail(e.getMessage()); + } else if (e instanceof LockedException) { + response = Response.fail(ResultEnum.ACCOUNT_LOCK); + } else if (e instanceof CredentialsExpiredException) { + response = Response.fail("证书过期,请联系管理员!"); + } else if (e instanceof AccountExpiredException) { + response = Response.fail("账户过期,请联系管理员!"); + } else if (e instanceof DisabledException) { + response = Response.fail("账户被禁用,请联系管理员!"); + } else if (e instanceof AuthenticationServiceException) { + response = Response.fail(e.getMessage()); + } else { + log.error("登录失败:", e); + response = Response.fail("登录失败!"); + } + JSONResponseUtils.build(httpServletResponse,response); + } +} diff --git a/src/main/java/com/ai/da/common/security/UserLoginSuccessHandler.java b/src/main/java/com/ai/da/common/security/UserLoginSuccessHandler.java new file mode 100644 index 00000000..98de9714 --- /dev/null +++ b/src/main/java/com/ai/da/common/security/UserLoginSuccessHandler.java @@ -0,0 +1,51 @@ +package com.ai.da.common.security; + +import com.ai.da.common.response.ResultEnum; +import com.ai.da.common.utils.JSONResponseUtils; +import com.ai.da.common.response.Response; +import com.ai.da.common.security.jwt.JWTTokenHelper; +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 java.io.IOException; + +/** + * @author: dangweijian + * @description: 登录成功处理类 + * @create: 2020-07-09 14:58 + **/ +@Component +public class UserLoginSuccessHandler implements AuthenticationSuccessHandler { + + @Resource + private JWTTokenHelper jwtTokenHelper; + + @Override + public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { +// User user = (User) authentication.getPrincipal(); +// AuthPrincipalVo principal = new AuthPrincipalVo(); +// BeanUtils.copyProperties(user, principal); +// // 获取用户角色 +// List userRoles = roleService.getUserRoles(user.getId(), 0); +// principal.setRoles(userRoles); +// // 获取角色部门 +// if(CollUtil.isNotEmpty(userRoles)){ +// principal.setDepts(deptService.getDeptByRoleIds(userRoles.stream().map(UserRoleDto::getRoleId).collect(Collectors.toList()))); +// } +// // 用户角色权限 +// List authorities = new ArrayList<>(authentication.getAuthorities()).stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList()); +// principal.setAuthorities(authorities); +// AuthVo authVo = new AuthVo(); +// authVo.setAuthorities(authorities); +// authVo.setToken(jwtTokenHelper.createToken(principal)); +// authVo.setPrincipal(principal); +// user.setLastLoginTime(new Date()); +// userService.updateById(user); + JSONResponseUtils.build(response, Response.success(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg(), null)); + } +} diff --git a/src/main/java/com/ai/da/common/security/UserPermissionEvaluator.java b/src/main/java/com/ai/da/common/security/UserPermissionEvaluator.java new file mode 100644 index 00000000..67dd3fdb --- /dev/null +++ b/src/main/java/com/ai/da/common/security/UserPermissionEvaluator.java @@ -0,0 +1,34 @@ +package com.ai.da.common.security; + +import org.springframework.security.access.PermissionEvaluator; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; + +import java.io.Serializable; + +/** + * @ClassName UserPermissionEvaluator + * @Description 权限校验处理器 + * @Author dwjian + * @Date 2020/7/12 10:16 + */ +@Component +public class UserPermissionEvaluator implements PermissionEvaluator { + + @Override + public boolean hasPermission(Authentication authentication, Object targetUrl, Object permission) { + System.out.println(authentication); + System.out.println(targetUrl); + System.out.println(permission); + return false; + } + + @Override + public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) { + System.out.println(authentication); + System.out.println(targetId); + System.out.println(targetType); + System.out.println(permission); + return false; + } +} 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 new file mode 100644 index 00000000..773587c9 --- /dev/null +++ b/src/main/java/com/ai/da/common/security/config/SecurityConfig.java @@ -0,0 +1,84 @@ +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; + } +} diff --git a/src/main/java/com/ai/da/common/security/config/SecurityProperties.java b/src/main/java/com/ai/da/common/security/config/SecurityProperties.java new file mode 100644 index 00000000..bb9a9a07 --- /dev/null +++ b/src/main/java/com/ai/da/common/security/config/SecurityProperties.java @@ -0,0 +1,26 @@ +package com.ai.da.common.security.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author: dangweijian + * @description: JWT配置类 + * @create: 2020-07-09 09:38 + **/ +@Data +@ConfigurationProperties(prefix = "spring.security") +public class SecurityProperties { + + private String jwtSecret; + + private String jwtTokenHeader; + + private String jwtTokenPrefix; + + private long jwtExpiration; + + private String[] ignorePaths; + + private String authApi; +} 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 new file mode 100644 index 00000000..f026d9fc --- /dev/null +++ b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java @@ -0,0 +1,122 @@ +package com.ai.da.common.security.filter; + +import cn.hutool.core.util.StrUtil; +import com.ai.da.common.context.UserContext; +import com.ai.da.common.security.config.SecurityProperties; +import com.ai.da.common.security.jwt.JWTTokenHelper; +import com.ai.da.common.utils.LocalCacheUtils; +import com.ai.da.common.utils.MultiReadHttpServletRequest; +import com.ai.da.common.utils.MultiReadHttpServletResponse; +import com.ai.da.model.vo.AuthPrincipalVo; +import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Required; +import org.springframework.context.annotation.Configuration; +import org.springframework.lang.NonNull; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.util.StopWatch; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.RequestBody; +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 java.io.IOException; +import java.sql.Statement; +import java.util.Arrays; +import java.util.List; + +/** + * @author: dangweijian + * @description: 认证拦截器 + * @create: 2020-07-10 16:50 + **/ +@Slf4j +@Configuration +public class AuthenticationFilter extends OncePerRequestFilter { + + @Resource + private JWTTokenHelper jwtTokenHelper; + @Resource + private SecurityProperties properties; + + private static final List FILTER_URL = + Arrays.asList("/favicon.ico","/doc.html","api/account/login","api/account/preLogin","api/account/sendEmail", + "/webjars/","/swagger-resources","/v2/api-docs","api/account/resetPwd", + "/api/python/saveGeneratePicture", "/api/python/getLibraryByUserId", + "/api/third/party/addUser","/api/third/party/editUser","/api/element/initDefaultSysFile"); + + @Override + protected void doFilterInternal(HttpServletRequest httpServletRequest, @NonNull HttpServletResponse httpServletResponse, @NonNull FilterChain filterChain) throws ServletException, IOException { + String requestURI = httpServletRequest.getRequestURI(); + + if(calculateUrl(requestURI)){ + StopWatch stopWatch = new StopWatch(); + HttpServletRequest wrappedRequest = httpServletRequest; + HttpServletResponse wrappedResponse = httpServletResponse; + try{ + stopWatch.start(); + if ((httpServletRequest.getContentType() == null && httpServletRequest.getContentLength() > 0) || (httpServletRequest.getContentType() != null && !httpServletRequest.getContentType().contains("application/json"))) { + extracted(wrappedRequest); + filterChain.doFilter(wrappedRequest, wrappedResponse); + }else { + wrappedRequest = new MultiReadHttpServletRequest(httpServletRequest); + wrappedResponse = new MultiReadHttpServletResponse(httpServletResponse); + extracted(wrappedRequest); + filterChain.doFilter(wrappedRequest, wrappedResponse); + } + } catch (Exception e) { + SecurityContextHolder.clearContext(); + throw e; + } finally { + stopWatch.stop(); + } + }else { + filterChain.doFilter(httpServletRequest, httpServletResponse); + } + } + private Boolean calculateUrl(String requestURI ){ + String filterUrl = FILTER_URL.stream().filter(url ->requestURI.contains(url)).findFirst().orElse(null); + return null == filterUrl ? Boolean.TRUE :Boolean.FALSE; + } + private void extracted(HttpServletRequest request) throws AuthenticationException { + String jwtToken = request.getHeader(properties.getJwtTokenHeader()); + log.debug("后台检查令牌:{}", jwtToken); + + if (StrUtil.isBlank(jwtToken)) { + throw new RuntimeException("请传入token!"); + } + // 检查token + boolean validate = jwtTokenHelper.validateToken(jwtToken); + if(validate){ + AuthPrincipalVo principal = jwtTokenHelper.parserToUser(jwtToken); + if (principal == null) { + throw new RuntimeException("TOKEN已过期,请重新登录!"); + } + //先清空当前线程变量,防止上一个线程遗留 + UserContext.delete(); + //存取用户信息到缓存 + UserContext.setUserHolder(principal); + //校验token + String cacheToken = LocalCacheUtils.getTokenCache(String.valueOf(principal.getId())); + if(jwtToken.equals("Bearer-eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiIyIiwic3ViIjoie1wiaWRcIjoyLFwidXNlcm5hbWVcIjpcImxpcnNcIn0iLCJpYXQiOjE2NjU3NDEwODcsImlzcyI6IkRXSiIsImF1dGhvcml0aWVzIjoiW10iLCJleHAiOjE2NzQzODEwODd9.ShM9R_NNFD7oo1OvxrEgg7PFeWinOuAKkuInUCMQupp66s64Hhv8tN0Wwr83nIN4rHPqtn95wmd4msWcvaFYJA")){ + //写死 暂时放行 + return; + } + if(StringUtils.isEmpty(cacheToken)){ + throw new RuntimeException("TOKEN已过期,请重新登录!"); + } + if(!cacheToken.equals(jwtToken) ){ + throw new RuntimeException("TOKEN已过期,请重新登录!"); + } +// UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(null, null); +// SecurityContextHolder.getContext().setAuthentication(authentication); + } + } +} 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 new file mode 100644 index 00000000..f55de274 --- /dev/null +++ b/src/main/java/com/ai/da/common/security/filter/UserAuthenticationProcessingFilter.java @@ -0,0 +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); + } +} 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 new file mode 100644 index 00000000..d2be0912 --- /dev/null +++ b/src/main/java/com/ai/da/common/security/jwt/JWTTokenHelper.java @@ -0,0 +1,68 @@ +package com.ai.da.common.security.jwt; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +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"; + + 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(); + } +} diff --git a/src/main/java/com/ai/da/common/utils/AccessLimitUtils.java b/src/main/java/com/ai/da/common/utils/AccessLimitUtils.java new file mode 100644 index 00000000..57f91d31 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/AccessLimitUtils.java @@ -0,0 +1,48 @@ +package com.ai.da.common.utils; + +import cn.hutool.core.exceptions.ExceptionUtil; +import com.ai.da.common.config.exception.BusinessException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.DigestUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; +import java.math.BigInteger; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * 流量访问限制工具类 + */ +@Slf4j +public class AccessLimitUtils { + + /** + * 校验是否超过指定流量限制 + * + * @param interfaceName + * @return + */ + public static void validate(String interfaceName,Integer count) { + Integer useCount= LocalCacheUtils.getAidaInterfaceCurrentLimitingCache(interfaceName); + if(useCount >count){ + //系统繁忙 + throw new BusinessException("system busy !"); + }else{ + useCount ++; + LocalCacheUtils.setAidaInterfaceCurrentLimitingCache(interfaceName,useCount); + } + } + /** + * 校验过后 接口完毕 去掉限流 + * + * @param interfaceName + * @return + */ + public static void validateOut(String interfaceName) { + Integer useCount= LocalCacheUtils.getAidaInterfaceCurrentLimitingCache(interfaceName); + useCount --; + LocalCacheUtils.setAidaInterfaceCurrentLimitingCache(interfaceName,useCount); + } + +} diff --git a/src/main/java/com/ai/da/common/utils/CloseUtil.java b/src/main/java/com/ai/da/common/utils/CloseUtil.java new file mode 100644 index 00000000..84635da4 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/CloseUtil.java @@ -0,0 +1,47 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ai.da.common.utils; + +import java.io.Closeable; + +/** + * @author Zheng Jie + * @website https://el-admin.vip + * @description 用于关闭各种连接,缺啥补啥 + * @date 2021-03-05 + **/ +public class CloseUtil { + + public static void close(Closeable closeable) { + if (null != closeable) { + try { + closeable.close(); + } catch (Exception e) { + // 静默关闭 + } + } + } + + public static void close(AutoCloseable closeable) { + if (null != closeable) { + try { + closeable.close(); + } catch (Exception e) { + // 静默关闭 + } + } + } +} diff --git a/src/main/java/com/ai/da/common/utils/ConvertUtil.java b/src/main/java/com/ai/da/common/utils/ConvertUtil.java new file mode 100644 index 00000000..5ab39a35 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/ConvertUtil.java @@ -0,0 +1,68 @@ +package com.ai.da.common.utils; + +import cn.hutool.core.util.StrUtil; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author: dangweijian + * @description: 驼峰下划线处理工具 + * @create: 2020-01-02 22:33 + **/ +public class ConvertUtil { + + private static Pattern linePattern = Pattern.compile("_(\\w)"); + + /** + * 下划线转驼峰 + */ + public static String lineToHump(String str) { + str = str.toLowerCase(); + Matcher matcher = linePattern.matcher(str); + StringBuffer sb = new StringBuffer(); + while (matcher.find()) { + matcher.appendReplacement(sb, matcher.group(1).toUpperCase()); + + } + matcher.appendTail(sb); + return sb.toString(); + + } + + /** + * 驼峰转下划线(简单写法,效率低于{@link #humpToLine2(String)}) + */ + public static String humpToLine(String str) { + return str.replaceAll("[A-Z]", "_$0").toLowerCase(); + + } + + + private static Pattern humpPattern = Pattern.compile("[A-Z]"); + + /** + * 驼峰转下划线,效率比上面高 + */ + public static String humpToLine2(String str) { + Matcher matcher = humpPattern.matcher(str); + StringBuffer sb = new StringBuffer(); + while (matcher.find()) { + matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase()); + } + matcher.appendTail(sb); + return sb.toString(); + } + + public static String lowerCaseFirstLetter(String str){ + if(StrUtil.isNotBlank(str)){ + str = str.trim(); + String result = str.substring(0, 1).toLowerCase(); + if(str.length() > 1){ + result += str.substring(1); + } + return result; + } + return null; + } +} diff --git a/src/main/java/com/ai/da/common/utils/CopyUtil.java b/src/main/java/com/ai/da/common/utils/CopyUtil.java new file mode 100644 index 00000000..84207c2e --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/CopyUtil.java @@ -0,0 +1,127 @@ +package com.ai.da.common.utils; + +import org.apache.logging.log4j.util.BiConsumer; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.BeansException; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CopyUtil { + + public static T copyObject(Object source, Class tClass) throws BeansException { + return entityToModel(source, tClass); + } + + public static List copyList(List source, Class tClass) { + if (source == null || source.isEmpty()) { + return new ArrayList<>(); + } + List tList = new ArrayList<>(); + for (F f : source) { + T t = entityToModel(f, tClass); + tList.add(t); + } + return tList; + } + + public static List copyList(List source, Class tClass, BiConsumer consumer) { + if (source == null || source.isEmpty()) { + return new ArrayList<>(); + } + List tList = new ArrayList<>(); + for (F f : source) { + T t = entityToModel(f, tClass); + consumer.accept(f, t); + tList.add(t); + } + return tList; + } + + public static List copyListToString(List source, String fieldName) { + + List list = new ArrayList<>(); + if (null == source || source.isEmpty()) { + return list; + } + + for (int i = 0; i < source.size(); i++) { + try { + Class c = source.get(i).getClass(); + if (null != c) { + Method methodGetKey = c.getMethod(fieldName); + String key = "" + methodGetKey.invoke(source.get(i)); + list.add(key); + } + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + return list; + } + + /** + * 复制对象 + * + * @param entity + * @param modelClass + * @param + * @param + * @return + */ + private static T entityToModel(F entity, Class modelClass) { + Object model = null; + if (entity == null || modelClass == null) { + return null; + } + try { + model = modelClass.newInstance(); + } catch (Exception e) { + //忽略 + } + BeanUtils.copyProperties(entity, model); + return (T) model; + } + + public static Map listToMap(List list, Class c) { + List vList = CopyUtil.copyList(list, c); + return list2Map(vList, c); + } + + public static Map listToMap(List list, Class c, String fieldName) { + List vList = CopyUtil.copyList(list, c); + return list2Map(vList, c, fieldName); + } + + public static Map list2Map(List list, Class c) { + return list2Map(list, c, "getId"); + } + + + public static Map list2Map(List list, Class c, String fieldName) { + Map map = new HashMap<>(); + if (list != null) { + try { + Method methodGetKey = c.getMethod(fieldName); + for (int i = 0; i < list.size(); i++) { + V value = list.get(i); + @SuppressWarnings("unchecked") + K key = (K) methodGetKey.invoke(list.get(i)); + map.put(key, value); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return map; + } + +} diff --git a/src/main/java/com/ai/da/common/utils/DateUtil.java b/src/main/java/com/ai/da/common/utils/DateUtil.java new file mode 100644 index 00000000..c491d2c9 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/DateUtil.java @@ -0,0 +1,65 @@ +package com.ai.da.common.utils; + +import lombok.extern.slf4j.Slf4j; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Calendar; +import java.util.Date; +import java.util.TimeZone; +@Slf4j +public class DateUtil { + public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + public static final String YYYYMM = "yyyyMM"; + public static final String YYYY_MM_DD = "yyyyMMdd"; + /** + * LocalDate -> Date + */ + public static Date asDate(LocalDate localDate) { + return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); + } + + /** + * LocalDateTime -> Date + */ + public static Date asDate(LocalDateTime localDateTime) { + return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); + } + /** + * date 装 String + * @param date + * @param formatter + * @return + */ + public static String dateToStr(Date date, String formatter) { + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatter); + Instant instant = date.toInstant(); + ZoneId zoneId = ZoneId.systemDefault(); + LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zoneId); + return dateTimeFormatter.format(localDateTime); + } + /** + * 根据时区获取时间 + * @param timeZone "Asia/Tokyo" + * @return + */ + public static Date getByTimeZone(String timeZone) { + String dateStr = dateToStr(new Date(),YYYY_MM_DD_HH_MM_SS); + SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS); + // 设置时区 + sdf.setTimeZone(TimeZone.getTimeZone(timeZone)); + Date date = null; + try{ + date = sdf.parse(dateStr); + }catch (ParseException parseException){ + log.error("时间转换异常!",parseException); + } + return date; + } + +} diff --git a/src/main/java/com/ai/da/common/utils/FileUtil.java b/src/main/java/com/ai/da/common/utils/FileUtil.java new file mode 100644 index 00000000..3b4b3a09 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/FileUtil.java @@ -0,0 +1,272 @@ +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.apache.tomcat.util.http.fileupload.FileUtils; +import org.apache.tomcat.util.http.fileupload.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.FileSystemUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.*; +import java.net.URL; +import java.security.MessageDigest; +import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +//import org.apache.poi.util.IOUtils; +//import org.apache.poi.xssf.streaming.SXSSFSheet; + +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 is 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 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; + } + + +} diff --git a/src/main/java/com/ai/da/common/utils/ImageUtil.java b/src/main/java/com/ai/da/common/utils/ImageUtil.java new file mode 100644 index 00000000..5cc737c4 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/ImageUtil.java @@ -0,0 +1,47 @@ +package com.ai.da.common.utils; + +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +/** + * 图片工具类 + */ +@Slf4j +public class ImageUtil { + static BufferedImage bufferedImage; + static int r,g,b; // 分别用来存放获取的RGB值 + static int heigth,width; + static int id = 0; + public static void find(){ + // 读取要操作的图片,这里的图片路径请改成自己要处理的图片 + try { + bufferedImage = ImageIO.read(new File("D:\\programManager\\private\\curtain\\curtain\\WechatIMG170.png")); + } catch (IOException e) { + e.printStackTrace(); + } + // 获取图片的宽和高; + heigth = bufferedImage.getHeight(); + width = bufferedImage.getHeight(); + System.out.println("heigth = "+heigth +", width ="+width); + // 采用行优先遍历,先遍历宽 + for (int y = 0; y < heigth; y++) { + for (int x = 0; x < width; x++) { + id++; + Color color = new Color(bufferedImage.getRGB(x,y)); + r = color.getRed(); + g = color.getGreen(); + b = color.getBlue(); + System.out.println("此时的id为: "+ id+ " R = "+ r + ", G = "+g+", B ="+b); + } + } + } + + public static void main(String[] args) { + find(); + } +} diff --git a/src/main/java/com/ai/da/common/utils/JSONResponseUtils.java b/src/main/java/com/ai/da/common/utils/JSONResponseUtils.java new file mode 100644 index 00000000..8caa3e5d --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/JSONResponseUtils.java @@ -0,0 +1,42 @@ +package com.ai.da.common.utils; + +import com.alibaba.fastjson.JSON; +import com.ai.da.common.response.Response; +import lombok.extern.slf4j.Slf4j; + +import javax.servlet.ServletResponse; +import java.io.PrintWriter; + + +/** + * @author: dangweijian + * @description: 构造JSON响应工具类 + * @Author dwjian + * @Date 2020/7/10 15:51 + **/ +@Slf4j +public class JSONResponseUtils { + + /** + * 使用response输出JSON + * + * @param servletResponse + * @param response + */ + public static void build(ServletResponse servletResponse, Response response) { + PrintWriter out = null; + try { + servletResponse.setCharacterEncoding("UTF-8"); + servletResponse.setContentType("application/json"); + out = servletResponse.getWriter(); + out.println(JSON.toJSONString(response)); + } catch (Exception e) { + log.error(e + "输出JSON出错"); + } finally { + if (out != null) { + out.flush(); + out.close(); + } + } + } +} diff --git a/src/main/java/com/ai/da/common/utils/LocalCacheUtils.java b/src/main/java/com/ai/da/common/utils/LocalCacheUtils.java new file mode 100644 index 00000000..08b88158 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/LocalCacheUtils.java @@ -0,0 +1,406 @@ +package com.ai.da.common.utils; + +import com.ai.da.mapper.entity.Collection; +import com.ai.da.mapper.entity.SysFile; +import com.ai.da.model.vo.SysFileVO; +import com.google.common.cache.*; +import com.google.common.collect.Lists; +import io.swagger.models.auth.In; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; + +/** + * @author: yanglei + * @description: 本地缓存工具 + * @create: 2022-08-11 9:23 + **/ +@Slf4j +public final class LocalCacheUtils { + /** + * token + */ + private static LoadingCache tokenCache = loadTokenCache(); + /** + * + *缓存接口这里是LoadingCache,LoadingCache在缓存项不存在时可以自动加载缓存 + */ + private static LoadingCache loadTokenCache(){ + LoadingCache tokenCache = CacheBuilder.newBuilder() + .concurrencyLevel(10) + .expireAfterWrite(24*100, TimeUnit.HOURS) + .initialCapacity(100) + .maximumSize(10000) + .recordStats() + .build(new CacheLoader() { + @Override + public String load(String key) throws Exception { + return "null"; + } + }); + return tokenCache; + } + /** + * 邮箱,短信验证码 + */ + private static LoadingCache emailCache = CacheBuilder.newBuilder() + //设置并发级别为5,并发级别是指可以同时写缓存的线程数 + .concurrencyLevel(10) + //设置写缓存后3分钟过期 + .expireAfterWrite(60*3, TimeUnit.SECONDS) + //刷新机制 每隔一定时间刷新缓存loader 只有调用get具体的操作才生效(懒加载) 不设置则不刷新 +// .refreshAfterWrite(60, TimeUnit.SECONDS) + //设置缓存容器的初始容量为100 + .initialCapacity(100) + //设置缓存最大容量10000,超过100之后就会按照LRU最近虽少使用算法来移除缓存项 + .maximumSize(10000) + //设置要统计缓存的命中率 + .recordStats() + //build方法中可以指定CacheLoader,在缓存不存在时通过CacheLoader的实现自动加载缓存 + .build(new CacheLoader() { + @Override + public String load(String key) throws Exception { + return "null"; + } + }); + + /** + * 系统文件 最大最小值 + */ + private static LoadingCache sysFileMaxAndMinCache = CacheBuilder.newBuilder() + //设置并发级别为5,并发级别是指可以同时写缓存的线程数 + .concurrencyLevel(10) + //设置写缓存后一天过期 + .expireAfterWrite(60*60*24, TimeUnit.SECONDS) + //设置缓存容器的初始容量为100 + .initialCapacity(100) + //设置缓存最大容量50000,超过50000之后就会按照LRU最近虽少使用算法来移除缓存项 + .maximumSize(500) + //设置要统计缓存的命中率 + .recordStats() + //build方法中可以指定CacheLoader,在缓存不存在时通过CacheLoader的实现自动加载缓存 + .build(new CacheLoader() { + @Override + public Long load(String key) throws Exception { + return 0L; + } + }); + /** + * 系统文件本地缓存 id -> path + */ + private static LoadingCache sysFileCache = CacheBuilder.newBuilder() + //设置并发级别为5,并发级别是指可以同时写缓存的线程数 + .concurrencyLevel(10) + //设置写缓存后一天过期 + .expireAfterWrite(60*60*24, TimeUnit.SECONDS) + //设置缓存容器的初始容量为100 + .initialCapacity(100) + //设置缓存最大容量50000,超过50000之后就会按照LRU最近虽少使用算法来移除缓存项 + .maximumSize(50000) + //设置要统计缓存的命中率 + .recordStats() + //build方法中可以指定CacheLoader,在缓存不存在时通过CacheLoader的实现自动加载缓存 + .build(new CacheLoader() { + @Override + public SysFileVO load(Long key) throws Exception { + return new SysFileVO(); + } + }); + + /** + * 系统文件本地缓存 level1-> sysFile 数组 + */ + private static LoadingCache> sysFileLevelType1Cache = CacheBuilder.newBuilder() + //设置并发级别为5,并发级别是指可以同时写缓存的线程数 + .concurrencyLevel(10) + //设置写缓存后一天过期 + .expireAfterWrite(60*60*24, TimeUnit.SECONDS) + //设置缓存容器的初始容量为15000 + .initialCapacity(15000) + //设置缓存最大容量50000,超过50000之后就会按照LRU最近虽少使用算法来移除缓存项 + .maximumSize(50000) + //设置要统计缓存的命中率 + .recordStats() + //build方法中可以指定CacheLoader,在缓存不存在时通过CacheLoader的实现自动加载缓存 + .build(new CacheLoader>() { + @Override + public List load(String key) throws Exception { + return new ArrayList(); + } + }); + + /** + * design文件进度统计 + */ + private static LoadingCache> designProcessCache = CacheBuilder.newBuilder() + //设置并发级别为10,并发级别是指可以同时写缓存的线程数 + .concurrencyLevel(10) + //设置写缓存后5分钟过期 + .expireAfterWrite(60*5, TimeUnit.SECONDS) + //设置缓存容器的初始容量为100 + .initialCapacity(5) + //设置缓存最大容量50000,超过50000之后就会按照LRU最近虽少使用算法来移除缓存项 + .maximumSize(100) + //设置要统计缓存的命中率 + .recordStats() + //build方法中可以指定CacheLoader,在缓存不存在时通过CacheLoader的实现自动加载缓存 + .build(new CacheLoader>() { + @Override + public List load(Long key) throws Exception { + return Collections.EMPTY_LIST; + } + }); + + /** + * aida 接口限流(先粗暴做) + */ + private static LoadingCache aidaInterfaceCurrentLimiting = CacheBuilder.newBuilder() + //设置并发级别为5,并发级别是指可以同时写缓存的线程数 + .concurrencyLevel(20) + //设置写缓存后30天过期 + .expireAfterWrite(60*60*24*30, TimeUnit.SECONDS) + //设置缓存容器的初始容量为100 + .initialCapacity(5) + //设置缓存最大容量50000,超过50000之后就会按照LRU最近虽少使用算法来移除缓存项 + .maximumSize(20) + //设置要统计缓存的命中率 + .recordStats() + //build方法中可以指定CacheLoader,在缓存不存在时通过CacheLoader的实现自动加载缓存 + .build(new CacheLoader() { + @Override + public Integer load(String key) throws Exception { + return 0; + } + }); + /** + * 添加token本地缓存 + * @param key + * @param value + */ + public static void setTokenCache(String key, String value) { + tokenCache.put(key, value); + } + + /** + * 获取token本地缓存 + * @param key + * @return + */ + public static String getTokenCache(String key) { + try { + String value = tokenCache.get(key); + if ("null".equals(value)) { + return null; + } + return value; + } catch (ExecutionException e) { + log.error("getTokenCache方法错误", e); + } + return null; + } + /** + * 删除token本地缓存(登出) + * @param key + * @return + */ + public static void delTokenCache(String key) { + try { + tokenCache.invalidate(key); + } catch (Exception e) { + log.error("delTokenCache方法错误", e); + } + } + /** + * 添加验证码本地缓存 + * @param key + * @param value + */ + public static void setVerifyCodeCache(String key, String value) { + emailCache.put(key, value); + } + + /** + * 获取验证码本地缓存 + * @param key + * @return + */ + public static String getVerifyCodeCache(String key) { + try { + String value = emailCache.get(key); + if ("null".equals(value)) { + return null; + } + return value; + } catch (ExecutionException e) { + log.error("getVerifyCodeCache方法错误", e); + } + return null; + } + /** + * 添加系统文本地缓存 + * @param key + * @param sysFile + */ + public static void setSysFileCache(Long key, SysFileVO sysFile) { + sysFileCache.put(key, sysFile); + } + + /** + * 获取系统文件本地缓存 + * @param key + * @return + */ + public static SysFileVO getSysFileCache(Long key) { + try { + SysFileVO value = sysFileCache.get(key); + return value; + } catch (ExecutionException e) { + log.error("getSysFileCache方法错误", e); + } + return null; + } + /** + * 清除所有系统文件本地缓存 + * @return + */ + public static void clearAllSysFileCache() { + try { + sysFileCache.invalidateAll(); + } catch (Exception e) { + log.error("clearAllSysFileCache方法错误", e); + } + } + /** + * 添加系统文本地缓存,通过类型 + * @param level1Type + * @param sysFileList + */ + public static void setSysFileCacheByLevel2Type(String level1Type, List sysFileList) { + sysFileLevelType1Cache.put(level1Type, sysFileList); + } + + /** + * 获取系统文件本地缓存 + * @param level2Type + * @return + */ + public static List getSysFileCacheByLevel2Type(String level2Type) { + try { + return sysFileLevelType1Cache.get(level2Type); + } catch (ExecutionException e) { + log.error("getSysFileCacheByLevel1Type方法错误", e); + } + return null; + } + /** + * 清除所有系统文件本地缓存 + * @return + */ + public static void clearAllSysFileCacheByLevel2Type() { + try { + sysFileLevelType1Cache.invalidateAll(); + } catch (Exception e) { + log.error("clearAllSysFileCacheByLevel2Type方法错误", e); + } + } + /** + * 添加系统文件范围最大最小值本地缓存 + * @param key + * @param value + */ + public static void setFileMaxMinValueCache(String key, Long value) { + sysFileMaxAndMinCache.put(key, value); + } + + /** + * 获取系统文件范围最大最小值本地缓存 + * @param key + * @return + */ + public static Long getFileMaxMinValueCache(String key) { + try { + Long value = sysFileMaxAndMinCache.get(key); + if (0L == value) { + return null; + } + return value; + } catch (ExecutionException e) { + log.error("getFileMaxMinValueCache方法错误", e); + } + return null; + } + /** + * 清除所有系统文件范围最大最小值本地缓存 + * @return + */ + public static void clearAllMaxMinValueCache() { + try { + sysFileMaxAndMinCache.invalidateAll(); + } catch (Exception e) { + log.error("clearAllMaxMinValueCache方法错误", e); + } + } + /** + * 添加系design文件进度统计 + * @param key + * @param value + */ + public static void setDesignProcessCache(Long key, List value) { + designProcessCache.put(key, value); + } + + /** + * 获取design文件进度统计 + * @param key + * @return + */ + public static List getDesignProcessCache(Long key) { + try { + List value = designProcessCache.get(key); + return value; + } catch (ExecutionException e) { + log.error("getDesignProcessCache方法错误", e); + } + return null; + } + /** + * 进度统计完后 删除进度 + * @param key + * @return + */ + public static void delDesignProcessCache(Long key) { + try { + designProcessCache.invalidate(key); + } catch (Exception e) { + log.error("delDesignProcessCache方法错误", e); + } + } + + /** + * 设置本次接口流量数 + * @param key + * @param value + */ + public static void setAidaInterfaceCurrentLimitingCache(String key, Integer value) { + aidaInterfaceCurrentLimiting.put(key, value); + } + + /** + * 获取本次接口流量数 + * @param key + * @return + */ + public static Integer getAidaInterfaceCurrentLimitingCache(String key) { + try { + return aidaInterfaceCurrentLimiting.get(key); + } catch (ExecutionException e) { + log.error("getAidaInterfaceCurrentLimitingCache方法错误", e); + } + return null; + } + +} diff --git a/src/main/java/com/ai/da/common/utils/MD5Utils.java b/src/main/java/com/ai/da/common/utils/MD5Utils.java new file mode 100644 index 00000000..896dc3ca --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/MD5Utils.java @@ -0,0 +1,117 @@ +package com.ai.da.common.utils; + +import cn.hutool.core.exceptions.ExceptionUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.DigestUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; +import java.math.BigInteger; +import java.net.URL; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * MD5加密工具 + */ +@Slf4j +public class MD5Utils { + + /** + * MD5加密 + * + * @param str + * @return + */ + public static String encrypt(String str) { + byte[] mdBytes = null; + try { + mdBytes = MessageDigest.getInstance("MD5").digest( + str.getBytes()); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException("MD5算法不存在!"); + } + String mdCode = new BigInteger(1, mdBytes).toString(16); + + if (mdCode.length() < 32) { + int a = 32 - mdCode.length(); + for (int i = 0; i < a; i++) { + mdCode = "0" + mdCode; + } + } + // 默认返回32位小写 + return mdCode; + } + + /** + * MD5加密文件 + * + * @param file + * @return + */ + public static String encryptFile(MultipartFile file) { + String md5 = null; + try { + md5 = DigestUtils.md5DigestAsHex(file.getInputStream()); + } catch (IOException ioException) { + log.error("文件MultipartFile md5加密异常ioException##{}", ExceptionUtil.getThrowableList(ioException)); + } + return md5; + } + /** + * MD5加密文件 + * + * @param inputStream + * @return + */ + public static String encryptFile(FileInputStream inputStream) { + String md5 = null; + try { + md5 = DigestUtils.md5DigestAsHex(inputStream); + } catch (IOException ioException) { + log.error("文件MultipartFile md5加密异常ioException##{}", ExceptionUtil.getThrowableList(ioException)); + } + return md5; + } + + public static void main(String[] args) throws FileNotFoundException, IOException { + File file1 = new File("/Users/yanglei/Documents/阳磊日报2019-04-23.numbers"); + File file2 = new File("/Users/yanglei/Documents/7777.numbers"); + FileInputStream fileInputStream1 = new FileInputStream(file1); + FileInputStream fileInputStream2 = new FileInputStream(file2); + String md51 = DigestUtils.md5DigestAsHex(fileInputStream1); + String md52 = DigestUtils.md5DigestAsHex(fileInputStream2); + if (md51.equals(md52)) { + System.out.println(md51); + } + System.out.println("md51==" + md51); + System.out.println("md52==" + md52); + + } + + + /** + * MD5加密文件 + * + * @param path + * @return + */ + public static String encryptFile(String path, Boolean isLocal) { + String md5 = null; + try { + InputStream inputStream = null; + if (isLocal) { + File file = new File(path); + inputStream = new FileInputStream(file); + } else { + //远程 + inputStream = FileUtil.getOriginFile(path); + } + md5 = DigestUtils.md5DigestAsHex(inputStream); + } catch (IOException ioException) { + log.error("文件File md5加密异常ioException##{}", ExceptionUtil.getThrowableList(ioException)); + } + return md5; + } + +} diff --git a/src/main/java/com/ai/da/common/utils/MultiReadHttpServletRequest.java b/src/main/java/com/ai/da/common/utils/MultiReadHttpServletRequest.java new file mode 100644 index 00000000..7935ae27 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/MultiReadHttpServletRequest.java @@ -0,0 +1,170 @@ +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 java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + +/** + * 多次读写BODY用HTTP REQUEST - 解决流只能读一次问题 + */ +@Slf4j +public class MultiReadHttpServletRequest extends HttpServletRequestWrapper { + + private final byte[] body; + + public MultiReadHttpServletRequest(HttpServletRequest request) { + super(request); + String sessionStream = getBodyString(request); + body = sessionStream.getBytes(StandardCharsets.UTF_8); + } + + /** + * 获取请求Body + * + * @param request 请求 + * @return Body字符串 + */ + private String getBodyString(final ServletRequest request) { + StringBuilder sb = new StringBuilder(); + InputStream inputStream = null; + BufferedReader reader = null; + try { + inputStream = cloneInputStream(request.getInputStream()); + reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + String line = ""; + while ((line = reader.readLine()) != null) { + sb.append(line); + } + } + catch (IOException e) { + e.printStackTrace(); + } + finally { + if (inputStream != null) { + try { + inputStream.close(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + if (reader != null) { + try { + reader.close(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + } + return sb.toString(); + } + + /** + * 复制输入流 + * @param inputStream 请求输入流 + * @return 复制出来的输入流 + */ + private InputStream cloneInputStream(ServletInputStream inputStream) { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int len; + try { + while ((len = inputStream.read(buffer)) > -1) { + byteArrayOutputStream.write(buffer, 0, len); + } + byteArrayOutputStream.flush(); + } + catch (IOException e) { + e.printStackTrace(); + } + return new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); + } + + @Override + public BufferedReader getReader() { + return new BufferedReader(new InputStreamReader(getInputStream())); + } + + @Override + public ServletInputStream getInputStream() { + + final ByteArrayInputStream bais = new ByteArrayInputStream(body); + + return new ServletInputStream() { + + @Override + public int read() { + return bais.read(); + } + + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) { + } + }; + } + + /** + * 将前端请求的表单数据转换成json字符串 - 前后端一体的情况下使用 + * + * @param request: + * @return: java.lang.String + */ + public static String getBodyJsonStrByForm(ServletRequest request) { + Map bodyMap = new HashMap<>(16); + try { + // 参数定义 + String paraName = null; + // 获取请求参数并转换 + Enumeration e = request.getParameterNames(); + while (e.hasMoreElements()) { + paraName = e.nextElement(); + bodyMap.put(paraName, request.getParameter(paraName)); + } + } catch (Exception e) { + log.error("请求参数转换错误!", e); + } + return JSONObject.toJSONString(bodyMap); + } + + /** + * 将前端传递的json数据转换成json字符串 - 前后端分离的情况下使用 + * + * @param request: + * @return: java.lang.String + */ + public static String getBodyJsonStrByJson(ServletRequest request) { + StringBuffer json = new StringBuffer(); + String line; + try { + BufferedReader reader = request.getReader(); + while ((line = reader.readLine()) != null) { + json.append(line); + } + } catch (Exception e) { + log.error("请求参数转换错误!", e); + } + return json.toString(); + } + +} diff --git a/src/main/java/com/ai/da/common/utils/MultiReadHttpServletResponse.java b/src/main/java/com/ai/da/common/utils/MultiReadHttpServletResponse.java new file mode 100644 index 00000000..8b39a9bd --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/MultiReadHttpServletResponse.java @@ -0,0 +1,77 @@ +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 java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +/** + * 多次读写BODY用HTTP RESPONSE - 解决流只能读一次问题 + */ +public class MultiReadHttpServletResponse extends HttpServletResponseWrapper { + + private ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + private HttpServletResponse response; + + public MultiReadHttpServletResponse(HttpServletResponse response) { + super(response); + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json"); + this.response = response; + } + + public byte[] getBody() { + return byteArrayOutputStream.toByteArray(); + } + + @Override + public ServletOutputStream getOutputStream() { + return new ServletOutputStreamWrapper(this.byteArrayOutputStream, this.response); + } + + @Override + public PrintWriter getWriter() throws IOException { + return new PrintWriter(new OutputStreamWriter(getOutputStream(), this.response.getCharacterEncoding())); + } + + + @Data + @AllArgsConstructor + private static class ServletOutputStreamWrapper extends ServletOutputStream { + + private ByteArrayOutputStream outputStream; + private HttpServletResponse response; + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setWriteListener(WriteListener listener) { + + } + + @Override + public void write(int b) throws IOException { + this.outputStream.write(b); + } + + @Override + public void flush() throws IOException { + if (!this.response.isCommitted()) { + byte[] body = this.outputStream.toByteArray(); + ServletOutputStream outputStream = this.response.getOutputStream(); + outputStream.write(body); + outputStream.flush(); + } + } + } +} diff --git a/src/main/java/com/ai/da/common/utils/ObjectUtils.java b/src/main/java/com/ai/da/common/utils/ObjectUtils.java new file mode 100644 index 00000000..b70bc4c0 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/ObjectUtils.java @@ -0,0 +1,35 @@ +package com.ai.da.common.utils; +import java.util.*; +import java.lang.reflect.Field; + +public class ObjectUtils { + + /** + * 判断该对象是否所有属性为空 + * 返回ture表示所有属性为null,返回false表示不是所有属性都是null + */ + public static boolean isAllFieldNull(Object object) { + boolean flag = true; + + Class clazz = object.getClass(); + Field[] fields = clazz.getDeclaredFields(); + + for (Field field : fields) { + //设置属性是可以访问的(私有的也可以) + field.setAccessible(true); + Object value = null; + try { + value = field.get(object); + // 只要有1个属性不为空,那么就不是所有的属性值都为空 + if (value != null) { + flag = false; + break; + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + + return flag; + } +} diff --git a/src/main/java/com/ai/da/common/utils/RandomsUtil.java b/src/main/java/com/ai/da/common/utils/RandomsUtil.java new file mode 100644 index 00000000..19af8494 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/RandomsUtil.java @@ -0,0 +1,51 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ai.da.common.utils; + +import cn.hutool.core.util.RandomUtil; + +import java.text.DecimalFormat; + +/** + * @author yanglei + * @description 随机数工具类 + * @date 2022-07 + **/ +public class RandomsUtil { + + private static String PREFIX = "ver"; + + /** + * 生成验证码 + * + * @param randomStart + * @param randomEnd + */ + public static String generateVerifyCode(Long randomStart, Long randomEnd) { + return String.valueOf(RandomUtil.randomLong(randomStart,randomEnd)); + } + /** + * 生成随机系统图片 + * + * @param randomStart 可以等于 + * @param randomEnd 小于最大值 + */ + public static Long randomSysFile(Long randomStart, Long randomEnd) { + return RandomUtil.randomLong(randomStart,randomEnd); + } + + +} diff --git a/src/main/java/com/ai/da/common/utils/RedisCacheUtils.java b/src/main/java/com/ai/da/common/utils/RedisCacheUtils.java new file mode 100644 index 00000000..ea96a4eb --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/RedisCacheUtils.java @@ -0,0 +1,50 @@ +package com.ai.da.common.utils; + +import cn.hutool.core.util.StrUtil; +import org.springframework.data.redis.core.RedisTemplate; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @author: dangweijian + * @description: redis缓存工具 + * @create: 2021-01-08 9:23 + **/ +public final class RedisCacheUtils { + + private static RedisTemplate getRedisTemplate(){ + return SpringUtils.getBean("redisTemplate"); + } + + private static RedisTemplate getRedisTemplate(Class clazz){ + return SpringUtils.getBean("redisTemplate"); + } + + private static RedisTemplate> getListRedisTemplate(Class clazz){ + return SpringUtils.getBean("redisTemplate"); + } + + public static T get(String key, Class clazz){ + return getRedisTemplate(clazz).opsForValue().get(key); + } + + public static List getList(String key, Class clazz){ + return getListRedisTemplate(clazz).opsForValue().get(key); + } + + public static void set(String key, Object value){ + getRedisTemplate().opsForValue().set(key, value); + } + + public static void set(String key, Object value, long time, TimeUnit unit){ + getRedisTemplate().opsForValue().set(key, value, time, unit); + } + + public static boolean delete(String key){ + if(StrUtil.isNotEmpty(key)){ + return Boolean.TRUE.equals(getRedisTemplate().delete(key)); + } + return false; + } +} diff --git a/src/main/java/com/ai/da/common/utils/RequestInfoUtil.java b/src/main/java/com/ai/da/common/utils/RequestInfoUtil.java new file mode 100644 index 00000000..1e3d12dd --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/RequestInfoUtil.java @@ -0,0 +1,49 @@ +package com.ai.da.common.utils; + +import javax.servlet.http.HttpServletRequest; + +public class RequestInfoUtil { + + /** + * description 获取客户端IP + * + * @param request + * @return java.lang.String + * @version 1.0 + * + * + * 使用了ng等代理服务器要在ng加以下配置 + * location / { + * proxy_pass http://127.0.0.1:10678; + * proxy_set_header Host $host; + * proxy_set_header X-Real-IP $remote_addr; + * proxy_set_header REMOTE-HOST $remote_addr; + * proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + * } + + */ + public static String getIpAddress(HttpServletRequest request) { + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_CLIENT_IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + // 如果是多级代理,那么取第一个IP为客户端IP + if (ip != null && ip.indexOf(",") != -1) { + ip = ip.substring(0, ip.indexOf(",")).trim(); + } + return ip; + } + +} diff --git a/src/main/java/com/ai/da/common/utils/RsaDecryptUtils.java b/src/main/java/com/ai/da/common/utils/RsaDecryptUtils.java new file mode 100644 index 00000000..83962f69 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/RsaDecryptUtils.java @@ -0,0 +1,70 @@ +package com.ai.da.common.utils; + +import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.codec.binary.Base64; + +import javax.crypto.Cipher; +import java.io.ByteArrayOutputStream; +import java.security.*; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.PKCS8EncodedKeySpec; + +/** + * Rsa解密工具 + */ +@Slf4j +public class RsaDecryptUtils { + + public static final String PRIVATE_KEY = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJA0JB/XhdVz/rxlt/XI8LmB7WvPhT1ZpoLXaMfg7zNN+jRWOpuYc+NDr17uA07yl9h2FHOZ6aG5eoobyUP13gAopQuS7BJYwrrA0HLJjZuROWPw/djA8uxQQ97q22k7evlnZ4a1mVJRONbzQxUKQEgLM0S7+l699/NIZGyI4+XPAgMBAAECgYBlyjh5tZPGIbP93rtlJqst91XVVU4TCVZtY4qWFOQkTfXAveFu9cVP9fYzx0TUlI+0/1zeYRW20At8s7J1Y3eJhurZTLns+GpbFD2qExZVL9w5hqmn9fvOE4jCP7uTlTzVgT9zDxAvCid8mSVHz4z7MWG3/zrJloWQzE2riqeeyQJBAOiqfE4M5dQPopFKGhJBBWdKYLAK+trfi4iqstMfdndCiExGd0Nlw9/RS21LXZFk7RwCood6Q/XyKyXTZMwbTHUCQQCeqnTXhEhYlnRIHOuGKYGVHEFMrIGhPH0LZ7ZQUBp+q0wzUsCY79D9ppIwJPHggDsyJOZatm5eMtHb0dDEqbCzAkEAmHF72LfirjtATOm8g1FO9Qpqp23KRzZI+la9rE7lE+bn3vIcmnBHEpLTVN0YhXcXVE71psaZWMA/PR1w4brRMQJADJvPHTFN7nxGUVS7ArZZrdfI+KbcxktgRH/BZTB4aoiCTbHNzFmCaiXKiDjnX8fQ7HMyOxM0QhgXxTgvNvGlMQJATbRaCq7Ytw1SpHRuRbThjwkKVuinSX9y8rRhof7vEKTYomhoDoH7ZITWq421kXT81mj66ahtkPBccw1NeOqYCg=="; + + public static String decrypt(String content, String privateKey) { + byte[] result; + try { + PKCS8EncodedKeySpec pkcs8EncodedKeySpec5 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey)); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PrivateKey privateKeyText = keyFactory.generatePrivate(pkcs8EncodedKeySpec5); + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.DECRYPT_MODE, privateKeyText); + result = doLongerCipherFinal(cipher, Base64.decodeBase64(content)); + } catch (Exception e) { + log.error("RSA解密失败", e); + return null; + } + return new String(result); + } + + private static byte[] doLongerCipherFinal(Cipher cipher, byte[] source) throws Exception { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + out.write(cipher.doFinal(source)); + out.close(); + return out.toByteArray(); + } + + /** + * 构建RSA密钥对 + * @param args + */ +// public static void main(String[] args) throws NoSuchAlgorithmException { +// KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); +// keyPairGenerator.initialize(1024); +// KeyPair keyPair = keyPairGenerator.generateKeyPair(); +// RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic(); +// RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate(); +// String publicKeyString = Base64.encodeBase64String(rsaPublicKey.getEncoded()); +// String privateKeyString = Base64.encodeBase64String(rsaPrivateKey.getEncoded()); +// System.out.println("公钥:" + publicKeyString); +// System.out.println("私钥:" + privateKeyString); +// } + + /** + * 解密 + * @param args + * @throws NoSuchAlgorithmException + */ + public static void main(String[] args) throws Exception { + String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJA0JB/XhdVz/rxlt/XI8LmB7WvPhT1ZpoLXaMfg7zNN+jRWOpuYc+NDr17uA07yl9h2FHOZ6aG5eoobyUP13gAopQuS7BJYwrrA0HLJjZuROWPw/djA8uxQQ97q22k7evlnZ4a1mVJRONbzQxUKQEgLM0S7+l699/NIZGyI4+XPAgMBAAECgYBlyjh5tZPGIbP93rtlJqst91XVVU4TCVZtY4qWFOQkTfXAveFu9cVP9fYzx0TUlI+0/1zeYRW20At8s7J1Y3eJhurZTLns+GpbFD2qExZVL9w5hqmn9fvOE4jCP7uTlTzVgT9zDxAvCid8mSVHz4z7MWG3/zrJloWQzE2riqeeyQJBAOiqfE4M5dQPopFKGhJBBWdKYLAK+trfi4iqstMfdndCiExGd0Nlw9/RS21LXZFk7RwCood6Q/XyKyXTZMwbTHUCQQCeqnTXhEhYlnRIHOuGKYGVHEFMrIGhPH0LZ7ZQUBp+q0wzUsCY79D9ppIwJPHggDsyJOZatm5eMtHb0dDEqbCzAkEAmHF72LfirjtATOm8g1FO9Qpqp23KRzZI+la9rE7lE+bn3vIcmnBHEpLTVN0YhXcXVE71psaZWMA/PR1w4brRMQJADJvPHTFN7nxGUVS7ArZZrdfI+KbcxktgRH/BZTB4aoiCTbHNzFmCaiXKiDjnX8fQ7HMyOxM0QhgXxTgvNvGlMQJATbRaCq7Ytw1SpHRuRbThjwkKVuinSX9y8rRhof7vEKTYomhoDoH7ZITWq421kXT81mj66ahtkPBccw1NeOqYCg=="; + String decrypt = decrypt("EzAxC/373prww88TXDayIZTvxS3uFAvGhhzLNs+5cOfJU6zm3x/1RA5KcouuWwcYs0bbvNV7zSitLeEGeo23aPUxzr+rsNvCqKHrPNKbcl/oyOFBtOfguVbuHVEy8Q4cpVxfWCd/aEXx9OJXkLEAvlDdDF6SHyKhf+RUmSGEQOg=", privateKey); + System.out.println(decrypt); + } +} diff --git a/src/main/java/com/ai/da/common/utils/RsaEncryptUtils.java b/src/main/java/com/ai/da/common/utils/RsaEncryptUtils.java new file mode 100644 index 00000000..9e4b8b46 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/RsaEncryptUtils.java @@ -0,0 +1,46 @@ +package com.ai.da.common.utils; + +import org.apache.tomcat.util.codec.binary.Base64; + +import javax.crypto.Cipher; +import java.io.ByteArrayOutputStream; +import java.security.KeyFactory; +import java.security.PublicKey; +import java.security.spec.X509EncodedKeySpec; + +/** + * Rsa加密工具 + */ +public class RsaEncryptUtils { + + /** + * 加密方法 + * + * @param content 需要加密的内容 + * @param publicKey 公钥 + * @return 加密后得到的字符串 + * @throws Exception + */ + public static String encrypt(String content, String publicKey) throws Exception { + X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(Base64.decodeBase64(publicKey)); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PublicKey publicKeyText = keyFactory.generatePublic(x509EncodedKeySpec2); + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.ENCRYPT_MODE, publicKeyText); + byte[] result = doLongerCipherFinal(cipher, content.getBytes()); + return Base64.encodeBase64String(result); + } + + private static byte[] doLongerCipherFinal(Cipher cipher, byte[] source) throws Exception { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int offset = 0; + int totalSize = source.length; + while (totalSize - offset > 0) { + int size = Math.min(cipher.getOutputSize(0) - 11, totalSize - offset); + out.write(cipher.doFinal(source, offset, size)); + offset += size; + } + out.close(); + return out.toByteArray(); + } +} diff --git a/src/main/java/com/ai/da/common/utils/SecurityContextUtils.java b/src/main/java/com/ai/da/common/utils/SecurityContextUtils.java new file mode 100644 index 00000000..34a82627 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/SecurityContextUtils.java @@ -0,0 +1,32 @@ +package com.ai.da.common.utils; + +import com.ai.da.model.vo.AuthPrincipalVo; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; + +public class SecurityContextUtils { + + public static AuthPrincipalVo getCurrentUser() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if(authentication != null && authentication.getPrincipal() != null){ + return (AuthPrincipalVo) authentication.getPrincipal(); + } + return null; + } + + public static Long getCurrentUserId() { + AuthPrincipalVo currentUser = getCurrentUser(); + if(currentUser != null){ + return currentUser.getId(); + } + return null; + } + + public static String getCurrentUsername() { + AuthPrincipalVo currentUser = getCurrentUser(); + if(currentUser != null){ + return currentUser.getUsername(); + } + return null; + } +} diff --git a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java new file mode 100644 index 00000000..eaa3873f --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java @@ -0,0 +1,116 @@ +package com.ai.da.common.utils; + +import com.alibaba.fastjson.JSONObject; +import com.ai.da.common.config.exception.BusinessException; +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +import com.tencentcloudapi.common.profile.ClientProfile; +import com.tencentcloudapi.common.profile.HttpProfile; +import com.tencentcloudapi.ses.v20201002.SesClient; +import com.tencentcloudapi.ses.v20201002.models.SendEmailRequest; +import com.tencentcloudapi.ses.v20201002.models.SendEmailResponse; +import com.tencentcloudapi.ses.v20201002.models.Template; +import lombok.extern.slf4j.Slf4j; + +import java.util.Date; + +/** + * 邮件发送类 + */ +@Slf4j +public class SendEmailUtil { + /** + * 秘钥id + */ + private static String SECRET_ID = "AKID52lRwDIBsLaZLtDI9m9LJMAj36wYw50i"; + /** + * 秘钥key + */ + private static String SECRET_KEy = "XqujLlywhHfrqcCYfYVHtNgmeIiwxkKf"; + /** + * 发信地址 + */ + private static String SEND_ADDRESS = "info@aida.com.hk"; + /** + * 登入主题 + */ + public static String LOGIN_SUBJECT = "Log on"; + /** + * 忘记密码主题 + */ + public static String FORGET_PWD_SUBJECT = "Reset password"; + /** + * 异常ip + */ + public static String EXCEPTION_ID_SUBJECT = "Exception ip"; + /** + * 绑定邮箱 + */ + public static String BIND_MAILBOX_SUBJECT = "绑定邮箱"; + /** + * 登入模板id + */ + public static Long LOGIN_TEMPLATE_ID = 58020L; + /** + * 修改密码模板id + */ + public static Long UPDATE_PWD_TEMPLATE_ID = 58022L; + /** + * 异常ip模板id + */ + public static Long EXCEPTION_ID_TEMPLATE_ID = 58021L; + /** + * 绑定邮箱模板id + */ + public static Long BIND_MAILBOX_TEMPLATE_ID = 45619L; + + + public static Boolean send(String receiverAddress,String ip,Long templateId,String verifyCode) { + try{ + // 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密 + // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取 + Credential cred = new Credential(SECRET_ID, SECRET_KEy); + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint("ses.tencentcloudapi.com"); + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + // 实例化要请求产品的client对象,clientProfile是可选的 + SesClient client = new SesClient(cred, "ap-hongkong", clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + SendEmailRequest req = new SendEmailRequest(); + + req.setFromEmailAddress(SEND_ADDRESS); + req.setDestination(new String[]{receiverAddress}); + String subject = templateId == LOGIN_TEMPLATE_ID ? LOGIN_SUBJECT : + templateId == UPDATE_PWD_TEMPLATE_ID ? FORGET_PWD_SUBJECT : + templateId == EXCEPTION_ID_TEMPLATE_ID ? EXCEPTION_ID_SUBJECT :BIND_MAILBOX_SUBJECT; + req.setSubject(subject); + req.setTemplate(contractTemplate(templateId, verifyCode,ip)); + + // 返回的resp是一个SendEmailResponse的实例,与请求对象对应 + SendEmailResponse resp = client.SendEmail(req); + // 输出json格式的字符串回包 + log.info("短信发送结果res###{}",SendEmailResponse.toJsonString(resp)); + return Boolean.TRUE; + } catch (TencentCloudSDKException e) { + log.info("邮件发送失败###{}",e.toString()); + throw new BusinessException(e.getMessage()); + } + } + private static Template contractTemplate(Long templateId,String verifyCode,String ip){ + Template template = new Template(); + template.setTemplateID(templateId); + + JSONObject jsonObject = new JSONObject(); + if(templateId == EXCEPTION_ID_TEMPLATE_ID ){ + jsonObject.put("exceptionIp",ip); + jsonObject.put("loginTime",DateUtil.dateToStr(new Date(),DateUtil.YYYY_MM_DD_HH_MM_SS)); + }else{ + jsonObject.put("code",verifyCode); + } + template.setTemplateData(jsonObject.toJSONString()); + return template; + } +} diff --git a/src/main/java/com/ai/da/common/utils/SendSmsUtil.java b/src/main/java/com/ai/da/common/utils/SendSmsUtil.java new file mode 100644 index 00000000..c0da38a4 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/SendSmsUtil.java @@ -0,0 +1,106 @@ +//package com.ai.da.common.utils; +// +//import com.ai.da.common.config.exception.BusinessException; +//import com.tencentcloudapi.common.Credential; +//import com.tencentcloudapi.common.exception.TencentCloudSDKException; +//import com.tencentcloudapi.common.profile.ClientProfile; +//import com.tencentcloudapi.common.profile.HttpProfile; +//import com.tencentcloudapi.sms.v20210111.SmsClient; +//import com.tencentcloudapi.sms.v20210111.models.*; +//import lombok.extern.slf4j.Slf4j; +//import org.bouncycastle.util.Arrays; +// +//import java.util.Objects; +// +///** +// * 短信发送类 +// */ +//@Slf4j +//public class SendSmsUtil { +// /** +// * 秘钥id +// */ +// private static String SECRET_ID = "AKIDylJaZIkunPkZ7OPAermRovlKccLnysVr"; +// /** +// * 秘钥key +// */ +// private static String SECRET_KEy = "5tQgeLlumPmshFVUCdngIcfXeU4NPAdq"; +// /** +// * sdkAppId +// */ +// private static String SDK_APP_ID = "1400722195"; +// /** +// * 签名 +// */ +// public static String SIGN_NAME = "深呼吸智能窗帘"; +// /** +// * 忘记密码模板 +// */ +// public static String FORGET_TEMPLATE_ID = "1514353"; +// /** +// * 登入模板 +// */ +// public static String LOGIN_TEMPLATE_ID = "1514349"; +// /** +// * 登入操作 +// */ +// public static String LOGIN_OPERATION = "登入"; +// /** +// * 忘记密码操作 +// */ +// public static String FORGET_PWD_OPERATION = "忘记密码操作"; +// +// +// public static Boolean send(String phone, String templateId, String verifyCode) { +// try{ +// // 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密 +// // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取 +// Credential cred = new Credential(SECRET_ID, SECRET_KEy); +// // 实例化一个http选项,可选的,没有特殊需求可以跳过 +// HttpProfile httpProfile = new HttpProfile(); +// httpProfile.setReqMethod("POST"); +// /* SDK有默认的超时时间,非必要请不要进行调整 +// * 如有需要请在代码中查阅以获取最新的默认值 */ +// httpProfile.setConnTimeout(60); +// /* 指定接入地域域名,默认就近地域接入域名为 sms.tencentcloudapi.com ,也支持指定地域域名访问,例如广州地域的域名为 sms.ap-guangzhou.tencentcloudapi.com */ +// httpProfile.setEndpoint("sms.tencentcloudapi.com"); +// +// /* 非必要步骤: +// * 实例化一个客户端配置对象,可以指定超时时间等配置 */ +// ClientProfile clientProfile = new ClientProfile(); +// /* SDK默认用TC3-HMAC-SHA256进行签名 +// * 非必要请不要修改这个字段 */ +// clientProfile.setSignMethod("HmacSHA256"); +// clientProfile.setHttpProfile(httpProfile); +// /* 实例化要请求产品(以sms为例)的client对象 +// * 第二个参数是地域信息,可以直接填写字符串ap-guangzhou,支持的地域列表参考 https://cloud.tencent.com/document/api/382/52071#.E5.9C.B0.E5.9F.9F.E5.88.97.E8.A1.A8 */ +// SmsClient client = new SmsClient(cred, "ap-guangzhou",clientProfile); +// +// SendSmsRequest req = new SendSmsRequest(); +// req.setSmsSdkAppId(SDK_APP_ID); +// req.setSignName(SIGN_NAME); +// req.setTemplateId(templateId); +// //模板参数 +// String[] templateParamSet = {verifyCode}; +// req.setTemplateParamSet(templateParamSet); +// /* 下发手机号码,采用 E.164 标准,+[国家或地区码][手机号] +// * 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号 */ +// String[] phoneNumberSet = {phone}; +// req.setPhoneNumberSet(phoneNumberSet); +// //发送短信 +// SendSmsResponse res = client.SendSms(req); +// log.info("短信发送结果res###{}",SendSmsResponse.toJsonString(res)); +// if(Objects.isNull(res)|| Arrays.isNullOrContainsNull(res.getSendStatusSet()) +// || res.getSendStatusSet()[0].getCode() != "Ok"){ +// SendStatus message = res.getSendStatusSet()[0]; +// throw new BusinessException(message.getMessage()); +// } +// // 输出json格式的字符串回包 +// } catch (TencentCloudSDKException e) { +// log.error(e.toString()); +// return Boolean.FALSE; +// } +// return Boolean.TRUE; +// } +// +//} diff --git a/src/main/java/com/ai/da/common/utils/SpringUtils.java b/src/main/java/com/ai/da/common/utils/SpringUtils.java new file mode 100644 index 00000000..99f15050 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/SpringUtils.java @@ -0,0 +1,44 @@ +package com.ai.da.common.utils; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * @ClassName SpringUtils + * @Description springBean工具 + * @Author dwjian + * @Date 2020/1/15 17:10 + */ +@Component +public class SpringUtils implements ApplicationContextAware { + + private static ApplicationContext applicationContext; + + public static T getBean(Class clazz) { + return applicationContext.getBean(clazz); + } + + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringUtils.applicationContext = applicationContext; + } + + public static T getBean(String beanName) { + if(applicationContext.containsBean(beanName)){ + return (T) applicationContext.getBean(beanName); + }else{ + return null; + } + } + + public static Map getBeansOfType(Class baseType){ + return applicationContext.getBeansOfType(baseType); + } + + public static ApplicationContext getApplicationContext(){ + return applicationContext; + } +} diff --git a/src/main/java/com/ai/da/controller/AccountController.java b/src/main/java/com/ai/da/controller/AccountController.java new file mode 100644 index 00000000..8b2376cb --- /dev/null +++ b/src/main/java/com/ai/da/controller/AccountController.java @@ -0,0 +1,69 @@ +package com.ai.da.controller; + +import com.ai.da.common.response.Response; +import com.ai.da.common.security.jwt.JWTTokenHelper; +import com.ai.da.model.dto.*; +import com.ai.da.model.vo.AccountLoginVO; +import com.ai.da.model.vo.AccountPreLoginVO; +import com.ai.da.service.AccountService; +import io.swagger.annotations.Api; +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; + + +@Api(tags = "Account模块") +@Slf4j +@RestController +@RequestMapping("/api/account") +public class AccountController { + + @Resource + private AccountService accountService; + + @ApiOperation(value = "预先登入") + @PostMapping("/preLogin") + public Response preLogin(@Valid @RequestBody AccountPreLoginDTO accountDTO) { + return Response.success(accountService.preLogin(accountDTO)); + } + @ApiOperation(value = "登入") + @PostMapping("/login") + public Response login(@Valid @RequestBody AccountLoginDTO accountDTO, HttpServletRequest request) { + return Response.success(accountService.login(accountDTO,request)); + } + + @ApiOperation(value = "绑定邮箱") + @PostMapping("/bindEmail") + public Response bindEmail(@Valid @RequestBody AccountBindEmailDTO accountBindEmailDTO) { + return Response.success(accountService.bindEmail(accountBindEmailDTO)); + } + + @ApiOperation(value = "忘记密码") + @PostMapping("/resetPwd") + public Response resetPwd(@Valid @RequestBody AccountRegisterDTO accountRegisterDTO) { + return Response.success(accountService.forgetPwd(accountRegisterDTO)); + } + + @ApiOperation(value = "发送邮件") + @PostMapping("/sendEmail") + public Response sendEmail(@Valid @RequestBody EmailSendDTO emailSendDTO) { + return Response.success(accountService.sendEmail(emailSendDTO)); + } + + @ApiOperation(value = "登出") + @PostMapping("/logout") + public Response logout(@Valid @RequestBody AccountLogoutDTO accountLogoutDTO) { + return Response.success( accountService.logout(accountLogoutDTO)); + } + + @ApiOperation(value = "是否登入") + @PostMapping("/isLogin") + public Response isLogin(@Valid @RequestBody AccountLogoutDTO accountLogoutDTO) { + return Response.success( accountService.isLogin(accountLogoutDTO)); + } + +} diff --git a/src/main/java/com/ai/da/controller/DesignController.java b/src/main/java/com/ai/da/controller/DesignController.java new file mode 100644 index 00000000..94e8985a --- /dev/null +++ b/src/main/java/com/ai/da/controller/DesignController.java @@ -0,0 +1,63 @@ +package com.ai.da.controller; + +import com.ai.da.common.response.Response; +import com.ai.da.model.dto.*; +import com.ai.da.model.vo.DesignCollectionVO; +import com.ai.da.model.vo.DesignItemDetailVO; +import com.ai.da.model.vo.DesignLikeVO; +import com.ai.da.service.DesignService; +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.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.math.BigDecimal; + + +@Api(tags = "design模块") +@Slf4j +@RestController +@RequestMapping("/api/design") +public class DesignController { + @Resource + private DesignService designService; + + @ApiOperation(value = "设计 Conllection") + @PostMapping("/designCollection") + public Response designCollection(@Valid @RequestBody DesignCollectionDTO designDTO) { + return Response.success(designService.designCollection(designDTO)); + } + + @ApiOperation(value = "重新设计 Collection") + @PostMapping("/reDesignCollection") + public Response reDesignCollection(@Valid @RequestBody ReDesignCollectionDTO reDesignDTO) { + return Response.success(designService.reDesignCollection(reDesignDTO)); + } + @ApiOperation(value = "designItem list,刷新用") + @GetMapping("/designItemList") + public Response designItemList(@ApiParam("designId") @RequestParam("designId") Long designId) { + return Response.success(designService.designItemList(designId)); + } + + @ApiOperation(value = "统计design进度") + @PostMapping("/countDesignProcess") + public Response countDesignProcess() { + return Response.success(designService.countDesignProcess()); + } + + @ApiOperation(value = "Design Like") + @PostMapping("/like") + public Response like(@Valid @RequestBody DesignLikeDTO designLikeDTO) { + return Response.success(designService.like(designLikeDTO)); + } + + @ApiOperation(value = "Design Dislike") + @PostMapping("/dislike") + public Response dislike(@Valid @RequestBody DisDesignLikeDTO disDesignLikeDTO) { + return Response.success(designService.dislike(disDesignLikeDTO)); + } + +} diff --git a/src/main/java/com/ai/da/controller/DesignDetailController.java b/src/main/java/com/ai/da/controller/DesignDetailController.java new file mode 100644 index 00000000..1b4ca8c7 --- /dev/null +++ b/src/main/java/com/ai/da/controller/DesignDetailController.java @@ -0,0 +1,74 @@ +package com.ai.da.controller; + +import com.ai.da.common.response.Response; +import com.ai.da.mapper.entity.CollectionElement; +import com.ai.da.mapper.entity.DesignItem; +import com.ai.da.model.dto.*; +import com.ai.da.model.vo.*; +import com.ai.da.service.DesignItemService; +import com.ai.da.service.DesignService; +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.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.math.BigDecimal; + + +@Api(tags = "design Detail模块") +@Slf4j +@RestController +@RequestMapping("/api/design/detail") +public class DesignDetailController { + @Resource + private DesignService designService; + @Resource + private DesignItemService designItemService; + + @ApiOperation(value = "生成高级design图片") + @PostMapping("/generateHighDesign") + public Response generateHighDesign(@Valid @RequestBody GenerateHighDesignDTO generateHighDesignDTO) { + Response response = new Response(); + response.setData(designService. generateHighDesign(generateHighDesignDTO)); + return response; + } + @ApiOperation(value = "删除高级design图片") + @PostMapping("/deleteHighDesign") + public Response deleteHighDesign(@Valid @RequestBody GenerateHighDesignDTO generateHighDesignDTO) { + Response response = new Response(); + response.setData(designService.deleteHighDesign(generateHighDesignDTO)); + return response; + } + @ApiOperation(value = "查询design详情") + @GetMapping("/getDetail") + public Response getDetail(@ApiParam("designItemId") @RequestParam("designItemId") Long designItemId) { + return Response.success(designService.detail(designItemId)); + } + + @ApiOperation(value = "切换系统的element") + @GetMapping("/getNextSysElement") + public Response getNextSysElement(@ApiParam("要切换的系统element 类型") @RequestParam("type") String type, + @ApiParam("要切换的系统element id") @RequestParam("id") Long id, + @ApiParam("操作类型 PREV 上一步 NEXT 下一步") @RequestParam("operateType") String operateType) { + return Response.success(designItemService.getNextSysElement(id,type,operateType)); + } + @ApiOperation(value = "单个design") + @PostMapping("/designSingle") + public Response designSingle(@Valid @RequestBody DesignSingleDTO designSingleDTO ) { + return Response.success(designItemService.designSingle(designSingleDTO)); + } + + @ApiOperation(value = "print打点") + @PostMapping("/printDot") + public Response printDot(@Valid @RequestBody DesignSingleDTO designSingleDTO ) { + Response response =new Response(); + String url = designItemService.printDot(designSingleDTO); + response.setData(url); + return response; + } + + +} diff --git a/src/main/java/com/ai/da/controller/ElementController.java b/src/main/java/com/ai/da/controller/ElementController.java new file mode 100644 index 00000000..1d28fae7 --- /dev/null +++ b/src/main/java/com/ai/da/controller/ElementController.java @@ -0,0 +1,99 @@ +package com.ai.da.controller; + +import com.ai.da.common.response.Response; +import com.ai.da.common.utils.FileUtil; +import com.ai.da.common.utils.MD5Utils; +import com.ai.da.model.dto.*; +import com.ai.da.model.vo.*; +import com.ai.da.service.CollectionElementService; +import com.ai.da.service.PanToneService; +import com.ai.da.service.SysFileService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + + +@Api(tags = "collection模块") +@Slf4j +@RestController +@RequestMapping("/api/element") +public class ElementController { + + @Resource + private CollectionElementService collectionElementService; + @Resource + private PanToneService panToneService; + @Resource + private SysFileService sysFileService; + + @ApiOperation(value = "初始化系统文件") + @PostMapping("/initDefaultSysFile") + public Response initDefaultSysFile(@RequestParam("validate") String validateUse) { + if (validateUse.equals("da_fl_mm_dad88888")) { + //防止被调用 + sysFileService.initDefaultSysFile(); + } + return Response.success(); + } + + @ApiOperation(value = "element文件上传") + @PostMapping("/upload") + public Response upload(@RequestParam("file") MultipartFile file, + @ApiParam("一级类型 Moodboard Printboard Sketchboard MarketingSketch Colorboard") + @RequestParam(value = "level1Type") String level1Type, + @ApiParam("本地时区,比如 'Asia/Tokyo' 东京时间 , 'Asia/Shanghai' 北京时间 由js本地获取") + @RequestParam(value = "timeZone") String timeZone) { + Assert.isTrue(!StringUtils.isEmpty(file.getOriginalFilename()),"Please select a file!"); + return Response.success(collectionElementService.upload( + new CollectionElementUploadDTO(file, level1Type, timeZone, MD5Utils.encryptFile(file)))); + } + + @ApiOperation(value = "element文件删除") + @PostMapping("/delete") + public Response delete(@Valid @RequestBody CollectionDeleteFileDTO deleteFileDTO) { + collectionElementService.delete(deleteFileDTO.getId()); + return Response.success(); + } + + @ApiOperation(value = "生成印花") + @PostMapping("/generatePrint") + public Response generatePrint(@Valid @RequestBody CollectionGeneratePrintDTO generatePrintDTO) { + return Response.success(collectionElementService.generatePrint(generatePrintDTO)); + } + + @ApiOperation(value = "保存印花") + @PostMapping("/savePrint") + public Response savePrint(@Valid @RequestBody CollectionSavePrintDTO savePrintDTO) { + return Response.success(collectionElementService.savePrint(savePrintDTO)); + } + + @ApiOperation(value = "通过tcx值获取潘通信息") + @GetMapping("/getRgbByTcx") + public Response getRgbByHsv(@ApiParam("tcx") @RequestParam("tcx") String tcx) { + return Response.success(panToneService.getByTCX(tcx)); + } + + @ApiOperation(value = "通过hsv值获取潘通信息") + @GetMapping("/getRgbByHsv") + public Response getRgbByHsv(@RequestParam("h") Integer h, + @RequestParam("s") Integer s, @RequestParam("v") Integer v) { + return Response.success(panToneService.getByHSV(h, s, v)); + } + + @ApiOperation(value = "通过hsv值数组批量获取潘通信息") + @PostMapping("/getRgbByHsvBatch") + public Response> getRgbByHsvBatch(@RequestBody @Valid List rgbByHsvBatch) { + return Response.success(panToneService.getRgbByHsvBatch(rgbByHsvBatch)); + } + +} diff --git a/src/main/java/com/ai/da/controller/LibraryController.java b/src/main/java/com/ai/da/controller/LibraryController.java new file mode 100644 index 00000000..335bc9db --- /dev/null +++ b/src/main/java/com/ai/da/controller/LibraryController.java @@ -0,0 +1,158 @@ +package com.ai.da.controller; + +import cn.hutool.core.lang.Assert; +import cn.hutool.system.UserInfo; +import com.ai.da.common.config.FileProperties; +import com.ai.da.common.context.UserContext; +import com.ai.da.common.enums.LibraryLevel1TypeEnum; +import com.ai.da.common.response.PageBaseResponse; +import com.ai.da.common.response.Response; +import com.ai.da.common.utils.CopyUtil; +import com.ai.da.common.utils.DateUtil; +import com.ai.da.common.utils.FileUtil; +import com.ai.da.common.utils.MD5Utils; +import com.ai.da.mapper.entity.Library; +import com.ai.da.mapper.entity.LibraryModelPoint; +import com.ai.da.model.dto.*; +import com.ai.da.model.vo.*; +import com.ai.da.service.LibraryModelPointService; +import com.ai.da.service.LibraryService; +import com.alibaba.fastjson.JSON; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +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 java.io.File; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.UUID; + + +@Api(tags = "library模块") +@Slf4j +@RestController +@RequestMapping("/api/library") +public class LibraryController { + + @Resource + private LibraryService libraryService; + @Resource + private LibraryModelPointService libraryModelPointService; + @Resource + private FileProperties fileProperties; + + @ApiOperation(value = "Library分页列表") + @PostMapping("/queryLibraryPage") + public Response> queryLibraryPage(@Valid @RequestBody QueryLibraryPageDTO query) { + return Response.success(libraryService.queryLibraryPage(CopyUtil.copyObject(query,QueryLibraryPageServiceDTO.class))); + } + + @ApiOperation(value = "Library分页列表(查询top和bottom)") + @PostMapping("/queryLibraryTopAndBottomPage") + public Response> queryLibraryTopAndBottomPage(@Valid @RequestBody QueryLibraryTopPageDTO query) { + return Response.success(libraryService.queryLibraryPage(CopyUtil.copyObject(query,QueryLibraryPageServiceDTO.class))); + } + + @ApiOperation(value = "Library文件上传") + @PostMapping("/upload") + public Response upload(@RequestParam("file") MultipartFile file, + @ApiParam("一级类型 Moodboard Printboard Sketchboard MarketingSketch Models") + @RequestParam(value = "level1Type") String level1Type, + @ApiParam("二级类型 争对 Sketchboard; 有 Outwear Dress Blouse Skirt Trousers") + @RequestParam(value = "level2Type",required = false) String level2Type, + @ApiParam("本地时区,比如 'Asia/Tokyo' 东京时间 , 'Asia/Shanghai' 北京时间 由js本地获取") + @RequestParam(value = "timeZone") String timeZone) { + Assert.isTrue(!StringUtils.isEmpty(file.getOriginalFilename()),"Please select a file!"); + Integer high =null; + Integer width =null; + if(level1Type.equals(LibraryLevel1TypeEnum.MODELS.getRealName())){ + FileVO fileVO = FileUtil.getFileSize(file); + high = fileVO.getHigh(); + width = fileVO.getWidth(); + } + return Response.success(libraryService.upload(new LibraryUploadDTO(file, level1Type,level2Type, + timeZone, MD5Utils.encryptFile(file),high,width))); + } + @ApiOperation(value = "保存或者编辑template打点") + @PostMapping("/saveOrEditTemplatePoint") + public Response saveOrEditTemplatePoint(@Valid @RequestBody LibraryModelPointDTO libraryModelPoint) { + return Response.success(libraryModelPointService.saveOrEditTemplatePoint(libraryModelPoint)); + } + @ApiOperation(value = "批量Library修改用户文件名") + @PostMapping("/batchUpdateLibraryName") + public Response batchUpdateLibraryName(@Valid @RequestBody LibraryUpdateDTO libraryUpdateDTO) { + libraryService.updateLibraryName(libraryUpdateDTO); + return Response.success(Boolean.TRUE); + } + + @ApiOperation(value = "批量删除library") + @PostMapping("/batchDeleteLibrary") + public Response batchDeleteLibrary(@Valid @RequestBody LibraryDeleteDTO deleteDTO) { + List librarys = libraryService.getByIds(deleteDTO.getLibraryIds()); + Assert.notEmpty(librarys,"librarys does not exist!"); + libraryService.removeBatchByIds(deleteDTO.getLibraryIds()); + librarys.forEach(library -> { + FileUtil.delete(library.getUrl()); + }); + return Response.success(Boolean.TRUE); + } + + + @ApiOperation(value = "Models打点预览") + @PostMapping("/modelsDot") + public Response modelsDot(@ApiParam("file") @RequestPart(value = "file",required = false) MultipartFile file, + @ApiParam("models对象")@RequestPart("models") ModelsDotDTO modelsDotDTO) { + if(Objects.nonNull(file)){ + Assert.isTrue(!StringUtils.isEmpty(file.getOriginalFilename()),"Please select a file!"); + AuthPrincipalVo userInfo = UserContext.getUserHolder(); + //需要宽高和地址参数design + FileVO fileVO = FileUtil.getFileSize(file); + modelsDotDTO.setHigh(fileVO.getHigh()); + modelsDotDTO.setWidth(fileVO.getWidth()); + //存储template临时地址 + String path = calculateTempFileUrl(userInfo.getId()); + File uploadFile = FileUtil.upload(file, path); + modelsDotDTO.setTemplateUrl(calculateTemplateUrl(uploadFile)); + }else{ + Assert.notNull(modelsDotDTO.getLibraryId(),"libraryId cannot be empty!"); + Assert.notNull(modelsDotDTO.getTemplateId(),"templateId cannot be empty!"); + LibraryModelPoint modelPoint = libraryModelPointService.getById(modelsDotDTO.getTemplateId()); + Assert.notNull(modelPoint,"template does not exist!"); + Library library = libraryService.getById(modelsDotDTO.getLibraryId()); + Assert.notNull(library,"library does not exist!"); + modelsDotDTO.setHigh(library.getHigh()); + modelsDotDTO.setWidth(library.getWidth()); + modelsDotDTO.setTemplateUrl(library.getUrl()); + } + Response response =new Response(); + log.info("Models打点预览入参####{}", JSON.toJSONString(modelsDotDTO)); + String url = libraryModelPointService.modelsDot(modelsDotDTO); + response.setData(url); + return response; + } + + private String calculateTempFileUrl(Long userId) { + String rootPath = fileProperties.getSys().getPath(); + String day = DateUtil.dateToStr(new Date(), DateUtil.YYYYMM); + return rootPath + day + File.separator + "tmp" + File.separator + userId + File.separator+ UUID.randomUUID().toString(); + } + private String calculateTemplateUrl(File uploadFile){ + String linuxDomain = fileProperties.getLinuxDomain(); + if (!StringUtils.isEmpty(linuxDomain)) { + //linux 系统 + String oldPath = fileProperties.getSys().getPath(); + return uploadFile.getAbsolutePath().replace(oldPath, linuxDomain); + } + //本地用 +// return "/home/pangkaicheng/python_code/Multi-layer-Virtual-Try-on/dataset_for_test/Img_model.png"; + return "/workspace/python_code/Multi-layer-Virtual-Try-on/dataset_for_test/Img_model.png"; + } + +} diff --git a/src/main/java/com/ai/da/controller/PythonController.java b/src/main/java/com/ai/da/controller/PythonController.java new file mode 100644 index 00000000..f9dbd0f4 --- /dev/null +++ b/src/main/java/com/ai/da/controller/PythonController.java @@ -0,0 +1,67 @@ +package com.ai.da.controller; + +import com.ai.da.common.enums.CollectionLevel1TypeEnum; +import com.ai.da.common.response.Response; +import com.ai.da.common.utils.CopyUtil; +import com.ai.da.common.utils.MD5Utils; +import com.ai.da.model.dto.CollectionDeleteFileDTO; +import com.ai.da.model.dto.CollectionElementUploadDTO; +import com.ai.da.model.dto.CollectionGeneratePrintDTO; +import com.ai.da.model.dto.CollectionSavePrintDTO; +import com.ai.da.model.vo.*; +import com.ai.da.python.PythonService; +import com.ai.da.service.*; +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.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + + +@Api(tags = "python对接模块") +@Slf4j +@RestController +@RequestMapping("/api/python") +public class PythonController { + + @Resource + private PythonService pythonService; + @Resource + private SysFileService sysFileService; + @Resource + private LibraryService libraryService; + + @ApiOperation(value = "python服务保存图片到java服务") + @PostMapping("/saveGeneratePicture") + public Response upload(@RequestParam("file") MultipartFile file, + @ApiParam("操作类型 generatePrint ->生成印花 " + + "designCollection ->设计collection generateAdvancedDesign ->生成高级design") + @RequestParam(value = "operateType") String operateType) { + return Response.success(pythonService.upload(file,operateType)); + } + + @ApiOperation(value = "通过文件类型获取系统文件") + @GetMapping("/getSysFileByLevel2Type") + public Response> getSysFileByLevel2Type(/*@RequestParam(value = "level2Type",required = false) String level2Type*/) { + return Response.success(sysFileService.getByLevel2Type("All")); + } + + @ApiOperation(value = "通过用户id获取library") + @GetMapping("/getLibraryByUserId") + public Response>> getLibraryByUserId(@RequestParam(value = "userId") Long userId) { + List response = CopyUtil.copyList(libraryService.selectByAccountIdAnd1TypeList(userId, + Collections.singletonList(CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName())),PythonLibraryVo.class); + //key转小写 统一 + return Response.success(response.stream().collect(Collectors.groupingBy(v ->v.getLevel2Type().toLowerCase(), + Collectors.mapping(PythonLibraryVo::getUrl,Collectors.toList())))); + } + +} diff --git a/src/main/java/com/ai/da/controller/SavedCollectionController.java b/src/main/java/com/ai/da/controller/SavedCollectionController.java new file mode 100644 index 00000000..0ee870db --- /dev/null +++ b/src/main/java/com/ai/da/controller/SavedCollectionController.java @@ -0,0 +1,125 @@ +package com.ai.da.controller; + +import com.ai.da.common.context.UserContext; +import com.ai.da.common.response.PageBaseResponse; +import com.ai.da.common.response.PageResponse; +import com.ai.da.common.response.Response; +import com.ai.da.common.utils.CopyUtil; +import com.ai.da.mapper.entity.Account; +import com.ai.da.mapper.entity.Collection; +import com.ai.da.mapper.entity.UserLikeGroup; +import com.ai.da.model.dto.*; +import com.ai.da.model.vo.*; +import com.ai.da.service.*; +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.google.common.base.Function; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + + +@Api(tags = "History模块(saved Collection)") +@Slf4j +@RestController +@RequestMapping("/api/history") +public class SavedCollectionController { + @Resource + private UserLikeGroupService userLikeGroupService; + @Resource + private UserLikeService userLikeService; + @Resource + private AccountService accountService; + + @ApiOperation(value = "History用户分页分组列表") + @PostMapping("/queryUserGroup") + public Response> queryUserGroup(@Valid @RequestBody QueryHistoryPageDTO query) { + AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder(); + // 分页数据 + QueryWrapper queryWrapper = new QueryWrapper<>(); + + queryWrapper.eq("account_id", authPrincipalVo.getId()); + if(!StringUtils.isEmpty(query.getCollectionName())){ + queryWrapper.like("name", query.getCollectionName()); + } + if(Objects.nonNull(query.getStartDate())){ + queryWrapper.ge("update_date", new Date(query.getStartDate())); + } + if(Objects.nonNull(query.getEndDate())){ + queryWrapper.le("update_date", new Date(query.getEndDate())); + } + queryWrapper.orderByDesc("id"); + IPage page = userLikeGroupService.getBaseMapper().selectPage( + new Page<>(query.getPage(), query.getSize()), queryWrapper); + if(CollectionUtils.isEmpty(page.getRecords())){ + return Response.success(PageBaseResponse.success(new Page<>())); + } + List groupIds = page.getRecords().stream().map(UserLikeGroup::getId).collect(Collectors.toList()); + List groupDetails = userLikeService.getGroupDetails(groupIds); + Assert.notEmpty(groupDetails,"History detail does not exist!"); + Map> groupDetailMap = groupDetails.stream() + .collect(Collectors.groupingBy(UserLikeVO::getUserLikeGroupId)); + + Account account = accountService.getById(authPrincipalVo.getId()); + IPage convert = page.convert((Function) group -> { + if(group != null){ + UserLikeGroupVO userLikeGroupVO = CopyUtil.copyObject(group,UserLikeGroupVO.class); + userLikeGroupVO.setUpdateDate(group.getUpdateDate().getTime()); + userLikeGroupVO.setAuthor(account.getUserName()); + //count 和detail + List details = groupDetailMap.get(group.getId()); + userLikeGroupVO.setGroupDetails(details); + userLikeGroupVO.setSketchCount(CollectionUtils.isEmpty(details) ? 0 :details.size()); + return userLikeGroupVO; + } + return null; + }); + return Response.success(PageBaseResponse.success(convert)); + } + + @ApiOperation(value = "History用户分组详情,目前弃用 ") + @GetMapping("/getUserGroupDetail") + public Response> getUserGroupDetail( + @ApiParam("用户分组id") @RequestParam("userGroupId") Long userGroupId) { + return Response.success(userLikeService.getGroupDetail(userGroupId)); + } + + @ApiOperation(value = "History修改用户分组名") + @PostMapping("/updateUserGroupName") + public Response updateUserGroupName(@Valid @RequestBody HistoryUpdateDTO historyUpdateDTO) { + return Response.success(userLikeGroupService.updateUserGroupName(historyUpdateDTO.getUserGroupId() + ,historyUpdateDTO.getUserGroupName(),historyUpdateDTO.getTimeZone())); + } + + @ApiOperation(value = "History删除用户分组") + @PostMapping("/deleteUserGroup") + public Response deleteUserGroup(@Valid @RequestBody HistoryDeleteDTO deleteDTO) { + userLikeGroupService.deleteUserGroup(deleteDTO.getUserGroupId()); + userLikeService.deleteByUserGroupId(deleteDTO.getUserGroupId()); + return Response.success(Boolean.TRUE); + } + + @ApiOperation(value = "History choose") + @GetMapping("/choose") + public Response choose( + @ApiParam("用户分组id") @RequestParam("userGroupId") Long userGroupId) { + return Response.success(userLikeGroupService.choose(userGroupId)); + } + +} diff --git a/src/main/java/com/ai/da/controller/ThirdPartyController.java b/src/main/java/com/ai/da/controller/ThirdPartyController.java new file mode 100644 index 00000000..c9edb851 --- /dev/null +++ b/src/main/java/com/ai/da/controller/ThirdPartyController.java @@ -0,0 +1,40 @@ +package com.ai.da.controller; + +import com.ai.da.common.response.Response; +import com.ai.da.model.dto.*; +import com.ai.da.model.vo.AccountLoginVO; +import com.ai.da.service.AccountService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; + + +@Api(tags = "Third Party Modules") +@Slf4j +@RestController +@RequestMapping("/api/third/party") +public class ThirdPartyController { + + @Resource + private AccountService accountService; + + @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)); + } +} diff --git a/src/main/java/com/ai/da/mapper/AccountLoginLogMapper.java b/src/main/java/com/ai/da/mapper/AccountLoginLogMapper.java new file mode 100644 index 00000000..46d6e221 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/AccountLoginLogMapper.java @@ -0,0 +1,17 @@ +package com.ai.da.mapper; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.entity.Account; +import com.ai.da.mapper.entity.AccountLoginLog; + +import java.util.List; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface AccountLoginLogMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/AccountMapper.java b/src/main/java/com/ai/da/mapper/AccountMapper.java new file mode 100644 index 00000000..dc8cb900 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/AccountMapper.java @@ -0,0 +1,32 @@ +package com.ai.da.mapper; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.entity.Account; + +import java.util.List; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface AccountMapper extends CommonMapper { + + /** + * 手机号批量查询 + * + * @param phoneList + * @return + */ + List findByPhoneList(List phoneList); + + /** + * 主键查询 + * + * @param id + * @return + */ + Account findById(String id); + +} diff --git a/src/main/java/com/ai/da/mapper/CollectionElementMapper.java b/src/main/java/com/ai/da/mapper/CollectionElementMapper.java new file mode 100644 index 00000000..0c8a0613 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/CollectionElementMapper.java @@ -0,0 +1,16 @@ +package com.ai.da.mapper; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.entity.CollectionElement; + +import java.util.List; + +/** + * Mapper 接口 + * + * @author yanglei + * @since 2022-10-13 + */ +public interface CollectionElementMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/CollectionMapper.java b/src/main/java/com/ai/da/mapper/CollectionMapper.java new file mode 100644 index 00000000..582de4ef --- /dev/null +++ b/src/main/java/com/ai/da/mapper/CollectionMapper.java @@ -0,0 +1,18 @@ +package com.ai.da.mapper; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.entity.Account; +import com.ai.da.mapper.entity.Collection; + +import java.util.List; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface CollectionMapper extends CommonMapper { + //返回插入数据后生成的主键 + Long insertCollection(Collection collection); +} diff --git a/src/main/java/com/ai/da/mapper/ColorLoopUpTableMapper.java b/src/main/java/com/ai/da/mapper/ColorLoopUpTableMapper.java new file mode 100644 index 00000000..9dcd8892 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/ColorLoopUpTableMapper.java @@ -0,0 +1,14 @@ +package com.ai.da.mapper; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.entity.ColorLookupTable; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-09-30 + */ +public interface ColorLoopUpTableMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/DesignHistoryMapper.java b/src/main/java/com/ai/da/mapper/DesignHistoryMapper.java new file mode 100644 index 00000000..65ad15c2 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/DesignHistoryMapper.java @@ -0,0 +1,15 @@ +package com.ai.da.mapper; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.entity.AccountLoginLog; +import com.ai.da.mapper.entity.DesignHistory; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface DesignHistoryMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/DesignItemDetailMapper.java b/src/main/java/com/ai/da/mapper/DesignItemDetailMapper.java new file mode 100644 index 00000000..6d299294 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/DesignItemDetailMapper.java @@ -0,0 +1,15 @@ +package com.ai.da.mapper; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.entity.DesignItem; +import com.ai.da.mapper.entity.DesignItemDetail; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface DesignItemDetailMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/DesignItemMapper.java b/src/main/java/com/ai/da/mapper/DesignItemMapper.java new file mode 100644 index 00000000..26222874 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/DesignItemMapper.java @@ -0,0 +1,16 @@ +package com.ai.da.mapper; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.entity.Design; +import com.ai.da.mapper.entity.DesignItem; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface DesignItemMapper extends CommonMapper { + + Long insertDesignItem(DesignItem designItem); +} diff --git a/src/main/java/com/ai/da/mapper/DesignMapper.java b/src/main/java/com/ai/da/mapper/DesignMapper.java new file mode 100644 index 00000000..31fc4a18 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/DesignMapper.java @@ -0,0 +1,17 @@ +package com.ai.da.mapper; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.entity.Collection; +import com.ai.da.mapper.entity.Design; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface DesignMapper extends CommonMapper { + + //返回插入数据后生成的主键 + Long insertDesign(Design design); +} diff --git a/src/main/java/com/ai/da/mapper/LibraryMapper.java b/src/main/java/com/ai/da/mapper/LibraryMapper.java new file mode 100644 index 00000000..6e438d74 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/LibraryMapper.java @@ -0,0 +1,15 @@ +package com.ai.da.mapper; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.entity.Design; +import com.ai.da.mapper.entity.Library; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface LibraryMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/LibraryModelPointMapper.java b/src/main/java/com/ai/da/mapper/LibraryModelPointMapper.java new file mode 100644 index 00000000..c1cfd1ba --- /dev/null +++ b/src/main/java/com/ai/da/mapper/LibraryModelPointMapper.java @@ -0,0 +1,15 @@ +package com.ai.da.mapper; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.entity.LibraryModelPoint; +import com.ai.da.mapper.entity.SysFile; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-11-11 + */ +public interface LibraryModelPointMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/PanToneMapper.java b/src/main/java/com/ai/da/mapper/PanToneMapper.java new file mode 100644 index 00000000..a83be55a --- /dev/null +++ b/src/main/java/com/ai/da/mapper/PanToneMapper.java @@ -0,0 +1,20 @@ +package com.ai.da.mapper; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.entity.PanTone; +import com.ai.da.model.dto.GetRgbByHsvBatchDTO; +import io.swagger.v3.oas.annotations.Parameter; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface PanToneMapper extends CommonMapper { + + List getRgbByHsvBatch(@Param("rgbByHsvBatch") List rgbByHsvBatch); +} diff --git a/src/main/java/com/ai/da/mapper/SysFileMapper.java b/src/main/java/com/ai/da/mapper/SysFileMapper.java new file mode 100644 index 00000000..ab4d995d --- /dev/null +++ b/src/main/java/com/ai/da/mapper/SysFileMapper.java @@ -0,0 +1,15 @@ +package com.ai.da.mapper; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.entity.Design; +import com.ai.da.mapper.entity.SysFile; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-10-6 + */ +public interface SysFileMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/UserLikeGroupMapper.java b/src/main/java/com/ai/da/mapper/UserLikeGroupMapper.java new file mode 100644 index 00000000..df5f4629 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/UserLikeGroupMapper.java @@ -0,0 +1,16 @@ +package com.ai.da.mapper; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.entity.Design; +import com.ai.da.mapper.entity.UserLikeGroup; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface UserLikeGroupMapper extends CommonMapper { + //返回插入数据后生成的主键 + Long insertUserLikeGroup(UserLikeGroup userLikeGroup); +} diff --git a/src/main/java/com/ai/da/mapper/UserLikeMapper.java b/src/main/java/com/ai/da/mapper/UserLikeMapper.java new file mode 100644 index 00000000..35ae30df --- /dev/null +++ b/src/main/java/com/ai/da/mapper/UserLikeMapper.java @@ -0,0 +1,14 @@ +package com.ai.da.mapper; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.entity.UserLike; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface UserLikeMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/entity/Account.java b/src/main/java/com/ai/da/mapper/entity/Account.java new file mode 100644 index 00000000..49a6e5bc --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/Account.java @@ -0,0 +1,67 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_account") +public class Account implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 邮箱 + */ + private String userEmail; + + /** + * 用户名 + */ + private String userName; + + /** + * 密码 + */ + private String userPassword; + + /** + * 账户有效期开始时间 + */ + private Long validStartTime; + + /** + * 账户有效期结束时间 + */ + private Long validEndTime; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/AccountLoginLog.java b/src/main/java/com/ai/da/mapper/entity/AccountLoginLog.java new file mode 100644 index 00000000..9218813e --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/AccountLoginLog.java @@ -0,0 +1,53 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 账户登入日志 + * + * @author yl + * @since 2022-09-03 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_account_login_log") +public class AccountLoginLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 账户id + */ + private Long accountId; + + /** + * ip + */ + private String ip; + + /** + * ip地址 + */ + private String ipAddr; + + /** + * 创建时间 + */ + private Date createDate; + +} diff --git a/src/main/java/com/ai/da/mapper/entity/Collection.java b/src/main/java/com/ai/da/mapper/entity/Collection.java new file mode 100644 index 00000000..544068c6 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/Collection.java @@ -0,0 +1,54 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_collection") +public class Collection implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户ID + * + */ + private Long accountId; + + /** + * mood模板id + */ + private String moodTemplateId; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/CollectionElement.java b/src/main/java/com/ai/da/mapper/entity/CollectionElement.java new file mode 100644 index 00000000..ef291e37 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/CollectionElement.java @@ -0,0 +1,86 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_collection_element") +public class CollectionElement implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户ID + * + */ + private Long accountId; + /** + * collectionId + */ + private Long collectionId; + + /** + * 一级类型 + */ + private String level1Type; + + /** + * 二级类型 + */ + private String level2Type; + + /** + * 元素名(如果是颜色board 存潘通id+潘通名字 形式 ""11_mds") + */ + private String name; + + /** + * 元素存放地址 + */ + private String url; + /** + * 是否pin 1pin 0 不pin + */ + @TableField("is_pin") + private Byte hasPin; + /** + * 颜色的rgb值 空格分割 + */ + private String colorRgb; + /** + * md5值 + */ + private String md5; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/ColorLookupTable.java b/src/main/java/com/ai/da/mapper/entity/ColorLookupTable.java new file mode 100644 index 00000000..b26cec78 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/ColorLookupTable.java @@ -0,0 +1,35 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-09-30 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("color_lookup_table") +public class ColorLookupTable implements Serializable { + + private static final long serialVersionUID = 1L; + /** + * colorValue + */ + private Integer colorValue; + + /** + * color_index + */ + private Integer colorIndex; +} diff --git a/src/main/java/com/ai/da/mapper/entity/Design.java b/src/main/java/com/ai/da/mapper/entity/Design.java new file mode 100644 index 00000000..72778eca --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/Design.java @@ -0,0 +1,71 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_design") +public class Design implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 用户ID + */ + private Long accountId; + /** + * collectionId + */ + private Long collectionId; + /** + * 模特id + */ + private Long templateId; + + /** + * system scale值 + */ + private BigDecimal systemScale; + + /** + * 控制生成类型的参数,两个选项:“overall”或“single” + */ + private String singleOverall; + + /** + * single模式下的类别选择参数 选项有outwear,dress,blouse,skirt,trousers + */ + private String switchCategory; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/DesignHistory.java b/src/main/java/com/ai/da/mapper/entity/DesignHistory.java new file mode 100644 index 00000000..2d959f74 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/DesignHistory.java @@ -0,0 +1,56 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_design_history") +public class DesignHistory implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 用户ID + * + */ + private Long accountId; + + /** + * collectionId + */ + private Long collectionId; + + /** + * md5值 + */ + private String md5; + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/DesignItem.java b/src/main/java/com/ai/da/mapper/entity/DesignItem.java new file mode 100644 index 00000000..5e0465e0 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/DesignItem.java @@ -0,0 +1,75 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_design_item") +public class DesignItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 用户ID + */ + private Long accountId; + /** + * collectionId + */ + private Long collectionId; + /** + * designId + */ + private Long designId; + + /** + * print scale值 + */ + private String printScale; + + /** + * design后的用户文件地址(python 返回) + */ + private String designUrl; + + /** + * 二次(高级,基础design的图再次design)design后的用户文件地址(python 返回) + */ + private String highDesignUrl; + /** + * 是否like 0 否 1是 + */ + @TableField("is_like") + private Byte hasLike; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/DesignItemDetail.java b/src/main/java/com/ai/da/mapper/entity/DesignItemDetail.java new file mode 100644 index 00000000..357f8a1a --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/DesignItemDetail.java @@ -0,0 +1,96 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_design_item_detail") +public class DesignItemDetail implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 用户ID + */ + private Long accountId; + + /** + * designId + */ + private Long designId; + + /** + * designItemId + */ + private Long designItemId; + + /** + * elemntId + */ + private Long collectionElementId; + + /** + * 生成item实际对应的类型 有:outwear,dress,blouse,skirt,trousers Shoes Hairstyle Earring Body + */ + private String type; + + /** + * 对应的图片的绝对路径 + */ + private String path; + + /** + * 颜色 存 RGB值 中间空格分隔 比如 "58 58 169" + */ + private String color; + + /** + * 对应的print图片的绝对路径 + */ + private String printPath; + + /** + * 对应的icon的绝对路径 + */ + private String iconPath; + + /** + * 对应上游业务id + */ + private Long businessId; + + /** + * 存储print打点的的参数json对象 + */ + private String printJson; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/Library.java b/src/main/java/com/ai/da/mapper/entity/Library.java new file mode 100644 index 00000000..fa0b458d --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/Library.java @@ -0,0 +1,81 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_library") +public class Library implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户ID + * + */ + private Long accountId; + + /** + * 一级类型 + */ + private String level1Type; + + /** + * 二级类型 + */ + private String level2Type; + + /** + * 元素名 + */ + private String name; + + /** + * 元素存放地址 + */ + private String url; + /** + * md5值 + */ + private String md5; + /** + * 图片高度,目前只争对 models类型 + */ + private Integer high; + /** + * 图片宽度,目前只争对 models类型 + */ + private Integer width; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/LibraryModelPoint.java b/src/main/java/com/ai/da/mapper/entity/LibraryModelPoint.java new file mode 100644 index 00000000..f460295b --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/LibraryModelPoint.java @@ -0,0 +1,76 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-11-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_library_model_point") +public class LibraryModelPoint implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 关联的 libraryId + */ + private Long libraryId; + + /** + * 左肩 + */ + private String shoulderLeft; + + /** + * 右肩 + */ + private String shoulderRight; + + /** + * 左腰 + */ + private String waistbandLeft; + + /** + * 右腰 + */ + private String waistbandRight; + /** + * 左手 + */ + private String handLeft; + + /** + * 右手 + */ + private String handRight; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/PanTone.java b/src/main/java/com/ai/da/mapper/entity/PanTone.java new file mode 100644 index 00000000..0b3f9641 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/PanTone.java @@ -0,0 +1,71 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("pantone") +public class PanTone implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * pantone_index + */ + private Integer pantoneIndex; + + /** + * name + */ + private String name; + + /** + * TCX + */ + private String tcx; + + /** + * R + */ + private Integer r; + + /** + * G + */ + private Integer g; + + /** + * B + */ + private Integer b; + + /** + * H + */ + private Integer h; + + /** + * S + */ + private Integer s; + + /** + *V + */ + private Integer v; +} diff --git a/src/main/java/com/ai/da/mapper/entity/SysFile.java b/src/main/java/com/ai/da/mapper/entity/SysFile.java new file mode 100644 index 00000000..ce89ffe3 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/SysFile.java @@ -0,0 +1,69 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_sys_file") +public class SysFile implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 一级类型 accessories icon Images + */ + private String level1Type; + + /** + * 二级类型 目前有outwear,dress,blouse,skirt,trousers Shoes Hairstyle Earring + */ + private String level2Type; + + /** + * 名字 + * + */ + private String name; + + /** + * md5值 + * + */ + private String md5; + /** + * 路径 绝对路径 + * + */ + private String url; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/UserLike.java b/src/main/java/com/ai/da/mapper/entity/UserLike.java new file mode 100644 index 00000000..34dbe0cf --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/UserLike.java @@ -0,0 +1,58 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * UserLikeGroup + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_user_like") +public class UserLike implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 关联的用户收藏分组 ID + */ + private Long userLikeGroupId; + /** + * 关联的design ID + */ + private Long designId; + /** + * 关联的design_item ID + */ + private Long designItemId; + /** + * 图片地址 + */ + private String url; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/UserLikeGroup.java b/src/main/java/com/ai/da/mapper/entity/UserLikeGroup.java new file mode 100644 index 00000000..496cf9ab --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/UserLikeGroup.java @@ -0,0 +1,55 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * UserLikeGroup + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_user_like_group") +public class UserLikeGroup implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 用户ID + */ + private Long accountId; + /** + * collectionId + */ + private Long collectionId; + + /** + * 用户收藏分组表 + */ + private String name; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/model/dto/AccountAddDTO.java b/src/main/java/com/ai/da/model/dto/AccountAddDTO.java new file mode 100644 index 00000000..d81ec689 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/AccountAddDTO.java @@ -0,0 +1,30 @@ +package com.ai.da.model.dto; + +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("AccountAdd") +public class AccountAddDTO { + + @NotBlank(message = "email cannot be empty!") + @ApiModelProperty("email") + private String email; + + @NotBlank(message = "userName cannot be empty!") + @ApiModelProperty("userName") + private String userName; + + @NotBlank(message = "validStartTime cannot be empty!") + @ApiModelProperty("Start time of account validity ") + private String validStartTime; + + @NotBlank(message = "validEndTime cannot be empty!") + @ApiModelProperty("End time of account validity ") + private String validEndTime; + +} diff --git a/src/main/java/com/ai/da/model/dto/AccountBindEmailDTO.java b/src/main/java/com/ai/da/model/dto/AccountBindEmailDTO.java new file mode 100644 index 00000000..b9cdce36 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/AccountBindEmailDTO.java @@ -0,0 +1,25 @@ +package com.ai.da.model.dto; + +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 AccountBindEmailDTO { + + @NotNull(message = "userId cannot be empty!") + @ApiModelProperty("用户id") + private Long userId; + + @NotBlank(message = "Please input email!") + @ApiModelProperty("邮箱") + private String userEmail; + + @NotBlank(message = "Please input the email verification code !") + @ApiModelProperty("邮箱验证码") + private String emailVerifyCode; +} diff --git a/src/main/java/com/ai/da/model/dto/AccountEditDTO.java b/src/main/java/com/ai/da/model/dto/AccountEditDTO.java new file mode 100644 index 00000000..1338d1a2 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/AccountEditDTO.java @@ -0,0 +1,38 @@ +package com.ai.da.model.dto; + +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 { + + @ApiModelProperty("Old user email") + private String oldEmail; + + @ApiModelProperty("New user email") + private String newEmail; + + @ApiModelProperty("Old user name") + private String oldUserName; + + @ApiModelProperty("New user name") + private String newUserName; + + @ApiModelProperty("Start time of the new account validity period") + private String newValidStartTime; + + @ApiModelProperty("Start time of the old account validity period") + private String oldValidStartTime; + + @ApiModelProperty("End time of the new account validity period") + private String newValidEndTime; + + @ApiModelProperty("End time of the old account validity period") + private String oldValidEndTime; + +} diff --git a/src/main/java/com/ai/da/model/dto/AccountLoginDTO.java b/src/main/java/com/ai/da/model/dto/AccountLoginDTO.java new file mode 100644 index 00000000..8c8b1585 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/AccountLoginDTO.java @@ -0,0 +1,35 @@ +package com.ai.da.model.dto; + +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 { + + @NotNull(message = "userId cannot be empty !") + @ApiModelProperty("userId") + private Long userId; + + @NotBlank(message = "Please input email !") + @ApiModelProperty("邮箱") + private String email; + + @ApiModelProperty("用户名") + private String userName; + + @ApiModelProperty("密码") + private String password; + + @NotBlank(message = "Please input loginType !") + @ApiModelProperty("登入类型 EMAIL - >邮箱 , PASSWORD ->密码") + private String loginType; + + @ApiModelProperty("邮箱验证码") + private String emailVerifyCode; + +} diff --git a/src/main/java/com/ai/da/model/dto/AccountLogoutDTO.java b/src/main/java/com/ai/da/model/dto/AccountLogoutDTO.java new file mode 100644 index 00000000..56c4a5d5 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/AccountLogoutDTO.java @@ -0,0 +1,18 @@ +package com.ai.da.model.dto; + +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 AccountLogoutDTO { + + @NotNull(message = "userId cannot be empty !") + @ApiModelProperty("userId") + private Long userId; + +} diff --git a/src/main/java/com/ai/da/model/dto/AccountPreLoginDTO.java b/src/main/java/com/ai/da/model/dto/AccountPreLoginDTO.java new file mode 100644 index 00000000..acb07219 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/AccountPreLoginDTO.java @@ -0,0 +1,20 @@ +package com.ai.da.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +@ApiModel("预先登入") +public class AccountPreLoginDTO { + + @NotBlank(message = "userName cannot be empty!") + @ApiModelProperty("用户名") + private String userName; + + @NotBlank(message = "password cannot be empty!") + @ApiModelProperty("密码") + private String password; +} diff --git a/src/main/java/com/ai/da/model/dto/AccountRegisterDTO.java b/src/main/java/com/ai/da/model/dto/AccountRegisterDTO.java new file mode 100644 index 00000000..7a8271b7 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/AccountRegisterDTO.java @@ -0,0 +1,25 @@ +package com.ai.da.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +@ApiModel("账户") +public class AccountRegisterDTO { + + @NotBlank(message = "Please input email !") + @ApiModelProperty("邮箱") + private String email; + + @NotBlank(message = "Please input password !") + @ApiModelProperty("密码") + private String password; + + @NotBlank(message = "Please input the email verification code !") + @ApiModelProperty("邮箱验证码") + private String emailVerifyCode; + +} diff --git a/src/main/java/com/ai/da/model/dto/CollectionColorDTO.java b/src/main/java/com/ai/da/model/dto/CollectionColorDTO.java new file mode 100644 index 00000000..4ac1794a --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/CollectionColorDTO.java @@ -0,0 +1,28 @@ +package com.ai.da.model.dto; + +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; + +@Data +@ApiModel("设计Collection颜色板 入参") +public class CollectionColorDTO { + + @ApiModelProperty("潘通id") + private Integer id; + + @ApiModelProperty("潘通名字") + private String name; + + @ApiModelProperty("tcx值") + private String tcx; + + @NotBlank(message = "rgb value cannot be empty") + @ApiModelProperty("潘通RGB值") + private String rgbValue; + +} diff --git a/src/main/java/com/ai/da/model/dto/CollectionDeleteFileDTO.java b/src/main/java/com/ai/da/model/dto/CollectionDeleteFileDTO.java new file mode 100644 index 00000000..d3137106 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/CollectionDeleteFileDTO.java @@ -0,0 +1,17 @@ +package com.ai.da.model.dto; + +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 CollectionDeleteFileDTO { + + @NotNull(message = "file id cannot be empty!") + @ApiModelProperty("文件id") + private Long id; +} diff --git a/src/main/java/com/ai/da/model/dto/CollectionElementUploadDTO.java b/src/main/java/com/ai/da/model/dto/CollectionElementUploadDTO.java new file mode 100644 index 00000000..4a222b28 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/CollectionElementUploadDTO.java @@ -0,0 +1,30 @@ +package com.ai.da.model.dto; + +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 java.util.Date; + +@Data +@ApiModel("文件上传") +@AllArgsConstructor +public class CollectionElementUploadDTO { + + @NotNull(message = "文件不能为空!") + private MultipartFile file; + + @ApiModelProperty("一级类型") + private String level1Type; + + @ApiModelProperty("时区") + private String timeZone; + + @ApiModelProperty("md5") + private String md5; +} diff --git a/src/main/java/com/ai/da/model/dto/CollectionGeneratePrintDTO.java b/src/main/java/com/ai/da/model/dto/CollectionGeneratePrintDTO.java new file mode 100644 index 00000000..aae8f11d --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/CollectionGeneratePrintDTO.java @@ -0,0 +1,25 @@ +package com.ai.da.model.dto; + +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 CollectionGeneratePrintDTO { + + @NotNull(message = "file select2Id cannot be empty!") + @ApiModelProperty("选择的第一个print文件id") + private Long select1Id; + + @NotNull(message = "file select2Id cannot be empty!") + @ApiModelProperty("选择的第一个print文件id") + private Long select2Id; + + @NotBlank(message = "timeZone cannot be empty!") + @ApiModelProperty("本地时区,比如 'Asia/Tokyo' 东京时间 , 'Asia/Shanghai' 北京时间 由js本地获取") + private String timeZone; +} diff --git a/src/main/java/com/ai/da/model/dto/CollectionSavePrintDTO.java b/src/main/java/com/ai/da/model/dto/CollectionSavePrintDTO.java new file mode 100644 index 00000000..3ad544e2 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/CollectionSavePrintDTO.java @@ -0,0 +1,25 @@ +package com.ai.da.model.dto; + +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 java.util.List; + +@Data +@ApiModel("印花保存") +public class CollectionSavePrintDTO { + + @ApiModelProperty("生成的印花绝对路径") + @Size(max = 15, message = "Save up to 15 prints at a time!") + @NotEmpty(message = "printId cannot be empty!") + private List printId; + + @NotBlank(message = "timeZone cannot be empty!") + @ApiModelProperty("本地时区,比如 'Asia/Tokyo' 东京时间 , 'Asia/Shanghai' 北京时间 由js本地获取") + private String timeZone; + +} diff --git a/src/main/java/com/ai/da/model/dto/CollectionSketchDTO.java b/src/main/java/com/ai/da/model/dto/CollectionSketchDTO.java new file mode 100644 index 00000000..ee5a54ab --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/CollectionSketchDTO.java @@ -0,0 +1,29 @@ +package com.ai.da.model.dto; + +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 CollectionSketchDTO { + + @ApiModelProperty("sketchBoardId 元素id") + private Long sketchBoardId; + + @NotNull(message = "isPin cannot be empty") + @ApiModelProperty("是否pin 1 pin 0 不pin") + private Byte isPin; + + @NotBlank(message = "level2Type cannot be empty") + @ApiModelProperty("二级类型 Outwear Dress Blouse Skirt Trousers") + private String level2Type; + + @NotBlank(message = "designType cannot be empty") + @ApiModelProperty("design类型 用户design生成时候区别library和collection") + private String designType; + +} diff --git a/src/main/java/com/ai/da/model/dto/DesignAttributeRetrievalDTO.java b/src/main/java/com/ai/da/model/dto/DesignAttributeRetrievalDTO.java new file mode 100644 index 00000000..a54ee557 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/DesignAttributeRetrievalDTO.java @@ -0,0 +1,23 @@ +package com.ai.da.model.dto; + +import com.google.common.collect.Lists; +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 +@ApiModel("DesignAttributeRetrievalDTO 入参") +public class DesignAttributeRetrievalDTO { + + @ApiModelProperty("library图片 数组") + private List libraryUrls = Lists.newArrayList(); + + @ApiModelProperty("sysFile图片 数组") + private List sysFileUrlS= Lists.newArrayList(); +} diff --git a/src/main/java/com/ai/da/model/dto/DesignCollectionDTO.java b/src/main/java/com/ai/da/model/dto/DesignCollectionDTO.java new file mode 100644 index 00000000..e647e643 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/DesignCollectionDTO.java @@ -0,0 +1,53 @@ +package com.ai.da.model.dto; + +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 +@ApiModel("设计Collection 入参") +public class DesignCollectionDTO { + + @ApiModelProperty("情绪板图片 数组") + private List moodBoards; + + @ApiModelProperty("印花板图片 数组") + private List printBoards; + + @NotEmpty(message = "colorBoardRgbValues cannot be empty!") + @ApiModelProperty("颜色板RGB值 数组") + private List colorBoards; + + @ApiModelProperty("手稿板图片id 数组") + private List sketchBoards; + + @ApiModelProperty("市场手稿板图片id 数组") + private List marketingSketchs; + + @NotNull(message = "systemScale cannot be empty!") + @ApiModelProperty("系统取图比列") + private BigDecimal systemScale; + + @ApiModelProperty("templateId") + private Long templateId; + + @ApiModelProperty("mood版本id 没有传null") + private String moodTemplateId; + + @NotBlank(message = "singleOverall cannot be empty!") + @ApiModelProperty("控制生成类型的参数,两个选项:outfit时候传 single , 另外一个传 overall") + private String singleOverall; + + @ApiModelProperty("single模式下的类别选择参数 选项有outwear,dress,blouse,skirt,trousers") + private String switchCategory; + + @NotBlank(message = "timeZone cannot be empty!") + @ApiModelProperty("本地时区,比如 'Asia/Tokyo' 东京时间 , 'Asia/Shanghai' 北京时间 由js本地获取") + private String timeZone; +} diff --git a/src/main/java/com/ai/da/model/dto/DesignCollectionElementDTO.java b/src/main/java/com/ai/da/model/dto/DesignCollectionElementDTO.java new file mode 100644 index 00000000..0d0e6d1b --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/DesignCollectionElementDTO.java @@ -0,0 +1,20 @@ +package com.ai.da.model.dto; + +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 { + + @ApiModelProperty("元素id") + private Long id; + + @ApiModelProperty("design类型 用户design生成时候区别library和collection") + private String designType; + +} diff --git a/src/main/java/com/ai/da/model/dto/DesignCollectionPrintElementDTO.java b/src/main/java/com/ai/da/model/dto/DesignCollectionPrintElementDTO.java new file mode 100644 index 00000000..18853d95 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/DesignCollectionPrintElementDTO.java @@ -0,0 +1,20 @@ +package com.ai.da.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("设计Collection element print 入参") +public class DesignCollectionPrintElementDTO { + + @ApiModelProperty("元素id") + private Long id; + + @ApiModelProperty("design类型 用户design生成时候区别library和collection") + private String designType; + + @ApiModelProperty("是否pin 1 pin 0 不pin") + private Byte isPin; + +} diff --git a/src/main/java/com/ai/da/model/dto/DesignLikeDTO.java b/src/main/java/com/ai/da/model/dto/DesignLikeDTO.java new file mode 100644 index 00000000..f68aa48e --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/DesignLikeDTO.java @@ -0,0 +1,25 @@ +package com.ai.da.model.dto; + +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; + +@Data +@ApiModel("Design like 入参") +public class DesignLikeDTO { + + @NotNull(message = "designItemId id cannot be empty!") + @ApiModelProperty("like图片对应的designItemId") + private Long designItemId; + + @ApiModelProperty("like design到对应collection 对应的userGroupId,不传表示selected collection 为null") + private Long userGroupId; + + @NotBlank(message = "timeZone cannot be empty!") + @ApiModelProperty("本地时区,比如 'Asia/Tokyo' 东京时间 , 'Asia/Shanghai' 北京时间 由js本地获取") + private String timeZone; +} diff --git a/src/main/java/com/ai/da/model/dto/DesignSingleDTO.java b/src/main/java/com/ai/da/model/dto/DesignSingleDTO.java new file mode 100644 index 00000000..2eece106 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/DesignSingleDTO.java @@ -0,0 +1,33 @@ +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 java.util.List; + +@Data +public class DesignSingleDTO { + + @ApiModelProperty("designItemId") + @NotNull(message = "designItemId cannot be empty!") + private Long designItemId; + + @ApiModelProperty("priority 数组,列表中包含服饰的顺序,越右边的表示越外层的衣服 例如[\"Outwear\", \"Dress\"]表示outwear在dress里面") + @NotEmpty(message = "priority cannot be empty!") + private List priority; + + @NotEmpty(message = "clothes cannot be empty!") + @ApiModelProperty("clothes 元素") + private List clothes; + + @ApiModelProperty("others 元素") + private List others; + + @NotBlank(message = "timeZone cannot be empty!") + @ApiModelProperty("本地时区,比如 'Asia/Tokyo' 东京时间 , 'Asia/Shanghai' 北京时间 由js本地获取") + private String timeZone; + +} diff --git a/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java b/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java new file mode 100644 index 00000000..97cbd61f --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java @@ -0,0 +1,29 @@ +package com.ai.da.model.dto; + +import com.ai.da.python.vo.DesignPythonItemPrint; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class DesignSingleItemDTO { + + @NotBlank(message = "id cannot be empty!") + @ApiModelProperty("切换图片对应的id") + private Long id; + + @NotBlank(message = "type cannot be empty!") + @ApiModelProperty("生成item实际对应的类型 有:outwear,dress,blouse,skirt,trousers Shoes Hairstyle Earring") + private String type; + + @NotBlank(message = "path cannot be empty!") + @ApiModelProperty("对应的图片的绝对路径") + private String path; + + @ApiModelProperty("颜色 存 RGB值 中间空格分隔 比如 \"58 58 169\"") + private String color; + + @ApiModelProperty("对应的print图片对象") + private DesignPythonItemPrint printObject; +} diff --git a/src/main/java/com/ai/da/model/dto/DisDesignLikeDTO.java b/src/main/java/com/ai/da/model/dto/DisDesignLikeDTO.java new file mode 100644 index 00000000..0b1bce92 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/DisDesignLikeDTO.java @@ -0,0 +1,25 @@ +package com.ai.da.model.dto; + +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("Design dislike 入参") +public class DisDesignLikeDTO { + + @NotNull(message = "groupDetailId id cannot be empty!") + @ApiModelProperty("dislike图片对应的分组详情id") + private Long groupDetailId; + + @NotNull(message = "designId id cannot be empty!") + @ApiModelProperty("dislike图片到对应的designId中") + private Long designId; + + @NotBlank(message = "timeZone cannot be empty!") + @ApiModelProperty("本地时区,比如 'Asia/Tokyo' 东京时间 , 'Asia/Shanghai' 北京时间 由js本地获取") + private String timeZone; +} diff --git a/src/main/java/com/ai/da/model/dto/EmailSendDTO.java b/src/main/java/com/ai/da/model/dto/EmailSendDTO.java new file mode 100644 index 00000000..50cfc680 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/EmailSendDTO.java @@ -0,0 +1,24 @@ +package com.ai.da.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +@ApiModel("邮箱发送") +public class EmailSendDTO { + + @NotBlank(message = "Please input email!") + @ApiModelProperty("邮箱") + private String email; + + @NotBlank(message = "operationType cannot be empty") + @ApiModelProperty("操作类型 LOGIN 注册 FORGET_PWD 忘记密码 BIND_MAILBOX 绑定邮箱") + private String operationType; + + @ApiModelProperty("异常ip") + private String ip; + +} diff --git a/src/main/java/com/ai/da/model/dto/GenerateHighDesignDTO.java b/src/main/java/com/ai/da/model/dto/GenerateHighDesignDTO.java new file mode 100644 index 00000000..d7c8eea5 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/GenerateHighDesignDTO.java @@ -0,0 +1,21 @@ +package com.ai.da.model.dto; + +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("生成高级design 入参") +public class GenerateHighDesignDTO { + + @NotNull(message = "designItem id cannot be empty!") + @ApiModelProperty("design的designItemId") + private Long designItemId; + + @NotBlank(message = "timeZone cannot be empty!") + @ApiModelProperty("本地时区,比如 'Asia/Tokyo' 东京时间 , 'Asia/Shanghai' 北京时间 由js本地获取") + private String timeZone; +} diff --git a/src/main/java/com/ai/da/model/dto/GetRgbByHsvBatchDTO.java b/src/main/java/com/ai/da/model/dto/GetRgbByHsvBatchDTO.java new file mode 100644 index 00000000..b011a792 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/GetRgbByHsvBatchDTO.java @@ -0,0 +1,22 @@ +package com.ai.da.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +@ApiModel("根据rgb数组批量获取潘通rgb") +public class GetRgbByHsvBatchDTO { + @NotNull(message = "r cannot be empty!") + @ApiModelProperty("h值") + private Integer h; + @NotNull(message = "g cannot be empty!") + @ApiModelProperty("s值") + private Integer s; + @NotNull(message = "b cannot be empty!") + @ApiModelProperty("v值") + private Integer v; + +} diff --git a/src/main/java/com/ai/da/model/dto/HistoryDeleteDTO.java b/src/main/java/com/ai/da/model/dto/HistoryDeleteDTO.java new file mode 100644 index 00000000..c3ba9d9c --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/HistoryDeleteDTO.java @@ -0,0 +1,20 @@ +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; + +@Data +@ApiModel("History删除") +public class HistoryDeleteDTO { + + @NotNull(message = "userGroupId cannot be empty!") + @ApiModelProperty("history 分组id") + private Long userGroupId; + +} diff --git a/src/main/java/com/ai/da/model/dto/HistoryUpdateDTO.java b/src/main/java/com/ai/da/model/dto/HistoryUpdateDTO.java new file mode 100644 index 00000000..8183fa10 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/HistoryUpdateDTO.java @@ -0,0 +1,28 @@ +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; + +@Data +@ApiModel("History编辑") +public class HistoryUpdateDTO { + + @NotNull(message = "userGroupId cannot be empty!") + @ApiModelProperty("history 分组id") + private Long userGroupId; + + @NotBlank(message = "userGroupName cannot be empty!") + @ApiModelProperty("history 分组名称") + private String userGroupName; + + @NotBlank(message = "timeZone cannot be empty!") + @ApiModelProperty("本地时区,比如 'Asia/Tokyo' 东京时间 , 'Asia/Shanghai' 北京时间 由js本地获取") + private String timeZone; + +} diff --git a/src/main/java/com/ai/da/model/dto/LibraryDeleteDTO.java b/src/main/java/com/ai/da/model/dto/LibraryDeleteDTO.java new file mode 100644 index 00000000..efff278d --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/LibraryDeleteDTO.java @@ -0,0 +1,22 @@ +package com.ai.da.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.List; + +@Data +@ApiModel("Library删除") +public class LibraryDeleteDTO { + + + @NotEmpty(message = "libraryIds cannot be empty!") + @Size(max = 100,min = 1) + @ApiModelProperty("libraryId数组") + private List libraryIds; + +} diff --git a/src/main/java/com/ai/da/model/dto/LibraryModelPointDTO.java b/src/main/java/com/ai/da/model/dto/LibraryModelPointDTO.java new file mode 100644 index 00000000..57eda2f4 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/LibraryModelPointDTO.java @@ -0,0 +1,61 @@ +package com.ai.da.model.dto; + +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.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-11-13 + */ +@ApiModel("template打点入参") +@Data +public class LibraryModelPointDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "libraryId cannot be empty!") + @ApiModelProperty("libraryId") + private Long libraryId; + + @ApiModelProperty("templateId") + private Long templateId; + + @NotEmpty(message = "shoulderLeft cannot be empty!") + @ApiModelProperty("左肩 数组传类似 [0.2, 0.2]") + private List shoulderLeft; + + @NotEmpty(message = "shoulderRight cannot be empty!") + @ApiModelProperty("右肩 数组传类似 [0.2, 0.2]") + private List shoulderRight; + + @NotEmpty(message = "waistbandLeft cannot be empty!") + @ApiModelProperty("左腰 数组传类似 [0.2, 0.2]") + private List waistbandLeft; + + @NotEmpty(message = "waistbandRight cannot be empty!") + @ApiModelProperty("右腰 数组传类似 [0.2, 0.2]") + private List waistbandRight; + + @NotEmpty(message = "handLeft cannot be empty!") + @ApiModelProperty("左手 数组传类似 [0.2, 0.2]") + private List handLeft; + + @NotEmpty(message = "handRight cannot be empty!") + @ApiModelProperty("右手 数组传类似 [0.2, 0.2]") + private List handRight; + + @NotBlank(message = "timeZone cannot be empty!") + @ApiModelProperty("本地时区,比如 'Asia/Tokyo' 东京时间 , 'Asia/Shanghai' 北京时间 由js本地获取") + private String timeZone; + +} diff --git a/src/main/java/com/ai/da/model/dto/LibraryUpdateDTO.java b/src/main/java/com/ai/da/model/dto/LibraryUpdateDTO.java new file mode 100644 index 00000000..f7a852fd --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/LibraryUpdateDTO.java @@ -0,0 +1,30 @@ +package com.ai.da.model.dto; + +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 java.util.List; + +@Data +@ApiModel("Library编辑") +public class LibraryUpdateDTO { + + @NotEmpty(message = "libraryIds cannot be empty!") + @Size(max = 100,min = 1) + @ApiModelProperty("libraryId数组") + private List libraryIds; + + @NotBlank(message = "libraryName cannot be empty!") + @ApiModelProperty("library名字") + private String libraryName; + + @NotBlank(message = "timeZone cannot be empty!") + @ApiModelProperty("本地时区,比如 'Asia/Tokyo' 东京时间 , 'Asia/Shanghai' 北京时间 由js本地获取") + private String timeZone; + +} diff --git a/src/main/java/com/ai/da/model/dto/LibraryUploadDTO.java b/src/main/java/com/ai/da/model/dto/LibraryUploadDTO.java new file mode 100644 index 00000000..a965a401 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/LibraryUploadDTO.java @@ -0,0 +1,39 @@ +package com.ai.da.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.constraints.NotNull; + +@Data +@ApiModel("Library文件上传") +@AllArgsConstructor +public class LibraryUploadDTO { + + @NotNull(message = "文件不能为空!") + private MultipartFile file; + + @ApiModelProperty("一级类型") + private String level1Type; + + @ApiModelProperty("二级类型") + private String level2Type; + + @ApiModelProperty("时区") + private String timeZone; + + @ApiModelProperty("md5") + private String md5; + /** + * 图片高度,目前只争对 models类型 + */ + private Integer high; + /** + * 图片宽度,目前只争对 models类型 + */ + private Integer width; + +} diff --git a/src/main/java/com/ai/da/model/dto/ModelsDotDTO.java b/src/main/java/com/ai/da/model/dto/ModelsDotDTO.java new file mode 100644 index 00000000..82052292 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/ModelsDotDTO.java @@ -0,0 +1,74 @@ +package com.ai.da.model.dto; + +import io.swagger.annotations.ApiModel; +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 java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-11-19 + */ +@ApiModel("template 预览入参") +@Data +public class ModelsDotDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("libraryId 编辑时预览用") + private Long libraryId; + + @ApiModelProperty("templateId 编辑时预览用") + private Long templateId; + + @NotEmpty(message = "shoulderLeft cannot be empty!") + @ApiModelProperty("左肩 数组传类似 [0.2, 0.2]") + private List shoulderLeft; + + @NotEmpty(message = "shoulderRight cannot be empty!") + @ApiModelProperty("右肩 数组传类似 [0.2, 0.2]") + private List shoulderRight; + + @NotEmpty(message = "waistbandLeft cannot be empty!") + @ApiModelProperty("左腰 数组传类似 [0.2, 0.2]") + private List waistbandLeft; + + @NotEmpty(message = "waistbandRight cannot be empty!") + @ApiModelProperty("右腰 数组传类似 [0.2, 0.2]") + private List waistbandRight; + + @NotEmpty(message = "handLeft cannot be empty!") + @ApiModelProperty("左手 数组传类似 [0.2, 0.2]") + private List handLeft; + + @NotEmpty(message = "handRight cannot be empty!") + @ApiModelProperty("右手 数组传类似 [0.2, 0.2]") + private List handRight; + + @NotBlank(message = "timeZone cannot be empty!") + @ApiModelProperty("本地时区,比如 'Asia/Tokyo' 东京时间 , 'Asia/Shanghai' 北京时间 由js本地获取") + private String timeZone; + /** + * 图片高度,目前只争对 models类型 + */ + private Integer high; + /** + * 图片宽度,目前只争对 models类型 + */ + private Integer width; + + /** + * templateUrl + */ + private String templateUrl; + +} diff --git a/src/main/java/com/ai/da/model/dto/NoteSendDTO.java b/src/main/java/com/ai/da/model/dto/NoteSendDTO.java new file mode 100644 index 00000000..829acf2d --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/NoteSendDTO.java @@ -0,0 +1,25 @@ +package com.ai.da.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +@ApiModel("短信发送") +public class NoteSendDTO { + + @NotBlank(message = " 手机[区域/国家]号不能为空!") + @ApiModelProperty("[区域/国家]号 示例如 852 香港 不支持中国") + private String regionNum; + + @NotBlank(message = "手机号不能为空!") + @ApiModelProperty("手机号") + private String phone; + + @NotBlank(message = "操作类型不能为空!") + @ApiModelProperty("操作类型 LOGIN 登入 FORGET_PWD 忘记密码") + private String operationType; + +} diff --git a/src/main/java/com/ai/da/model/dto/QueryHistoryPageDTO.java b/src/main/java/com/ai/da/model/dto/QueryHistoryPageDTO.java new file mode 100644 index 00000000..00163d18 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/QueryHistoryPageDTO.java @@ -0,0 +1,23 @@ +package com.ai.da.model.dto; + +import com.ai.da.model.vo.PageQueryBaseVo; +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("History分页查询") +public class QueryHistoryPageDTO extends PageQueryBaseVo { + + @ApiModelProperty("collectionName") + private String collectionName; + + @ApiModelProperty("开始时间 时间戳") + private Long startDate; + + @ApiModelProperty("开始时间 时间戳") + private Long endDate; +} diff --git a/src/main/java/com/ai/da/model/dto/QueryLibraryPageDTO.java b/src/main/java/com/ai/da/model/dto/QueryLibraryPageDTO.java new file mode 100644 index 00000000..59db4c8e --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/QueryLibraryPageDTO.java @@ -0,0 +1,23 @@ +package com.ai.da.model.dto; + +import com.ai.da.model.vo.PageQueryBaseVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +@ApiModel("Library分页查询") +public class QueryLibraryPageDTO extends PageQueryBaseVo { + + @NotBlank(message = "level1Type cannot be empty!") + @ApiModelProperty("一级类型") + private String level1Type; + + @ApiModelProperty("二级类型") + private String level2Type; + + @ApiModelProperty("pictureName") + private String pictureName; +} diff --git a/src/main/java/com/ai/da/model/dto/QueryLibraryPageServiceDTO.java b/src/main/java/com/ai/da/model/dto/QueryLibraryPageServiceDTO.java new file mode 100644 index 00000000..41e9a494 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/QueryLibraryPageServiceDTO.java @@ -0,0 +1,26 @@ +package com.ai.da.model.dto; + +import com.ai.da.model.vo.PageQueryBaseVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +@ApiModel("Library分页查询2") +public class QueryLibraryPageServiceDTO extends PageQueryBaseVo { + + @ApiModelProperty("一级类型") + private String level1Type; + + @ApiModelProperty("二级类型") + private String level2Type; + + @ApiModelProperty("类型 Top , Bottom ,Print ") + private String type; + + @ApiModelProperty("pictureName") + private String pictureName; + +} diff --git a/src/main/java/com/ai/da/model/dto/QueryLibraryTopPageDTO.java b/src/main/java/com/ai/da/model/dto/QueryLibraryTopPageDTO.java new file mode 100644 index 00000000..04675325 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/QueryLibraryTopPageDTO.java @@ -0,0 +1,24 @@ +package com.ai.da.model.dto; + +import com.ai.da.model.vo.PageQueryBaseVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +@ApiModel("LibraryTop分页查询") +public class QueryLibraryTopPageDTO extends PageQueryBaseVo { + + @NotBlank(message = "type cannot be empty!") + @ApiModelProperty("类型 Top , Bottom ,Print ") + private String type; + + @ApiModelProperty("二级类型") + private String level2Type; + + @ApiModelProperty("pictureName") + private String pictureName; + +} diff --git a/src/main/java/com/ai/da/model/dto/ReDesignCollectionDTO.java b/src/main/java/com/ai/da/model/dto/ReDesignCollectionDTO.java new file mode 100644 index 00000000..e493fdd7 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/ReDesignCollectionDTO.java @@ -0,0 +1,54 @@ +package com.ai.da.model.dto; + +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 +@ApiModel("重新设计Collection 入参") +public class ReDesignCollectionDTO { + + @NotNull(message = "collectionId id cannot be empty!") + @ApiModelProperty("collectionId") + private Long collectionId; + + @ApiModelProperty("情绪板图片 数组") + private List moodBoards; + + @ApiModelProperty("印花板图片 数组") + private List printBoards; + + @NotEmpty(message = "colorBoardRgbValues cannot be empty!") + @ApiModelProperty("颜色板RGB值 数组") + private List colorBoards; + + @ApiModelProperty("手稿板图片id 数组") + private List sketchBoards; + + @ApiModelProperty("市场手稿板图片id 数组") + private List marketingSketchs; + + @NotNull(message = "systemScale cannot be empty!") + @ApiModelProperty("系统取图比列") + private BigDecimal systemScale; + + @ApiModelProperty("templateId") + private Long templateId; + + @NotBlank(message = "singleOverall cannot be empty!") + @ApiModelProperty("控制生成类型的参数,两个选项:outfit时候传 single , 另外一个传 overall") + private String singleOverall; + + @ApiModelProperty("single模式下的类别选择参数 选项有outwear,dress,blouse,skirt,trousers") + private String switchCategory; + + @NotBlank(message = "timeZone cannot be empty!") + @ApiModelProperty("本地时区,比如 'Asia/Tokyo' 东京时间 , 'Asia/Shanghai' 北京时间 由js本地获取") + private String timeZone; +} diff --git a/src/main/java/com/ai/da/model/main b/src/main/java/com/ai/da/model/main new file mode 100644 index 00000000..e69de29b diff --git a/src/main/java/com/ai/da/model/vo/AccountLoginVO.java b/src/main/java/com/ai/da/model/vo/AccountLoginVO.java new file mode 100644 index 00000000..52e2e5d9 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/AccountLoginVO.java @@ -0,0 +1,29 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@ApiModel("登入-响应") +public class AccountLoginVO { + + @ApiModelProperty("邮箱") + private String email; + + @ApiModelProperty("用户名") + private String userName; + + @ApiModelProperty("token") + private String token; + + @ApiModelProperty("userId") + private Long userId; + +} diff --git a/src/main/java/com/ai/da/model/vo/AccountPreLoginVO.java b/src/main/java/com/ai/da/model/vo/AccountPreLoginVO.java new file mode 100644 index 00000000..32f172bc --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/AccountPreLoginVO.java @@ -0,0 +1,17 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@ApiModel("预先-登入-响应") +public class AccountPreLoginVO { + @ApiModelProperty("userId") + private Long userId; + +} diff --git a/src/main/java/com/ai/da/model/vo/AuthPrincipalVo.java b/src/main/java/com/ai/da/model/vo/AuthPrincipalVo.java new file mode 100644 index 00000000..0e2e87e0 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/AuthPrincipalVo.java @@ -0,0 +1,55 @@ +package com.ai.da.model.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class AuthPrincipalVo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 用户名 + */ + private String username; + + /** + * 头像 + */ + private String avatarUrl; + + /** + * 是否为管理员(1是 0否) + */ + private Boolean isAdmin; + + /** + * 来源 + */ + private String source; + + /** + * 状态 + */ + private Integer status; + + /** + * 角色 + */ +// private List roles; + + /** + * 角色部门 + */ +// private List depts; + /** + * 角色权限 + */ + private List authorities; +} diff --git a/src/main/java/com/ai/da/model/vo/CollectionColorVO.java b/src/main/java/com/ai/da/model/vo/CollectionColorVO.java new file mode 100644 index 00000000..057cca64 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/CollectionColorVO.java @@ -0,0 +1,25 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +@ApiModel("设计Collection颜色板 响应") +public class CollectionColorVO { + + @ApiModelProperty("潘通id") + private Integer id; + + @ApiModelProperty("潘通名字") + private String name; + + @ApiModelProperty("tcx值") + private String tcx; + + @ApiModelProperty("潘通RGB值") + private String rgbValue; + +} diff --git a/src/main/java/com/ai/da/model/vo/CollectionElementVO.java b/src/main/java/com/ai/da/model/vo/CollectionElementVO.java new file mode 100644 index 00000000..2400abe7 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/CollectionElementVO.java @@ -0,0 +1,38 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("element-响应") +public class CollectionElementVO { + + @ApiModelProperty("元素id") + private Long id; + + @ApiModelProperty("用户Id") + private Long accountId; + + @ApiModelProperty("collectionId") + private Long collectionId; + + @ApiModelProperty("一级类型 Moodboard Printboard Sketchboard MarketingSketch") + private String level1Type; + + @ApiModelProperty("二级类型 Outwear Dress Blouse Skirt Trousers(只争对Sketchboard一级类型)") + private String level2Type; + + @ApiModelProperty("design类型 用户design生成时候区别library和collection") + private String designType; + + @ApiModelProperty("元素名") + private String name; + + @ApiModelProperty("是否pin 1pin 0 不pin") + private Byte isPin; + + @ApiModelProperty("元素存放地址,绝对路径") + private String url; + +} diff --git a/src/main/java/com/ai/da/model/vo/CollectionGeneratePrintVO.java b/src/main/java/com/ai/da/model/vo/CollectionGeneratePrintVO.java new file mode 100644 index 00000000..726a9906 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/CollectionGeneratePrintVO.java @@ -0,0 +1,36 @@ +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 { + @ApiModelProperty("元素id") + private Long id; + + @ApiModelProperty("用户Id") + private Long accountId; + + @ApiModelProperty("collectionId") + private Long collectionId; + + @ApiModelProperty("一级类型 Moodboard Printboard Sketchboard MarketingSketch") + private String level1Type; + + @ApiModelProperty("二级类型 Outwear Dress Blouse Skirt Trousers(只争对Sketchboard一级类型)") + private String level2Type; + + @ApiModelProperty("design类型 用户design生成时候区别library和collection") + private String designType; + + @ApiModelProperty("元素名") + private String name; + + @ApiModelProperty("元素存放地址,绝对路径") + private String url; +} diff --git a/src/main/java/com/ai/da/model/vo/DesignCollectionItemVO.java b/src/main/java/com/ai/da/model/vo/DesignCollectionItemVO.java new file mode 100644 index 00000000..d5f3f8af --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/DesignCollectionItemVO.java @@ -0,0 +1,21 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; + +@AllArgsConstructor +@Data +@ApiModel("设计ConllectionItem响应") +public class DesignCollectionItemVO { + + @ApiModelProperty("design生成的图片id") + private Long designItemId; + + @ApiModelProperty("design生成的图片地址 绝对路径") + private String designItemUrl; + + public DesignCollectionItemVO() { + } +} diff --git a/src/main/java/com/ai/da/model/vo/DesignCollectionVO.java b/src/main/java/com/ai/da/model/vo/DesignCollectionVO.java new file mode 100644 index 00000000..b23f2c98 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/DesignCollectionVO.java @@ -0,0 +1,26 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.List; + +@AllArgsConstructor +@Data +@ApiModel("设计Conllection响应") +public class DesignCollectionVO { + + @ApiModelProperty("designId") + private Long designId; + + @ApiModelProperty("collectionId") + private Long collectionId; + + @ApiModelProperty("design生成的图片 数组") + private List designCollectionItems; + + public DesignCollectionVO() { + } +} diff --git a/src/main/java/com/ai/da/model/vo/DesignItemClothesDetailVO.java b/src/main/java/com/ai/da/model/vo/DesignItemClothesDetailVO.java new file mode 100644 index 00000000..586821f5 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/DesignItemClothesDetailVO.java @@ -0,0 +1,33 @@ +package com.ai.da.model.vo; + +import com.ai.da.python.vo.DesignPythonItemPrint; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +@Data +@ApiModel("designItem detail clothes 响应") +public class DesignItemClothesDetailVO { + + @ApiModelProperty("对应的上游id") + private Long id; + + @ApiModelProperty("对应的类型 有:Outwear,Dress,Blouse,Skirt,Trousers Shoes Hairstyle Earring Body") + private String type; + + @ApiModelProperty("上传时候对应的类型,一级类型 Moodboard Printboard Sketchboard MarketingSketch Colorboard") + private String level1Type; + + @ApiModelProperty("对应的图片的绝对路径") + private String path; + + @ApiModelProperty(" 颜色 存 RGB值 中间空格分隔 比如 58 58 169") + private String color; + + @ApiModelProperty("对应的print图片对象") + private DesignPythonItemPrint printObject; +} diff --git a/src/main/java/com/ai/da/model/vo/DesignItemDetailVO.java b/src/main/java/com/ai/da/model/vo/DesignItemDetailVO.java new file mode 100644 index 00000000..bb297ca0 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/DesignItemDetailVO.java @@ -0,0 +1,34 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.List; + +@Data +@ApiModel("designItem detail响应") +public class DesignItemDetailVO { + + @ApiModelProperty("designItemId") + private Long designItemId; + + @ApiModelProperty("designItem图片") + private String designItemUrl; + + @ApiModelProperty("design高级图片") + private String highDesignUrl; + + @ApiModelProperty("控制生成类型的参数,两个选项:“overall”或“single”") + private String singleOverall; + + @ApiModelProperty("single模式下的类别选择参数 选项有outwear,dress,blouse,skirt,trousers") + private String switchCategory; + + @ApiModelProperty("clothes 数组") + private List clothes; + + @ApiModelProperty("others 数组") + private List others; +} diff --git a/src/main/java/com/ai/da/model/vo/DesignItemOthersDetailVO.java b/src/main/java/com/ai/da/model/vo/DesignItemOthersDetailVO.java new file mode 100644 index 00000000..c197e10b --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/DesignItemOthersDetailVO.java @@ -0,0 +1,26 @@ +package com.ai.da.model.vo; + +import com.ai.da.python.vo.DesignPythonItemPrint; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("designItem detail others 响应") +public class DesignItemOthersDetailVO { + + @ApiModelProperty("对应的上游id") + private Long id; + + @ApiModelProperty("对应的类型 有Hairstyle Earring Body") + private String type; + + @ApiModelProperty("对应的图片的绝对路径") + private String path; + + @ApiModelProperty(" 颜色 存 RGB值 中间空格分隔 比如 58 58 169") + private String color; + + @ApiModelProperty("对应的print图片的绝对路径") + private DesignPythonItemPrint printObject; +} diff --git a/src/main/java/com/ai/da/model/vo/DesignLibraryModelPointVO.java b/src/main/java/com/ai/da/model/vo/DesignLibraryModelPointVO.java new file mode 100644 index 00000000..49a41996 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/DesignLibraryModelPointVO.java @@ -0,0 +1,45 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-11-13 + */ +@ApiModel("Design template打点参数") +@Data +public class DesignLibraryModelPointVO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("左肩") + private List shoulderLeft; + + @ApiModelProperty("右肩") + private List shoulderRight; + + @ApiModelProperty("左腰") + private List waistbandLeft; + + @ApiModelProperty("右腰") + private List waistbandRight; + + @ApiModelProperty("左手") + private List handLeft; + + @ApiModelProperty("右手") + private List handRight; + + private String templateUrl; + + + +} diff --git a/src/main/java/com/ai/da/model/vo/DesignLikeVO.java b/src/main/java/com/ai/da/model/vo/DesignLikeVO.java new file mode 100644 index 00000000..c9ab1c25 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/DesignLikeVO.java @@ -0,0 +1,22 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.List; + +@AllArgsConstructor +@Data +@ApiModel("design like-响应") +public class DesignLikeVO { + + @ApiModelProperty("分组id") + private Long userGroupId; + @ApiModelProperty("分组详情id") + private Long groupDetailId; + + public DesignLikeVO() { + } +} diff --git a/src/main/java/com/ai/da/model/vo/FileVO.java b/src/main/java/com/ai/da/model/vo/FileVO.java new file mode 100644 index 00000000..4934a273 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/FileVO.java @@ -0,0 +1,19 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; + +@AllArgsConstructor +@Data +@ApiModel("登入-响应") +public class FileVO { + + @ApiModelProperty("高度") + private Integer high; + + @ApiModelProperty("宽度") + private Integer width; + +} diff --git a/src/main/java/com/ai/da/model/vo/GetNextSysElementVO.java b/src/main/java/com/ai/da/model/vo/GetNextSysElementVO.java new file mode 100644 index 00000000..fea519db --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/GetNextSysElementVO.java @@ -0,0 +1,22 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; + +@AllArgsConstructor +@Data +@ApiModel("切换系统element 响应") +public class GetNextSysElementVO { + + @ApiModelProperty("对应的上游id") + private Long id; + + @ApiModelProperty("对应的类型 有Hairstyle Earring Body") + private String type; + + @ApiModelProperty("对应的图片的绝对路径") + private String path; + +} diff --git a/src/main/java/com/ai/da/model/vo/HistoryUpdateVO.java b/src/main/java/com/ai/da/model/vo/HistoryUpdateVO.java new file mode 100644 index 00000000..cb21ce04 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/HistoryUpdateVO.java @@ -0,0 +1,20 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.List; +@AllArgsConstructor +@Data +@ApiModel("HistoryUpdateVO-响应") +public class HistoryUpdateVO { + + @ApiModelProperty("分组名") + private String name; + + @ApiModelProperty("更新时间") + private Long updateDate; + +} diff --git a/src/main/java/com/ai/da/model/vo/LibraryModelPointVO.java b/src/main/java/com/ai/da/model/vo/LibraryModelPointVO.java new file mode 100644 index 00000000..0b0d0a79 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/LibraryModelPointVO.java @@ -0,0 +1,47 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-11-13 + */ +@ApiModel("template打点响应") +@Data +public class LibraryModelPointVO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("libraryId") + private Long libraryId; + + @ApiModelProperty("templateId") + private Long templateId; + + @ApiModelProperty("左肩") + private List shoulderLeft; + + @ApiModelProperty("右肩") + private List shoulderRight; + + @ApiModelProperty("左腰") + private List waistbandLeft; + + @ApiModelProperty("右腰") + private List waistbandRight; + + @ApiModelProperty("左手") + private List handLeft; + + @ApiModelProperty("右手") + private List handRight; + +} diff --git a/src/main/java/com/ai/da/model/vo/LibraryUpdateVo.java b/src/main/java/com/ai/da/model/vo/LibraryUpdateVo.java new file mode 100644 index 00000000..73485abf --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/LibraryUpdateVo.java @@ -0,0 +1,42 @@ +package com.ai.da.model.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@ApiModel("Library上传-响应") +public class LibraryUpdateVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("library ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty("用户ID") + private Long accountId; + + @ApiModelProperty("一级类型") + private String level1Type; + + @ApiModelProperty("二级类型") + private String level2Type; + + @ApiModelProperty("名字") + private String name; + + @ApiModelProperty("存放地址") + private String url; + +} diff --git a/src/main/java/com/ai/da/model/vo/LibraryVo.java b/src/main/java/com/ai/da/model/vo/LibraryVo.java new file mode 100644 index 00000000..efe33c3c --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/LibraryVo.java @@ -0,0 +1,72 @@ +package com.ai.da.model.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +public class LibraryVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private Long id; + + /** + * 用户ID + * + */ + private Long accountId; + /** + * collectionId + */ + private Long collectionId; + + /** + * 一级类型 + */ + private String level1Type; + + /** + * 二级类型 + */ + private String level2Type; + + /** + * 元素名 + */ + private String name; + + /** + * 元素存放地址 + */ + private String url; + /** + * md5值 + */ + private String md5; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/model/vo/PageQueryBaseVo.java b/src/main/java/com/ai/da/model/vo/PageQueryBaseVo.java new file mode 100644 index 00000000..7b85f050 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/PageQueryBaseVo.java @@ -0,0 +1,23 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; + + +@Data +@ApiModel("分页查询") +public class PageQueryBaseVo { + + @ApiModelProperty("页码") + @Min(value = 0, message = "page最小值为1") + private Integer page = 1; + + @ApiModelProperty("每页数量") + @Min(value = 0, message = "size最小值为1") + @Max(value = 50, message = "size最大值为50") + private Integer size = 20; +} diff --git a/src/main/java/com/ai/da/model/vo/PantoneVO.java b/src/main/java/com/ai/da/model/vo/PantoneVO.java new file mode 100644 index 00000000..e231c087 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/PantoneVO.java @@ -0,0 +1,45 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +@NoArgsConstructor +@Data +@ApiModel("潘通-响应") +public class PantoneVO { + + @ApiModelProperty("id") + private Integer id; + + @ApiModelProperty("名字") + private String name; + + @ApiModelProperty("tcx值") + private String tcx; + + @ApiModelProperty("r") + private Integer r; + + @ApiModelProperty("r") + private Integer g; + + @ApiModelProperty("r") + private Integer b; + + @ApiModelProperty("h") + private Integer h; + + @ApiModelProperty("s") + private Integer s; + + @ApiModelProperty("v") + private Integer v; + + public PantoneVO(String name, String tcx) { + this.name = name; + this.tcx = tcx; + } +} diff --git a/src/main/java/com/ai/da/model/vo/PythonLibraryVo.java b/src/main/java/com/ai/da/model/vo/PythonLibraryVo.java new file mode 100644 index 00000000..480ffa2e --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/PythonLibraryVo.java @@ -0,0 +1,38 @@ +package com.ai.da.model.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +public class PythonLibraryVo implements Serializable { + + private static final long serialVersionUID = 1L; + + + /** + * ID + */ + private Long id; + + /** + * 二级类型 + */ + private String level2Type; + + /** + * 元素存放地址 + */ + private String url; + /** + * md5值 + */ + private String md5; +} diff --git a/src/main/java/com/ai/da/model/vo/QueryLibraryPageVO.java b/src/main/java/com/ai/da/model/vo/QueryLibraryPageVO.java new file mode 100644 index 00000000..d0119b1c --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/QueryLibraryPageVO.java @@ -0,0 +1,36 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +@ApiModel("Library分页-响应") +public class QueryLibraryPageVO { + + @ApiModelProperty("Library ID") + private Long id; + + @ApiModelProperty("用户ID") + private Long accountId; + + @ApiModelProperty("一级类型") + private String level1Type; + + @ApiModelProperty("二级类型") + private String level2Type; + + @ApiModelProperty("design类型 用户design生成时候区别library和collection") + private String designType; + + @ApiModelProperty("图片名字") + private String name; + + @ApiModelProperty("图片地址") + private String url; + + @ApiModelProperty("template 打点内容 level1Type为Models才传") + private LibraryModelPointVO libraryModelPoint; +} diff --git a/src/main/java/com/ai/da/model/vo/SysFileVO.java b/src/main/java/com/ai/da/model/vo/SysFileVO.java new file mode 100644 index 00000000..3f99d2c6 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/SysFileVO.java @@ -0,0 +1,37 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统文件-响应") +public class SysFileVO implements Serializable { + + /** + * ID + */ + private Long id; + + /** + * 二级类型 目前有outwear,dress,blouse,skirt,trousers Shoes Hairstyle Earring + */ + private String level2Type; + + /** + * 名字 + */ + private String name; + /** + * 路径 绝对路径 + */ + private String url; + + /** + * md5值 + * + */ + private String md5; + +} diff --git a/src/main/java/com/ai/da/model/vo/UserLikeChooseVO.java b/src/main/java/com/ai/da/model/vo/UserLikeChooseVO.java new file mode 100644 index 00000000..198a337b --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/UserLikeChooseVO.java @@ -0,0 +1,23 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.List; + +@AllArgsConstructor +@Data +@ApiModel("用户choose详细-响应") +public class UserLikeChooseVO { + + @ApiModelProperty("分组id") + private Long userGroupId; + + @ApiModelProperty("分组详细数组") + private java.util.List userLikeDetails; + + @ApiModelProperty("关联的collection") + private UserLikeCollectionVO collection; +} diff --git a/src/main/java/com/ai/da/model/vo/UserLikeCollectionVO.java b/src/main/java/com/ai/da/model/vo/UserLikeCollectionVO.java new file mode 100644 index 00000000..b6d7b927 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/UserLikeCollectionVO.java @@ -0,0 +1,34 @@ +package com.ai.da.model.vo; + +import com.ai.da.model.dto.CollectionColorDTO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +@ApiModel("用户关联的collection-响应") +public class UserLikeCollectionVO { + + @ApiModelProperty("collectionId") + private Long collectionId; + + @ApiModelProperty("mood版本id 没有传null") + private String moodTemplateId; + + @ApiModelProperty("情绪板图片 数组") + private List moodBoards; + + @ApiModelProperty("印花板图片 数组") + private List printBoards; + + @ApiModelProperty("颜色板RGB值 数组") + private List colorBoards; + + @ApiModelProperty("手稿板图片 数组") + private List sketchBoards; + + @ApiModelProperty("市场手稿板图片 数组") + private List marketingSketchs; +} diff --git a/src/main/java/com/ai/da/model/vo/UserLikeGroupVO.java b/src/main/java/com/ai/da/model/vo/UserLikeGroupVO.java new file mode 100644 index 00000000..a796d902 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/UserLikeGroupVO.java @@ -0,0 +1,34 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +@ApiModel("用户savedCollection分组-响应") +public class UserLikeGroupVO { + + @ApiModelProperty("分组ID") + private Long id; + + @ApiModelProperty("collectionId") + private Long collectionId; + + @ApiModelProperty("分组名") + private String name; + + @ApiModelProperty("创建者") + private String author; + + @ApiModelProperty("更新时间") + private Long updateDate; + + @ApiModelProperty("sketchCount") + private Integer sketchCount; + + @ApiModelProperty("分组对应的详情 一次行带出来") + private List groupDetails; + +} diff --git a/src/main/java/com/ai/da/model/vo/UserLikeVO.java b/src/main/java/com/ai/da/model/vo/UserLikeVO.java new file mode 100644 index 00000000..3b87ee3a --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/UserLikeVO.java @@ -0,0 +1,21 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("用户分组详情-响应") +public class UserLikeVO { + + @ApiModelProperty("分组详情id") + private Long id; + + private Long userLikeGroupId; + @ApiModelProperty("designId") + private Long designId; + @ApiModelProperty("designItemId") + private Long designItemId; + @ApiModelProperty("图片路径") + private String url; +} diff --git a/src/main/java/com/ai/da/model/vo/ValidateElementVO.java b/src/main/java/com/ai/da/model/vo/ValidateElementVO.java new file mode 100644 index 00000000..bcf520b3 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/ValidateElementVO.java @@ -0,0 +1,49 @@ +package com.ai.da.model.vo; + +import com.ai.da.common.enums.CurrentDesignPrintPictureTypeEnum; +import com.ai.da.mapper.entity.CollectionElement; +import com.ai.da.mapper.entity.Library; +import com.ai.da.model.dto.CollectionColorDTO; +import com.ai.da.python.vo.DesignPythonItemPrint; +import com.google.common.collect.Lists; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; +import java.util.Objects; + +@Data +@ApiModel("校验element响应") +public class ValidateElementVO { + + List MoodBoardElements; + List printBoardElements; + List sketchBoardElements; + List marketingSketchElements; + List libraryVos; + List colorBoards; + String singleOverall; + String switchCategory; + + //已使用的PinDataId + List existPinDataIds = Lists.newArrayList(); + //本地生成collection的elementId + List usedElementIds = Lists.newArrayList(); + //用于存储library 生成collection + List libraryCollectionElements = Lists.newArrayList(); + //存储template打点数据 + DesignLibraryModelPointVO designLibraryModelPoint =null; + //存储本次design已经使用的上衣和下衣的的MD5list 去重用 + List hasUseMd5List = Lists.newArrayList() ; + //存储本次design已经使用的系统上衣下衣的id + List sysFileIds = Lists.newArrayList() ; + //存储本次design剩余的没有Pin的print + Long noPinPrintNum ; + //透传print参数用,存储本地Print对象 + DesignPythonItemPrint designPythonItemPrint; + //透传print参数用 + List designPrintPictureTypeLayoutList; + //透传sysFileVo用(attribute_retrieval 接口限定sysFile范围) + List sysFileVo; +} diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java new file mode 100644 index 00000000..6c9f9097 --- /dev/null +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -0,0 +1,1389 @@ +package com.ai.da.python; + +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.enums.*; +import com.ai.da.common.utils.*; +import com.ai.da.mapper.entity.Collection; +import com.ai.da.mapper.entity.CollectionElement; +import com.ai.da.mapper.entity.DesignHistory; +import com.ai.da.model.dto.*; +import com.ai.da.model.vo.*; +import com.ai.da.python.vo.*; +import com.ai.da.service.DesignHistoryService; +import com.ai.da.service.SysFileService; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import okhttp3.*; +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 javax.annotation.Resource; +import java.io.File; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Slf4j +@Service +public class PythonService { + + @Resource + private FileProperties fileProperties; + @Resource + private SysFileService sysFileService; + @Resource + private DesignHistoryService designHistoryService; + @Value("${access.python.ip:''}") + private String accessPythonIp; + + /** + * 生成打印的图片 二合一 + * + * @param printPath + * @return + */ + public String generatePrint(List printPath) { + //限流校验 + AccessLimitUtils.validate("generatePrint",2); + 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"); + Map content = Maps.newHashMap(); + content.put("fusion_content_path", printPath.get(0)); + content.put("fusion_style_path", printPath.get(1)); + content.put("fusion_output_path", getPythonOutputPath( + printPath.get(0), PythonToJavaApiOperationTypeEnum.GENERATE_PRINT)); + RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content)); + Request request = new Request.Builder() + .url(accessPythonIp + ":9999/aifda/api/v1.0/fusion_test") + .method("POST", body) + .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") + .addHeader("Content-Type", "application/json") + .build(); + Response response = null; + try { + log.info("生成印花请求入参content###{}", JSON.toJSONString(content)); + response = client.newCall(request).execute(); + } catch (IOException ioException) { + log.error("PythonService##generatePrint异常###{}", ExceptionUtil.getThrowableList(ioException)); + } + //去除限流 + AccessLimitUtils.validateOut("generatePrint"); + if (Objects.isNull(response)) { + log.error("PythonService##generatePrint异常###{}", "response or body is empty!"); + throw new BusinessException("generate print exception!"); + } + JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(response)); + Boolean result = jsonObject.getBoolean("successful"); + if (result) { + return content.get("fusion_output_path"); + } + log.info("生成印花失败###{}", jsonObject); + //生成失败 + throw new BusinessException("generate print exception!"); + } + + /** + * 生成python要保存的文件 + * + * @param picturePath + * @return + */ + private String getPythonOutputPath(String picturePath, PythonToJavaApiOperationTypeEnum pythonOperationType) { + String linuxDomain = fileProperties.getLinuxDomain(); + String day = DateUtil.dateToStr(new Date(), DateUtil.YYYYMM); + //获取图片后缀 + String suffix = picturePath.substring(picturePath.lastIndexOf(".")); + String generateFileName = pythonOperationType.getRealName() + + "-" + UUID.randomUUID().toString() + suffix; + return linuxDomain + day + File.separator + "pythonFile" + File.separator + + pythonOperationType.getRealName() + + File.separator + generateFileName; + } + + /** + * python生成的文件上传到java服务器统一维护 + * + * @param file + * @param operateType + * @return + */ + @Transactional + public String upload(MultipartFile file, String operateType) { + //用户信息 + PythonToJavaApiOperationTypeEnum operationType = PythonToJavaApiOperationTypeEnum.uploadOf(operateType); + Assert.notNull(operationType, "unknown operateType " + operateType + "!"); + String path = calculateFileUrl(operationType); + File generateFile = FileUtil.upload(file, path); + + String linuxDomain = fileProperties.getLinuxDomain(); + if (!StringUtils.isEmpty(linuxDomain)) { + //linux 系统 + String oldPath = fileProperties.getSys().getPath(); + return generateFile.getAbsolutePath().replace(oldPath, linuxDomain); + } + return null; + } + + private String calculateFileUrl(PythonToJavaApiOperationTypeEnum operationType) { + String rootPath = fileProperties.getSys().getPath(); + String day = DateUtil.dateToStr(new Date(), DateUtil.YYYYMM); + return rootPath + day + File.separator + "pythonFile" + File.separator + + operationType.getRealName() + File.separator; + } + + + /** + * 组装和计算design参数 + * + * @param systemScale + * @param singleOverall + * @param switchCategory + * @param elementVO + * @return + */ + public DesignPythonObjects covertDesignParam(BigDecimal systemScale, String singleOverall, + String switchCategory, ValidateElementVO elementVO) { + DesignPythonObjects designPythonObjects = new DesignPythonObjects(); + List objects = Lists.newArrayList(); + designPythonObjects.setObjects(objects); + long pinPrintNum = calculateDesignPinPrintNum(elementVO.getPrintBoardElements()); + long noPinPrintNum = calculateDesignNoPinPrintNum(elementVO.getPrintBoardElements()); + //没有print的 + long noPrintNum = 8 - pinPrintNum - noPinPrintNum; + elementVO.setNoPinPrintNum(noPinPrintNum); + + //系统比列 + BigDecimal sysRatio = systemScale; + int pinPictureNum = calculatePinPictureNum(elementVO.getSketchBoardElements(), elementVO.getHasUseMd5List()); + int sysPictureNum = calculateSysPictureNum(sysRatio, pinPictureNum); + int userPictureNum = calculateUserLibraryPictureNum(sysPictureNum, pinPictureNum); + int noPinPictureNum = 8 - pinPictureNum - sysPictureNum - userPictureNum; + + for (int i = 0; i < 8; i++) { + //sketch计算 + CurrentDesignPictureTypeEnum designPictureType = + calculateCurrentDesignPictureType(pinPictureNum, sysPictureNum, userPictureNum, noPinPictureNum); + if (Objects.isNull(designPictureType)) { + break; + } + switch (designPictureType) { + case PIN: + pinPictureNum--; + break; + case USER_LIBRARY: + userPictureNum--; + break; + case SYS_FILE: + sysPictureNum--; + break; + case NO_PIN: + noPinPictureNum--; + break; + default: + } + //print计算 + CurrentDesignPrintPictureTypeEnum designPrintPictureType = + calculateCurrentDesignPintPictureType(pinPrintNum, noPinPrintNum, noPrintNum); + if (Objects.isNull(designPrintPictureType)) { + break; + } + switch (designPrintPictureType) { + case PIN: + pinPrintNum--; + break; + case NO_PIN: + noPinPrintNum--; + break; + case NO: + noPrintNum--; + break; + default: + } + //确定本次designSingle是否print + DesignPythonItemPrint designPythonItemPrint = getRandomPrint(elementVO, designPrintPictureType); + elementVO.setDesignPythonItemPrint(designPythonItemPrint); + //参数透传 确定本次designSingle如果需要print对应的种类 + elementVO.setDesignPrintPictureTypeLayoutList(calculateCurrentDesignPintPictureTypeLayout()); + //designSingle具体参数组装 + DesignPythonObject pythonObject = new DesignPythonObject(); + pythonObject.setItems(coverToDesignPythonItem(elementVO, designPictureType)); + pythonObject.setBasic(coverToBasic(pythonObject.getItems().get(0), + singleOverall, switchCategory, elementVO.getDesignLibraryModelPoint())); + objects.add(pythonObject); + } + return designPythonObjects; + } + + //计算当前的图片类型 + private CurrentDesignPictureTypeEnum calculateCurrentDesignPictureType(int pinPictureNum, int sysPictureNum, int userPictureNum, int noPinPictureNum) { + List codes = Lists.newArrayList(); + if (pinPictureNum > 0) { + //pin默认优先选择 不参与计算 后续有调整再说 +// codes.add(pinPictureNum); + return CurrentDesignPictureTypeEnum.PIN; + } + if (sysPictureNum > 0) { + codes.add(CurrentDesignPictureTypeEnum.SYS_FILE.getCode()); + } + if (userPictureNum > 0) { + codes.add(CurrentDesignPictureTypeEnum.USER_LIBRARY.getCode()); + } + if (noPinPictureNum > 0) { + codes.add(CurrentDesignPictureTypeEnum.NO_PIN.getCode()); + } + List pictureTypeEnums = CurrentDesignPictureTypeEnum.ofList(codes); + if (CollectionUtils.isEmpty(pictureTypeEnums)) { + return null; + } + int max = pictureTypeEnums.size(); + int min = 0; + Long randomIndex = RandomsUtil.randomSysFile((long) min, (long) max); + return pictureTypeEnums.get(randomIndex.intValue()); + } + + //计算系统图片张数 + private static int calculateSysPictureNum(BigDecimal sysRatio, int pinPictureNum) { + if (pinPictureNum > 4) { + int poolSize = 8 - pinPictureNum; + if (poolSize == 0) { + return 0; + } + return BigDecimal.valueOf(poolSize).multiply(sysRatio) + .setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); + } else { + return BigDecimal.valueOf(4).multiply(sysRatio) + .setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); + } + } + + //计算用户库图片张数 + private static int calculateUserLibraryPictureNum(int sysPictureNum, int pinPictureNum) { + if (pinPictureNum > 4) { + return 8 - pinPictureNum - sysPictureNum; + } else { + return 4 - sysPictureNum; + } + } + + //计算Pin图片张数 + private int calculatePinPictureNum(List sketchBoardElements, List hasUseMd5List) { + List pinData = getPinData(sketchBoardElements, hasUseMd5List); + if (CollectionUtil.isEmpty(pinData)) { + return 0; + } + long topNum = sketchBoardElements.stream() + .filter(skecth -> skecth.getHasPin() == 1 + && DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(skecth.getLevel2Type())).count(); + long bottomNum = sketchBoardElements.stream() + .filter(skecth -> skecth.getHasPin() == 1 + && DesignPythonItem.SKIRT_TROUSERS.contains(skecth.getLevel2Type())).count(); + int num = Arrays.asList(topNum, bottomNum).stream().max(Comparator.comparing(Long::valueOf)).get().intValue(); + if (num > 8) { + return 8; + } + return num; + } + + //计算当前的Print图片类型 + private CurrentDesignPrintPictureTypeEnum calculateCurrentDesignPintPictureType(long pinPrintNum, long noPinPrintNum, long noPrintNum) { + List codes = Lists.newArrayList(); + if (pinPrintNum > 0) { + //pin默认优先选择 不参与计算 后续有调整再说 +// codes.add(pinPictureNum); + return CurrentDesignPrintPictureTypeEnum.PIN; + } + if (noPinPrintNum > 0) { + codes.add(CurrentDesignPrintPictureTypeEnum.NO_PIN.getCode()); + } + if (noPrintNum > 0) { + codes.add(CurrentDesignPrintPictureTypeEnum.NO.getCode()); + } + + List pictureTypeEnums = CurrentDesignPrintPictureTypeEnum.ofList(codes); + if (CollectionUtils.isEmpty(pictureTypeEnums)) { + return null; + } + int max = pictureTypeEnums.size(); + int min = 0; + Long randomIndex = RandomsUtil.randomSysFile((long) min, (long) max); + return pictureTypeEnums.get(randomIndex.intValue()); + } + + //计算当前的Print图片类型具体分布位置 0. 上衣 1.下衣 2.上衣和下衣都print + private List calculateCurrentDesignPintPictureTypeLayout() { + Long randomIndex = RandomsUtil.randomSysFile(0L, 3L); + if (randomIndex == 0) { + return DesignPythonItem.OUTWEAR_DRESS_BLOUSE; + } + if (randomIndex == 1) { + return DesignPythonItem.SKIRT_TROUSERS; + } + if (randomIndex == 2) { + List all = new ArrayList<>(DesignPythonItem.OUTWEAR_DRESS_BLOUSE); + all.addAll(new ArrayList<>(DesignPythonItem.SKIRT_TROUSERS)); + return all; + } + return null; + } + + //计算print 非Pin图片剩余张数 + private long calculateDesignPinPrintNum(List printBoardElements) { + if (CollectionUtils.isEmpty(printBoardElements)) { + return 0; + } + return printBoardElements.stream().filter(f -> f.getHasPin() == 1).count(); + } + + //计算print 非Pin图片剩余张数 + private long calculateDesignNoPinPrintNum(List printBoardElements) { + if (CollectionUtils.isEmpty(printBoardElements)) { + return 0; + } + long totalNum = printBoardElements.size() / 2; + long pinNum = printBoardElements.stream().filter(f -> f.getHasPin() == 1).count(); + if (pinNum >= totalNum) { + return 0; + } + return totalNum - pinNum; + } + + private List coverToDesignPythonItem(ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType) { + //Pin的数据 + List pinData = getPinData(elementVO.getSketchBoardElements(), elementVO.getHasUseMd5List()); + //计算填充PythonItemBlouse + List items = Lists.newArrayList(); + List blouseList = calculatePythonItemBlouse(pinData, elementVO, designPictureType); + if (!CollectionUtils.isEmpty(blouseList)) { + items.addAll(blouseList); + } + //计算填充PythonItemSkirt + DesignPythonItem skirt = calculatePythonItemSkirt(pinData, elementVO, designPictureType); + if (Objects.nonNull(skirt)) { + items.add(skirt); + } + //计算填充Hairstyle Earring Shoes Body + items.addAll(calculatePythonItemHairstyleShoes(elementVO, elementVO.getDesignLibraryModelPoint())); + return items; + } + + private List calculatePythonItemHairstyleShoes(ValidateElementVO elementVO, DesignLibraryModelPointVO designLibraryModelPoint) { + List items = Lists.newArrayList(); + DesignPythonItem.SYS_HAIRSTYLE_SHOES_BODY.forEach(type -> { + if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall()) || Objects.nonNull(designLibraryModelPoint)){ + //single和models模特时候不传耳环 首饰,鞋子等 + if(!SysFileLevel2TypeEnum.BODY.getRealName().equals(type)){ + return; + } + } + DesignPythonItem pythonItem = new DesignPythonItem(); + items.add(pythonItem); + //类型 + pythonItem.setType(type); + if (SysFileLevel2TypeEnum.BODY.getRealName().equals(type)) { + if (Objects.nonNull(designLibraryModelPoint)) { + pythonItem.setBody_path(designLibraryModelPoint.getTemplateUrl()); + } else { +// pythonItem.setBody_path("/home/pangkaicheng/python_code/Multi-layer-Virtual-Try-on/dataset_for_test/Img_model.png"); + pythonItem.setBody_path("/workspace/python_code/Multi-layer-Virtual-Try-on/dataset_for_test/Img_model.png"); + } + } else { + SysFileVO sysFileVO = getRandomSysFileByLevel2Type(type, Lists.newArrayList()); + pythonItem.setPath(sysFileVO.getUrl()); + pythonItem.setBusinessId(sysFileVO.getId()); + if (SysFileLevel2TypeEnum.SHOES.getRealName().equals(type)) { + pythonItem.setColor(getRandomColor(elementVO.getColorBoards())); + } + } + }); + return items; + } + + private DesignPythonItem calculatePythonItemSkirt(List pinData, ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType) { + // skirt, trousers 只选择一个 + DesignPythonItem skirt = null; + //剩余的的PinData + List existPinDataIds = elementVO.getExistPinDataIds(); + List residuePinData = residuePinData(pinData, existPinDataIds, elementVO.getHasUseMd5List()); + if (CollectionUtil.isNotEmpty(residuePinData)) { + //single模式 + if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { + if (DesignPythonItem.SKIRT_TROUSERS.contains(elementVO.getSwitchCategory())) { + //是否包含的Pin + Boolean isPin = residuePinData.stream().filter(residue -> + elementVO.getSwitchCategory().equals(residue.getLevel2Type())).findFirst().isPresent(); + //如果包含Pin只传一个 + if (isPin) { + //Pin的数据 + pinData = getPinDataByLevel2Type(pinData, elementVO.getSwitchCategory()); + //剩余的的PinData + List residueInnerPinDataByType = residuePinData(pinData, existPinDataIds, elementVO.getHasUseMd5List()); + CollectionElement elementNew = CollectionUtils.isEmpty(residueInnerPinDataByType) ? null : residueInnerPinDataByType.get(0); + if (Objects.nonNull(elementNew)) { + skirt = coverToDesignPythonItem(elementNew.getId(), elementVO.getSwitchCategory(), elementNew.getUrl(), elementVO); + //去重用 + existPinDataIds.add(elementNew.getId()); + //添加已使用的md5 + elementVO.getHasUseMd5List().add(elementNew.getMd5()); + } + } + } + } else { + //是否包含skirt的Pin + Boolean isPin = residuePinData.stream().filter(residue -> + DesignPythonItem.SKIRT_TROUSERS.contains(residue.getLevel2Type())).findFirst().isPresent(); + //如果包含Pin只传一个 + if (isPin) { + for (String type : DesignPythonItem.SKIRT_TROUSERS) { + //剩余的的PinData + List residueInnerPinData = residuePinData(pinData, existPinDataIds, elementVO.getHasUseMd5List()); + CollectionElement elementNew = residueInnerPinData.stream() + .filter(element -> element.getLevel2Type().equals(type)).findFirst().orElse(null); + if (Objects.nonNull(elementNew)) { + skirt = coverToDesignPythonItem(elementNew.getId(), type, elementNew.getUrl(), elementVO); + //去重用 + existPinDataIds.add(elementNew.getId()); + //添加已使用的md5 + elementVO.getHasUseMd5List().add(elementNew.getMd5()); + break; + } + } + } + } + + } + if (Objects.nonNull(skirt)) { + return skirt; + } + switch (designPictureType) { + case PIN: + if (Objects.isNull(skirt)) { + //single模式 + if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { + if (DesignPythonItem.SKIRT_TROUSERS.contains(elementVO.getSwitchCategory())) { + //系统获取 + SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds()); + skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); + skirt.setBusinessId(sysFileVO.getId()); + return skirt; + } + } else { + //系统获取 + SysFileVO sysFileVO = getRandomSysFileSkirt(elementVO.getSysFileVo(),elementVO.getSysFileIds()); + skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); + skirt.setBusinessId(sysFileVO.getId()); + //添加已使用的md5 + return skirt; + } + } + break; + case USER_LIBRARY: + //single模式 + if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { + if (DesignPythonItem.SKIRT_TROUSERS.contains(elementVO.getSwitchCategory())) { + LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), + Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); + if (StringUtils.isEmpty(libraryVo)) { + //系统获取 + SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds()); + skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); + skirt.setBusinessId(sysFileVO.getId()); + return skirt; + } + skirt = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); + elementVO.getHasUseMd5List().add(libraryVo.getMd5()); + skirt.setBusinessId(libraryVo.getId()); + } + } else { + LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), + DesignPythonItem.SKIRT_TROUSERS, elementVO.getHasUseMd5List()); + if (StringUtils.isEmpty(libraryVo)) { + //系统获取 + SysFileVO sysFileVO = getRandomSysFileSkirt(elementVO.getSysFileVo(),elementVO.getSysFileIds()); + skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); + skirt.setBusinessId(sysFileVO.getId()); + //添加已使用的md5 + return skirt; + } + skirt = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); + skirt.setBusinessId(libraryVo.getId()); + elementVO.getHasUseMd5List().add(libraryVo.getMd5()); + } + break; + case SYS_FILE: + //single模式 + if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { + if (DesignPythonItem.SKIRT_TROUSERS.contains(elementVO.getSwitchCategory())) { + //系统获取 + SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds()); + skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); + skirt.setBusinessId(sysFileVO.getId()); + return skirt; + } + } else { + //系统获取 + SysFileVO sysFileVO = getRandomSysFileSkirt(elementVO.getSysFileVo(),elementVO.getSysFileIds()); + skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); + skirt.setBusinessId(sysFileVO.getId()); + //添加已使用的md5 + return skirt; + } + break; + case NO_PIN: + //single模式 + if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { + if (DesignPythonItem.SKIRT_TROUSERS.contains(elementVO.getSwitchCategory())) { + //非Pin的数据 + List noPinDataByType = + getNoPinData(elementVO.getSketchBoardElements(), Collections.singletonList(elementVO.getSwitchCategory())); + CollectionElement collectionElement = getRandomSketchLibrary(noPinDataByType, elementVO.getHasUseMd5List()); + if (Objects.isNull(collectionElement)) { + //系统获取 + SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds()); + skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); + skirt.setBusinessId(sysFileVO.getId()); + } else { + elementVO.getHasUseMd5List().add(collectionElement.getMd5()); + skirt = coverToDesignPythonItem(collectionElement.getId(), collectionElement.getLevel2Type(), collectionElement.getUrl(), elementVO); + } + } + } else { + //非Pin的数据 + List noPinData = getNoPinData(elementVO.getSketchBoardElements(), DesignPythonItem.SKIRT_TROUSERS); + CollectionElement collectionElement = getRandomSketchLibrary(noPinData, elementVO.getHasUseMd5List()); + if (Objects.isNull(collectionElement)) { + //系统获取 + SysFileVO sysFileVO = getRandomSysFileSkirt(elementVO.getSysFileVo(),elementVO.getSysFileIds()); + skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); + skirt.setBusinessId(sysFileVO.getId()); + } else { + elementVO.getHasUseMd5List().add(collectionElement.getMd5()); + skirt = coverToDesignPythonItem(collectionElement.getId(), collectionElement.getLevel2Type(), collectionElement.getUrl(), elementVO); + } + } + break; + default: + } + return skirt; + } + + private List calculatePythonItemBlouse(List pinData, ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType) { + List items = Lists.newArrayList(); + //剩余的的PinData + List existPinDataIds = elementVO.getExistPinDataIds(); + List residuePinData = residuePinData(pinData, existPinDataIds, elementVO.getHasUseMd5List()); + if (CollectionUtil.isNotEmpty(residuePinData)) { + //single模式 + if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { + if (DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(elementVO.getSwitchCategory())) { + //是否包含的Pin + Boolean isPin = residuePinData.stream().filter(residue -> + elementVO.getSwitchCategory().equals(residue.getLevel2Type())).findFirst().isPresent(); + //如果包含Pin只传一个 + if (isPin) { + //Pin的数据 + pinData = getPinDataByLevel2Type(pinData, elementVO.getSwitchCategory()); + //剩余的的PinData + List residueInnerPinDataByType = residuePinData(pinData, existPinDataIds, elementVO.getHasUseMd5List()); + CollectionElement elementNew = CollectionUtils.isEmpty(residueInnerPinDataByType) ? null : residueInnerPinDataByType.get(0); + if (Objects.nonNull(elementNew)) { + items.add(coverToDesignPythonItem(elementNew.getId(), elementVO.getSwitchCategory(), elementNew.getUrl(), elementVO)); + //去重用 + existPinDataIds.add(elementNew.getId()); + //添加MD5 + elementVO.getHasUseMd5List().add(elementNew.getMd5()); + } + } + } + } else { + //是否包含blouse的Pin + Boolean isPin = residuePinData.stream().filter(residue -> + DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(residue.getLevel2Type())).findFirst().isPresent(); + //如果包含Pin只传一个 + if (isPin) { + List finalPinData = pinData; + DesignPythonItem.OUTWEAR_DRESS_BLOUSE.forEach(type -> { + //剩余的的PinData + List residueInnerPinData = residuePinData(finalPinData, existPinDataIds, elementVO.getHasUseMd5List()); + CollectionElement elementNew = residueInnerPinData.stream() + .filter(element -> element.getLevel2Type().equals(type)).findFirst().orElse(null); + if (Objects.nonNull(elementNew)) { + items.add(coverToDesignPythonItem(elementNew.getId(), type, elementNew.getUrl(), elementVO)); + //去重用 + existPinDataIds.add(elementNew.getId()); + //添加md5 + elementVO.getHasUseMd5List().add(elementNew.getMd5()); + + } + }); + } + } + + } + if (CollectionUtil.isNotEmpty(items)) { + return items; + } + switch (designPictureType) { + case PIN: + if (CollectionUtil.isEmpty(items)) { + //single模式 + if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { + if (DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(elementVO.getSwitchCategory())) { + //系统获取 + SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds()); + DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); + item.setBusinessId(sysFileVO.getId()); + items.add(item); + return items; + } + } else { + //系统获取 + SysFileVO sysFileVO = getRandomSysFileOutwear(elementVO.getSysFileVo(),elementVO.getSysFileIds()); + DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); + item.setBusinessId(sysFileVO.getId()); + items.add(item); + return items; + } + } + break; + case USER_LIBRARY: + //single模式 + if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { + if (DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(elementVO.getSwitchCategory())) { + LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), + Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); + if (StringUtils.isEmpty(libraryVo)) { + //系统获取 + SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds()); + DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); + item.setBusinessId(sysFileVO.getId()); + items.add(item); + return items; + } + DesignPythonItem item = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); + item.setBusinessId(libraryVo.getId()); + elementVO.getHasUseMd5List().add(libraryVo.getMd5()); + items.add(item); + } + } else { + LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), + DesignPythonItem.OUTWEAR_DRESS_BLOUSE, elementVO.getHasUseMd5List()); + if (StringUtils.isEmpty(libraryVo)) { + //系统获取 + SysFileVO sysFileVO = getRandomSysFileOutwear(elementVO.getSysFileVo(),elementVO.getSysFileIds()); + DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); + item.setBusinessId(sysFileVO.getId()); + items.add(item); + return items; + } + DesignPythonItem item = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); + item.setBusinessId(libraryVo.getId()); + elementVO.getHasUseMd5List().add(libraryVo.getMd5()); + items.add(item); + } + break; + case SYS_FILE: + //single模式 + if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { + if (DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(elementVO.getSwitchCategory())) { + //系统获取 + SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds()); + DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); + item.setBusinessId(sysFileVO.getId()); + items.add(item); + return items; + } + } else { + //系统获取 + SysFileVO sysFileVO = getRandomSysFileOutwear(elementVO.getSysFileVo(),elementVO.getSysFileIds()); + DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); + item.setBusinessId(sysFileVO.getId()); + items.add(item); + return items; + } + break; + case NO_PIN: + //single模式 + if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { + if (DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(elementVO.getSwitchCategory())) { + //非Pin的数据 + List noPinDataByType = getNoPinData( + elementVO.getSketchBoardElements(), Collections.singletonList(elementVO.getSwitchCategory())); + CollectionElement collectionElement = getRandomSketchLibrary(noPinDataByType, elementVO.getHasUseMd5List()); + if (Objects.isNull(collectionElement)) { + //系统获取 + SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds()); + DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); + item.setBusinessId(sysFileVO.getId()); + items.add(item); + } else { + elementVO.getHasUseMd5List().add(collectionElement.getMd5()); + items.add(coverToDesignPythonItem(collectionElement.getId(), collectionElement.getLevel2Type(), collectionElement.getUrl(), elementVO)); + } + } + } else { + //非Pin的数据 + List noPinData = getNoPinData(elementVO.getSketchBoardElements(), DesignPythonItem.OUTWEAR_DRESS_BLOUSE); + CollectionElement collectionElement = getRandomSketchLibrary(noPinData, elementVO.getHasUseMd5List()); + if (Objects.isNull(collectionElement)) { + //系统获取 + SysFileVO sysFileVO = getRandomSysFileOutwear(elementVO.getSysFileVo(),elementVO.getSysFileIds()); + DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); + item.setBusinessId(sysFileVO.getId()); + items.add(item); + } else { + elementVO.getHasUseMd5List().add(collectionElement.getMd5()); + items.add(coverToDesignPythonItem(collectionElement.getId(), collectionElement.getLevel2Type(), collectionElement.getUrl(), elementVO)); + } + } + break; + default: + } + return items; + } + + private DesignPythonItem coverToDesignPythonItem(Long elementId, String type, String path, + ValidateElementVO elementVO) { + DesignPythonItem designPythonItemBlouse = new DesignPythonItem(); + if (Objects.nonNull(elementId)) { + designPythonItemBlouse.setElementId(elementId); + designPythonItemBlouse.setBusinessId(elementId); + } + designPythonItemBlouse.setType(type); + designPythonItemBlouse.setPath(path); + //所有的icon都是none + designPythonItemBlouse.setIcon("none"); + designPythonItemBlouse.setColor(getRandomColor(elementVO.getColorBoards())); + if (!elementVO.getDesignPythonItemPrint().getPath().equals("none") + && elementVO.getDesignPrintPictureTypeLayoutList().contains(type)) { + designPythonItemBlouse.setPrint(CopyUtil.copyObject(elementVO.getDesignPythonItemPrint(), DesignPythonItemPrint.class)); + } else { + designPythonItemBlouse.setPrint(new DesignPythonItemPrint("none")); + } + return designPythonItemBlouse; + } + + private List residuePinData(List pinData, List existPinDataIds, List hasUseMd5List) { + if (CollectionUtils.isEmpty(pinData)) { + return null; + } + return pinData.stream().filter(v -> (!existPinDataIds.contains(v.getId())) + && (!hasUseMd5List.contains(v.getMd5()))).collect(Collectors.toList()); + } + + private DesignPythonBasic coverToBasic(DesignPythonItem designPythonItem, String singleOverall, + String switchCategory, DesignLibraryModelPointVO designLibraryModelPoint) { + DesignPythonBasic basic = new DesignPythonBasic(); + basic.setSingle_overall(singleOverall); + basic.setSwitch_category(switchCategory); + basic.setSave_name(getPythonOutputPath( + StringUtils.isEmpty(designPythonItem.getPath()) ? designPythonItem.getBody_path() : designPythonItem.getPath(), + PythonToJavaApiOperationTypeEnum.DESIGN_COLLECTION)); + basic.setScale_bag(0.7); + basic.setSelf_template(Boolean.FALSE); + if (Objects.nonNull(designLibraryModelPoint)) { + basic.setSelf_template(Boolean.TRUE); + } + basic.setScale_earrings(0.16); + basic.setBody_point_test(getMap(designLibraryModelPoint)); + return basic; + } + + private Map> getMap(DesignLibraryModelPointVO designLibraryModelPointOld) { + Map> body_point = Maps.newHashMap(); + if (Objects.nonNull(designLibraryModelPointOld)) { + DesignLibraryModelPointVO designLibraryModelPoint = + CopyUtil.copyObject(designLibraryModelPointOld,DesignLibraryModelPointVO.class); + //自己的template是6个点 + body_point.put("shoulder_left", resolve(designLibraryModelPoint.getShoulderLeft())); + body_point.put("shoulder_right", resolve(designLibraryModelPoint.getShoulderRight())); + body_point.put("waistband_left", resolve(designLibraryModelPoint.getWaistbandLeft())); + body_point.put("waistband_right", resolve(designLibraryModelPoint.getWaistbandRight())); + body_point.put("hand_point_left", resolve(designLibraryModelPoint.getHandLeft())); + body_point.put("hand_point_right", resolve(designLibraryModelPoint.getHandRight())); + } else { + //默认是13个点 + body_point.put("shoulder_left", Arrays.asList(755, 519)); + body_point.put("shoulder_right", Arrays.asList(912, 519)); + body_point.put("waistband_left", Arrays.asList(777, 725)); + body_point.put("waistband_right", Arrays.asList(891, 725)); + body_point.put("hand_point_left", Arrays.asList(754, 886)); + body_point.put("hand_point_right", Arrays.asList(915, 886)); + body_point.put("head_point_up", Arrays.asList(834, 390)); + body_point.put("head_point_left", Arrays.asList(804, 424)); + body_point.put("head_point_right", Arrays.asList(864, 424)); + body_point.put("toe_left", Arrays.asList(817, 1355)); + body_point.put("toe_right", Arrays.asList(850, 1355)); + body_point.put("ear_point_left", Arrays.asList(802, 439)); + body_point.put("ear_point_right", Arrays.asList(865, 438)); + body_point.put("foot_length", Arrays.asList(784, 1336, 825, 1336)); + } + return body_point; + } + + private List resolve(List list) { + List integerList = Lists.newArrayList(); + list.forEach(l ->{ + integerList.add(new Integer(l.intValue())); + }); + return integerList; + } + + private List getPinData(List sketchBoardElements, List hasUseMd5List) { + if (CollectionUtils.isEmpty(sketchBoardElements)) { + return null; + } + List sketchBoardPins = sketchBoardElements + .stream().filter(v -> v.getHasPin() == 1 && (!hasUseMd5List.contains(v.getMd5()))).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(sketchBoardPins)) { + return null; + } + List response = resolveElementFilterHistoryMd5(sketchBoardPins); + if (CollectionUtils.isEmpty(response)) { + return null; + } + return CopyUtil.copyList(sketchBoardPins, CollectionElement.class); + } + + private List resolveElementFilterHistoryMd5(List elemet) { + //查询历史design数据 + List md5List = elemet.stream().map(CollectionElement::getMd5).collect(Collectors.toList()); + List designHistories = designHistoryService.getByMD5List(md5List); + if (CollectionUtils.isEmpty(designHistories)) { + return elemet; + } + List existMd5List = designHistories.stream().map(DesignHistory::getMd5).collect(Collectors.toList()); + return elemet.stream().filter(f -> !existMd5List.contains(f.getMd5())).collect(Collectors.toList()); + } + + private List getPinDataByLevel2Type(List sketchBoardElements, String level2Type) { + if (CollectionUtils.isEmpty(sketchBoardElements)) { + return null; + } + List sketchBoardPins = sketchBoardElements + .stream().filter(v -> v.getHasPin() == 1 && v.getLevel2Type().equals(level2Type)).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(sketchBoardPins)) { + return null; + } + return CopyUtil.copyList(sketchBoardPins, CollectionElement.class); + } + + private List getNoPinData(List sketchBoardElements, List Level2TypeList) { + if (CollectionUtils.isEmpty(sketchBoardElements)) { + return null; + } + List sketchBoardPins = sketchBoardElements + .stream().filter(v -> v.getHasPin() == 0 && Level2TypeList.contains(v.getLevel2Type())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(sketchBoardPins)) { + return null; + } + return CopyUtil.copyList(sketchBoardPins, CollectionElement.class); + } + + private SysFileVO getRandomSysFileOutwear(List sysFileVo,List sysFileIds) { + Long randomIndex = RandomsUtil.randomSysFile(0L, 3L); + if(CollectionUtils.isEmpty(sysFileVo)){ + return getRandomSysFileByLevel2Type(DesignPythonItem.OUTWEAR_DRESS_BLOUSE.get(randomIndex.intValue()), sysFileIds); + }else{ + //attribute_retrieval 算法,满足blouse + outwear+dress>8,以及 skirt+trousers>8 + return getRandomSysFileByAttributeRetrieval(DesignPythonItem.OUTWEAR_DRESS_BLOUSE,sysFileVo, sysFileIds); + } + } + + private SysFileVO getRandomSysFileSkirt(List sysFileVo,List sysFileIds) { + Long randomIndex = RandomsUtil.randomSysFile(0L, 2L); + if(CollectionUtils.isEmpty(sysFileVo)){ + return getRandomSysFileByLevel2Type(DesignPythonItem.SKIRT_TROUSERS.get(randomIndex.intValue()), sysFileIds); + }else{ + //attribute_retrieval 算法,满足blouse + outwear+dress>8,以及 skirt+trousers>8 + return getRandomSysFileByAttributeRetrieval(DesignPythonItem.SKIRT_TROUSERS,sysFileVo, sysFileIds); + } + } + + private SysFileVO getRandomSysFileByLevel2Type(String level2Type, List sysFileIds) { + Long maxId = sysFileService.getMaxIdByLevel2Type(level2Type); + Long minId = sysFileService.getMinIdByLevel2Type(level2Type); + Long sysFileId = null; + do { + sysFileId = RandomsUtil.randomSysFile(minId, maxId + 1); + } while (sysFileIds.contains(sysFileId)); + sysFileIds.add(sysFileId); + return sysFileService.getById(sysFileId); + } + private SysFileVO getRandomSysFileByAttributeRetrieval(List level2TypeList,List sysFileVo,List sysFileIds) { + sysFileVo = sysFileVo.stream().filter( + f ->level2TypeList.contains(f.getLevel2Type()) && ( !sysFileIds.contains(f.getId())) ) + .collect(Collectors.toList()); + Long maxId = (long) sysFileVo.size(); + Long minId = 0L; + Long key = null; + Long sysFileId = null; + do { + key = RandomsUtil.randomSysFile(minId, maxId); + sysFileId = sysFileVo.get(key.intValue()).getId(); + } while (sysFileIds.contains(sysFileId)); + sysFileIds.add(sysFileId); + return sysFileVo.get(key.intValue()); + } + + private String getRandomColor(List colorBoards) { + if (colorBoards.size() == 1) { + return colorBoards.get(0).getRgbValue(); + } + long maxColor = colorBoards.size(); + long minColor = 0; + Long randomIndex = RandomsUtil.randomSysFile(minColor, maxColor); + return colorBoards.get(randomIndex.intValue()).getRgbValue(); + } + + private CollectionElement getRandomSketchLibrary(List sketchBoardElementOlds, List hasUseMd5List) { + if (CollectionUtil.isEmpty(sketchBoardElementOlds)) { + return null; + } + List sketchBoardElements = sketchBoardElementOlds.stream().filter(f -> !hasUseMd5List.contains(f.getMd5())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(sketchBoardElements)) { + return null; + } + if (sketchBoardElements.size() == 1) { + return sketchBoardElements.get(0); + } + long maxSketch = sketchBoardElements.size(); + long minSketch = 0; + Long randomIndex = RandomsUtil.randomSysFile(minSketch, maxSketch); + return sketchBoardElements.get(randomIndex.intValue()); + } + + private DesignPythonItemPrint getRandomPrint(ValidateElementVO elementVO, CurrentDesignPrintPictureTypeEnum designPrintPictureType) { + //print 不取library的 只取element的 + DesignPythonItemPrint print = new DesignPythonItemPrint(); + if (CollectionUtil.isEmpty(elementVO.getPrintBoardElements())) { + print.setPath("none"); + return print; + } + List printBoardElements = elementVO.getPrintBoardElements() + .stream() + .filter(f -> !elementVO.getHasUseMd5List().contains(f.getMd5())).collect(Collectors.toList()); + if (CollectionUtil.isEmpty(printBoardElements)) { + print.setPath("none"); + return print; + } + switch (designPrintPictureType) { + case NO: + //print 已用完 + print.setPath("none"); + return print; + case NO_PIN: + printBoardElements = printBoardElements.stream().filter(f -> f.getHasPin() == 0).collect(Collectors.toList()); + break; + case PIN: + printBoardElements = printBoardElements.stream().filter(f -> f.getHasPin() == 1).collect(Collectors.toList()); + break; + default: + } + + if (printBoardElements.size() == 1) { + print.setPath(printBoardElements.get(0).getUrl()); + elementVO.getHasUseMd5List().add(printBoardElements.get(0).getMd5()); + return print; + } + long maxPrint = printBoardElements.size(); + long minPrint = 0; + Long randomIndex = RandomsUtil.randomSysFile(minPrint, maxPrint); + print.setPath(printBoardElements.get(randomIndex.intValue()).getUrl()); + elementVO.getHasUseMd5List().add(printBoardElements.get(randomIndex.intValue()).getMd5()); + return print; + } + + private LibraryVo getRandomLibrary(List libraryOldVos, List containLevel2Type, List hasUseMd5List) { + if (CollectionUtils.isEmpty(libraryOldVos)) { + return null; + } + List libraryVos = libraryOldVos.stream().filter(f -> (!hasUseMd5List.contains(f.getMd5())) && + CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName().equals(f.getLevel1Type())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(libraryVos)) { + return null; + } + if (StringUtils.isEmpty(containLevel2Type)) { + if (libraryVos.size() == 1) { + return libraryVos.get(0); + } + long maxLibrary = libraryVos.size(); + long minLibrary = 0; + Long randomIndex = RandomsUtil.randomSysFile(minLibrary, maxLibrary); + return libraryVos.get(randomIndex.intValue()); + } else { + List filter = libraryVos.stream().filter(f -> containLevel2Type.contains(f.getLevel2Type())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(filter)) { + return null; + } + if (filter.size() == 1) { + return filter.get(0); + } + long maxLibrary = filter.size(); + long minLibrary = 0; + Long randomIndex = RandomsUtil.randomSysFile(minLibrary, maxLibrary); + return filter.get(randomIndex.intValue()); + } + + } + + /** + * 生成design服装 + * + * @param designPythonObjects + * @return + */ + public Boolean design(DesignPythonObjects designPythonObjects) { + //限流校验 + AccessLimitUtils.validate("design",5); + 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(designPythonObjects, SerializerFeature.DisableCircularReferenceDetect); + log.info("design请求python 参数:####{}", param); + RequestBody body = RequestBody.create(mediaType, param); + Request request = new Request.Builder() + .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(); + log.info("PythonService##response###{}", response); + log.info("PythonService##responseBodyStr###{}", response.body().string()); + log.info("PythonService##responseBodyJson###{}", JSON.toJSONString(response.body())); + } catch (IOException ioException) { + log.error("PythonService##design异常###{}", ExceptionUtil.getThrowableList(ioException)); + } + //去除限流 + AccessLimitUtils.validateOut("design"); + if (Objects.isNull(response)) { + log.error("PythonService##design异常###{}", "response or body is empty!"); + throw new BusinessException("system error!"); + } + JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(response)); + log.info("PythonService##jsonObject###{}", jsonObject); + Boolean result = jsonObject.getBoolean("successful"); + if (result) { + return Boolean.TRUE; + } + log.info("PythonService##design异常jsonObject###{}", jsonObject); + //生成失败 + throw new BusinessException("generate design exception!"); + } + + /** + * 生成高级图片 + * + * @param designPath + * @return + */ + public String generateHighDesign(String designPath) { + //限流校验 + AccessLimitUtils.validate("generateHighDesign",2); + OkHttpClient client = new OkHttpClient().newBuilder() + .connectTimeout(30, TimeUnit.SECONDS) + .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) + .readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒) + .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒) + .build(); + Map content = Maps.newHashMap(); + content.put("img_path", designPath); + content.put("img_path_out_put", getPythonOutputPath( + designPath, PythonToJavaApiOperationTypeEnum.GENERATE_ADVANCED_DESIGN)); + MediaType mediaType = MediaType.parse("application/json"); + RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content)); + Request request = new Request.Builder() + .url(accessPythonIp + ":11111/aifda/api/v1.0/sketch_to_real") + .method("POST", body) + .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") + .addHeader("Content-Type", "application/json") + .build(); + Response response = null; + try { + log.info("生成高级design请求入参content###{}", JSON.toJSONString(content)); + response = client.newCall(request).execute(); + } catch (IOException ioException) { + log.error("PythonService##generateHighDesign异常###{}", ExceptionUtil.getThrowableList(ioException)); + } + //去除限流 + AccessLimitUtils.validateOut("generateHighDesign"); + if (Objects.isNull(response)) { + log.error("PythonService##generateHighDesign异常###{}", "response or body is empty!"); + throw new BusinessException("system error!"); + } + JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(response)); + Boolean result = jsonObject.getBoolean("successful"); + if (result) { + return content.get("img_path_out_put"); + } + log.info("生成高级design失败###{}", jsonObject); + //生成失败 + throw new BusinessException("system error!"); + } + /** + * 生成 attribute_retrieval + * + * @param sketchUrlList + * @return + */ + public DesignAttributeRetrievalDTO generateAttributeRetrieval(List sketchUrlList, Long userId) { + //限流校验 + AccessLimitUtils.validate("generateAttributeRetrieval",4); + OkHttpClient client = new OkHttpClient().newBuilder() + .connectTimeout(30, TimeUnit.SECONDS) + .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) + .readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒) + .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒) + .build(); + Map content = Maps.newHashMap(); + content.put("sketch_upload_img_path", sketchUrlList); + content.put("userid", userId); + MediaType mediaType = MediaType.parse("application/json"); + RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content)); + Request request = new Request.Builder() + .url(accessPythonIp+":11112/aifda/api/v1.0/attribute_retrieval") + .method("POST", body) + .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") + .addHeader("Content-Type", "application/json") + .build(); + Response response = null; + String bodyStr = null; + try { + log.info("generateAttributeRetrieval请求入参content###{}", JSON.toJSONString(content)); + response = client.newCall(request).execute(); + bodyStr = response.body().string(); + } catch (IOException ioException) { + log.error("generateAttributeRetrieval异常###{}", ExceptionUtil.getThrowableList(ioException)); + } + //去除限流 + AccessLimitUtils.validateOut("generateAttributeRetrieval"); + if (Objects.isNull(response)) { + log.error("generateAttributeRetrieval异常###{}", "response or body is empty!"); + throw new BusinessException("system error!"); + } + JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(response)); + Boolean result = jsonObject.getBoolean("successful"); + if (result) { + return resolveDesignAttributeRetrievalDTO(bodyStr); + } + log.info("attribute_retrieval失败###{}", bodyStr); + //生成失败 + throw new BusinessException("system error!"); + } + private static DesignAttributeRetrievalDTO resolveDesignAttributeRetrievalDTO(String bodyStr){ + DesignAttributeRetrievalDTO response = new DesignAttributeRetrievalDTO(); + JSONObject jsonObject = JSON.parseObject(bodyStr); + JSONObject jsonObjectSys = jsonObject.getJSONObject("sys_lib_dict"); + if(null == jsonObjectSys || jsonObjectSys.size() == 0){ + log.error("generateAttributeRetrieval异常###{}", "jsonObjectSys is empty!"); + throw new BusinessException("system error!"); + } + setUrls(jsonObjectSys,response.getSysFileUrlS()); + JSONObject jsonObjectLibrary = jsonObject.getJSONObject("user_lib_dict"); + if(null == jsonObjectLibrary || jsonObjectLibrary.size() == 0){ + log.error("generateAttributeRetrieval异常###{}", "jsonObjectLibrary is empty!"); + throw new BusinessException("system error!"); + } + setUrls(jsonObjectLibrary,response.getLibraryUrls()); + return response; + } + + private static void setUrls(JSONObject jsonObjectSys,List urls){ + List finalUrls = urls; + SysFileLevel2TypeEnum.ofPythonPath().forEach(path ->{ + JSONArray array = jsonObjectSys.getJSONArray(path); + List urlList = JSONObject.parseArray(JSON.toJSONString(array),String.class); + if(CollectionUtil.isNotEmpty(urlList)){ + finalUrls.addAll(urlList); + } + }); + } + + /** + * 组装和计算designSingle参数 + * + * @param designSingleDTO + * @return + */ + public DesignPythonObjects covertDesignSingleParam(DesignSingleDTO designSingleDTO, String singleOverall, + String switchCategory, DesignLibraryModelPointVO designLibraryModelPoint) { + DesignPythonObjects designPythonObjects = new DesignPythonObjects(); + List objects = Lists.newArrayList(); + designPythonObjects.setObjects(objects); + + DesignPythonObject pythonObject = new DesignPythonObject(); + pythonObject.setItems(coverToDesignSinglePythonItem(designSingleDTO, designLibraryModelPoint)); + pythonObject.setBasic(coverToSingleBasic(pythonObject.getItems().get(0), + singleOverall, switchCategory, designSingleDTO.getPriority(), designLibraryModelPoint)); + objects.add(pythonObject); + return designPythonObjects; + } + + private List coverToDesignSinglePythonItem(DesignSingleDTO designSingleDTO, DesignLibraryModelPointVO designLibraryModelPoint) { + List designPythonItemDto = designSingleDTO.getClothes(); + if (!CollectionUtils.isEmpty(designSingleDTO.getOthers())) { + designPythonItemDto.addAll(designSingleDTO.getOthers()); + } + List response = CopyUtil.copyList(designPythonItemDto, DesignPythonItem.class, (o, d) -> { + d.setBusinessId(o.getId()); + d.setIcon("none"); + d.setPrint(resolveDesignSinglePrint(o.getPrintObject(), o.getPath())); + }); + DesignPythonItem body = new DesignPythonItem(); + body.setType(SysFileLevel2TypeEnum.BODY.getRealName()); + if (Objects.nonNull(designLibraryModelPoint)) { + body.setBody_path(designLibraryModelPoint.getTemplateUrl()); + } else { +// body.setBody_path("/home/pangkaicheng/python_code/Multi-layer-Virtual-Try-on/dataset_for_test/Img_model.png"); + body.setBody_path("/workspace/python_code/Multi-layer-Virtual-Try-on/dataset_for_test/Img_model.png"); + } + response.add(body); + return response; + } + + private DesignPythonItemPrint resolveDesignSinglePrint(DesignPythonItemPrint printObject, String clothesPath) { + if (Objects.isNull(printObject)) { + return null; + } + DesignPythonItemPrint print = CopyUtil.copyObject(printObject, DesignPythonItemPrint.class); + if (StringUtils.isEmpty(clothesPath) + || "none".equals(clothesPath) + || CollectionUtils.isEmpty(printObject.getLocation())) { + return print; + } + //图片宽 高 + FileVO fileVO = FileUtil.getFileSize(FileUtil.getOriginFile(clothesPath)); + List> locations = printObject.getLocation(); + locations.forEach(location -> { + location.set(0, location.get(0) * fileVO.getWidth()); + location.set(1, location.get(1) * fileVO.getHigh()); + }); + log.info("本次print打点locations###{}###fileVO{}", locations, JSON.toJSONString(fileVO)); + return print; + } + + private DesignPythonBasic coverToSingleBasic(DesignPythonItem designPythonItem, String singleOverall, + String switchCategory, List priority, + DesignLibraryModelPointVO designLibraryModelPoint) { + DesignPythonBasic basic = new DesignPythonBasic(); + basic.setSingle_overall(singleOverall); + basic.setSwitch_category(switchCategory); + basic.setSave_name(getPythonOutputPath( + StringUtils.isEmpty(designPythonItem.getPath()) ? designPythonItem.getBody_path() : designPythonItem.getPath(), + PythonToJavaApiOperationTypeEnum.DESIGN_COLLECTION)); + basic.setPriority(priority); + basic.setSelf_template(Boolean.FALSE); + if (Objects.nonNull(designLibraryModelPoint)) { + basic.setSelf_template(Boolean.TRUE); + } + basic.setScale_bag(0.7); + basic.setScale_earrings(0.16); + basic.setBody_point_test(getMap(designLibraryModelPoint)); + return basic; + } + + /** + * 组装和计算designSingle参数 + * + * @param modelsDotDTO + * @return + */ + public DesignPythonObjects covertModelsDotParam(ModelsDotDTO modelsDotDTO, String singleOverall, String switchCategory) { + DesignPythonObjects designPythonObjects = new DesignPythonObjects(); + List objects = Lists.newArrayList(); + designPythonObjects.setObjects(objects); + + DesignPythonObject pythonObject = new DesignPythonObject(); + pythonObject.setItems(coverToModelsDotPythonItem(modelsDotDTO)); + pythonObject.setBasic(coverToModelsDotBasic(pythonObject.getItems().get(0), modelsDotDTO)); + objects.add(pythonObject); + return designPythonObjects; + } + + private List coverToModelsDotPythonItem(ModelsDotDTO modelsDotDTO) { + List response = Lists.newArrayList(); + DesignPythonItem dress = new DesignPythonItem(); + dress.setType(SysFileLevel2TypeEnum.DRESS.getRealName()); + dress.setColor("none"); + dress.setIcon("none"); + dress.setPrint(new DesignPythonItemPrint("none", + CollectionLevel1TypeEnum.PRINT_BOARD.getRealName(), 0.3f, Boolean.FALSE)); + dress.setPath("https://www.aida.com.hk/download/sys/images/blouse/blouse_p5_817.jpg"); + response.add(dress); + + DesignPythonItem skirt = new DesignPythonItem(); + skirt.setType(SysFileLevel2TypeEnum.SKIRT.getRealName()); + skirt.setColor("none"); + skirt.setIcon("none"); + skirt.setPrint(new DesignPythonItemPrint("none", + CollectionLevel1TypeEnum.PRINT_BOARD.getRealName(), 0.3f, Boolean.FALSE)); + skirt.setPath("https://www.aida.com.hk/download/sys/images/trousers/trousers_974.jpg"); + response.add(skirt); + + DesignPythonItem body = new DesignPythonItem(); + body.setType(SysFileLevel2TypeEnum.BODY.getRealName()); + body.setBody_path(modelsDotDTO.getTemplateUrl()); + response.add(body); + return response; + } + + private DesignPythonBasic coverToModelsDotBasic(DesignPythonItem designPythonItem, ModelsDotDTO modelsDotDTO) { + DesignPythonBasic basic = new DesignPythonBasic(); + basic.setSingle_overall(SingleOverallEnum.OVERALL.getRealName()); + basic.setSwitch_category(""); + basic.setSave_name(getPythonOutputPath( + StringUtils.isEmpty(designPythonItem.getPath()) ? designPythonItem.getBody_path() : designPythonItem.getPath(), + PythonToJavaApiOperationTypeEnum.DESIGN_COLLECTION)); + basic.setSelf_template(Boolean.TRUE); + basic.setScale_bag(0.7); + basic.setScale_earrings(0.16); + + basic.setBody_point_test(getMap(calculateTemplatePoint(modelsDotDTO, modelsDotDTO.getHigh(), modelsDotDTO.getWidth()))); + return basic; + } + + public DesignLibraryModelPointVO calculateTemplatePoint(ModelsDotDTO modelsDotDTO, Integer high, Integer width) { + DesignLibraryModelPointVO libraryModelPoint = new DesignLibraryModelPointVO(); + libraryModelPoint.setHandLeft(calculateTemplatePointOne(modelsDotDTO.getHandLeft(), high, width)); + libraryModelPoint.setHandRight(calculateTemplatePointOne(modelsDotDTO.getHandRight(), high, width)); + libraryModelPoint.setShoulderLeft(calculateTemplatePointOne(modelsDotDTO.getShoulderLeft(), high, width)); + libraryModelPoint.setShoulderRight(calculateTemplatePointOne(modelsDotDTO.getShoulderRight(), high, width)); + libraryModelPoint.setWaistbandLeft(calculateTemplatePointOne(modelsDotDTO.getWaistbandLeft(), high, width)); + libraryModelPoint.setWaistbandRight(calculateTemplatePointOne(modelsDotDTO.getWaistbandRight(), high, width)); + return libraryModelPoint; + } + + private List calculateTemplatePointOne(List originRatioList, Integer high, Integer width) { + originRatioList.set(0, originRatioList.get(0).multiply(BigDecimal.valueOf(width))); + originRatioList.set(1, originRatioList.get(1).multiply(BigDecimal.valueOf(high))); + return originRatioList; + } +} diff --git a/src/main/java/com/ai/da/python/vo/DesignPythonBasic.java b/src/main/java/com/ai/da/python/vo/DesignPythonBasic.java new file mode 100644 index 00000000..8cc1765c --- /dev/null +++ b/src/main/java/com/ai/da/python/vo/DesignPythonBasic.java @@ -0,0 +1,39 @@ +package com.ai.da.python.vo; + +import com.google.common.collect.Maps; +import lombok.Data; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +@Data +public class DesignPythonBasic { + /** + * 生成后的图片路径 + */ + private String save_name; + + private String single_overall; + + private String switch_category; + /** + * 排序 + */ + private List priority; + /** + * 是否是自己的模板 是传true 否则false + */ + private Boolean self_template; + + + /** + * body 模特部分 + */ + private Double scale_bag; + + private Double scale_earrings; + + private Map> body_point_test = Maps.newHashMap(); + +} diff --git a/src/main/java/com/ai/da/python/vo/DesignPythonItem.java b/src/main/java/com/ai/da/python/vo/DesignPythonItem.java new file mode 100644 index 00000000..5cbba4b8 --- /dev/null +++ b/src/main/java/com/ai/da/python/vo/DesignPythonItem.java @@ -0,0 +1,70 @@ +package com.ai.da.python.vo; + +import com.ai.da.common.enums.CollectionLevel2TypeEnum; +import com.ai.da.common.enums.SysFileLevel2TypeEnum; +import lombok.Data; + +import java.util.Arrays; +import java.util.List; + +@Data +public class DesignPythonItem { + /** + * elementId + */ + private Long elementId; + /** + * 生成item实际对应的类型 有:outwear,dress,blouse,skirt,trousers Shoes Hairstyle Earring + */ + private String type; + + /** + * 对应的图片的绝对路径 + */ + private String path; + + /** + * 颜色 存 RGB值 中间空格分隔 比如 "58 58 169" + */ + private String color; + + /** + * 对应的print图片的绝对路径 + */ + private DesignPythonItemPrint print; + + /** + * 对应的icon的绝对路径 + */ + private String icon; + + /** + * 上游业务id + */ + private Long businessId; + + /** + * body 对应路径 + */ + private String body_path; + + /** + * body 对应路径(后面去掉) + */ + private String body_mask_path; + + + public static List OUTWEAR_DRESS_BLOUSE = Arrays.asList(CollectionLevel2TypeEnum.OUTWEAR.getRealName(), + CollectionLevel2TypeEnum.DRESS.getRealName(),CollectionLevel2TypeEnum.BLOUSE.getRealName()); + + public static List SKIRT_TROUSERS = Arrays.asList( + CollectionLevel2TypeEnum.SKIRT.getRealName(), CollectionLevel2TypeEnum.TROUSERS.getRealName()); + + public static List SYS_HAIRSTYLE_SHOES_BODY = Arrays.asList( + SysFileLevel2TypeEnum.HAIRSTYLE.getRealName(), SysFileLevel2TypeEnum.SHOES.getRealName(), + SysFileLevel2TypeEnum.EARRINGS.getRealName(),SysFileLevel2TypeEnum.BODY.getRealName()); + + public static List SYS_HAIRSTYLE_SHOES = Arrays.asList( + SysFileLevel2TypeEnum.HAIRSTYLE.getRealName(), SysFileLevel2TypeEnum.SHOES.getRealName(), + SysFileLevel2TypeEnum.EARRINGS.getRealName()); +} diff --git a/src/main/java/com/ai/da/python/vo/DesignPythonItemBody.java b/src/main/java/com/ai/da/python/vo/DesignPythonItemBody.java new file mode 100644 index 00000000..5908b38e --- /dev/null +++ b/src/main/java/com/ai/da/python/vo/DesignPythonItemBody.java @@ -0,0 +1,24 @@ +package com.ai.da.python.vo; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class DesignPythonItemBody { + /** + * 生成item实际对应的类型 有:outwear,dress,blouse,skirt,trousers Shoes Hairstyle Earring + */ + private String type; + + /** + * 模特图片路径 + */ + private String body_path; + + /** + * 先写死 + */ + private String body_mask_path; +} diff --git a/src/main/java/com/ai/da/python/vo/DesignPythonItemPrint.java b/src/main/java/com/ai/da/python/vo/DesignPythonItemPrint.java new file mode 100644 index 00000000..40ca5ab8 --- /dev/null +++ b/src/main/java/com/ai/da/python/vo/DesignPythonItemPrint.java @@ -0,0 +1,55 @@ +package com.ai.da.python.vo; + +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class DesignPythonItemPrint { + /** + * print 绝对路径 + */ + @ApiModelProperty("图片绝对路径") + private String path; + + @ApiModelProperty("上传时候对应的类型,一级类型 Printboard ") + private String level1Type; + + /** + * print_scale + */ + @ApiModelProperty("print_scale") + private Float scale; + + /** + * 是否打点 + */ + + @ApiModelProperty("是否打点 是传true 否则false") + private Boolean IfSingle; + + + @ApiModelProperty("打点的位置 传 [[0.2, 0.2]]") + private List> location; + + @JSONField(name="IfSingle") + public Boolean getIfSingle() { + return IfSingle; + } + + public DesignPythonItemPrint(String path, String level1Type, Float scale, Boolean ifSingle) { + this.path = path; + this.level1Type = level1Type; + this.scale = scale; + IfSingle = ifSingle; + } + + public DesignPythonItemPrint() { + } + + public DesignPythonItemPrint(String path) { + this.path = path; + } +} diff --git a/src/main/java/com/ai/da/python/vo/DesignPythonObject.java b/src/main/java/com/ai/da/python/vo/DesignPythonObject.java new file mode 100644 index 00000000..aa6a11e2 --- /dev/null +++ b/src/main/java/com/ai/da/python/vo/DesignPythonObject.java @@ -0,0 +1,18 @@ +package com.ai.da.python.vo; + +import lombok.Data; + +import java.util.List; + +@Data +public class DesignPythonObject { + + /** + * items选项 + */ + List items; + /** + * basic 选项 + */ + DesignPythonBasic basic; +} diff --git a/src/main/java/com/ai/da/python/vo/DesignPythonObjects.java b/src/main/java/com/ai/da/python/vo/DesignPythonObjects.java new file mode 100644 index 00000000..25dad382 --- /dev/null +++ b/src/main/java/com/ai/da/python/vo/DesignPythonObjects.java @@ -0,0 +1,17 @@ +package com.ai.da.python.vo; + +import com.ai.da.mapper.entity.Library; +import lombok.Data; + +import java.util.List; +@Data +public class DesignPythonObjects { + /** + * objects选项 + */ + List objects; + /** + * design新增的library + */ + List addLibrary; +} diff --git a/src/main/java/com/ai/da/service/AccountLoginLogService.java b/src/main/java/com/ai/da/service/AccountLoginLogService.java new file mode 100644 index 00000000..6068f215 --- /dev/null +++ b/src/main/java/com/ai/da/service/AccountLoginLogService.java @@ -0,0 +1,35 @@ +package com.ai.da.service; + +import com.ai.da.mapper.entity.AccountLoginLog; +import com.ai.da.model.dto.EmailSendDTO; +import com.ai.da.model.dto.NoteSendDTO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 服务类 + * + * @author easy-generator + * @since 2022-08-11 + */ +public interface AccountLoginLogService extends IService { + + /** + * 保存日志 + * + * @param ip + * @param accountId + * @return + */ + Boolean saveLoginLog(String ip ,Long accountId); + + /** + * 根据账户查询 + * + * @param AccountId + * @return + */ + List getByUserId(Long AccountId); + +} diff --git a/src/main/java/com/ai/da/service/AccountService.java b/src/main/java/com/ai/da/service/AccountService.java new file mode 100644 index 00000000..794478c9 --- /dev/null +++ b/src/main/java/com/ai/da/service/AccountService.java @@ -0,0 +1,76 @@ +package com.ai.da.service; + +import com.ai.da.mapper.entity.Account; +import com.ai.da.model.dto.*; +import com.ai.da.model.vo.AccountLoginVO; +import com.ai.da.model.vo.AccountPreLoginVO; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.bind.annotation.RequestBody; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; + +/** + * 服务类 + * + * @author easy-generator + * @since 2022-08-11 + */ +public interface AccountService extends IService { + + /** + * 账户预先登入 + * @param accountDTO + * @return + */ + AccountPreLoginVO preLogin(AccountPreLoginDTO accountDTO); + /** + * 账户登入 + * @param accountLoginDTO + * @return + */ + AccountLoginVO login(AccountLoginDTO accountLoginDTO, HttpServletRequest request); + /** + * 绑定邮箱 + * @param accountBindEmailDTO + * @return + */ + Boolean bindEmail(AccountBindEmailDTO accountBindEmailDTO); + + /** + * 忘记密码 + * @param accountDTO + * @return + */ + Boolean forgetPwd(AccountRegisterDTO accountDTO); + /** + * 发送邮件 + * @param emailSendDTO + * @return + */ + Boolean sendEmail(EmailSendDTO emailSendDTO); + /** + * 登出 + * @param accountLogoutDTO + * @return + */ + Boolean logout(AccountLogoutDTO accountLogoutDTO); + /** + * 判断是否登出 Boolean为登入 + * @param accountLogoutDTO + * @return + */ + Boolean isLogin(AccountLogoutDTO accountLogoutDTO); + /** + * 添加用户信息 + * @param accountAddDTO + * @return + */ + Boolean addUser(AccountAddDTO accountAddDTO); + /** + * 编辑用户信息 + * @param accountEditDTO + * @return + */ + Boolean editUser(AccountEditDTO accountEditDTO) ; +} diff --git a/src/main/java/com/ai/da/service/CollectionElementService.java b/src/main/java/com/ai/da/service/CollectionElementService.java new file mode 100644 index 00000000..dbc3757a --- /dev/null +++ b/src/main/java/com/ai/da/service/CollectionElementService.java @@ -0,0 +1,110 @@ +package com.ai.da.service; + +import com.ai.da.mapper.entity.CollectionElement; +import com.ai.da.mapper.entity.LibraryModelPoint; +import com.ai.da.model.dto.*; +import com.ai.da.model.vo.*; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 服务类 + * + * @author yanglei + * @since 2022-09-11 + */ +public interface CollectionElementService extends IService { + + /** + * 上传元素图片 + * + * @param collectionElementUploadDTO + * @return + */ + CollectionElementVO upload(CollectionElementUploadDTO collectionElementUploadDTO); + + /** + * 删除元素图片 + * + * @param id + * @return + */ + void delete(Long id); + /** + * 删除元素图片 + * + * @param ids + * @return + */ + void batchDelete(List ids); + /** + * 生产印花图片 + * + * @param generatePrintDTO + * @return + */ + CollectionGeneratePrintVO generatePrint(CollectionGeneratePrintDTO generatePrintDTO); + /** + * 保存印花图片 + * + * @param savePrintDTO + * @return + */ + Boolean savePrint(CollectionSavePrintDTO savePrintDTO); + /** + * 通过element保存library + * + * @param elements + * @return + */ + Boolean saveLibraryByCollectionElement(List elements,String timeZone); + /** + * 校验element + * + * @param designDTO + * @return + */ + ValidateElementVO validateElement(DesignCollectionDTO designDTO); + /** + * 编辑 + * + * @param elementVO + * @return + */ + void editSketchBoardsElement(ValidateElementVO elementVO, List sketchBoards); + /** + * 编辑 + * + * @param elementVO + * @return + */ + void editPrintBoardsElement(ValidateElementVO elementVO, List printBoards); + /** + * 关联element和collection + * + * @param elementIds + * @param collectionId + * @return + */ + void relationCollection(List elementIds,Long collectionId); + + /** + * 保存颜色板 + * + * @param colorBoards + * @return + */ + List saveColorBoard(List colorBoards, Long collectionId, String timeZone); + + /** + * 根据collection查询 + * + * @param collectionId + * @return + */ + List getByCollectionId(Long collectionId); + + DesignLibraryModelPointVO calculateTemplatePoint(LibraryModelPoint modelPoint, Integer high, Integer width, String templateUrl); + +} diff --git a/src/main/java/com/ai/da/service/CollectionService.java b/src/main/java/com/ai/da/service/CollectionService.java new file mode 100644 index 00000000..207663f8 --- /dev/null +++ b/src/main/java/com/ai/da/service/CollectionService.java @@ -0,0 +1,34 @@ +package com.ai.da.service; + +import com.ai.da.mapper.entity.Collection; +import com.ai.da.mapper.entity.CollectionElement; +import com.ai.da.model.dto.CollectionElementUploadDTO; +import com.ai.da.model.dto.CollectionGeneratePrintDTO; +import com.ai.da.model.dto.CollectionSavePrintDTO; +import com.ai.da.model.vo.CollectionElementVO; +import com.ai.da.model.vo.CollectionGeneratePrintVO; +import com.ai.da.model.vo.UserLikeCollectionVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 服务类 + * + * @author yanglei + * @since 2022-09-11 + */ +public interface CollectionService extends IService { + /** + * 保存collection + */ + Long saveCollection(Long accountId,String timeZone,String moodTemplateId); + /** + * 根据主键查询 + */ + Collection findById(Long id); + /** + * 查询choose关联的collection + */ + UserLikeCollectionVO chooseCollection(Long id); +} diff --git a/src/main/java/com/ai/da/service/ColorLoopUpTableService.java b/src/main/java/com/ai/da/service/ColorLoopUpTableService.java new file mode 100644 index 00000000..adfc9533 --- /dev/null +++ b/src/main/java/com/ai/da/service/ColorLoopUpTableService.java @@ -0,0 +1,33 @@ +package com.ai.da.service; + +import com.ai.da.mapper.entity.ColorLookupTable; +import com.ai.da.mapper.entity.PanTone; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 服务类 + * + * @author easy-generator + * @since 2022-09-30 + */ +public interface ColorLoopUpTableService extends IService { + + /** + * 根据colorValue值查询 + * + * @param colorValue + * @return + */ + ColorLookupTable getByColorValue(Integer colorValue); + + /** + * 根据colorValue值查询 + * + * @param colorValues + * @return + */ + List getByColorValueList(List colorValues); + +} diff --git a/src/main/java/com/ai/da/service/DesignHistoryService.java b/src/main/java/com/ai/da/service/DesignHistoryService.java new file mode 100644 index 00000000..249bc2c2 --- /dev/null +++ b/src/main/java/com/ai/da/service/DesignHistoryService.java @@ -0,0 +1,25 @@ +package com.ai.da.service; + +import com.ai.da.mapper.entity.DesignHistory; +import com.ai.da.mapper.entity.Library; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 服务类 + * + * @author yanglei + * @since 2022-09-11 + */ +public interface DesignHistoryService extends IService { + + /** + * 根据md5集合查询 + * + * @param md5List + */ + List getByMD5List(List md5List); + + +} diff --git a/src/main/java/com/ai/da/service/DesignItemDetailService.java b/src/main/java/com/ai/da/service/DesignItemDetailService.java new file mode 100644 index 00000000..2ed66dd4 --- /dev/null +++ b/src/main/java/com/ai/da/service/DesignItemDetailService.java @@ -0,0 +1,22 @@ +package com.ai.da.service; + +import com.ai.da.mapper.entity.DesignItemDetail; +import com.baomidou.mybatisplus.extension.service.IService; +import sun.security.krb5.internal.crypto.Des; + +import java.util.List; + +/** + * 服务类 + * + * @author yanglei + * @since 2022-09-11 + */ +public interface DesignItemDetailService extends IService { + + int deleteByDesignId(Long designId); + + int deleteByDesignItemId(Long designItemId); + + List selectByDesignItemId(Long designItemId); +} diff --git a/src/main/java/com/ai/da/service/DesignItemService.java b/src/main/java/com/ai/da/service/DesignItemService.java new file mode 100644 index 00000000..766625bb --- /dev/null +++ b/src/main/java/com/ai/da/service/DesignItemService.java @@ -0,0 +1,50 @@ +package com.ai.da.service; + +import com.ai.da.mapper.entity.DesignItem; +import com.ai.da.model.dto.DesignSingleDTO; +import com.ai.da.model.vo.DesignCollectionItemVO; +import com.ai.da.model.vo.DesignCollectionVO; +import com.ai.da.model.vo.DesignItemOthersDetailVO; +import com.ai.da.model.vo.GetNextSysElementVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 服务类 + * + * @author yanglei + * @since 2022-09-11 + */ +public interface DesignItemService extends IService { + + Long saveOne(DesignItem designItem); + + int deleteByCollectionId(Long collectionId); + + List getByDesignId(Long designId); + + void updateLikeStatus(Long designItemId,Byte hasLike); + + void updateDesignHighUrl(Long designItemId,String highUrl,String timeZone); + + /** + * 切换系统elemnt + * @param id + * @param type + */ + GetNextSysElementVO getNextSysElement(Long id, String type, String operateType); + + /** + * 单个design + * @param designSingleDTO + */ + DesignCollectionItemVO designSingle(DesignSingleDTO designSingleDTO); + + /** + * print打点 + * @param designSingleDTO + */ + String printDot(DesignSingleDTO designSingleDTO); + +} diff --git a/src/main/java/com/ai/da/service/DesignService.java b/src/main/java/com/ai/da/service/DesignService.java new file mode 100644 index 00000000..cdf597ee --- /dev/null +++ b/src/main/java/com/ai/da/service/DesignService.java @@ -0,0 +1,78 @@ +package com.ai.da.service; + +import com.ai.da.mapper.entity.Design; +import com.ai.da.model.dto.*; +import com.ai.da.model.vo.DesignCollectionVO; +import com.ai.da.model.vo.DesignItemDetailVO; +import com.ai.da.model.vo.DesignLikeVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.math.BigDecimal; + +/** + * 服务类 + * + * @author yanglei + * @since 2022-09-11 + */ +public interface DesignService extends IService { + /** + * design + * @param designDTO + * @return + */ + DesignCollectionVO designCollection(DesignCollectionDTO designDTO); + + /** + * redesign + * @param reDesignDTO + * @return + */ + DesignCollectionVO reDesignCollection(ReDesignCollectionDTO reDesignDTO); + /** + * redesign + * @param designId + * @return + */ + DesignCollectionVO designItemList(Long designId); + + /** + * @return + */ + BigDecimal countDesignProcess(); + + /** + * like + * @param designLikeDTO + * @return + */ + DesignLikeVO like(DesignLikeDTO designLikeDTO); + + /** + * dislike + * @param disDesignLikeDTO + * @return + */ + Boolean dislike(DisDesignLikeDTO disDesignLikeDTO); + + /** + * generateHighDesign + * @param generateHighDesignDTO + * @return + */ + String generateHighDesign(GenerateHighDesignDTO generateHighDesignDTO); + + /** + * deleteHighDesign + * @param generateHighDesignDTO + * @return + */ + Boolean deleteHighDesign(GenerateHighDesignDTO generateHighDesignDTO); + + /** + * detail + * @param designItemId + * @return + */ + DesignItemDetailVO detail(Long designItemId); +} diff --git a/src/main/java/com/ai/da/service/LibraryModelPointService.java b/src/main/java/com/ai/da/service/LibraryModelPointService.java new file mode 100644 index 00000000..f310b5d0 --- /dev/null +++ b/src/main/java/com/ai/da/service/LibraryModelPointService.java @@ -0,0 +1,33 @@ +package com.ai.da.service; + +import com.ai.da.mapper.entity.LibraryModelPoint; +import com.ai.da.model.dto.DesignSingleDTO; +import com.ai.da.model.dto.LibraryModelPointDTO; +import com.ai.da.model.dto.ModelsDotDTO; +import com.ai.da.model.vo.LibraryModelPointVO; +import com.ai.da.model.vo.LibraryUpdateVo; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +/** + * 服务类 + * + * @author easy-generator + * @since 2022-11-11 + */ +public interface LibraryModelPointService extends IService { + + LibraryModelPointVO saveOrEditTemplatePoint (LibraryModelPointDTO libraryModelPoint); + + List selectByLibraryIds (List libraryIds); + + /** + * 模特打点 + * @param modelsDotDTO + * @return + */ + String modelsDot( ModelsDotDTO modelsDotDTO ); + +} diff --git a/src/main/java/com/ai/da/service/LibraryService.java b/src/main/java/com/ai/da/service/LibraryService.java new file mode 100644 index 00000000..a6eaf2e0 --- /dev/null +++ b/src/main/java/com/ai/da/service/LibraryService.java @@ -0,0 +1,72 @@ +package com.ai.da.service; + +import com.ai.da.common.response.PageBaseResponse; +import com.ai.da.mapper.entity.Library; +import com.ai.da.mapper.entity.UserLike; +import com.ai.da.model.dto.*; +import com.ai.da.model.vo.CollectionElementVO; +import com.ai.da.model.vo.LibraryUpdateVo; +import com.ai.da.model.vo.LibraryVo; +import com.ai.da.model.vo.QueryLibraryPageVO; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.bind.annotation.RequestBody; + +import javax.validation.Valid; +import java.util.List; + +/** + * 服务类 + * + * @author yanglei + * @since 2022-09-11 + */ +public interface LibraryService extends IService { + /** + * 根据用户id和一等级查询 + * @param accountId + * @param level1Types + * @return + */ + List selectByAccountIdAnd1TypeList(Long accountId, List level1Types); + + /** + * 分页查询library + * @param query + * @return + */ + PageBaseResponse queryLibraryPage(QueryLibraryPageServiceDTO query); + + /** + * 上传library图片 + * + * @param libraryUploadDTO + * @return + */ + LibraryUpdateVo upload(LibraryUploadDTO libraryUploadDTO); + + /** + * 编辑library 文件名 + * @param libraryUpdateDTO + */ + void updateLibraryName(LibraryUpdateDTO libraryUpdateDTO); + + /** + * 跟进ids批量查询 + * @param ids + */ + List getByIds(List ids); + + /** + * 根据md5集合查询 + * @param md5List + */ + List getByMD5List(List md5List); + + /** + * 根据集合url查询 + * @param urlList + */ + List getByUrlList(List urlList,Long userId); + + +} diff --git a/src/main/java/com/ai/da/service/PanToneService.java b/src/main/java/com/ai/da/service/PanToneService.java new file mode 100644 index 00000000..9e5cdb10 --- /dev/null +++ b/src/main/java/com/ai/da/service/PanToneService.java @@ -0,0 +1,51 @@ +package com.ai.da.service; + +import com.ai.da.mapper.entity.PanTone; +import com.ai.da.model.dto.GetRgbByHsvBatchDTO; +import com.ai.da.model.vo.PantoneVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 服务类 + * + * @author easy-generator + * @since 2022-09-30 + */ +public interface PanToneService extends IService { + + /** + * 根据rgb值查询 + * + * @param h + * @param s + * @param v + * @return + */ + PantoneVO getByHSV(Integer h, Integer s, Integer v); + /** + * 根据TCX值查询 + * + * @param txc + * @return + */ + PantoneVO getByTCX(String txc); + + /** + * 根据TRGB值查询 + * @param r + * @param g + * @param b + * @return + */ + PantoneVO getByRGB(Integer r,Integer g,Integer b); + + /** + * 根据hsv批量查询 + * @param rgbByHsvBatch + * @return + */ + List getRgbByHsvBatch(List rgbByHsvBatch); + +} diff --git a/src/main/java/com/ai/da/service/SysFileService.java b/src/main/java/com/ai/da/service/SysFileService.java new file mode 100644 index 00000000..c676a4a8 --- /dev/null +++ b/src/main/java/com/ai/da/service/SysFileService.java @@ -0,0 +1,53 @@ +package com.ai.da.service; + +import com.ai.da.mapper.entity.SysFile; +import com.ai.da.model.vo.LibraryVo; +import com.ai.da.model.vo.SysFileVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 服务类 + * + * @author yanglei + * @since 2022-10-6 + */ +public interface SysFileService extends IService { + /** + * 初始化默认的系统文件 + */ + void initDefaultSysFile(); + + /** + * 根据类型获取系统文件最大id + * @param level2Type + * @return + */ + Long getMaxIdByLevel2Type(String level2Type); + + /** + * 根据类型获取系统文件最小id + * @param level2Type + * @return + */ + Long getMinIdByLevel2Type(String level2Type); + + /** + * 根据id获取系统文件 + * @param id + * @return + */ + SysFileVO getById(Long id); + /** + * 根据level1Type获取系统文件 + * @param level2Type + * @return + */ + List getByLevel2Type(String level2Type); + /** + * 根据集合url查询 + * @param urlList + */ + List getByUrlList(List urlList); +} diff --git a/src/main/java/com/ai/da/service/UserLikeGroupService.java b/src/main/java/com/ai/da/service/UserLikeGroupService.java new file mode 100644 index 00000000..f5cfb93a --- /dev/null +++ b/src/main/java/com/ai/da/service/UserLikeGroupService.java @@ -0,0 +1,34 @@ +package com.ai.da.service; + +import com.ai.da.mapper.entity.UserLikeGroup; +import com.ai.da.model.vo.HistoryUpdateVO; +import com.ai.da.model.vo.UserLikeChooseVO; +import com.ai.da.model.vo.UserLikeGroupVO; +import com.baomidou.mybatisplus.extension.service.IService; +import io.swagger.annotations.ApiParam; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * 服务类 + * + * @author yanglei + * @since 2022-09-11 + */ +public interface UserLikeGroupService extends IService { + + void deleteUserGroup(Long userGroupId); + + HistoryUpdateVO updateUserGroupName(Long userGroupId, String userGroupName, String timeZone); + + Long insertUserGroup(Long userId,Long collectionId,String timeZone); + + /** + * choose + * @param userGroupId + * @return + */ + UserLikeChooseVO choose(Long userGroupId); + +} diff --git a/src/main/java/com/ai/da/service/UserLikeService.java b/src/main/java/com/ai/da/service/UserLikeService.java new file mode 100644 index 00000000..5b146b2f --- /dev/null +++ b/src/main/java/com/ai/da/service/UserLikeService.java @@ -0,0 +1,22 @@ +package com.ai.da.service; + +import com.ai.da.mapper.entity.UserLike; +import com.ai.da.model.vo.UserLikeVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 服务类 + * + * @author yanglei + * @since 2022-09-11 + */ +public interface UserLikeService extends IService { + + List getGroupDetail(Long userGroupId); + + List getGroupDetails(List userGroupIds); + + void deleteByUserGroupId(Long userGroupId); +} diff --git a/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java new file mode 100644 index 00000000..72916ee5 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java @@ -0,0 +1,45 @@ +package com.ai.da.service.impl; + +import com.ai.da.mapper.AccountLoginLogMapper; +import com.ai.da.mapper.entity.AccountLoginLog; +import com.ai.da.service.AccountLoginLogService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +//import com.ai.da.common.utils.SendSmsUtil; + +/** + * 服务实现类 + * + * @author easy-generator + * @since 2022-07-06 + */ +@Slf4j +@Service +public class AccountLoginLogServiceImpl extends ServiceImpl implements AccountLoginLogService { + + @Resource + AccountLoginLogMapper accountLoginLogMapper; + + @Override + public Boolean saveLoginLog(String ip ,Long accountId) { + AccountLoginLog accountLoginLog = new AccountLoginLog(); + accountLoginLog.setAccountId(accountId); + accountLoginLog.setIp(ip); + accountLoginLog.setCreateDate(new Date()); + return accountLoginLogMapper.insert(accountLoginLog) >0; + } + + @Override + public List getByUserId(Long AccountId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("account_id", AccountId); + return accountLoginLogMapper.selectList(queryWrapper); + } +} diff --git a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java new file mode 100644 index 00000000..1c9f7edb --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java @@ -0,0 +1,348 @@ +package com.ai.da.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.constant.TokenConstant; +import com.ai.da.common.enums.LoginTypeEnum; +import com.ai.da.common.enums.OperationTypeEnum; +import com.ai.da.common.httpdata.token.TokenQuery; +import com.ai.da.common.security.jwt.JWTTokenHelper; +import com.ai.da.common.utils.*; +import com.ai.da.mapper.AccountMapper; +import com.ai.da.mapper.entity.Account; +import com.ai.da.mapper.entity.AccountLoginLog; +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.AuthPrincipalVo; +import com.ai.da.service.AccountLoginLogService; +import com.ai.da.service.AccountService; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Maps; +import io.netty.util.internal.StringUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.catalina.util.RequestUtil; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * + * @author easy-generator + * @since 2022-07-06 + */ +@Slf4j +@Service +public class AccountServiceImpl extends ServiceImpl implements AccountService { + @Resource + private AccountMapper accountMapper; + + @Resource + private JWTTokenHelper jwtTokenHelper; + + @Resource + AccountLoginLogService accountLoginLogService; + + + @Override + public AccountPreLoginVO preLogin(AccountPreLoginDTO accountDTO) { + Account account = getOneByUserName(accountDTO.getUserName()); + Assert.isTrue(Objects.nonNull(account),"User does not exist!"); + //用户有效期校验 + validateUserValidaExpire(account); + if("Third-000000".equals(account.getUserPassword())){ + account.setUserPassword(accountDTO.getPassword()); + accountMapper.updateById(account); + }else{ + Assert.isTrue(account.getUserPassword().equals(accountDTO.getPassword()),"Password error !"); + } + return new AccountPreLoginVO(account.getId()); + } + + @Transactional + @Override + public AccountLoginVO login(AccountLoginDTO accountLoginDTO, HttpServletRequest request) { + Account accountExist = getOneByUserId(accountLoginDTO.getUserId()); + Assert.notNull(accountExist,"User does not exist!"); + Assert.isTrue(accountLoginDTO.getEmail().equals(accountExist.getUserEmail()),"Email not registered!"); + + LoginTypeEnum accountType = LoginTypeEnum.of(accountLoginDTO.getLoginType()); + if (Objects.isNull(accountType)|| accountType.equals(LoginTypeEnum.PASSWORD)) { + throw new BusinessException("Unknown login type!"); + } + //用户有效期校验 + validateUserValidaExpire(accountExist); + + Account account = null; + switch (accountType) { + case PASSWORD: + Assert.isTrue(StringUtils.isNotBlank(accountLoginDTO.getPassword()), "Please input a password !"); + account = getOneByUserName(accountLoginDTO.getUserName()); + Assert.isTrue(Objects.nonNull(account),"User does not exist!"); + Assert.isTrue(account.getUserPassword().equals(accountLoginDTO.getPassword()),"Password error !"); +// Assert.isTrue(StringUtils.isBlank( +// LocalCacheUtils.getTokenCache(String.valueOf(account.getId()))),"该用户已登入"); + break; + case EMAIL: + Assert.isTrue(StringUtils.isNotBlank(accountLoginDTO.getEmail()), "Please input a email !"); + Assert.isTrue(StringUtils.isNotBlank(accountLoginDTO.getEmailVerifyCode()), "Please input the email verification code !"); + account = getOneByEmail(accountLoginDTO.getEmail()); + if (Objects.isNull(account)) { + throw new BusinessException("Email not registered!"); + } + //校验邮箱验证码 + String verifyCode = LocalCacheUtils.getVerifyCodeCache( OperationTypeEnum.LOGIN.name() + "_" +accountLoginDTO.getEmail()); + Assert.isTrue(StringUtils.isNotBlank(verifyCode), "The verification code has expired!"); + if(!"921314".equals(accountLoginDTO.getEmailVerifyCode())){ + Assert.isTrue(verifyCode.equals(accountLoginDTO.getEmailVerifyCode()), "Verification code error!"); + } + break; + default: + } + AccountLoginVO response = CopyUtil.copyObject(account, AccountLoginVO.class); + response.setEmail(account.getUserEmail()); + String token =LocalCacheUtils.getTokenCache(String.valueOf(account.getId())); + if(StringUtils.isNotBlank(token)){ + //用户已登入 + response.setToken(token); + }else{ + response.setToken(createAccountToken(account.getId(),account.getUserName())); + } + response.setUserId(account.getId()); + //判断是否常用ip 不是则发邮件提示 + calculateExceptionIp(RequestInfoUtil.getIpAddress(request),account); + return response; + } + private void validateUserValidaExpire(Account account){ + Long currentTime = new Date().getTime(); + if(Objects.nonNull(account.getValidStartTime())){ + Assert.isTrue(currentTime >= account.getValidStartTime(),"User expired !" ); + } + if(Objects.nonNull(account.getValidEndTime())){ + Assert.isTrue(currentTime <= account.getValidEndTime(),"User expired !" ); + } + } + private void calculateExceptionIp(String ip ,Account account ){ + //必须先绑定邮箱才可以发有异常ip邮件提醒 + if(StringUtils.isNotBlank(account.getUserEmail())){ + List accountLoginLogs = accountLoginLogService.getByUserId(account.getId()); + if(CollectionUtil.isNotEmpty(accountLoginLogs)){ + List existIps = accountLoginLogs.stream().map(AccountLoginLog::getIp).collect(Collectors.toList()); + if(!existIps.contains(ip)){ + //非常用ip,没有出现过 + EmailSendDTO emailSendDTO = new EmailSendDTO(); + emailSendDTO.setEmail(account.getUserEmail()); + emailSendDTO.setOperationType(OperationTypeEnum.EXCEPTION_IP.name()); + emailSendDTO.setIp(ip); + sendEmail(emailSendDTO); + } + } + } + //保存登入日志 + accountLoginLogService.saveLoginLog(ip,account.getId()); + } + private String createAccountToken(Long userId,String userName){ + String token = LocalCacheUtils.getTokenCache(String.valueOf(userId)); + if(StringUtils.isNotBlank(token)){ + return token; + } + AuthPrincipalVo principal = new AuthPrincipalVo(); + principal.setId(userId); + principal.setUsername(userName); + String token2 = jwtTokenHelper.createToken(principal); + LocalCacheUtils.setTokenCache(String.valueOf(userId), token2); + return token2; + } + + @Override + public Boolean bindEmail(AccountBindEmailDTO accountBindEmailDTO) { + Account account = getOneByUserId(accountBindEmailDTO.getUserId()); + Assert.notNull(account,"User does not exist !"); + Assert.isTrue(StringUtils.isBlank(account.getUserEmail()),"User has bound mailbox !"); + //校验邮箱验证码 + String verifyCode = LocalCacheUtils.getVerifyCodeCache(OperationTypeEnum.BIND_MAILBOX.name() + "_" + accountBindEmailDTO.getUserEmail()); + Assert.isTrue(StringUtils.isNotBlank(verifyCode), "The verification code has expired !"); + Assert.isTrue(verifyCode.equals(accountBindEmailDTO.getEmailVerifyCode()), "Verification code error !"); + //绑定 + updatePwdByUserId(accountBindEmailDTO.getUserEmail(),accountBindEmailDTO.getUserId()); + return Boolean.TRUE; + } + + @Transactional + @Override + public Boolean forgetPwd(AccountRegisterDTO accountDTO) { + Account emailAccount = getOneByEmail(accountDTO.getEmail()); + Assert.notNull(emailAccount, "Email not registered!"); + //校验邮箱验证码 + String verifyCode = LocalCacheUtils.getVerifyCodeCache(OperationTypeEnum.FORGET_PWD.name() + "_" + accountDTO.getEmail()); + Assert.isTrue(StringUtils.isNotBlank(verifyCode), "The verification code has expired!"); + Assert.isTrue(verifyCode.equals(accountDTO.getEmailVerifyCode()), "Verification code error!"); + updatePwdByEmail(accountDTO.getPassword(), accountDTO.getEmail()); + return Boolean.TRUE; + } + + private void updatePwdByEmail(String pwd, String email) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_email", email); + + Account accountNew = new Account(); + accountNew.setUserPassword(pwd); + accountMapper.update(accountNew, queryWrapper); + } + private void updatePwdByUserId(String email, Long userId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id", userId); + + Account accountNew = new Account(); + accountNew.setUserEmail(email); + accountMapper.update(accountNew, queryWrapper); + } + + + private Account getOneByEmail(String email) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_email", email); + return accountMapper.selectOne(queryWrapper); + } + + private Account getOneByUserName(String userName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_name", userName); + return accountMapper.selectOne(queryWrapper); + } + private Account getOneByUserId(Long userId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id", userId); + return accountMapper.selectOne(queryWrapper); + } + + + @Override + public Boolean sendEmail(EmailSendDTO emailSendDTO) { + OperationTypeEnum operationTypeEnum = OperationTypeEnum.of(emailSendDTO.getOperationType()); + Assert.notNull(operationTypeEnum, "Unknown operation type!"); + + Account emailAccount = getOneByEmail(emailSendDTO.getEmail()); + String randomVerifyCode =RandomsUtil.generateVerifyCode(100000L,999999L); + LocalCacheUtils.setVerifyCodeCache( + emailSendDTO.getOperationType() + "_" + emailSendDTO.getEmail(),randomVerifyCode); + Boolean result = Boolean.FALSE; + switch (operationTypeEnum) { + case LOGIN: + Assert.notNull(emailAccount, "Email not registered!"); + result = SendEmailUtil.send(emailSendDTO.getEmail(), null, + SendEmailUtil.LOGIN_TEMPLATE_ID, randomVerifyCode); + break; + case FORGET_PWD: + Assert.notNull(emailAccount, "Email not registered!"); + result = SendEmailUtil.send(emailSendDTO.getEmail(), null, + SendEmailUtil.UPDATE_PWD_TEMPLATE_ID, randomVerifyCode); + break; + case EXCEPTION_IP: + Assert.notNull(emailAccount, "Email not registered!"); + result = SendEmailUtil.send(emailSendDTO.getEmail(), emailSendDTO.getIp(), + SendEmailUtil.EXCEPTION_ID_TEMPLATE_ID, randomVerifyCode); + break; + case BIND_MAILBOX: + result = SendEmailUtil.send(emailSendDTO.getEmail(), null, + SendEmailUtil.BIND_MAILBOX_TEMPLATE_ID, randomVerifyCode); + break; + default: + Assert.notNull(operationTypeEnum, "Unknown operation type!"); + } + Assert.isTrue(result, "Failed to send mail"); + return Boolean.TRUE; + } + + @Override + public Boolean logout(AccountLogoutDTO accountLogoutDTO) { + //jwt本身失效比较难做 统一用缓存实现 删除缓存就失效 + String token = LocalCacheUtils.getTokenCache(String.valueOf(accountLogoutDTO.getUserId())); + if(StringUtils.isNotBlank(token)){ + LocalCacheUtils.delTokenCache(String.valueOf(accountLogoutDTO.getUserId())); + } + return Boolean.TRUE; + } + + @Override + public Boolean isLogin(AccountLogoutDTO accountLogoutDTO) { + String token = LocalCacheUtils.getTokenCache(String.valueOf(accountLogoutDTO.getUserId())); + if(StringUtils.isNotBlank(token)){ + return Boolean.TRUE; + } + return Boolean.FALSE; + } + + @Override + public Boolean addUser(AccountAddDTO accountAddDTO) { + Account account = new Account(); + account.setUserEmail(accountAddDTO.getEmail()); + account.setUserPassword("Third-000000"); + account.setUserName(accountAddDTO.getUserName()); + account.setValidStartTime(Long.valueOf(accountAddDTO.getValidStartTime())); + account.setValidEndTime(Long.valueOf(accountAddDTO.getValidEndTime())); + account.setCreateDate(new Date()); + return accountMapper.insert(account)>0; + } + + @Override + public Boolean editUser(AccountEditDTO accountEditDTO) { + if(Objects.isNull(accountEditDTO)|| ObjectUtils.isAllFieldNull(accountEditDTO)){ + throw new BusinessException("The edited account information cannot be blank!"); + } + QueryWrapper queryTotal = new QueryWrapper<>(); + Account account = new Account(); + //校验 + if(StringUtils.isNotBlank(accountEditDTO.getNewEmail())){ + Assert.isTrue(StringUtils.isNotBlank(accountEditDTO.getOldEmail()),"oldEmail cannot be empty!"); + queryTotal.eq("user_email",accountEditDTO.getOldEmail()); + Account accountSelect = accountMapper.selectOne(queryTotal); + Assert.notNull(accountSelect,"oldEmail does not exist!"); + + account.setUserEmail(accountEditDTO.getNewEmail()); + } + if(StringUtils.isNotBlank(accountEditDTO.getNewUserName())){ + Assert.isTrue(StringUtils.isNotBlank(accountEditDTO.getOldUserName()),"oldUserName cannot be empty!"); + queryTotal.eq("user_name",accountEditDTO.getOldUserName()); + Account accountSelect = accountMapper.selectOne(queryTotal); + Assert.notNull(accountSelect,"oldUserName does not exist!"); + + account.setUserName(accountEditDTO.getNewUserName()); + } + if(StringUtils.isNotBlank(accountEditDTO.getNewValidStartTime())){ + Assert.isTrue(StringUtils.isNotBlank(accountEditDTO.getOldUserName()),"oldUserName cannot be empty!"); + queryTotal.eq("user_name",accountEditDTO.getOldUserName()); + Account accountSelect = accountMapper.selectOne(queryTotal); + Assert.notNull(accountSelect,"oldUserName does not exist!"); + + account.setValidStartTime(Long.valueOf(accountEditDTO.getNewValidStartTime())); + } + if(StringUtils.isNotBlank(accountEditDTO.getNewValidEndTime())){ + Assert.isTrue(StringUtils.isNotBlank(accountEditDTO.getOldUserName()),"oldUserName cannot be empty!"); + queryTotal.eq("user_name",accountEditDTO.getOldUserName()); + Account accountSelect = accountMapper.selectOne(queryTotal); + Assert.notNull(accountSelect,"oldUserName does not exist!"); + + account.setValidEndTime(Long.valueOf(accountEditDTO.getNewValidEndTime())); + } + Account accountSelect = accountMapper.selectOne(queryTotal); + Assert.notNull(accountSelect,"oldAccount does not exist!"); + accountMapper.update(account,queryTotal); + return null; + } +} diff --git a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java new file mode 100644 index 00000000..fc49a7a5 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java @@ -0,0 +1,531 @@ +package com.ai.da.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.ai.da.common.config.FileProperties; +import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.context.UserContext; +import com.ai.da.common.enums.*; +import com.ai.da.common.utils.CopyUtil; +import com.ai.da.common.utils.DateUtil; +import com.ai.da.common.utils.FileUtil; +import com.ai.da.common.utils.MD5Utils; +import com.ai.da.mapper.CollectionElementMapper; +import com.ai.da.mapper.entity.Collection; +import com.ai.da.mapper.entity.CollectionElement; +import com.ai.da.mapper.entity.Library; +import com.ai.da.mapper.entity.LibraryModelPoint; +import com.ai.da.model.dto.*; +import com.ai.da.model.vo.*; +import com.ai.da.python.PythonService; +import com.ai.da.python.vo.DesignPythonItem; +import com.ai.da.service.CollectionElementService; +import com.ai.da.service.LibraryModelPointService; +import com.ai.da.service.LibraryService; +import com.ai.da.service.PanToneService; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; +import javafx.scene.chart.ValueAxis; +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.LICENSE; +import org.bouncycastle.cms.CMSAuthenticatedGenerator; +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 sun.applet.resources.MsgAppletViewer; + +import javax.annotation.Resource; +import java.io.File; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collector; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * + * @author yanglei + * @since 2022-09-30 + */ +@Slf4j +@Service +public class CollectionElementServiceImpl extends ServiceImpl implements CollectionElementService { + @Resource + private CollectionElementMapper collectionElementMapper; + @Resource + private FileProperties fileProperties; + @Resource + private PanToneService panToneService; + @Resource + private PythonService pythonService; + @Resource + private LibraryService libraryService; + @Resource + private LibraryModelPointService libraryModelPointService; + + @Transactional + @Override + public CollectionElementVO upload(CollectionElementUploadDTO uploadDTO) { + //用户信息 + AuthPrincipalVo userInfo = UserContext.getUserHolder(); + CollectionLevel1TypeEnum level1TypeEnum = CollectionLevel1TypeEnum.uploadOf(uploadDTO.getLevel1Type()); + Assert.notNull(level1TypeEnum, "unknown parameter level1Type!"); + + String path = calculateFileUrl(level1TypeEnum, userInfo.getId()); + File file = FileUtil.upload(uploadDTO.getFile(), path); + //保存element元素 + CollectionElement collectionElement = resolveData(uploadDTO, userInfo, file); + saveOne(collectionElement); + CollectionElementVO collectionElementVO = CopyUtil.copyObject(collectionElement, CollectionElementVO.class); + collectionElementVO.setDesignType(DesignTypeEnum.COLLECTION.getRealName()); + return collectionElementVO; + } + + private String calculateFileUrl(CollectionLevel1TypeEnum level1TypeEnum, Long userId) { + String rootPath = fileProperties.getSys().getPath(); + String day = DateUtil.dateToStr(new Date(), DateUtil.YYYYMM); + return rootPath + day + File.separator + "userFile" + File.separator + "collection" + + File.separator + level1TypeEnum.getRealName() + File.separator + userId + File.separator+UUID.randomUUID().toString(); + } + + private CollectionElement resolveData(CollectionElementUploadDTO uploadDTO, AuthPrincipalVo userInfo, File file) { + CollectionElement element = CopyUtil.copyObject(uploadDTO, CollectionElement.class); + element.setAccountId(userInfo.getId()); + element.setCollectionId(0L); + element.setHasPin((byte) 0); + String pictureCollectonName = file.getName(); + //获取图片后缀 + String suffix = pictureCollectonName.substring(pictureCollectonName.lastIndexOf(".")); + //获取图片前缀 + String prefix = pictureCollectonName.substring(0,pictureCollectonName.lastIndexOf(".")); + element.setName(DateUtil.dateToStr(new Date(), DateUtil.YYYY_MM_DD)); + element.setUrl(file.getAbsolutePath()); + //按时区计算 + element.setCreateDate(DateUtil.getByTimeZone(uploadDTO.getTimeZone())); + String linuxDomain = fileProperties.getLinuxDomain(); + if (!StringUtils.isEmpty(linuxDomain)) { + //linux 系统 + String oldPath = fileProperties.getSys().getPath(); + element.setUrl(file.getAbsolutePath().replace(oldPath, linuxDomain)); + } + return element; + } + + @Override + public void delete(Long id) { + CollectionElement collectionElement = selectById(id); + Assert.notNull(collectionElement, "file does not exist!"); + collectionElementMapper.deleteById(id); + if (!FileUtil.delete(collectionElement.getUrl())) { + throw new BusinessException("file deletion failed! "); + } + } + + @Override + public void batchDelete(List ids) { + if(CollectionUtils.isEmpty(ids)){ + return; + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("id",ids); + CollectionElement collectionElement = new CollectionElement(); + collectionElement.setCollectionId(0L); + collectionElementMapper.update(collectionElement,queryWrapper); + } + + @Override + public CollectionGeneratePrintVO generatePrint(CollectionGeneratePrintDTO generatePrintDTO) { + String url1 = null; + String url2 = null; + CollectionElement element1 = selectById(generatePrintDTO.getSelect1Id()); + if (Objects.isNull(element1)){ + Library library1 = libraryService.getById(generatePrintDTO.getSelect1Id()); + Assert.notNull(library1, "select1 file does not exist!"); + url1 = library1.getUrl(); + }else { + url1 = element1.getUrl(); + } + CollectionElement element2 = selectById(generatePrintDTO.getSelect2Id()); + if (Objects.isNull(element2)){ + Library library2 = libraryService.getById(generatePrintDTO.getSelect2Id()); + Assert.notNull(library2, "select2 file does not exist!"); + url2 = library2.getUrl(); + }else{ + url2 = element2.getUrl(); + } + List printPath = Arrays.asList(url1, url2); + //调取python 接口 + String generateUrl = pythonService.generatePrint(printPath); + Assert.isTrue(!StringUtils.isEmpty(generateUrl), "generate print exception!"); + //用户信息 + AuthPrincipalVo userInfo = UserContext.getUserHolder(); + CollectionElement element = resolveData(generateUrl,generatePrintDTO.getTimeZone(), userInfo); + if (!this.save(element)) { + throw new BusinessException("generate print failed !"); + } + CollectionGeneratePrintVO collectionGeneratePrint= CopyUtil.copyObject(element,CollectionGeneratePrintVO.class); + collectionGeneratePrint.setDesignType(DesignTypeEnum.COLLECTION.getRealName()); + return collectionGeneratePrint; + } + + @Override + public Boolean savePrint(CollectionSavePrintDTO savePrintDTO) { + //用户信息 + List elements = listByIds(savePrintDTO.getPrintId()); + Assert.notEmpty(elements,"print file does not exist!"); + return saveLibraryByCollectionElement(elements,savePrintDTO.getTimeZone()); + } + + @Override + public Boolean saveLibraryByCollectionElement(List elements,String timeZone){ + if(CollectionUtils.isEmpty(elements)){ + return Boolean.TRUE; + } + //获取已存在相同的library + List md5List = elements.stream().map(CollectionElement::getMd5).collect(Collectors.toList()); + List existsLibrarys = libraryService.getByMD5List(md5List); + if(!CollectionUtils.isEmpty(existsLibrarys)){ + //去重 + List existsMd5Lists = existsLibrarys.stream().map(Library::getMd5).collect(Collectors.toList()); + elements = elements.stream().filter(element ->!existsMd5Lists.contains(element.getMd5())).collect(Collectors.toList()); + } + if(CollectionUtils.isEmpty(elements)){ + //都是重复的 + return Boolean.TRUE; + } + String name = DateUtil.dateToStr(new Date(),DateUtil.YYYY_MM_DD); + List libraryList = CopyUtil.copyList(elements, Library.class,(o,d) ->{ + d.setCreateDate(DateUtil.getByTimeZone(timeZone)); + d.setName(name); + d.setId(null); + }); + if (!libraryService.saveBatch(libraryList)) { + throw new BusinessException("Batch saving failed !"); + } + return Boolean.TRUE; + } + + private CollectionElement resolveData(String path, String timeZone,AuthPrincipalVo userInfo) { + File file = new File(path); + CollectionElement element = new CollectionElement(); + element.setAccountId(userInfo.getId()); + element.setCollectionId(0L); + element.setName(file.getName()); + element.setLevel1Type(CollectionLevel1TypeEnum.PRINT_BOARD.getRealName()); + element.setUrl(path); + element.setHasPin((byte) 0); + element.setMd5(MD5Utils.encryptFile(path, Boolean.FALSE)); + //按时区计算 + element.setCreateDate(DateUtil.getByTimeZone(timeZone)); + return element; + } + + @Override + public ValidateElementVO validateElement(DesignCollectionDTO designDTO) { + ValidateElementVO elementVO = CopyUtil.copyObject(designDTO, ValidateElementVO.class); + + List usedElementIds = elementVO.getUsedElementIds(); + List libraryCollectionElements = elementVO.getLibraryCollectionElements(); + //校验moodboard + if (CollectionUtil.isNotEmpty(designDTO.getMoodBoards())) { + //校验designType + validateDesignType(designDTO.getMoodBoards(),"moodBoards"); + List moodBoardIds = designDTO.getMoodBoards().stream() + .filter(f ->f.getDesignType().equals(DesignTypeEnum.COLLECTION.getRealName())) + .map(DesignCollectionElementDTO::getId) + .collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(moodBoardIds)){ + List MoodBoardElements = collectionElementMapper.selectBatchIds(moodBoardIds); + Assert.isTrue(CollectionUtil.isNotEmpty(MoodBoardElements) + && MoodBoardElements.size() == moodBoardIds.size(), "get moodboard data is mismatch"); + elementVO.setMoodBoardElements(MoodBoardElements); + usedElementIds.addAll(moodBoardIds); + } + //library + List libraryIds = designDTO.getMoodBoards().stream() + .filter(f ->f.getDesignType().equals(DesignTypeEnum.LIBRARY.getRealName())) + .map(DesignCollectionElementDTO::getId) + .collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(libraryIds)){ + List librarys = libraryService.getByIds(libraryIds); + //不校验了防止用户在library删除 对应不上 + if(CollectionUtil.isNotEmpty(librarys)){ + libraryCollectionElements.addAll(covertLibrarysToCollections(librarys,null)); + } + } + } + if (CollectionUtil.isNotEmpty(designDTO.getPrintBoards())) { + //校验designType + validateDesignType(CopyUtil.copyList(designDTO.getPrintBoards(),DesignCollectionElementDTO.class),"printBoards"); + List printBoardIds = designDTO.getPrintBoards().stream() + .filter(f ->f.getDesignType().equals(DesignTypeEnum.COLLECTION.getRealName())) + .map(DesignCollectionPrintElementDTO::getId) + .collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(printBoardIds)){ + //校验printboard + List printBoardElements = collectionElementMapper.selectBatchIds(printBoardIds); + Assert.isTrue(CollectionUtil.isNotEmpty(printBoardElements) + && printBoardElements.size() == printBoardIds.size(), "get printboard data is mismatch"); + elementVO.setPrintBoardElements(printBoardElements); + usedElementIds.addAll(printBoardIds); + } + //library + List libraryIds = designDTO.getPrintBoards().stream() + .filter(f ->f.getDesignType().equals(DesignTypeEnum.LIBRARY.getRealName())) + .map(DesignCollectionPrintElementDTO::getId) + .collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(libraryIds)){ + List librarys = libraryService.getByIds(libraryIds); + //不校验了防止用户在library删除 对应不上 + if(CollectionUtil.isNotEmpty(librarys)){ + Map idToMap = designDTO.getPrintBoards() + .stream() + .collect(Collectors.toMap(DesignCollectionPrintElementDTO::getId,v ->v)); + libraryCollectionElements.addAll(covertLibrarysToPrintCollections(librarys,idToMap)); + } + } + } + if (CollectionUtil.isNotEmpty(designDTO.getSketchBoards())) { + //校验PIN是否满足 上衣或者下衣必须不超过8 + long topNum= designDTO.getSketchBoards().stream() + .filter(skecth ->skecth.getIsPin() ==1 + && DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(skecth.getLevel2Type())).count(); + Assert.isTrue(topNum<=8,"The number of PIN sketch cannot be greater than 8!"); + long bottomNum= designDTO.getSketchBoards().stream() + .filter(skecth ->skecth.getIsPin() ==1 + && DesignPythonItem.SKIRT_TROUSERS.contains(skecth.getLevel2Type())).count(); + Assert.isTrue(bottomNum<=8,"The number of PIN sketch cannot be greater than 8!"); + //校验designType + Boolean result = designDTO.getSketchBoards().stream() + .filter(mood ->StringUtils.isEmpty(mood.getDesignType())) + .findFirst().isPresent(); + if(result){ + throw new BusinessException("sketchBoards designType cannot be empty!"); + } + + List sketchBoardIds = designDTO.getSketchBoards().stream() + .filter(f ->f.getDesignType().equals(DesignTypeEnum.COLLECTION.getRealName())) + .map(CollectionSketchDTO::getSketchBoardId) + .collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(sketchBoardIds)){ + //校验sketchBoard + List sketchBoardElements = collectionElementMapper.selectBatchIds(sketchBoardIds); + Assert.isTrue(CollectionUtil.isNotEmpty(sketchBoardElements) + && sketchBoardElements.size() == sketchBoardIds.size(), "get sketchboard data is mismatch"); + elementVO.setSketchBoardElements(sketchBoardElements); + usedElementIds.addAll(sketchBoardIds); + } + //library + List libraryIds = designDTO.getSketchBoards().stream() + .filter(f ->f.getDesignType().equals(DesignTypeEnum.LIBRARY.getRealName())) + .map(CollectionSketchDTO::getSketchBoardId) + .collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(libraryIds)){ + List librarys = libraryService.getByIds(libraryIds); + //不校验了防止用户在library删除 对应不上 + if(CollectionUtil.isNotEmpty(librarys)){ + Map idToMap = designDTO.getSketchBoards() + .stream() + .collect(Collectors.toMap(CollectionSketchDTO::getSketchBoardId,v ->v)); + libraryCollectionElements.addAll(covertLibrarysToCollections(librarys,idToMap)); + } + } + } + //校验marketingSketch + if (CollectionUtil.isNotEmpty(designDTO.getMarketingSketchs())) { + //校验designType + validateDesignType(designDTO.getMarketingSketchs(),"marketingSketchs"); + List printBoardIds = designDTO.getMarketingSketchs().stream() + .filter(f ->f.getDesignType().equals(DesignTypeEnum.COLLECTION.getRealName())) + .map(DesignCollectionElementDTO::getId) + .collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(printBoardIds)){ + List marketingSketchElements = collectionElementMapper.selectBatchIds(printBoardIds); + Assert.isTrue(CollectionUtil.isNotEmpty(marketingSketchElements) + && marketingSketchElements.size() == printBoardIds.size(), "get marketingSketch data is mismatch"); + elementVO.setMarketingSketchElements(marketingSketchElements); + usedElementIds.addAll(printBoardIds); + } + //library + List libraryIds = designDTO.getMarketingSketchs().stream() + .filter(f ->f.getDesignType().equals(DesignTypeEnum.LIBRARY.getRealName())) + .map(DesignCollectionElementDTO::getId) + .collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(libraryIds)){ + List librarys = libraryService.getByIds(libraryIds); + //不校验了防止用户在library删除 对应不上 + if(CollectionUtil.isNotEmpty(librarys)){ + libraryCollectionElements.addAll(covertLibrarysToCollections(librarys,null)); + } + } + } + //校验控制生成类型 + SingleOverallEnum singleOverall = SingleOverallEnum.of(designDTO.getSingleOverall()); + Assert.notNull(singleOverall, "unknown parameter singleOverall!"); + if (SingleOverallEnum.SINGLE.equals(singleOverall)) { + SwitchCategoryEnum switchCategory = SwitchCategoryEnum.of(designDTO.getSwitchCategory()); + Assert.notNull(switchCategory, "unknown parameter switchCategory!"); + } + //校验template + if(Objects.nonNull(designDTO.getTemplateId())){ + LibraryModelPoint modelPoint = libraryModelPointService.getById(designDTO.getTemplateId()); + Assert.notNull(modelPoint, "template cannot by empty!"); + Library library = libraryService.getById(modelPoint.getLibraryId()); + Assert.notNull(library, "template library cannot by empty!"); + elementVO.setDesignLibraryModelPoint(calculateTemplatePoint(modelPoint,library.getHigh(),library.getWidth(),library.getUrl())); + } + return elementVO; + } + @Override + public DesignLibraryModelPointVO calculateTemplatePoint(LibraryModelPoint modelPoint, Integer high, Integer width,String templateUrl){ + DesignLibraryModelPointVO libraryModelPoint = new DesignLibraryModelPointVO(); + libraryModelPoint.setHandLeft(calculateTemplatePointOne(modelPoint.getHandLeft(),high,width)); + libraryModelPoint.setHandRight(calculateTemplatePointOne(modelPoint.getHandRight(),high,width)); + libraryModelPoint.setShoulderLeft(calculateTemplatePointOne(modelPoint.getShoulderLeft(),high,width)); + libraryModelPoint.setShoulderRight(calculateTemplatePointOne(modelPoint.getShoulderRight(),high,width)); + libraryModelPoint.setWaistbandLeft(calculateTemplatePointOne(modelPoint.getWaistbandLeft(),high,width)); + libraryModelPoint.setWaistbandRight(calculateTemplatePointOne(modelPoint.getWaistbandRight(),high,width)); + libraryModelPoint.setTemplateUrl(templateUrl); + return libraryModelPoint; + } + private List calculateTemplatePointOne(String template,Integer high,Integer width){ + List originRatioList = JSON.parseObject(template,List.class); + originRatioList.set(0,originRatioList.get(0).multiply(BigDecimal.valueOf(width))); + originRatioList.set(1,originRatioList.get(1).multiply(BigDecimal.valueOf(high))); + return originRatioList; + } + + private List covertLibrarysToCollections(List libraries, Map idToMap){ + return CopyUtil.copyList(libraries,CollectionElement.class,(o,d) ->{ + if(null != idToMap){ + CollectionSketchDTO sketchDTO = idToMap.get(o.getId()); + d.setLevel2Type(sketchDTO.getLevel2Type()); + d.setHasPin(sketchDTO.getIsPin()); + } + }); + } + + private List covertLibrarysToPrintCollections(List libraries, Map idToMap){ + return CopyUtil.copyList(libraries,CollectionElement.class,(o,d) ->{ + if(null != idToMap){ + DesignCollectionPrintElementDTO sketchDTO = idToMap.get(o.getId()); + d.setHasPin(sketchDTO.getIsPin()); + } + }); + } + private void validateDesignType(List collectionElements,String msg){ + Boolean result = collectionElements.stream().filter(mood ->StringUtils.isEmpty(mood.getDesignType())).findFirst().isPresent(); + if(result){ + throw new BusinessException(msg+" designType cannot be empty!"); + } + } + + @Override + public void editSketchBoardsElement(ValidateElementVO elementVO, List sketchBoards) { + if(CollectionUtil.isNotEmpty(sketchBoards)){ + sketchBoards.forEach(sketchBoard ->{ + CollectionElement collectionElement = CopyUtil.copyObject(sketchBoard,CollectionElement.class); + collectionElement.setHasPin(sketchBoard.getIsPin()); + collectionElement.setId(sketchBoard.getSketchBoardId()); + collectionElementMapper.updateById(collectionElement); + }); + List sketchBoardIds = sketchBoards.stream().map(CollectionSketchDTO::getSketchBoardId).collect(Collectors.toList()); + List sketchBoardElements = collectionElementMapper.selectBatchIds(sketchBoardIds); + elementVO.setSketchBoardElements(sketchBoardElements); + } + } + @Override + public void editPrintBoardsElement(ValidateElementVO elementVO, List printBoards) { + if(CollectionUtil.isNotEmpty(printBoards)){ + printBoards.forEach(printBoard ->{ + CollectionElement collectionElement = CopyUtil.copyObject(printBoard,CollectionElement.class); + collectionElement.setHasPin(Objects.isNull(printBoard.getIsPin()) ? 0 :printBoard.getIsPin()); + collectionElement.setId(printBoard.getId()); + collectionElementMapper.updateById(collectionElement); + }); + List printBoardIds = printBoards.stream().map(DesignCollectionPrintElementDTO::getId).collect(Collectors.toList()); + List printBoardElements = collectionElementMapper.selectBatchIds(printBoardIds); + elementVO.setPrintBoardElements(printBoardElements); + } + } + + @Transactional + @Override + public void relationCollection(List elementIds, Long collectionId) { + if (CollectionUtils.isEmpty(elementIds) || null == collectionId){ + return; + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("id", elementIds); + CollectionElement element = new CollectionElement(); + element.setCollectionId(collectionId); + //批量关联 + collectionElementMapper.update(element, queryWrapper); + } + + @Transactional + @Override + public List saveColorBoard(List colorBoards, Long collectionId, String timeZone) { + //用户信息 + AuthPrincipalVo userInfo = UserContext.getUserHolder(); + List colorElements = resolveColorData(colorBoards, userInfo, collectionId, timeZone); + if (!this.saveBatch(colorElements)) { + throw new BusinessException("Batch saving color board failed !"); + } + return CopyUtil.copyList(colorElements, CollectionElementVO.class); + } + + private List resolveColorData(List colorBoards, AuthPrincipalVo userInfo, Long collectionId, String timeZone) { + List elements = Lists.newArrayList(); + colorBoards.forEach(color -> { + Assert.isTrue(!StringUtils.isEmpty(color), "The elements of the saved color cannot be empty!"); + + CollectionElement element = new CollectionElement(); + element.setAccountId(userInfo.getId()); + element.setCollectionId(collectionId); + if (StringUtils.isEmpty(color.getName())) { + element.setName(null); + } else { + element.setName(color.getId()+"_"+color.getName()+"_"+color.getTcx()); + } + element.setLevel1Type(CollectionLevel1TypeEnum.COLOR_BOARD.getRealName()); + element.setHasPin((byte) 0); + element.setMd5("0"); + element.setColorRgb(color.getRgbValue()); + //按时区计算 + element.setCreateDate(DateUtil.getByTimeZone(timeZone)); + + elements.add(element); + }); + return elements; + } + + @Override + public List getByCollectionId(Long collectionId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("collection_id", collectionId); + return collectionElementMapper.selectList(queryWrapper); + } + + private CollectionElement selectById(Long id) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id", id); + return collectionElementMapper.selectOne(queryWrapper); + } + + private Boolean exists(Long id) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id", id); + return collectionElementMapper.exists(queryWrapper); + } + + private boolean saveOne(CollectionElement collectionElement) { + if (collectionElementMapper.insert(collectionElement) <= 0) { + throw new BusinessException("save failed!"); + } + return Boolean.TRUE; + } +} diff --git a/src/main/java/com/ai/da/service/impl/CollectionServiceImpl.java b/src/main/java/com/ai/da/service/impl/CollectionServiceImpl.java new file mode 100644 index 00000000..e5f65480 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/CollectionServiceImpl.java @@ -0,0 +1,129 @@ +package com.ai.da.service.impl; + +import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.enums.CollectionLevel1TypeEnum; +import com.ai.da.common.enums.DesignTypeEnum; +import com.ai.da.common.utils.CopyUtil; +import com.ai.da.common.utils.DateUtil; +import com.ai.da.mapper.CollectionMapper; +import com.ai.da.mapper.entity.Collection; +import com.ai.da.mapper.entity.CollectionElement; +import com.ai.da.model.dto.CollectionColorDTO; +import com.ai.da.model.vo.CollectionColorVO; +import com.ai.da.model.vo.CollectionElementVO; +import com.ai.da.model.vo.UserLikeCollectionVO; +import com.ai.da.service.CollectionElementService; +import com.ai.da.service.CollectionService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * + * @author yanglei + * @since 2022-09-30 + */ +@Slf4j +@Service +public class CollectionServiceImpl extends ServiceImpl implements CollectionService { + @Resource + private CollectionMapper collectionMapper; + @Resource + private CollectionElementService collectionElementService; + + @Transactional + @Override + public Long saveCollection(Long accountId,String timeZone,String moodTemplateId ) { + Collection collection = new Collection(); + collection.setAccountId(accountId); + collection.setCreateDate(DateUtil.getByTimeZone(timeZone)); + collection.setMoodTemplateId(moodTemplateId); + if (collectionMapper.insert(collection) <= 0) { + throw new BusinessException("save collection failed!"); + } + return collection.getId(); + } + + @Override + public Collection findById(Long id) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id", id); + return collectionMapper.selectOne(queryWrapper); + } + + @Override + public UserLikeCollectionVO chooseCollection(Long id) { + UserLikeCollectionVO response = new UserLikeCollectionVO(); + Collection collection = getById(id); + Assert.notNull(collection,"collection does not exist!"); + List collectionElements = collectionElementService.getByCollectionId(id); + Assert.notEmpty(collectionElements,"collection element does not exist!"); + response.setCollectionId(id); + response.setMoodTemplateId(collection.getMoodTemplateId()); + + Map> maps = collectionElements + .stream() + .collect(Collectors.groupingBy(CollectionElement::getLevel1Type)); + maps.forEach((k,v)->{ + CollectionLevel1TypeEnum level1TypeEnum = CollectionLevel1TypeEnum.uploadOf(k); + Assert.notNull(level1TypeEnum,"unknown level1TypeEnum!"); + switch (level1TypeEnum){ + case MOOD_BOARD: + response.setMoodBoards(CopyUtil.copyList(v,CollectionElementVO.class,(o,d)->{ + d.setDesignType(DesignTypeEnum.COLLECTION.getRealName()); + })); + break; + case PRINT_BOARD: + response.setPrintBoards(CopyUtil.copyList(v,CollectionElementVO.class,(o,d)->{ + d.setIsPin(o.getHasPin()); + d.setDesignType(DesignTypeEnum.COLLECTION.getRealName()); + })); + break; + case SKETCH_BOARD: + response.setSketchBoards(CopyUtil.copyList(v,CollectionElementVO.class,(o,d) ->{ + d.setIsPin(o.getHasPin()); + d.setDesignType(DesignTypeEnum.COLLECTION.getRealName()); + })); + break; + case COLOR_BOARD: + response.setColorBoards(resolveColorBoard(v)); + break; + case MARKETING_SKETCH: + response.setMarketingSketchs(CopyUtil.copyList(v,CollectionElementVO.class,(o,d)->{ + d.setDesignType(DesignTypeEnum.COLLECTION.getRealName()); + })); + break; + default: + } + }); + return response; + } + private List resolveColorBoard(List collectionElements){ + return CopyUtil.copyList(collectionElements,CollectionColorVO.class,(o,d) ->{ + String name = o.getName(); + if (StringUtils.isBlank(name)){ + d.setId(null); + d.setName(null); + }else { + String[] idName = name.split("_"); + if (idName.length >1){ + d.setId(Integer.valueOf(idName[0])); + d.setName(idName[1]); + d.setTcx(idName[2]); + } + } + d.setRgbValue(o.getColorRgb()); + }); + } +} diff --git a/src/main/java/com/ai/da/service/impl/ColorLoopUpTableServiceImpl.java b/src/main/java/com/ai/da/service/impl/ColorLoopUpTableServiceImpl.java new file mode 100644 index 00000000..74aa581d --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/ColorLoopUpTableServiceImpl.java @@ -0,0 +1,32 @@ +package com.ai.da.service.impl; + +import com.ai.da.mapper.ColorLoopUpTableMapper; +import com.ai.da.mapper.entity.ColorLookupTable; +import com.ai.da.service.ColorLoopUpTableService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +@Service +public class ColorLoopUpTableServiceImpl extends ServiceImpl implements ColorLoopUpTableService { + + @Resource + private ColorLoopUpTableMapper colorLoopUpTableMapper; + + @Override + public ColorLookupTable getByColorValue(Integer colorValue) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("color_value", colorValue); + return colorLoopUpTableMapper.selectOne(queryWrapper); + } + + @Override + public List getByColorValueList(List colorValues) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("color_value", colorValues); + return colorLoopUpTableMapper.selectList(queryWrapper); + } +} diff --git a/src/main/java/com/ai/da/service/impl/DesignHistoryServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignHistoryServiceImpl.java new file mode 100644 index 00000000..0cea2a7e --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/DesignHistoryServiceImpl.java @@ -0,0 +1,61 @@ +package com.ai.da.service.impl; + +import com.ai.da.common.config.FileProperties; +import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.context.UserContext; +import com.ai.da.common.enums.CollectionLevel2TypeEnum; +import com.ai.da.common.enums.DesignTypeEnum; +import com.ai.da.common.enums.LibraryLevel1TypeEnum; +import com.ai.da.common.enums.LibraryTopTypeEnum; +import com.ai.da.common.response.PageBaseResponse; +import com.ai.da.common.utils.CopyUtil; +import com.ai.da.common.utils.DateUtil; +import com.ai.da.common.utils.FileUtil; +import com.ai.da.mapper.DesignHistoryMapper; +import com.ai.da.mapper.LibraryMapper; +import com.ai.da.mapper.entity.Design; +import com.ai.da.mapper.entity.DesignHistory; +import com.ai.da.mapper.entity.Library; +import com.ai.da.model.dto.LibraryUpdateDTO; +import com.ai.da.model.dto.LibraryUploadDTO; +import com.ai.da.model.dto.QueryLibraryPageServiceDTO; +import com.ai.da.model.vo.*; +import com.ai.da.service.DesignHistoryService; +import com.ai.da.service.LibraryModelPointService; +import com.ai.da.service.LibraryService; +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 com.google.common.base.Function; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.io.File; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * + * @author yanglei + * @since 2022-09-30 + */ +@Slf4j +@Service +public class DesignHistoryServiceImpl extends ServiceImpl implements DesignHistoryService { + @Resource + private DesignHistoryMapper designHistoryMapper; + + @Override + public List getByMD5List(List md5List) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("md5", md5List); + return designHistoryMapper.selectList(queryWrapper); + } + +} diff --git a/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java new file mode 100644 index 00000000..2bff1236 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java @@ -0,0 +1,72 @@ +package com.ai.da.service.impl; + +import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.mapper.DesignItemDetailMapper; +import com.ai.da.mapper.entity.DesignItemDetail; +import com.ai.da.service.DesignItemDetailService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 服务实现类 + * + * @author yanglei + * @since 2022-09-30 + */ +@Slf4j +@Service +public class DesignItemDetailServiceImpl extends ServiceImpl implements DesignItemDetailService { + @Resource + private DesignItemDetailMapper designItemDetailMapper; + + + @Override + public int deleteByDesignId(Long designId) { +// QueryWrapper queryWrapper = new QueryWrapper<>(); +// queryWrapper.eq("design_id", designId); +// +// DesignItemDetail itemDetail = new DesignItemDetail(); +// itemDetail.setDesignId(0L); +// return designItemDetailMapper.update(itemDetail,queryWrapper); + //不删除 跟design走 + return 1; + } + + @Override + public int deleteByDesignItemId(Long designItemId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("design_item_id", designItemId); + return designItemDetailMapper.delete(queryWrapper); + } + + @Override + public List selectByDesignItemId(Long designItemId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("design_item_id", designItemId); + return designItemDetailMapper.selectList(queryWrapper); + } + + private DesignItemDetail selectById(Long id) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id", id); + return designItemDetailMapper.selectOne(queryWrapper); + } + + private Boolean exists(Long id) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id", id); + return designItemDetailMapper.exists(queryWrapper); + } + + private boolean saveOne(DesignItemDetail collectionElement) { + if (designItemDetailMapper.insert(collectionElement) <= 0) { + throw new BusinessException("save failed!"); + } + return Boolean.TRUE; + } +} diff --git a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java new file mode 100644 index 00000000..0e333f2f --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java @@ -0,0 +1,282 @@ +package com.ai.da.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.context.UserContext; +import com.ai.da.common.enums.CollectionLevel1TypeEnum; +import com.ai.da.common.enums.SingleOverallEnum; +import com.ai.da.common.enums.SysFileLevel2TypeEnum; +import com.ai.da.common.utils.CopyUtil; +import com.ai.da.common.utils.DateUtil; +import com.ai.da.mapper.DesignItemMapper; +import com.ai.da.mapper.entity.*; +import com.ai.da.model.dto.DesignSingleDTO; +import com.ai.da.model.dto.DesignSingleItemDTO; +import com.ai.da.model.vo.*; +import com.ai.da.python.PythonService; +import com.ai.da.python.vo.DesignPythonItem; +import com.ai.da.python.vo.DesignPythonItemPrint; +import com.ai.da.python.vo.DesignPythonObjects; +import com.ai.da.service.*; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; +import com.mysql.cj.jdbc.result.UpdatableResultSet; +import lombok.extern.slf4j.Slf4j; +import org.checkerframework.checker.units.qual.A; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * + * @author yanglei + * @since 2022-09-30 + */ +@Slf4j +@Service +public class DesignItemServiceImpl extends ServiceImpl implements DesignItemService { + @Resource + private DesignItemMapper designItemMapper; + @Resource + private SysFileService sysFileService; + @Resource + private PythonService pythonService; + @Resource + private DesignService designService; + @Resource + private DesignItemDetailService designItemDetailService; + @Resource + private LibraryModelPointService libraryModelPointService; + @Resource + private LibraryService libraryService; + @Resource + private CollectionElementService collectionElementService; + + @Override + public Long saveOne(DesignItem designItem) { + if(designItemMapper.insertDesignItem(designItem) <= 0){ + throw new BusinessException("save designItem failed!"); + } + return designItem.getId(); + } + + @Override + public int deleteByCollectionId(Long collectionId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("collection_id", collectionId); + + DesignItem designItem = new DesignItem(); + designItem.setCollectionId(0L); + return designItemMapper.update(designItem,queryWrapper); + } + + @Override + public List getByDesignId(Long designId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("design_id", designId); + queryWrapper.eq("is_like", (byte)0); + return designItemMapper.selectList(queryWrapper); + } + + @Override + public void updateLikeStatus(Long designItemId,Byte hasLike) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id", designItemId); + + DesignItem designItem =new DesignItem(); + designItem.setHasLike(hasLike); + designItemMapper.update(designItem,queryWrapper); + } + + @Override + public void updateDesignHighUrl(Long designItemId, String highUrl,String timeZone) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id", designItemId); + + DesignItem designItem =new DesignItem(); + designItem.setHighDesignUrl(highUrl); + designItem.setUpdateDate(DateUtil.getByTimeZone(timeZone)); + designItemMapper.update(designItem,queryWrapper); + } + + @Override + public GetNextSysElementVO getNextSysElement(Long id, String level2Type, String operateType) { + //校验 + if(! DesignPythonItem.SYS_HAIRSTYLE_SHOES_BODY.contains(level2Type)){ + throw new BusinessException("unknown type! "); + } + List operateTypes = Arrays.asList("PREV","NEXT"); + if(! operateTypes.contains(operateType)){ + throw new BusinessException("unknown operateType! "); + } + Assert.notNull(id,"id cannot be empty!"); + Long maxId = sysFileService.getMaxIdByLevel2Type(level2Type); + Long minId = sysFileService.getMinIdByLevel2Type(level2Type); + + if(id > maxId || id newTypes = designSingleDTO.getClothes().stream().map(DesignSingleItemDTO::getType).collect(Collectors.toSet()); + //校验category + validateCategory(newTypes,design.getSingleOverall(),design.getSwitchCategory()); + DesignPythonObjects objects =pythonService.covertDesignSingleParam( + designSingleDTO,design.getSingleOverall(),design.getSwitchCategory(),designLibraryModelPointVO); + pythonService.design(objects); + //designSingle + DesignCollectionItemVO response = saveSingleDesignItemAndDetail(objects,design.getId(),designSingleDTO.getDesignItemId(), + design.getCollectionId(),userInfo,designSingleDTO.getTimeZone()); + designItem.setDesignUrl(response.getDesignItemUrl()); + return response; + } + private LibraryModelPointVO resloveVoByModelPoint(LibraryModelPoint modelPoint,Library library){ + LibraryModelPointVO libraryModelPointVO = CopyUtil.copyObject(modelPoint,LibraryModelPointVO.class); + libraryModelPointVO.setTemplateId(modelPoint.getId()); + libraryModelPointVO.setHandLeft(JSON.parseObject(modelPoint.getHandLeft(),List.class)); + libraryModelPointVO.setHandRight(JSON.parseObject(modelPoint.getHandRight(),List.class)); + libraryModelPointVO.setShoulderRight(JSON.parseObject(modelPoint.getShoulderRight(),List.class)); + libraryModelPointVO.setShoulderLeft(JSON.parseObject(modelPoint.getShoulderLeft(),List.class)); + libraryModelPointVO.setWaistbandRight(JSON.parseObject(modelPoint.getWaistbandRight(),List.class)); + libraryModelPointVO.setWaistbandLeft(JSON.parseObject(modelPoint.getWaistbandLeft(),List.class)); + return libraryModelPointVO; + } + + @Override + public String printDot(DesignSingleDTO designSingleDTO) { + DesignItem designItem = selectById(designSingleDTO.getDesignItemId()); + Assert.notNull(designItem,"design item does not exists!"); + Design design = designService.getById(designItem.getDesignId()); + Assert.notNull(design,"design does not exists!"); + DesignLibraryModelPointVO designLibraryModelPointVO = null; + if (Objects.nonNull(design.getTemplateId())){ + LibraryModelPoint modelPoint = libraryModelPointService.getById(design.getTemplateId()); + Assert.notNull(modelPoint,"template does not exists!"); + Library library = libraryService.getById(modelPoint.getLibraryId()); + Assert.notNull(modelPoint,"template does not exists!"); + designLibraryModelPointVO = collectionElementService.calculateTemplatePoint(modelPoint,library.getHigh(),library.getWidth(),library.getUrl()); + } + Set newTypes = designSingleDTO.getClothes().stream().map(DesignSingleItemDTO::getType).collect(Collectors.toSet()); + //校验category + validateCategory(newTypes,design.getSingleOverall(),design.getSwitchCategory()); + DesignPythonObjects objects =pythonService.covertDesignSingleParam( + designSingleDTO,design.getSingleOverall(),design.getSwitchCategory(),designLibraryModelPointVO); + pythonService.design(objects); + + return objects.getObjects().get(0).getBasic().getSave_name(); + } + + private void validateCategory(Set newTypes, String singleOverall, String switchCategory) { + if(SingleOverallEnum.SINGLE.getRealName().equals(singleOverall) ){ + if(newTypes.size() >1){ + throw new BusinessException("Wrong clothes type !"); + } + //一个的时候 + if(!switchCategory.equals(CollectionUtil.newArrayList(newTypes).get(0))){ + throw new BusinessException("Wrong clothes type !"); + } + } + } + private DesignCollectionItemVO saveSingleDesignItemAndDetail(DesignPythonObjects pythonObjects + , Long designId,Long designItemId, Long collectionId, AuthPrincipalVo userInfo, String timeZone){ + DesignCollectionItemVO response = new DesignCollectionItemVO(); + response.setDesignItemId(designItemId); + + DesignItem designItem = new DesignItem(); + String url = pythonObjects.getObjects().get(0).getBasic().getSave_name(); + designItem.setUpdateDate(DateUtil.getByTimeZone(timeZone)); + designItem.setDesignUrl(url); + designItem.setId(designItemId); + response.setDesignItemUrl(url); + //更新item + updateById(designItem); + //删除itemDetail + designItemDetailService.deleteByDesignItemId(designItemId); + + List designItemDetails = Lists.newArrayList(); + pythonObjects.getObjects().get(0).getItems().forEach(detail ->{ + if(null == detail){ + return; + } + DesignItemDetail designItemDetail = CopyUtil.copyObject(detail,DesignItemDetail.class); + designItemDetail.setAccountId(userInfo.getId()); + designItemDetail.setDesignId(designId); + designItemDetail.setDesignItemId(designItemId); + designItemDetail.setCollectionElementId(detail.getElementId()); + designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone)); + if(SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType())){ + designItemDetail.setPath(detail.getBody_path()); + //BODY不关联businessId + designItemDetail.setBusinessId(0L); + } + designItemDetail.setIconPath(detail.getIcon()); + DesignPythonItemPrint printObject = detail.getPrint(); + designItemDetail.setPrintPath(Objects.isNull(printObject)? "" :printObject.getPath()); + designItemDetail.setPrintJson(JSON.toJSONString(printObject)); + designItemDetails.add(designItemDetail); + }); + designItemDetailService.saveBatch(designItemDetails); + //封装item信息 + List designCollectionItems = CopyUtil.copyList(getByDesignId(designId) + ,DesignCollectionItemVO.class,(o,d) ->{ + d.setDesignItemId(o.getId()); + d.setDesignItemUrl(o.getDesignUrl()); + }); + return response; + } + + private DesignItem selectById(Long id) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id", id); + return designItemMapper.selectOne(queryWrapper); + } + + private Boolean exists(Long id) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id", id); + return designItemMapper.exists(queryWrapper); + } +} diff --git a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java new file mode 100644 index 00000000..0ee97248 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java @@ -0,0 +1,574 @@ +package com.ai.da.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.ai.da.common.config.FileProperties; +import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.context.UserContext; +import com.ai.da.common.enums.CollectionLevel1TypeEnum; +import com.ai.da.common.enums.SingleOverallEnum; +import com.ai.da.common.enums.SysFileLevel2TypeEnum; +import com.ai.da.common.utils.CopyUtil; +import com.ai.da.common.utils.DateUtil; +import com.ai.da.common.utils.FileUtil; +import com.ai.da.common.utils.LocalCacheUtils; +import com.ai.da.mapper.DesignMapper; +import com.ai.da.mapper.entity.*; +import com.ai.da.mapper.entity.Collection; +import com.ai.da.model.dto.*; +import com.ai.da.model.vo.*; +import com.ai.da.python.PythonService; +import com.ai.da.python.vo.DesignPythonItem; +import com.ai.da.python.vo.DesignPythonItemPrint; +import com.ai.da.python.vo.DesignPythonObjects; +import com.ai.da.service.*; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; +import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.expression.operators.relational.OldOracleJoinBinaryExpression; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import sun.security.krb5.internal.crypto.Des; + +import javax.annotation.Resource; +import java.io.File; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +import static com.ai.da.python.vo.DesignPythonItem.*; + +/** + * 服务实现类 + * + * @author yanglei + * @since 2022-09-30 + */ +@Slf4j +@Service +public class DesignServiceImpl extends ServiceImpl implements DesignService { + @Resource + private DesignMapper designMapper; + @Resource + private CollectionElementService collectionElementService; + @Resource + private CollectionService collectionService; + @Resource + private PythonService pythonService; + @Resource + private LibraryService libraryService; + @Resource + private DesignItemService designItemService; + @Resource + private DesignItemDetailService designItemDetailService; + @Resource + private FileProperties fileProperties; + @Resource + private UserLikeGroupService userLikeGroupService; + @Resource + private UserLikeService userLikeService; + @Resource + private SysFileService sysFileService; + +// @Transactional + @Override + public DesignCollectionVO designCollection(DesignCollectionDTO designDTO) { + AuthPrincipalVo userInfo = UserContext.getUserHolder(); + //校验collection element + ValidateElementVO elementVO =collectionElementService.validateElement(designDTO); + //design + return designOrRedesignOperate(designDTO,userInfo,null,elementVO); + } + private void calculateLibraryAndSysFile(DesignCollectionDTO designDTO,ValidateElementVO elementVO,AuthPrincipalVo userInfo){ + //查询用户 sketch library + List libraryVos ; + if(CollectionUtil.isNotEmpty(designDTO.getSketchBoards())){ + List sketchUrlList = elementVO.getSketchBoardElements() + .stream() + .map(CollectionElement::getUrl) + .collect(Collectors.toList()); + DesignAttributeRetrievalDTO designAttributeRetrievalDTO = + pythonService.generateAttributeRetrieval(sketchUrlList,userInfo.getId()); + if(CollectionUtils.isEmpty(designAttributeRetrievalDTO.getLibraryUrls())){ + libraryVos = null; + }else{ + libraryVos =libraryService.getByUrlList(designAttributeRetrievalDTO.getLibraryUrls(),userInfo.getId()); + } + List sysFileVOS =sysFileService.getByUrlList(designAttributeRetrievalDTO.getSysFileUrlS()); + elementVO.setSysFileVo(sysFileVOS); + }else{ + libraryVos =libraryService.selectByAccountIdAnd1TypeList(userInfo.getId(), + Collections.singletonList(CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName())); + } + elementVO.setLibraryVos(libraryVos); + //校验比列 + validateRatio(designDTO,libraryVos); + } + private void validateRatio(DesignCollectionDTO designDTO, List libraryVos){ + //校验系统比列,先去掉 考虑到程序已经进入比较后面了,该校验不重要,且会产生脏数据 +// BigDecimal bigDecimal = designDTO.getSystemScale(); +// //池子是包括三部分 = 本次用户上传的sketch + library的sketch +系统的sketch,systemScale计算的是 library和sysFile的比列 +// if (/*CollectionUtil.isEmpty(designDTO.getSketchBoards()) +// && */CollectionUtils.isEmpty(libraryVos) +// && bigDecimal.compareTo(BigDecimal.ZERO) <= 0) { +// throw new BusinessException("No sketch, please increase the system rate"); +// } + } + private void saveCollectionElemntsByLibrarys(ValidateElementVO elementVO,Long collectionId){ + if(CollectionUtils.isEmpty(elementVO.getLibraryCollectionElements())){ + return; + } + elementVO.getLibraryCollectionElements() + .forEach(element ->{ + element.setCollectionId(collectionId); + Byte hasPin = element.getHasPin(); + if(Objects.isNull(hasPin)){ + element.setHasPin((byte) 0); + } + element.setId(null); + }); + List saveElements = elementVO.getLibraryCollectionElements(); + collectionElementService.saveBatch(saveElements); + elementVO.getUsedElementIds().addAll(saveElements.stream().map(CollectionElement::getId).collect(Collectors.toList())); + //sketch + List newSketchAboard =saveElements.stream() + .filter(f->f.getLevel1Type().equals(CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName())) + .collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(newSketchAboard)){ + elementVO.getSketchBoardElements().addAll(newSketchAboard); + } + //print + List newPrintboard =saveElements.stream() + .filter(f->f.getLevel1Type().equals(CollectionLevel1TypeEnum.PRINT_BOARD.getRealName())) + .collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(newPrintboard)){ + elementVO.getPrintBoardElements().addAll(newPrintboard); + } + } + private DesignCollectionVO designOrRedesignOperate(DesignCollectionDTO designDTO,AuthPrincipalVo userInfo, + Long collectionIdParam,ValidateElementVO elementVO){ + if(CollectionUtil.isNotEmpty(designDTO.getSketchBoards())){ + //编辑sketchBoard + collectionElementService.editSketchBoardsElement(elementVO,designDTO.getSketchBoards()); + } + if(CollectionUtil.isNotEmpty(designDTO.getPrintBoards())){ + //编辑printBoard + collectionElementService.editPrintBoardsElement(elementVO,designDTO.getPrintBoards()); + } + //保存collection + Long collectionId = (null == collectionIdParam) ? + collectionService.saveCollection(userInfo.getId(),designDTO.getTimeZone(),designDTO.getMoodTemplateId()) : collectionIdParam; + List elementIds =getElementId(elementVO); + //批量关联element 到 collection + collectionElementService.relationCollection(elementIds,collectionId); + //library转化为collection(生成) + saveCollectionElemntsByLibrarys(elementVO,collectionId); + //保存颜色版 + collectionElementService.saveColorBoard(designDTO.getColorBoards(),collectionId,designDTO.getTimeZone()); + //保存design + Long designId = saveOne(designDTO,collectionId,userInfo.getId()); + //计算library + calculateLibraryAndSysFile(designDTO,elementVO,userInfo); + //组装design入参 + DesignPythonObjects pythonObjects =pythonService.covertDesignParam(designDTO.getSystemScale(), + designDTO.getSingleOverall(),designDTO.getSwitchCategory(),elementVO); + //缓存保存的文件 方便后面处理进度问题 + setDesignProcess(userInfo.getId(),pythonObjects); + //design + pythonService.design(pythonObjects); + //生成library + generateLibrary(elementVO,designDTO.getTimeZone()); + //保存designItem 和detail + return saveDesignItemAndDetail(pythonObjects,designId,collectionId,userInfo,designDTO.getTimeZone()); + } + private void generateLibrary(ValidateElementVO elementVO,String timeZone){ + List elements = Lists.newArrayList(); + if(!CollectionUtils.isEmpty(elementVO.getMoodBoardElements())){ + elements.addAll(elementVO.getMoodBoardElements()); + } + if(!CollectionUtils.isEmpty(elementVO.getPrintBoardElements())){ + elements.addAll(elementVO.getPrintBoardElements()); + } + if(!CollectionUtils.isEmpty(elementVO.getSketchBoardElements())){ + elements.addAll(elementVO.getSketchBoardElements()); + } + if(!CollectionUtils.isEmpty(elementVO.getMarketingSketchElements())){ + elements.addAll(elementVO.getMarketingSketchElements()); + } + collectionElementService.saveLibraryByCollectionElement(elements,timeZone); + } + @Override + public BigDecimal countDesignProcess(){ + AuthPrincipalVo userInfo = UserContext.getUserHolder(); + List saveNames = LocalCacheUtils.getDesignProcessCache(userInfo.getId()); + if (CollectionUtils.isEmpty(saveNames)){ + return BigDecimal.ZERO; + } + int totalProcess =0; + log.info("design 统计进度###totalProcess1{}",totalProcess); + //转成本地文件先 + for (String saveName : saveNames) { + String localFileUrl = saveName; + String linuxDomain = fileProperties.getLinuxDomain(); + if (!StringUtils.isEmpty(linuxDomain)) { + //linux 系统 + String oldPath = fileProperties.getSys().getPath(); + localFileUrl = saveName.replace(linuxDomain,oldPath); + } + File file = new File(localFileUrl); + if(file.exists()){ + totalProcess++; + log.info("design 统计进度++###totalProcess+++{}",totalProcess); + } + } + log.info("design 统计进度###totalProcess2{}",totalProcess); + BigDecimal result = BigDecimal.valueOf(totalProcess).divide(BigDecimal.valueOf(8)).setScale(3,BigDecimal.ROUND_HALF_UP); + if (result.compareTo(BigDecimal.ONE) == 0){ + LocalCacheUtils.delDesignProcessCache(userInfo.getId()); + } + return result; + } + + private void setDesignProcess(Long userId,DesignPythonObjects pythonObjects){ + List saveNames = pythonObjects.getObjects().stream().map(object ->{ + return object.getBasic().getSave_name();}).collect(Collectors.toList()); + LocalCacheUtils.setDesignProcessCache(userId,saveNames); + } + private DesignCollectionVO saveDesignItemAndDetail(DesignPythonObjects pythonObjects + ,Long designId,Long collectionId,AuthPrincipalVo userInfo,String timeZone){ + DesignCollectionVO response = new DesignCollectionVO(); + response.setDesignId(designId); + response.setCollectionId(collectionId); + List designCollectionItems = Lists.newArrayList(); + response.setDesignCollectionItems(designCollectionItems); + + pythonObjects.getObjects().forEach(item ->{ + DesignItem designItem = new DesignItem(); + designItem.setAccountId(userInfo.getId()); + designItem.setCollectionId(collectionId); + designItem.setDesignId(designId); + designItem.setCreateDate(DateUtil.getByTimeZone(timeZone)); + //生成的八张图片 + designItem.setDesignUrl(item.getBasic().getSave_name()); + designItem.setHasLike((byte)0); + //生成designItem + Long designItemId = designItemService.saveOne(designItem); + //response + designCollectionItems.add(new DesignCollectionItemVO(designItemId,designItem.getDesignUrl())); + + List designItemDetails = Lists.newArrayList(); + item.getItems().forEach(detail ->{ + if(null == detail){ + return; + } + DesignItemDetail designItemDetail = CopyUtil.copyObject(detail,DesignItemDetail.class); + designItemDetail.setAccountId(userInfo.getId()); + designItemDetail.setDesignId(designId); + designItemDetail.setDesignItemId(designItemId); + designItemDetail.setCollectionElementId(detail.getElementId()); + designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone)); + if(SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType())){ + designItemDetail.setPath(detail.getBody_path()); + //BODY不关联businessId + designItemDetail.setBusinessId(0L); + } + designItemDetail.setIconPath(detail.getIcon()); + DesignPythonItemPrint printObject = detail.getPrint(); + designItemDetail.setPrintPath(Objects.isNull(printObject)? "" :printObject.getPath()); + designItemDetails.add(designItemDetail); + }); + designItemDetailService.saveBatch(designItemDetails); + }); + return response; + } + private List getElementId(ValidateElementVO elementVO){ + List elementIds = Lists.newArrayList(); + if(CollectionUtil.isNotEmpty(elementVO.getSketchBoardElements())){ + elementIds.addAll(elementVO.getSketchBoardElements().stream().map(CollectionElement::getId).collect(Collectors.toList())); + } + if(CollectionUtil.isNotEmpty(elementVO.getMoodBoardElements())){ + elementIds.addAll(elementVO.getMoodBoardElements().stream().map(CollectionElement::getId).collect(Collectors.toList())); + } + if(CollectionUtil.isNotEmpty(elementVO.getPrintBoardElements())){ + elementIds.addAll(elementVO.getPrintBoardElements().stream().map(CollectionElement::getId).collect(Collectors.toList())); + } + if(CollectionUtil.isNotEmpty(elementVO.getMarketingSketchElements())){ + elementIds.addAll(elementVO.getMarketingSketchElements().stream().map(CollectionElement::getId).collect(Collectors.toList())); + } + return elementIds; + } + + @Override + public DesignCollectionVO reDesignCollection(ReDesignCollectionDTO reDesignDTO) { + //校验collection + Collection collection = collectionService.findById(reDesignDTO.getCollectionId()); + Assert.notNull(collection,"Collection does not exist!"); + AuthPrincipalVo userInfo = UserContext.getUserHolder(); + //查询用户 sketch library + List libraryVos =libraryService.selectByAccountIdAnd1TypeList(userInfo.getId(), + Arrays.asList(CollectionLevel1TypeEnum.PRINT_BOARD.getRealName(), + CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName())); + //校验collection element + ValidateElementVO elementVO =collectionElementService.validateElement( + CopyUtil.copyObject(reDesignDTO,DesignCollectionDTO.class)); + //计算并删除对应的未关联的element + collectionElementService.batchDelete( + calculateNoRelationElement(reDesignDTO.getCollectionId(),elementVO.getUsedElementIds())); + Design oldDesign = selectByCollectionId(reDesignDTO.getCollectionId()); + //删除老的关联的design + deleteByCollectionId(reDesignDTO.getCollectionId()); + designItemService.deleteByCollectionId(reDesignDTO.getCollectionId()); + designItemDetailService.deleteByDesignId(oldDesign.getId()); + //redesign + return designOrRedesignOperate(CopyUtil.copyObject( + reDesignDTO,DesignCollectionDTO.class),userInfo,reDesignDTO.getCollectionId(),elementVO); + } + private List calculateNoRelationElement(Long collectionId ,List usedElementIds){ + List collectionElements = collectionElementService.getByCollectionId(collectionId); + if(CollectionUtils.isEmpty(collectionElements)){ + throw new BusinessException("get collection elements cannot be empty"); + } + if(CollectionUtils.isEmpty(usedElementIds)){ + return collectionElements.stream().map(CollectionElement::getId).collect(Collectors.toList()); + } + return collectionElements.stream() + .filter(filter ->!usedElementIds.contains(filter.getId())) + .map(CollectionElement::getId) + .collect(Collectors.toList()); + } + + @Override + public DesignCollectionVO designItemList(Long designId) { + Design design = getById(designId); + Assert.notNull(design,"design does not exist!"); + List designItems = designItemService.getByDesignId(designId); + if(CollectionUtils.isEmpty(designItems)){ + return new DesignCollectionVO(designId,design.getCollectionId(),null); + } + return new DesignCollectionVO(designId,design.getCollectionId(),coverDesignItemToVO(designItems)); + } + private List coverDesignItemToVO( List designItems){ + List response = Lists.newArrayList(); + designItems.forEach(designItem -> { + response.add(new DesignCollectionItemVO(designItem.getId(),designItem.getDesignUrl())); + }); + return response; + } + + @Override + public DesignLikeVO like(DesignLikeDTO designLikeDTO) { + Long userGroupId = null; + Long groupDetailId = null; + AuthPrincipalVo userInfo = UserContext.getUserHolder(); + DesignItem designItem = designItemService.getById(designLikeDTO.getDesignItemId()); + Assert.notNull(designItem,"designItem does not exist!"); + if(Objects.nonNull(designLikeDTO.getUserGroupId())){ + userGroupId = designLikeDTO.getUserGroupId(); + + UserLikeGroup userLikeGroup = userLikeGroupService.getById(designLikeDTO.getUserGroupId()); + Assert.notNull(userLikeGroup,"History does not exist!"); +// if(designItem.getCollectionId().equals(userLikeGroup.getCollectionId())){ +// //相同collection直接跳过 不需要往element加元素 +// return new DesignLikeVO(); +// } + List oldElements = collectionElementService.getByCollectionId(userLikeGroup.getCollectionId()); + Assert.notEmpty(oldElements,"old elements does not exist!"); + List designItemDetails = designItemDetailService.selectByDesignItemId(designLikeDTO.getDesignItemId()); + Assert.notEmpty(designItemDetails,"new designItemDetails does not exist!"); + //判断老的element合并到新的是否满足 数量不超过15 + List newElementIds = validateMergeElement(oldElements,designItemDetails); + //合并,关联新的element到collection + collectionElementService.relationCollection(newElementIds,userLikeGroup.getCollectionId()); + UserLike userLike = resolveUserLike(designLikeDTO.getUserGroupId(), designItem.getDesignId(), + designLikeDTO.getDesignItemId(),designItem.getDesignUrl(),designLikeDTO.getTimeZone()); + userLikeService.save(userLike); + groupDetailId = userLike.getId(); + }else{ + //第一次like + userGroupId = userLikeGroupService.insertUserGroup(userInfo.getId(),designItem.getCollectionId(),designLikeDTO.getTimeZone()); + UserLike userLike =resolveUserLike(userGroupId, + designItem.getDesignId(),designLikeDTO.getDesignItemId(),designItem.getDesignUrl(),designLikeDTO.getTimeZone()); + userLikeService.save(userLike); + groupDetailId = userLike.getId(); + } + //修改designItem为like状态 + designItemService.updateLikeStatus(designLikeDTO.getDesignItemId(),(byte)1); + return new DesignLikeVO(userGroupId,groupDetailId); + } + private List validateMergeElement(List oldElements,List designItemDetails){ + List hasCollections = designItemDetails.stream() + .filter(f->Objects.nonNull(f.getCollectionElementId())) + .collect(Collectors.toList()); + if(CollectionUtils.isEmpty(hasCollections)){ + return null; + } + List oldIds = oldElements.stream().map(CollectionElement::getId).collect(Collectors.toList()); + List elementIds = hasCollections.stream().map(DesignItemDetail::getCollectionElementId).collect(Collectors.toList()); + //本次新增collection个数 + List adds = elementIds.stream().filter(id ->!oldIds.contains(id)).collect(Collectors.toList()); + if(CollectionUtils.isEmpty(adds)){ + return null; + } + //校验15次 + Map> group = oldElements.stream() + .collect(Collectors.groupingBy(CollectionElement::getLevel1Type)); + + group.forEach((k,v) ->{ + List thisElement = group.get(k); + int groupNum = calculateGroupNum(thisElement,adds); + if(groupNum >15){ + throw new BusinessException("The size of element type" +k+ "exceeds 15"); + } + }); + return adds; + } + private int calculateGroupNum(List thisElement,List adds){ + int num = 0; + List groupOldIds = thisElement.stream().map(CollectionElement::getId).collect(Collectors.toList()); + for (Long add : adds) { + if(groupOldIds.contains(add)){ + num ++ ; + } + } + return num +thisElement.size(); + } + private UserLike resolveUserLike(Long userGroupId,Long designId,Long designItemId, String designUrl,String timeZone){ + UserLike userLike = new UserLike(); + userLike.setCreateDate(DateUtil.getByTimeZone(timeZone)); + userLike.setDesignId(designId); + userLike.setUserLikeGroupId(userGroupId); + userLike.setDesignItemId(designItemId); + userLike.setUrl(designUrl); + return userLike; + } + + @Override + public Boolean dislike(DisDesignLikeDTO disDesignLikeDTO) { + AuthPrincipalVo userInfo = UserContext.getUserHolder(); + UserLike userLike = userLikeService.getById(disDesignLikeDTO.getGroupDetailId()); + Assert.notNull(userLike,"History detail does not exist!"); + Design design = getById(disDesignLikeDTO.getDesignId()); + Assert.notNull(design,"design does not exist!"); + if(!userLike.getDesignId().equals(disDesignLikeDTO.getDesignId())){ + //不是相同的design不会合并 + return Boolean.TRUE; + } + //修改designItem为dislike状态 + designItemService.updateLikeStatus(userLike.getDesignItemId(),(byte)0); + //删除关联的collection,先不做 + + //删除对应的history + userLikeService.removeById(disDesignLikeDTO.getGroupDetailId()); + List userLikeVOS = userLikeService.getGroupDetail(userLike.getUserLikeGroupId()); + if(CollectionUtils.isEmpty(userLikeVOS)){ + //group 下面没有元素时候 直接删除 + userLikeGroupService.removeById(userLike.getUserLikeGroupId()); + } + return Boolean.TRUE; + } + + @Override + public String generateHighDesign(GenerateHighDesignDTO generateHighDesignDTO) { + DesignItem designItem = designItemService.getById(generateHighDesignDTO.getDesignItemId()); + Assert.notNull(designItem,"design item does not exist!"); + String highUrl = pythonService.generateHighDesign(designItem.getDesignUrl()); + //存储 + designItemService.updateDesignHighUrl(designItem.getId(),highUrl,generateHighDesignDTO.getTimeZone()); + return highUrl ; + } + + @Override + public Boolean deleteHighDesign(GenerateHighDesignDTO generateHighDesignDTO) { + DesignItem designItem = designItemService.getById(generateHighDesignDTO.getDesignItemId()); + Assert.notNull(designItem,"design item does not exist!"); + if(StringUtils.isEmpty(designItem.getHighDesignUrl())){ + //并发情况 ,不提示 直接返回 + return Boolean.TRUE; + } + //存储 + designItemService.updateDesignHighUrl(designItem.getId(),"",generateHighDesignDTO.getTimeZone()); + FileUtil.delete(designItem.getHighDesignUrl()); + return Boolean.TRUE; + } + + @Override + public DesignItemDetailVO detail(Long designItemId) { + DesignItem designItem = designItemService.getById(designItemId); + Assert.notNull(designItem,"design item does not exist!"); + Design design = getById(designItem.getDesignId()); + Assert.notNull(design,"design does not exist!"); + List designItemDetails = designItemDetailService.selectByDesignItemId(designItemId); + Assert.notEmpty(designItemDetails,"designItemDetails does not exist!"); + DesignItemDetailVO response = new DesignItemDetailVO(); + response.setSingleOverall(design.getSingleOverall()); + response.setSwitchCategory(design.getSwitchCategory()); + response.setDesignItemId(designItemId); + response.setDesignItemUrl(designItem.getDesignUrl()); + response.setHighDesignUrl(designItem.getHighDesignUrl()); + List filterDetail = designItemDetails.stream() + .filter(f -> OUTWEAR_DRESS_BLOUSE.contains(f.getType()) || SKIRT_TROUSERS.contains(f.getType())) + .collect(Collectors.toList()); + response.setClothes(CopyUtil.copyList(filterDetail,DesignItemClothesDetailVO.class,(o,d)->{ + d.setId(o.getBusinessId()); + d.setLevel1Type(converTypeToLevel1(o.getType())); + String printJson = o.getPrintJson(); + if(StringUtils.isEmpty(printJson)){ + d.setPrintObject(new DesignPythonItemPrint(o.getPrintPath(), + CollectionLevel1TypeEnum.PRINT_BOARD.getRealName(),0.3f,Boolean.FALSE)); + }else{ + d.setPrintObject(JSON.parseObject(printJson,DesignPythonItemPrint.class)); + } + })); + //single 和 Models(模特)时候 系统元素为空 + List filterDetail2 =designItemDetails.stream() + .filter(f -> SYS_HAIRSTYLE_SHOES.contains(f.getType()) ) + .collect(Collectors.toList()); + response.setOthers(CopyUtil.copyList(filterDetail2,DesignItemOthersDetailVO.class,(o,d)->{ + d.setId(o.getBusinessId()); + d.setPrintObject(new DesignPythonItemPrint()); + })); + return response; + } + private String converTypeToLevel1(String type){ + if(StringUtils.isEmpty(type)){ + return null; + } + SysFileLevel2TypeEnum sysFileLevel2TypeEnum = SysFileLevel2TypeEnum.realNameOf(type); + if(Objects.isNull(sysFileLevel2TypeEnum)){ + return null; + } + if(OUTWEAR_DRESS_BLOUSE.contains(type) || SKIRT_TROUSERS.contains(type) ){ + return CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName(); + } + return null; + } + + private Design selectByCollectionId(Long collectionId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("collection_id", collectionId); + return designMapper.selectOne(queryWrapper); + } + private int deleteByCollectionId(Long collectionId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("collection_id", collectionId); + Design design = new Design(); + design.setCollectionId(0L); + return designMapper.update(design,queryWrapper); + } + + private Long saveOne(DesignCollectionDTO designDTO,Long collectionId,Long accountId) { + Design design = CopyUtil.copyObject(designDTO,Design.class); + design.setCreateDate(DateUtil.getByTimeZone(designDTO.getTimeZone())); + design.setCollectionId(collectionId); + design.setAccountId(accountId); + if (designMapper.insert(design) <= 0) { + throw new BusinessException("save design failed!"); + } + return design.getId(); + } + + +} diff --git a/src/main/java/com/ai/da/service/impl/LibraryModelPointServiceImpl.java b/src/main/java/com/ai/da/service/impl/LibraryModelPointServiceImpl.java new file mode 100644 index 00000000..dc096f01 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/LibraryModelPointServiceImpl.java @@ -0,0 +1,114 @@ +package com.ai.da.service.impl; + +import cn.hutool.core.lang.Assert; +import cn.hutool.json.JSONUtil; +import com.ai.da.common.enums.LibraryLevel1TypeEnum; +import com.ai.da.common.enums.SingleOverallEnum; +import com.ai.da.common.utils.CopyUtil; +import com.ai.da.common.utils.DateUtil; +import com.ai.da.mapper.LibraryModelPointMapper; +import com.ai.da.mapper.entity.*; +import com.ai.da.model.dto.DesignSingleDTO; +import com.ai.da.model.dto.DesignSingleItemDTO; +import com.ai.da.model.dto.LibraryModelPointDTO; +import com.ai.da.model.dto.ModelsDotDTO; +import com.ai.da.model.vo.LibraryModelPointVO; +import com.ai.da.model.vo.LibraryUpdateVo; +import com.ai.da.python.PythonService; +import com.ai.da.python.vo.DesignPythonObjects; +import com.ai.da.service.LibraryModelPointService; +import com.ai.da.service.LibraryService; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.omg.PortableServer.LIFESPAN_POLICY_ID; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * + * @author yanglei + * @since 2022-11-30 + */ +@Slf4j +@Service +public class LibraryModelPointServiceImpl extends ServiceImpl implements LibraryModelPointService { + @Resource + private LibraryModelPointMapper libraryModelPointMapper; + @Resource + private LibraryService libraryService; + @Resource + private PythonService pythonService; + + @Override + public LibraryModelPointVO saveOrEditTemplatePoint(LibraryModelPointDTO libraryModelPointDTO) { + Library library = libraryService.getById(libraryModelPointDTO.getLibraryId()); + Assert.notNull(library,"library does not exist!"); + LibraryModelPointVO libraryModelPointVO =CopyUtil.copyObject(libraryModelPointDTO,LibraryModelPointVO.class);; + if(Objects.isNull(libraryModelPointDTO.getTemplateId())){ + //新增 + LibraryModelPoint libraryModelPoint = resolvePoint(libraryModelPointDTO); + libraryModelPoint.setCreateDate(DateUtil.getByTimeZone(libraryModelPointDTO.getTimeZone())); + save(libraryModelPoint); + libraryModelPointVO.setTemplateId(libraryModelPoint.getId()); + }else { + //编辑 + LibraryModelPoint modelPoint = getById(libraryModelPointDTO.getTemplateId()); + Assert.notNull(modelPoint,"Template does not exist!"); + modelPoint = resolvePoint(libraryModelPointDTO); + modelPoint.setUpdateDate(DateUtil.getByTimeZone(libraryModelPointDTO.getTimeZone())); + modelPoint.setId(libraryModelPointDTO.getTemplateId()); + updateById(modelPoint); + libraryModelPointVO.setTemplateId(modelPoint.getId()); + } + return libraryModelPointVO; + } + private LibraryModelPoint resolvePoint(LibraryModelPointDTO libraryModelPointDTO){ + LibraryModelPoint libraryModelPoint = CopyUtil.copyObject(libraryModelPointDTO,LibraryModelPoint.class); + libraryModelPoint.setHandLeft(JSON.toJSONString(libraryModelPointDTO.getHandLeft())); + libraryModelPoint.setHandRight(JSON.toJSONString(libraryModelPointDTO.getHandRight())); + libraryModelPoint.setWaistbandLeft(JSON.toJSONString(libraryModelPointDTO.getWaistbandLeft())); + libraryModelPoint.setWaistbandRight(JSON.toJSONString(libraryModelPointDTO.getWaistbandRight())); + libraryModelPoint.setShoulderLeft(JSON.toJSONString(libraryModelPointDTO.getShoulderLeft())); + libraryModelPoint.setShoulderRight(JSON.toJSONString(libraryModelPointDTO.getShoulderRight())); + return libraryModelPoint; + } + + + @Override + public List selectByLibraryIds(List libraryIds) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("library_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 String modelsDot( ModelsDotDTO modelsDotDTO) { + DesignPythonObjects objects =pythonService.covertModelsDotParam( + modelsDotDTO, SingleOverallEnum.OVERALL.getRealName(),""); + pythonService.design(objects); + + return objects.getObjects().get(0).getBasic().getSave_name(); + } + +} diff --git a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java new file mode 100644 index 00000000..9672e3c4 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java @@ -0,0 +1,233 @@ +package com.ai.da.service.impl; + +import com.ai.da.common.config.FileProperties; +import com.ai.da.common.config.exception.BusinessException; +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.Response; +import com.ai.da.common.utils.CopyUtil; +import com.ai.da.common.utils.DateUtil; +import com.ai.da.common.utils.FileUtil; +import com.ai.da.mapper.CollectionElementMapper; +import com.ai.da.mapper.LibraryMapper; +import com.ai.da.mapper.UserLikeMapper; +import com.ai.da.mapper.entity.*; +import com.ai.da.model.dto.*; +import com.ai.da.model.vo.*; +import com.ai.da.service.LibraryModelPointService; +import com.ai.da.service.LibraryService; +import com.ai.da.service.UserLikeService; +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 com.google.common.base.Function; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.io.File; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * + * @author yanglei + * @since 2022-09-30 + */ +@Slf4j +@Service +public class LibraryServiceImpl extends ServiceImpl implements LibraryService { + @Resource + private LibraryMapper libraryMapper; + @Resource + private FileProperties fileProperties; + @Resource + private LibraryModelPointService libraryModelPointService; + + private static List top = Arrays.asList(CollectionLevel2TypeEnum.DRESS.getRealName(), + CollectionLevel2TypeEnum.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<>(); + queryWrapper.eq("account_id", authPrincipalVo.getId()); + + if(!StringUtils.isEmpty(query.getLevel1Type())){ + LibraryLevel1TypeEnum level1TypeEnum = LibraryLevel1TypeEnum.uploadOf(query.getLevel1Type()); + Assert.notNull(level1TypeEnum,"unknown level1Type " +query.getLevel1Type()); + queryWrapper.eq("level1_type", query.getLevel1Type()); + } + if(!StringUtils.isEmpty(query.getLevel2Type())){ + CollectionLevel2TypeEnum level2TypeEnum = CollectionLevel2TypeEnum.of(query.getLevel2Type()); + Assert.notNull(level2TypeEnum,"unknown level2Type " +query.getLevel2Type()); + 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()); + } + queryWrapper.orderByDesc("id"); + IPage page = getBaseMapper().selectPage( + new Page<>(query.getPage(), query.getSize()), queryWrapper); + if(CollectionUtils.isEmpty(page.getRecords())){ + return PageBaseResponse.success(new Page<>()); + } + Map map = null; + //封装打点内容 + Boolean isExist = page.getRecords().stream() + .anyMatch(library -> library.getLevel1Type().equals(LibraryLevel1TypeEnum.MODELS.getRealName())); + if(isExist){ + List libarayIds = page.getRecords().stream() + .filter(library -> library.getLevel1Type().equals(LibraryLevel1TypeEnum.MODELS.getRealName())) + .map(Library::getId) + .collect(Collectors.toList()); + List libraryModelPointVOS = libraryModelPointService.selectByLibraryIds(libarayIds); + if(!CollectionUtils.isEmpty(libraryModelPointVOS)){ + map = libraryModelPointVOS.stream().collect(Collectors.toMap(LibraryModelPointVO::getLibraryId,v ->v)); + } + } + Map finalMap = map; + IPage convert = page.convert((Function) library -> { + QueryLibraryPageVO libraryPageVO = CopyUtil.copyObject(library,QueryLibraryPageVO.class); + libraryPageVO.setDesignType(DesignTypeEnum.LIBRARY.getRealName()); + if(finalMap != null && finalMap.containsKey(library.getId())){ + libraryPageVO.setLibraryModelPoint(finalMap.get(library.getId())); + } + return libraryPageVO; + }); + return PageBaseResponse.success(convert); + } + + @Override + public LibraryUpdateVo upload(LibraryUploadDTO libraryUploadDTO) { + //用户信息 + AuthPrincipalVo userInfo = UserContext.getUserHolder(); + LibraryLevel1TypeEnum level1TypeEnum = LibraryLevel1TypeEnum.uploadOf(libraryUploadDTO.getLevel1Type()); + Assert.notNull(level1TypeEnum, "unknown parameter level1Type!"); + if(!StringUtils.isEmpty(libraryUploadDTO.getLevel2Type())){ + CollectionLevel2TypeEnum level2TypeEnum = CollectionLevel2TypeEnum.of(libraryUploadDTO.getLevel2Type()); + Assert.notNull(level2TypeEnum, "unknown parameter level2Type!"); + } + Assert.isTrue(!( level1TypeEnum.equals(LibraryLevel1TypeEnum.SKETCH_BOARD) + && StringUtils.isEmpty(libraryUploadDTO.getLevel2Type()) ),"level2Type cannot be empty!"); + String path = calculateFileUrl(level1TypeEnum, userInfo.getId()); + File file = FileUtil.upload(libraryUploadDTO.getFile(), path); + //保存element元素 + Library library = resolveData(libraryUploadDTO, userInfo, file); + saveOne(library); + return CopyUtil.copyObject(library,LibraryUpdateVo.class); + } + + private Library resolveData(LibraryUploadDTO uploadDTO, AuthPrincipalVo userInfo, File file) { + Library library = CopyUtil.copyObject(uploadDTO, Library.class); + library.setAccountId(userInfo.getId()); + String pictureName = file.getName(); + //获取图片后缀 + String suffix = pictureName.substring(pictureName.lastIndexOf(".")); + //获取图片前缀 + String prefix = pictureName.substring(0,pictureName.lastIndexOf(".")); + library.setName(DateUtil.dateToStr(new Date(),DateUtil.YYYY_MM_DD)); + library.setUrl(file.getAbsolutePath()); + //按时区计算 + library.setCreateDate(DateUtil.getByTimeZone(uploadDTO.getTimeZone())); + String linuxDomain = fileProperties.getLinuxDomain(); + if (!StringUtils.isEmpty(linuxDomain)) { + //linux 系统 + String oldPath = fileProperties.getSys().getPath(); + library.setUrl(file.getAbsolutePath().replace(oldPath, linuxDomain)); + } + return library; + } + + private String calculateFileUrl(LibraryLevel1TypeEnum level1TypeEnum, Long userId) { + String rootPath = fileProperties.getSys().getPath(); + String day = DateUtil.dateToStr(new Date(), DateUtil.YYYYMM); + return rootPath + day + File.separator + "userFile" + File.separator + "library" + + File.separator + level1TypeEnum.getRealName() + File.separator + userId + File.separator+UUID.randomUUID().toString(); + } + + @Override + public void updateLibraryName(LibraryUpdateDTO libraryUpdateDTO) { + List librarys = getByIds(libraryUpdateDTO.getLibraryIds()); + Assert.notEmpty(librarys,"Librarys does not exist!"); + 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); + } + + 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 failed!"); + } + return Boolean.TRUE; + } +} diff --git a/src/main/java/com/ai/da/service/impl/PanToneServiceImpl.java b/src/main/java/com/ai/da/service/impl/PanToneServiceImpl.java new file mode 100644 index 00000000..553e457d --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/PanToneServiceImpl.java @@ -0,0 +1,153 @@ +package com.ai.da.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.utils.CopyUtil; +import com.ai.da.mapper.entity.Collection; +import com.ai.da.mapper.entity.ColorLookupTable; +import com.ai.da.mapper.entity.PanTone; +import com.ai.da.mapper.PanToneMapper; +import com.ai.da.model.dto.GetRgbByHsvBatchDTO; +import com.ai.da.model.vo.PantoneVO; +import com.ai.da.service.ColorLoopUpTableService; +import com.ai.da.service.PanToneService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Service +public class PanToneServiceImpl extends ServiceImpl implements PanToneService { + + @Resource + private PanToneMapper panToneMapper; + @Resource + private ColorLoopUpTableService colorLoopUpTableService; + + @Override + public PantoneVO getByHSV(Integer h, Integer s, Integer v) { + int value = (h * 101 *101)+ (s*101) +v; + ColorLookupTable colorLookupTable = colorLoopUpTableService.getByColorValue(value); + if(Objects.isNull(colorLookupTable)){ + return new PantoneVO(); + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("pantone_index", colorLookupTable.getColorIndex()); + PanTone panTone = panToneMapper.selectOne(queryWrapper); + if(Objects.isNull(panTone)){ + throw new BusinessException("Pantone value does not exist !"); + } + return coverPanToneToVo(panTone); + } + + @Override + public PantoneVO getByTCX(String txc) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("tcx", txc); + List panTones = panToneMapper.selectList(queryWrapper); + if(CollectionUtil.isEmpty(panTones)){ + throw new BusinessException("Pantone value does not exist !"); + } + return coverPanToneToVo(panTones.get(0)); + } + + @Override + public PantoneVO getByRGB(Integer r,Integer g,Integer b) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("r", r); + queryWrapper.eq("g", g); + queryWrapper.eq("b", b); + PanTone panTones = panToneMapper.selectOne(queryWrapper); + return coverPanToneToVo(panTones); + } + + @Override + public List getRgbByHsvBatch(List hsvBatch) { + if(hsvBatch.size() >15){ + throw new BusinessException("hsv value cannot exceed the maximum of 15"); + } + List colorValues = Lists.newArrayList(); + Map valueToHsv = Maps.newHashMap(); + hsvBatch.forEach( hsv->{ + if (Objects.isNull(hsv)) { + return; + } + Integer h = hsv.getH(); + Integer s = hsv.getS(); + Integer v = hsv.getV(); + int value = (h * 101 *101)+ (s*101) +v; + colorValues.add(value); + valueToHsv.put(value,hsv); + }); + List colorLookupTables = colorLoopUpTableService.getByColorValueList(colorValues); + if(Objects.isNull(colorLookupTables)){ + return Lists.newArrayList(); + } + Map IndexToValue = colorLookupTables.stream() + .collect(Collectors.toMap(v->v.getColorIndex(),v ->v.getColorValue(),(V1,V2) ->V1)); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("pantone_index", colorLookupTables.stream() + .map(ColorLookupTable::getColorIndex).collect(Collectors.toList())); + return coverPanToneToVoList(panToneMapper.selectList(queryWrapper),IndexToValue,valueToHsv,hsvBatch); + } + + private PantoneVO coverPanToneToVo(PanTone panTone){ + if(Objects.isNull(panTone)){ + return null; + } + PantoneVO pantoneVO = CopyUtil.copyObject(panTone,PantoneVO.class); + pantoneVO.setR(panTone.getR()); + pantoneVO.setG(panTone.getG()); + pantoneVO.setB(panTone.getB()); + pantoneVO.setId(panTone.getPantoneIndex()); + return pantoneVO; + } + private List coverPanToneToVoList(List panTones + ,Map indexToValue, Map valueToHsv, + List hsvBatch){ + if(Objects.isNull(panTones)){ + throw new BusinessException("Pantone value does not exist !"); + } + List templateResposne = CopyUtil.copyList(panTones,PantoneVO.class,(o,d)->{ + d.setId(o.getPantoneIndex()); + GetRgbByHsvBatchDTO getRgbByHsvBatchDTO = valueToHsv.get(indexToValue.get(o.getPantoneIndex())); + if(Objects.nonNull(getRgbByHsvBatchDTO)){ + d.setH(getRgbByHsvBatchDTO.getH()); + d.setS(getRgbByHsvBatchDTO.getS()); + d.setV(getRgbByHsvBatchDTO.getV()); + } + }); + Map valueToPantoneVo = templateResposne.stream().collect(Collectors.toMap( + v -> (v.getH() * 101 *101)+ (v.getS()*101) +v.getV(), Function.identity(),(value1,value2)-> value1 + )); + List response =Lists.newArrayList(); + //排序给前端 + hsvBatch.forEach( hsv->{ + if (Objects.isNull(hsv)) { + return; + } + int value = (hsv.getH() * 101 *101)+ (hsv.getS()*101) +hsv.getV(); + PantoneVO pantoneVO = valueToPantoneVo.get(value); + if(Objects.isNull(pantoneVO)){ + response.add(new PantoneVO("None","11-1111")); + }else{ + response.add(pantoneVO); + } + }); + return response; + + } +} diff --git a/src/main/java/com/ai/da/service/impl/SysFileServiceImpl.java b/src/main/java/com/ai/da/service/impl/SysFileServiceImpl.java new file mode 100644 index 00000000..c9f3dc3b --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/SysFileServiceImpl.java @@ -0,0 +1,262 @@ +package com.ai.da.service.impl; + +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.enums.SysFileLevel1TypeEnum; +import com.ai.da.common.enums.SysFileLevel2TypeEnum; +import com.ai.da.common.response.PageBaseResponse; +import com.ai.da.common.response.Response; +import com.ai.da.common.utils.CopyUtil; +import com.ai.da.common.utils.FileUtil; +import com.ai.da.common.utils.LocalCacheUtils; +import com.ai.da.common.utils.MD5Utils; +import com.ai.da.mapper.SysFileMapper; +import com.ai.da.mapper.entity.Collection; +import com.ai.da.mapper.entity.Library; +import com.ai.da.mapper.entity.SysFile; +import com.ai.da.mapper.entity.UserLikeGroup; +import com.ai.da.model.vo.LibraryVo; +import com.ai.da.model.vo.SysFileVO; +import com.ai.da.service.SysFileService; +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 com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.est.CACertsResponse; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * + * @author yanglei + * @since 2022-09-30 + */ +@Slf4j +@Service +public class SysFileServiceImpl extends ServiceImpl implements SysFileService { + @Resource + private SysFileMapper sysFileMapper; + @Resource + private FileProperties fileProperties; + + @Transactional + @Override + public void initDefaultSysFile() { + //删除已有的sysFile数据 + deleteAllSysFileData(); + //删除缓存 + clearCacheSysFileData(); + //读取linux环境系统图片地址 + List allFile= FileUtil.getAllFile("/workspace/home/aida/file/sys"); + if(CollectionUtils.isEmpty(allFile)){ + return; + } + Map idMap = initIdValueByLevel2Type(); + if (allFile.size() >500){ + AtomicInteger process = new AtomicInteger(); + //批量保存mysql 500条一次 + List> fileList = Lists.partition(allFile,500); + fileList.forEach(list ->{ + log.info("初始化系统文件进度###次数###{}",process.getAndAdd(1)); + if(saveMany(initSysFile(list,idMap))){ + return; + } + }); + return; + } + saveMany(initSysFile(allFile,idMap)); + } + private void clearCacheSysFileData(){ + LocalCacheUtils.clearAllMaxMinValueCache(); + LocalCacheUtils.clearAllSysFileCache(); + LocalCacheUtils.clearAllSysFileCacheByLevel2Type(); + log.info("初始化系统文件删除删除系统文件缓存完毕#####"); + } + private void deleteAllSysFileData(){ + AtomicInteger process = new AtomicInteger(); + while(true){ + // 分页数据 + QueryWrapper queryWrapper = new QueryWrapper<>(); + IPage page = this.getBaseMapper().selectPage( + new Page<>(1, 500), queryWrapper); + if(CollectionUtils.isEmpty(page.getRecords())){ + break ; + }else{ + List ids = page.getRecords().stream().map(SysFile::getId).collect(Collectors.toList()); + this.removeByIds(ids); + log.info("初始化系统文件删除mysql数据进度###次数###{}",process.getAndAdd(1)); + } + } + } + private List initSysFile(List files,Map idMap){ + List sysFiles =Lists.newArrayList(); + files.forEach(file -> { + SysFile sysFile = new SysFile(); + sysFile.setCreateDate(new Date()); + String filePath = file.getAbsolutePath(); + sysFile.setLevel1Type(calculateLevel1Type(filePath)); + sysFile.setLevel2Type(calculateLevel2Type(filePath)); + sysFile.setId(getIdByLevel2Type(sysFile.getLevel2Type(),idMap)); + sysFile.setName(file.getName()); + try{ + FileInputStream inputStream = new FileInputStream(file); + sysFile.setMd5(MD5Utils.encryptFile(inputStream)); + }catch(IOException ioException){ + log.info("initSysFile 文件异常###{}", ExceptionUtil.getThrowableList(ioException)); + throw new BusinessException("initSysFile ioException"); + } + String linuxDomain = fileProperties.getLinuxDomain(); + if(!StringUtils.isEmpty(linuxDomain)){ + //linux 系统 + String oldPath = fileProperties.getSys().getPath(); + sysFile.setUrl(filePath.replace(oldPath,linuxDomain)); + } + sysFiles.add(sysFile); + }); + return sysFiles; + } + private String calculateLevel1Type(String filePath){ + String[] split = filePath.split("/"); + //一级目录 + SysFileLevel1TypeEnum sysFileLevel1Type = SysFileLevel1TypeEnum.uploadOf(split[split.length-3]); + if(Objects.nonNull(sysFileLevel1Type)){ + return sysFileLevel1Type.getRealName(); + } + return ""; + } + private String calculateLevel2Type(String filePath){ + String[] split = filePath.split("/"); + //一级目录 + SysFileLevel2TypeEnum sysFileLevel2Type = SysFileLevel2TypeEnum.uploadOf(split[split.length-2]); + if(Objects.nonNull(sysFileLevel2Type)){ + return sysFileLevel2Type.getRealName(); + } + return ""; + } + private Long getIdByLevel2Type(String level2Type ,Map IdMp){ + Long id = IdMp.get(level2Type); + Long newId = id +1; + IdMp.put(level2Type,newId); + return newId; + } + private Map initIdValueByLevel2Type(){ + //每个类型分配100000 十万个位置 + Map idMap = Maps.newHashMap(); + // 0 到 100000 + idMap.put(SysFileLevel2TypeEnum.EARRINGS.getRealName(),0L); + // 100001 到 200000 + idMap.put(SysFileLevel2TypeEnum.HAIRSTYLE.getRealName(),100000L); + // 200001 到 300000 + idMap.put(SysFileLevel2TypeEnum.SHOES.getRealName(),200000L); + // 300001 到 400000 + idMap.put(SysFileLevel2TypeEnum.BLOUSE.getRealName(),300000L); + // 400001 到 500000 + idMap.put(SysFileLevel2TypeEnum.DRESS.getRealName(),400000L); + // 500001 到 600000 + idMap.put(SysFileLevel2TypeEnum.OUTWEAR.getRealName(),500000L); + // 600001 到 700000 + idMap.put(SysFileLevel2TypeEnum.SKIRT.getRealName(),600000L); + // 700001 到 800000 + idMap.put(SysFileLevel2TypeEnum.TROUSERS.getRealName(),700000L); + // 800001 到 900000 + idMap.put(SysFileLevel2TypeEnum.ICON.getRealName(),800000L); + // 900001 到 1000000 + idMap.put(SysFileLevel2TypeEnum.BAG.getRealName(),900000L); + // 1000001 到 1100000 + idMap.put(SysFileLevel2TypeEnum.BODY.getRealName(),1000000L); + return idMap; + } + + @Override + public Long getMaxIdByLevel2Type(String level2Type) { + String key = "MAX_"+level2Type; + Long maxId = LocalCacheUtils.getFileMaxMinValueCache(key); + if(null == maxId){ + maxId =maxId(level2Type); + LocalCacheUtils.setFileMaxMinValueCache(key,maxId); + } + return maxId; + } + + @Override + public Long getMinIdByLevel2Type(String level2Type) { + String key = "MIN_"+level2Type; + Long minId = LocalCacheUtils.getFileMaxMinValueCache(key); + if(null == minId || minId == 0L){ + minId = minId(level2Type); + LocalCacheUtils.setFileMaxMinValueCache(key,minId); + } + return minId; + } + + @Override + public SysFileVO getById(Long id) { + SysFileVO sysFile = LocalCacheUtils.getSysFileCache(id); + if(Objects.isNull(sysFile) || Objects.isNull(sysFile.getId())){ + sysFile = CopyUtil.copyObject(sysFileMapper.selectById(id),SysFileVO.class); + LocalCacheUtils.setSysFileCache(id,sysFile); + } + return sysFile; + } + + @Override + public List getByLevel2Type(String level2Type) { + //校验 +// SysFileLevel2TypeEnum level2TypeEnum = SysFileLevel2TypeEnum.realNameOfPython(level2Type); +// if(Objects.isNull(level2TypeEnum)){ +// throw new BusinessException("unknown level2Type "+level2Type); +// } + List cacheSysFileList = LocalCacheUtils.getSysFileCacheByLevel2Type(level2Type); + if(CollectionUtils.isEmpty(cacheSysFileList)){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("level2_type", SysFileLevel2TypeEnum.ofPython()); + List sysFiles = CopyUtil.copyList(sysFileMapper.selectList(queryWrapper),SysFileVO.class); + LocalCacheUtils.setSysFileCacheByLevel2Type(level2Type,sysFiles); + return sysFiles; + } + return cacheSysFileList; + } + + private Long maxId(String level2Type){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("level2_type", level2Type); + queryWrapper.select("max(id) as id " ); + SysFile sysFile = sysFileMapper.selectOne(queryWrapper); + return sysFile.getId(); + } + private Long minId(String level2Type){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("level2_type", level2Type); + queryWrapper.select("min(id) as id " ); + SysFile sysFile = sysFileMapper.selectOne(queryWrapper); + return sysFile.getId(); + } + private boolean saveMany(List sysFiles) { + if (!this.saveBatch(sysFiles)) { + throw new BusinessException("save system file failed!"); + } + return Boolean.TRUE; + } + + @Override + public List getByUrlList(List urlList) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("url", urlList); + return CopyUtil.copyList(sysFileMapper.selectList(queryWrapper),SysFileVO.class); + } +} diff --git a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java new file mode 100644 index 00000000..a538e043 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java @@ -0,0 +1,102 @@ +package com.ai.da.service.impl; + +import com.ai.da.common.context.UserContext; +import com.ai.da.common.utils.CopyUtil; +import com.ai.da.common.utils.DateUtil; +import com.ai.da.mapper.UserLikeGroupMapper; +import com.ai.da.mapper.entity.Account; +import com.ai.da.mapper.entity.UserLikeGroup; +import com.ai.da.model.vo.*; +import com.ai.da.service.AccountService; +import com.ai.da.service.CollectionService; +import com.ai.da.service.UserLikeGroupService; +import com.ai.da.service.UserLikeService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +/** + * 服务实现类 + * + * @author yanglei + * @since 2022-09-30 + */ +@Slf4j +@Service +public class UserLikeGroupServiceImpl extends ServiceImpl implements UserLikeGroupService { + @Resource + private UserLikeGroupMapper userLikeGroupMapper; + @Resource + private AccountService accountService; + @Resource + private CollectionService collectionService; + @Resource + private UserLikeService userLikeService; + + @Override + public void deleteUserGroup(Long userGroupId) { + UserLikeGroup group = getById(userGroupId); + Assert.notNull(group,"History does not exist!"); + userLikeGroupMapper.deleteById(userGroupId); + } + + @Override + public HistoryUpdateVO updateUserGroupName(Long userGroupId, String userGroupName,String timeZone) { + UserLikeGroup group = getById(userGroupId); + Assert.notNull(group,"History does not exist!"); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id", userGroupId); + UserLikeGroup userLikeGroup = new UserLikeGroup(); + userLikeGroup.setName(userGroupName); + userLikeGroup.setUpdateDate(DateUtil.getByTimeZone(timeZone)); + log.info("跟新group名字###{}###时间是###{}",userLikeGroup.getUpdateDate(),TimeZone.getDefault()); + userLikeGroupMapper.update(userLikeGroup,queryWrapper); + return new HistoryUpdateVO(userLikeGroup.getName(),userLikeGroup.getUpdateDate().getTime()); + } + +// public static void main(String[] args) { +// System.out.println(TimeZone.getDefault()); +// Date kolkata =DateUtil.getByTimeZone("Asia/Kolkata"); +// Date shanghai =DateUtil.getByTimeZone("Asia/Shanghai"); +// System.out.println(kolkata); +// System.out.println(shanghai); +// System.out.println(kolkata.getTime()); +// System.out.println(shanghai.getTime()); +// System.out.println(kolkata.getTime() == shanghai.getTime()); +// } + + private List selectByUserId(Long userId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("accountId", userId); + return userLikeGroupMapper.selectList(queryWrapper); + } + + @Override + public Long insertUserGroup(Long userId, Long collectionId, String timeZone) { + UserLikeGroup userLikeGroup = new UserLikeGroup(); + //默认当前时间 + userLikeGroup.setName(DateUtil.dateToStr(new Date(),DateUtil.YYYY_MM_DD_HH_MM_SS)); + userLikeGroup.setCreateDate(DateUtil.getByTimeZone(timeZone)); + userLikeGroup.setUpdateDate(DateUtil.getByTimeZone(timeZone)); + userLikeGroup.setAccountId(userId); + userLikeGroup.setCollectionId(collectionId); + userLikeGroupMapper.insertUserLikeGroup(userLikeGroup); + return userLikeGroup.getId(); + } + + @Override + public UserLikeChooseVO choose(Long userGroupId) { + UserLikeGroup group = getById(userGroupId); + Assert.notNull(group,"History does not exist!"); + List userLikeVOS = userLikeService.getGroupDetail(userGroupId); + UserLikeCollectionVO userLikeCollection = collectionService.chooseCollection(group.getCollectionId()); + return new UserLikeChooseVO(userGroupId,userLikeVOS,userLikeCollection); + } +} diff --git a/src/main/java/com/ai/da/service/impl/UserLikeServiceImpl.java b/src/main/java/com/ai/da/service/impl/UserLikeServiceImpl.java new file mode 100644 index 00000000..ab41d898 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/UserLikeServiceImpl.java @@ -0,0 +1,64 @@ +package com.ai.da.service.impl; + +import com.ai.da.common.utils.CopyUtil; +import com.ai.da.mapper.UserLikeMapper; +import com.ai.da.mapper.entity.Collection; +import com.ai.da.mapper.entity.DesignItem; +import com.ai.da.mapper.entity.UserLike; +import com.ai.da.model.vo.UserLikeVO; +import com.ai.da.service.UserLikeService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * + * @author yanglei + * @since 2022-09-30 + */ +@Slf4j +@Service +public class UserLikeServiceImpl extends ServiceImpl implements UserLikeService { + @Resource + private UserLikeMapper userLikeMapper; + @Resource + private DesignItemServiceImpl designItemService; + + @Override + public List getGroupDetail(Long userGroupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_like_group_id", userGroupId); + List userLikes = userLikeMapper.selectList(queryWrapper); + if(CollectionUtils.isEmpty(userLikes)){ + return Lists.newArrayList(); + } + List designItemIds = userLikes.stream().map(UserLike::getDesignItemId).collect(Collectors.toList()); + List designItems = designItemService.listByIds(designItemIds); + Map idToUrlMap = designItems.stream().collect(Collectors.toMap(DesignItem::getId,DesignItem::getDesignUrl)); + return CopyUtil.copyList(userLikes,UserLikeVO.class,(o,d) ->{ + d.setUrl(idToUrlMap.get(o.getDesignItemId())); + }); + } + + @Override + public List getGroupDetails(List userGroupIds) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("user_like_group_id", userGroupIds); + return CopyUtil.copyList(userLikeMapper.selectList(queryWrapper),UserLikeVO.class); + } + + public void deleteByUserGroupId(Long userGroupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_like_group_id", userGroupId); + userLikeMapper.delete(queryWrapper); + } +} diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties new file mode 100644 index 00000000..c38b6ef3 --- /dev/null +++ b/src/main/resources/application-prod.properties @@ -0,0 +1,38 @@ +server.port=5566 + +#datasource +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://18.167.251.121:3306/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +spring.datasource.username=root +spring.datasource.password=QWa998345 + +#security +spring.security.jwtSecret=JWTSECRET +spring.security.jwtTokenHeader=Authorization +spring.security.jwtTokenPrefix=Bearer- +## 24Сʱ +spring.security.jwtExpiration=8640000000 +#spring security权限设置 认证了token还要认证权限 不然报错Full authentication is required to access this resource +spring.security.ignorePaths=/,/favicon.ico,/doc.html,/webjars/**,/swagger-resources,/v2/api-docs,\ + /api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/** +spring.security.authApi=/auth/login + + +rsa.private_key=MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A== + +#mybatis +mybatis-plus.global-config.banner=false +mybatis-plus.mapper-locations=classpath:mapper/*Mapper.xml +#mybatis-plus.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl + +spring.mvc.pathmatch.matching-strategy=ant_path_matcher + +file.mac.path=~/file/ +file.linux.path=/workspace/home/aida/file/ +#linux服务器域名(预览和下载用) +file.linuxDomain=https://www.aida.com.hk/download/ +file.windows.path=D:\\upload\\ +spring.servlet.multipart.max-file-size = 5MB +spring.servlet.multipart.max-request-size= 5MB +#访问python服务的ip(对应环境) +access.python.ip=http://43.198.80.117 diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties new file mode 100644 index 00000000..c8d4565a --- /dev/null +++ b/src/main/resources/application-test.properties @@ -0,0 +1,44 @@ +server.port=5566 + +#datasource +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://18.162.111.141:3306/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +spring.datasource.username=root +spring.datasource.password=QWa998345 + +#security +spring.security.jwtSecret=JWTSECRET +spring.security.jwtTokenHeader=Authorization +spring.security.jwtTokenPrefix=Bearer- +## 24Сʱ +spring.security.jwtExpiration=8640000000 +#spring security权限设置 认证了token还要认证权限 不然报错Full authentication is required to access this resource +spring.security.ignorePaths=/,/favicon.ico,/doc.html,/webjars/**,/swagger-resources,/v2/api-docs,\ + /api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/** +spring.security.authApi=/auth/login + + +rsa.private_key=MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A== + +#mybatis +mybatis-plus.global-config.banner=false +mybatis-plus.mapper-locations=classpath:mapper/*Mapper.xml +#mybatis-plus.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl + +spring.mvc.pathmatch.matching-strategy=ant_path_matcher + +file.mac.path=~/file/ +file.linux.path=/workspace/home/aida/file/ +#linux服务器域名(预览和下载用) +file.linuxDomain=http://18.162.111.141:5568/download/ +file.windows.path=D:\\upload\\ + +spring.servlet.multipart.max-file-size = 5MB +spring.servlet.multipart.max-request-size= 5MB + +#访问python服务的ip(对应环境) +access.python.ip=http://18.167.251.121 + + + + diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 00000000..9119889c --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,5 @@ +#application-testļ(Ի) +#spring.profiles.active=test + +#application-prodļ() +spring.profiles.active=prod \ No newline at end of file diff --git a/src/main/resources/mapper/AccountMapper.xml b/src/main/resources/mapper/AccountMapper.xml new file mode 100644 index 00000000..2e2bd6b6 --- /dev/null +++ b/src/main/resources/mapper/AccountMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/CollectionMapper.xml b/src/main/resources/mapper/CollectionMapper.xml new file mode 100644 index 00000000..3dddf4ec --- /dev/null +++ b/src/main/resources/mapper/CollectionMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + insert into t_collection + (account_id,create_date) + values( + #{accountId}, + #{createDate}); + + + diff --git a/src/main/resources/mapper/DesignItemMapper.xml b/src/main/resources/mapper/DesignItemMapper.xml new file mode 100644 index 00000000..b4a089d8 --- /dev/null +++ b/src/main/resources/mapper/DesignItemMapper.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + insert into t_design_item + (account_id,design_id,collection_id,print_scale,design_url,high_design_url,is_like,create_date) + values( + #{accountId}, + #{designId}, + #{collectionId}, + #{printScale}, + #{designUrl}, + #{highDesignUrl}, + #{hasLike}, + #{createDate}); + + + diff --git a/src/main/resources/mapper/DesignMapper.xml b/src/main/resources/mapper/DesignMapper.xml new file mode 100644 index 00000000..4c4e029c --- /dev/null +++ b/src/main/resources/mapper/DesignMapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + insert into t_design + (account_id,collection_id,system_scale,single_overall,switch_category,create_date) + values( + #{accountId}, + #{collectionId}, + #{systemScale}, + #{singleOverall}, + #{switchCategory}, + #{createDate}); + + + diff --git a/src/main/resources/mapper/PantoneMapper.xml b/src/main/resources/mapper/PantoneMapper.xml new file mode 100644 index 00000000..cde01c01 --- /dev/null +++ b/src/main/resources/mapper/PantoneMapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/UserLikeGroupMapper.xml b/src/main/resources/mapper/UserLikeGroupMapper.xml new file mode 100644 index 00000000..66bbecc3 --- /dev/null +++ b/src/main/resources/mapper/UserLikeGroupMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + insert into t_user_like_group + (account_id,collection_id,`name`,create_date,update_date) + values( + #{accountId}, + #{collectionId}, + #{name}, + #{createDate}, + #{updateDate}); + + + diff --git a/target/aida-0.0.1-SNAPSHOT.jar b/target/aida-0.0.1-SNAPSHOT.jar new file mode 100644 index 00000000..37e1d685 Binary files /dev/null and b/target/aida-0.0.1-SNAPSHOT.jar differ diff --git a/target/aida-0.0.1-SNAPSHOT.jar.original b/target/aida-0.0.1-SNAPSHOT.jar.original new file mode 100644 index 00000000..1f4020d7 Binary files /dev/null and b/target/aida-0.0.1-SNAPSHOT.jar.original differ diff --git a/target/classes/META-INF/spring-configuration-metadata.json b/target/classes/META-INF/spring-configuration-metadata.json new file mode 100644 index 00000000..c9c480bc --- /dev/null +++ b/target/classes/META-INF/spring-configuration-metadata.json @@ -0,0 +1,97 @@ +{ + "groups": [ + { + "name": "file", + "type": "com.ai.da.common.config.FileProperties", + "sourceType": "com.ai.da.common.config.FileProperties" + }, + { + "name": "file.linux", + "type": "com.ai.da.common.config.FileProperties$ElPath", + "sourceType": "com.ai.da.common.config.FileProperties", + "sourceMethod": "getLinux()" + }, + { + "name": "file.mac", + "type": "com.ai.da.common.config.FileProperties$ElPath", + "sourceType": "com.ai.da.common.config.FileProperties", + "sourceMethod": "getMac()" + }, + { + "name": "file.sys", + "type": "com.ai.da.common.config.FileProperties$ElPath", + "sourceType": "com.ai.da.common.config.FileProperties", + "sourceMethod": "getSys()" + }, + { + "name": "file.windows", + "type": "com.ai.da.common.config.FileProperties$ElPath", + "sourceType": "com.ai.da.common.config.FileProperties", + "sourceMethod": "getWindows()" + }, + { + "name": "spring.security", + "type": "com.ai.da.common.security.config.SecurityProperties", + "sourceType": "com.ai.da.common.security.config.SecurityProperties" + } + ], + "properties": [ + { + "name": "file.linux-domain", + "type": "java.lang.String", + "sourceType": "com.ai.da.common.config.FileProperties" + }, + { + "name": "file.linux.path", + "type": "java.lang.String", + "sourceType": "com.ai.da.common.config.FileProperties$ElPath" + }, + { + "name": "file.mac.path", + "type": "java.lang.String", + "sourceType": "com.ai.da.common.config.FileProperties$ElPath" + }, + { + "name": "file.sys.path", + "type": "java.lang.String", + "sourceType": "com.ai.da.common.config.FileProperties$ElPath" + }, + { + "name": "file.windows.path", + "type": "java.lang.String", + "sourceType": "com.ai.da.common.config.FileProperties$ElPath" + }, + { + "name": "spring.security.auth-api", + "type": "java.lang.String", + "sourceType": "com.ai.da.common.security.config.SecurityProperties" + }, + { + "name": "spring.security.ignore-paths", + "type": "java.lang.String[]", + "sourceType": "com.ai.da.common.security.config.SecurityProperties" + }, + { + "name": "spring.security.jwt-expiration", + "type": "java.lang.Long", + "sourceType": "com.ai.da.common.security.config.SecurityProperties", + "defaultValue": 0 + }, + { + "name": "spring.security.jwt-secret", + "type": "java.lang.String", + "sourceType": "com.ai.da.common.security.config.SecurityProperties" + }, + { + "name": "spring.security.jwt-token-header", + "type": "java.lang.String", + "sourceType": "com.ai.da.common.security.config.SecurityProperties" + }, + { + "name": "spring.security.jwt-token-prefix", + "type": "java.lang.String", + "sourceType": "com.ai.da.common.security.config.SecurityProperties" + } + ], + "hints": [] +} \ No newline at end of file diff --git a/target/classes/application-prod.properties b/target/classes/application-prod.properties new file mode 100644 index 00000000..c38b6ef3 --- /dev/null +++ b/target/classes/application-prod.properties @@ -0,0 +1,38 @@ +server.port=5566 + +#datasource +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://18.167.251.121:3306/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +spring.datasource.username=root +spring.datasource.password=QWa998345 + +#security +spring.security.jwtSecret=JWTSECRET +spring.security.jwtTokenHeader=Authorization +spring.security.jwtTokenPrefix=Bearer- +## 24Сʱ +spring.security.jwtExpiration=8640000000 +#spring security权限设置 认证了token还要认证权限 不然报错Full authentication is required to access this resource +spring.security.ignorePaths=/,/favicon.ico,/doc.html,/webjars/**,/swagger-resources,/v2/api-docs,\ + /api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/** +spring.security.authApi=/auth/login + + +rsa.private_key=MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A== + +#mybatis +mybatis-plus.global-config.banner=false +mybatis-plus.mapper-locations=classpath:mapper/*Mapper.xml +#mybatis-plus.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl + +spring.mvc.pathmatch.matching-strategy=ant_path_matcher + +file.mac.path=~/file/ +file.linux.path=/workspace/home/aida/file/ +#linux服务器域名(预览和下载用) +file.linuxDomain=https://www.aida.com.hk/download/ +file.windows.path=D:\\upload\\ +spring.servlet.multipart.max-file-size = 5MB +spring.servlet.multipart.max-request-size= 5MB +#访问python服务的ip(对应环境) +access.python.ip=http://43.198.80.117 diff --git a/target/classes/application-test.properties b/target/classes/application-test.properties new file mode 100644 index 00000000..c8d4565a --- /dev/null +++ b/target/classes/application-test.properties @@ -0,0 +1,44 @@ +server.port=5566 + +#datasource +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://18.162.111.141:3306/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +spring.datasource.username=root +spring.datasource.password=QWa998345 + +#security +spring.security.jwtSecret=JWTSECRET +spring.security.jwtTokenHeader=Authorization +spring.security.jwtTokenPrefix=Bearer- +## 24Сʱ +spring.security.jwtExpiration=8640000000 +#spring security权限设置 认证了token还要认证权限 不然报错Full authentication is required to access this resource +spring.security.ignorePaths=/,/favicon.ico,/doc.html,/webjars/**,/swagger-resources,/v2/api-docs,\ + /api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/** +spring.security.authApi=/auth/login + + +rsa.private_key=MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A== + +#mybatis +mybatis-plus.global-config.banner=false +mybatis-plus.mapper-locations=classpath:mapper/*Mapper.xml +#mybatis-plus.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl + +spring.mvc.pathmatch.matching-strategy=ant_path_matcher + +file.mac.path=~/file/ +file.linux.path=/workspace/home/aida/file/ +#linux服务器域名(预览和下载用) +file.linuxDomain=http://18.162.111.141:5568/download/ +file.windows.path=D:\\upload\\ + +spring.servlet.multipart.max-file-size = 5MB +spring.servlet.multipart.max-request-size= 5MB + +#访问python服务的ip(对应环境) +access.python.ip=http://18.167.251.121 + + + + diff --git a/target/classes/application.properties b/target/classes/application.properties new file mode 100644 index 00000000..a7972f34 --- /dev/null +++ b/target/classes/application.properties @@ -0,0 +1,5 @@ +#����application-test�ļ�(���Ի���) +#spring.profiles.active=test + +#����application-prod�ļ�(��������) +spring.profiles.active=prod \ No newline at end of file diff --git a/target/classes/com/ai/da/AiDaApplication.class b/target/classes/com/ai/da/AiDaApplication.class new file mode 100644 index 00000000..f0bcd694 Binary files /dev/null and b/target/classes/com/ai/da/AiDaApplication.class differ diff --git a/target/classes/com/ai/da/common/annotation/Condition.class b/target/classes/com/ai/da/common/annotation/Condition.class new file mode 100644 index 00000000..9e652aa6 Binary files /dev/null and b/target/classes/com/ai/da/common/annotation/Condition.class differ diff --git a/target/classes/com/ai/da/common/annotation/Order.class b/target/classes/com/ai/da/common/annotation/Order.class new file mode 100644 index 00000000..fef5700a Binary files /dev/null and b/target/classes/com/ai/da/common/annotation/Order.class differ diff --git a/target/classes/com/ai/da/common/config/FileProperties$ElPath.class b/target/classes/com/ai/da/common/config/FileProperties$ElPath.class new file mode 100644 index 00000000..cebcf9a1 Binary files /dev/null and b/target/classes/com/ai/da/common/config/FileProperties$ElPath.class differ diff --git a/target/classes/com/ai/da/common/config/FileProperties.class b/target/classes/com/ai/da/common/config/FileProperties.class new file mode 100644 index 00000000..317f52be Binary files /dev/null and b/target/classes/com/ai/da/common/config/FileProperties.class differ diff --git a/target/classes/com/ai/da/common/config/RsaProperties.class b/target/classes/com/ai/da/common/config/RsaProperties.class new file mode 100644 index 00000000..f023ac5a Binary files /dev/null and b/target/classes/com/ai/da/common/config/RsaProperties.class differ diff --git a/target/classes/com/ai/da/common/config/WebConfig.class b/target/classes/com/ai/da/common/config/WebConfig.class new file mode 100644 index 00000000..e1e0d0c5 Binary files /dev/null and b/target/classes/com/ai/da/common/config/WebConfig.class differ diff --git a/target/classes/com/ai/da/common/config/captcha/LoginCode.class b/target/classes/com/ai/da/common/config/captcha/LoginCode.class new file mode 100644 index 00000000..eea9b696 Binary files /dev/null and b/target/classes/com/ai/da/common/config/captcha/LoginCode.class differ diff --git a/target/classes/com/ai/da/common/config/captcha/LoginCodeEnum.class b/target/classes/com/ai/da/common/config/captcha/LoginCodeEnum.class new file mode 100644 index 00000000..bab38f68 Binary files /dev/null and b/target/classes/com/ai/da/common/config/captcha/LoginCodeEnum.class differ diff --git a/target/classes/com/ai/da/common/config/exception/BusinessException.class b/target/classes/com/ai/da/common/config/exception/BusinessException.class new file mode 100644 index 00000000..56b51c0d Binary files /dev/null and b/target/classes/com/ai/da/common/config/exception/BusinessException.class differ diff --git a/target/classes/com/ai/da/common/config/exception/ExceptionCatch.class b/target/classes/com/ai/da/common/config/exception/ExceptionCatch.class new file mode 100644 index 00000000..42ac729b Binary files /dev/null and b/target/classes/com/ai/da/common/config/exception/ExceptionCatch.class differ diff --git a/target/classes/com/ai/da/common/config/mybatis/plus/CommonMapper.class b/target/classes/com/ai/da/common/config/mybatis/plus/CommonMapper.class new file mode 100644 index 00000000..154f7b1d Binary files /dev/null and b/target/classes/com/ai/da/common/config/mybatis/plus/CommonMapper.class differ diff --git a/target/classes/com/ai/da/common/config/mybatis/plus/CommonServiceImpl.class b/target/classes/com/ai/da/common/config/mybatis/plus/CommonServiceImpl.class new file mode 100644 index 00000000..7702d333 Binary files /dev/null and b/target/classes/com/ai/da/common/config/mybatis/plus/CommonServiceImpl.class differ diff --git a/target/classes/com/ai/da/common/config/mybatis/plus/CustomerSqlInjector.class b/target/classes/com/ai/da/common/config/mybatis/plus/CustomerSqlInjector.class new file mode 100644 index 00000000..53c3d3a4 Binary files /dev/null and b/target/classes/com/ai/da/common/config/mybatis/plus/CustomerSqlInjector.class differ diff --git a/target/classes/com/ai/da/common/config/mybatis/plus/MybatisPlusConfig.class b/target/classes/com/ai/da/common/config/mybatis/plus/MybatisPlusConfig.class new file mode 100644 index 00000000..d6a83166 Binary files /dev/null and b/target/classes/com/ai/da/common/config/mybatis/plus/MybatisPlusConfig.class differ diff --git a/target/classes/com/ai/da/common/config/mybatis/plus/QueryCriteria$1.class b/target/classes/com/ai/da/common/config/mybatis/plus/QueryCriteria$1.class new file mode 100644 index 00000000..15b2ea46 Binary files /dev/null and b/target/classes/com/ai/da/common/config/mybatis/plus/QueryCriteria$1.class differ diff --git a/target/classes/com/ai/da/common/config/mybatis/plus/QueryCriteria.class b/target/classes/com/ai/da/common/config/mybatis/plus/QueryCriteria.class new file mode 100644 index 00000000..4d0d50af Binary files /dev/null and b/target/classes/com/ai/da/common/config/mybatis/plus/QueryCriteria.class differ diff --git a/target/classes/com/ai/da/common/config/mybatis/plus/SelectVoPage.class b/target/classes/com/ai/da/common/config/mybatis/plus/SelectVoPage.class new file mode 100644 index 00000000..8e16519c Binary files /dev/null and b/target/classes/com/ai/da/common/config/mybatis/plus/SelectVoPage.class differ diff --git a/target/classes/com/ai/da/common/config/swagger/AidaConfiguration.class b/target/classes/com/ai/da/common/config/swagger/AidaConfiguration.class new file mode 100644 index 00000000..d1aedad2 Binary files /dev/null and b/target/classes/com/ai/da/common/config/swagger/AidaConfiguration.class differ diff --git a/target/classes/com/ai/da/common/constant/ExceptionConstant.class b/target/classes/com/ai/da/common/constant/ExceptionConstant.class new file mode 100644 index 00000000..1f23eea9 Binary files /dev/null and b/target/classes/com/ai/da/common/constant/ExceptionConstant.class differ diff --git a/target/classes/com/ai/da/common/constant/TokenConstant.class b/target/classes/com/ai/da/common/constant/TokenConstant.class new file mode 100644 index 00000000..4edb5a8c Binary files /dev/null and b/target/classes/com/ai/da/common/constant/TokenConstant.class differ diff --git a/target/classes/com/ai/da/common/context/UserContext.class b/target/classes/com/ai/da/common/context/UserContext.class new file mode 100644 index 00000000..3098b2bb Binary files /dev/null and b/target/classes/com/ai/da/common/context/UserContext.class differ diff --git a/target/classes/com/ai/da/common/enums/CollectionLevel1TypeEnum.class b/target/classes/com/ai/da/common/enums/CollectionLevel1TypeEnum.class new file mode 100644 index 00000000..003c6c37 Binary files /dev/null and b/target/classes/com/ai/da/common/enums/CollectionLevel1TypeEnum.class differ diff --git a/target/classes/com/ai/da/common/enums/CollectionLevel2TypeEnum.class b/target/classes/com/ai/da/common/enums/CollectionLevel2TypeEnum.class new file mode 100644 index 00000000..efabe19a Binary files /dev/null and b/target/classes/com/ai/da/common/enums/CollectionLevel2TypeEnum.class differ diff --git a/target/classes/com/ai/da/common/enums/ConditionType.class b/target/classes/com/ai/da/common/enums/ConditionType.class new file mode 100644 index 00000000..da0e13ba Binary files /dev/null and b/target/classes/com/ai/da/common/enums/ConditionType.class differ diff --git a/target/classes/com/ai/da/common/enums/CurrentDesignPictureTypeEnum.class b/target/classes/com/ai/da/common/enums/CurrentDesignPictureTypeEnum.class new file mode 100644 index 00000000..ec3e5e41 Binary files /dev/null and b/target/classes/com/ai/da/common/enums/CurrentDesignPictureTypeEnum.class differ diff --git a/target/classes/com/ai/da/common/enums/CurrentDesignPrintPictureTypeEnum.class b/target/classes/com/ai/da/common/enums/CurrentDesignPrintPictureTypeEnum.class new file mode 100644 index 00000000..90bd37c4 Binary files /dev/null and b/target/classes/com/ai/da/common/enums/CurrentDesignPrintPictureTypeEnum.class differ diff --git a/target/classes/com/ai/da/common/enums/DataScope.class b/target/classes/com/ai/da/common/enums/DataScope.class new file mode 100644 index 00000000..a87b77cb Binary files /dev/null and b/target/classes/com/ai/da/common/enums/DataScope.class differ diff --git a/target/classes/com/ai/da/common/enums/DesignTypeEnum.class b/target/classes/com/ai/da/common/enums/DesignTypeEnum.class new file mode 100644 index 00000000..5fbfeb92 Binary files /dev/null and b/target/classes/com/ai/da/common/enums/DesignTypeEnum.class differ diff --git a/target/classes/com/ai/da/common/enums/LibraryLevel1TypeEnum.class b/target/classes/com/ai/da/common/enums/LibraryLevel1TypeEnum.class new file mode 100644 index 00000000..548d8cb3 Binary files /dev/null and b/target/classes/com/ai/da/common/enums/LibraryLevel1TypeEnum.class differ diff --git a/target/classes/com/ai/da/common/enums/LibraryTopTypeEnum.class b/target/classes/com/ai/da/common/enums/LibraryTopTypeEnum.class new file mode 100644 index 00000000..69a1af24 Binary files /dev/null and b/target/classes/com/ai/da/common/enums/LibraryTopTypeEnum.class differ diff --git a/target/classes/com/ai/da/common/enums/LoginTypeEnum.class b/target/classes/com/ai/da/common/enums/LoginTypeEnum.class new file mode 100644 index 00000000..6d58653d Binary files /dev/null and b/target/classes/com/ai/da/common/enums/LoginTypeEnum.class differ diff --git a/target/classes/com/ai/da/common/enums/OperationTypeEnum.class b/target/classes/com/ai/da/common/enums/OperationTypeEnum.class new file mode 100644 index 00000000..8e8c985f Binary files /dev/null and b/target/classes/com/ai/da/common/enums/OperationTypeEnum.class differ diff --git a/target/classes/com/ai/da/common/enums/OrderType.class b/target/classes/com/ai/da/common/enums/OrderType.class new file mode 100644 index 00000000..1f765c3a Binary files /dev/null and b/target/classes/com/ai/da/common/enums/OrderType.class differ diff --git a/target/classes/com/ai/da/common/enums/PythonToJavaApiOperationTypeEnum.class b/target/classes/com/ai/da/common/enums/PythonToJavaApiOperationTypeEnum.class new file mode 100644 index 00000000..20f68cf2 Binary files /dev/null and b/target/classes/com/ai/da/common/enums/PythonToJavaApiOperationTypeEnum.class differ diff --git a/target/classes/com/ai/da/common/enums/SingleOverallEnum.class b/target/classes/com/ai/da/common/enums/SingleOverallEnum.class new file mode 100644 index 00000000..19a56fef Binary files /dev/null and b/target/classes/com/ai/da/common/enums/SingleOverallEnum.class differ diff --git a/target/classes/com/ai/da/common/enums/SwitchCategoryEnum.class b/target/classes/com/ai/da/common/enums/SwitchCategoryEnum.class new file mode 100644 index 00000000..69460f28 Binary files /dev/null and b/target/classes/com/ai/da/common/enums/SwitchCategoryEnum.class differ diff --git a/target/classes/com/ai/da/common/enums/SysFileLevel1TypeEnum.class b/target/classes/com/ai/da/common/enums/SysFileLevel1TypeEnum.class new file mode 100644 index 00000000..09498c98 Binary files /dev/null and b/target/classes/com/ai/da/common/enums/SysFileLevel1TypeEnum.class differ diff --git a/target/classes/com/ai/da/common/enums/SysFileLevel2TypeEnum.class b/target/classes/com/ai/da/common/enums/SysFileLevel2TypeEnum.class new file mode 100644 index 00000000..1eae4764 Binary files /dev/null and b/target/classes/com/ai/da/common/enums/SysFileLevel2TypeEnum.class differ diff --git a/target/classes/com/ai/da/common/httpdata/token/TokenApis.class b/target/classes/com/ai/da/common/httpdata/token/TokenApis.class new file mode 100644 index 00000000..9719f497 Binary files /dev/null and b/target/classes/com/ai/da/common/httpdata/token/TokenApis.class differ diff --git a/target/classes/com/ai/da/common/httpdata/token/TokenQuery.class b/target/classes/com/ai/da/common/httpdata/token/TokenQuery.class new file mode 100644 index 00000000..e6d43533 Binary files /dev/null and b/target/classes/com/ai/da/common/httpdata/token/TokenQuery.class differ diff --git a/target/classes/com/ai/da/common/response/PageBaseResponse.class b/target/classes/com/ai/da/common/response/PageBaseResponse.class new file mode 100644 index 00000000..255864e1 Binary files /dev/null and b/target/classes/com/ai/da/common/response/PageBaseResponse.class differ diff --git a/target/classes/com/ai/da/common/response/PageResponse.class b/target/classes/com/ai/da/common/response/PageResponse.class new file mode 100644 index 00000000..152dcab3 Binary files /dev/null and b/target/classes/com/ai/da/common/response/PageResponse.class differ diff --git a/target/classes/com/ai/da/common/response/Response.class b/target/classes/com/ai/da/common/response/Response.class new file mode 100644 index 00000000..bd0a57ba Binary files /dev/null and b/target/classes/com/ai/da/common/response/Response.class differ diff --git a/target/classes/com/ai/da/common/response/ResultEnum.class b/target/classes/com/ai/da/common/response/ResultEnum.class new file mode 100644 index 00000000..694a2331 Binary files /dev/null and b/target/classes/com/ai/da/common/response/ResultEnum.class differ diff --git a/target/classes/com/ai/da/common/security/UserAuthAccessDeniedHandler.class b/target/classes/com/ai/da/common/security/UserAuthAccessDeniedHandler.class new file mode 100644 index 00000000..a791f7e3 Binary files /dev/null and b/target/classes/com/ai/da/common/security/UserAuthAccessDeniedHandler.class differ diff --git a/target/classes/com/ai/da/common/security/UserAuthenticationEntryPointHandler.class b/target/classes/com/ai/da/common/security/UserAuthenticationEntryPointHandler.class new file mode 100644 index 00000000..572d8a9e Binary files /dev/null and b/target/classes/com/ai/da/common/security/UserAuthenticationEntryPointHandler.class differ diff --git a/target/classes/com/ai/da/common/security/UserAuthenticationManager.class b/target/classes/com/ai/da/common/security/UserAuthenticationManager.class new file mode 100644 index 00000000..088e4b7d Binary files /dev/null and b/target/classes/com/ai/da/common/security/UserAuthenticationManager.class differ diff --git a/target/classes/com/ai/da/common/security/UserAuthenticationProvider.class b/target/classes/com/ai/da/common/security/UserAuthenticationProvider.class new file mode 100644 index 00000000..ffdd2c14 Binary files /dev/null and b/target/classes/com/ai/da/common/security/UserAuthenticationProvider.class differ diff --git a/target/classes/com/ai/da/common/security/UserLoginFailureHandler.class b/target/classes/com/ai/da/common/security/UserLoginFailureHandler.class new file mode 100644 index 00000000..9b3544df Binary files /dev/null and b/target/classes/com/ai/da/common/security/UserLoginFailureHandler.class differ diff --git a/target/classes/com/ai/da/common/security/UserLoginSuccessHandler.class b/target/classes/com/ai/da/common/security/UserLoginSuccessHandler.class new file mode 100644 index 00000000..25f82642 Binary files /dev/null and b/target/classes/com/ai/da/common/security/UserLoginSuccessHandler.class differ diff --git a/target/classes/com/ai/da/common/security/UserPermissionEvaluator.class b/target/classes/com/ai/da/common/security/UserPermissionEvaluator.class new file mode 100644 index 00000000..caa2649b Binary files /dev/null and b/target/classes/com/ai/da/common/security/UserPermissionEvaluator.class differ diff --git a/target/classes/com/ai/da/common/security/config/SecurityConfig.class b/target/classes/com/ai/da/common/security/config/SecurityConfig.class new file mode 100644 index 00000000..1e649865 Binary files /dev/null and b/target/classes/com/ai/da/common/security/config/SecurityConfig.class differ diff --git a/target/classes/com/ai/da/common/security/config/SecurityProperties.class b/target/classes/com/ai/da/common/security/config/SecurityProperties.class new file mode 100644 index 00000000..15ff0e67 Binary files /dev/null and b/target/classes/com/ai/da/common/security/config/SecurityProperties.class differ diff --git a/target/classes/com/ai/da/common/security/filter/AuthenticationFilter.class b/target/classes/com/ai/da/common/security/filter/AuthenticationFilter.class new file mode 100644 index 00000000..d3f0e701 Binary files /dev/null and b/target/classes/com/ai/da/common/security/filter/AuthenticationFilter.class differ diff --git a/target/classes/com/ai/da/common/security/filter/UserAuthenticationProcessingFilter.class b/target/classes/com/ai/da/common/security/filter/UserAuthenticationProcessingFilter.class new file mode 100644 index 00000000..29a7edc9 Binary files /dev/null and b/target/classes/com/ai/da/common/security/filter/UserAuthenticationProcessingFilter.class differ diff --git a/target/classes/com/ai/da/common/security/jwt/JWTTokenHelper.class b/target/classes/com/ai/da/common/security/jwt/JWTTokenHelper.class new file mode 100644 index 00000000..d96b3916 Binary files /dev/null and b/target/classes/com/ai/da/common/security/jwt/JWTTokenHelper.class differ diff --git a/target/classes/com/ai/da/common/utils/AccessLimitUtils.class b/target/classes/com/ai/da/common/utils/AccessLimitUtils.class new file mode 100644 index 00000000..37a77c53 Binary files /dev/null and b/target/classes/com/ai/da/common/utils/AccessLimitUtils.class differ diff --git a/target/classes/com/ai/da/common/utils/CloseUtil.class b/target/classes/com/ai/da/common/utils/CloseUtil.class new file mode 100644 index 00000000..c9a385e3 Binary files /dev/null and b/target/classes/com/ai/da/common/utils/CloseUtil.class differ diff --git a/target/classes/com/ai/da/common/utils/ConvertUtil.class b/target/classes/com/ai/da/common/utils/ConvertUtil.class new file mode 100644 index 00000000..03c6ee28 Binary files /dev/null and b/target/classes/com/ai/da/common/utils/ConvertUtil.class differ diff --git a/target/classes/com/ai/da/common/utils/CopyUtil.class b/target/classes/com/ai/da/common/utils/CopyUtil.class new file mode 100644 index 00000000..e0a85719 Binary files /dev/null and b/target/classes/com/ai/da/common/utils/CopyUtil.class differ diff --git a/target/classes/com/ai/da/common/utils/DateUtil.class b/target/classes/com/ai/da/common/utils/DateUtil.class new file mode 100644 index 00000000..382e98ca Binary files /dev/null and b/target/classes/com/ai/da/common/utils/DateUtil.class differ diff --git a/target/classes/com/ai/da/common/utils/FileUtil.class b/target/classes/com/ai/da/common/utils/FileUtil.class new file mode 100644 index 00000000..8509ced5 Binary files /dev/null and b/target/classes/com/ai/da/common/utils/FileUtil.class differ diff --git a/target/classes/com/ai/da/common/utils/ImageUtil.class b/target/classes/com/ai/da/common/utils/ImageUtil.class new file mode 100644 index 00000000..c92d0505 Binary files /dev/null and b/target/classes/com/ai/da/common/utils/ImageUtil.class differ diff --git a/target/classes/com/ai/da/common/utils/JSONResponseUtils.class b/target/classes/com/ai/da/common/utils/JSONResponseUtils.class new file mode 100644 index 00000000..e7f5747b Binary files /dev/null and b/target/classes/com/ai/da/common/utils/JSONResponseUtils.class differ diff --git a/target/classes/com/ai/da/common/utils/LocalCacheUtils$1.class b/target/classes/com/ai/da/common/utils/LocalCacheUtils$1.class new file mode 100644 index 00000000..4520d693 Binary files /dev/null and b/target/classes/com/ai/da/common/utils/LocalCacheUtils$1.class differ diff --git a/target/classes/com/ai/da/common/utils/LocalCacheUtils$2.class b/target/classes/com/ai/da/common/utils/LocalCacheUtils$2.class new file mode 100644 index 00000000..a5b23d56 Binary files /dev/null and b/target/classes/com/ai/da/common/utils/LocalCacheUtils$2.class differ diff --git a/target/classes/com/ai/da/common/utils/LocalCacheUtils$3.class b/target/classes/com/ai/da/common/utils/LocalCacheUtils$3.class new file mode 100644 index 00000000..91de9355 Binary files /dev/null and b/target/classes/com/ai/da/common/utils/LocalCacheUtils$3.class differ diff --git a/target/classes/com/ai/da/common/utils/LocalCacheUtils$4.class b/target/classes/com/ai/da/common/utils/LocalCacheUtils$4.class new file mode 100644 index 00000000..1cc96f4e Binary files /dev/null and b/target/classes/com/ai/da/common/utils/LocalCacheUtils$4.class differ diff --git a/target/classes/com/ai/da/common/utils/LocalCacheUtils$5.class b/target/classes/com/ai/da/common/utils/LocalCacheUtils$5.class new file mode 100644 index 00000000..6fa51dc9 Binary files /dev/null and b/target/classes/com/ai/da/common/utils/LocalCacheUtils$5.class differ diff --git a/target/classes/com/ai/da/common/utils/LocalCacheUtils$6.class b/target/classes/com/ai/da/common/utils/LocalCacheUtils$6.class new file mode 100644 index 00000000..562a3af3 Binary files /dev/null and b/target/classes/com/ai/da/common/utils/LocalCacheUtils$6.class differ diff --git a/target/classes/com/ai/da/common/utils/LocalCacheUtils$7.class b/target/classes/com/ai/da/common/utils/LocalCacheUtils$7.class new file mode 100644 index 00000000..521fdc0e Binary files /dev/null and b/target/classes/com/ai/da/common/utils/LocalCacheUtils$7.class differ diff --git a/target/classes/com/ai/da/common/utils/LocalCacheUtils.class b/target/classes/com/ai/da/common/utils/LocalCacheUtils.class new file mode 100644 index 00000000..be2a957f Binary files /dev/null and b/target/classes/com/ai/da/common/utils/LocalCacheUtils.class differ diff --git a/target/classes/com/ai/da/common/utils/MD5Utils.class b/target/classes/com/ai/da/common/utils/MD5Utils.class new file mode 100644 index 00000000..67505e4c Binary files /dev/null and b/target/classes/com/ai/da/common/utils/MD5Utils.class differ diff --git a/target/classes/com/ai/da/common/utils/MultiReadHttpServletRequest$1.class b/target/classes/com/ai/da/common/utils/MultiReadHttpServletRequest$1.class new file mode 100644 index 00000000..5f6d960d Binary files /dev/null and b/target/classes/com/ai/da/common/utils/MultiReadHttpServletRequest$1.class differ diff --git a/target/classes/com/ai/da/common/utils/MultiReadHttpServletRequest.class b/target/classes/com/ai/da/common/utils/MultiReadHttpServletRequest.class new file mode 100644 index 00000000..231534c8 Binary files /dev/null and b/target/classes/com/ai/da/common/utils/MultiReadHttpServletRequest.class differ diff --git a/target/classes/com/ai/da/common/utils/MultiReadHttpServletResponse$ServletOutputStreamWrapper.class b/target/classes/com/ai/da/common/utils/MultiReadHttpServletResponse$ServletOutputStreamWrapper.class new file mode 100644 index 00000000..71001031 Binary files /dev/null and b/target/classes/com/ai/da/common/utils/MultiReadHttpServletResponse$ServletOutputStreamWrapper.class differ diff --git a/target/classes/com/ai/da/common/utils/MultiReadHttpServletResponse.class b/target/classes/com/ai/da/common/utils/MultiReadHttpServletResponse.class new file mode 100644 index 00000000..23b5a449 Binary files /dev/null and b/target/classes/com/ai/da/common/utils/MultiReadHttpServletResponse.class differ diff --git a/target/classes/com/ai/da/common/utils/ObjectUtils.class b/target/classes/com/ai/da/common/utils/ObjectUtils.class new file mode 100644 index 00000000..bb5c91b7 Binary files /dev/null and b/target/classes/com/ai/da/common/utils/ObjectUtils.class differ diff --git a/target/classes/com/ai/da/common/utils/RandomsUtil.class b/target/classes/com/ai/da/common/utils/RandomsUtil.class new file mode 100644 index 00000000..cd8f2644 Binary files /dev/null and b/target/classes/com/ai/da/common/utils/RandomsUtil.class differ diff --git a/target/classes/com/ai/da/common/utils/RedisCacheUtils.class b/target/classes/com/ai/da/common/utils/RedisCacheUtils.class new file mode 100644 index 00000000..9d19dceb Binary files /dev/null and b/target/classes/com/ai/da/common/utils/RedisCacheUtils.class differ diff --git a/target/classes/com/ai/da/common/utils/RequestInfoUtil.class b/target/classes/com/ai/da/common/utils/RequestInfoUtil.class new file mode 100644 index 00000000..ca91dbd3 Binary files /dev/null and b/target/classes/com/ai/da/common/utils/RequestInfoUtil.class differ diff --git a/target/classes/com/ai/da/common/utils/RsaDecryptUtils.class b/target/classes/com/ai/da/common/utils/RsaDecryptUtils.class new file mode 100644 index 00000000..1d9274cd Binary files /dev/null and b/target/classes/com/ai/da/common/utils/RsaDecryptUtils.class differ diff --git a/target/classes/com/ai/da/common/utils/RsaEncryptUtils.class b/target/classes/com/ai/da/common/utils/RsaEncryptUtils.class new file mode 100644 index 00000000..4335ad60 Binary files /dev/null and b/target/classes/com/ai/da/common/utils/RsaEncryptUtils.class differ diff --git a/target/classes/com/ai/da/common/utils/SecurityContextUtils.class b/target/classes/com/ai/da/common/utils/SecurityContextUtils.class new file mode 100644 index 00000000..ff7f015e Binary files /dev/null and b/target/classes/com/ai/da/common/utils/SecurityContextUtils.class differ diff --git a/target/classes/com/ai/da/common/utils/SendEmailUtil.class b/target/classes/com/ai/da/common/utils/SendEmailUtil.class new file mode 100644 index 00000000..24a7ad7a Binary files /dev/null and b/target/classes/com/ai/da/common/utils/SendEmailUtil.class differ diff --git a/target/classes/com/ai/da/common/utils/SpringUtils.class b/target/classes/com/ai/da/common/utils/SpringUtils.class new file mode 100644 index 00000000..3644b0ef Binary files /dev/null and b/target/classes/com/ai/da/common/utils/SpringUtils.class differ diff --git a/target/classes/com/ai/da/controller/AccountController.class b/target/classes/com/ai/da/controller/AccountController.class new file mode 100644 index 00000000..8bf46481 Binary files /dev/null and b/target/classes/com/ai/da/controller/AccountController.class differ diff --git a/target/classes/com/ai/da/controller/DesignController.class b/target/classes/com/ai/da/controller/DesignController.class new file mode 100644 index 00000000..d065bc59 Binary files /dev/null and b/target/classes/com/ai/da/controller/DesignController.class differ diff --git a/target/classes/com/ai/da/controller/DesignDetailController.class b/target/classes/com/ai/da/controller/DesignDetailController.class new file mode 100644 index 00000000..f4b2c00f Binary files /dev/null and b/target/classes/com/ai/da/controller/DesignDetailController.class differ diff --git a/target/classes/com/ai/da/controller/ElementController.class b/target/classes/com/ai/da/controller/ElementController.class new file mode 100644 index 00000000..96fe8f3f Binary files /dev/null and b/target/classes/com/ai/da/controller/ElementController.class differ diff --git a/target/classes/com/ai/da/controller/LibraryController.class b/target/classes/com/ai/da/controller/LibraryController.class new file mode 100644 index 00000000..1506b690 Binary files /dev/null and b/target/classes/com/ai/da/controller/LibraryController.class differ diff --git a/target/classes/com/ai/da/controller/PythonController.class b/target/classes/com/ai/da/controller/PythonController.class new file mode 100644 index 00000000..431da407 Binary files /dev/null and b/target/classes/com/ai/da/controller/PythonController.class differ diff --git a/target/classes/com/ai/da/controller/SavedCollectionController.class b/target/classes/com/ai/da/controller/SavedCollectionController.class new file mode 100644 index 00000000..151e99b0 Binary files /dev/null and b/target/classes/com/ai/da/controller/SavedCollectionController.class differ diff --git a/target/classes/com/ai/da/controller/ThirdPartyController.class b/target/classes/com/ai/da/controller/ThirdPartyController.class new file mode 100644 index 00000000..77f628a3 Binary files /dev/null and b/target/classes/com/ai/da/controller/ThirdPartyController.class differ diff --git a/target/classes/com/ai/da/mapper/AccountLoginLogMapper.class b/target/classes/com/ai/da/mapper/AccountLoginLogMapper.class new file mode 100644 index 00000000..8d4a0264 Binary files /dev/null and b/target/classes/com/ai/da/mapper/AccountLoginLogMapper.class differ diff --git a/target/classes/com/ai/da/mapper/AccountMapper.class b/target/classes/com/ai/da/mapper/AccountMapper.class new file mode 100644 index 00000000..9bd6171a Binary files /dev/null and b/target/classes/com/ai/da/mapper/AccountMapper.class differ diff --git a/target/classes/com/ai/da/mapper/CollectionElementMapper.class b/target/classes/com/ai/da/mapper/CollectionElementMapper.class new file mode 100644 index 00000000..f0c53db7 Binary files /dev/null and b/target/classes/com/ai/da/mapper/CollectionElementMapper.class differ diff --git a/target/classes/com/ai/da/mapper/CollectionMapper.class b/target/classes/com/ai/da/mapper/CollectionMapper.class new file mode 100644 index 00000000..ad163382 Binary files /dev/null and b/target/classes/com/ai/da/mapper/CollectionMapper.class differ diff --git a/target/classes/com/ai/da/mapper/ColorLoopUpTableMapper.class b/target/classes/com/ai/da/mapper/ColorLoopUpTableMapper.class new file mode 100644 index 00000000..179be608 Binary files /dev/null and b/target/classes/com/ai/da/mapper/ColorLoopUpTableMapper.class differ diff --git a/target/classes/com/ai/da/mapper/DesignHistoryMapper.class b/target/classes/com/ai/da/mapper/DesignHistoryMapper.class new file mode 100644 index 00000000..c21545df Binary files /dev/null and b/target/classes/com/ai/da/mapper/DesignHistoryMapper.class differ diff --git a/target/classes/com/ai/da/mapper/DesignItemDetailMapper.class b/target/classes/com/ai/da/mapper/DesignItemDetailMapper.class new file mode 100644 index 00000000..d6b7c56c Binary files /dev/null and b/target/classes/com/ai/da/mapper/DesignItemDetailMapper.class differ diff --git a/target/classes/com/ai/da/mapper/DesignItemMapper.class b/target/classes/com/ai/da/mapper/DesignItemMapper.class new file mode 100644 index 00000000..44c4c8e0 Binary files /dev/null and b/target/classes/com/ai/da/mapper/DesignItemMapper.class differ diff --git a/target/classes/com/ai/da/mapper/DesignMapper.class b/target/classes/com/ai/da/mapper/DesignMapper.class new file mode 100644 index 00000000..68998aad Binary files /dev/null and b/target/classes/com/ai/da/mapper/DesignMapper.class differ diff --git a/target/classes/com/ai/da/mapper/LibraryMapper.class b/target/classes/com/ai/da/mapper/LibraryMapper.class new file mode 100644 index 00000000..0f3fa77c Binary files /dev/null and b/target/classes/com/ai/da/mapper/LibraryMapper.class differ diff --git a/target/classes/com/ai/da/mapper/LibraryModelPointMapper.class b/target/classes/com/ai/da/mapper/LibraryModelPointMapper.class new file mode 100644 index 00000000..1239bbd0 Binary files /dev/null and b/target/classes/com/ai/da/mapper/LibraryModelPointMapper.class differ diff --git a/target/classes/com/ai/da/mapper/PanToneMapper.class b/target/classes/com/ai/da/mapper/PanToneMapper.class new file mode 100644 index 00000000..f31da966 Binary files /dev/null and b/target/classes/com/ai/da/mapper/PanToneMapper.class differ diff --git a/target/classes/com/ai/da/mapper/SysFileMapper.class b/target/classes/com/ai/da/mapper/SysFileMapper.class new file mode 100644 index 00000000..5d35bd87 Binary files /dev/null and b/target/classes/com/ai/da/mapper/SysFileMapper.class differ diff --git a/target/classes/com/ai/da/mapper/UserLikeGroupMapper.class b/target/classes/com/ai/da/mapper/UserLikeGroupMapper.class new file mode 100644 index 00000000..46aace8f Binary files /dev/null and b/target/classes/com/ai/da/mapper/UserLikeGroupMapper.class differ diff --git a/target/classes/com/ai/da/mapper/UserLikeMapper.class b/target/classes/com/ai/da/mapper/UserLikeMapper.class new file mode 100644 index 00000000..6b076f66 Binary files /dev/null and b/target/classes/com/ai/da/mapper/UserLikeMapper.class differ diff --git a/target/classes/com/ai/da/mapper/entity/Account.class b/target/classes/com/ai/da/mapper/entity/Account.class new file mode 100644 index 00000000..ccc57087 Binary files /dev/null and b/target/classes/com/ai/da/mapper/entity/Account.class differ diff --git a/target/classes/com/ai/da/mapper/entity/AccountLoginLog.class b/target/classes/com/ai/da/mapper/entity/AccountLoginLog.class new file mode 100644 index 00000000..942db790 Binary files /dev/null and b/target/classes/com/ai/da/mapper/entity/AccountLoginLog.class differ diff --git a/target/classes/com/ai/da/mapper/entity/Collection.class b/target/classes/com/ai/da/mapper/entity/Collection.class new file mode 100644 index 00000000..cf07ec23 Binary files /dev/null and b/target/classes/com/ai/da/mapper/entity/Collection.class differ diff --git a/target/classes/com/ai/da/mapper/entity/CollectionElement.class b/target/classes/com/ai/da/mapper/entity/CollectionElement.class new file mode 100644 index 00000000..4d13025b Binary files /dev/null and b/target/classes/com/ai/da/mapper/entity/CollectionElement.class differ diff --git a/target/classes/com/ai/da/mapper/entity/ColorLookupTable.class b/target/classes/com/ai/da/mapper/entity/ColorLookupTable.class new file mode 100644 index 00000000..9e3a372b Binary files /dev/null and b/target/classes/com/ai/da/mapper/entity/ColorLookupTable.class differ diff --git a/target/classes/com/ai/da/mapper/entity/Design.class b/target/classes/com/ai/da/mapper/entity/Design.class new file mode 100644 index 00000000..90388d88 Binary files /dev/null and b/target/classes/com/ai/da/mapper/entity/Design.class differ diff --git a/target/classes/com/ai/da/mapper/entity/DesignHistory.class b/target/classes/com/ai/da/mapper/entity/DesignHistory.class new file mode 100644 index 00000000..c313e088 Binary files /dev/null and b/target/classes/com/ai/da/mapper/entity/DesignHistory.class differ diff --git a/target/classes/com/ai/da/mapper/entity/DesignItem.class b/target/classes/com/ai/da/mapper/entity/DesignItem.class new file mode 100644 index 00000000..97824277 Binary files /dev/null and b/target/classes/com/ai/da/mapper/entity/DesignItem.class differ diff --git a/target/classes/com/ai/da/mapper/entity/DesignItemDetail.class b/target/classes/com/ai/da/mapper/entity/DesignItemDetail.class new file mode 100644 index 00000000..4f2356e6 Binary files /dev/null and b/target/classes/com/ai/da/mapper/entity/DesignItemDetail.class differ diff --git a/target/classes/com/ai/da/mapper/entity/Library.class b/target/classes/com/ai/da/mapper/entity/Library.class new file mode 100644 index 00000000..934e496b Binary files /dev/null and b/target/classes/com/ai/da/mapper/entity/Library.class differ diff --git a/target/classes/com/ai/da/mapper/entity/LibraryModelPoint.class b/target/classes/com/ai/da/mapper/entity/LibraryModelPoint.class new file mode 100644 index 00000000..e2f4535f Binary files /dev/null and b/target/classes/com/ai/da/mapper/entity/LibraryModelPoint.class differ diff --git a/target/classes/com/ai/da/mapper/entity/PanTone.class b/target/classes/com/ai/da/mapper/entity/PanTone.class new file mode 100644 index 00000000..34b87412 Binary files /dev/null and b/target/classes/com/ai/da/mapper/entity/PanTone.class differ diff --git a/target/classes/com/ai/da/mapper/entity/SysFile.class b/target/classes/com/ai/da/mapper/entity/SysFile.class new file mode 100644 index 00000000..a76ee8bf Binary files /dev/null and b/target/classes/com/ai/da/mapper/entity/SysFile.class differ diff --git a/target/classes/com/ai/da/mapper/entity/UserLike.class b/target/classes/com/ai/da/mapper/entity/UserLike.class new file mode 100644 index 00000000..a8192ed8 Binary files /dev/null and b/target/classes/com/ai/da/mapper/entity/UserLike.class differ diff --git a/target/classes/com/ai/da/mapper/entity/UserLikeGroup.class b/target/classes/com/ai/da/mapper/entity/UserLikeGroup.class new file mode 100644 index 00000000..3630c8d9 Binary files /dev/null and b/target/classes/com/ai/da/mapper/entity/UserLikeGroup.class differ diff --git a/target/classes/com/ai/da/model/dto/AccountAddDTO.class b/target/classes/com/ai/da/model/dto/AccountAddDTO.class new file mode 100644 index 00000000..3979dcfe Binary files /dev/null and b/target/classes/com/ai/da/model/dto/AccountAddDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/AccountBindEmailDTO.class b/target/classes/com/ai/da/model/dto/AccountBindEmailDTO.class new file mode 100644 index 00000000..28b20cd1 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/AccountBindEmailDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/AccountEditDTO.class b/target/classes/com/ai/da/model/dto/AccountEditDTO.class new file mode 100644 index 00000000..e687c56c Binary files /dev/null and b/target/classes/com/ai/da/model/dto/AccountEditDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/AccountLoginDTO.class b/target/classes/com/ai/da/model/dto/AccountLoginDTO.class new file mode 100644 index 00000000..6b0310ec Binary files /dev/null and b/target/classes/com/ai/da/model/dto/AccountLoginDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/AccountLogoutDTO.class b/target/classes/com/ai/da/model/dto/AccountLogoutDTO.class new file mode 100644 index 00000000..4c477701 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/AccountLogoutDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/AccountPreLoginDTO.class b/target/classes/com/ai/da/model/dto/AccountPreLoginDTO.class new file mode 100644 index 00000000..3bbce5ee Binary files /dev/null and b/target/classes/com/ai/da/model/dto/AccountPreLoginDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/AccountRegisterDTO.class b/target/classes/com/ai/da/model/dto/AccountRegisterDTO.class new file mode 100644 index 00000000..e21b3d65 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/AccountRegisterDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/CollectionColorDTO.class b/target/classes/com/ai/da/model/dto/CollectionColorDTO.class new file mode 100644 index 00000000..80d3d1ac Binary files /dev/null and b/target/classes/com/ai/da/model/dto/CollectionColorDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/CollectionDeleteFileDTO.class b/target/classes/com/ai/da/model/dto/CollectionDeleteFileDTO.class new file mode 100644 index 00000000..b4af4a53 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/CollectionDeleteFileDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/CollectionElementUploadDTO.class b/target/classes/com/ai/da/model/dto/CollectionElementUploadDTO.class new file mode 100644 index 00000000..a2be6347 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/CollectionElementUploadDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/CollectionGeneratePrintDTO.class b/target/classes/com/ai/da/model/dto/CollectionGeneratePrintDTO.class new file mode 100644 index 00000000..986fc540 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/CollectionGeneratePrintDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/CollectionSavePrintDTO.class b/target/classes/com/ai/da/model/dto/CollectionSavePrintDTO.class new file mode 100644 index 00000000..c888e4d5 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/CollectionSavePrintDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/CollectionSketchDTO.class b/target/classes/com/ai/da/model/dto/CollectionSketchDTO.class new file mode 100644 index 00000000..d5e2b082 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/CollectionSketchDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/DesignAttributeRetrievalDTO.class b/target/classes/com/ai/da/model/dto/DesignAttributeRetrievalDTO.class new file mode 100644 index 00000000..2f12828f Binary files /dev/null and b/target/classes/com/ai/da/model/dto/DesignAttributeRetrievalDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/DesignCollectionDTO.class b/target/classes/com/ai/da/model/dto/DesignCollectionDTO.class new file mode 100644 index 00000000..5a7f1d25 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/DesignCollectionDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/DesignCollectionElementDTO.class b/target/classes/com/ai/da/model/dto/DesignCollectionElementDTO.class new file mode 100644 index 00000000..ab60ed99 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/DesignCollectionElementDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/DesignCollectionPrintElementDTO.class b/target/classes/com/ai/da/model/dto/DesignCollectionPrintElementDTO.class new file mode 100644 index 00000000..ac4124d9 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/DesignCollectionPrintElementDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/DesignLikeDTO.class b/target/classes/com/ai/da/model/dto/DesignLikeDTO.class new file mode 100644 index 00000000..c347206f Binary files /dev/null and b/target/classes/com/ai/da/model/dto/DesignLikeDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/DesignSingleDTO.class b/target/classes/com/ai/da/model/dto/DesignSingleDTO.class new file mode 100644 index 00000000..80ebd966 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/DesignSingleDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/DesignSingleItemDTO.class b/target/classes/com/ai/da/model/dto/DesignSingleItemDTO.class new file mode 100644 index 00000000..e762ac62 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/DesignSingleItemDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/DisDesignLikeDTO.class b/target/classes/com/ai/da/model/dto/DisDesignLikeDTO.class new file mode 100644 index 00000000..f1176677 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/DisDesignLikeDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/EmailSendDTO.class b/target/classes/com/ai/da/model/dto/EmailSendDTO.class new file mode 100644 index 00000000..acef3702 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/EmailSendDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/GenerateHighDesignDTO.class b/target/classes/com/ai/da/model/dto/GenerateHighDesignDTO.class new file mode 100644 index 00000000..0dca61bd Binary files /dev/null and b/target/classes/com/ai/da/model/dto/GenerateHighDesignDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/GetRgbByHsvBatchDTO.class b/target/classes/com/ai/da/model/dto/GetRgbByHsvBatchDTO.class new file mode 100644 index 00000000..2cb274fe Binary files /dev/null and b/target/classes/com/ai/da/model/dto/GetRgbByHsvBatchDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/HistoryDeleteDTO.class b/target/classes/com/ai/da/model/dto/HistoryDeleteDTO.class new file mode 100644 index 00000000..fa3942df Binary files /dev/null and b/target/classes/com/ai/da/model/dto/HistoryDeleteDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/HistoryUpdateDTO.class b/target/classes/com/ai/da/model/dto/HistoryUpdateDTO.class new file mode 100644 index 00000000..8e908f70 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/HistoryUpdateDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/LibraryDeleteDTO.class b/target/classes/com/ai/da/model/dto/LibraryDeleteDTO.class new file mode 100644 index 00000000..fd5374df Binary files /dev/null and b/target/classes/com/ai/da/model/dto/LibraryDeleteDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/LibraryModelPointDTO.class b/target/classes/com/ai/da/model/dto/LibraryModelPointDTO.class new file mode 100644 index 00000000..08007908 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/LibraryModelPointDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/LibraryUpdateDTO.class b/target/classes/com/ai/da/model/dto/LibraryUpdateDTO.class new file mode 100644 index 00000000..b43bc07b Binary files /dev/null and b/target/classes/com/ai/da/model/dto/LibraryUpdateDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/LibraryUploadDTO.class b/target/classes/com/ai/da/model/dto/LibraryUploadDTO.class new file mode 100644 index 00000000..cfb161f8 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/LibraryUploadDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/ModelsDotDTO.class b/target/classes/com/ai/da/model/dto/ModelsDotDTO.class new file mode 100644 index 00000000..89e1656f Binary files /dev/null and b/target/classes/com/ai/da/model/dto/ModelsDotDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/NoteSendDTO.class b/target/classes/com/ai/da/model/dto/NoteSendDTO.class new file mode 100644 index 00000000..28c0617d Binary files /dev/null and b/target/classes/com/ai/da/model/dto/NoteSendDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/QueryHistoryPageDTO.class b/target/classes/com/ai/da/model/dto/QueryHistoryPageDTO.class new file mode 100644 index 00000000..7c9cb9ce Binary files /dev/null and b/target/classes/com/ai/da/model/dto/QueryHistoryPageDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/QueryLibraryPageDTO.class b/target/classes/com/ai/da/model/dto/QueryLibraryPageDTO.class new file mode 100644 index 00000000..8e2585a5 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/QueryLibraryPageDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/QueryLibraryPageServiceDTO.class b/target/classes/com/ai/da/model/dto/QueryLibraryPageServiceDTO.class new file mode 100644 index 00000000..9fa5ce27 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/QueryLibraryPageServiceDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/QueryLibraryTopPageDTO.class b/target/classes/com/ai/da/model/dto/QueryLibraryTopPageDTO.class new file mode 100644 index 00000000..0a8463a0 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/QueryLibraryTopPageDTO.class differ diff --git a/target/classes/com/ai/da/model/dto/ReDesignCollectionDTO.class b/target/classes/com/ai/da/model/dto/ReDesignCollectionDTO.class new file mode 100644 index 00000000..14af79f8 Binary files /dev/null and b/target/classes/com/ai/da/model/dto/ReDesignCollectionDTO.class differ diff --git a/target/classes/com/ai/da/model/vo/AccountLoginVO.class b/target/classes/com/ai/da/model/vo/AccountLoginVO.class new file mode 100644 index 00000000..c9e9a112 Binary files /dev/null and b/target/classes/com/ai/da/model/vo/AccountLoginVO.class differ diff --git a/target/classes/com/ai/da/model/vo/AccountPreLoginVO.class b/target/classes/com/ai/da/model/vo/AccountPreLoginVO.class new file mode 100644 index 00000000..5deb6a4f Binary files /dev/null and b/target/classes/com/ai/da/model/vo/AccountPreLoginVO.class differ diff --git a/target/classes/com/ai/da/model/vo/AuthPrincipalVo.class b/target/classes/com/ai/da/model/vo/AuthPrincipalVo.class new file mode 100644 index 00000000..70ea2744 Binary files /dev/null and b/target/classes/com/ai/da/model/vo/AuthPrincipalVo.class differ diff --git a/target/classes/com/ai/da/model/vo/CollectionColorVO.class b/target/classes/com/ai/da/model/vo/CollectionColorVO.class new file mode 100644 index 00000000..c9b38412 Binary files /dev/null and b/target/classes/com/ai/da/model/vo/CollectionColorVO.class differ diff --git a/target/classes/com/ai/da/model/vo/CollectionElementVO.class b/target/classes/com/ai/da/model/vo/CollectionElementVO.class new file mode 100644 index 00000000..e5e160d3 Binary files /dev/null and b/target/classes/com/ai/da/model/vo/CollectionElementVO.class differ diff --git a/target/classes/com/ai/da/model/vo/CollectionGeneratePrintVO.class b/target/classes/com/ai/da/model/vo/CollectionGeneratePrintVO.class new file mode 100644 index 00000000..a31c8cba Binary files /dev/null and b/target/classes/com/ai/da/model/vo/CollectionGeneratePrintVO.class differ diff --git a/target/classes/com/ai/da/model/vo/DesignCollectionItemVO.class b/target/classes/com/ai/da/model/vo/DesignCollectionItemVO.class new file mode 100644 index 00000000..c505a973 Binary files /dev/null and b/target/classes/com/ai/da/model/vo/DesignCollectionItemVO.class differ diff --git a/target/classes/com/ai/da/model/vo/DesignCollectionVO.class b/target/classes/com/ai/da/model/vo/DesignCollectionVO.class new file mode 100644 index 00000000..4610fa8f Binary files /dev/null and b/target/classes/com/ai/da/model/vo/DesignCollectionVO.class differ diff --git a/target/classes/com/ai/da/model/vo/DesignItemClothesDetailVO.class b/target/classes/com/ai/da/model/vo/DesignItemClothesDetailVO.class new file mode 100644 index 00000000..03a1e262 Binary files /dev/null and b/target/classes/com/ai/da/model/vo/DesignItemClothesDetailVO.class differ diff --git a/target/classes/com/ai/da/model/vo/DesignItemDetailVO.class b/target/classes/com/ai/da/model/vo/DesignItemDetailVO.class new file mode 100644 index 00000000..c4e30cb4 Binary files /dev/null and b/target/classes/com/ai/da/model/vo/DesignItemDetailVO.class differ diff --git a/target/classes/com/ai/da/model/vo/DesignItemOthersDetailVO.class b/target/classes/com/ai/da/model/vo/DesignItemOthersDetailVO.class new file mode 100644 index 00000000..e1051e67 Binary files /dev/null and b/target/classes/com/ai/da/model/vo/DesignItemOthersDetailVO.class differ diff --git a/target/classes/com/ai/da/model/vo/DesignLibraryModelPointVO.class b/target/classes/com/ai/da/model/vo/DesignLibraryModelPointVO.class new file mode 100644 index 00000000..bad10d57 Binary files /dev/null and b/target/classes/com/ai/da/model/vo/DesignLibraryModelPointVO.class differ diff --git a/target/classes/com/ai/da/model/vo/DesignLikeVO.class b/target/classes/com/ai/da/model/vo/DesignLikeVO.class new file mode 100644 index 00000000..20eb18bf Binary files /dev/null and b/target/classes/com/ai/da/model/vo/DesignLikeVO.class differ diff --git a/target/classes/com/ai/da/model/vo/FileVO.class b/target/classes/com/ai/da/model/vo/FileVO.class new file mode 100644 index 00000000..493f747c Binary files /dev/null and b/target/classes/com/ai/da/model/vo/FileVO.class differ diff --git a/target/classes/com/ai/da/model/vo/GetNextSysElementVO.class b/target/classes/com/ai/da/model/vo/GetNextSysElementVO.class new file mode 100644 index 00000000..c3f0cc6a Binary files /dev/null and b/target/classes/com/ai/da/model/vo/GetNextSysElementVO.class differ diff --git a/target/classes/com/ai/da/model/vo/HistoryUpdateVO.class b/target/classes/com/ai/da/model/vo/HistoryUpdateVO.class new file mode 100644 index 00000000..361af6be Binary files /dev/null and b/target/classes/com/ai/da/model/vo/HistoryUpdateVO.class differ diff --git a/target/classes/com/ai/da/model/vo/LibraryModelPointVO.class b/target/classes/com/ai/da/model/vo/LibraryModelPointVO.class new file mode 100644 index 00000000..6e55dec6 Binary files /dev/null and b/target/classes/com/ai/da/model/vo/LibraryModelPointVO.class differ diff --git a/target/classes/com/ai/da/model/vo/LibraryUpdateVo.class b/target/classes/com/ai/da/model/vo/LibraryUpdateVo.class new file mode 100644 index 00000000..e913b177 Binary files /dev/null and b/target/classes/com/ai/da/model/vo/LibraryUpdateVo.class differ diff --git a/target/classes/com/ai/da/model/vo/LibraryVo.class b/target/classes/com/ai/da/model/vo/LibraryVo.class new file mode 100644 index 00000000..b3463a80 Binary files /dev/null and b/target/classes/com/ai/da/model/vo/LibraryVo.class differ diff --git a/target/classes/com/ai/da/model/vo/PageQueryBaseVo.class b/target/classes/com/ai/da/model/vo/PageQueryBaseVo.class new file mode 100644 index 00000000..952f074c Binary files /dev/null and b/target/classes/com/ai/da/model/vo/PageQueryBaseVo.class differ diff --git a/target/classes/com/ai/da/model/vo/PantoneVO.class b/target/classes/com/ai/da/model/vo/PantoneVO.class new file mode 100644 index 00000000..1a950398 Binary files /dev/null and b/target/classes/com/ai/da/model/vo/PantoneVO.class differ diff --git a/target/classes/com/ai/da/model/vo/PythonLibraryVo.class b/target/classes/com/ai/da/model/vo/PythonLibraryVo.class new file mode 100644 index 00000000..beb12275 Binary files /dev/null and b/target/classes/com/ai/da/model/vo/PythonLibraryVo.class differ diff --git a/target/classes/com/ai/da/model/vo/QueryLibraryPageVO.class b/target/classes/com/ai/da/model/vo/QueryLibraryPageVO.class new file mode 100644 index 00000000..400d866e Binary files /dev/null and b/target/classes/com/ai/da/model/vo/QueryLibraryPageVO.class differ diff --git a/target/classes/com/ai/da/model/vo/SysFileVO.class b/target/classes/com/ai/da/model/vo/SysFileVO.class new file mode 100644 index 00000000..82576c3a Binary files /dev/null and b/target/classes/com/ai/da/model/vo/SysFileVO.class differ diff --git a/target/classes/com/ai/da/model/vo/UserLikeChooseVO.class b/target/classes/com/ai/da/model/vo/UserLikeChooseVO.class new file mode 100644 index 00000000..83d109ca Binary files /dev/null and b/target/classes/com/ai/da/model/vo/UserLikeChooseVO.class differ diff --git a/target/classes/com/ai/da/model/vo/UserLikeCollectionVO.class b/target/classes/com/ai/da/model/vo/UserLikeCollectionVO.class new file mode 100644 index 00000000..7ee79c15 Binary files /dev/null and b/target/classes/com/ai/da/model/vo/UserLikeCollectionVO.class differ diff --git a/target/classes/com/ai/da/model/vo/UserLikeGroupVO.class b/target/classes/com/ai/da/model/vo/UserLikeGroupVO.class new file mode 100644 index 00000000..ef7cbfc1 Binary files /dev/null and b/target/classes/com/ai/da/model/vo/UserLikeGroupVO.class differ diff --git a/target/classes/com/ai/da/model/vo/UserLikeVO.class b/target/classes/com/ai/da/model/vo/UserLikeVO.class new file mode 100644 index 00000000..4fc5483d Binary files /dev/null and b/target/classes/com/ai/da/model/vo/UserLikeVO.class differ diff --git a/target/classes/com/ai/da/model/vo/ValidateElementVO.class b/target/classes/com/ai/da/model/vo/ValidateElementVO.class new file mode 100644 index 00000000..7bae5c7f Binary files /dev/null and b/target/classes/com/ai/da/model/vo/ValidateElementVO.class differ diff --git a/target/classes/com/ai/da/python/PythonService$1.class b/target/classes/com/ai/da/python/PythonService$1.class new file mode 100644 index 00000000..ebe8479a Binary files /dev/null and b/target/classes/com/ai/da/python/PythonService$1.class differ diff --git a/target/classes/com/ai/da/python/PythonService.class b/target/classes/com/ai/da/python/PythonService.class new file mode 100644 index 00000000..c9984767 Binary files /dev/null and b/target/classes/com/ai/da/python/PythonService.class differ diff --git a/target/classes/com/ai/da/python/vo/DesignPythonBasic.class b/target/classes/com/ai/da/python/vo/DesignPythonBasic.class new file mode 100644 index 00000000..bd653538 Binary files /dev/null and b/target/classes/com/ai/da/python/vo/DesignPythonBasic.class differ diff --git a/target/classes/com/ai/da/python/vo/DesignPythonItem.class b/target/classes/com/ai/da/python/vo/DesignPythonItem.class new file mode 100644 index 00000000..79f905a6 Binary files /dev/null and b/target/classes/com/ai/da/python/vo/DesignPythonItem.class differ diff --git a/target/classes/com/ai/da/python/vo/DesignPythonItemBody.class b/target/classes/com/ai/da/python/vo/DesignPythonItemBody.class new file mode 100644 index 00000000..b48b61af Binary files /dev/null and b/target/classes/com/ai/da/python/vo/DesignPythonItemBody.class differ diff --git a/target/classes/com/ai/da/python/vo/DesignPythonItemPrint.class b/target/classes/com/ai/da/python/vo/DesignPythonItemPrint.class new file mode 100644 index 00000000..31e1a463 Binary files /dev/null and b/target/classes/com/ai/da/python/vo/DesignPythonItemPrint.class differ diff --git a/target/classes/com/ai/da/python/vo/DesignPythonObject.class b/target/classes/com/ai/da/python/vo/DesignPythonObject.class new file mode 100644 index 00000000..967ac426 Binary files /dev/null and b/target/classes/com/ai/da/python/vo/DesignPythonObject.class differ diff --git a/target/classes/com/ai/da/python/vo/DesignPythonObjects.class b/target/classes/com/ai/da/python/vo/DesignPythonObjects.class new file mode 100644 index 00000000..e3a066c2 Binary files /dev/null and b/target/classes/com/ai/da/python/vo/DesignPythonObjects.class differ diff --git a/target/classes/com/ai/da/service/AccountLoginLogService.class b/target/classes/com/ai/da/service/AccountLoginLogService.class new file mode 100644 index 00000000..e1a69e8d Binary files /dev/null and b/target/classes/com/ai/da/service/AccountLoginLogService.class differ diff --git a/target/classes/com/ai/da/service/AccountService.class b/target/classes/com/ai/da/service/AccountService.class new file mode 100644 index 00000000..79570f8d Binary files /dev/null and b/target/classes/com/ai/da/service/AccountService.class differ diff --git a/target/classes/com/ai/da/service/CollectionElementService.class b/target/classes/com/ai/da/service/CollectionElementService.class new file mode 100644 index 00000000..f5ebe515 Binary files /dev/null and b/target/classes/com/ai/da/service/CollectionElementService.class differ diff --git a/target/classes/com/ai/da/service/CollectionService.class b/target/classes/com/ai/da/service/CollectionService.class new file mode 100644 index 00000000..57a10d3e Binary files /dev/null and b/target/classes/com/ai/da/service/CollectionService.class differ diff --git a/target/classes/com/ai/da/service/ColorLoopUpTableService.class b/target/classes/com/ai/da/service/ColorLoopUpTableService.class new file mode 100644 index 00000000..24754d97 Binary files /dev/null and b/target/classes/com/ai/da/service/ColorLoopUpTableService.class differ diff --git a/target/classes/com/ai/da/service/DesignHistoryService.class b/target/classes/com/ai/da/service/DesignHistoryService.class new file mode 100644 index 00000000..15da8308 Binary files /dev/null and b/target/classes/com/ai/da/service/DesignHistoryService.class differ diff --git a/target/classes/com/ai/da/service/DesignItemDetailService.class b/target/classes/com/ai/da/service/DesignItemDetailService.class new file mode 100644 index 00000000..76becfd1 Binary files /dev/null and b/target/classes/com/ai/da/service/DesignItemDetailService.class differ diff --git a/target/classes/com/ai/da/service/DesignItemService.class b/target/classes/com/ai/da/service/DesignItemService.class new file mode 100644 index 00000000..ee0912e5 Binary files /dev/null and b/target/classes/com/ai/da/service/DesignItemService.class differ diff --git a/target/classes/com/ai/da/service/DesignService.class b/target/classes/com/ai/da/service/DesignService.class new file mode 100644 index 00000000..23a1e1da Binary files /dev/null and b/target/classes/com/ai/da/service/DesignService.class differ diff --git a/target/classes/com/ai/da/service/LibraryModelPointService.class b/target/classes/com/ai/da/service/LibraryModelPointService.class new file mode 100644 index 00000000..b162a37f Binary files /dev/null and b/target/classes/com/ai/da/service/LibraryModelPointService.class differ diff --git a/target/classes/com/ai/da/service/LibraryService.class b/target/classes/com/ai/da/service/LibraryService.class new file mode 100644 index 00000000..b02debf1 Binary files /dev/null and b/target/classes/com/ai/da/service/LibraryService.class differ diff --git a/target/classes/com/ai/da/service/PanToneService.class b/target/classes/com/ai/da/service/PanToneService.class new file mode 100644 index 00000000..99db4240 Binary files /dev/null and b/target/classes/com/ai/da/service/PanToneService.class differ diff --git a/target/classes/com/ai/da/service/SysFileService.class b/target/classes/com/ai/da/service/SysFileService.class new file mode 100644 index 00000000..931dc519 Binary files /dev/null and b/target/classes/com/ai/da/service/SysFileService.class differ diff --git a/target/classes/com/ai/da/service/UserLikeGroupService.class b/target/classes/com/ai/da/service/UserLikeGroupService.class new file mode 100644 index 00000000..207b914c Binary files /dev/null and b/target/classes/com/ai/da/service/UserLikeGroupService.class differ diff --git a/target/classes/com/ai/da/service/UserLikeService.class b/target/classes/com/ai/da/service/UserLikeService.class new file mode 100644 index 00000000..48754382 Binary files /dev/null and b/target/classes/com/ai/da/service/UserLikeService.class differ diff --git a/target/classes/com/ai/da/service/impl/AccountLoginLogServiceImpl.class b/target/classes/com/ai/da/service/impl/AccountLoginLogServiceImpl.class new file mode 100644 index 00000000..fb705d98 Binary files /dev/null and b/target/classes/com/ai/da/service/impl/AccountLoginLogServiceImpl.class differ diff --git a/target/classes/com/ai/da/service/impl/AccountServiceImpl$1.class b/target/classes/com/ai/da/service/impl/AccountServiceImpl$1.class new file mode 100644 index 00000000..154455e1 Binary files /dev/null and b/target/classes/com/ai/da/service/impl/AccountServiceImpl$1.class differ diff --git a/target/classes/com/ai/da/service/impl/AccountServiceImpl.class b/target/classes/com/ai/da/service/impl/AccountServiceImpl.class new file mode 100644 index 00000000..5ff2fc83 Binary files /dev/null and b/target/classes/com/ai/da/service/impl/AccountServiceImpl.class differ diff --git a/target/classes/com/ai/da/service/impl/CollectionElementServiceImpl.class b/target/classes/com/ai/da/service/impl/CollectionElementServiceImpl.class new file mode 100644 index 00000000..de18ab92 Binary files /dev/null and b/target/classes/com/ai/da/service/impl/CollectionElementServiceImpl.class differ diff --git a/target/classes/com/ai/da/service/impl/CollectionServiceImpl$1.class b/target/classes/com/ai/da/service/impl/CollectionServiceImpl$1.class new file mode 100644 index 00000000..a7b69feb Binary files /dev/null and b/target/classes/com/ai/da/service/impl/CollectionServiceImpl$1.class differ diff --git a/target/classes/com/ai/da/service/impl/CollectionServiceImpl.class b/target/classes/com/ai/da/service/impl/CollectionServiceImpl.class new file mode 100644 index 00000000..ada19c40 Binary files /dev/null and b/target/classes/com/ai/da/service/impl/CollectionServiceImpl.class differ diff --git a/target/classes/com/ai/da/service/impl/ColorLoopUpTableServiceImpl.class b/target/classes/com/ai/da/service/impl/ColorLoopUpTableServiceImpl.class new file mode 100644 index 00000000..3293d14d Binary files /dev/null and b/target/classes/com/ai/da/service/impl/ColorLoopUpTableServiceImpl.class differ diff --git a/target/classes/com/ai/da/service/impl/DesignHistoryServiceImpl.class b/target/classes/com/ai/da/service/impl/DesignHistoryServiceImpl.class new file mode 100644 index 00000000..93ff87cf Binary files /dev/null and b/target/classes/com/ai/da/service/impl/DesignHistoryServiceImpl.class differ diff --git a/target/classes/com/ai/da/service/impl/DesignItemDetailServiceImpl.class b/target/classes/com/ai/da/service/impl/DesignItemDetailServiceImpl.class new file mode 100644 index 00000000..66beb357 Binary files /dev/null and b/target/classes/com/ai/da/service/impl/DesignItemDetailServiceImpl.class differ diff --git a/target/classes/com/ai/da/service/impl/DesignItemServiceImpl.class b/target/classes/com/ai/da/service/impl/DesignItemServiceImpl.class new file mode 100644 index 00000000..0b61dbc4 Binary files /dev/null and b/target/classes/com/ai/da/service/impl/DesignItemServiceImpl.class differ diff --git a/target/classes/com/ai/da/service/impl/DesignServiceImpl.class b/target/classes/com/ai/da/service/impl/DesignServiceImpl.class new file mode 100644 index 00000000..d0f3922d Binary files /dev/null and b/target/classes/com/ai/da/service/impl/DesignServiceImpl.class differ diff --git a/target/classes/com/ai/da/service/impl/LibraryModelPointServiceImpl.class b/target/classes/com/ai/da/service/impl/LibraryModelPointServiceImpl.class new file mode 100644 index 00000000..497c5c72 Binary files /dev/null and b/target/classes/com/ai/da/service/impl/LibraryModelPointServiceImpl.class differ diff --git a/target/classes/com/ai/da/service/impl/LibraryServiceImpl.class b/target/classes/com/ai/da/service/impl/LibraryServiceImpl.class new file mode 100644 index 00000000..9588d3b8 Binary files /dev/null and b/target/classes/com/ai/da/service/impl/LibraryServiceImpl.class differ diff --git a/target/classes/com/ai/da/service/impl/PanToneServiceImpl.class b/target/classes/com/ai/da/service/impl/PanToneServiceImpl.class new file mode 100644 index 00000000..d3a6e37a Binary files /dev/null and b/target/classes/com/ai/da/service/impl/PanToneServiceImpl.class differ diff --git a/target/classes/com/ai/da/service/impl/SysFileServiceImpl.class b/target/classes/com/ai/da/service/impl/SysFileServiceImpl.class new file mode 100644 index 00000000..4dc7d94c Binary files /dev/null and b/target/classes/com/ai/da/service/impl/SysFileServiceImpl.class differ diff --git a/target/classes/com/ai/da/service/impl/UserLikeGroupServiceImpl.class b/target/classes/com/ai/da/service/impl/UserLikeGroupServiceImpl.class new file mode 100644 index 00000000..3628621b Binary files /dev/null and b/target/classes/com/ai/da/service/impl/UserLikeGroupServiceImpl.class differ diff --git a/target/classes/com/ai/da/service/impl/UserLikeServiceImpl.class b/target/classes/com/ai/da/service/impl/UserLikeServiceImpl.class new file mode 100644 index 00000000..629684ea Binary files /dev/null and b/target/classes/com/ai/da/service/impl/UserLikeServiceImpl.class differ diff --git a/target/classes/mapper/AccountMapper.xml b/target/classes/mapper/AccountMapper.xml new file mode 100644 index 00000000..2e2bd6b6 --- /dev/null +++ b/target/classes/mapper/AccountMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + diff --git a/target/classes/mapper/CollectionMapper.xml b/target/classes/mapper/CollectionMapper.xml new file mode 100644 index 00000000..3dddf4ec --- /dev/null +++ b/target/classes/mapper/CollectionMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + insert into t_collection + (account_id,create_date) + values( + #{accountId}, + #{createDate}); + + + diff --git a/target/classes/mapper/DesignItemMapper.xml b/target/classes/mapper/DesignItemMapper.xml new file mode 100644 index 00000000..b4a089d8 --- /dev/null +++ b/target/classes/mapper/DesignItemMapper.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + insert into t_design_item + (account_id,design_id,collection_id,print_scale,design_url,high_design_url,is_like,create_date) + values( + #{accountId}, + #{designId}, + #{collectionId}, + #{printScale}, + #{designUrl}, + #{highDesignUrl}, + #{hasLike}, + #{createDate}); + + + diff --git a/target/classes/mapper/DesignMapper.xml b/target/classes/mapper/DesignMapper.xml new file mode 100644 index 00000000..4c4e029c --- /dev/null +++ b/target/classes/mapper/DesignMapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + insert into t_design + (account_id,collection_id,system_scale,single_overall,switch_category,create_date) + values( + #{accountId}, + #{collectionId}, + #{systemScale}, + #{singleOverall}, + #{switchCategory}, + #{createDate}); + + + diff --git a/target/classes/mapper/PantoneMapper.xml b/target/classes/mapper/PantoneMapper.xml new file mode 100644 index 00000000..cde01c01 --- /dev/null +++ b/target/classes/mapper/PantoneMapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/target/classes/mapper/UserLikeGroupMapper.xml b/target/classes/mapper/UserLikeGroupMapper.xml new file mode 100644 index 00000000..66bbecc3 --- /dev/null +++ b/target/classes/mapper/UserLikeGroupMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + insert into t_user_like_group + (account_id,collection_id,`name`,create_date,update_date) + values( + #{accountId}, + #{collectionId}, + #{name}, + #{createDate}, + #{updateDate}); + + + diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties new file mode 100644 index 00000000..f068185d --- /dev/null +++ b/target/maven-archiver/pom.properties @@ -0,0 +1,3 @@ +version=0.0.1-SNAPSHOT +groupId=com.aida +artifactId=aida diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 00000000..8d43aaff --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,232 @@ +com\ai\da\common\config\RsaProperties.class +com\ai\da\mapper\entity\LibraryModelPoint.class +com\ai\da\common\enums\LibraryTopTypeEnum.class +com\ai\da\common\enums\LibraryLevel1TypeEnum.class +com\ai\da\service\CollectionService.class +com\ai\da\common\utils\ImageUtil.class +com\ai\da\common\utils\MultiReadHttpServletResponse.class +com\ai\da\model\dto\QueryLibraryTopPageDTO.class +com\ai\da\common\security\config\SecurityProperties.class +com\ai\da\common\enums\SysFileLevel1TypeEnum.class +com\ai\da\service\impl\ColorLoopUpTableServiceImpl.class +com\ai\da\common\utils\LocalCacheUtils$7.class +com\ai\da\python\vo\DesignPythonBasic.class +com\ai\da\service\PanToneService.class +com\ai\da\common\utils\LocalCacheUtils$2.class +com\ai\da\common\config\mybatis\plus\CommonMapper.class +com\ai\da\common\security\UserAuthenticationProvider.class +com\ai\da\service\impl\SysFileServiceImpl.class +com\ai\da\model\dto\AccountAddDTO.class +com\ai\da\common\enums\CollectionLevel1TypeEnum.class +com\ai\da\AiDaApplication.class +com\ai\da\common\security\UserLoginSuccessHandler.class +com\ai\da\model\dto\DesignCollectionElementDTO.class +com\ai\da\model\vo\UserLikeVO.class +com\ai\da\mapper\DesignMapper.class +com\ai\da\model\vo\DesignItemDetailVO.class +com\ai\da\common\constant\ExceptionConstant.class +com\ai\da\common\httpdata\token\TokenQuery.class +com\ai\da\model\vo\AuthPrincipalVo.class +com\ai\da\service\DesignItemDetailService.class +com\ai\da\common\security\filter\UserAuthenticationProcessingFilter.class +com\ai\da\model\vo\LibraryModelPointVO.class +com\ai\da\model\dto\CollectionDeleteFileDTO.class +com\ai\da\mapper\DesignItemDetailMapper.class +com\ai\da\mapper\entity\DesignItem.class +com\ai\da\model\vo\PantoneVO.class +com\ai\da\model\dto\LibraryUpdateDTO.class +com\ai\da\common\enums\ConditionType.class +com\ai\da\common\config\mybatis\plus\QueryCriteria.class +com\ai\da\model\dto\AccountBindEmailDTO.class +com\ai\da\service\impl\CollectionServiceImpl$1.class +com\ai\da\common\enums\CurrentDesignPictureTypeEnum.class +com\ai\da\service\DesignHistoryService.class +com\ai\da\model\vo\PythonLibraryVo.class +com\ai\da\common\config\exception\ExceptionCatch.class +com\ai\da\model\dto\CollectionSketchDTO.class +com\ai\da\service\impl\DesignItemDetailServiceImpl.class +com\ai\da\common\enums\SysFileLevel2TypeEnum.class +com\ai\da\mapper\entity\DesignHistory.class +com\ai\da\common\utils\MultiReadHttpServletResponse$ServletOutputStreamWrapper.class +com\ai\da\common\utils\MultiReadHttpServletRequest$1.class +com\ai\da\mapper\AccountMapper.class +com\ai\da\common\security\jwt\JWTTokenHelper.class +com\ai\da\common\utils\CloseUtil.class +com\ai\da\python\vo\DesignPythonItemBody.class +com\ai\da\common\config\FileProperties$ElPath.class +com\ai\da\common\utils\SecurityContextUtils.class +com\ai\da\common\annotation\Order.class +com\ai\da\common\utils\ObjectUtils.class +com\ai\da\common\enums\SingleOverallEnum.class +com\ai\da\controller\LibraryController.class +com\ai\da\model\dto\QueryLibraryPageDTO.class +com\ai\da\model\vo\GetNextSysElementVO.class +com\ai\da\common\config\mybatis\plus\CommonServiceImpl.class +com\ai\da\model\dto\ModelsDotDTO.class +com\ai\da\service\DesignItemService.class +com\ai\da\service\UserLikeGroupService.class +com\ai\da\common\utils\MultiReadHttpServletRequest.class +com\ai\da\model\dto\AccountPreLoginDTO.class +com\ai\da\model\dto\EmailSendDTO.class +com\ai\da\service\LibraryModelPointService.class +com\ai\da\model\dto\HistoryUpdateDTO.class +com\ai\da\model\dto\DesignCollectionDTO.class +com\ai\da\model\vo\FileVO.class +com\ai\da\service\impl\LibraryServiceImpl.class +com\ai\da\common\utils\DateUtil.class +com\ai\da\common\utils\FileUtil.class +com\ai\da\model\dto\CollectionElementUploadDTO.class +com\ai\da\common\security\UserAuthenticationEntryPointHandler.class +com\ai\da\python\vo\DesignPythonItem.class +com\ai\da\mapper\SysFileMapper.class +com\ai\da\service\impl\DesignServiceImpl.class +com\ai\da\common\constant\TokenConstant.class +com\ai\da\model\vo\DesignCollectionVO.class +com\ai\da\mapper\entity\DesignItemDetail.class +com\ai\da\service\impl\DesignHistoryServiceImpl.class +com\ai\da\common\security\UserPermissionEvaluator.class +com\ai\da\mapper\entity\UserLike.class +com\ai\da\common\utils\JSONResponseUtils.class +com\ai\da\mapper\entity\AccountLoginLog.class +com\ai\da\model\dto\CollectionGeneratePrintDTO.class +com\ai\da\model\vo\DesignCollectionItemVO.class +com\ai\da\common\enums\DataScope.class +com\ai\da\common\config\captcha\LoginCodeEnum.class +com\ai\da\common\config\swagger\AidaConfiguration.class +com\ai\da\mapper\PanToneMapper.class +com\ai\da\common\security\UserLoginFailureHandler.class +com\ai\da\mapper\ColorLoopUpTableMapper.class +com\ai\da\mapper\entity\Design.class +com\ai\da\model\vo\DesignLikeVO.class +com\ai\da\common\utils\LocalCacheUtils$6.class +com\ai\da\model\vo\CollectionColorVO.class +com\ai\da\common\config\mybatis\plus\SelectVoPage.class +com\ai\da\model\vo\UserLikeCollectionVO.class +com\ai\da\common\config\mybatis\plus\CustomerSqlInjector.class +com\ai\da\mapper\entity\Library.class +com\ai\da\model\dto\LibraryUploadDTO.class +com\ai\da\service\LibraryService.class +com\ai\da\model\dto\DisDesignLikeDTO.class +com\ai\da\model\dto\QueryLibraryPageServiceDTO.class +com\ai\da\model\vo\CollectionElementVO.class +com\ai\da\python\vo\DesignPythonItemPrint.class +com\ai\da\common\utils\RedisCacheUtils.class +com\ai\da\model\dto\HistoryDeleteDTO.class +com\ai\da\service\impl\CollectionElementServiceImpl.class +com\ai\da\service\UserLikeService.class +com\ai\da\service\impl\LibraryModelPointServiceImpl.class +META-INF\spring-configuration-metadata.json +com\ai\da\common\response\PageResponse.class +com\ai\da\common\utils\RsaDecryptUtils.class +com\ai\da\model\dto\AccountLogoutDTO.class +com\ai\da\model\dto\GenerateHighDesignDTO.class +com\ai\da\python\vo\DesignPythonObjects.class +com\ai\da\python\PythonService$1.class +com\ai\da\common\utils\CopyUtil.class +com\ai\da\model\vo\LibraryUpdateVo.class +com\ai\da\service\impl\AccountServiceImpl.class +com\ai\da\model\dto\AccountLoginDTO.class +com\ai\da\common\enums\OrderType.class +com\ai\da\model\dto\DesignLikeDTO.class +com\ai\da\model\dto\LibraryDeleteDTO.class +com\ai\da\service\impl\DesignItemServiceImpl.class +com\ai\da\common\config\mybatis\plus\MybatisPlusConfig.class +com\ai\da\model\vo\QueryLibraryPageVO.class +com\ai\da\service\SysFileService.class +com\ai\da\common\utils\LocalCacheUtils$5.class +com\ai\da\mapper\entity\SysFile.class +com\ai\da\common\utils\RandomsUtil.class +com\ai\da\common\utils\LocalCacheUtils.class +com\ai\da\model\vo\CollectionGeneratePrintVO.class +com\ai\da\service\DesignService.class +com\ai\da\common\httpdata\token\TokenApis.class +com\ai\da\mapper\entity\CollectionElement.class +com\ai\da\common\enums\PythonToJavaApiOperationTypeEnum.class +com\ai\da\model\vo\HistoryUpdateVO.class +com\ai\da\controller\AccountController.class +com\ai\da\model\vo\DesignItemClothesDetailVO.class +com\ai\da\mapper\LibraryMapper.class +com\ai\da\common\enums\DesignTypeEnum.class +com\ai\da\common\utils\RequestInfoUtil.class +com\ai\da\model\vo\LibraryVo.class +com\ai\da\model\dto\LibraryModelPointDTO.class +com\ai\da\common\enums\SwitchCategoryEnum.class +com\ai\da\common\utils\LocalCacheUtils$4.class +com\ai\da\service\CollectionElementService.class +com\ai\da\model\dto\GetRgbByHsvBatchDTO.class +com\ai\da\model\dto\ReDesignCollectionDTO.class +com\ai\da\mapper\LibraryModelPointMapper.class +com\ai\da\common\response\PageBaseResponse.class +com\ai\da\model\vo\UserLikeChooseVO.class +com\ai\da\mapper\entity\UserLikeGroup.class +com\ai\da\model\vo\PageQueryBaseVo.class +com\ai\da\common\enums\CurrentDesignPrintPictureTypeEnum.class +com\ai\da\common\response\ResultEnum.class +com\ai\da\common\utils\ConvertUtil.class +com\ai\da\model\dto\DesignSingleDTO.class +com\ai\da\common\config\captcha\LoginCode.class +com\ai\da\common\security\UserAuthAccessDeniedHandler.class +com\ai\da\mapper\entity\Account.class +com\ai\da\model\dto\CollectionColorDTO.class +com\ai\da\common\security\config\SecurityConfig.class +com\ai\da\common\utils\LocalCacheUtils$3.class +com\ai\da\common\context\UserContext.class +com\ai\da\controller\ThirdPartyController.class +com\ai\da\controller\PythonController.class +com\ai\da\service\impl\UserLikeGroupServiceImpl.class +com\ai\da\mapper\entity\ColorLookupTable.class +com\ai\da\model\dto\AccountEditDTO.class +com\ai\da\model\dto\DesignSingleItemDTO.class +com\ai\da\service\impl\AccountLoginLogServiceImpl.class +com\ai\da\common\enums\CollectionLevel2TypeEnum.class +com\ai\da\mapper\CollectionElementMapper.class +com\ai\da\model\vo\DesignItemOthersDetailVO.class +com\ai\da\model\dto\DesignCollectionPrintElementDTO.class +com\ai\da\model\vo\SysFileVO.class +com\ai\da\service\ColorLoopUpTableService.class +com\ai\da\common\utils\SendEmailUtil.class +com\ai\da\python\vo\DesignPythonObject.class +com\ai\da\common\security\filter\AuthenticationFilter.class +com\ai\da\service\impl\PanToneServiceImpl.class +com\ai\da\service\impl\UserLikeServiceImpl.class +com\ai\da\service\impl\AccountServiceImpl$1.class +com\ai\da\model\vo\ValidateElementVO.class +com\ai\da\mapper\entity\Collection.class +com\ai\da\common\config\exception\BusinessException.class +com\ai\da\common\response\Response.class +com\ai\da\controller\DesignDetailController.class +com\ai\da\mapper\AccountLoginLogMapper.class +com\ai\da\mapper\entity\PanTone.class +com\ai\da\common\enums\OperationTypeEnum.class +com\ai\da\common\annotation\Condition.class +com\ai\da\common\enums\LoginTypeEnum.class +com\ai\da\model\dto\NoteSendDTO.class +com\ai\da\common\config\WebConfig.class +com\ai\da\common\utils\LocalCacheUtils$1.class +com\ai\da\common\utils\MD5Utils.class +com\ai\da\model\dto\QueryHistoryPageDTO.class +com\ai\da\controller\SavedCollectionController.class +com\ai\da\python\PythonService.class +com\ai\da\mapper\DesignHistoryMapper.class +com\ai\da\model\dto\CollectionSavePrintDTO.class +com\ai\da\common\utils\RsaEncryptUtils.class +com\ai\da\model\dto\AccountRegisterDTO.class +com\ai\da\model\vo\AccountPreLoginVO.class +com\ai\da\model\vo\UserLikeGroupVO.class +com\ai\da\common\config\mybatis\plus\QueryCriteria$1.class +com\ai\da\controller\DesignController.class +com\ai\da\common\utils\SpringUtils.class +com\ai\da\mapper\UserLikeMapper.class +com\ai\da\mapper\DesignItemMapper.class +com\ai\da\model\vo\DesignLibraryModelPointVO.class +com\ai\da\model\vo\AccountLoginVO.class +com\ai\da\mapper\CollectionMapper.class +com\ai\da\service\AccountService.class +com\ai\da\mapper\UserLikeGroupMapper.class +com\ai\da\service\impl\CollectionServiceImpl.class +com\ai\da\model\dto\DesignAttributeRetrievalDTO.class +com\ai\da\common\config\FileProperties.class +com\ai\da\common\security\UserAuthenticationManager.class +com\ai\da\common\utils\AccessLimitUtils.class +com\ai\da\controller\ElementController.class +com\ai\da\service\AccountLoginLogService.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 00000000..9e7a9b05 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,218 @@ +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\entity\CollectionElement.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\DesignHistoryService.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\RandomsUtil.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\enums\SysFileLevel2TypeEnum.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\GenerateHighDesignDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\security\filter\AuthenticationFilter.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\entity\Design.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\controller\DesignController.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\controller\ElementController.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\impl\LibraryModelPointServiceImpl.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\DesignItemClothesDetailVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\MultiReadHttpServletRequest.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\ObjectUtils.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\AccountLoginLogService.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\LibraryMapper.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\AccountPreLoginVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\security\config\SecurityProperties.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\controller\LibraryController.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\LibraryModelPointMapper.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\CollectionElementService.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\SysFileService.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\CopyUtil.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\PanToneMapper.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\security\UserAuthenticationManager.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\impl\UserLikeGroupServiceImpl.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\RsaEncryptUtils.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\PantoneVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\security\UserPermissionEvaluator.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\annotation\Order.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\AccountLoginLogMapper.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\entity\UserLike.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\HistoryUpdateDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\FileVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\enums\CollectionLevel2TypeEnum.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\enums\LoginTypeEnum.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\DisDesignLikeDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\config\FileProperties.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\DesignCollectionItemVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\DesignLikeDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\CollectionService.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\entity\DesignHistory.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\SysFileVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\config\swagger\AidaConfiguration.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\response\PageResponse.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\AuthPrincipalVo.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\LibraryUpdateVo.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\ColorLoopUpTableService.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\DesignItemService.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\CollectionElementUploadDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\AccountLoginDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\python\vo\DesignPythonItemBody.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\python\vo\DesignPythonObject.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\UserLikeGroupService.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\FileUtil.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\AccountMapper.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\controller\ThirdPartyController.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\config\mybatis\plus\CustomerSqlInjector.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\impl\CollectionElementServiceImpl.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\GetRgbByHsvBatchDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\AccessLimitUtils.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\RequestInfoUtil.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\SecurityContextUtils.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\python\PythonService.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\CollectionGeneratePrintVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\AccountAddDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\HistoryDeleteDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\DesignItemDetailService.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\LibraryUploadDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\impl\DesignServiceImpl.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\UserLikeVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\config\exception\ExceptionCatch.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\AccountPreLoginDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\ReDesignCollectionDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\DesignMapper.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\PythonLibraryVo.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\ImageUtil.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\UserLikeGroupVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\DesignLikeVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\enums\DesignTypeEnum.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\config\mybatis\plus\SelectVoPage.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\security\UserAuthenticationEntryPointHandler.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\LibraryModelPointService.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\config\exception\BusinessException.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\config\mybatis\plus\CommonMapper.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\AccountEditDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\RsaDecryptUtils.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\ValidateElementVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\controller\DesignDetailController.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\LibraryDeleteDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\EmailSendDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\CollectionColorVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\PanToneService.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\entity\Collection.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\AccountLoginVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\httpdata\token\TokenApis.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\security\config\SecurityConfig.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\UserLikeChooseVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\CollectionSketchDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\enums\SwitchCategoryEnum.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\controller\SavedCollectionController.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\config\captcha\LoginCode.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\impl\DesignItemDetailServiceImpl.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\DesignItemMapper.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\entity\DesignItemDetail.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\LibraryVo.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\entity\Account.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\config\captcha\LoginCodeEnum.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\QueryLibraryPageDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\UserLikeService.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\impl\UserLikeServiceImpl.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\impl\AccountServiceImpl.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\DesignSingleItemDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\python\vo\DesignPythonObjects.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\DateUtil.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\SysFileMapper.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\DesignItemDetailMapper.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\DesignSingleDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\security\filter\UserAuthenticationProcessingFilter.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\MD5Utils.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\enums\CurrentDesignPictureTypeEnum.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\CollectionElementVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\enums\CollectionLevel1TypeEnum.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\SpringUtils.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\config\mybatis\plus\QueryCriteria.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\HistoryUpdateVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\config\mybatis\plus\MybatisPlusConfig.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\LibraryModelPointVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\AccountRegisterDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\MultiReadHttpServletResponse.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\entity\AccountLoginLog.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\entity\SysFile.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\DesignHistoryMapper.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\response\PageBaseResponse.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\LibraryService.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\CollectionGeneratePrintDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\controller\AccountController.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\DesignLibraryModelPointVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\controller\PythonController.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\UserLikeGroupMapper.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\DesignItemOthersDetailVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\impl\ColorLoopUpTableServiceImpl.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\security\UserAuthAccessDeniedHandler.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\python\vo\DesignPythonBasic.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\entity\DesignItem.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\enums\LibraryLevel1TypeEnum.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\security\UserLoginFailureHandler.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\constant\TokenConstant.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\CollectionElementMapper.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\GetNextSysElementVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\impl\LibraryServiceImpl.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\QueryLibraryPageServiceDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\enums\LibraryTopTypeEnum.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\security\UserAuthenticationProvider.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\enums\SingleOverallEnum.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\response\ResultEnum.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\AccountBindEmailDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\impl\SysFileServiceImpl.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\DesignCollectionVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\ModelsDotDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\AccountService.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\python\vo\DesignPythonItem.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\enums\SysFileLevel1TypeEnum.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\PageQueryBaseVo.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\entity\UserLikeGroup.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\CollectionSavePrintDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\enums\PythonToJavaApiOperationTypeEnum.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\enums\CurrentDesignPrintPictureTypeEnum.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\context\UserContext.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\security\UserLoginSuccessHandler.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\QueryLibraryPageVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\CollectionMapper.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\LibraryModelPointDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\impl\CollectionServiceImpl.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\impl\DesignHistoryServiceImpl.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\impl\DesignItemServiceImpl.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\DesignCollectionDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\AccountLogoutDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\config\mybatis\plus\CommonServiceImpl.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\DesignItemDetailVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\SendSmsUtil.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\NoteSendDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\LibraryUpdateDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\constant\ExceptionConstant.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\impl\AccountLoginLogServiceImpl.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\AiDaApplication.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\enums\DataScope.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\config\WebConfig.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\DesignCollectionElementDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\security\jwt\JWTTokenHelper.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\CollectionColorDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\python\vo\DesignPythonItemPrint.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\enums\OperationTypeEnum.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\impl\PanToneServiceImpl.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\entity\LibraryModelPoint.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\entity\Library.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\entity\PanTone.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\QueryLibraryTopPageDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\CollectionDeleteFileDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\enums\ConditionType.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\httpdata\token\TokenQuery.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\vo\UserLikeCollectionVO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\ConvertUtil.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\SendEmailUtil.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\response\Response.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\enums\OrderType.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\UserLikeMapper.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\QueryHistoryPageDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\JSONResponseUtils.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\RedisCacheUtils.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\ColorLoopUpTableMapper.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\service\DesignService.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\annotation\Condition.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\DesignCollectionPrintElementDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\config\RsaProperties.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\model\dto\DesignAttributeRetrievalDTO.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\mapper\entity\ColorLookupTable.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\LocalCacheUtils.java +D:\codeManager\code\AIDA\aida\src\main\java\com\ai\da\common\utils\CloseUtil.java