Browse Source

公共模块 官网服务:公共模块配置 基础框架配置

tangxiangan 2 năm trước cách đây
commit
2aa220372d
100 tập tin đã thay đổi với 21099 bổ sung0 xóa
  1. BIN
      .DS_Store
  2. BIN
      backend-common/.DS_Store
  3. 124 0
      backend-common/pom.xml
  4. BIN
      backend-common/src/.DS_Store
  5. BIN
      backend-common/src/main/.DS_Store
  6. 21 0
      backend-common/src/main/java/annotations/EnableCommonTools.java
  7. 20 0
      backend-common/src/main/java/config/AllowOriginConfig.java
  8. 57 0
      backend-common/src/main/java/config/RedisConfig.java
  9. 17 0
      backend-common/src/main/java/config/SpringContextUtilsConfig.java
  10. 160 0
      backend-common/src/main/java/config/SwaggerConfig.java
  11. 120 0
      backend-common/src/main/java/constant/CommonConstant.java
  12. 21 0
      backend-common/src/main/java/enums/EmailStatusEnum.java
  13. 20 0
      backend-common/src/main/java/enums/PasswordStatusEnum.java
  14. 19 0
      backend-common/src/main/java/enums/ScheduleJobServerFlagEnum.java
  15. 19 0
      backend-common/src/main/java/enums/SensitiveDataTypeEnum.java
  16. 29 0
      backend-common/src/main/java/enums/ValidStatusEnum.java
  17. 23 0
      backend-common/src/main/java/exception/BackendException.java
  18. 20 0
      backend-common/src/main/java/exception/BackendRuntimeException.java
  19. 27 0
      backend-common/src/main/java/pojo/AccessControlAllowOriginBean.java
  20. 67 0
      backend-common/src/main/java/pojo/CustomHttpSessionStrategy.java
  21. 87 0
      backend-common/src/main/java/pojo/CustomUserDetails.java
  22. 63 0
      backend-common/src/main/java/pojo/PageVO.java
  23. 64 0
      backend-common/src/main/java/pojo/QueryParams.java
  24. 80 0
      backend-common/src/main/java/pojo/ResultMap.java
  25. 32 0
      backend-common/src/main/java/pojo/SendResult.java
  26. 44 0
      backend-common/src/main/java/pojo/YunpianSendResult.java
  27. 144 0
      backend-common/src/main/java/utils/AccountValidatorUtil.java
  28. 133 0
      backend-common/src/main/java/utils/AesUtils.java
  29. 11 0
      backend-common/src/main/java/utils/BeanConverter.java
  30. 288 0
      backend-common/src/main/java/utils/CommonUtils.java
  31. 194 0
      backend-common/src/main/java/utils/DateUtils.java
  32. 191 0
      backend-common/src/main/java/utils/ECDSAUtil.java
  33. 88 0
      backend-common/src/main/java/utils/EmailUtils.java
  34. 44 0
      backend-common/src/main/java/utils/FileUtils.java
  35. 60 0
      backend-common/src/main/java/utils/HexUtil.java
  36. 326 0
      backend-common/src/main/java/utils/HttpClientUtils.java
  37. 134 0
      backend-common/src/main/java/utils/JsonUtils.java
  38. 34 0
      backend-common/src/main/java/utils/MD5Utils.java
  39. 66 0
      backend-common/src/main/java/utils/PageUtils.java
  40. 72 0
      backend-common/src/main/java/utils/QueryUtils.java
  41. 626 0
      backend-common/src/main/java/utils/RedisUtils.java
  42. 72 0
      backend-common/src/main/java/utils/SMSUtils.java
  43. 31 0
      backend-common/src/main/java/utils/SpringContextUtils.java
  44. BIN
      backend-core/.DS_Store
  45. 225 0
      backend-core/pom.xml
  46. BIN
      backend-core/src/.DS_Store
  47. BIN
      backend-core/src/main/.DS_Store
  48. BIN
      backend-core/src/main/java/.DS_Store
  49. BIN
      backend-core/src/main/java/cn/.DS_Store
  50. BIN
      backend-core/src/main/java/cn/kdan/.DS_Store
  51. BIN
      backend-core/src/main/java/cn/kdan/pdf/.DS_Store
  52. BIN
      backend-core/src/main/java/cn/kdan/pdf/backend/.DS_Store
  53. 32 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/BackendCoreApplication.java
  54. 26 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/config/BackendCoreConfig.java
  55. 64 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/config/ControllerExceptionHandler.java
  56. 9 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/config/PermissionConfig.java
  57. 64 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/config/RestTemplateConfig.java
  58. 110 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/constant/AuthConstant.java
  59. 33 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/ConvertTypesMapper.java
  60. 33 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/MembersMapper.java
  61. 42 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/MissionFilesMapper.java
  62. 33 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/MissionsMapper.java
  63. 42 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/OrdersMapper.java
  64. 33 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/OutputFilesMapper.java
  65. 33 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/PricingDiscountsMapper.java
  66. 33 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/PricingsMapper.java
  67. 42 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/SetPricingsMapper.java
  68. 33 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/SubscriptionsMapper.java
  69. 256 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/ConvertTypes.java
  70. 951 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/ConvertTypesExample.java
  71. 635 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/Members.java
  72. 2422 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/MembersExample.java
  73. 509 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/MissionFiles.java
  74. 1927 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/MissionFilesExample.java
  75. 127 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/MissionFilesWithBLOBs.java
  76. 166 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/Missions.java
  77. 651 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/MissionsExample.java
  78. 221 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/Orders.java
  79. 847 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/OrdersExample.java
  80. 131 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/OrdersWithBLOBs.java
  81. 256 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/OutputFiles.java
  82. 1026 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/OutputFilesExample.java
  83. 256 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/PricingDiscounts.java
  84. 951 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/PricingDiscountsExample.java
  85. 328 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/Pricings.java
  86. 1266 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/PricingsExample.java
  87. 328 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/SetPricings.java
  88. 1221 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/SetPricingsExample.java
  89. 107 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/SetPricingsWithBLOBs.java
  90. 328 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/Subscriptions.java
  91. 1236 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/SubscriptionsExample.java
  92. 30 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/properties/HttpMatchersProperties.java
  93. 29 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/properties/Oauth2LoginProperties.java
  94. 4 0
      backend-core/src/main/resources/application-local-db.properties
  95. 11 0
      backend-core/src/main/resources/application-local-redis.properties
  96. 15 0
      backend-core/src/main/resources/application-local.yml
  97. 72 0
      backend-core/src/main/resources/application.yml
  98. 38 0
      backend-core/src/main/resources/generatorConfig.xml
  99. 219 0
      backend-core/src/main/resources/logback-spring.xml
  100. 0 0
      backend-core/src/main/resources/sqlmap/ConvertTypesMapper.xml

BIN
.DS_Store


BIN
backend-common/.DS_Store


+ 124 - 0
backend-common/pom.xml

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>backend-common</artifactId>
+    <packaging>jar</packaging>
+    <name>backend-common</name>
+    <description>backend-common</description>
+
+    <parent>
+        <groupId>cn.kdan.17pdf</groupId>
+        <artifactId>backend</artifactId>
+        <version>0.0.1</version>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.data</groupId>
+            <artifactId>spring-data-redis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.lettuce</groupId>
+            <artifactId>lettuce-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-beans</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpcore</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.session</groupId>
+            <artifactId>spring-session-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.mail</groupId>
+            <artifactId>mail</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.jsoup</groupId>
+            <artifactId>jsoup</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk16</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>backend-common</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

BIN
backend-common/src/.DS_Store


BIN
backend-common/src/main/.DS_Store


+ 21 - 0
backend-common/src/main/java/annotations/EnableCommonTools.java

@@ -0,0 +1,21 @@
+package annotations;
+
+
+import config.RedisConfig;
+import config.SpringContextUtilsConfig;
+import config.SwaggerConfig;
+import org.springframework.context.annotation.Import;
+import utils.EmailUtils;
+import utils.SMSUtils;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(value = ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Import({ RedisConfig.class,SwaggerConfig.class, SpringContextUtilsConfig.class, SMSUtils.class, EmailUtils.class})
+public @interface EnableCommonTools {
+
+}

+ 20 - 0
backend-common/src/main/java/config/AllowOriginConfig.java

@@ -0,0 +1,20 @@
+package config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import pojo.AccessControlAllowOriginBean;
+
+@Configuration
+public class AllowOriginConfig {
+
+    @Value("${access-control-allow-origin:*}")
+    private String accessControlAllowOrigin;
+
+    @Bean
+    public AccessControlAllowOriginBean accessControllerAllowOriginBean() {
+        AccessControlAllowOriginBean bean = new AccessControlAllowOriginBean();
+        bean.setAllowOrigin(accessControlAllowOrigin);
+        return bean;
+    }
+}

+ 57 - 0
backend-common/src/main/java/config/RedisConfig.java

@@ -0,0 +1,57 @@
+package config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+import utils.RedisUtils;
+
+@Configuration
+@Import({RedisUtils.class, SpringContextUtilsConfig.class, AllowOriginConfig.class})
+public class RedisConfig {
+
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
+        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
+        redisTemplate.setConnectionFactory(connectionFactory);
+        redisTemplate.setKeySerializer(keySerializer());
+        redisTemplate.setValueSerializer(valueSerializer());
+        redisTemplate.setHashKeySerializer(keySerializer());
+        redisTemplate.setHashValueSerializer(valueSerializer());
+        return redisTemplate;
+    }
+
+    @Bean
+    public RedisTemplate<String, Object> jdkRedisTemplate(LettuceConnectionFactory connectionFactory) {
+        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
+        redisTemplate.setConnectionFactory(connectionFactory);
+        redisTemplate.setKeySerializer(new StringRedisSerializer());
+        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
+        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
+        redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
+        return redisTemplate;
+    }
+
+    private RedisSerializer<String> keySerializer() {
+        return new StringRedisSerializer();
+    }
+
+    private RedisSerializer<Object> valueSerializer() {
+        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
+        ObjectMapper om = new ObjectMapper();
+        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+        om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        jackson2JsonRedisSerializer.setObjectMapper(om);
+        return jackson2JsonRedisSerializer;
+    }
+}

+ 17 - 0
backend-common/src/main/java/config/SpringContextUtilsConfig.java

@@ -0,0 +1,17 @@
+package config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import utils.SpringContextUtils;
+
+@Configuration
+public class SpringContextUtilsConfig {
+    @Bean
+    /*
+     * SharedSession 中需要用到,直接在这里实例化好了
+     */
+    public SpringContextUtils springContextUtils() {
+        return new SpringContextUtils();
+    }
+
+}

+ 160 - 0
backend-common/src/main/java/config/SwaggerConfig.java

@@ -0,0 +1,160 @@
+package config;
+
+
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
+import constant.CommonConstant;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.context.annotation.Profile;
+import springfox.documentation.RequestHandler;
+import springfox.documentation.builders.OAuthBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.service.*;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.contexts.SecurityContext;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger.web.SecurityConfiguration;
+import springfox.documentation.swagger.web.SecurityConfigurationBuilder;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+
+@SuppressWarnings({"Guava", "deprecation"})
+@EnableSwagger2
+@Profile({"dev", "local", "test"})
+@Configuration
+@Import({AllowOriginConfig.class})
+public class SwaggerConfig {
+
+    @Value("${security.oauth2.client.access-token-uri:}")
+    private String tokenUri;
+
+    @Value("${security.oauth2.client.client-id:}")
+    private String clientId;
+
+    @Value("${security.oauth2.client.client-secret:}")
+    private String clientSecret;
+
+    @Value("${security.oauth2.client.user-authorization-uri:}")
+    private String authorizeUri;
+
+    @Value("${swagger.basePackage:com.wondersgroup.cloud.dev.ops}")
+    private String basePackage;
+
+    @Value("${swagger.title:sample Title}")
+    private String title;
+
+    @Value("${swagger.description:Sample Description}")
+    private String description;
+
+    private String version = "v1.0";
+
+    private String contactName = "";
+
+    private String contactEmail = "";
+
+    /**
+     * 主要是这个方法,其他的方法是抽出去的,所以大家不要害怕为啥有这么多方法
+     * 在 basePackage 里面写需要生成文档的 controller 路径
+     */
+    @Bean
+    public Docket api() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .select()
+                .apis(basePackage())
+                .paths(PathSelectors.any())
+                .build()
+                .apiInfo(apiInfo())
+                .securitySchemes(Collections.singletonList(securityScheme()))
+                .securityContexts(Collections.singletonList(securityContext()));
+    }
+
+    private Predicate<RequestHandler> basePackage() {
+        return input -> {
+            assert input != null;
+            return declaringClass(input).transform(handlerPackage()).or(true);
+        };
+    }
+
+    private Function<Class<?>, Boolean> handlerPackage() {
+        return input -> {
+            // 循环判断匹配
+            for (String strPackage : basePackage.split(CommonConstant.STRING_SIGN_COMMA)) {
+                assert input != null;
+                boolean isMatch = input.getPackage().getName().startsWith(strPackage);
+                if (isMatch) {
+                    return true;
+                }
+            }
+            return false;
+        };
+    }
+
+    private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {
+        return Optional.fromNullable(input.declaringClass());
+    }
+
+    /**
+     * 这个方法主要是写一些文档的描述
+     */
+    private ApiInfo apiInfo() {
+        return new ApiInfo(
+                title,
+                description,
+                version,
+                "",
+                new Contact(contactName, "", contactEmail),
+                "", "", Collections.emptyList());
+    }
+
+    /**
+     * 这个类决定了你使用哪种认证方式,我这里使用密码模式
+     * 其他方式自己摸索一下,完全莫问题啊
+     */
+    private SecurityScheme securityScheme() {
+        GrantType grantType = new ResourceOwnerPasswordCredentialsGrant(tokenUri);
+
+        return new OAuthBuilder()
+                .name("spring_oauth")
+                .grantTypes(Collections.singletonList(grantType))
+                .scopes(Arrays.asList(scopes()))
+                .build();
+    }
+
+    @Bean
+    public SecurityConfiguration security() {
+        return SecurityConfigurationBuilder.builder()
+                .clientId(clientId)
+                .clientSecret(clientSecret)
+                .scopeSeparator(" ")
+                .useBasicAuthenticationWithAccessCodeGrant(false)
+                .build();
+    }
+
+    /**
+     * 这里设置 swagger2 认证的安全上下文
+     */
+    private SecurityContext securityContext() {
+        return SecurityContext.builder()
+                .securityReferences(Collections.singletonList(new SecurityReference("spring_oauth", scopes())))
+                .forPaths(PathSelectors.any())
+                .build();
+    }
+
+    /**
+     * 这里是写允许认证的scope
+     */
+    private AuthorizationScope[] scopes() {
+        return new AuthorizationScope[]{
+                new AuthorizationScope("read", "for read operations"),
+                new AuthorizationScope("write", "for write operations")};
+    }
+
+
+}

+ 120 - 0
backend-common/src/main/java/constant/CommonConstant.java

@@ -0,0 +1,120 @@
+package constant;
+
+public interface CommonConstant {
+
+    // 字符串分割符
+    String STRING_SIGN_COMMA = ",";
+    String STRING_SIGN_PERIOD = ".";
+    String STRING_SIGN_COLON = ":";
+    String STRING_SIGN_STAR = "*";
+    String STRING_UNDERLINE = "_";
+    String STRING_VIRGULE = "/";
+    String STRIKE_THROUGH = "-";
+    String STRING_VERTICAL = "|";
+    String STRING_PERCENT = "%";
+    String STRING_WAVE = "~";
+    String STRING_ENTER = "\n";
+    String STRING_EMPTY = "";
+    String STRING_THROUGH_AND_SIGN_STAR = "-*";
+    String STRING_AT = "@";
+    String EQUALS_STR = "=";
+
+    String ENCODING_UTF8 = "utf-8";
+
+    int SUCCESS = 200;
+    String RESULT_SUCCESS = "success";
+
+    String PAGE_INFO = "pageInfo";
+
+    String PARAMS_MISSING_ERROR = "缺少必要参数!";
+
+    String DUPLICATED_REQUEST_ERROR = "重复请求!";
+    String DUPLICATED_REQUEST_HEADER_TIMESTAMP = "timeStamp";
+    String DUPLICATED_REQUEST_HEADER_RANDOM = "random";
+
+    String DEFAULT_ENCRYPT_KEY = "1234567890123456";
+    String DEFAULT_ENCRYPT_IV_KEY = "6543********4321";
+    /**
+     * 参数错误状态
+     */
+    int EXCEPTION_CODE_PARAMETERS_ERROR = 300;
+    String EXCEPTION_MSG_PARAMETERS_ERROR = "没有获取到必须的参数或参数格式错误";
+    String EXCEPTION_MSG_PARAMETERS_AT_LEAST_ONE = "请至少设置一个有效的参数";
+
+    /**
+     * 服务错误状态
+     */
+    int EXCEPTION_CODE_SERVER_ERROR = 500;
+    String EXCEPTION_MSG_SERVER_ERROR = "服务错误";
+
+    /**
+     * 数据库错误状态
+     */
+    int EXCEPTION_CODE_SERVER_DATA_ACCESS_ERROR = 600;
+    String EXCEPTION_MSG_SERVER_DATA_ACCESS_ERROR = "数据库服务错误";
+
+    /**
+     * 运行错误状态
+     */
+    int EXCEPTION_CODE_RUNTIME_ERROR = 700;
+    String EXCEPTION_MSG_RUNTIME_ERROR = "运行时错误";
+
+    /**
+     * 用户登录错误状态
+     */
+    int EXCEPTION_CODE_LOGIN_USER_NOT_FOUND = 800;
+    String EXCEPTION_MSG_LOGIN_USER_NOT_FOUND = "未找到登录用户信息";
+
+    int EXCEPTION_CODE_CURRENT_USER_NO_PERMISSION = 801;
+    String EXCEPTION_MSG_CURRENT_USER_NO_PERMISSION = "当前用户不具备操作权限";
+
+    int EXCEPTION_CODE_DATA_KEY_DECRYPT = 902;
+    String EXCEPTION_MSG_DATA_KEY_DECRYPT = "数据解密失败";
+
+    int EXCEPTION_CODE_DUPLICATED_REQUEST = 903;
+    String EXCEPTION_MSG_DUPLICATED_REQUEST = "请不要重复请求";
+
+    /**
+     * 字节编码
+     */
+    String ENCODE_UTF8 = "utf-8";
+
+
+    String TEXT_HTML_UTF8 = "text/html; charset=utf-8";
+
+    /**
+     * 分页默认第一页
+     */
+    int PAGENUM = 1;
+
+    /**
+     * 分页默认每页显示10条
+     */
+    int PAGESIZE = 10;
+
+    /**
+     * 分页默认排序规则
+     */
+    String ORDERBYCLAUSE = "create_time desc";
+
+    String verifyMessage = "您正在%s,验证码为%s,十五分钟后失效。请您按照提示填写验证码,切勿将验证码泄露于他人。";
+
+    /**
+     * 名称校验不通过信息
+     */
+    String NAME_INVALID_MESSAGE="名称必须以下划线、数字、字母开头,不能包含特殊字符";
+
+    /**
+     * 文件起始行
+     */
+    Integer SOURCE_LINE_FROM = 1;
+
+    String PASSWORD_STRENTH = "1";
+    /**
+     * 文件结束行
+     */
+    Integer SOURCE_LINE_TO = 500;
+
+    String ZERO_STRING = "0";
+
+}

+ 21 - 0
backend-common/src/main/java/enums/EmailStatusEnum.java

@@ -0,0 +1,21 @@
+package enums;
+
+/**
+ * 邮箱状态
+ * CD502200
+ */
+public enum EmailStatusEnum {
+
+    INACTIVE("1"),
+    ACTIVE("2");
+
+    private String value;
+
+    EmailStatusEnum(String value) {
+        this.value = value;
+    }
+
+    public String value() {
+        return value;
+    }
+}

+ 20 - 0
backend-common/src/main/java/enums/PasswordStatusEnum.java

@@ -0,0 +1,20 @@
+package enums;
+
+/**
+ * 密码状态
+ * CD502700
+ */
+public enum PasswordStatusEnum {
+    ORIGIN("1"),
+    UPDATED("2");
+
+    private String value;
+
+    PasswordStatusEnum(String value) {
+        this.value = value;
+    }
+
+    public String value() {
+        return value;
+    }
+}

+ 19 - 0
backend-common/src/main/java/enums/ScheduleJobServerFlagEnum.java

@@ -0,0 +1,19 @@
+package enums;
+
+/**
+ * 定时任务执行的服务枚举
+ */
+public enum ScheduleJobServerFlagEnum {
+    BACKSTAGE("1"),
+    CORE("2");
+
+    private String value;
+
+    ScheduleJobServerFlagEnum(String value) {
+        this.value = value;
+    }
+
+    public String value() {
+        return value;
+    }
+}

+ 19 - 0
backend-common/src/main/java/enums/SensitiveDataTypeEnum.java

@@ -0,0 +1,19 @@
+package enums;
+
+/**
+ * 敏感数据类型
+ */
+public enum SensitiveDataTypeEnum {
+    /**
+     * 手机
+     */
+    MOBILE,
+    /**
+     *邮件
+     */
+    EMAIL,
+    /**
+     *其他
+     */
+    OTHER
+}

+ 29 - 0
backend-common/src/main/java/enums/ValidStatusEnum.java

@@ -0,0 +1,29 @@
+package enums;
+
+/**
+ * 有效状态(是否可用)
+ * CD101100
+ *
+ * @author tangxiangan
+ */
+public enum ValidStatusEnum {
+
+    /**
+     * 无效
+     */
+    INVALID("0"),
+    /**
+     * 有效
+     */
+    VALID("1");
+
+    private final String value;
+
+    ValidStatusEnum(String value) {
+        this.value = value;
+    }
+
+    public String value() {
+        return value;
+    }
+}

+ 23 - 0
backend-common/src/main/java/exception/BackendException.java

@@ -0,0 +1,23 @@
+package exception;
+
+public class BackendException extends Exception{
+    public BackendException() {
+        super();
+    }
+
+    public BackendException(String message) {
+        super(message);
+    }
+
+    public BackendException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public BackendException(Throwable cause) {
+        super(cause);
+    }
+
+    protected BackendException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
+        super(message, cause, enableSuppression, writableStackTrace);
+    }
+}

+ 20 - 0
backend-common/src/main/java/exception/BackendRuntimeException.java

@@ -0,0 +1,20 @@
+package exception;
+
+public class BackendRuntimeException extends RuntimeException {
+    public BackendRuntimeException() {
+        super();
+    }
+
+    public BackendRuntimeException(String message) {
+        super(message);
+    }
+
+    public BackendRuntimeException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public BackendRuntimeException(Throwable cause) {
+        super(cause);
+    }
+
+}

+ 27 - 0
backend-common/src/main/java/pojo/AccessControlAllowOriginBean.java

@@ -0,0 +1,27 @@
+package pojo;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public class AccessControlAllowOriginBean {
+
+    private String allowOrigin;
+
+    public String getAllowOrigin() {
+        return allowOrigin;
+    }
+
+    public void setAllowOrigin(String allowOrigin) {
+        this.allowOrigin = allowOrigin;
+    }
+
+    public boolean isAll() {
+        return "*".equals(allowOrigin);
+    }
+
+    public Set<String> getDomains() {
+        String[] domains = allowOrigin.trim().split(",");
+        return new HashSet<>(Arrays.asList(domains));
+    }
+}

+ 67 - 0
backend-common/src/main/java/pojo/CustomHttpSessionStrategy.java

@@ -0,0 +1,67 @@
+package pojo;
+
+import org.springframework.session.web.http.HeaderHttpSessionIdResolver;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Collections;
+import java.util.List;
+
+public class CustomHttpSessionStrategy extends HeaderHttpSessionIdResolver {
+
+    private static final String HEADER_X_AUTH_TOKEN = "x-auth-token";
+
+    private static final String HEADER_AUTHENTICATION_INFO = "Authentication-Info";
+
+    private final String headerName;
+
+    /**
+     * Convenience factory to create {@link HeaderHttpSessionIdResolver} that uses
+     * "X-Auth-AccessToken" header.
+     *
+     * @return the instance configured to use "X-Auth-AccessToken" header
+     */
+    public static HeaderHttpSessionIdResolver xAuthToken() {
+        return new HeaderHttpSessionIdResolver(HEADER_X_AUTH_TOKEN);
+    }
+
+    /**
+     * Convenience factory to create {@link HeaderHttpSessionIdResolver} that uses
+     * "Authentication-Info" header.
+     *
+     * @return the instance configured to use "Authentication-Info" header
+     */
+    public static HeaderHttpSessionIdResolver authenticationInfo() {
+        return new HeaderHttpSessionIdResolver(HEADER_AUTHENTICATION_INFO);
+    }
+
+
+    /**
+     * The name of the header to obtain the session id from.
+     *
+     * @param headerName the name of the header to obtain the session id from.
+     */
+    public CustomHttpSessionStrategy(String headerName) {
+        super(headerName);
+        this.headerName = headerName;
+    }
+
+    @Override
+    public List<String> resolveSessionIds(HttpServletRequest request) {
+        String headerValue = request.getHeader(this.headerName);
+        return headerValue != null ? Collections.singletonList(headerValue)
+                : Collections.emptyList();
+    }
+
+    @Override
+    public void setSessionId(HttpServletRequest request, HttpServletResponse response,
+                             String sessionId) {
+        response.setHeader(this.headerName, sessionId);
+    }
+
+    @Override
+    public void expireSession(HttpServletRequest request, HttpServletResponse response) {
+        response.setHeader(this.headerName, "");
+    }
+
+}

+ 87 - 0
backend-common/src/main/java/pojo/CustomUserDetails.java

@@ -0,0 +1,87 @@
+package pojo;
+
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * 用户信息的实体类
+ */
+public class CustomUserDetails implements UserDetails {
+    private static final long serialVersionUID = 6172991108803896779L;
+
+    private String id;
+    private String username;
+    private String password;
+    private Set<GrantedAuthority> authorities;
+    private boolean accountNonExpired;
+    private boolean accountNonLocked;
+    private boolean credentialsNonExpired;
+    private boolean enabled;
+
+    public CustomUserDetails(String id, String username, String password, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Set<SimpleGrantedAuthority> authorities) {
+        if (username != null && !"".equals(username) && password != null) {
+            this.id = id;
+            this.username = username;
+            this.password = password;
+            this.enabled = enabled;
+            this.accountNonExpired = accountNonExpired;
+            this.credentialsNonExpired = credentialsNonExpired;
+            this.accountNonLocked = accountNonLocked;
+            this.authorities = Collections.unmodifiableSet(authorities);
+        } else {
+            throw new IllegalArgumentException("Cannot pass null or empty values to constructor");
+        }
+    }
+
+    /**
+     * 对当前的用户赋予其应有的权限
+     */
+    @Override
+    public Collection<? extends GrantedAuthority> getAuthorities() {
+        return this.authorities;
+    }
+
+    @Override
+    public String getPassword() {
+        return this.password;
+    }
+
+    @Override
+    public String getUsername() {
+        return this.username;
+    }
+
+    @Override
+    public boolean isAccountNonExpired() {
+        return this.accountNonExpired;
+    }
+
+    @Override
+    public boolean isAccountNonLocked() {
+        return this.accountNonLocked;
+    }
+
+    @Override
+    public boolean isCredentialsNonExpired() {
+        return this.credentialsNonExpired;
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return this.enabled;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+}

+ 63 - 0
backend-common/src/main/java/pojo/PageVO.java

@@ -0,0 +1,63 @@
+package pojo;
+
+import java.util.List;
+
+public class PageVO<T> {
+	 //当前页
+    private int pageNum;
+    //每页的数量
+    private int pageSize;
+    //当前页的数量
+    private int size;
+    //总记录数
+    private long total;
+    //总页数
+    private int pages;
+    //list
+	private List<?> list;
+	
+	public PageVO(){
+		
+	}
+
+	public PageVO(List<T> list){
+		this.list = list;
+	}
+	
+	public int getPageNum() {
+		return pageNum;
+	}
+	public void setPageNum(int pageNum) {
+		this.pageNum = pageNum;
+	}
+	public int getPageSize() {
+		return pageSize;
+	}
+	public void setPageSize(int pageSize) {
+		this.pageSize = pageSize;
+	}
+	public int getSize() {
+		return size;
+	}
+	public void setSize(int size) {
+		this.size = size;
+	}
+	public long getTotal() {
+		return total;
+	}
+	public void setTotal(long total) {
+		this.total = total;
+	}
+	public int getPages() {
+		return pages;
+	}
+	public void setPages(int pages) {
+		this.pages = pages;
+	}
+	public List<?> getList() {
+		return list;
+	}
+	public void setList(List<?> list) {
+		this.list = list;
+	}
+}

+ 64 - 0
backend-common/src/main/java/pojo/QueryParams.java

@@ -0,0 +1,64 @@
+package pojo;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author tangxiangan
+ */
+public class QueryParams {
+
+    @ApiModelProperty(name = "page", value = "页码", example = "1")
+    private Integer page;
+
+    @ApiModelProperty(name = "rows", value = "行数", example = "10")
+    private Integer rows;
+
+    @ApiModelProperty(name = "sidx", value = "排序字段", example = "name")
+    private String sidx;
+
+    @ApiModelProperty(name = "sord", value = "排序规则", example = "asc")
+    private String sord;
+
+    @ApiModelProperty(name = "orderByClause", value = "排序条件", example = "id asc, name asc")
+    private String orderByClause;
+
+    public Integer getPage() {
+        return page;
+    }
+
+    public void setPage(Integer page) {
+        this.page = page;
+    }
+
+    public Integer getRows() {
+        return rows;
+    }
+
+    public void setRows(Integer rows) {
+        this.rows = rows;
+    }
+
+    public String getSidx() {
+        return sidx;
+    }
+
+    public void setSidx(String sidx) {
+        this.sidx = sidx;
+    }
+
+    public String getSord() {
+        return sord;
+    }
+
+    public void setSord(String sord) {
+        this.sord = sord;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+}

+ 80 - 0
backend-common/src/main/java/pojo/ResultMap.java

@@ -0,0 +1,80 @@
+package pojo;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import constant.CommonConstant;
+import utils.JsonUtils;
+
+import java.util.Objects;
+
+public class ResultMap<T> {
+    private int code;
+    private String msg;
+    private T result;
+
+    public ResultMap() {
+        code = CommonConstant.SUCCESS;
+        msg = CommonConstant.RESULT_SUCCESS;
+    }
+
+    public ResultMap(int code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public ResultMap(int code, String msg, T result) {
+        super();
+        this.code = code;
+        this.msg = msg;
+        this.result = result;
+    }
+
+    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 T getResult() {
+        return result;
+    }
+
+    public void setResult(T result) {
+        this.result = result;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        ResultMap<?> resultMap = (ResultMap<?>) o;
+        return code == resultMap.code &&
+                Objects.equals(msg, resultMap.msg) &&
+                Objects.equals(result, resultMap.result);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(code, msg, result);
+    }
+
+
+    @Override
+    public String toString() {
+        return JsonUtils.getJsonString(this);
+    }
+
+    @JsonIgnore
+    public boolean isSuccess() {
+        return this.code == CommonConstant.SUCCESS;
+    }
+}

+ 32 - 0
backend-common/src/main/java/pojo/SendResult.java

@@ -0,0 +1,32 @@
+package pojo;
+
+public class SendResult {
+
+    private Integer code;
+    private String msg;
+    private String mobile;
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+}

+ 44 - 0
backend-common/src/main/java/pojo/YunpianSendResult.java

@@ -0,0 +1,44 @@
+package pojo;
+
+import java.util.List;
+
+public class YunpianSendResult {
+
+    private Integer total_count;
+    private String total_fee;
+    private String unit;
+    private List<SendResult> data;
+
+    public Integer getTotal_count() {
+        return total_count;
+    }
+
+    public void setTotal_count(Integer total_count) {
+        this.total_count = total_count;
+    }
+
+    public String getTotal_fee() {
+        return total_fee;
+    }
+
+    public void setTotal_fee(String total_fee) {
+        this.total_fee = total_fee;
+    }
+
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+
+    public List<SendResult> getData() {
+        return data;
+    }
+
+    public void setData(List<SendResult> data) {
+        this.data = data;
+    }
+
+}

+ 144 - 0
backend-common/src/main/java/utils/AccountValidatorUtil.java

@@ -0,0 +1,144 @@
+package utils;
+
+import java.util.regex.Pattern;
+
+/**
+ * 账户相关属性验证工具
+ */
+public class AccountValidatorUtil {
+    /**
+     * 正则表达式:验证用户名
+     */
+    public static final String REGEX_USERNAME = "^[a-zA-Z]\\w{5,20}$";
+
+    /**
+     * 正则表达式:验证密码
+     */
+    public static final String REGEX_PASSWORD = "^[a-zA-Z0-9]{6,20}$";
+
+    /**
+     * 正则表达式:验证手机号
+     */
+    public static final String REGEX_MOBILE = "^1\\d{10}$";
+
+    /**
+     * 正则表达式:验证邮箱
+     */
+    public static final String REGEX_EMAIL = "^.*@.*$";
+
+    /**
+     * 正则表达式:验证汉字
+     */
+    public static final String REGEX_CHINESE = "^[\u4e00-\u9fa5],{0,}$";
+
+    /**
+     * 正则表达式:验证身份证
+     */
+    public static final String REGEX_ID_CARD = "(^\\d{18}$)|(^\\d{15}$)";
+
+    /**
+     * 正则表达式:验证URL
+     */
+    public static final String REGEX_URL = "http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?#%&=]*)?";
+
+    /**
+     * 正则表达式:验证IP地址
+     */
+    public static final String REGEX_IP_ADDR = "(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)";
+
+    /**
+     * 正则表达式:验证IP制品库名称 只允许输入英文、数字、横杠、下划线
+     */
+    public static final String PROJECT_STORE_NAME = "^[A-Za-z0-9-_]+$";
+
+    /**
+     * 校验用户名
+     *
+     * @param username
+     * @return 校验通过返回true,否则返回false
+     */
+    public static boolean isUsername(String username) {
+        return Pattern.matches(REGEX_USERNAME, username);
+    }
+
+    /**
+     * 校验密码
+     *
+     * @param password
+     * @return 校验通过返回true,否则返回false
+     */
+    public static boolean isPassword(String password) {
+        return Pattern.matches(REGEX_PASSWORD, password);
+    }
+
+    /**
+     * 校验手机号
+     *
+     * @param mobile
+     * @return 校验通过返回true,否则返回false
+     */
+    public static boolean isMobile(String mobile) {
+        return Pattern.matches(REGEX_MOBILE, mobile);
+    }
+
+    /**
+     * 校验邮箱
+     *
+     * @param email
+     * @return 校验通过返回true,否则返回false
+     */
+    public static boolean isEmail(String email) {
+        return Pattern.matches(REGEX_EMAIL, email);
+    }
+
+    /**
+     * 校验汉字
+     *
+     * @param chinese
+     * @return 校验通过返回true,否则返回false
+     */
+    public static boolean isChinese(String chinese) {
+        return Pattern.matches(REGEX_CHINESE, chinese);
+    }
+
+    /**
+     * 校验身份证
+     *
+     * @param idCard
+     * @return 校验通过返回true,否则返回false
+     */
+    public static boolean isIDCard(String idCard) {
+        return Pattern.matches(REGEX_ID_CARD, idCard);
+    }
+
+    /**
+     * 校验URL
+     *
+     * @param url
+     * @return 校验通过返回true,否则返回false
+     */
+    public static boolean isUrl(String url) {
+        return Pattern.matches(REGEX_URL, url);
+    }
+
+    /**
+     * 校验IP地址
+     *
+     * @param ipAddr
+     * @return
+     */
+    public static boolean isIPAddr(String ipAddr) {
+        return Pattern.matches(REGEX_IP_ADDR, ipAddr);
+    }
+
+    /**
+     * 校验制品库名称
+     *
+     * @param
+     * @return
+     */
+    public static boolean isProjectStoreName(String name) {
+        return Pattern.matches(PROJECT_STORE_NAME, name);
+    }
+
+}

+ 133 - 0
backend-common/src/main/java/utils/AesUtils.java

@@ -0,0 +1,133 @@
+package utils;
+
+import constant.CommonConstant;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.Key;
+import java.security.NoSuchAlgorithmException;
+
+public class AesUtils {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(AesUtils.class);
+
+    private static final String ALGORITHM = "AES/CBC/PKCS5Padding";
+
+    private static final String STRIP_STRING = " \0";
+
+    private static Cipher encryptCipher;
+
+    private static Cipher decryptCipher;
+
+    public synchronized static String encrypt(String content) {
+        return encrypt(CommonConstant.DEFAULT_ENCRYPT_KEY, CommonConstant.DEFAULT_ENCRYPT_IV_KEY, content);
+    }
+
+    public synchronized static String encrypt(String keyString, String ivKeyString, String content) {
+        if (StringUtils.isBlank(content)) {
+            return CommonConstant.STRING_EMPTY;
+        }
+        String encryptText = null;
+        try {
+            Key key = new SecretKeySpec(keyString.getBytes(StandardCharsets.US_ASCII), "AES");
+            encryptCipher = Cipher.getInstance(ALGORITHM);
+            encryptCipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(ivKeyString.getBytes(StandardCharsets.US_ASCII)));
+        } catch (InvalidKeyException e) {
+            LOGGER.error("[AesUtils] invalid key " + keyString, e);
+        } catch (InvalidAlgorithmParameterException e) {
+            LOGGER.error("[AesUtils] invalid algorithm param " + ivKeyString, e);
+        } catch (NoSuchPaddingException | NoSuchAlgorithmException e) {
+            LOGGER.error("[AesUtils] init cipher error", e);
+        }
+        try {
+            byte[] encryptBytes = encryptCipher.doFinal(extendKey(content.getBytes(StandardCharsets.UTF_8)));
+            encryptText = parseByte2Hex(encryptBytes);
+        } catch (Exception e) {
+            LOGGER.error("[AesUtils] encrypt error ", e);
+        }
+        return encryptText;
+    }
+
+    public synchronized static String decrypt(String content) {
+        return decrypt(CommonConstant.DEFAULT_ENCRYPT_KEY, CommonConstant.DEFAULT_ENCRYPT_IV_KEY, content);
+    }
+
+    public synchronized static String decrypt(String keyString, String ivKeyString, String content) {
+        if (StringUtils.isBlank(content)) {
+            return CommonConstant.STRING_EMPTY;
+        }
+        String decryptText = null;
+        try {
+            Key key = new SecretKeySpec(keyString.getBytes(StandardCharsets.US_ASCII), "AES");
+            IvParameterSpec ivKey = new IvParameterSpec(ivKeyString.getBytes(StandardCharsets.US_ASCII));
+            decryptCipher = Cipher.getInstance(ALGORITHM);
+            decryptCipher.init(Cipher.DECRYPT_MODE, key, ivKey);
+        } catch (InvalidKeyException e) {
+            LOGGER.error("[AesUtils]invalid key" + keyString, e);
+        } catch (InvalidAlgorithmParameterException e) {
+            LOGGER.error("[AesUtils] encoding unsupported " + keyString, e);
+        } catch (NoSuchPaddingException | NoSuchAlgorithmException e) {
+            LOGGER.error("[AesUtils] init cipher error", e);
+        }
+        try {
+            byte[] encryptBytes = parseHex2Byte(content);
+            byte[] decryptBytes = decryptCipher.doFinal(encryptBytes);
+            decryptText = new String(decryptBytes, StandardCharsets.UTF_8);
+            decryptText = StringUtils.strip(decryptText, STRIP_STRING);
+        } catch (IllegalBlockSizeException | BadPaddingException e) {
+            LOGGER.error("[AesUtils]invalid key " + keyString, e);
+        }
+        return decryptText;
+    }
+
+    private static byte[] parseHex2Byte(String hexText) {
+        if (StringUtils.isEmpty(hexText)) {
+            return null;
+        }
+        byte[] result = new byte[hexText.length() / 2];
+        for (int i = 0; i < hexText.length() / 2; i++) {
+            int high = Integer.parseInt(hexText.substring(i * 2, i * 2 + 1), 16);
+            int low = Integer.parseInt(hexText.substring(i * 2 + 1, i * 2 + 2), 16);
+            result[i] = (byte) (high * 16 + low);
+        }
+        return result;
+    }
+
+    private static String parseByte2Hex(byte[] bytes) {
+        StringBuilder sb = new StringBuilder();
+        for (byte aByte : bytes) {
+            String hex = Integer.toHexString(aByte & 0xFF);
+            if (hex.length() == 1) {
+                hex = '0' + hex;
+            }
+            sb.append(hex.toLowerCase());
+        }
+        return sb.toString();
+    }
+
+    private static byte[] extendKey(byte[] input) {
+        int rest = input.length % 16;
+        if (rest > 0) {
+            byte[] result = new byte[input.length + (16 - rest)];
+            System.arraycopy(input, 0, result, 0, input.length);
+            return result;
+        }
+        return input;
+    }
+
+    public static void main(String[] args) {
+        System.out.println(encrypt("18627945022"));
+        System.out.println(decrypt(CommonConstant.DEFAULT_ENCRYPT_KEY, CommonConstant.DEFAULT_ENCRYPT_IV_KEY, "54db89effcf52bb979778f718f75aa5493439afa76973581ceeee35150764066"));
+    }
+
+}

+ 11 - 0
backend-common/src/main/java/utils/BeanConverter.java

@@ -0,0 +1,11 @@
+package utils;
+
+/**
+ * BO转VO接口
+ * Created by tangxiangan.
+ */
+public interface BeanConverter<B,V> {
+    V convert(B b);
+
+    V detail(B b);
+}

+ 288 - 0
backend-common/src/main/java/utils/CommonUtils.java

@@ -0,0 +1,288 @@
+package utils;
+
+import constant.CommonConstant;
+import enums.SensitiveDataTypeEnum;
+import org.apache.commons.lang.RandomStringUtils;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class CommonUtils {
+
+    public final static String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
+
+    private static final String NAME_REGEX="^[a-zA-Z\\d_][a-zA-Z\\d-_]*$";
+
+    private static final int DEFAULT_ID_LENGTH = 9;
+
+    private static final String EMAIL_SUFFIX = "@wondersgroup.com";
+
+    /**
+     * 校验名称
+     */
+    public static Boolean validateName(String name){
+        Pattern pattern= Pattern.compile(NAME_REGEX);
+        Matcher matcher = pattern.matcher(name);
+        return matcher.matches();
+    }
+
+    /**
+     * 功能描述:获取当前日期时间格式化字符串,默认yyyy-MM-dd HH:mm:ss格式
+     */
+    public static String getCurrentDateTime() {
+        return getDateTime(DEFAULT_DATE_FORMAT);
+    }
+
+    /**
+     * 功能描述:获取当前日期时间格式化字符串
+     *
+     * @param dateFormat 日期时间格式
+     */
+    public static String getDateTime(String dateFormat) {
+        return new SimpleDateFormat(dateFormat).format(Calendar.getInstance()
+                .getTime());
+    }
+
+    public static String getDateTimeAfterTenYears() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTimeInMillis(System.currentTimeMillis());
+        int currenYear = calendar.get(Calendar.YEAR);
+        calendar.set(Calendar.YEAR, currenYear + 100);
+        return new SimpleDateFormat(DEFAULT_DATE_FORMAT).format(calendar.getTime());
+    }
+
+    public static String getDateTimeBeforeTenYears() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTimeInMillis(System.currentTimeMillis());
+        int currenYear = calendar.get(Calendar.YEAR);
+        calendar.set(Calendar.YEAR, currenYear - 1);
+        return new SimpleDateFormat(DEFAULT_DATE_FORMAT).format(calendar.getTime());
+    }
+
+
+    /**
+     * 功能描述:获取指定日期时间格式化字符串
+     *
+     * @param dateFormat 日期时间格式
+     */
+    public static String getDateTime(String dateFormat, Date date) {
+        return new SimpleDateFormat(dateFormat).format(date);
+    }
+
+    /*
+     * 功能描述:生成对象的主键
+     *
+     * @return String
+     */
+    public static String generateId() {
+        UUID uuid = UUID.randomUUID();
+        String id = uuid.toString();
+        id = id.replaceAll("-", "");
+        return id;
+    }
+
+
+    /**
+     * 生成随机邮箱地址
+     * @return
+     */
+    public static String generateEmail(){
+        return generateId() + EMAIL_SUFFIX;
+    }
+    /**
+     * 生成随机字符串形式的id,使用apache common包中的api
+     *
+     * @return 生成的id
+     */
+    public static String generateRandomStringId() {
+        return generateRandomStringId(DEFAULT_ID_LENGTH);
+    }
+
+//	public static void main(String[] args){
+//		System.out.println("8 char string  >>>,sample :" + generateRandomStringId(8));
+//		Set<String> set = new HashSet<>();
+//		for (int i = 0; i < 5000000; i++) {
+//			set.add(generateRandomStringId(8));
+//		}
+//		System.out.print("8 char string , set size : " + set.size());
+//
+//	}
+
+    public static String generateRandomStringId(int count) {
+        return RandomStringUtils.random(count, true, true);
+    }
+
+    /**
+     * 生成Openstack的资源名称
+     *
+     * @param prefix
+     * @return
+     */
+    public static String generateName(String prefix) {
+        return prefix + "-" + Long.toHexString((new Date()).getTime());
+    }
+
+    public static boolean checkParams(String... params) {
+        if (params == null) {
+            return false;
+        }
+        for (String param : params) {
+            if (StringUtils.isEmpty(param)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public static String generateDateId() {
+        Random random = new Random();
+        int i = random.nextInt(9999) + 10000;
+        String num = String.valueOf(i).substring(1);
+        return getDateTime("yyyyMMddHHmmss") + num;
+    }
+
+    public static String generateVerifyCode() {
+        return String.valueOf(new Random().nextInt(899999) + 100000);
+    }
+
+    public static Date parseDate(String dateFormat, String date) throws ParseException {
+        return new SimpleDateFormat(dateFormat).parse(date);
+    }
+
+    public static String listToString(List<String> list) {
+
+        if (list == null) {
+            return null;
+        }
+
+        StringBuilder result = new StringBuilder();
+        boolean first = true;
+
+        //第一个前面不拼接","
+        for (String string : list) {
+            if (first) {
+                first = false;
+            } else {
+                result.append(",");
+            }
+            result.append(string);
+        }
+        return result.toString();
+    }
+
+    /**
+     * 返回首字母大写后的字符串
+     *
+     * @param str
+     * @return
+     */
+    public static String upperFirstLetter(String str) {
+        if (str.length() > 0) {
+            return org.apache.commons.lang.StringUtils.upperCase(str.substring(0, 1)) + str.substring(1);
+        }
+        return null;
+    }
+
+    /**
+     * 覆盖部分内容(电话号码、邮件地址)
+     *
+     * @param content
+     * @param sensitiveDataTypeEnum
+     * @return
+     */
+    public static String coverSensitiveContent(String content, SensitiveDataTypeEnum sensitiveDataTypeEnum) {
+        if (StringUtils.isEmpty(content)) {
+            return content;
+        }
+
+        if (sensitiveDataTypeEnum == SensitiveDataTypeEnum.EMAIL) {
+            String headContent = content.substring(0, content.indexOf("@"));
+            String tailContent = content.substring(content.indexOf("@"));
+            return coverContent(headContent) + tailContent;
+        } else if (sensitiveDataTypeEnum == SensitiveDataTypeEnum.MOBILE) {
+            return coverContent(content);
+        } else {
+            return coverContent(content);
+        }
+    }
+
+    /**
+     * 用*覆盖内容
+     *
+     * @param content
+     * @return
+     */
+    private static String coverContent(String content) {
+        int length = content.length();
+        int coverLength = Double.valueOf(Math.floor(length / 2)).intValue();
+        StringBuilder stringBuilder = new StringBuilder();
+        if (coverLength == 0) {
+            return content;
+        } else {
+            int halfLength = Double.valueOf(Math.floor((length - coverLength) / 2)).intValue();
+            for (int i = 0; i < length; i++) {
+                if (i >= halfLength && (i < (halfLength + coverLength))) {
+                    stringBuilder.append("*");
+                } else {
+                    stringBuilder.append(content.charAt(i));
+                }
+            }
+        }
+        return stringBuilder.toString();
+    }
+
+    public static String generateUriVariables(Map<String, Object> param) {
+        StringBuilder variables = new StringBuilder();
+        if (!CollectionUtils.isEmpty(param)) {
+            variables.append("?");
+            for (String key : param.keySet()) {
+                if (param.get(key) != null) {
+                    variables.append(key).append("=").append(param.get(key).toString()).append("&");
+                }
+            }
+        }
+        return variables.toString();
+    }
+
+    public static Boolean judgeWildcards(final String param, final String realData) {
+        if(! Pattern.matches(param, realData)){
+            if(param.contains("*")) {
+                String noParam=param.replaceAll("\\*","");
+                if (realData.contains(noParam)){
+                    return true;
+                }else{
+                    if(noParam.length()>realData.length()) {
+                        return false;
+                    }
+                    String[] myparam=param.split("\\*");
+                    int curIndex=0;
+                    int prePostion=0;
+                    int num=0;
+                    for(String duan:myparam){
+                        num++;
+                        curIndex=realData.indexOf(duan);
+                        if(curIndex==-1) {
+                            return false;
+                        }
+                        if(curIndex>=prePostion){
+                            prePostion=curIndex+duan.length();
+                            if(num==myparam.length) {
+                                return true;
+                            }
+                        }else{
+                            return false;
+                        }
+                    }
+                }
+            }
+            return false;
+        }
+        return true;
+    }
+
+}

+ 194 - 0
backend-common/src/main/java/utils/DateUtils.java

@@ -0,0 +1,194 @@
+package utils;
+
+import org.apache.commons.lang.StringUtils;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.*;
+import java.time.chrono.ChronoZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * @author tangxiangan
+ * 时间工具类
+ */
+public class DateUtils {
+    public static final String COMMON_FORMAT = "yyyy-MM-dd HH:mm:ss";
+    public static final String COMMON_FORMAT_DATE = "yyyy-MM-dd";
+
+    private static final DateTimeFormatter DTF_FOR_ID = DateTimeFormatter.ofPattern("yyMMddHHmmss");
+
+
+    /**
+     * 时间戳转化时间
+     *
+     * @param timestamp 已处理过的时间戳
+     * @return
+     */
+    public static Date longToDate(long timestamp){
+        Instant instant = Instant.ofEpochMilli(timestamp);
+        Date date = Date.from(instant);
+        return date;
+    }
+
+    /**
+     * 时间戳转化时间
+     *
+     * @param timestamp 已处理过的时间戳
+     * @param pattern
+     * @return
+     */
+    public static String longToDateStr(long timestamp, String pattern) {
+        DateFormat dt = new SimpleDateFormat(pattern);
+        return dt.format(new Date(timestamp));
+    }
+
+    /**
+     * 字符串转化时间
+     *
+     * @param str
+     * @param pattern
+     * @return
+     */
+    public static Date parseStringToDate(String str, String pattern) {
+        if (StringUtils.isBlank(str) || StringUtils.isBlank(pattern)) {
+            return null;
+        }
+        DateFormat df = new SimpleDateFormat(pattern);
+        try {
+            return df.parse(str);
+        } catch (ParseException e) {
+            return null;
+        }
+    }
+
+    /**
+     * Date -> String
+     * @param date
+     * @param pattern
+     * @return
+     */
+    public static String dateToString(Date date,String pattern){
+        DateFormat dt = new SimpleDateFormat(pattern);
+        return dt.format(date);
+    }
+
+    /**
+     * 增减分钟
+     * @param minutes 分钟
+     * @param sign 增减标识 正数加 复数减
+     * @return
+     */
+    public static Date addMinutes(Date date,int minutes,int sign){
+        LocalDateTime localDateTime = getLocalDateTimeFormDate(date);
+        if(sign > 0){
+            localDateTime = localDateTime.plusMinutes(minutes);
+        }else{
+            localDateTime = localDateTime.minusHours(minutes);
+        }
+
+        ZoneId zoneId = ZoneId.systemDefault();
+        ZonedDateTime zdt = localDateTime.atZone(zoneId);
+        return Date.from(zdt.toInstant());
+    }
+
+    public static Date localDateTimeToDate(LocalDateTime localDate){
+        ZoneId zoneId = ZoneId.systemDefault();
+        ZonedDateTime zonedDateTime = localDate.atZone(zoneId);
+       return Date.from(zonedDateTime.toInstant());
+    }
+
+    public static Date localDateToDate(LocalDate localDate){
+        ZoneId zoneId = ZoneId.systemDefault();
+        ChronoZonedDateTime<LocalDate> zonedDateTime = localDate.atStartOfDay(zoneId);
+        return Date.from(zonedDateTime.toInstant());
+    }
+
+    /**
+     * @Description: Date -> LocalDateTime
+     */
+    public static LocalDateTime getLocalDateTimeFormDate(Date date){
+        Instant instant = date.toInstant();
+        ZoneId zone = ZoneId.systemDefault();
+        return LocalDateTime.ofInstant(instant, zone);
+
+    }
+    public static LocalDate getLocalDateFormDate(Date date){
+        LocalDateTime localDateTimeFormDate = getLocalDateTimeFormDate(date);
+        return localDateTimeFormDate.toLocalDate();
+    }
+
+    /**
+     * 获取最近一个月第一天的日期
+     * @return
+     */
+    public static String lastMothFirstDay(String pattern){
+        Date now = new Date();
+        Calendar lastMonth = Calendar.getInstance();
+        lastMonth.setTime(now);
+        lastMonth.add(Calendar.MONTH, -1);
+        String time = new SimpleDateFormat(pattern).format( lastMonth.getTime());
+        return time;
+    }
+
+    /**
+     * 时间比较 格式 yyyy-MM-dd
+     * @param dateStr
+     * @param targetDateStr
+     * @return
+     */
+    public static int compareDate(String dateStr,String targetDateStr){
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        LocalDateTime localDateTime = LocalDateTime.parse(dateStr + " 00:00:00",df);
+        LocalDateTime targetLocalDateTime = LocalDateTime.parse(targetDateStr + " 00:00:00",df);
+        return localDateTime.compareTo(targetLocalDateTime);
+    }
+
+
+
+    /**
+     * 时间改为最小(00:00:00)
+     *
+     * @param date date
+     */
+    public static Date timeMin(Date date) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.set(Calendar.HOUR_OF_DAY, cal.getActualMinimum(Calendar.HOUR_OF_DAY));
+        cal.set(Calendar.MINUTE, cal.getActualMinimum(Calendar.MINUTE));
+        cal.set(Calendar.SECOND, cal.getActualMinimum(Calendar.SECOND));
+        return cal.getTime();
+    }
+
+    /**
+     * 时间改为最大(23:59:59)
+     *
+     * @param date date
+     */
+    public static Date timeMax(Date date) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.set(Calendar.HOUR_OF_DAY, cal.getActualMaximum(Calendar.HOUR_OF_DAY));
+        cal.set(Calendar.MINUTE, cal.getActualMaximum(Calendar.MINUTE));
+        cal.set(Calendar.SECOND, cal.getActualMaximum(Calendar.SECOND));
+        return cal.getTime();
+    }
+
+
+    /**
+     * 日期相减,获取天数
+     * @param currentDate
+     * @param targetDate
+     * @return
+     */
+    public static long minusDate(Date currentDate,Date targetDate){
+        LocalDate currentLocalDate = currentDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        LocalDate targetLocalDate = targetDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        return targetLocalDate.until(currentLocalDate, ChronoUnit.DAYS);
+    }
+
+}

+ 191 - 0
backend-common/src/main/java/utils/ECDSAUtil.java

@@ -0,0 +1,191 @@
+package utils;
+
+import javax.crypto.KeyAgreement;
+import javax.xml.bind.DatatypeConverter;
+import java.security.*;
+import java.security.spec.ECGenParameterSpec;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+
+/**
+ * ECCDSA加签验签工具类
+ * @author Administrator
+ *
+ */
+public class ECDSAUtil {
+
+	private static final String SIGNALGORITHMS = "SHA256withECDSA";
+	private static final String ALGORITHM = "EC";
+	private static final String SECP256K1 = "secp256k1";
+
+
+	public static void main(final String[] args) throws Exception {
+
+
+		//        生成公钥私钥
+		final KeyPair keyPair1 = getKeyPair();
+		final PublicKey publicKey1 = keyPair1.getPublic();
+		final PrivateKey privateKey1 = keyPair1.getPrivate();
+		//密钥转16进制字符串
+		final String publicKey = HexUtil.encodeHexString(publicKey1.getEncoded());
+		final String privateKey = HexUtil.encodeHexString(privateKey1.getEncoded());
+		//String privateKey2 = HexUtil.encodeHexString(bytesToHex(pubkeyhex));
+		System.out.println("生成公钥:"+publicKey);
+		System.out.println("生成私钥:"+privateKey);
+		//16进制字符串转密钥对象
+		final PrivateKey privateKey2 = getPrivateKey(privateKey);
+		final PublicKey publicKey2 = getPublicKey(publicKey);
+		//加签验签
+		final String data="需要签名的数据\b23\b21\r\n";
+		final String signECDSA = signECDSA(privateKey2, data);
+		System.out.println("signECDSA:"+signECDSA);
+		System.out.println("data: "+data);
+		final boolean verifyECDSA = verifyECDSA(publicKey2, signECDSA, data);
+		System.out.println("验签结果:"+verifyECDSA);
+
+		verifyecdsa_sign1("第一个二维码");
+		verifyecdsa_sign2("第二个二维码");
+
+	}
+
+	public static void verifyecdsa_sign(final String data, final String pubkey, final String sign) throws Exception
+	{
+		System.out.println("验证公钥:"+pubkey);
+		System.out.println("验证数据:"+data);
+		System.out.println("验证签名:"+sign);
+		final PublicKey publicKey = getPublicKey(pubkey);
+		boolean verifyECDSA = verifyECDSA_jxl(publicKey, sign, data);
+		System.out.println("验签结果:"+verifyECDSA);
+	}
+
+	public static void verifyecdsa_sign1(final String sttitle)  throws Exception
+	{
+		System.out.println("验证--------------------------------------------"+sttitle );
+		final String datas = "3930303034303031303032353030303120062317084014952068DB5C0989EEB00F1F128BBC990DF9C1D0CCAFFDEA3973021F945AF8B2589C955EF3181F8CA05B3059301306072A8648CE3D020106082A8648CE3D03010703420004B29046B2F93A2BFCF497390FEF8E1BFE0C34FA89D3A45AF925A22571B1C1B5E7A7409A73A7F8F9C1A61D3F9FF284926819EAEBF2E6D4968A46F112B0811A4E0501A10100";
+		final String pubkey = "3059301306072A8648CE3D020106082A8648CE3D0301070342000432BA4502E1F6417C8C2D8137BE503709F1C33E1CA99C432EFC53DA8F2FF0A2AD4C4877301DEBB4522D0F733773279A8B70BA3AB2B263546F16AA0BD79F67ABC8";
+		final String sign = "304402205E4799D8E8199184FB7613000781EE5D7AE2E27121733E8B391FD33C51BD80C7022039EAF55B1C3958F39764D64EC18945E1A63AB7DA2DD9D6D1BA9F1BC95FDDCCEB";
+		verifyecdsa_sign(datas, pubkey, sign);
+	}
+
+	public static void verifyecdsa_sign2(final String sttitle)  throws Exception
+	{
+		System.out.println("验证--------------------------------------------"+sttitle );
+		final String datas = "3930303034303031303032353030303120062311462329072068DB5C0989EEB00F1F128BBC990DF9C1D0CCAFFDEA3973021F945AF8B2589C955EF2CC8F8CA05B3059301306072A8648CE3D020106082A8648CE3D03010703420004C507CABC29EAA162A33A14D190BA3100204D82E6D3F20E54BCD73A3FD78F657B67BB2E783692CB8D6A75516257633148CBA492DCE19B32410DEE1B62EAE1DAAB01A10100";
+		final String pubkey = "3059301306072A8648CE3D020106082A8648CE3D0301070342000432BA4502E1F6417C8C2D8137BE503709F1C33E1CA99C432EFC53DA8F2FF0A2AD4C4877301DEBB4522D0F733773279A8B70BA3AB2B263546F16AA0BD79F67ABC8";
+		final String sign = "304402209903A6794AF9E758295E486064FC6ECB63F62E5F04F66579E99A83800D32CB0902203984B7421A2E337388C782E2FF86F23D9EF313BA5D73E598D6BE2F0B99B4FE69";
+		verifyecdsa_sign(datas, pubkey, sign);
+	}
+
+	/**
+	 * 加签
+	 * @param privateKey 私钥
+	 * @param data 数据
+	 * @return
+	 */
+	public static String signECDSA(final PrivateKey privateKey, final String data) {
+		final String result = "";
+		try {
+			//执行签名
+			final Signature signature = Signature.getInstance(SIGNALGORITHMS);
+			signature.initSign(privateKey);
+			signature.update(data.getBytes());
+			final byte[] sign = signature.sign();
+			return HexUtil.encodeHexString(sign);
+		} catch (final Exception e) {
+			e.printStackTrace();
+		}
+		return result;
+	}
+	/**
+	 * 验签
+	 * @param publicKey 公钥
+	 * @param signed 签名
+	 * @param data 数据
+	 * @return
+	 */
+	public static boolean verifyECDSA_jxl(final PublicKey publicKey, final String signed, final String data) {
+		try {
+			//验证签名
+			final Signature signature = Signature.getInstance(SIGNALGORITHMS);
+			signature.initVerify(publicKey);
+			final byte[] datahex = HexUtil.decode(data);
+			signature.update(datahex);
+			final byte[] hex = HexUtil.decode(signed);
+			final boolean bool = signature.verify(hex);
+			System.out.println("验证:" + bool);
+			return bool;
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return false;
+	}
+	/**
+	 * 验签
+	 * @param publicKey 公钥
+	 * @param signed 签名
+	 * @param data 数据
+	 * @return
+	 */
+	public static boolean verifyECDSA(final PublicKey publicKey, final String signed, final String data) {
+		try {
+			//验证签名
+			final Signature signature = Signature.getInstance(SIGNALGORITHMS);
+			signature.initVerify(publicKey);
+			signature.update(data.getBytes());
+			final byte[] hex = HexUtil.decode(signed);
+			final boolean bool = signature.verify(hex);
+			System.out.println("验证:" + bool);
+			return bool;
+		} catch (final Exception e) {
+			e.printStackTrace();
+		}
+		return false;
+	}
+
+	/**
+	 * 从string转private key
+	 * @param key 私钥的字符串
+	 * @return
+	 * @throws Exception
+	 */
+	public static PrivateKey getPrivateKey(final String key) throws Exception {
+
+		final byte[] bytes = DatatypeConverter.parseHexBinary(key);
+		final PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);
+		final KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
+		return keyFactory.generatePrivate(keySpec);
+	}
+
+	/**
+	 * 从string转publicKey
+	 * @param key 公钥的字符串
+	 * @return
+	 * @throws Exception
+	 */
+	public static PublicKey getPublicKey(final String key) throws Exception {
+
+		final byte[] bytes = DatatypeConverter.parseHexBinary(key);
+		final X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);
+		final KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
+		return keyFactory.generatePublic(keySpec);
+	}
+
+
+
+
+	/**
+	 * 生成密钥对
+	 * @return
+	 * @throws Exception
+	 */
+	public static KeyPair getKeyPair() throws Exception {
+
+		final ECGenParameterSpec ecSpec = new ECGenParameterSpec(SECP256K1);
+		final KeyPairGenerator kf = KeyPairGenerator.getInstance(ALGORITHM);
+		kf.initialize(ecSpec, new SecureRandom());
+		final KeyPair keyPair = kf.generateKeyPair();
+		return keyPair;
+	}
+
+
+}

+ 88 - 0
backend-common/src/main/java/utils/EmailUtils.java

@@ -0,0 +1,88 @@
+package utils;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.mail.*;
+import javax.mail.internet.*;
+import java.util.Date;
+import java.util.List;
+import java.util.Properties;
+
+@Component
+@Slf4j
+public class EmailUtils {
+
+    @Value("${email.host}")
+    private String host;
+    @Value("${email.port}")
+    private Integer port;
+    @Value("${email.account}")
+    private String account;
+    @Value("${email.password}")
+    private String password;
+
+    private String sender = "信息云";
+
+    private static final String CONTENT_MIME_TYPE = "text/html;charset=utf-8";
+
+    private static final String PROTOCOL = "smtp";
+
+    public boolean sendMail(String subject, String content, List<String> emails) {
+        Properties props = new Properties();// 创建属性对象
+        props.put("mail.smtp.host", this.host);// 设置smtp服务器地址
+        props.put("mail.smtp.port", this.port);// 设置smtp服务器端口
+        props.put("mail.smtp.auth", "true");// 设置服务器smtp需要验证
+
+        Authenticator authenticator = createAuth(account, AesUtils.decrypt(password));
+        Session session = Session.getInstance(props, authenticator);
+        session.setDebug(false);
+        Transport trans = null;
+        try {
+            MimeMessage msg = new MimeMessage(session);
+            String nickName = MimeUtility.encodeText(sender);// 设置发件人昵称
+            msg.setFrom(new InternetAddress(nickName + " <" + account + ">")); // 设置发件人显示内容
+            msg.setSubject(subject);
+            InternetAddress[] replyAddress = {new InternetAddress(account)};
+            msg.setReplyTo(replyAddress);
+            MimeBodyPart mBodyContent = new MimeBodyPart();
+            mBodyContent.setContent(content, CONTENT_MIME_TYPE);
+            Multipart mPart = new MimeMultipart();
+            mPart.addBodyPart(mBodyContent);
+            msg.setContent(mPart);
+            msg.setSentDate(new Date());
+            trans = session.getTransport(PROTOCOL);
+            for (String email : emails) {
+                trans.connect(host, account.substring(0, account.indexOf("@")),
+                        AesUtils.decrypt(password));
+                msg.setRecipients(Message.RecipientType.TO, email);
+                trans.sendMessage(msg, msg.getAllRecipients());
+                log.info("send success:" + email);
+            }
+        } catch (Exception e) {
+            log.error("send mail error : " + e.getMessage(), e);
+            return false;
+        } finally {
+            if (trans != null) {
+                try {
+                    trans.close();
+                } catch (MessagingException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return true;
+    }
+
+    private static Authenticator createAuth(String user, String password) {
+        final PasswordAuthentication authentication = new PasswordAuthentication(user, password);
+        return (new Authenticator() {
+            public PasswordAuthentication getPasswordAuthentication() {
+                return authentication;
+            }
+        });
+    }
+
+
+}

+ 44 - 0
backend-common/src/main/java/utils/FileUtils.java

@@ -0,0 +1,44 @@
+package utils;
+
+import org.apache.commons.lang.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.*;
+import java.time.chrono.ChronoZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * @author tangxiangan
+ * file工具类
+ */
+public class FileUtils {
+
+    /**
+     * multipartFile转file
+     * @param multipartFile
+     * @return
+     */
+    public static File transferToFile(MultipartFile multipartFile) {
+        //选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 。
+        File file = null;
+        try {
+            String originalFilename = multipartFile.getOriginalFilename();
+            String[] filename = originalFilename.split("\\.",2);
+            file = File.createTempFile(filename[0], filename[1]);    //注意下面的 特别注意!!!
+            multipartFile.transferTo(file);
+            file.deleteOnExit();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return file;
+    }
+
+}

+ 60 - 0
backend-common/src/main/java/utils/HexUtil.java

@@ -0,0 +1,60 @@
+package utils;
+
+/**
+ * 16进制字符串与byte数组转换
+ * @author Administrator
+ *
+ */
+public final class HexUtil {
+	private static final char[] HEX = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+
+	public HexUtil() {
+	}
+
+	/**
+	 * byte数组转16进制字符串
+	 * @param bytes
+	 * @return
+	 */
+	public static String encodeHexString(byte[] bytes) {
+		int nBytes = bytes.length;
+		char[] result = new char[2 * nBytes];
+		int j = 0;
+		byte[] var4 = bytes;
+		int var5 = bytes.length;
+
+		for(int var6 = 0; var6 < var5; ++var6) {
+			byte aByte = var4[var6];
+			result[j++] = HEX[(240 & aByte) >>> 4];
+			result[j++] = HEX[15 & aByte];
+		}
+
+		return new String(result);
+	}
+
+	/**
+	 * 16进制字符串转byte数组
+	 * @param s 字符串
+	 * @return
+	 */
+	public static byte[] decode(CharSequence s) {
+		int nChars = s.length();
+		if (nChars % 2 != 0) {
+			throw new IllegalArgumentException("Hex-encoded string must have an even number of characters");
+		} else {
+			byte[] result = new byte[nChars / 2];
+
+			for(int i = 0; i < nChars; i += 2) {
+				int msb = Character.digit(s.charAt(i), 16);
+				int lsb = Character.digit(s.charAt(i + 1), 16);
+				if (msb < 0 || lsb < 0) {
+					throw new IllegalArgumentException("Detected a Non-hex character at " + (i + 1) + " or " + (i + 2) + " position");
+				}
+
+				result[i / 2] = (byte)(msb << 4 | lsb);
+			}
+
+			return result;
+		}
+	}
+}

+ 326 - 0
backend-common/src/main/java/utils/HttpClientUtils.java

@@ -0,0 +1,326 @@
+package utils;
+
+import constant.CommonConstant;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.*;
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.TrustStrategy;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicHttpResponse;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.CollectionUtils;
+
+import javax.net.ssl.SSLContext;
+import java.net.URLEncoder;
+import java.nio.charset.Charset;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+/**
+ * 处理简单http请求的类
+ *
+ * @author tangxiangan
+ */
+public class HttpClientUtils {
+    private static final Logger LOGGER = LoggerFactory.getLogger(HttpClientUtils.class);
+
+    private static CloseableHttpClient getHttpClient() {
+        TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
+
+        SSLContext sslContext;
+        try {
+            sslContext = org.apache.http.ssl.SSLContexts.custom()
+                    .loadTrustMaterial(null, acceptingTrustStrategy)
+                    .build();
+
+            SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
+
+            return HttpClients.custom()
+                    .setSSLSocketFactory(csf)
+                    .build();
+
+        } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
+            LOGGER.error(e.getMessage(), e);
+        }
+
+        LOGGER.warn("error create http client, create default client will not support https!!!!");
+        return HttpClients.createDefault();
+    }
+
+
+    // 处理GET类请求,参数URL应包含完整的请求参数
+    public static String doGet(String url) {
+        return doGet(url, null);
+    }
+
+    public static String doGet(String url, Map<String, Object> params) {
+        return doGet(url, params, null);
+    }
+
+    public static String doGet(String url, Map<String, Object> params, Map<String, String> headers) {
+        try {
+            CloseableHttpClient httpClient = getHttpClient();
+            StringBuilder urlBuilder = new StringBuilder(url);
+            int i = 0;
+            if (!CollectionUtils.isEmpty(params)) for (String key : params.keySet()) {
+                urlBuilder.append((i == 0) ? "?" : "&");
+                urlBuilder.append(key).append("=");
+                if (params.get(key) != null) {
+                    urlBuilder.append(URLEncoder.encode(String.valueOf(params.get(key)), "utf-8"));
+                }
+                i++;
+            }
+
+            HttpGet httpGet = new HttpGet(urlBuilder.toString());
+
+            if (!CollectionUtils.isEmpty(headers)) {
+                for (String key : headers.keySet()) {
+                    httpGet.setHeader(key, headers.get(key));
+                }
+            }
+
+            CloseableHttpResponse response = httpClient.execute(httpGet);
+            HttpEntity entity = response.getEntity();
+            String content = EntityUtils.toString(entity);
+            EntityUtils.consume(entity);
+            return content;
+        } catch (Exception e) {
+            LOGGER.error("ERROR, call http get" + e.getMessage(), e);
+        }
+        return null;
+    }
+
+    /**
+     * 处理POST类请求,表格类型
+     */
+    public static String doPost(String url, Map<String, String> params) {
+        return doPost(url, params, null);
+    }
+
+    // 处理POST类请求
+    public static String doPost(String url, Object object) {
+        return doPost(url, object, null);
+    }
+
+    /**
+     * 处理POST类请求,body类型
+     */
+    public static String doPost(String url, Object body, Map<String, String> headers) {
+        try {
+            CloseableHttpClient httpClient = getHttpClient();
+            HttpPost httpPost = new HttpPost(url);
+            httpPost.setHeader("Accept", "application/json; charset=UTF-8");
+            httpPost.setHeader("Content-Type", "application/json; charset=UTF-8");
+            RequestConfig config = RequestConfig.custom()
+                    .setConnectionRequestTimeout(30000)
+                    .setConnectTimeout(30000).setSocketTimeout(30000).build();
+
+
+            if (body == null) {
+                body = new Object();
+            }
+
+            StringEntity strEntity = new StringEntity(JsonUtils.getJsonString(body),
+                    Charset.forName("UTF-8"));
+            httpPost.setEntity(strEntity);
+            httpPost.setConfig(config);
+
+            if (!CollectionUtils.isEmpty(headers)) {
+                for (Entry<String, String> entry : headers.entrySet()) {
+                    httpPost.setHeader(entry.getKey(), entry.getValue());
+                }
+            }
+
+            CloseableHttpResponse response = httpClient.execute(httpPost);
+            //资源创建成功 返回状态码201 返回数据为空
+            if(response.getStatusLine().getStatusCode() == HttpStatus.SC_CREATED){
+                return CommonConstant.RESULT_SUCCESS;
+            }
+            HttpEntity entity = response.getEntity();
+            String content = EntityUtils.toString(entity);
+            EntityUtils.consume(entity);
+            return content;
+        } catch (Exception e) {
+            LOGGER.error("ERROR, call http post" + e.getMessage(), e);
+        }
+        return null;
+    }
+
+
+    /**
+     * 处理POST类请求,表格类型
+     */
+    public static String doPost(String url, Map<String, String> params, Map<String, String> headers) {
+        try {
+            CloseableHttpClient httpClient = getHttpClient();
+            HttpPost httpPost = new HttpPost(url);
+            httpPost.setHeader("Accept", "application/json; charset=UTF-8");
+            RequestConfig config = RequestConfig.custom()
+                    .setConnectionRequestTimeout(60000)
+                    .setConnectTimeout(30000).setSocketTimeout(30000).build();
+
+            List<BasicNameValuePair> formParams = new ArrayList<>();
+
+            if (!CollectionUtils.isEmpty(params)) {
+                for (Entry<String, String> entry : params.entrySet()) {
+                    formParams.add(new BasicNameValuePair(entry.getKey(), entry
+                            .getValue()));
+                }
+            }
+
+            StringEntity strEntity = new UrlEncodedFormEntity(formParams,
+                    Charset.forName("UTF-8"));
+            httpPost.setEntity(strEntity);
+            httpPost.setConfig(config);
+
+            if (!CollectionUtils.isEmpty(headers)) {
+                for (Entry<String, String> entry : headers.entrySet()) {
+                    httpPost.setHeader(entry.getKey(), entry.getValue());
+                }
+            }
+
+            CloseableHttpResponse response = httpClient.execute(httpPost);
+            HttpEntity entity = response.getEntity();
+            String content = EntityUtils.toString(entity);
+            EntityUtils.consume(entity);
+            return content;
+        } catch (Exception e) {
+            LOGGER.error("ERROR, call http post" + e.getMessage(), e);
+        }
+        return null;
+    }
+
+    public static String doPut(String url, Map<String, Object> params) {
+        return doPut(url, params, null);
+    }
+
+    public static String doPut(String url, Map<String, Object> params, Map<String, String> headers) {
+        CloseableHttpClient httpClient = getHttpClient();
+        CloseableHttpResponse response;
+        try {
+
+            StringBuilder urlBuilder = new StringBuilder(url);
+            int i = 0;
+            if (!CollectionUtils.isEmpty(params)) {
+                for (Entry<String, Object> entry : params.entrySet()) {
+                    urlBuilder.append((i == 0) ? "?" : "&");
+                    urlBuilder.append(entry.getKey()).append("=").append(entry.getValue());
+                    i++;
+                }
+            }
+            HttpPut httpPut = new HttpPut(urlBuilder.toString());
+            if (!CollectionUtils.isEmpty(headers)) {
+                for (Entry<String, String> entry : headers.entrySet()) {
+                    httpPut.setHeader(entry.getKey(), entry.getValue());
+                }
+            }
+
+            response = httpClient.execute(httpPut);
+            HttpEntity entity = response.getEntity();
+            String content = EntityUtils.toString(entity);
+            EntityUtils.consume(entity);
+            return content;
+        } catch (Exception e) {
+            LOGGER.error("ERROR, call http put" + e.getMessage(), e);
+        }
+        return null;
+    }
+
+    /**
+     * contentType 为text/plain 或application/json
+     * @param url
+     * @param body
+     * @param headers
+     * @return
+     */
+    public static String doPut(String url, Object body, Map<String, String> headers,String contentType) {
+        CloseableHttpClient httpClient = getHttpClient();
+        CloseableHttpResponse response;
+        HttpPut httpPut = new HttpPut(url);
+        httpPut.setHeader("Content-Type", contentType+"; charset=UTF-8");
+        try {
+            if (body == null) {
+                body = new Object();
+            }
+            if (!CollectionUtils.isEmpty(headers)) {
+                for (Entry<String, String> entry : headers.entrySet()) {
+                    httpPut.setHeader(entry.getKey(), entry.getValue());
+                }
+            }
+
+            StringEntity strEntity ;
+            if(contentType.equals("application/json")){
+                strEntity = new StringEntity(JsonUtils.getJsonString(body), Charset.forName("UTF-8"));
+            }else{
+                strEntity = new StringEntity(body.toString());
+            }
+            httpPut.setEntity(strEntity);
+            response = httpClient.execute(httpPut);
+            if(response.getStatusLine().getStatusCode() == HttpStatus.SC_NO_CONTENT){
+                return CommonConstant.RESULT_SUCCESS;
+            }
+            HttpEntity entity = response.getEntity();
+            String content = EntityUtils.toString(entity);
+            EntityUtils.consume(entity);
+            return content;
+        } catch (Exception e) {
+            LOGGER.error("ERROR, call http put" + e.getMessage(), e);
+        }
+        return null;
+    }
+
+    public static String doDelete(String url) {
+        return doDelete(url, null);
+    }
+
+    public static String doDelete(String url, Map<String, Object> params) {
+        return doDelete(url, params, null);
+    }
+
+    public static String doDelete(String url, Map<String, Object> params, Map<String, String> headers) {
+        try {
+            CloseableHttpClient httpClient = getHttpClient();
+            StringBuilder urlBuilder = new StringBuilder(url);
+            int i = 0;
+            if (!CollectionUtils.isEmpty(params)) for (String key : params.keySet()) {
+                urlBuilder.append((i == 0) ? "?" : "&");
+                urlBuilder.append(key).append("=").append(params.get(key));
+                i++;
+            }
+            HttpDelete httpDelete = new HttpDelete(urlBuilder.toString());
+
+            if (!CollectionUtils.isEmpty(headers)) {
+                for (String key : headers.keySet()) {
+                    httpDelete.setHeader(key, headers.get(key));
+                }
+            }
+
+            CloseableHttpResponse response = httpClient.execute(httpDelete);
+            if(response.getStatusLine().getStatusCode() == HttpStatus.SC_NO_CONTENT){
+                return CommonConstant.STRING_EMPTY;
+            }
+            HttpEntity entity = response.getEntity();
+            String content = EntityUtils.toString(entity);
+            EntityUtils.consume(entity);
+            return content;
+        } catch (Exception e) {
+            LOGGER.error("ERROR, call http get" + e.getMessage(), e);
+        }
+        return null;
+    }
+}

+ 134 - 0
backend-common/src/main/java/utils/JsonUtils.java

@@ -0,0 +1,134 @@
+package utils;
+
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.util.StringUtils;
+import pojo.ResultMap;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+public class JsonUtils {
+    private final static SimpleDateFormat DEFAULT_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+    /**
+     * 将对象转换成JSON字符串
+     *
+     * @param bean 可以为基本的object 或者为 数组
+     * @return JSON字符串
+     */
+    public static String getJsonString(Object bean) {
+        return getJsonString(bean, DEFAULT_FORMAT);
+    }
+
+    /**
+     * 将对象转换成JSON字符串
+     *
+     * @param bean 可以为基本的object 或者为 数组
+     * @return JSON字符串
+     */
+    public static String getJsonString(Object bean, DateFormat dateFormat) {
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        mapper.setDateFormat(dateFormat);
+        try {
+            return mapper.writeValueAsString(bean);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    /**
+     * 将json格式的字符串的转化为Bean对象
+     *
+     * @param <T>
+     * @param jsonStr
+     * @param clazz
+     * @return
+     */
+    public static <T> T jsonStringToBean(String jsonStr, Class<T> clazz, DateFormat dateFormat) {
+        if (StringUtils.isEmpty(jsonStr)) {
+            return null;
+        }
+        try {
+            ObjectMapper mapper = new ObjectMapper();
+            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            mapper.setDateFormat(dateFormat);
+            return mapper.readValue(jsonStr, clazz);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 将json格式的字符串的转化为Bean对象
+     *
+     * @param <T>
+     * @param jsonStr
+     * @param clazz
+     * @return
+     */
+    public static <T> T jsonStringToBean(String jsonStr, Class<T> clazz) {
+        return jsonStringToBean(jsonStr, clazz, DEFAULT_FORMAT);
+    }
+
+    /**
+     * 将json格式的字符串(数组形式)的转化为List对象
+     *
+     * @param <T>
+     * @param jsonArrStr
+     * @param clazz      List中对象类型
+     * @return
+     */
+    public static <T> List<T> jsonStringToList(String jsonArrStr, Class<T> clazz) {
+        return jsonStringToList(jsonArrStr, clazz, DEFAULT_FORMAT);
+    }
+
+    /**
+     * 将json格式的字符串(数组形式)的转化为List对象
+     *
+     * @param <T>
+     * @param jsonArrStr
+     * @param clazz      List中对象类型
+     * @return
+     */
+    public static <T> List<T> jsonStringToList(String jsonArrStr, Class<T> clazz, DateFormat dateFormat) {
+        if (StringUtils.isEmpty(jsonArrStr)) {
+            return new ArrayList<>();
+        }
+        try {
+            ObjectMapper mapper = new ObjectMapper();
+            mapper.setDateFormat(dateFormat);
+            JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, clazz);
+            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            return mapper.readValue(jsonArrStr, javaType);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ArrayList<>();
+        }
+    }
+
+
+    public static <T> ResultMap<T> jsonStringToResultMap(String jsonArrStr, Class<T> clazz) {
+        if (StringUtils.isEmpty(jsonArrStr)) {
+            return new ResultMap<>();
+        }
+
+        try {
+            ObjectMapper mapper = new ObjectMapper();
+            mapper.setDateFormat(DEFAULT_FORMAT);
+            JavaType javaType = mapper.getTypeFactory().constructParametricType(ResultMap.class, clazz);
+            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            return mapper.readValue(jsonArrStr, javaType);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+}

+ 34 - 0
backend-common/src/main/java/utils/MD5Utils.java

@@ -0,0 +1,34 @@
+package utils;
+
+import java.security.MessageDigest;
+
+/**
+ * tangxiangan
+ */
+public class MD5Utils {
+
+    public static String encode(String s) {
+        char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+        try {
+            byte[] btInput = s.getBytes();
+            // 获得MD5摘要算法的 MessageDigest 对象
+            MessageDigest mdInst = MessageDigest.getInstance("MD5");
+            // 使用指定的字节更新摘要
+            mdInst.update(btInput);
+            // 获得密文
+            byte[] md = mdInst.digest();
+            // 把密文转换成十六进制的字符串形式
+            int j = md.length;
+            char[] str = new char[j * 2];
+            int k = 0;
+            for (byte byte0 : md) {
+                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
+                str[k++] = hexDigits[byte0 & 0xf];
+            }
+            return new String(str);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+}

+ 66 - 0
backend-common/src/main/java/utils/PageUtils.java

@@ -0,0 +1,66 @@
+package utils;
+
+import org.apache.commons.lang.StringUtils;
+import pojo.PageVO;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PageUtils {
+	public static Integer getParamToInt(Integer param, Integer defaultValue) {
+		Integer num = defaultValue;
+		if (param != null && param > 0) {
+			num = param;
+		}
+		return num;
+	}
+
+	public static String getOrderByClause(String orderColumn, String orderRule, String defaultOrderByClause) {
+		// orderColumn 排序字段
+		// orderRule 排序规则:ASC/DESC缺省为:DESC
+		// 获取排序信息
+		String orderByClause = defaultOrderByClause;
+		// 构造排序子句
+		if (StringUtils.isNotBlank(orderColumn)) {
+			orderByClause = orderColumn + " DESC";
+			if (StringUtils.isNotBlank(orderRule)) {
+				orderByClause = orderColumn + " " + orderRule;
+			}
+		}
+		return orderByClause;
+	}
+
+	public static String getLikeQuery(String name){
+		if (StringUtils.isNotBlank(name)) {
+			return "%"+name+"%";
+		}
+		return name;
+	}
+
+	public static <E> PageVO<E> pageByList(int pageNum, int pageSize, List<E> infoList) {
+		List<E> iList = new ArrayList<E>();
+		int begin = (pageNum - 1) * pageSize;
+		int end = pageNum * pageSize;
+
+		for (int i = 0; i < infoList.size(); i++) {
+			if (i >= begin && i < end) {
+				iList.add(infoList.get(i));
+			}
+		}
+
+		PageVO<E> pageVO = new PageVO<E>();
+		pageVO.setList(iList);
+		pageVO.setPageNum(pageNum);
+		pageVO.setPageSize(pageSize);
+		if (infoList.size() % pageSize == 0) {
+			pageVO.setPages(infoList.size() / pageSize);
+			pageVO.setSize(infoList.size() / pageSize);
+		} else {
+			pageVO.setPages(infoList.size() / pageSize + 1);
+			pageVO.setSize(infoList.size() / pageSize + 1);
+		}
+		pageVO.setTotal(infoList.size());
+		return pageVO;
+	}
+
+}

+ 72 - 0
backend-common/src/main/java/utils/QueryUtils.java

@@ -0,0 +1,72 @@
+package utils;
+
+
+import com.github.pagehelper.PageInfo;
+import constant.CommonConstant;
+import org.springframework.beans.BeanUtils;
+import org.springframework.util.CollectionUtils;
+import pojo.PageVO;
+import pojo.QueryParams;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.stream.Collectors;
+
+public class QueryUtils {
+
+    public static String generateLikeString(String string){
+        try {
+            string = URLDecoder.decode(URLDecoder.decode(string, CommonConstant.ENCODING_UTF8), CommonConstant.ENCODING_UTF8);
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException("unsupport encoding");
+        }
+        return "%"+string+"%";
+    }
+
+    public static String generateLikeStringHalf(String string){
+        try {
+            //处理下%和_的问题,应该还有其他通配符
+            string = string.replace(CommonConstant.STRING_PERCENT,"\\" + CommonConstant.STRING_PERCENT)
+                    .replace(CommonConstant.STRING_UNDERLINE,"\\" + CommonConstant.STRING_UNDERLINE);
+            string = URLDecoder.decode(URLEncoder.encode(string, CommonConstant.ENCODING_UTF8), CommonConstant.ENCODING_UTF8);
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException("unsupport encoding");
+        }
+        return string+"%";
+    }
+
+
+
+    public static <T extends QueryParams> void handlePageAndRow(T param) {
+        param.setPage(PageUtils.getParamToInt(param.getPage(), CommonConstant.PAGENUM));
+        param.setRows(PageUtils.getParamToInt(param.getRows(), CommonConstant.PAGESIZE));
+    }
+
+    public static <T extends QueryParams> void handleParam(T param) {
+        Integer pageNum = PageUtils.getParamToInt(param.getPage(), CommonConstant.PAGENUM);
+        Integer pageSize = PageUtils.getParamToInt(param.getRows(), CommonConstant.PAGESIZE);
+        String orderByClause = PageUtils.getOrderByClause(param.getSidx(), param.getSord(), CommonConstant.ORDERBYCLAUSE);
+        param.setOrderByClause(orderByClause);
+        param.setPage(pageNum);
+        param.setRows(pageSize);
+    }
+
+    public static <T,V> PageVO<T> convertPageInfoToVO(PageInfo<V> pageInfo, BeanConverter<V,T> converter){
+        PageVO<T> pageVO = new PageVO<>();
+        BeanUtils.copyProperties(pageInfo,pageVO);
+        pageVO.setList(convertListToVO(pageInfo.getList(),converter));
+        return pageVO;
+    }
+
+
+    public static <T,V> List<T> convertListToVO(List<V> list, BeanConverter<V,T> converter){
+        List<T> voList = new CopyOnWriteArrayList<>();
+        if(!CollectionUtils.isEmpty(list)){
+            voList = list.stream().map(converter::convert).collect(Collectors.toList());
+        }
+        return voList;
+    }
+}

+ 626 - 0
backend-common/src/main/java/utils/RedisUtils.java

@@ -0,0 +1,626 @@
+package utils;
+
+import exception.BackendRuntimeException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class RedisUtils<K, V> {
+
+    @Autowired
+    private RedisTemplate<K, V> redisTemplate;
+
+    public RedisTemplate getInstance() {
+        return redisTemplate;
+    }
+
+    /**
+     * 指定缓存失效时间
+     *
+     * @param key  键
+     * @param time 时间(秒)
+     * @return
+     */
+    public boolean expire(K key, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.expire(key, time, TimeUnit.SECONDS);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 根据key 获取过期时间
+     *
+     * @param key 键 不能为null
+     * @return 时间(秒) 返回0代表为永久有效
+     */
+    public long getExpire(K key) {
+        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 判断key是否存在
+     *
+     * @param key 键
+     * @return true 存在 false不存在
+     */
+    public boolean exists(K key) {
+        try {
+            return redisTemplate.hasKey(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 删除缓存
+     *
+     * @param key 可以传一个值 或多个
+     */
+    @SuppressWarnings("unchecked")
+    public void del(K... key) {
+        if (key != null && key.length > 0) {
+            if (key.length == 1) {
+                redisTemplate.delete(key[0]);
+            } else {
+                redisTemplate.delete(CollectionUtils.arrayToList(key));
+            }
+        }
+    }
+
+    //============================String=============================
+
+    /**
+     * 普通缓存获取
+     *
+     * @param key 键
+     * @return 值
+     */
+    public V get(K key) {
+        return key == null ? null : redisTemplate.opsForValue().get(key);
+    }
+
+    /**
+     * 普通缓存放入
+     *
+     * @param key   键
+     * @param value 值
+     * @return true成功 false失败
+     */
+    public boolean set(K key, V value) {
+        try {
+            redisTemplate.opsForValue().set(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+
+    }
+
+    /**
+     * 普通缓存放入并设置时间
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期
+     * @return true成功 false 失败
+     */
+    public boolean set(K key, V value, long time) {
+        return set(key, value, time, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 普通缓存放入并设置时间
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期
+     * @return true成功 false 失败
+     */
+    public boolean set(K key, V value, long time, TimeUnit timeUnit) {
+        try {
+            if (time > 0) {
+                redisTemplate.opsForValue().set(key, value, time, timeUnit);
+            } else {
+                set(key, value);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 递增
+     *
+     * @param key   键
+     * @param delta 要增加几(大于0)
+     * @return
+     */
+    public long incr(K key, long delta) {
+        if (delta < 0) {
+            throw new BackendRuntimeException("递增因子必须大于0");
+        }
+        return redisTemplate.opsForValue().increment(key, delta);
+    }
+
+    /**
+     * 递减
+     *
+     * @param key   键
+     * @param delta 要减少几(小于0)
+     * @return
+     */
+    public long decr(K key, long delta) {
+        if (delta < 0) {
+            throw new BackendRuntimeException("递减因子必须大于0");
+        }
+        return redisTemplate.opsForValue().increment(key, -delta);
+    }
+
+    //================================Map=================================
+
+    /**
+     * HashGet
+     *
+     * @param key  键 不能为null
+     * @param item 项 不能为null
+     * @return 值
+     */
+    public String hget(K key, String item) {
+        return (String) redisTemplate.opsForHash().get(key, item);
+    }
+
+    /**
+     * 获取hashKey对应的所有键值
+     *
+     * @param key 键
+     * @return 对应的多个键值
+     */
+    public Map<Object, Object> hmget(K key) {
+        return redisTemplate.opsForHash().entries(key);
+    }
+
+    /**
+     * HashSet
+     *
+     * @param key 键
+     * @param map 对应多个键值
+     * @return true 成功 false 失败
+     */
+    public boolean hmset(K key, Map<String, Object> map) {
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * HashSet 并设置时间
+     *
+     * @param key  键
+     * @param map  对应多个键值
+     * @param time 时间(秒)
+     * @return true成功 false失败
+     */
+    public boolean hmset(K key, Map<String, String> map, long time) {
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 向一张hash表中放入数据,如果不存在将创建
+     *
+     * @param key   键
+     * @param item  项
+     * @param value 值
+     * @return true 成功 false失败
+     */
+    public boolean hset(K key, String item, String value) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    public boolean hsetBean(K key, String item, Object value) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 向一张hash表中放入数据,如果不存在将创建
+     *
+     * @param key   键
+     * @param item  项
+     * @param value 值
+     * @param time  时间(秒)  注意:如果已存在的hash表有时间,这里将会替换原有的时间
+     * @return true 成功 false失败
+     */
+    public boolean hset(K key, String item, V value, long time) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 删除hash表中的值
+     *
+     * @param key  键 不能为null
+     * @param item 项 可以使多个 不能为null
+     */
+    public void hdel(K key, String... item) {
+        redisTemplate.opsForHash().delete(key, item);
+    }
+
+    /**
+     * 判断hash表中是否有该项的值
+     *
+     * @param key  键 不能为null
+     * @param item 项 不能为null
+     * @return true 存在 false不存在
+     */
+    public boolean hHasKey(K key, String item) {
+        return redisTemplate.opsForHash().hasKey(key, item);
+    }
+
+    /**
+     * hash递增 如果不存在,就会创建一个 并把新增后的值返回
+     *
+     * @param key  键
+     * @param item 项
+     * @param by   要增加几(大于0)
+     * @return
+     */
+    public double hincr(K key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, by);
+    }
+
+    /**
+     * hash递减
+     *
+     * @param key  键
+     * @param item 项
+     * @param by   要减少记(小于0)
+     * @return
+     */
+    public double hdecr(K key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, -by);
+    }
+
+    //============================set=============================
+
+    /**
+     * 根据key获取Set中的所有值
+     *
+     * @param key 键
+     * @return
+     */
+    public Set<V> sGet(K key) {
+        try {
+            return redisTemplate.opsForSet().members(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 根据value从一个set中查询,是否存在
+     *
+     * @param key   键
+     * @param value 值
+     * @return true 存在 false不存在
+     */
+    public boolean sHasKey(K key, V value) {
+        try {
+            return redisTemplate.opsForSet().isMember(key, value);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将数据放入set缓存
+     *
+     * @param key    键
+     * @param values 值 可以是多个
+     * @return 成功个数
+     */
+    public long sSet(K key, V... values) {
+        try {
+            return redisTemplate.opsForSet().add(key, values);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 将set数据放入缓存
+     *
+     * @param key    键
+     * @param time   时间(秒)
+     * @param values 值 可以是多个
+     * @return 成功个数
+     */
+    public long sSetAndTime(K key, long time, V... values) {
+        try {
+            Long count = redisTemplate.opsForSet().add(key, values);
+            if (time > 0) expire(key, time);
+            return count;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 获取set缓存的长度
+     *
+     * @param key 键
+     * @return
+     */
+    public long sGetSetSize(K key) {
+        try {
+            return redisTemplate.opsForSet().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 移除值为value的
+     *
+     * @param key    键
+     * @param values 值 可以是多个
+     * @return 移除的个数
+     */
+    public long setRemove(K key, Object... values) {
+        try {
+            Long count = redisTemplate.opsForSet().remove(key, values);
+            return count;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+    //===============================list=================================
+
+    /**
+     * 获取list缓存的内容
+     *
+     * @param key   键
+     * @param start 开始
+     * @param end   结束  0 到 -1代表所有值
+     * @return
+     */
+    public List<V> lrange(K key, long start, long end) {
+        try {
+            return redisTemplate.opsForList().range(key, start, end);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 获取list缓存的长度
+     *
+     * @param key 键
+     * @return
+     */
+    public long llen(K key) {
+        try {
+            return redisTemplate.opsForList().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 通过索引 获取list中的值
+     *
+     * @param key   键
+     * @param index 索引  index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
+     * @return
+     */
+    public Object lGetIndex(K key, long index) {
+        try {
+            return redisTemplate.opsForList().index(key, index);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @return
+     */
+    public boolean lpush(K key, V value) {
+        try {
+            redisTemplate.opsForList().leftPush(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    public boolean lpop(K key) {
+        try {
+            redisTemplate.opsForList().leftPop(key);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @return
+     */
+    public boolean rpush(K key, V value) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒)
+     * @return
+     */
+    public boolean lSet(K key, V value, long time) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            if (time > 0) expire(key, time);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @return
+     */
+    public boolean lSet(K key, List<V> value) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒)
+     * @return
+     */
+    public boolean lSet(K key, List<V> value, long time) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            if (time > 0) expire(key, time);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 根据索引修改list中的某条数据
+     *
+     * @param key   键
+     * @param index 索引
+     * @param value 值
+     * @return
+     */
+    public boolean lUpdateIndex(K key, long index, V value) {
+        try {
+            redisTemplate.opsForList().set(key, index, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 移除N个值为value
+     *
+     * @param key   键
+     * @param count 移除多少个
+     * @param value 值
+     * @return 移除的个数
+     */
+    public long lRemove(K key, long count, V value) {
+        try {
+            Long remove = redisTemplate.opsForList().remove(key, count, value);
+            return remove;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    public Boolean hexists(K key, String item) {
+        return !StringUtils.isEmpty(hget(key, item));
+    }
+
+    public Set<K> queryKeys(K pattern) {
+        return redisTemplate.keys(pattern);
+    }
+}
+
+

+ 72 - 0
backend-common/src/main/java/utils/SMSUtils.java

@@ -0,0 +1,72 @@
+package utils;
+
+
+import constant.CommonConstant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import pojo.YunpianSendResult;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Component
+@Slf4j
+public class SMSUtils {
+
+    @Value("${yunpian.sms .apikey:}")
+    private String yunpianSMSApiKey;
+
+    @Value("${yunpian.sms.url:}")
+    private String yunpianSMSUrl;
+
+    //写在配置文件里可能会存在编码问题
+    @Value("${yunpian.sms.sign:}")
+    private String yunpianSMSPrefix;
+
+    public YunpianSendResult sendSMS(String content, List<String> phoneList) {
+        String phoneListStr = StringUtils.join(phoneList, CommonConstant.STRING_SIGN_COMMA);
+        Map<String, String> params = new HashMap<>();
+        params.put("apikey", yunpianSMSApiKey);
+        //需要添加前缀
+        params.put("text", yunpianSMSPrefix + content);
+        params.put("mobile", phoneListStr);
+        String response = HttpClientUtils.doPost(yunpianSMSUrl, params);
+        log.info("返回信息:" + response);
+        return JsonUtils.jsonStringToBean(response, YunpianSendResult.class);
+    }
+
+
+    public static String delHTMLTag(String htmlStr) {
+        String regEx_script = "<script[^>]*?>[\\s\\S]*?<\\/script>"; //定义script的正则表达式
+        String regEx_style = "<style[^>]*?>[\\s\\S]*?<\\/style>"; //定义style的正则表达式
+        String regEx_html = "<[^>]+>"; //定义HTML标签的正则表达式
+
+        Pattern p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
+        Matcher m_script = p_script.matcher(htmlStr);
+        htmlStr = m_script.replaceAll(""); //过滤script标签
+
+        Pattern p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);
+        Matcher m_style = p_style.matcher(htmlStr);
+        htmlStr = m_style.replaceAll(""); //过滤style标签
+
+        Pattern p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
+        Matcher m_html = p_html.matcher(htmlStr);
+        htmlStr = m_html.replaceAll(""); //过滤html标签
+
+        return htmlStr.trim(); //返回文本字符串
+    }
+
+    public static void main(String[] args) {
+        List<String> phoneList = new ArrayList<>();
+        phoneList.add("13148131422");
+        phoneList.add("13148131423");
+        phoneList.add("13148131424");
+        String content = "您正在创建,验证码为111122,十五分钟后失效。请您按照提示填写验证码,切勿将验证码泄露于他人。";
+    }
+}

+ 31 - 0
backend-common/src/main/java/utils/SpringContextUtils.java

@@ -0,0 +1,31 @@
+package utils;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+
+/**
+ * Created by tangxiangan.
+ */
+public class SpringContextUtils implements ApplicationContextAware {
+
+    private static ApplicationContext context;
+
+    @Override
+    public void setApplicationContext(ApplicationContext context) throws BeansException {
+        SpringContextUtils.context = context;
+    }
+
+    public static Object getBean(String beanName) {
+        return context.getBean(beanName);
+    }
+
+    public static <T> T getBean(Class<T> tClass) {
+        return context.getBean(tClass);
+    }
+
+    public static String getProperty(String key) {
+        return context.getEnvironment().getProperty(key);
+    }
+
+}

BIN
backend-core/.DS_Store


+ 225 - 0
backend-core/pom.xml

@@ -0,0 +1,225 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>backend</artifactId>
+        <groupId>cn.kdan.17pdf</groupId>
+        <version>0.0.1</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>cn.kdan.pdf1</groupId>
+    <artifactId>backend-core</artifactId>
+    <name>backend-core</name>
+    <url>http://maven.apache.org</url>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.kdan.17pdf</groupId>
+            <artifactId>backend-common</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+
+
+        <!-- logback  -->
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>1.2.3</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+            <version>1.2.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.logback-extensions</groupId>
+            <artifactId>logback-ext-spring</artifactId>
+            <version>0.1.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jcl-over-slf4j</artifactId>
+            <version>1.7.25</version>
+        </dependency>
+        <!-- logback  -->
+
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.quartz-scheduler</groupId>
+            <artifactId>quartz</artifactId>
+            <version>2.3.0</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-api</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.gitlab4j</groupId>
+            <artifactId>gitlab4j-api</artifactId>
+            <version>4.19.0</version>
+        </dependency>
+        <!-- spring security start -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.security.oauth</groupId>
+            <artifactId>spring-security-oauth2</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework</groupId>
+                    <artifactId>spring-beans</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.springframework</groupId>
+                    <artifactId>spring-core</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.springframework</groupId>
+                    <artifactId>spring-context</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.springframework</groupId>
+                    <artifactId>spring-webmvc</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.security.oauth.boot</groupId>
+            <artifactId>spring-security-oauth2-autoconfigure</artifactId>
+        </dependency>
+        <!-- end -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>net.coobird</groupId>
+            <artifactId>thumbnailator</artifactId>
+            <version>0.4.8</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjweaver</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.offbytwo.jenkins</groupId>
+            <artifactId>jenkins-client</artifactId>
+            <version>0.3.8</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.fasterxml.jackson.core</groupId>
+                    <artifactId>jackson-core</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>com.fasterxml.jackson.core</groupId>
+                    <artifactId>jackson-annotations</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>com.fasterxml.jackson.core</groupId>
+                    <artifactId>jackson-databind</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>backend-core</finalName>
+
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.mybatis.generator</groupId>
+                <artifactId>mybatis-generator-maven-plugin</artifactId>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.22.2</version>
+                <configuration>
+                    <skipTests>true</skipTests>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

BIN
backend-core/src/.DS_Store


BIN
backend-core/src/main/.DS_Store


BIN
backend-core/src/main/java/.DS_Store


BIN
backend-core/src/main/java/cn/.DS_Store


BIN
backend-core/src/main/java/cn/kdan/.DS_Store


BIN
backend-core/src/main/java/cn/kdan/pdf/.DS_Store


BIN
backend-core/src/main/java/cn/kdan/pdf/backend/.DS_Store


+ 32 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/BackendCoreApplication.java

@@ -0,0 +1,32 @@
+package cn.kdan.pdf.backend.core;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+import java.text.SimpleDateFormat;
+
+@SpringBootApplication
+@MapperScan(basePackages = {"cn.kdan.pdf.backend.core.mapper"})
+@EnableScheduling
+public class BackendCoreApplication {
+
+    @Bean
+    public ObjectMapper objectMapper (){
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
+        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
+        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
+        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
+        return objectMapper;
+    }
+    public static void main(String[] args) {
+        SpringApplication.run(BackendCoreApplication.class, args);
+    }
+}

+ 26 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/config/BackendCoreConfig.java

@@ -0,0 +1,26 @@
+package cn.kdan.pdf.backend.core.config;
+
+import annotations.EnableCommonTools;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+import org.springframework.session.web.http.HttpSessionIdResolver;
+import pojo.CustomHttpSessionStrategy;
+
+@Configuration
+@ConfigurationPropertiesScan("cn.kdan.pdf.backend.core.properties")
+@EnableCommonTools
+@Slf4j
+@EnableAspectJAutoProxy
+@EnableCaching
+public class BackendCoreConfig {
+
+    @Bean
+    public HttpSessionIdResolver httpSessionStrategy() {
+        return new CustomHttpSessionStrategy("x-auth-token");
+    }
+
+}

+ 64 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/config/ControllerExceptionHandler.java

@@ -0,0 +1,64 @@
+package cn.kdan.pdf.backend.core.config;
+
+import constant.CommonConstant;
+import exception.BackendRuntimeException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.support.DefaultMessageSourceResolvable;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.MissingServletRequestParameterException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import pojo.ResultMap;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.ConstraintViolationException;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@ControllerAdvice
+public class ControllerExceptionHandler {
+    private final Logger logger = LoggerFactory.getLogger(ControllerExceptionHandler.class);
+
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    @ResponseBody
+    public ResultMap<?> handlerArgumentCheck(MethodArgumentNotValidException ex) {
+        BindingResult bindingResult = ex.getBindingResult();
+        List<FieldError> fieldErrorList = bindingResult.getFieldErrors();
+
+        return new ResultMap<>(CommonConstant.EXCEPTION_CODE_PARAMETERS_ERROR,
+                fieldErrorList.stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining(";")));
+    }
+
+    @ExceptionHandler(BackendRuntimeException.class)
+    @ResponseBody
+    public ResultMap<?> handlerDevOpsRuntimeException(BackendRuntimeException e) {
+        return new ResultMap<>(CommonConstant.EXCEPTION_CODE_RUNTIME_ERROR, e.getMessage());
+    }
+
+    @ExceptionHandler(ConstraintViolationException.class)
+    @ResponseBody
+    public ResultMap<?> handlerConstraintViolationException(ConstraintViolationException e) {
+        return new ResultMap<>(CommonConstant.EXCEPTION_CODE_RUNTIME_ERROR,
+                e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(";")));
+    }
+
+    @ExceptionHandler(Exception.class)
+    @ResponseBody
+    public ResultMap<?> handlerException(Exception e) {
+        logger.info(e.getMessage(), e);
+        return new ResultMap<>(CommonConstant.EXCEPTION_CODE_SERVER_ERROR, "错误信息: " + e.getMessage());
+    }
+
+
+    @ExceptionHandler(MissingServletRequestParameterException.class)
+    @ResponseBody
+    public ResultMap<?> handlerMissingServletRequestParameterException(MissingServletRequestParameterException e) {
+        logger.info(e.getMessage(), e);
+        return new ResultMap<>(CommonConstant.EXCEPTION_CODE_SERVER_ERROR, "参数错误: " + e.getParameterName() + " 缺失");
+    }
+
+}

+ 9 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/config/PermissionConfig.java

@@ -0,0 +1,9 @@
+package cn.kdan.pdf.backend.core.config;
+
+
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class PermissionConfig {
+
+}

+ 64 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/config/RestTemplateConfig.java

@@ -0,0 +1,64 @@
+package cn.kdan.pdf.backend.core.config;
+
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.ssl.SSLContexts;
+import org.apache.http.ssl.TrustStrategy;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.ClientHttpResponse;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.web.client.DefaultResponseErrorHandler;
+import org.springframework.web.client.RestTemplate;
+
+import javax.net.ssl.SSLContext;
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * @author mars
+ * @date 2020/11/24,0024 11:04
+ * Description
+ */
+@Configuration
+public class RestTemplateConfig {
+
+    @Bean
+    public RestTemplate restTemplate(HttpComponentsClientHttpRequestFactory factory) {
+        RestTemplate restTemplate = new RestTemplate(factory);
+        restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
+            @Override
+            public boolean hasError(ClientHttpResponse response) throws IOException {
+                return true;
+            }
+
+            @Override
+            public void handleError(ClientHttpResponse response) throws IOException {
+            }
+        });
+        return restTemplate;
+    }
+
+    @Bean
+    public static HttpComponentsClientHttpRequestFactory generateHttpRequestFactory()
+            throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException {
+        TrustStrategy acceptingTrustStrategy = (x509Certificates, authType) -> true;
+        SSLContext sslContext = SSLContexts
+                .custom()
+                .loadTrustMaterial(null, acceptingTrustStrategy)
+                .build();
+        SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());
+
+        HttpClientBuilder httpClientBuilder = HttpClients.custom();
+        httpClientBuilder.setSSLSocketFactory(connectionSocketFactory);
+        CloseableHttpClient httpClient = httpClientBuilder.build();
+        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
+        factory.setHttpClient(httpClient);
+        return factory;
+    }
+}

+ 110 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/constant/AuthConstant.java

@@ -0,0 +1,110 @@
+package cn.kdan.pdf.backend.core.constant;
+
+public interface AuthConstant {
+
+    int EXCEPTION_CODE_IMAGE_CODE_ERROR = 301;
+    String EXCEPTION_MSG_IMAGE_CODE_ERROR = "图形验证码错误";
+
+
+    String SUCCESS_MSG_CODE_SEND = "验证码发送成功";
+    String EXCEPTION_MSG_CODE_SEND_ERROR = "验证码发送失败";
+    String EXCEPTION_MSG_CODE_ERROR = "验证码输入错误";
+    String EXCEPTION_MSG_EMAIL_CODE_ERROR = "邮箱验证码错误";
+
+    String EXCEPTION_MSG_USER_VERIFY_ERROR = "身份认证失败";
+
+    String VERIFY_CODE_CHECK_SUCCESS = "验证通过";
+
+    String EXCEPTION_MSG_CODE_ACTION_ERROR = "操作类型错误";
+    String EXCEPTION_MSG_CODE_TYPE_ERROR = "发送方式错误";
+
+    int EXCEPTION_CODE_USER_NOT_FOUND = 302;
+    String EXCEPTION_MSG_USER_NOT_FOUND = "当前登录用户没有注册,详细信息请联系管理员";
+
+    int EXCEPTION_CODE_USER_STATUS_IS_FROZEN = 303;
+    String EXCEPTION_MSG_USER_STATUS_IS_FROZEN = "账号正处于冻结状态";
+
+    int EXCEPTION_CODE_USER_STATUS_IS_INACTIVE = 304;
+    String EXCEPTION_MSG_USER_STATUS_IS_INACTIVE = "当前登录用户没有激活或被禁用,详细信息请联系管理员";
+
+    int EXCEPTION_CODE_USER_IS_LOCKED = 305;
+    String EXCEPTION_MSG_USER_IS_LOCKED = "登录尝试次数过多,账号已被锁定";
+
+    int EXCEPTION_CODE_USER_PASSWORD_ERROR = 306;
+    String EXCEPTION_MSG_USER_PASSWORD_ERROR = "账号密码错误";
+
+    int EXCEPTION_CODE_SESSION_NOT_FOUND = 307;
+    String EXCEPTION_MSG_SESSION_NOT_FOUND = "账号不存在";
+
+    int EXCEPTION_CODE_USER_INFO_NOT_COMPLETE = 308;
+    String EXCEPTION_MSG_USER_INFO_NOT_COMPLETE = "用户资料尚未完善!";
+
+    int EXCEPTION_CODE_TOKEN_IS_INVALID = 310;
+    String EXCEPTION_MSG_TOKEN_IS_INVALID = "无效的token或者token已过期";
+
+    int EXCEPTION_CODE_USER_NOT_ORG = 311;
+    String EXCEPTION_MSG_USER_NOT_ORG = "该用户不属于任何机构,请联系系统管理员";
+
+    int EXCEPTION_CODE_USER_PASSWORD_EXPIRED = 312;
+    String EXCEPTION_MSG_USER_PASSWORD_EXPIRED = "用户密码已过期,请修改或重置密码";
+
+    int EXCEPTION_CODE_USER_NOT_LOGIN = 313;
+    String EXCEPTION_MSG_USER_NOT_LOGIN = "用户没有登录,请登录后再访问";
+
+    String EXCEPTION_MSG_NO_PERMISSION = "您没有当前平台的操作权限。";
+
+    int EXCEPTION_CODE_GET_CODE_FAIL = 314;
+    String EXCEPTION_MSG_GET_CODE_FAIL = "获取授权码失败";
+
+    String GET_AUTHORIZE_CODE_SUCCESS = "获取授权码成功";
+    String EXCEPTION_MSG_PLEASE_ADD_AUTH_CONFIG = "请添加OAuth2登录配置";
+
+    int EXCEPTION_CODE_GET_TOKEN_FAIL = 315;
+    String EXCEPTION_MSG_GET_TOKEN_FAIL = "获取token失败";
+
+    int EXCEPTION_CODE_EMAIL_LOGIN_FAIL = 316;
+    String EXCEPTION_MSG_EMAIL_NOT_VERIFY = "当前登陆邮箱未验证,请用手机号登陆";
+
+    String EXCEPTION_MSG_GET_APP_INFO_FAIL = "获取token失败,应用信息为空";
+    String EXCEPTION_MSG_CLIENT_ID_EXISTING = "OAuth2客户端已存在";
+
+    String MSG_LOGIN_SUCCESS = "用户登录成功";
+    String MSG_LOGOUT_SUCCESS = "用户登出成功";
+
+    String MSG_NOT_JOINED_TEAM = "尚未加入团队或已被团队所有者锁定,暂不能登陆";
+
+    String MSG_LOCKED_OR_DELETE = "用户已被锁定或删除";
+
+    String LOCK_PERIOD = "lock_period";
+    String LOCK_TIMES = "lock_times";
+    String LOCK_MINUTES = "lock_minutes";
+    String SESSION_ = "session_";
+    String PASSWORD_ERROR_ = "password_error_";
+
+    String MOBILE_REGEX = "[1][3456789]\\d{9}";
+    String EMAIL_REGEX = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
+
+
+    String ACCESS = "access:";
+    String AUTH_TO_ACCESS = "auth_to_access:";
+    String AUTH = "auth:";
+    String REFRESH_AUTH = "refresh_auth:";
+    String ACCESS_TO_REFRESH = "access_to_refresh:";
+    String REFRESH = "refresh:";
+    String REFRESH_TO_ACCESS = "refresh_to_access:";
+    String CLIENT_ID_TO_ACCESS = "client_id_to_access:";
+    String UNAME_TO_ACCESS = "uname_to_access:";
+
+    String DEFAULT_REDIRECT_URI = "https://127.0.0.1";
+
+    String VERIFY_CODE_KEY = "verifyCode_";
+
+    String VERIFY_CODE_TIME_OUT = "verifyCode_timeout_";
+
+    Long VERIFY_CODE_KEY_EXPIRE_TIME = 15 * 60L;
+
+    Long VERIFY_CODE_KEY_RESEND_TIME = 60L;
+
+    String VERIFY_CODE_SEND_TOO_QUICKLY = "您的操作过于频繁,请稍后再试";
+
+}

+ 33 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/ConvertTypesMapper.java

@@ -0,0 +1,33 @@
+package cn.kdan.pdf.backend.core.mapper;
+
+import cn.kdan.pdf.backend.core.model.ConvertTypes;
+import cn.kdan.pdf.backend.core.model.ConvertTypesExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.session.RowBounds;
+
+public interface ConvertTypesMapper {
+    long countByExample(ConvertTypesExample example);
+
+    int deleteByExample(ConvertTypesExample example);
+
+    int deleteByPrimaryKey(Integer id);
+
+    int insert(ConvertTypes record);
+
+    int insertSelective(ConvertTypes record);
+
+    List<ConvertTypes> selectByExampleWithRowbounds(ConvertTypesExample example, RowBounds rowBounds);
+
+    List<ConvertTypes> selectByExample(ConvertTypesExample example);
+
+    ConvertTypes selectByPrimaryKey(Integer id);
+
+    int updateByExampleSelective(@Param("record") ConvertTypes record, @Param("example") ConvertTypesExample example);
+
+    int updateByExample(@Param("record") ConvertTypes record, @Param("example") ConvertTypesExample example);
+
+    int updateByPrimaryKeySelective(ConvertTypes record);
+
+    int updateByPrimaryKey(ConvertTypes record);
+}

+ 33 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/MembersMapper.java

@@ -0,0 +1,33 @@
+package cn.kdan.pdf.backend.core.mapper;
+
+import cn.kdan.pdf.backend.core.model.Members;
+import cn.kdan.pdf.backend.core.model.MembersExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.session.RowBounds;
+
+public interface MembersMapper {
+    long countByExample(MembersExample example);
+
+    int deleteByExample(MembersExample example);
+
+    int deleteByPrimaryKey(Integer id);
+
+    int insert(Members record);
+
+    int insertSelective(Members record);
+
+    List<Members> selectByExampleWithRowbounds(MembersExample example, RowBounds rowBounds);
+
+    List<Members> selectByExample(MembersExample example);
+
+    Members selectByPrimaryKey(Integer id);
+
+    int updateByExampleSelective(@Param("record") Members record, @Param("example") MembersExample example);
+
+    int updateByExample(@Param("record") Members record, @Param("example") MembersExample example);
+
+    int updateByPrimaryKeySelective(Members record);
+
+    int updateByPrimaryKey(Members record);
+}

+ 42 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/MissionFilesMapper.java

@@ -0,0 +1,42 @@
+package cn.kdan.pdf.backend.core.mapper;
+
+import cn.kdan.pdf.backend.core.model.MissionFiles;
+import cn.kdan.pdf.backend.core.model.MissionFilesExample;
+import cn.kdan.pdf.backend.core.model.MissionFilesWithBLOBs;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.session.RowBounds;
+
+public interface MissionFilesMapper {
+    long countByExample(MissionFilesExample example);
+
+    int deleteByExample(MissionFilesExample example);
+
+    int deleteByPrimaryKey(Integer id);
+
+    int insert(MissionFilesWithBLOBs record);
+
+    int insertSelective(MissionFilesWithBLOBs record);
+
+    List<MissionFilesWithBLOBs> selectByExampleWithBLOBsWithRowbounds(MissionFilesExample example, RowBounds rowBounds);
+
+    List<MissionFilesWithBLOBs> selectByExampleWithBLOBs(MissionFilesExample example);
+
+    List<MissionFiles> selectByExampleWithRowbounds(MissionFilesExample example, RowBounds rowBounds);
+
+    List<MissionFiles> selectByExample(MissionFilesExample example);
+
+    MissionFilesWithBLOBs selectByPrimaryKey(Integer id);
+
+    int updateByExampleSelective(@Param("record") MissionFilesWithBLOBs record, @Param("example") MissionFilesExample example);
+
+    int updateByExampleWithBLOBs(@Param("record") MissionFilesWithBLOBs record, @Param("example") MissionFilesExample example);
+
+    int updateByExample(@Param("record") MissionFiles record, @Param("example") MissionFilesExample example);
+
+    int updateByPrimaryKeySelective(MissionFilesWithBLOBs record);
+
+    int updateByPrimaryKeyWithBLOBs(MissionFilesWithBLOBs record);
+
+    int updateByPrimaryKey(MissionFiles record);
+}

+ 33 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/MissionsMapper.java

@@ -0,0 +1,33 @@
+package cn.kdan.pdf.backend.core.mapper;
+
+import cn.kdan.pdf.backend.core.model.Missions;
+import cn.kdan.pdf.backend.core.model.MissionsExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.session.RowBounds;
+
+public interface MissionsMapper {
+    long countByExample(MissionsExample example);
+
+    int deleteByExample(MissionsExample example);
+
+    int deleteByPrimaryKey(Integer id);
+
+    int insert(Missions record);
+
+    int insertSelective(Missions record);
+
+    List<Missions> selectByExampleWithRowbounds(MissionsExample example, RowBounds rowBounds);
+
+    List<Missions> selectByExample(MissionsExample example);
+
+    Missions selectByPrimaryKey(Integer id);
+
+    int updateByExampleSelective(@Param("record") Missions record, @Param("example") MissionsExample example);
+
+    int updateByExample(@Param("record") Missions record, @Param("example") MissionsExample example);
+
+    int updateByPrimaryKeySelective(Missions record);
+
+    int updateByPrimaryKey(Missions record);
+}

+ 42 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/OrdersMapper.java

@@ -0,0 +1,42 @@
+package cn.kdan.pdf.backend.core.mapper;
+
+import cn.kdan.pdf.backend.core.model.Orders;
+import cn.kdan.pdf.backend.core.model.OrdersExample;
+import cn.kdan.pdf.backend.core.model.OrdersWithBLOBs;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.session.RowBounds;
+
+public interface OrdersMapper {
+    long countByExample(OrdersExample example);
+
+    int deleteByExample(OrdersExample example);
+
+    int deleteByPrimaryKey(Integer id);
+
+    int insert(OrdersWithBLOBs record);
+
+    int insertSelective(OrdersWithBLOBs record);
+
+    List<OrdersWithBLOBs> selectByExampleWithBLOBsWithRowbounds(OrdersExample example, RowBounds rowBounds);
+
+    List<OrdersWithBLOBs> selectByExampleWithBLOBs(OrdersExample example);
+
+    List<Orders> selectByExampleWithRowbounds(OrdersExample example, RowBounds rowBounds);
+
+    List<Orders> selectByExample(OrdersExample example);
+
+    OrdersWithBLOBs selectByPrimaryKey(Integer id);
+
+    int updateByExampleSelective(@Param("record") OrdersWithBLOBs record, @Param("example") OrdersExample example);
+
+    int updateByExampleWithBLOBs(@Param("record") OrdersWithBLOBs record, @Param("example") OrdersExample example);
+
+    int updateByExample(@Param("record") Orders record, @Param("example") OrdersExample example);
+
+    int updateByPrimaryKeySelective(OrdersWithBLOBs record);
+
+    int updateByPrimaryKeyWithBLOBs(OrdersWithBLOBs record);
+
+    int updateByPrimaryKey(Orders record);
+}

+ 33 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/OutputFilesMapper.java

@@ -0,0 +1,33 @@
+package cn.kdan.pdf.backend.core.mapper;
+
+import cn.kdan.pdf.backend.core.model.OutputFiles;
+import cn.kdan.pdf.backend.core.model.OutputFilesExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.session.RowBounds;
+
+public interface OutputFilesMapper {
+    long countByExample(OutputFilesExample example);
+
+    int deleteByExample(OutputFilesExample example);
+
+    int deleteByPrimaryKey(Integer id);
+
+    int insert(OutputFiles record);
+
+    int insertSelective(OutputFiles record);
+
+    List<OutputFiles> selectByExampleWithRowbounds(OutputFilesExample example, RowBounds rowBounds);
+
+    List<OutputFiles> selectByExample(OutputFilesExample example);
+
+    OutputFiles selectByPrimaryKey(Integer id);
+
+    int updateByExampleSelective(@Param("record") OutputFiles record, @Param("example") OutputFilesExample example);
+
+    int updateByExample(@Param("record") OutputFiles record, @Param("example") OutputFilesExample example);
+
+    int updateByPrimaryKeySelective(OutputFiles record);
+
+    int updateByPrimaryKey(OutputFiles record);
+}

+ 33 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/PricingDiscountsMapper.java

@@ -0,0 +1,33 @@
+package cn.kdan.pdf.backend.core.mapper;
+
+import cn.kdan.pdf.backend.core.model.PricingDiscounts;
+import cn.kdan.pdf.backend.core.model.PricingDiscountsExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.session.RowBounds;
+
+public interface PricingDiscountsMapper {
+    long countByExample(PricingDiscountsExample example);
+
+    int deleteByExample(PricingDiscountsExample example);
+
+    int deleteByPrimaryKey(Integer id);
+
+    int insert(PricingDiscounts record);
+
+    int insertSelective(PricingDiscounts record);
+
+    List<PricingDiscounts> selectByExampleWithRowbounds(PricingDiscountsExample example, RowBounds rowBounds);
+
+    List<PricingDiscounts> selectByExample(PricingDiscountsExample example);
+
+    PricingDiscounts selectByPrimaryKey(Integer id);
+
+    int updateByExampleSelective(@Param("record") PricingDiscounts record, @Param("example") PricingDiscountsExample example);
+
+    int updateByExample(@Param("record") PricingDiscounts record, @Param("example") PricingDiscountsExample example);
+
+    int updateByPrimaryKeySelective(PricingDiscounts record);
+
+    int updateByPrimaryKey(PricingDiscounts record);
+}

+ 33 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/PricingsMapper.java

@@ -0,0 +1,33 @@
+package cn.kdan.pdf.backend.core.mapper;
+
+import cn.kdan.pdf.backend.core.model.Pricings;
+import cn.kdan.pdf.backend.core.model.PricingsExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.session.RowBounds;
+
+public interface PricingsMapper {
+    long countByExample(PricingsExample example);
+
+    int deleteByExample(PricingsExample example);
+
+    int deleteByPrimaryKey(Integer id);
+
+    int insert(Pricings record);
+
+    int insertSelective(Pricings record);
+
+    List<Pricings> selectByExampleWithRowbounds(PricingsExample example, RowBounds rowBounds);
+
+    List<Pricings> selectByExample(PricingsExample example);
+
+    Pricings selectByPrimaryKey(Integer id);
+
+    int updateByExampleSelective(@Param("record") Pricings record, @Param("example") PricingsExample example);
+
+    int updateByExample(@Param("record") Pricings record, @Param("example") PricingsExample example);
+
+    int updateByPrimaryKeySelective(Pricings record);
+
+    int updateByPrimaryKey(Pricings record);
+}

+ 42 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/SetPricingsMapper.java

@@ -0,0 +1,42 @@
+package cn.kdan.pdf.backend.core.mapper;
+
+import cn.kdan.pdf.backend.core.model.SetPricings;
+import cn.kdan.pdf.backend.core.model.SetPricingsExample;
+import cn.kdan.pdf.backend.core.model.SetPricingsWithBLOBs;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.session.RowBounds;
+
+public interface SetPricingsMapper {
+    long countByExample(SetPricingsExample example);
+
+    int deleteByExample(SetPricingsExample example);
+
+    int deleteByPrimaryKey(Integer id);
+
+    int insert(SetPricingsWithBLOBs record);
+
+    int insertSelective(SetPricingsWithBLOBs record);
+
+    List<SetPricingsWithBLOBs> selectByExampleWithBLOBsWithRowbounds(SetPricingsExample example, RowBounds rowBounds);
+
+    List<SetPricingsWithBLOBs> selectByExampleWithBLOBs(SetPricingsExample example);
+
+    List<SetPricings> selectByExampleWithRowbounds(SetPricingsExample example, RowBounds rowBounds);
+
+    List<SetPricings> selectByExample(SetPricingsExample example);
+
+    SetPricingsWithBLOBs selectByPrimaryKey(Integer id);
+
+    int updateByExampleSelective(@Param("record") SetPricingsWithBLOBs record, @Param("example") SetPricingsExample example);
+
+    int updateByExampleWithBLOBs(@Param("record") SetPricingsWithBLOBs record, @Param("example") SetPricingsExample example);
+
+    int updateByExample(@Param("record") SetPricings record, @Param("example") SetPricingsExample example);
+
+    int updateByPrimaryKeySelective(SetPricingsWithBLOBs record);
+
+    int updateByPrimaryKeyWithBLOBs(SetPricingsWithBLOBs record);
+
+    int updateByPrimaryKey(SetPricings record);
+}

+ 33 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/SubscriptionsMapper.java

@@ -0,0 +1,33 @@
+package cn.kdan.pdf.backend.core.mapper;
+
+import cn.kdan.pdf.backend.core.model.Subscriptions;
+import cn.kdan.pdf.backend.core.model.SubscriptionsExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.session.RowBounds;
+
+public interface SubscriptionsMapper {
+    long countByExample(SubscriptionsExample example);
+
+    int deleteByExample(SubscriptionsExample example);
+
+    int deleteByPrimaryKey(Integer id);
+
+    int insert(Subscriptions record);
+
+    int insertSelective(Subscriptions record);
+
+    List<Subscriptions> selectByExampleWithRowbounds(SubscriptionsExample example, RowBounds rowBounds);
+
+    List<Subscriptions> selectByExample(SubscriptionsExample example);
+
+    Subscriptions selectByPrimaryKey(Integer id);
+
+    int updateByExampleSelective(@Param("record") Subscriptions record, @Param("example") SubscriptionsExample example);
+
+    int updateByExample(@Param("record") Subscriptions record, @Param("example") SubscriptionsExample example);
+
+    int updateByPrimaryKeySelective(Subscriptions record);
+
+    int updateByPrimaryKey(Subscriptions record);
+}

+ 256 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/ConvertTypes.java

@@ -0,0 +1,256 @@
+package cn.kdan.pdf.backend.core.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class ConvertTypes implements Serializable {
+    private Integer id;
+
+    private String inputType;
+
+    private String outputType;
+
+    private Integer price;
+
+    private Date createdAt;
+
+    private Date updatedAt;
+
+    private Date deletedAt;
+
+    private Integer worker;
+
+    private Integer serialNumber;
+
+    private Integer consumerType;
+
+    private Integer ocr;
+
+    private Integer spPrice;
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public ConvertTypes withId(Integer id) {
+        this.setId(id);
+        return this;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getInputType() {
+        return inputType;
+    }
+
+    public ConvertTypes withInputType(String inputType) {
+        this.setInputType(inputType);
+        return this;
+    }
+
+    public void setInputType(String inputType) {
+        this.inputType = inputType;
+    }
+
+    public String getOutputType() {
+        return outputType;
+    }
+
+    public ConvertTypes withOutputType(String outputType) {
+        this.setOutputType(outputType);
+        return this;
+    }
+
+    public void setOutputType(String outputType) {
+        this.outputType = outputType;
+    }
+
+    public Integer getPrice() {
+        return price;
+    }
+
+    public ConvertTypes withPrice(Integer price) {
+        this.setPrice(price);
+        return this;
+    }
+
+    public void setPrice(Integer price) {
+        this.price = price;
+    }
+
+    public Date getCreatedAt() {
+        return createdAt;
+    }
+
+    public ConvertTypes withCreatedAt(Date createdAt) {
+        this.setCreatedAt(createdAt);
+        return this;
+    }
+
+    public void setCreatedAt(Date createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public Date getUpdatedAt() {
+        return updatedAt;
+    }
+
+    public ConvertTypes withUpdatedAt(Date updatedAt) {
+        this.setUpdatedAt(updatedAt);
+        return this;
+    }
+
+    public void setUpdatedAt(Date updatedAt) {
+        this.updatedAt = updatedAt;
+    }
+
+    public Date getDeletedAt() {
+        return deletedAt;
+    }
+
+    public ConvertTypes withDeletedAt(Date deletedAt) {
+        this.setDeletedAt(deletedAt);
+        return this;
+    }
+
+    public void setDeletedAt(Date deletedAt) {
+        this.deletedAt = deletedAt;
+    }
+
+    public Integer getWorker() {
+        return worker;
+    }
+
+    public ConvertTypes withWorker(Integer worker) {
+        this.setWorker(worker);
+        return this;
+    }
+
+    public void setWorker(Integer worker) {
+        this.worker = worker;
+    }
+
+    public Integer getSerialNumber() {
+        return serialNumber;
+    }
+
+    public ConvertTypes withSerialNumber(Integer serialNumber) {
+        this.setSerialNumber(serialNumber);
+        return this;
+    }
+
+    public void setSerialNumber(Integer serialNumber) {
+        this.serialNumber = serialNumber;
+    }
+
+    public Integer getConsumerType() {
+        return consumerType;
+    }
+
+    public ConvertTypes withConsumerType(Integer consumerType) {
+        this.setConsumerType(consumerType);
+        return this;
+    }
+
+    public void setConsumerType(Integer consumerType) {
+        this.consumerType = consumerType;
+    }
+
+    public Integer getOcr() {
+        return ocr;
+    }
+
+    public ConvertTypes withOcr(Integer ocr) {
+        this.setOcr(ocr);
+        return this;
+    }
+
+    public void setOcr(Integer ocr) {
+        this.ocr = ocr;
+    }
+
+    public Integer getSpPrice() {
+        return spPrice;
+    }
+
+    public ConvertTypes withSpPrice(Integer spPrice) {
+        this.setSpPrice(spPrice);
+        return this;
+    }
+
+    public void setSpPrice(Integer spPrice) {
+        this.spPrice = spPrice;
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        ConvertTypes other = (ConvertTypes) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getInputType() == null ? other.getInputType() == null : this.getInputType().equals(other.getInputType()))
+            && (this.getOutputType() == null ? other.getOutputType() == null : this.getOutputType().equals(other.getOutputType()))
+            && (this.getPrice() == null ? other.getPrice() == null : this.getPrice().equals(other.getPrice()))
+            && (this.getCreatedAt() == null ? other.getCreatedAt() == null : this.getCreatedAt().equals(other.getCreatedAt()))
+            && (this.getUpdatedAt() == null ? other.getUpdatedAt() == null : this.getUpdatedAt().equals(other.getUpdatedAt()))
+            && (this.getDeletedAt() == null ? other.getDeletedAt() == null : this.getDeletedAt().equals(other.getDeletedAt()))
+            && (this.getWorker() == null ? other.getWorker() == null : this.getWorker().equals(other.getWorker()))
+            && (this.getSerialNumber() == null ? other.getSerialNumber() == null : this.getSerialNumber().equals(other.getSerialNumber()))
+            && (this.getConsumerType() == null ? other.getConsumerType() == null : this.getConsumerType().equals(other.getConsumerType()))
+            && (this.getOcr() == null ? other.getOcr() == null : this.getOcr().equals(other.getOcr()))
+            && (this.getSpPrice() == null ? other.getSpPrice() == null : this.getSpPrice().equals(other.getSpPrice()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getInputType() == null) ? 0 : getInputType().hashCode());
+        result = prime * result + ((getOutputType() == null) ? 0 : getOutputType().hashCode());
+        result = prime * result + ((getPrice() == null) ? 0 : getPrice().hashCode());
+        result = prime * result + ((getCreatedAt() == null) ? 0 : getCreatedAt().hashCode());
+        result = prime * result + ((getUpdatedAt() == null) ? 0 : getUpdatedAt().hashCode());
+        result = prime * result + ((getDeletedAt() == null) ? 0 : getDeletedAt().hashCode());
+        result = prime * result + ((getWorker() == null) ? 0 : getWorker().hashCode());
+        result = prime * result + ((getSerialNumber() == null) ? 0 : getSerialNumber().hashCode());
+        result = prime * result + ((getConsumerType() == null) ? 0 : getConsumerType().hashCode());
+        result = prime * result + ((getOcr() == null) ? 0 : getOcr().hashCode());
+        result = prime * result + ((getSpPrice() == null) ? 0 : getSpPrice().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", inputType=").append(inputType);
+        sb.append(", outputType=").append(outputType);
+        sb.append(", price=").append(price);
+        sb.append(", createdAt=").append(createdAt);
+        sb.append(", updatedAt=").append(updatedAt);
+        sb.append(", deletedAt=").append(deletedAt);
+        sb.append(", worker=").append(worker);
+        sb.append(", serialNumber=").append(serialNumber);
+        sb.append(", consumerType=").append(consumerType);
+        sb.append(", ocr=").append(ocr);
+        sb.append(", spPrice=").append(spPrice);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 951 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/ConvertTypesExample.java

@@ -0,0 +1,951 @@
+package cn.kdan.pdf.backend.core.model;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class ConvertTypesExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public ConvertTypesExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<Criterion>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Integer value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Integer value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Integer value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Integer value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Integer value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Integer value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Integer> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Integer> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Integer value1, Integer value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Integer value1, Integer value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andInputTypeIsNull() {
+            addCriterion("input_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andInputTypeIsNotNull() {
+            addCriterion("input_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andInputTypeEqualTo(String value) {
+            addCriterion("input_type =", value, "inputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andInputTypeNotEqualTo(String value) {
+            addCriterion("input_type <>", value, "inputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andInputTypeGreaterThan(String value) {
+            addCriterion("input_type >", value, "inputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andInputTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("input_type >=", value, "inputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andInputTypeLessThan(String value) {
+            addCriterion("input_type <", value, "inputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andInputTypeLessThanOrEqualTo(String value) {
+            addCriterion("input_type <=", value, "inputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andInputTypeLike(String value) {
+            addCriterion("input_type like", value, "inputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andInputTypeNotLike(String value) {
+            addCriterion("input_type not like", value, "inputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andInputTypeIn(List<String> values) {
+            addCriterion("input_type in", values, "inputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andInputTypeNotIn(List<String> values) {
+            addCriterion("input_type not in", values, "inputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andInputTypeBetween(String value1, String value2) {
+            addCriterion("input_type between", value1, value2, "inputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andInputTypeNotBetween(String value1, String value2) {
+            addCriterion("input_type not between", value1, value2, "inputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutputTypeIsNull() {
+            addCriterion("output_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutputTypeIsNotNull() {
+            addCriterion("output_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutputTypeEqualTo(String value) {
+            addCriterion("output_type =", value, "outputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutputTypeNotEqualTo(String value) {
+            addCriterion("output_type <>", value, "outputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutputTypeGreaterThan(String value) {
+            addCriterion("output_type >", value, "outputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutputTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("output_type >=", value, "outputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutputTypeLessThan(String value) {
+            addCriterion("output_type <", value, "outputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutputTypeLessThanOrEqualTo(String value) {
+            addCriterion("output_type <=", value, "outputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutputTypeLike(String value) {
+            addCriterion("output_type like", value, "outputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutputTypeNotLike(String value) {
+            addCriterion("output_type not like", value, "outputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutputTypeIn(List<String> values) {
+            addCriterion("output_type in", values, "outputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutputTypeNotIn(List<String> values) {
+            addCriterion("output_type not in", values, "outputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutputTypeBetween(String value1, String value2) {
+            addCriterion("output_type between", value1, value2, "outputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutputTypeNotBetween(String value1, String value2) {
+            addCriterion("output_type not between", value1, value2, "outputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceIsNull() {
+            addCriterion("price is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceIsNotNull() {
+            addCriterion("price is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceEqualTo(Integer value) {
+            addCriterion("price =", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceNotEqualTo(Integer value) {
+            addCriterion("price <>", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceGreaterThan(Integer value) {
+            addCriterion("price >", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceGreaterThanOrEqualTo(Integer value) {
+            addCriterion("price >=", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLessThan(Integer value) {
+            addCriterion("price <", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLessThanOrEqualTo(Integer value) {
+            addCriterion("price <=", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceIn(List<Integer> values) {
+            addCriterion("price in", values, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceNotIn(List<Integer> values) {
+            addCriterion("price not in", values, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceBetween(Integer value1, Integer value2) {
+            addCriterion("price between", value1, value2, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceNotBetween(Integer value1, Integer value2) {
+            addCriterion("price not between", value1, value2, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtIsNull() {
+            addCriterion("created_at is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtIsNotNull() {
+            addCriterion("created_at is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtEqualTo(Date value) {
+            addCriterion("created_at =", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtNotEqualTo(Date value) {
+            addCriterion("created_at <>", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtGreaterThan(Date value) {
+            addCriterion("created_at >", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtGreaterThanOrEqualTo(Date value) {
+            addCriterion("created_at >=", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtLessThan(Date value) {
+            addCriterion("created_at <", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtLessThanOrEqualTo(Date value) {
+            addCriterion("created_at <=", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtIn(List<Date> values) {
+            addCriterion("created_at in", values, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtNotIn(List<Date> values) {
+            addCriterion("created_at not in", values, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtBetween(Date value1, Date value2) {
+            addCriterion("created_at between", value1, value2, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtNotBetween(Date value1, Date value2) {
+            addCriterion("created_at not between", value1, value2, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtIsNull() {
+            addCriterion("updated_at is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtIsNotNull() {
+            addCriterion("updated_at is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtEqualTo(Date value) {
+            addCriterion("updated_at =", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtNotEqualTo(Date value) {
+            addCriterion("updated_at <>", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtGreaterThan(Date value) {
+            addCriterion("updated_at >", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtGreaterThanOrEqualTo(Date value) {
+            addCriterion("updated_at >=", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtLessThan(Date value) {
+            addCriterion("updated_at <", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtLessThanOrEqualTo(Date value) {
+            addCriterion("updated_at <=", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtIn(List<Date> values) {
+            addCriterion("updated_at in", values, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtNotIn(List<Date> values) {
+            addCriterion("updated_at not in", values, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtBetween(Date value1, Date value2) {
+            addCriterion("updated_at between", value1, value2, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtNotBetween(Date value1, Date value2) {
+            addCriterion("updated_at not between", value1, value2, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtIsNull() {
+            addCriterion("deleted_at is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtIsNotNull() {
+            addCriterion("deleted_at is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtEqualTo(Date value) {
+            addCriterion("deleted_at =", value, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtNotEqualTo(Date value) {
+            addCriterion("deleted_at <>", value, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtGreaterThan(Date value) {
+            addCriterion("deleted_at >", value, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtGreaterThanOrEqualTo(Date value) {
+            addCriterion("deleted_at >=", value, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtLessThan(Date value) {
+            addCriterion("deleted_at <", value, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtLessThanOrEqualTo(Date value) {
+            addCriterion("deleted_at <=", value, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtIn(List<Date> values) {
+            addCriterion("deleted_at in", values, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtNotIn(List<Date> values) {
+            addCriterion("deleted_at not in", values, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtBetween(Date value1, Date value2) {
+            addCriterion("deleted_at between", value1, value2, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtNotBetween(Date value1, Date value2) {
+            addCriterion("deleted_at not between", value1, value2, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkerIsNull() {
+            addCriterion("worker is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkerIsNotNull() {
+            addCriterion("worker is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkerEqualTo(Integer value) {
+            addCriterion("worker =", value, "worker");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkerNotEqualTo(Integer value) {
+            addCriterion("worker <>", value, "worker");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkerGreaterThan(Integer value) {
+            addCriterion("worker >", value, "worker");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkerGreaterThanOrEqualTo(Integer value) {
+            addCriterion("worker >=", value, "worker");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkerLessThan(Integer value) {
+            addCriterion("worker <", value, "worker");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkerLessThanOrEqualTo(Integer value) {
+            addCriterion("worker <=", value, "worker");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkerIn(List<Integer> values) {
+            addCriterion("worker in", values, "worker");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkerNotIn(List<Integer> values) {
+            addCriterion("worker not in", values, "worker");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkerBetween(Integer value1, Integer value2) {
+            addCriterion("worker between", value1, value2, "worker");
+            return (Criteria) this;
+        }
+
+        public Criteria andWorkerNotBetween(Integer value1, Integer value2) {
+            addCriterion("worker not between", value1, value2, "worker");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberIsNull() {
+            addCriterion("serial_number is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberIsNotNull() {
+            addCriterion("serial_number is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberEqualTo(Integer value) {
+            addCriterion("serial_number =", value, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberNotEqualTo(Integer value) {
+            addCriterion("serial_number <>", value, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberGreaterThan(Integer value) {
+            addCriterion("serial_number >", value, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberGreaterThanOrEqualTo(Integer value) {
+            addCriterion("serial_number >=", value, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberLessThan(Integer value) {
+            addCriterion("serial_number <", value, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberLessThanOrEqualTo(Integer value) {
+            addCriterion("serial_number <=", value, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberIn(List<Integer> values) {
+            addCriterion("serial_number in", values, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberNotIn(List<Integer> values) {
+            addCriterion("serial_number not in", values, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberBetween(Integer value1, Integer value2) {
+            addCriterion("serial_number between", value1, value2, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberNotBetween(Integer value1, Integer value2) {
+            addCriterion("serial_number not between", value1, value2, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andConsumerTypeIsNull() {
+            addCriterion("consumer_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andConsumerTypeIsNotNull() {
+            addCriterion("consumer_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andConsumerTypeEqualTo(Integer value) {
+            addCriterion("consumer_type =", value, "consumerType");
+            return (Criteria) this;
+        }
+
+        public Criteria andConsumerTypeNotEqualTo(Integer value) {
+            addCriterion("consumer_type <>", value, "consumerType");
+            return (Criteria) this;
+        }
+
+        public Criteria andConsumerTypeGreaterThan(Integer value) {
+            addCriterion("consumer_type >", value, "consumerType");
+            return (Criteria) this;
+        }
+
+        public Criteria andConsumerTypeGreaterThanOrEqualTo(Integer value) {
+            addCriterion("consumer_type >=", value, "consumerType");
+            return (Criteria) this;
+        }
+
+        public Criteria andConsumerTypeLessThan(Integer value) {
+            addCriterion("consumer_type <", value, "consumerType");
+            return (Criteria) this;
+        }
+
+        public Criteria andConsumerTypeLessThanOrEqualTo(Integer value) {
+            addCriterion("consumer_type <=", value, "consumerType");
+            return (Criteria) this;
+        }
+
+        public Criteria andConsumerTypeIn(List<Integer> values) {
+            addCriterion("consumer_type in", values, "consumerType");
+            return (Criteria) this;
+        }
+
+        public Criteria andConsumerTypeNotIn(List<Integer> values) {
+            addCriterion("consumer_type not in", values, "consumerType");
+            return (Criteria) this;
+        }
+
+        public Criteria andConsumerTypeBetween(Integer value1, Integer value2) {
+            addCriterion("consumer_type between", value1, value2, "consumerType");
+            return (Criteria) this;
+        }
+
+        public Criteria andConsumerTypeNotBetween(Integer value1, Integer value2) {
+            addCriterion("consumer_type not between", value1, value2, "consumerType");
+            return (Criteria) this;
+        }
+
+        public Criteria andOcrIsNull() {
+            addCriterion("ocr is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOcrIsNotNull() {
+            addCriterion("ocr is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOcrEqualTo(Integer value) {
+            addCriterion("ocr =", value, "ocr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOcrNotEqualTo(Integer value) {
+            addCriterion("ocr <>", value, "ocr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOcrGreaterThan(Integer value) {
+            addCriterion("ocr >", value, "ocr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOcrGreaterThanOrEqualTo(Integer value) {
+            addCriterion("ocr >=", value, "ocr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOcrLessThan(Integer value) {
+            addCriterion("ocr <", value, "ocr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOcrLessThanOrEqualTo(Integer value) {
+            addCriterion("ocr <=", value, "ocr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOcrIn(List<Integer> values) {
+            addCriterion("ocr in", values, "ocr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOcrNotIn(List<Integer> values) {
+            addCriterion("ocr not in", values, "ocr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOcrBetween(Integer value1, Integer value2) {
+            addCriterion("ocr between", value1, value2, "ocr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOcrNotBetween(Integer value1, Integer value2) {
+            addCriterion("ocr not between", value1, value2, "ocr");
+            return (Criteria) this;
+        }
+
+        public Criteria andSpPriceIsNull() {
+            addCriterion("sp_price is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSpPriceIsNotNull() {
+            addCriterion("sp_price is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSpPriceEqualTo(Integer value) {
+            addCriterion("sp_price =", value, "spPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andSpPriceNotEqualTo(Integer value) {
+            addCriterion("sp_price <>", value, "spPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andSpPriceGreaterThan(Integer value) {
+            addCriterion("sp_price >", value, "spPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andSpPriceGreaterThanOrEqualTo(Integer value) {
+            addCriterion("sp_price >=", value, "spPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andSpPriceLessThan(Integer value) {
+            addCriterion("sp_price <", value, "spPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andSpPriceLessThanOrEqualTo(Integer value) {
+            addCriterion("sp_price <=", value, "spPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andSpPriceIn(List<Integer> values) {
+            addCriterion("sp_price in", values, "spPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andSpPriceNotIn(List<Integer> values) {
+            addCriterion("sp_price not in", values, "spPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andSpPriceBetween(Integer value1, Integer value2) {
+            addCriterion("sp_price between", value1, value2, "spPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andSpPriceNotBetween(Integer value1, Integer value2) {
+            addCriterion("sp_price not between", value1, value2, "spPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andInputTypeLikeInsensitive(String value) {
+            addCriterion("upper(input_type) like", value.toUpperCase(), "inputType");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutputTypeLikeInsensitive(String value) {
+            addCriterion("upper(output_type) like", value.toUpperCase(), "outputType");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}

+ 635 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/Members.java

@@ -0,0 +1,635 @@
+package cn.kdan.pdf.backend.core.model;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class Members implements Serializable {
+    private Integer id;
+
+    private String name;
+
+    private String phone;
+
+    private String email;
+
+    private Integer gender;
+
+    private String region;
+
+    private String signature;
+
+    private Date createdAt;
+
+    private Date updatedAt;
+
+    private String passwordDigest;
+
+    private String timeZone;
+
+    private Integer viewedTimes;
+
+    private Integer status;
+
+    private String activationToken;
+
+    private Date activatedAt;
+
+    private String resetToken;
+
+    private Date resetTokenGeneratedAt;
+
+    private String phoneZone;
+
+    private String account;
+
+    private String location;
+
+    private String publicPhone;
+
+    private String publicEmail;
+
+    private String settings;
+
+    private Integer points;
+
+    private Date lastSignAt;
+
+    private Integer totalPoints;
+
+    private Integer totalSpace;
+
+    private BigDecimal usedSpace;
+
+    private BigDecimal leftSpace;
+
+    private Integer appsCode;
+
+    private Integer subscriberType;
+
+    private String referralCode;
+
+    private Integer referralCount;
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public Members withId(Integer id) {
+        this.setId(id);
+        return this;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Members withName(String name) {
+        this.setName(name);
+        return this;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public Members withPhone(String phone) {
+        this.setPhone(phone);
+        return this;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public Members withEmail(String email) {
+        this.setEmail(email);
+        return this;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public Integer getGender() {
+        return gender;
+    }
+
+    public Members withGender(Integer gender) {
+        this.setGender(gender);
+        return this;
+    }
+
+    public void setGender(Integer gender) {
+        this.gender = gender;
+    }
+
+    public String getRegion() {
+        return region;
+    }
+
+    public Members withRegion(String region) {
+        this.setRegion(region);
+        return this;
+    }
+
+    public void setRegion(String region) {
+        this.region = region;
+    }
+
+    public String getSignature() {
+        return signature;
+    }
+
+    public Members withSignature(String signature) {
+        this.setSignature(signature);
+        return this;
+    }
+
+    public void setSignature(String signature) {
+        this.signature = signature;
+    }
+
+    public Date getCreatedAt() {
+        return createdAt;
+    }
+
+    public Members withCreatedAt(Date createdAt) {
+        this.setCreatedAt(createdAt);
+        return this;
+    }
+
+    public void setCreatedAt(Date createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public Date getUpdatedAt() {
+        return updatedAt;
+    }
+
+    public Members withUpdatedAt(Date updatedAt) {
+        this.setUpdatedAt(updatedAt);
+        return this;
+    }
+
+    public void setUpdatedAt(Date updatedAt) {
+        this.updatedAt = updatedAt;
+    }
+
+    public String getPasswordDigest() {
+        return passwordDigest;
+    }
+
+    public Members withPasswordDigest(String passwordDigest) {
+        this.setPasswordDigest(passwordDigest);
+        return this;
+    }
+
+    public void setPasswordDigest(String passwordDigest) {
+        this.passwordDigest = passwordDigest;
+    }
+
+    public String getTimeZone() {
+        return timeZone;
+    }
+
+    public Members withTimeZone(String timeZone) {
+        this.setTimeZone(timeZone);
+        return this;
+    }
+
+    public void setTimeZone(String timeZone) {
+        this.timeZone = timeZone;
+    }
+
+    public Integer getViewedTimes() {
+        return viewedTimes;
+    }
+
+    public Members withViewedTimes(Integer viewedTimes) {
+        this.setViewedTimes(viewedTimes);
+        return this;
+    }
+
+    public void setViewedTimes(Integer viewedTimes) {
+        this.viewedTimes = viewedTimes;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public Members withStatus(Integer status) {
+        this.setStatus(status);
+        return this;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getActivationToken() {
+        return activationToken;
+    }
+
+    public Members withActivationToken(String activationToken) {
+        this.setActivationToken(activationToken);
+        return this;
+    }
+
+    public void setActivationToken(String activationToken) {
+        this.activationToken = activationToken;
+    }
+
+    public Date getActivatedAt() {
+        return activatedAt;
+    }
+
+    public Members withActivatedAt(Date activatedAt) {
+        this.setActivatedAt(activatedAt);
+        return this;
+    }
+
+    public void setActivatedAt(Date activatedAt) {
+        this.activatedAt = activatedAt;
+    }
+
+    public String getResetToken() {
+        return resetToken;
+    }
+
+    public Members withResetToken(String resetToken) {
+        this.setResetToken(resetToken);
+        return this;
+    }
+
+    public void setResetToken(String resetToken) {
+        this.resetToken = resetToken;
+    }
+
+    public Date getResetTokenGeneratedAt() {
+        return resetTokenGeneratedAt;
+    }
+
+    public Members withResetTokenGeneratedAt(Date resetTokenGeneratedAt) {
+        this.setResetTokenGeneratedAt(resetTokenGeneratedAt);
+        return this;
+    }
+
+    public void setResetTokenGeneratedAt(Date resetTokenGeneratedAt) {
+        this.resetTokenGeneratedAt = resetTokenGeneratedAt;
+    }
+
+    public String getPhoneZone() {
+        return phoneZone;
+    }
+
+    public Members withPhoneZone(String phoneZone) {
+        this.setPhoneZone(phoneZone);
+        return this;
+    }
+
+    public void setPhoneZone(String phoneZone) {
+        this.phoneZone = phoneZone;
+    }
+
+    public String getAccount() {
+        return account;
+    }
+
+    public Members withAccount(String account) {
+        this.setAccount(account);
+        return this;
+    }
+
+    public void setAccount(String account) {
+        this.account = account;
+    }
+
+    public String getLocation() {
+        return location;
+    }
+
+    public Members withLocation(String location) {
+        this.setLocation(location);
+        return this;
+    }
+
+    public void setLocation(String location) {
+        this.location = location;
+    }
+
+    public String getPublicPhone() {
+        return publicPhone;
+    }
+
+    public Members withPublicPhone(String publicPhone) {
+        this.setPublicPhone(publicPhone);
+        return this;
+    }
+
+    public void setPublicPhone(String publicPhone) {
+        this.publicPhone = publicPhone;
+    }
+
+    public String getPublicEmail() {
+        return publicEmail;
+    }
+
+    public Members withPublicEmail(String publicEmail) {
+        this.setPublicEmail(publicEmail);
+        return this;
+    }
+
+    public void setPublicEmail(String publicEmail) {
+        this.publicEmail = publicEmail;
+    }
+
+    public String getSettings() {
+        return settings;
+    }
+
+    public Members withSettings(String settings) {
+        this.setSettings(settings);
+        return this;
+    }
+
+    public void setSettings(String settings) {
+        this.settings = settings;
+    }
+
+    public Integer getPoints() {
+        return points;
+    }
+
+    public Members withPoints(Integer points) {
+        this.setPoints(points);
+        return this;
+    }
+
+    public void setPoints(Integer points) {
+        this.points = points;
+    }
+
+    public Date getLastSignAt() {
+        return lastSignAt;
+    }
+
+    public Members withLastSignAt(Date lastSignAt) {
+        this.setLastSignAt(lastSignAt);
+        return this;
+    }
+
+    public void setLastSignAt(Date lastSignAt) {
+        this.lastSignAt = lastSignAt;
+    }
+
+    public Integer getTotalPoints() {
+        return totalPoints;
+    }
+
+    public Members withTotalPoints(Integer totalPoints) {
+        this.setTotalPoints(totalPoints);
+        return this;
+    }
+
+    public void setTotalPoints(Integer totalPoints) {
+        this.totalPoints = totalPoints;
+    }
+
+    public Integer getTotalSpace() {
+        return totalSpace;
+    }
+
+    public Members withTotalSpace(Integer totalSpace) {
+        this.setTotalSpace(totalSpace);
+        return this;
+    }
+
+    public void setTotalSpace(Integer totalSpace) {
+        this.totalSpace = totalSpace;
+    }
+
+    public BigDecimal getUsedSpace() {
+        return usedSpace;
+    }
+
+    public Members withUsedSpace(BigDecimal usedSpace) {
+        this.setUsedSpace(usedSpace);
+        return this;
+    }
+
+    public void setUsedSpace(BigDecimal usedSpace) {
+        this.usedSpace = usedSpace;
+    }
+
+    public BigDecimal getLeftSpace() {
+        return leftSpace;
+    }
+
+    public Members withLeftSpace(BigDecimal leftSpace) {
+        this.setLeftSpace(leftSpace);
+        return this;
+    }
+
+    public void setLeftSpace(BigDecimal leftSpace) {
+        this.leftSpace = leftSpace;
+    }
+
+    public Integer getAppsCode() {
+        return appsCode;
+    }
+
+    public Members withAppsCode(Integer appsCode) {
+        this.setAppsCode(appsCode);
+        return this;
+    }
+
+    public void setAppsCode(Integer appsCode) {
+        this.appsCode = appsCode;
+    }
+
+    public Integer getSubscriberType() {
+        return subscriberType;
+    }
+
+    public Members withSubscriberType(Integer subscriberType) {
+        this.setSubscriberType(subscriberType);
+        return this;
+    }
+
+    public void setSubscriberType(Integer subscriberType) {
+        this.subscriberType = subscriberType;
+    }
+
+    public String getReferralCode() {
+        return referralCode;
+    }
+
+    public Members withReferralCode(String referralCode) {
+        this.setReferralCode(referralCode);
+        return this;
+    }
+
+    public void setReferralCode(String referralCode) {
+        this.referralCode = referralCode;
+    }
+
+    public Integer getReferralCount() {
+        return referralCount;
+    }
+
+    public Members withReferralCount(Integer referralCount) {
+        this.setReferralCount(referralCount);
+        return this;
+    }
+
+    public void setReferralCount(Integer referralCount) {
+        this.referralCount = referralCount;
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        Members other = (Members) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getName() == null ? other.getName() == null : this.getName().equals(other.getName()))
+            && (this.getPhone() == null ? other.getPhone() == null : this.getPhone().equals(other.getPhone()))
+            && (this.getEmail() == null ? other.getEmail() == null : this.getEmail().equals(other.getEmail()))
+            && (this.getGender() == null ? other.getGender() == null : this.getGender().equals(other.getGender()))
+            && (this.getRegion() == null ? other.getRegion() == null : this.getRegion().equals(other.getRegion()))
+            && (this.getSignature() == null ? other.getSignature() == null : this.getSignature().equals(other.getSignature()))
+            && (this.getCreatedAt() == null ? other.getCreatedAt() == null : this.getCreatedAt().equals(other.getCreatedAt()))
+            && (this.getUpdatedAt() == null ? other.getUpdatedAt() == null : this.getUpdatedAt().equals(other.getUpdatedAt()))
+            && (this.getPasswordDigest() == null ? other.getPasswordDigest() == null : this.getPasswordDigest().equals(other.getPasswordDigest()))
+            && (this.getTimeZone() == null ? other.getTimeZone() == null : this.getTimeZone().equals(other.getTimeZone()))
+            && (this.getViewedTimes() == null ? other.getViewedTimes() == null : this.getViewedTimes().equals(other.getViewedTimes()))
+            && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus()))
+            && (this.getActivationToken() == null ? other.getActivationToken() == null : this.getActivationToken().equals(other.getActivationToken()))
+            && (this.getActivatedAt() == null ? other.getActivatedAt() == null : this.getActivatedAt().equals(other.getActivatedAt()))
+            && (this.getResetToken() == null ? other.getResetToken() == null : this.getResetToken().equals(other.getResetToken()))
+            && (this.getResetTokenGeneratedAt() == null ? other.getResetTokenGeneratedAt() == null : this.getResetTokenGeneratedAt().equals(other.getResetTokenGeneratedAt()))
+            && (this.getPhoneZone() == null ? other.getPhoneZone() == null : this.getPhoneZone().equals(other.getPhoneZone()))
+            && (this.getAccount() == null ? other.getAccount() == null : this.getAccount().equals(other.getAccount()))
+            && (this.getLocation() == null ? other.getLocation() == null : this.getLocation().equals(other.getLocation()))
+            && (this.getPublicPhone() == null ? other.getPublicPhone() == null : this.getPublicPhone().equals(other.getPublicPhone()))
+            && (this.getPublicEmail() == null ? other.getPublicEmail() == null : this.getPublicEmail().equals(other.getPublicEmail()))
+            && (this.getSettings() == null ? other.getSettings() == null : this.getSettings().equals(other.getSettings()))
+            && (this.getPoints() == null ? other.getPoints() == null : this.getPoints().equals(other.getPoints()))
+            && (this.getLastSignAt() == null ? other.getLastSignAt() == null : this.getLastSignAt().equals(other.getLastSignAt()))
+            && (this.getTotalPoints() == null ? other.getTotalPoints() == null : this.getTotalPoints().equals(other.getTotalPoints()))
+            && (this.getTotalSpace() == null ? other.getTotalSpace() == null : this.getTotalSpace().equals(other.getTotalSpace()))
+            && (this.getUsedSpace() == null ? other.getUsedSpace() == null : this.getUsedSpace().equals(other.getUsedSpace()))
+            && (this.getLeftSpace() == null ? other.getLeftSpace() == null : this.getLeftSpace().equals(other.getLeftSpace()))
+            && (this.getAppsCode() == null ? other.getAppsCode() == null : this.getAppsCode().equals(other.getAppsCode()))
+            && (this.getSubscriberType() == null ? other.getSubscriberType() == null : this.getSubscriberType().equals(other.getSubscriberType()))
+            && (this.getReferralCode() == null ? other.getReferralCode() == null : this.getReferralCode().equals(other.getReferralCode()))
+            && (this.getReferralCount() == null ? other.getReferralCount() == null : this.getReferralCount().equals(other.getReferralCount()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getName() == null) ? 0 : getName().hashCode());
+        result = prime * result + ((getPhone() == null) ? 0 : getPhone().hashCode());
+        result = prime * result + ((getEmail() == null) ? 0 : getEmail().hashCode());
+        result = prime * result + ((getGender() == null) ? 0 : getGender().hashCode());
+        result = prime * result + ((getRegion() == null) ? 0 : getRegion().hashCode());
+        result = prime * result + ((getSignature() == null) ? 0 : getSignature().hashCode());
+        result = prime * result + ((getCreatedAt() == null) ? 0 : getCreatedAt().hashCode());
+        result = prime * result + ((getUpdatedAt() == null) ? 0 : getUpdatedAt().hashCode());
+        result = prime * result + ((getPasswordDigest() == null) ? 0 : getPasswordDigest().hashCode());
+        result = prime * result + ((getTimeZone() == null) ? 0 : getTimeZone().hashCode());
+        result = prime * result + ((getViewedTimes() == null) ? 0 : getViewedTimes().hashCode());
+        result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode());
+        result = prime * result + ((getActivationToken() == null) ? 0 : getActivationToken().hashCode());
+        result = prime * result + ((getActivatedAt() == null) ? 0 : getActivatedAt().hashCode());
+        result = prime * result + ((getResetToken() == null) ? 0 : getResetToken().hashCode());
+        result = prime * result + ((getResetTokenGeneratedAt() == null) ? 0 : getResetTokenGeneratedAt().hashCode());
+        result = prime * result + ((getPhoneZone() == null) ? 0 : getPhoneZone().hashCode());
+        result = prime * result + ((getAccount() == null) ? 0 : getAccount().hashCode());
+        result = prime * result + ((getLocation() == null) ? 0 : getLocation().hashCode());
+        result = prime * result + ((getPublicPhone() == null) ? 0 : getPublicPhone().hashCode());
+        result = prime * result + ((getPublicEmail() == null) ? 0 : getPublicEmail().hashCode());
+        result = prime * result + ((getSettings() == null) ? 0 : getSettings().hashCode());
+        result = prime * result + ((getPoints() == null) ? 0 : getPoints().hashCode());
+        result = prime * result + ((getLastSignAt() == null) ? 0 : getLastSignAt().hashCode());
+        result = prime * result + ((getTotalPoints() == null) ? 0 : getTotalPoints().hashCode());
+        result = prime * result + ((getTotalSpace() == null) ? 0 : getTotalSpace().hashCode());
+        result = prime * result + ((getUsedSpace() == null) ? 0 : getUsedSpace().hashCode());
+        result = prime * result + ((getLeftSpace() == null) ? 0 : getLeftSpace().hashCode());
+        result = prime * result + ((getAppsCode() == null) ? 0 : getAppsCode().hashCode());
+        result = prime * result + ((getSubscriberType() == null) ? 0 : getSubscriberType().hashCode());
+        result = prime * result + ((getReferralCode() == null) ? 0 : getReferralCode().hashCode());
+        result = prime * result + ((getReferralCount() == null) ? 0 : getReferralCount().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", name=").append(name);
+        sb.append(", phone=").append(phone);
+        sb.append(", email=").append(email);
+        sb.append(", gender=").append(gender);
+        sb.append(", region=").append(region);
+        sb.append(", signature=").append(signature);
+        sb.append(", createdAt=").append(createdAt);
+        sb.append(", updatedAt=").append(updatedAt);
+        sb.append(", passwordDigest=").append(passwordDigest);
+        sb.append(", timeZone=").append(timeZone);
+        sb.append(", viewedTimes=").append(viewedTimes);
+        sb.append(", status=").append(status);
+        sb.append(", activationToken=").append(activationToken);
+        sb.append(", activatedAt=").append(activatedAt);
+        sb.append(", resetToken=").append(resetToken);
+        sb.append(", resetTokenGeneratedAt=").append(resetTokenGeneratedAt);
+        sb.append(", phoneZone=").append(phoneZone);
+        sb.append(", account=").append(account);
+        sb.append(", location=").append(location);
+        sb.append(", publicPhone=").append(publicPhone);
+        sb.append(", publicEmail=").append(publicEmail);
+        sb.append(", settings=").append(settings);
+        sb.append(", points=").append(points);
+        sb.append(", lastSignAt=").append(lastSignAt);
+        sb.append(", totalPoints=").append(totalPoints);
+        sb.append(", totalSpace=").append(totalSpace);
+        sb.append(", usedSpace=").append(usedSpace);
+        sb.append(", leftSpace=").append(leftSpace);
+        sb.append(", appsCode=").append(appsCode);
+        sb.append(", subscriberType=").append(subscriberType);
+        sb.append(", referralCode=").append(referralCode);
+        sb.append(", referralCount=").append(referralCount);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 2422 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/MembersExample.java


+ 509 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/MissionFiles.java

@@ -0,0 +1,509 @@
+package cn.kdan.pdf.backend.core.model;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class MissionFiles implements Serializable {
+    private Integer id;
+
+    private String missionId;
+
+    private String memberId;
+
+    private String clientId;
+
+    private Integer convertTypeId;
+
+    private String processId;
+
+    private Integer fileType;
+
+    private Integer orderId;
+
+    private Integer status;
+
+    private Integer price;
+
+    private BigDecimal size;
+
+    private String path;
+
+    private String fileName;
+
+    private String callbackUrl;
+
+    private Date createdAt;
+
+    private Date updatedAt;
+
+    private String originalFilename;
+
+    private Date deletedAt;
+
+    private Date convertAt;
+
+    private Date convertEndAt;
+
+    private Integer worker;
+
+    private Integer sourceType;
+
+    private String failReason;
+
+    private Date uploadedAt;
+
+    private String outFilename;
+
+    private String ocrCode;
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public MissionFiles withId(Integer id) {
+        this.setId(id);
+        return this;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getMissionId() {
+        return missionId;
+    }
+
+    public MissionFiles withMissionId(String missionId) {
+        this.setMissionId(missionId);
+        return this;
+    }
+
+    public void setMissionId(String missionId) {
+        this.missionId = missionId;
+    }
+
+    public String getMemberId() {
+        return memberId;
+    }
+
+    public MissionFiles withMemberId(String memberId) {
+        this.setMemberId(memberId);
+        return this;
+    }
+
+    public void setMemberId(String memberId) {
+        this.memberId = memberId;
+    }
+
+    public String getClientId() {
+        return clientId;
+    }
+
+    public MissionFiles withClientId(String clientId) {
+        this.setClientId(clientId);
+        return this;
+    }
+
+    public void setClientId(String clientId) {
+        this.clientId = clientId;
+    }
+
+    public Integer getConvertTypeId() {
+        return convertTypeId;
+    }
+
+    public MissionFiles withConvertTypeId(Integer convertTypeId) {
+        this.setConvertTypeId(convertTypeId);
+        return this;
+    }
+
+    public void setConvertTypeId(Integer convertTypeId) {
+        this.convertTypeId = convertTypeId;
+    }
+
+    public String getProcessId() {
+        return processId;
+    }
+
+    public MissionFiles withProcessId(String processId) {
+        this.setProcessId(processId);
+        return this;
+    }
+
+    public void setProcessId(String processId) {
+        this.processId = processId;
+    }
+
+    public Integer getFileType() {
+        return fileType;
+    }
+
+    public MissionFiles withFileType(Integer fileType) {
+        this.setFileType(fileType);
+        return this;
+    }
+
+    public void setFileType(Integer fileType) {
+        this.fileType = fileType;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public MissionFiles withOrderId(Integer orderId) {
+        this.setOrderId(orderId);
+        return this;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public MissionFiles withStatus(Integer status) {
+        this.setStatus(status);
+        return this;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Integer getPrice() {
+        return price;
+    }
+
+    public MissionFiles withPrice(Integer price) {
+        this.setPrice(price);
+        return this;
+    }
+
+    public void setPrice(Integer price) {
+        this.price = price;
+    }
+
+    public BigDecimal getSize() {
+        return size;
+    }
+
+    public MissionFiles withSize(BigDecimal size) {
+        this.setSize(size);
+        return this;
+    }
+
+    public void setSize(BigDecimal size) {
+        this.size = size;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public MissionFiles withPath(String path) {
+        this.setPath(path);
+        return this;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public MissionFiles withFileName(String fileName) {
+        this.setFileName(fileName);
+        return this;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public String getCallbackUrl() {
+        return callbackUrl;
+    }
+
+    public MissionFiles withCallbackUrl(String callbackUrl) {
+        this.setCallbackUrl(callbackUrl);
+        return this;
+    }
+
+    public void setCallbackUrl(String callbackUrl) {
+        this.callbackUrl = callbackUrl;
+    }
+
+    public Date getCreatedAt() {
+        return createdAt;
+    }
+
+    public MissionFiles withCreatedAt(Date createdAt) {
+        this.setCreatedAt(createdAt);
+        return this;
+    }
+
+    public void setCreatedAt(Date createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public Date getUpdatedAt() {
+        return updatedAt;
+    }
+
+    public MissionFiles withUpdatedAt(Date updatedAt) {
+        this.setUpdatedAt(updatedAt);
+        return this;
+    }
+
+    public void setUpdatedAt(Date updatedAt) {
+        this.updatedAt = updatedAt;
+    }
+
+    public String getOriginalFilename() {
+        return originalFilename;
+    }
+
+    public MissionFiles withOriginalFilename(String originalFilename) {
+        this.setOriginalFilename(originalFilename);
+        return this;
+    }
+
+    public void setOriginalFilename(String originalFilename) {
+        this.originalFilename = originalFilename;
+    }
+
+    public Date getDeletedAt() {
+        return deletedAt;
+    }
+
+    public MissionFiles withDeletedAt(Date deletedAt) {
+        this.setDeletedAt(deletedAt);
+        return this;
+    }
+
+    public void setDeletedAt(Date deletedAt) {
+        this.deletedAt = deletedAt;
+    }
+
+    public Date getConvertAt() {
+        return convertAt;
+    }
+
+    public MissionFiles withConvertAt(Date convertAt) {
+        this.setConvertAt(convertAt);
+        return this;
+    }
+
+    public void setConvertAt(Date convertAt) {
+        this.convertAt = convertAt;
+    }
+
+    public Date getConvertEndAt() {
+        return convertEndAt;
+    }
+
+    public MissionFiles withConvertEndAt(Date convertEndAt) {
+        this.setConvertEndAt(convertEndAt);
+        return this;
+    }
+
+    public void setConvertEndAt(Date convertEndAt) {
+        this.convertEndAt = convertEndAt;
+    }
+
+    public Integer getWorker() {
+        return worker;
+    }
+
+    public MissionFiles withWorker(Integer worker) {
+        this.setWorker(worker);
+        return this;
+    }
+
+    public void setWorker(Integer worker) {
+        this.worker = worker;
+    }
+
+    public Integer getSourceType() {
+        return sourceType;
+    }
+
+    public MissionFiles withSourceType(Integer sourceType) {
+        this.setSourceType(sourceType);
+        return this;
+    }
+
+    public void setSourceType(Integer sourceType) {
+        this.sourceType = sourceType;
+    }
+
+    public String getFailReason() {
+        return failReason;
+    }
+
+    public MissionFiles withFailReason(String failReason) {
+        this.setFailReason(failReason);
+        return this;
+    }
+
+    public void setFailReason(String failReason) {
+        this.failReason = failReason;
+    }
+
+    public Date getUploadedAt() {
+        return uploadedAt;
+    }
+
+    public MissionFiles withUploadedAt(Date uploadedAt) {
+        this.setUploadedAt(uploadedAt);
+        return this;
+    }
+
+    public void setUploadedAt(Date uploadedAt) {
+        this.uploadedAt = uploadedAt;
+    }
+
+    public String getOutFilename() {
+        return outFilename;
+    }
+
+    public MissionFiles withOutFilename(String outFilename) {
+        this.setOutFilename(outFilename);
+        return this;
+    }
+
+    public void setOutFilename(String outFilename) {
+        this.outFilename = outFilename;
+    }
+
+    public String getOcrCode() {
+        return ocrCode;
+    }
+
+    public MissionFiles withOcrCode(String ocrCode) {
+        this.setOcrCode(ocrCode);
+        return this;
+    }
+
+    public void setOcrCode(String ocrCode) {
+        this.ocrCode = ocrCode;
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        MissionFiles other = (MissionFiles) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getMissionId() == null ? other.getMissionId() == null : this.getMissionId().equals(other.getMissionId()))
+            && (this.getMemberId() == null ? other.getMemberId() == null : this.getMemberId().equals(other.getMemberId()))
+            && (this.getClientId() == null ? other.getClientId() == null : this.getClientId().equals(other.getClientId()))
+            && (this.getConvertTypeId() == null ? other.getConvertTypeId() == null : this.getConvertTypeId().equals(other.getConvertTypeId()))
+            && (this.getProcessId() == null ? other.getProcessId() == null : this.getProcessId().equals(other.getProcessId()))
+            && (this.getFileType() == null ? other.getFileType() == null : this.getFileType().equals(other.getFileType()))
+            && (this.getOrderId() == null ? other.getOrderId() == null : this.getOrderId().equals(other.getOrderId()))
+            && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus()))
+            && (this.getPrice() == null ? other.getPrice() == null : this.getPrice().equals(other.getPrice()))
+            && (this.getSize() == null ? other.getSize() == null : this.getSize().equals(other.getSize()))
+            && (this.getPath() == null ? other.getPath() == null : this.getPath().equals(other.getPath()))
+            && (this.getFileName() == null ? other.getFileName() == null : this.getFileName().equals(other.getFileName()))
+            && (this.getCallbackUrl() == null ? other.getCallbackUrl() == null : this.getCallbackUrl().equals(other.getCallbackUrl()))
+            && (this.getCreatedAt() == null ? other.getCreatedAt() == null : this.getCreatedAt().equals(other.getCreatedAt()))
+            && (this.getUpdatedAt() == null ? other.getUpdatedAt() == null : this.getUpdatedAt().equals(other.getUpdatedAt()))
+            && (this.getOriginalFilename() == null ? other.getOriginalFilename() == null : this.getOriginalFilename().equals(other.getOriginalFilename()))
+            && (this.getDeletedAt() == null ? other.getDeletedAt() == null : this.getDeletedAt().equals(other.getDeletedAt()))
+            && (this.getConvertAt() == null ? other.getConvertAt() == null : this.getConvertAt().equals(other.getConvertAt()))
+            && (this.getConvertEndAt() == null ? other.getConvertEndAt() == null : this.getConvertEndAt().equals(other.getConvertEndAt()))
+            && (this.getWorker() == null ? other.getWorker() == null : this.getWorker().equals(other.getWorker()))
+            && (this.getSourceType() == null ? other.getSourceType() == null : this.getSourceType().equals(other.getSourceType()))
+            && (this.getFailReason() == null ? other.getFailReason() == null : this.getFailReason().equals(other.getFailReason()))
+            && (this.getUploadedAt() == null ? other.getUploadedAt() == null : this.getUploadedAt().equals(other.getUploadedAt()))
+            && (this.getOutFilename() == null ? other.getOutFilename() == null : this.getOutFilename().equals(other.getOutFilename()))
+            && (this.getOcrCode() == null ? other.getOcrCode() == null : this.getOcrCode().equals(other.getOcrCode()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getMissionId() == null) ? 0 : getMissionId().hashCode());
+        result = prime * result + ((getMemberId() == null) ? 0 : getMemberId().hashCode());
+        result = prime * result + ((getClientId() == null) ? 0 : getClientId().hashCode());
+        result = prime * result + ((getConvertTypeId() == null) ? 0 : getConvertTypeId().hashCode());
+        result = prime * result + ((getProcessId() == null) ? 0 : getProcessId().hashCode());
+        result = prime * result + ((getFileType() == null) ? 0 : getFileType().hashCode());
+        result = prime * result + ((getOrderId() == null) ? 0 : getOrderId().hashCode());
+        result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode());
+        result = prime * result + ((getPrice() == null) ? 0 : getPrice().hashCode());
+        result = prime * result + ((getSize() == null) ? 0 : getSize().hashCode());
+        result = prime * result + ((getPath() == null) ? 0 : getPath().hashCode());
+        result = prime * result + ((getFileName() == null) ? 0 : getFileName().hashCode());
+        result = prime * result + ((getCallbackUrl() == null) ? 0 : getCallbackUrl().hashCode());
+        result = prime * result + ((getCreatedAt() == null) ? 0 : getCreatedAt().hashCode());
+        result = prime * result + ((getUpdatedAt() == null) ? 0 : getUpdatedAt().hashCode());
+        result = prime * result + ((getOriginalFilename() == null) ? 0 : getOriginalFilename().hashCode());
+        result = prime * result + ((getDeletedAt() == null) ? 0 : getDeletedAt().hashCode());
+        result = prime * result + ((getConvertAt() == null) ? 0 : getConvertAt().hashCode());
+        result = prime * result + ((getConvertEndAt() == null) ? 0 : getConvertEndAt().hashCode());
+        result = prime * result + ((getWorker() == null) ? 0 : getWorker().hashCode());
+        result = prime * result + ((getSourceType() == null) ? 0 : getSourceType().hashCode());
+        result = prime * result + ((getFailReason() == null) ? 0 : getFailReason().hashCode());
+        result = prime * result + ((getUploadedAt() == null) ? 0 : getUploadedAt().hashCode());
+        result = prime * result + ((getOutFilename() == null) ? 0 : getOutFilename().hashCode());
+        result = prime * result + ((getOcrCode() == null) ? 0 : getOcrCode().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", missionId=").append(missionId);
+        sb.append(", memberId=").append(memberId);
+        sb.append(", clientId=").append(clientId);
+        sb.append(", convertTypeId=").append(convertTypeId);
+        sb.append(", processId=").append(processId);
+        sb.append(", fileType=").append(fileType);
+        sb.append(", orderId=").append(orderId);
+        sb.append(", status=").append(status);
+        sb.append(", price=").append(price);
+        sb.append(", size=").append(size);
+        sb.append(", path=").append(path);
+        sb.append(", fileName=").append(fileName);
+        sb.append(", callbackUrl=").append(callbackUrl);
+        sb.append(", createdAt=").append(createdAt);
+        sb.append(", updatedAt=").append(updatedAt);
+        sb.append(", originalFilename=").append(originalFilename);
+        sb.append(", deletedAt=").append(deletedAt);
+        sb.append(", convertAt=").append(convertAt);
+        sb.append(", convertEndAt=").append(convertEndAt);
+        sb.append(", worker=").append(worker);
+        sb.append(", sourceType=").append(sourceType);
+        sb.append(", failReason=").append(failReason);
+        sb.append(", uploadedAt=").append(uploadedAt);
+        sb.append(", outFilename=").append(outFilename);
+        sb.append(", ocrCode=").append(ocrCode);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1927 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/MissionFilesExample.java


+ 127 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/MissionFilesWithBLOBs.java

@@ -0,0 +1,127 @@
+package cn.kdan.pdf.backend.core.model;
+
+import java.io.Serializable;
+
+public class MissionFilesWithBLOBs extends MissionFiles implements Serializable {
+    private String traceResult;
+
+    private String outputBucket;
+
+    private static final long serialVersionUID = 1L;
+
+    public String getTraceResult() {
+        return traceResult;
+    }
+
+    public MissionFilesWithBLOBs withTraceResult(String traceResult) {
+        this.setTraceResult(traceResult);
+        return this;
+    }
+
+    public void setTraceResult(String traceResult) {
+        this.traceResult = traceResult;
+    }
+
+    public String getOutputBucket() {
+        return outputBucket;
+    }
+
+    public MissionFilesWithBLOBs withOutputBucket(String outputBucket) {
+        this.setOutputBucket(outputBucket);
+        return this;
+    }
+
+    public void setOutputBucket(String outputBucket) {
+        this.outputBucket = outputBucket;
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        MissionFilesWithBLOBs other = (MissionFilesWithBLOBs) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getMissionId() == null ? other.getMissionId() == null : this.getMissionId().equals(other.getMissionId()))
+            && (this.getMemberId() == null ? other.getMemberId() == null : this.getMemberId().equals(other.getMemberId()))
+            && (this.getClientId() == null ? other.getClientId() == null : this.getClientId().equals(other.getClientId()))
+            && (this.getConvertTypeId() == null ? other.getConvertTypeId() == null : this.getConvertTypeId().equals(other.getConvertTypeId()))
+            && (this.getProcessId() == null ? other.getProcessId() == null : this.getProcessId().equals(other.getProcessId()))
+            && (this.getFileType() == null ? other.getFileType() == null : this.getFileType().equals(other.getFileType()))
+            && (this.getOrderId() == null ? other.getOrderId() == null : this.getOrderId().equals(other.getOrderId()))
+            && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus()))
+            && (this.getPrice() == null ? other.getPrice() == null : this.getPrice().equals(other.getPrice()))
+            && (this.getSize() == null ? other.getSize() == null : this.getSize().equals(other.getSize()))
+            && (this.getPath() == null ? other.getPath() == null : this.getPath().equals(other.getPath()))
+            && (this.getFileName() == null ? other.getFileName() == null : this.getFileName().equals(other.getFileName()))
+            && (this.getCallbackUrl() == null ? other.getCallbackUrl() == null : this.getCallbackUrl().equals(other.getCallbackUrl()))
+            && (this.getCreatedAt() == null ? other.getCreatedAt() == null : this.getCreatedAt().equals(other.getCreatedAt()))
+            && (this.getUpdatedAt() == null ? other.getUpdatedAt() == null : this.getUpdatedAt().equals(other.getUpdatedAt()))
+            && (this.getOriginalFilename() == null ? other.getOriginalFilename() == null : this.getOriginalFilename().equals(other.getOriginalFilename()))
+            && (this.getDeletedAt() == null ? other.getDeletedAt() == null : this.getDeletedAt().equals(other.getDeletedAt()))
+            && (this.getConvertAt() == null ? other.getConvertAt() == null : this.getConvertAt().equals(other.getConvertAt()))
+            && (this.getConvertEndAt() == null ? other.getConvertEndAt() == null : this.getConvertEndAt().equals(other.getConvertEndAt()))
+            && (this.getWorker() == null ? other.getWorker() == null : this.getWorker().equals(other.getWorker()))
+            && (this.getSourceType() == null ? other.getSourceType() == null : this.getSourceType().equals(other.getSourceType()))
+            && (this.getFailReason() == null ? other.getFailReason() == null : this.getFailReason().equals(other.getFailReason()))
+            && (this.getUploadedAt() == null ? other.getUploadedAt() == null : this.getUploadedAt().equals(other.getUploadedAt()))
+            && (this.getOutFilename() == null ? other.getOutFilename() == null : this.getOutFilename().equals(other.getOutFilename()))
+            && (this.getOcrCode() == null ? other.getOcrCode() == null : this.getOcrCode().equals(other.getOcrCode()))
+            && (this.getTraceResult() == null ? other.getTraceResult() == null : this.getTraceResult().equals(other.getTraceResult()))
+            && (this.getOutputBucket() == null ? other.getOutputBucket() == null : this.getOutputBucket().equals(other.getOutputBucket()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getMissionId() == null) ? 0 : getMissionId().hashCode());
+        result = prime * result + ((getMemberId() == null) ? 0 : getMemberId().hashCode());
+        result = prime * result + ((getClientId() == null) ? 0 : getClientId().hashCode());
+        result = prime * result + ((getConvertTypeId() == null) ? 0 : getConvertTypeId().hashCode());
+        result = prime * result + ((getProcessId() == null) ? 0 : getProcessId().hashCode());
+        result = prime * result + ((getFileType() == null) ? 0 : getFileType().hashCode());
+        result = prime * result + ((getOrderId() == null) ? 0 : getOrderId().hashCode());
+        result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode());
+        result = prime * result + ((getPrice() == null) ? 0 : getPrice().hashCode());
+        result = prime * result + ((getSize() == null) ? 0 : getSize().hashCode());
+        result = prime * result + ((getPath() == null) ? 0 : getPath().hashCode());
+        result = prime * result + ((getFileName() == null) ? 0 : getFileName().hashCode());
+        result = prime * result + ((getCallbackUrl() == null) ? 0 : getCallbackUrl().hashCode());
+        result = prime * result + ((getCreatedAt() == null) ? 0 : getCreatedAt().hashCode());
+        result = prime * result + ((getUpdatedAt() == null) ? 0 : getUpdatedAt().hashCode());
+        result = prime * result + ((getOriginalFilename() == null) ? 0 : getOriginalFilename().hashCode());
+        result = prime * result + ((getDeletedAt() == null) ? 0 : getDeletedAt().hashCode());
+        result = prime * result + ((getConvertAt() == null) ? 0 : getConvertAt().hashCode());
+        result = prime * result + ((getConvertEndAt() == null) ? 0 : getConvertEndAt().hashCode());
+        result = prime * result + ((getWorker() == null) ? 0 : getWorker().hashCode());
+        result = prime * result + ((getSourceType() == null) ? 0 : getSourceType().hashCode());
+        result = prime * result + ((getFailReason() == null) ? 0 : getFailReason().hashCode());
+        result = prime * result + ((getUploadedAt() == null) ? 0 : getUploadedAt().hashCode());
+        result = prime * result + ((getOutFilename() == null) ? 0 : getOutFilename().hashCode());
+        result = prime * result + ((getOcrCode() == null) ? 0 : getOcrCode().hashCode());
+        result = prime * result + ((getTraceResult() == null) ? 0 : getTraceResult().hashCode());
+        result = prime * result + ((getOutputBucket() == null) ? 0 : getOutputBucket().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", traceResult=").append(traceResult);
+        sb.append(", outputBucket=").append(outputBucket);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 166 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/Missions.java

@@ -0,0 +1,166 @@
+package cn.kdan.pdf.backend.core.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class Missions implements Serializable {
+    private Integer id;
+
+    private String memberId;
+
+    private String clientId;
+
+    private Integer price;
+
+    private Date createdAt;
+
+    private Date updatedAt;
+
+    private Date deletedAt;
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public Missions withId(Integer id) {
+        this.setId(id);
+        return this;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getMemberId() {
+        return memberId;
+    }
+
+    public Missions withMemberId(String memberId) {
+        this.setMemberId(memberId);
+        return this;
+    }
+
+    public void setMemberId(String memberId) {
+        this.memberId = memberId;
+    }
+
+    public String getClientId() {
+        return clientId;
+    }
+
+    public Missions withClientId(String clientId) {
+        this.setClientId(clientId);
+        return this;
+    }
+
+    public void setClientId(String clientId) {
+        this.clientId = clientId;
+    }
+
+    public Integer getPrice() {
+        return price;
+    }
+
+    public Missions withPrice(Integer price) {
+        this.setPrice(price);
+        return this;
+    }
+
+    public void setPrice(Integer price) {
+        this.price = price;
+    }
+
+    public Date getCreatedAt() {
+        return createdAt;
+    }
+
+    public Missions withCreatedAt(Date createdAt) {
+        this.setCreatedAt(createdAt);
+        return this;
+    }
+
+    public void setCreatedAt(Date createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public Date getUpdatedAt() {
+        return updatedAt;
+    }
+
+    public Missions withUpdatedAt(Date updatedAt) {
+        this.setUpdatedAt(updatedAt);
+        return this;
+    }
+
+    public void setUpdatedAt(Date updatedAt) {
+        this.updatedAt = updatedAt;
+    }
+
+    public Date getDeletedAt() {
+        return deletedAt;
+    }
+
+    public Missions withDeletedAt(Date deletedAt) {
+        this.setDeletedAt(deletedAt);
+        return this;
+    }
+
+    public void setDeletedAt(Date deletedAt) {
+        this.deletedAt = deletedAt;
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        Missions other = (Missions) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getMemberId() == null ? other.getMemberId() == null : this.getMemberId().equals(other.getMemberId()))
+            && (this.getClientId() == null ? other.getClientId() == null : this.getClientId().equals(other.getClientId()))
+            && (this.getPrice() == null ? other.getPrice() == null : this.getPrice().equals(other.getPrice()))
+            && (this.getCreatedAt() == null ? other.getCreatedAt() == null : this.getCreatedAt().equals(other.getCreatedAt()))
+            && (this.getUpdatedAt() == null ? other.getUpdatedAt() == null : this.getUpdatedAt().equals(other.getUpdatedAt()))
+            && (this.getDeletedAt() == null ? other.getDeletedAt() == null : this.getDeletedAt().equals(other.getDeletedAt()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getMemberId() == null) ? 0 : getMemberId().hashCode());
+        result = prime * result + ((getClientId() == null) ? 0 : getClientId().hashCode());
+        result = prime * result + ((getPrice() == null) ? 0 : getPrice().hashCode());
+        result = prime * result + ((getCreatedAt() == null) ? 0 : getCreatedAt().hashCode());
+        result = prime * result + ((getUpdatedAt() == null) ? 0 : getUpdatedAt().hashCode());
+        result = prime * result + ((getDeletedAt() == null) ? 0 : getDeletedAt().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", memberId=").append(memberId);
+        sb.append(", clientId=").append(clientId);
+        sb.append(", price=").append(price);
+        sb.append(", createdAt=").append(createdAt);
+        sb.append(", updatedAt=").append(updatedAt);
+        sb.append(", deletedAt=").append(deletedAt);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 651 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/MissionsExample.java

@@ -0,0 +1,651 @@
+package cn.kdan.pdf.backend.core.model;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class MissionsExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public MissionsExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<Criterion>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Integer value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Integer value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Integer value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Integer value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Integer value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Integer value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Integer> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Integer> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Integer value1, Integer value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Integer value1, Integer value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdIsNull() {
+            addCriterion("member_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdIsNotNull() {
+            addCriterion("member_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdEqualTo(String value) {
+            addCriterion("member_id =", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdNotEqualTo(String value) {
+            addCriterion("member_id <>", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdGreaterThan(String value) {
+            addCriterion("member_id >", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdGreaterThanOrEqualTo(String value) {
+            addCriterion("member_id >=", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdLessThan(String value) {
+            addCriterion("member_id <", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdLessThanOrEqualTo(String value) {
+            addCriterion("member_id <=", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdLike(String value) {
+            addCriterion("member_id like", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdNotLike(String value) {
+            addCriterion("member_id not like", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdIn(List<String> values) {
+            addCriterion("member_id in", values, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdNotIn(List<String> values) {
+            addCriterion("member_id not in", values, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdBetween(String value1, String value2) {
+            addCriterion("member_id between", value1, value2, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdNotBetween(String value1, String value2) {
+            addCriterion("member_id not between", value1, value2, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIdIsNull() {
+            addCriterion("client_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIdIsNotNull() {
+            addCriterion("client_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIdEqualTo(String value) {
+            addCriterion("client_id =", value, "clientId");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIdNotEqualTo(String value) {
+            addCriterion("client_id <>", value, "clientId");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIdGreaterThan(String value) {
+            addCriterion("client_id >", value, "clientId");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIdGreaterThanOrEqualTo(String value) {
+            addCriterion("client_id >=", value, "clientId");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIdLessThan(String value) {
+            addCriterion("client_id <", value, "clientId");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIdLessThanOrEqualTo(String value) {
+            addCriterion("client_id <=", value, "clientId");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIdLike(String value) {
+            addCriterion("client_id like", value, "clientId");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIdNotLike(String value) {
+            addCriterion("client_id not like", value, "clientId");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIdIn(List<String> values) {
+            addCriterion("client_id in", values, "clientId");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIdNotIn(List<String> values) {
+            addCriterion("client_id not in", values, "clientId");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIdBetween(String value1, String value2) {
+            addCriterion("client_id between", value1, value2, "clientId");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIdNotBetween(String value1, String value2) {
+            addCriterion("client_id not between", value1, value2, "clientId");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceIsNull() {
+            addCriterion("price is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceIsNotNull() {
+            addCriterion("price is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceEqualTo(Integer value) {
+            addCriterion("price =", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceNotEqualTo(Integer value) {
+            addCriterion("price <>", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceGreaterThan(Integer value) {
+            addCriterion("price >", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceGreaterThanOrEqualTo(Integer value) {
+            addCriterion("price >=", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLessThan(Integer value) {
+            addCriterion("price <", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLessThanOrEqualTo(Integer value) {
+            addCriterion("price <=", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceIn(List<Integer> values) {
+            addCriterion("price in", values, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceNotIn(List<Integer> values) {
+            addCriterion("price not in", values, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceBetween(Integer value1, Integer value2) {
+            addCriterion("price between", value1, value2, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceNotBetween(Integer value1, Integer value2) {
+            addCriterion("price not between", value1, value2, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtIsNull() {
+            addCriterion("created_at is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtIsNotNull() {
+            addCriterion("created_at is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtEqualTo(Date value) {
+            addCriterion("created_at =", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtNotEqualTo(Date value) {
+            addCriterion("created_at <>", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtGreaterThan(Date value) {
+            addCriterion("created_at >", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtGreaterThanOrEqualTo(Date value) {
+            addCriterion("created_at >=", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtLessThan(Date value) {
+            addCriterion("created_at <", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtLessThanOrEqualTo(Date value) {
+            addCriterion("created_at <=", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtIn(List<Date> values) {
+            addCriterion("created_at in", values, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtNotIn(List<Date> values) {
+            addCriterion("created_at not in", values, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtBetween(Date value1, Date value2) {
+            addCriterion("created_at between", value1, value2, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtNotBetween(Date value1, Date value2) {
+            addCriterion("created_at not between", value1, value2, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtIsNull() {
+            addCriterion("updated_at is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtIsNotNull() {
+            addCriterion("updated_at is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtEqualTo(Date value) {
+            addCriterion("updated_at =", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtNotEqualTo(Date value) {
+            addCriterion("updated_at <>", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtGreaterThan(Date value) {
+            addCriterion("updated_at >", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtGreaterThanOrEqualTo(Date value) {
+            addCriterion("updated_at >=", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtLessThan(Date value) {
+            addCriterion("updated_at <", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtLessThanOrEqualTo(Date value) {
+            addCriterion("updated_at <=", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtIn(List<Date> values) {
+            addCriterion("updated_at in", values, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtNotIn(List<Date> values) {
+            addCriterion("updated_at not in", values, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtBetween(Date value1, Date value2) {
+            addCriterion("updated_at between", value1, value2, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtNotBetween(Date value1, Date value2) {
+            addCriterion("updated_at not between", value1, value2, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtIsNull() {
+            addCriterion("deleted_at is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtIsNotNull() {
+            addCriterion("deleted_at is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtEqualTo(Date value) {
+            addCriterion("deleted_at =", value, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtNotEqualTo(Date value) {
+            addCriterion("deleted_at <>", value, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtGreaterThan(Date value) {
+            addCriterion("deleted_at >", value, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtGreaterThanOrEqualTo(Date value) {
+            addCriterion("deleted_at >=", value, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtLessThan(Date value) {
+            addCriterion("deleted_at <", value, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtLessThanOrEqualTo(Date value) {
+            addCriterion("deleted_at <=", value, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtIn(List<Date> values) {
+            addCriterion("deleted_at in", values, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtNotIn(List<Date> values) {
+            addCriterion("deleted_at not in", values, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtBetween(Date value1, Date value2) {
+            addCriterion("deleted_at between", value1, value2, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeletedAtNotBetween(Date value1, Date value2) {
+            addCriterion("deleted_at not between", value1, value2, "deletedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdLikeInsensitive(String value) {
+            addCriterion("upper(member_id) like", value.toUpperCase(), "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIdLikeInsensitive(String value) {
+            addCriterion("upper(client_id) like", value.toUpperCase(), "clientId");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}

+ 221 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/Orders.java

@@ -0,0 +1,221 @@
+package cn.kdan.pdf.backend.core.model;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class Orders implements Serializable {
+    private Integer id;
+
+    private String memberId;
+
+    private String subscriptionId;
+
+    private Integer payment;
+
+    private String qrcodeUrl;
+
+    private Integer status;
+
+    private Date createdAt;
+
+    private Date updatedAt;
+
+    private BigDecimal tradeNo;
+
+    private Float price;
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public Orders withId(Integer id) {
+        this.setId(id);
+        return this;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getMemberId() {
+        return memberId;
+    }
+
+    public Orders withMemberId(String memberId) {
+        this.setMemberId(memberId);
+        return this;
+    }
+
+    public void setMemberId(String memberId) {
+        this.memberId = memberId;
+    }
+
+    public String getSubscriptionId() {
+        return subscriptionId;
+    }
+
+    public Orders withSubscriptionId(String subscriptionId) {
+        this.setSubscriptionId(subscriptionId);
+        return this;
+    }
+
+    public void setSubscriptionId(String subscriptionId) {
+        this.subscriptionId = subscriptionId;
+    }
+
+    public Integer getPayment() {
+        return payment;
+    }
+
+    public Orders withPayment(Integer payment) {
+        this.setPayment(payment);
+        return this;
+    }
+
+    public void setPayment(Integer payment) {
+        this.payment = payment;
+    }
+
+    public String getQrcodeUrl() {
+        return qrcodeUrl;
+    }
+
+    public Orders withQrcodeUrl(String qrcodeUrl) {
+        this.setQrcodeUrl(qrcodeUrl);
+        return this;
+    }
+
+    public void setQrcodeUrl(String qrcodeUrl) {
+        this.qrcodeUrl = qrcodeUrl;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public Orders withStatus(Integer status) {
+        this.setStatus(status);
+        return this;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Date getCreatedAt() {
+        return createdAt;
+    }
+
+    public Orders withCreatedAt(Date createdAt) {
+        this.setCreatedAt(createdAt);
+        return this;
+    }
+
+    public void setCreatedAt(Date createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public Date getUpdatedAt() {
+        return updatedAt;
+    }
+
+    public Orders withUpdatedAt(Date updatedAt) {
+        this.setUpdatedAt(updatedAt);
+        return this;
+    }
+
+    public void setUpdatedAt(Date updatedAt) {
+        this.updatedAt = updatedAt;
+    }
+
+    public BigDecimal getTradeNo() {
+        return tradeNo;
+    }
+
+    public Orders withTradeNo(BigDecimal tradeNo) {
+        this.setTradeNo(tradeNo);
+        return this;
+    }
+
+    public void setTradeNo(BigDecimal tradeNo) {
+        this.tradeNo = tradeNo;
+    }
+
+    public Float getPrice() {
+        return price;
+    }
+
+    public Orders withPrice(Float price) {
+        this.setPrice(price);
+        return this;
+    }
+
+    public void setPrice(Float price) {
+        this.price = price;
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        Orders other = (Orders) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getMemberId() == null ? other.getMemberId() == null : this.getMemberId().equals(other.getMemberId()))
+            && (this.getSubscriptionId() == null ? other.getSubscriptionId() == null : this.getSubscriptionId().equals(other.getSubscriptionId()))
+            && (this.getPayment() == null ? other.getPayment() == null : this.getPayment().equals(other.getPayment()))
+            && (this.getQrcodeUrl() == null ? other.getQrcodeUrl() == null : this.getQrcodeUrl().equals(other.getQrcodeUrl()))
+            && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus()))
+            && (this.getCreatedAt() == null ? other.getCreatedAt() == null : this.getCreatedAt().equals(other.getCreatedAt()))
+            && (this.getUpdatedAt() == null ? other.getUpdatedAt() == null : this.getUpdatedAt().equals(other.getUpdatedAt()))
+            && (this.getTradeNo() == null ? other.getTradeNo() == null : this.getTradeNo().equals(other.getTradeNo()))
+            && (this.getPrice() == null ? other.getPrice() == null : this.getPrice().equals(other.getPrice()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getMemberId() == null) ? 0 : getMemberId().hashCode());
+        result = prime * result + ((getSubscriptionId() == null) ? 0 : getSubscriptionId().hashCode());
+        result = prime * result + ((getPayment() == null) ? 0 : getPayment().hashCode());
+        result = prime * result + ((getQrcodeUrl() == null) ? 0 : getQrcodeUrl().hashCode());
+        result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode());
+        result = prime * result + ((getCreatedAt() == null) ? 0 : getCreatedAt().hashCode());
+        result = prime * result + ((getUpdatedAt() == null) ? 0 : getUpdatedAt().hashCode());
+        result = prime * result + ((getTradeNo() == null) ? 0 : getTradeNo().hashCode());
+        result = prime * result + ((getPrice() == null) ? 0 : getPrice().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", memberId=").append(memberId);
+        sb.append(", subscriptionId=").append(subscriptionId);
+        sb.append(", payment=").append(payment);
+        sb.append(", qrcodeUrl=").append(qrcodeUrl);
+        sb.append(", status=").append(status);
+        sb.append(", createdAt=").append(createdAt);
+        sb.append(", updatedAt=").append(updatedAt);
+        sb.append(", tradeNo=").append(tradeNo);
+        sb.append(", price=").append(price);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 847 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/OrdersExample.java

@@ -0,0 +1,847 @@
+package cn.kdan.pdf.backend.core.model;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class OrdersExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public OrdersExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<Criterion>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Integer value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Integer value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Integer value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Integer value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Integer value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Integer value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Integer> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Integer> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Integer value1, Integer value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Integer value1, Integer value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdIsNull() {
+            addCriterion("member_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdIsNotNull() {
+            addCriterion("member_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdEqualTo(String value) {
+            addCriterion("member_id =", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdNotEqualTo(String value) {
+            addCriterion("member_id <>", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdGreaterThan(String value) {
+            addCriterion("member_id >", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdGreaterThanOrEqualTo(String value) {
+            addCriterion("member_id >=", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdLessThan(String value) {
+            addCriterion("member_id <", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdLessThanOrEqualTo(String value) {
+            addCriterion("member_id <=", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdLike(String value) {
+            addCriterion("member_id like", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdNotLike(String value) {
+            addCriterion("member_id not like", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdIn(List<String> values) {
+            addCriterion("member_id in", values, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdNotIn(List<String> values) {
+            addCriterion("member_id not in", values, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdBetween(String value1, String value2) {
+            addCriterion("member_id between", value1, value2, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdNotBetween(String value1, String value2) {
+            addCriterion("member_id not between", value1, value2, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionIdIsNull() {
+            addCriterion("subscription_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionIdIsNotNull() {
+            addCriterion("subscription_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionIdEqualTo(String value) {
+            addCriterion("subscription_id =", value, "subscriptionId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionIdNotEqualTo(String value) {
+            addCriterion("subscription_id <>", value, "subscriptionId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionIdGreaterThan(String value) {
+            addCriterion("subscription_id >", value, "subscriptionId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionIdGreaterThanOrEqualTo(String value) {
+            addCriterion("subscription_id >=", value, "subscriptionId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionIdLessThan(String value) {
+            addCriterion("subscription_id <", value, "subscriptionId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionIdLessThanOrEqualTo(String value) {
+            addCriterion("subscription_id <=", value, "subscriptionId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionIdLike(String value) {
+            addCriterion("subscription_id like", value, "subscriptionId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionIdNotLike(String value) {
+            addCriterion("subscription_id not like", value, "subscriptionId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionIdIn(List<String> values) {
+            addCriterion("subscription_id in", values, "subscriptionId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionIdNotIn(List<String> values) {
+            addCriterion("subscription_id not in", values, "subscriptionId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionIdBetween(String value1, String value2) {
+            addCriterion("subscription_id between", value1, value2, "subscriptionId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionIdNotBetween(String value1, String value2) {
+            addCriterion("subscription_id not between", value1, value2, "subscriptionId");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentIsNull() {
+            addCriterion("payment is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentIsNotNull() {
+            addCriterion("payment is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentEqualTo(Integer value) {
+            addCriterion("payment =", value, "payment");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentNotEqualTo(Integer value) {
+            addCriterion("payment <>", value, "payment");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentGreaterThan(Integer value) {
+            addCriterion("payment >", value, "payment");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentGreaterThanOrEqualTo(Integer value) {
+            addCriterion("payment >=", value, "payment");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentLessThan(Integer value) {
+            addCriterion("payment <", value, "payment");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentLessThanOrEqualTo(Integer value) {
+            addCriterion("payment <=", value, "payment");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentIn(List<Integer> values) {
+            addCriterion("payment in", values, "payment");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentNotIn(List<Integer> values) {
+            addCriterion("payment not in", values, "payment");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentBetween(Integer value1, Integer value2) {
+            addCriterion("payment between", value1, value2, "payment");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentNotBetween(Integer value1, Integer value2) {
+            addCriterion("payment not between", value1, value2, "payment");
+            return (Criteria) this;
+        }
+
+        public Criteria andQrcodeUrlIsNull() {
+            addCriterion("qrcode_url is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andQrcodeUrlIsNotNull() {
+            addCriterion("qrcode_url is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andQrcodeUrlEqualTo(String value) {
+            addCriterion("qrcode_url =", value, "qrcodeUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andQrcodeUrlNotEqualTo(String value) {
+            addCriterion("qrcode_url <>", value, "qrcodeUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andQrcodeUrlGreaterThan(String value) {
+            addCriterion("qrcode_url >", value, "qrcodeUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andQrcodeUrlGreaterThanOrEqualTo(String value) {
+            addCriterion("qrcode_url >=", value, "qrcodeUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andQrcodeUrlLessThan(String value) {
+            addCriterion("qrcode_url <", value, "qrcodeUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andQrcodeUrlLessThanOrEqualTo(String value) {
+            addCriterion("qrcode_url <=", value, "qrcodeUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andQrcodeUrlLike(String value) {
+            addCriterion("qrcode_url like", value, "qrcodeUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andQrcodeUrlNotLike(String value) {
+            addCriterion("qrcode_url not like", value, "qrcodeUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andQrcodeUrlIn(List<String> values) {
+            addCriterion("qrcode_url in", values, "qrcodeUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andQrcodeUrlNotIn(List<String> values) {
+            addCriterion("qrcode_url not in", values, "qrcodeUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andQrcodeUrlBetween(String value1, String value2) {
+            addCriterion("qrcode_url between", value1, value2, "qrcodeUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andQrcodeUrlNotBetween(String value1, String value2) {
+            addCriterion("qrcode_url not between", value1, value2, "qrcodeUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNull() {
+            addCriterion("`status` is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNotNull() {
+            addCriterion("`status` is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusEqualTo(Integer value) {
+            addCriterion("`status` =", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotEqualTo(Integer value) {
+            addCriterion("`status` <>", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThan(Integer value) {
+            addCriterion("`status` >", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThanOrEqualTo(Integer value) {
+            addCriterion("`status` >=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThan(Integer value) {
+            addCriterion("`status` <", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThanOrEqualTo(Integer value) {
+            addCriterion("`status` <=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIn(List<Integer> values) {
+            addCriterion("`status` in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotIn(List<Integer> values) {
+            addCriterion("`status` not in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusBetween(Integer value1, Integer value2) {
+            addCriterion("`status` between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotBetween(Integer value1, Integer value2) {
+            addCriterion("`status` not between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtIsNull() {
+            addCriterion("created_at is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtIsNotNull() {
+            addCriterion("created_at is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtEqualTo(Date value) {
+            addCriterion("created_at =", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtNotEqualTo(Date value) {
+            addCriterion("created_at <>", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtGreaterThan(Date value) {
+            addCriterion("created_at >", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtGreaterThanOrEqualTo(Date value) {
+            addCriterion("created_at >=", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtLessThan(Date value) {
+            addCriterion("created_at <", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtLessThanOrEqualTo(Date value) {
+            addCriterion("created_at <=", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtIn(List<Date> values) {
+            addCriterion("created_at in", values, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtNotIn(List<Date> values) {
+            addCriterion("created_at not in", values, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtBetween(Date value1, Date value2) {
+            addCriterion("created_at between", value1, value2, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtNotBetween(Date value1, Date value2) {
+            addCriterion("created_at not between", value1, value2, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtIsNull() {
+            addCriterion("updated_at is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtIsNotNull() {
+            addCriterion("updated_at is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtEqualTo(Date value) {
+            addCriterion("updated_at =", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtNotEqualTo(Date value) {
+            addCriterion("updated_at <>", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtGreaterThan(Date value) {
+            addCriterion("updated_at >", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtGreaterThanOrEqualTo(Date value) {
+            addCriterion("updated_at >=", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtLessThan(Date value) {
+            addCriterion("updated_at <", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtLessThanOrEqualTo(Date value) {
+            addCriterion("updated_at <=", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtIn(List<Date> values) {
+            addCriterion("updated_at in", values, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtNotIn(List<Date> values) {
+            addCriterion("updated_at not in", values, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtBetween(Date value1, Date value2) {
+            addCriterion("updated_at between", value1, value2, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtNotBetween(Date value1, Date value2) {
+            addCriterion("updated_at not between", value1, value2, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andTradeNoIsNull() {
+            addCriterion("trade_no is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTradeNoIsNotNull() {
+            addCriterion("trade_no is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTradeNoEqualTo(BigDecimal value) {
+            addCriterion("trade_no =", value, "tradeNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTradeNoNotEqualTo(BigDecimal value) {
+            addCriterion("trade_no <>", value, "tradeNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTradeNoGreaterThan(BigDecimal value) {
+            addCriterion("trade_no >", value, "tradeNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTradeNoGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("trade_no >=", value, "tradeNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTradeNoLessThan(BigDecimal value) {
+            addCriterion("trade_no <", value, "tradeNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTradeNoLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("trade_no <=", value, "tradeNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTradeNoIn(List<BigDecimal> values) {
+            addCriterion("trade_no in", values, "tradeNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTradeNoNotIn(List<BigDecimal> values) {
+            addCriterion("trade_no not in", values, "tradeNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTradeNoBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("trade_no between", value1, value2, "tradeNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTradeNoNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("trade_no not between", value1, value2, "tradeNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceIsNull() {
+            addCriterion("price is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceIsNotNull() {
+            addCriterion("price is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceEqualTo(Float value) {
+            addCriterion("price =", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceNotEqualTo(Float value) {
+            addCriterion("price <>", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceGreaterThan(Float value) {
+            addCriterion("price >", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceGreaterThanOrEqualTo(Float value) {
+            addCriterion("price >=", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLessThan(Float value) {
+            addCriterion("price <", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLessThanOrEqualTo(Float value) {
+            addCriterion("price <=", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceIn(List<Float> values) {
+            addCriterion("price in", values, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceNotIn(List<Float> values) {
+            addCriterion("price not in", values, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceBetween(Float value1, Float value2) {
+            addCriterion("price between", value1, value2, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceNotBetween(Float value1, Float value2) {
+            addCriterion("price not between", value1, value2, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdLikeInsensitive(String value) {
+            addCriterion("upper(member_id) like", value.toUpperCase(), "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionIdLikeInsensitive(String value) {
+            addCriterion("upper(subscription_id) like", value.toUpperCase(), "subscriptionId");
+            return (Criteria) this;
+        }
+
+        public Criteria andQrcodeUrlLikeInsensitive(String value) {
+            addCriterion("upper(qrcode_url) like", value.toUpperCase(), "qrcodeUrl");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}

+ 131 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/OrdersWithBLOBs.java

@@ -0,0 +1,131 @@
+package cn.kdan.pdf.backend.core.model;
+
+import java.io.Serializable;
+
+public class OrdersWithBLOBs extends Orders implements Serializable {
+    private String pagePayUrl;
+
+    private String result;
+
+    private String androidSign;
+
+    private String androidSign2;
+
+    private static final long serialVersionUID = 1L;
+
+    public String getPagePayUrl() {
+        return pagePayUrl;
+    }
+
+    public OrdersWithBLOBs withPagePayUrl(String pagePayUrl) {
+        this.setPagePayUrl(pagePayUrl);
+        return this;
+    }
+
+    public void setPagePayUrl(String pagePayUrl) {
+        this.pagePayUrl = pagePayUrl;
+    }
+
+    public String getResult() {
+        return result;
+    }
+
+    public OrdersWithBLOBs withResult(String result) {
+        this.setResult(result);
+        return this;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
+
+    public String getAndroidSign() {
+        return androidSign;
+    }
+
+    public OrdersWithBLOBs withAndroidSign(String androidSign) {
+        this.setAndroidSign(androidSign);
+        return this;
+    }
+
+    public void setAndroidSign(String androidSign) {
+        this.androidSign = androidSign;
+    }
+
+    public String getAndroidSign2() {
+        return androidSign2;
+    }
+
+    public OrdersWithBLOBs withAndroidSign2(String androidSign2) {
+        this.setAndroidSign2(androidSign2);
+        return this;
+    }
+
+    public void setAndroidSign2(String androidSign2) {
+        this.androidSign2 = androidSign2;
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        OrdersWithBLOBs other = (OrdersWithBLOBs) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getMemberId() == null ? other.getMemberId() == null : this.getMemberId().equals(other.getMemberId()))
+            && (this.getSubscriptionId() == null ? other.getSubscriptionId() == null : this.getSubscriptionId().equals(other.getSubscriptionId()))
+            && (this.getPayment() == null ? other.getPayment() == null : this.getPayment().equals(other.getPayment()))
+            && (this.getQrcodeUrl() == null ? other.getQrcodeUrl() == null : this.getQrcodeUrl().equals(other.getQrcodeUrl()))
+            && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus()))
+            && (this.getCreatedAt() == null ? other.getCreatedAt() == null : this.getCreatedAt().equals(other.getCreatedAt()))
+            && (this.getUpdatedAt() == null ? other.getUpdatedAt() == null : this.getUpdatedAt().equals(other.getUpdatedAt()))
+            && (this.getTradeNo() == null ? other.getTradeNo() == null : this.getTradeNo().equals(other.getTradeNo()))
+            && (this.getPrice() == null ? other.getPrice() == null : this.getPrice().equals(other.getPrice()))
+            && (this.getPagePayUrl() == null ? other.getPagePayUrl() == null : this.getPagePayUrl().equals(other.getPagePayUrl()))
+            && (this.getResult() == null ? other.getResult() == null : this.getResult().equals(other.getResult()))
+            && (this.getAndroidSign() == null ? other.getAndroidSign() == null : this.getAndroidSign().equals(other.getAndroidSign()))
+            && (this.getAndroidSign2() == null ? other.getAndroidSign2() == null : this.getAndroidSign2().equals(other.getAndroidSign2()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getMemberId() == null) ? 0 : getMemberId().hashCode());
+        result = prime * result + ((getSubscriptionId() == null) ? 0 : getSubscriptionId().hashCode());
+        result = prime * result + ((getPayment() == null) ? 0 : getPayment().hashCode());
+        result = prime * result + ((getQrcodeUrl() == null) ? 0 : getQrcodeUrl().hashCode());
+        result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode());
+        result = prime * result + ((getCreatedAt() == null) ? 0 : getCreatedAt().hashCode());
+        result = prime * result + ((getUpdatedAt() == null) ? 0 : getUpdatedAt().hashCode());
+        result = prime * result + ((getTradeNo() == null) ? 0 : getTradeNo().hashCode());
+        result = prime * result + ((getPrice() == null) ? 0 : getPrice().hashCode());
+        result = prime * result + ((getPagePayUrl() == null) ? 0 : getPagePayUrl().hashCode());
+        result = prime * result + ((getResult() == null) ? 0 : getResult().hashCode());
+        result = prime * result + ((getAndroidSign() == null) ? 0 : getAndroidSign().hashCode());
+        result = prime * result + ((getAndroidSign2() == null) ? 0 : getAndroidSign2().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", pagePayUrl=").append(pagePayUrl);
+        sb.append(", result=").append(result);
+        sb.append(", androidSign=").append(androidSign);
+        sb.append(", androidSign2=").append(androidSign2);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 256 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/OutputFiles.java

@@ -0,0 +1,256 @@
+package cn.kdan.pdf.backend.core.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class OutputFiles implements Serializable {
+    private Integer id;
+
+    private String memberId;
+
+    private String missionId;
+
+    private String missionFileId;
+
+    private String clientId;
+
+    private String fileName;
+
+    private String originalFilename;
+
+    private String path;
+
+    private Integer size;
+
+    private Date deletedAt;
+
+    private Date createdAt;
+
+    private Date updatedAt;
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public OutputFiles withId(Integer id) {
+        this.setId(id);
+        return this;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getMemberId() {
+        return memberId;
+    }
+
+    public OutputFiles withMemberId(String memberId) {
+        this.setMemberId(memberId);
+        return this;
+    }
+
+    public void setMemberId(String memberId) {
+        this.memberId = memberId;
+    }
+
+    public String getMissionId() {
+        return missionId;
+    }
+
+    public OutputFiles withMissionId(String missionId) {
+        this.setMissionId(missionId);
+        return this;
+    }
+
+    public void setMissionId(String missionId) {
+        this.missionId = missionId;
+    }
+
+    public String getMissionFileId() {
+        return missionFileId;
+    }
+
+    public OutputFiles withMissionFileId(String missionFileId) {
+        this.setMissionFileId(missionFileId);
+        return this;
+    }
+
+    public void setMissionFileId(String missionFileId) {
+        this.missionFileId = missionFileId;
+    }
+
+    public String getClientId() {
+        return clientId;
+    }
+
+    public OutputFiles withClientId(String clientId) {
+        this.setClientId(clientId);
+        return this;
+    }
+
+    public void setClientId(String clientId) {
+        this.clientId = clientId;
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public OutputFiles withFileName(String fileName) {
+        this.setFileName(fileName);
+        return this;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public String getOriginalFilename() {
+        return originalFilename;
+    }
+
+    public OutputFiles withOriginalFilename(String originalFilename) {
+        this.setOriginalFilename(originalFilename);
+        return this;
+    }
+
+    public void setOriginalFilename(String originalFilename) {
+        this.originalFilename = originalFilename;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public OutputFiles withPath(String path) {
+        this.setPath(path);
+        return this;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    public Integer getSize() {
+        return size;
+    }
+
+    public OutputFiles withSize(Integer size) {
+        this.setSize(size);
+        return this;
+    }
+
+    public void setSize(Integer size) {
+        this.size = size;
+    }
+
+    public Date getDeletedAt() {
+        return deletedAt;
+    }
+
+    public OutputFiles withDeletedAt(Date deletedAt) {
+        this.setDeletedAt(deletedAt);
+        return this;
+    }
+
+    public void setDeletedAt(Date deletedAt) {
+        this.deletedAt = deletedAt;
+    }
+
+    public Date getCreatedAt() {
+        return createdAt;
+    }
+
+    public OutputFiles withCreatedAt(Date createdAt) {
+        this.setCreatedAt(createdAt);
+        return this;
+    }
+
+    public void setCreatedAt(Date createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public Date getUpdatedAt() {
+        return updatedAt;
+    }
+
+    public OutputFiles withUpdatedAt(Date updatedAt) {
+        this.setUpdatedAt(updatedAt);
+        return this;
+    }
+
+    public void setUpdatedAt(Date updatedAt) {
+        this.updatedAt = updatedAt;
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        OutputFiles other = (OutputFiles) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getMemberId() == null ? other.getMemberId() == null : this.getMemberId().equals(other.getMemberId()))
+            && (this.getMissionId() == null ? other.getMissionId() == null : this.getMissionId().equals(other.getMissionId()))
+            && (this.getMissionFileId() == null ? other.getMissionFileId() == null : this.getMissionFileId().equals(other.getMissionFileId()))
+            && (this.getClientId() == null ? other.getClientId() == null : this.getClientId().equals(other.getClientId()))
+            && (this.getFileName() == null ? other.getFileName() == null : this.getFileName().equals(other.getFileName()))
+            && (this.getOriginalFilename() == null ? other.getOriginalFilename() == null : this.getOriginalFilename().equals(other.getOriginalFilename()))
+            && (this.getPath() == null ? other.getPath() == null : this.getPath().equals(other.getPath()))
+            && (this.getSize() == null ? other.getSize() == null : this.getSize().equals(other.getSize()))
+            && (this.getDeletedAt() == null ? other.getDeletedAt() == null : this.getDeletedAt().equals(other.getDeletedAt()))
+            && (this.getCreatedAt() == null ? other.getCreatedAt() == null : this.getCreatedAt().equals(other.getCreatedAt()))
+            && (this.getUpdatedAt() == null ? other.getUpdatedAt() == null : this.getUpdatedAt().equals(other.getUpdatedAt()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getMemberId() == null) ? 0 : getMemberId().hashCode());
+        result = prime * result + ((getMissionId() == null) ? 0 : getMissionId().hashCode());
+        result = prime * result + ((getMissionFileId() == null) ? 0 : getMissionFileId().hashCode());
+        result = prime * result + ((getClientId() == null) ? 0 : getClientId().hashCode());
+        result = prime * result + ((getFileName() == null) ? 0 : getFileName().hashCode());
+        result = prime * result + ((getOriginalFilename() == null) ? 0 : getOriginalFilename().hashCode());
+        result = prime * result + ((getPath() == null) ? 0 : getPath().hashCode());
+        result = prime * result + ((getSize() == null) ? 0 : getSize().hashCode());
+        result = prime * result + ((getDeletedAt() == null) ? 0 : getDeletedAt().hashCode());
+        result = prime * result + ((getCreatedAt() == null) ? 0 : getCreatedAt().hashCode());
+        result = prime * result + ((getUpdatedAt() == null) ? 0 : getUpdatedAt().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", memberId=").append(memberId);
+        sb.append(", missionId=").append(missionId);
+        sb.append(", missionFileId=").append(missionFileId);
+        sb.append(", clientId=").append(clientId);
+        sb.append(", fileName=").append(fileName);
+        sb.append(", originalFilename=").append(originalFilename);
+        sb.append(", path=").append(path);
+        sb.append(", size=").append(size);
+        sb.append(", deletedAt=").append(deletedAt);
+        sb.append(", createdAt=").append(createdAt);
+        sb.append(", updatedAt=").append(updatedAt);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1026 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/OutputFilesExample.java


+ 256 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/PricingDiscounts.java

@@ -0,0 +1,256 @@
+package cn.kdan.pdf.backend.core.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class PricingDiscounts implements Serializable {
+    private Integer id;
+
+    private String title;
+
+    private Float price;
+
+    private Float discounts;
+
+    private Integer extraPoints;
+
+    private String extraPeriod;
+
+    private Date startDate;
+
+    private Date endDate;
+
+    private Date createdAt;
+
+    private Date updatedAt;
+
+    private Integer limitTimes;
+
+    private Integer subscriptionType;
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public PricingDiscounts withId(Integer id) {
+        this.setId(id);
+        return this;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public PricingDiscounts withTitle(String title) {
+        this.setTitle(title);
+        return this;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Float getPrice() {
+        return price;
+    }
+
+    public PricingDiscounts withPrice(Float price) {
+        this.setPrice(price);
+        return this;
+    }
+
+    public void setPrice(Float price) {
+        this.price = price;
+    }
+
+    public Float getDiscounts() {
+        return discounts;
+    }
+
+    public PricingDiscounts withDiscounts(Float discounts) {
+        this.setDiscounts(discounts);
+        return this;
+    }
+
+    public void setDiscounts(Float discounts) {
+        this.discounts = discounts;
+    }
+
+    public Integer getExtraPoints() {
+        return extraPoints;
+    }
+
+    public PricingDiscounts withExtraPoints(Integer extraPoints) {
+        this.setExtraPoints(extraPoints);
+        return this;
+    }
+
+    public void setExtraPoints(Integer extraPoints) {
+        this.extraPoints = extraPoints;
+    }
+
+    public String getExtraPeriod() {
+        return extraPeriod;
+    }
+
+    public PricingDiscounts withExtraPeriod(String extraPeriod) {
+        this.setExtraPeriod(extraPeriod);
+        return this;
+    }
+
+    public void setExtraPeriod(String extraPeriod) {
+        this.extraPeriod = extraPeriod;
+    }
+
+    public Date getStartDate() {
+        return startDate;
+    }
+
+    public PricingDiscounts withStartDate(Date startDate) {
+        this.setStartDate(startDate);
+        return this;
+    }
+
+    public void setStartDate(Date startDate) {
+        this.startDate = startDate;
+    }
+
+    public Date getEndDate() {
+        return endDate;
+    }
+
+    public PricingDiscounts withEndDate(Date endDate) {
+        this.setEndDate(endDate);
+        return this;
+    }
+
+    public void setEndDate(Date endDate) {
+        this.endDate = endDate;
+    }
+
+    public Date getCreatedAt() {
+        return createdAt;
+    }
+
+    public PricingDiscounts withCreatedAt(Date createdAt) {
+        this.setCreatedAt(createdAt);
+        return this;
+    }
+
+    public void setCreatedAt(Date createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public Date getUpdatedAt() {
+        return updatedAt;
+    }
+
+    public PricingDiscounts withUpdatedAt(Date updatedAt) {
+        this.setUpdatedAt(updatedAt);
+        return this;
+    }
+
+    public void setUpdatedAt(Date updatedAt) {
+        this.updatedAt = updatedAt;
+    }
+
+    public Integer getLimitTimes() {
+        return limitTimes;
+    }
+
+    public PricingDiscounts withLimitTimes(Integer limitTimes) {
+        this.setLimitTimes(limitTimes);
+        return this;
+    }
+
+    public void setLimitTimes(Integer limitTimes) {
+        this.limitTimes = limitTimes;
+    }
+
+    public Integer getSubscriptionType() {
+        return subscriptionType;
+    }
+
+    public PricingDiscounts withSubscriptionType(Integer subscriptionType) {
+        this.setSubscriptionType(subscriptionType);
+        return this;
+    }
+
+    public void setSubscriptionType(Integer subscriptionType) {
+        this.subscriptionType = subscriptionType;
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        PricingDiscounts other = (PricingDiscounts) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getTitle() == null ? other.getTitle() == null : this.getTitle().equals(other.getTitle()))
+            && (this.getPrice() == null ? other.getPrice() == null : this.getPrice().equals(other.getPrice()))
+            && (this.getDiscounts() == null ? other.getDiscounts() == null : this.getDiscounts().equals(other.getDiscounts()))
+            && (this.getExtraPoints() == null ? other.getExtraPoints() == null : this.getExtraPoints().equals(other.getExtraPoints()))
+            && (this.getExtraPeriod() == null ? other.getExtraPeriod() == null : this.getExtraPeriod().equals(other.getExtraPeriod()))
+            && (this.getStartDate() == null ? other.getStartDate() == null : this.getStartDate().equals(other.getStartDate()))
+            && (this.getEndDate() == null ? other.getEndDate() == null : this.getEndDate().equals(other.getEndDate()))
+            && (this.getCreatedAt() == null ? other.getCreatedAt() == null : this.getCreatedAt().equals(other.getCreatedAt()))
+            && (this.getUpdatedAt() == null ? other.getUpdatedAt() == null : this.getUpdatedAt().equals(other.getUpdatedAt()))
+            && (this.getLimitTimes() == null ? other.getLimitTimes() == null : this.getLimitTimes().equals(other.getLimitTimes()))
+            && (this.getSubscriptionType() == null ? other.getSubscriptionType() == null : this.getSubscriptionType().equals(other.getSubscriptionType()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getTitle() == null) ? 0 : getTitle().hashCode());
+        result = prime * result + ((getPrice() == null) ? 0 : getPrice().hashCode());
+        result = prime * result + ((getDiscounts() == null) ? 0 : getDiscounts().hashCode());
+        result = prime * result + ((getExtraPoints() == null) ? 0 : getExtraPoints().hashCode());
+        result = prime * result + ((getExtraPeriod() == null) ? 0 : getExtraPeriod().hashCode());
+        result = prime * result + ((getStartDate() == null) ? 0 : getStartDate().hashCode());
+        result = prime * result + ((getEndDate() == null) ? 0 : getEndDate().hashCode());
+        result = prime * result + ((getCreatedAt() == null) ? 0 : getCreatedAt().hashCode());
+        result = prime * result + ((getUpdatedAt() == null) ? 0 : getUpdatedAt().hashCode());
+        result = prime * result + ((getLimitTimes() == null) ? 0 : getLimitTimes().hashCode());
+        result = prime * result + ((getSubscriptionType() == null) ? 0 : getSubscriptionType().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", title=").append(title);
+        sb.append(", price=").append(price);
+        sb.append(", discounts=").append(discounts);
+        sb.append(", extraPoints=").append(extraPoints);
+        sb.append(", extraPeriod=").append(extraPeriod);
+        sb.append(", startDate=").append(startDate);
+        sb.append(", endDate=").append(endDate);
+        sb.append(", createdAt=").append(createdAt);
+        sb.append(", updatedAt=").append(updatedAt);
+        sb.append(", limitTimes=").append(limitTimes);
+        sb.append(", subscriptionType=").append(subscriptionType);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 951 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/PricingDiscountsExample.java

@@ -0,0 +1,951 @@
+package cn.kdan.pdf.backend.core.model;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class PricingDiscountsExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public PricingDiscountsExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<Criterion>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Integer value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Integer value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Integer value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Integer value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Integer value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Integer value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Integer> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Integer> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Integer value1, Integer value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Integer value1, Integer value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleIsNull() {
+            addCriterion("title is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleIsNotNull() {
+            addCriterion("title is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleEqualTo(String value) {
+            addCriterion("title =", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotEqualTo(String value) {
+            addCriterion("title <>", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleGreaterThan(String value) {
+            addCriterion("title >", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleGreaterThanOrEqualTo(String value) {
+            addCriterion("title >=", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleLessThan(String value) {
+            addCriterion("title <", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleLessThanOrEqualTo(String value) {
+            addCriterion("title <=", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleLike(String value) {
+            addCriterion("title like", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotLike(String value) {
+            addCriterion("title not like", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleIn(List<String> values) {
+            addCriterion("title in", values, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotIn(List<String> values) {
+            addCriterion("title not in", values, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleBetween(String value1, String value2) {
+            addCriterion("title between", value1, value2, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotBetween(String value1, String value2) {
+            addCriterion("title not between", value1, value2, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceIsNull() {
+            addCriterion("price is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceIsNotNull() {
+            addCriterion("price is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceEqualTo(Float value) {
+            addCriterion("price =", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceNotEqualTo(Float value) {
+            addCriterion("price <>", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceGreaterThan(Float value) {
+            addCriterion("price >", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceGreaterThanOrEqualTo(Float value) {
+            addCriterion("price >=", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLessThan(Float value) {
+            addCriterion("price <", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLessThanOrEqualTo(Float value) {
+            addCriterion("price <=", value, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceIn(List<Float> values) {
+            addCriterion("price in", values, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceNotIn(List<Float> values) {
+            addCriterion("price not in", values, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceBetween(Float value1, Float value2) {
+            addCriterion("price between", value1, value2, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceNotBetween(Float value1, Float value2) {
+            addCriterion("price not between", value1, value2, "price");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountsIsNull() {
+            addCriterion("discounts is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountsIsNotNull() {
+            addCriterion("discounts is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountsEqualTo(Float value) {
+            addCriterion("discounts =", value, "discounts");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountsNotEqualTo(Float value) {
+            addCriterion("discounts <>", value, "discounts");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountsGreaterThan(Float value) {
+            addCriterion("discounts >", value, "discounts");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountsGreaterThanOrEqualTo(Float value) {
+            addCriterion("discounts >=", value, "discounts");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountsLessThan(Float value) {
+            addCriterion("discounts <", value, "discounts");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountsLessThanOrEqualTo(Float value) {
+            addCriterion("discounts <=", value, "discounts");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountsIn(List<Float> values) {
+            addCriterion("discounts in", values, "discounts");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountsNotIn(List<Float> values) {
+            addCriterion("discounts not in", values, "discounts");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountsBetween(Float value1, Float value2) {
+            addCriterion("discounts between", value1, value2, "discounts");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountsNotBetween(Float value1, Float value2) {
+            addCriterion("discounts not between", value1, value2, "discounts");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPointsIsNull() {
+            addCriterion("extra_points is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPointsIsNotNull() {
+            addCriterion("extra_points is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPointsEqualTo(Integer value) {
+            addCriterion("extra_points =", value, "extraPoints");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPointsNotEqualTo(Integer value) {
+            addCriterion("extra_points <>", value, "extraPoints");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPointsGreaterThan(Integer value) {
+            addCriterion("extra_points >", value, "extraPoints");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPointsGreaterThanOrEqualTo(Integer value) {
+            addCriterion("extra_points >=", value, "extraPoints");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPointsLessThan(Integer value) {
+            addCriterion("extra_points <", value, "extraPoints");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPointsLessThanOrEqualTo(Integer value) {
+            addCriterion("extra_points <=", value, "extraPoints");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPointsIn(List<Integer> values) {
+            addCriterion("extra_points in", values, "extraPoints");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPointsNotIn(List<Integer> values) {
+            addCriterion("extra_points not in", values, "extraPoints");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPointsBetween(Integer value1, Integer value2) {
+            addCriterion("extra_points between", value1, value2, "extraPoints");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPointsNotBetween(Integer value1, Integer value2) {
+            addCriterion("extra_points not between", value1, value2, "extraPoints");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPeriodIsNull() {
+            addCriterion("extra_period is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPeriodIsNotNull() {
+            addCriterion("extra_period is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPeriodEqualTo(String value) {
+            addCriterion("extra_period =", value, "extraPeriod");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPeriodNotEqualTo(String value) {
+            addCriterion("extra_period <>", value, "extraPeriod");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPeriodGreaterThan(String value) {
+            addCriterion("extra_period >", value, "extraPeriod");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPeriodGreaterThanOrEqualTo(String value) {
+            addCriterion("extra_period >=", value, "extraPeriod");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPeriodLessThan(String value) {
+            addCriterion("extra_period <", value, "extraPeriod");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPeriodLessThanOrEqualTo(String value) {
+            addCriterion("extra_period <=", value, "extraPeriod");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPeriodLike(String value) {
+            addCriterion("extra_period like", value, "extraPeriod");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPeriodNotLike(String value) {
+            addCriterion("extra_period not like", value, "extraPeriod");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPeriodIn(List<String> values) {
+            addCriterion("extra_period in", values, "extraPeriod");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPeriodNotIn(List<String> values) {
+            addCriterion("extra_period not in", values, "extraPeriod");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPeriodBetween(String value1, String value2) {
+            addCriterion("extra_period between", value1, value2, "extraPeriod");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPeriodNotBetween(String value1, String value2) {
+            addCriterion("extra_period not between", value1, value2, "extraPeriod");
+            return (Criteria) this;
+        }
+
+        public Criteria andStartDateIsNull() {
+            addCriterion("start_date is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStartDateIsNotNull() {
+            addCriterion("start_date is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStartDateEqualTo(Date value) {
+            addCriterion("start_date =", value, "startDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andStartDateNotEqualTo(Date value) {
+            addCriterion("start_date <>", value, "startDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andStartDateGreaterThan(Date value) {
+            addCriterion("start_date >", value, "startDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andStartDateGreaterThanOrEqualTo(Date value) {
+            addCriterion("start_date >=", value, "startDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andStartDateLessThan(Date value) {
+            addCriterion("start_date <", value, "startDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andStartDateLessThanOrEqualTo(Date value) {
+            addCriterion("start_date <=", value, "startDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andStartDateIn(List<Date> values) {
+            addCriterion("start_date in", values, "startDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andStartDateNotIn(List<Date> values) {
+            addCriterion("start_date not in", values, "startDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andStartDateBetween(Date value1, Date value2) {
+            addCriterion("start_date between", value1, value2, "startDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andStartDateNotBetween(Date value1, Date value2) {
+            addCriterion("start_date not between", value1, value2, "startDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andEndDateIsNull() {
+            addCriterion("end_date is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEndDateIsNotNull() {
+            addCriterion("end_date is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEndDateEqualTo(Date value) {
+            addCriterion("end_date =", value, "endDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andEndDateNotEqualTo(Date value) {
+            addCriterion("end_date <>", value, "endDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andEndDateGreaterThan(Date value) {
+            addCriterion("end_date >", value, "endDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andEndDateGreaterThanOrEqualTo(Date value) {
+            addCriterion("end_date >=", value, "endDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andEndDateLessThan(Date value) {
+            addCriterion("end_date <", value, "endDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andEndDateLessThanOrEqualTo(Date value) {
+            addCriterion("end_date <=", value, "endDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andEndDateIn(List<Date> values) {
+            addCriterion("end_date in", values, "endDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andEndDateNotIn(List<Date> values) {
+            addCriterion("end_date not in", values, "endDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andEndDateBetween(Date value1, Date value2) {
+            addCriterion("end_date between", value1, value2, "endDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andEndDateNotBetween(Date value1, Date value2) {
+            addCriterion("end_date not between", value1, value2, "endDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtIsNull() {
+            addCriterion("created_at is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtIsNotNull() {
+            addCriterion("created_at is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtEqualTo(Date value) {
+            addCriterion("created_at =", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtNotEqualTo(Date value) {
+            addCriterion("created_at <>", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtGreaterThan(Date value) {
+            addCriterion("created_at >", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtGreaterThanOrEqualTo(Date value) {
+            addCriterion("created_at >=", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtLessThan(Date value) {
+            addCriterion("created_at <", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtLessThanOrEqualTo(Date value) {
+            addCriterion("created_at <=", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtIn(List<Date> values) {
+            addCriterion("created_at in", values, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtNotIn(List<Date> values) {
+            addCriterion("created_at not in", values, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtBetween(Date value1, Date value2) {
+            addCriterion("created_at between", value1, value2, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtNotBetween(Date value1, Date value2) {
+            addCriterion("created_at not between", value1, value2, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtIsNull() {
+            addCriterion("updated_at is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtIsNotNull() {
+            addCriterion("updated_at is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtEqualTo(Date value) {
+            addCriterion("updated_at =", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtNotEqualTo(Date value) {
+            addCriterion("updated_at <>", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtGreaterThan(Date value) {
+            addCriterion("updated_at >", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtGreaterThanOrEqualTo(Date value) {
+            addCriterion("updated_at >=", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtLessThan(Date value) {
+            addCriterion("updated_at <", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtLessThanOrEqualTo(Date value) {
+            addCriterion("updated_at <=", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtIn(List<Date> values) {
+            addCriterion("updated_at in", values, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtNotIn(List<Date> values) {
+            addCriterion("updated_at not in", values, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtBetween(Date value1, Date value2) {
+            addCriterion("updated_at between", value1, value2, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtNotBetween(Date value1, Date value2) {
+            addCriterion("updated_at not between", value1, value2, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andLimitTimesIsNull() {
+            addCriterion("limit_times is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLimitTimesIsNotNull() {
+            addCriterion("limit_times is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLimitTimesEqualTo(Integer value) {
+            addCriterion("limit_times =", value, "limitTimes");
+            return (Criteria) this;
+        }
+
+        public Criteria andLimitTimesNotEqualTo(Integer value) {
+            addCriterion("limit_times <>", value, "limitTimes");
+            return (Criteria) this;
+        }
+
+        public Criteria andLimitTimesGreaterThan(Integer value) {
+            addCriterion("limit_times >", value, "limitTimes");
+            return (Criteria) this;
+        }
+
+        public Criteria andLimitTimesGreaterThanOrEqualTo(Integer value) {
+            addCriterion("limit_times >=", value, "limitTimes");
+            return (Criteria) this;
+        }
+
+        public Criteria andLimitTimesLessThan(Integer value) {
+            addCriterion("limit_times <", value, "limitTimes");
+            return (Criteria) this;
+        }
+
+        public Criteria andLimitTimesLessThanOrEqualTo(Integer value) {
+            addCriterion("limit_times <=", value, "limitTimes");
+            return (Criteria) this;
+        }
+
+        public Criteria andLimitTimesIn(List<Integer> values) {
+            addCriterion("limit_times in", values, "limitTimes");
+            return (Criteria) this;
+        }
+
+        public Criteria andLimitTimesNotIn(List<Integer> values) {
+            addCriterion("limit_times not in", values, "limitTimes");
+            return (Criteria) this;
+        }
+
+        public Criteria andLimitTimesBetween(Integer value1, Integer value2) {
+            addCriterion("limit_times between", value1, value2, "limitTimes");
+            return (Criteria) this;
+        }
+
+        public Criteria andLimitTimesNotBetween(Integer value1, Integer value2) {
+            addCriterion("limit_times not between", value1, value2, "limitTimes");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionTypeIsNull() {
+            addCriterion("subscription_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionTypeIsNotNull() {
+            addCriterion("subscription_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionTypeEqualTo(Integer value) {
+            addCriterion("subscription_type =", value, "subscriptionType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionTypeNotEqualTo(Integer value) {
+            addCriterion("subscription_type <>", value, "subscriptionType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionTypeGreaterThan(Integer value) {
+            addCriterion("subscription_type >", value, "subscriptionType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionTypeGreaterThanOrEqualTo(Integer value) {
+            addCriterion("subscription_type >=", value, "subscriptionType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionTypeLessThan(Integer value) {
+            addCriterion("subscription_type <", value, "subscriptionType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionTypeLessThanOrEqualTo(Integer value) {
+            addCriterion("subscription_type <=", value, "subscriptionType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionTypeIn(List<Integer> values) {
+            addCriterion("subscription_type in", values, "subscriptionType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionTypeNotIn(List<Integer> values) {
+            addCriterion("subscription_type not in", values, "subscriptionType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionTypeBetween(Integer value1, Integer value2) {
+            addCriterion("subscription_type between", value1, value2, "subscriptionType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubscriptionTypeNotBetween(Integer value1, Integer value2) {
+            addCriterion("subscription_type not between", value1, value2, "subscriptionType");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleLikeInsensitive(String value) {
+            addCriterion("upper(title) like", value.toUpperCase(), "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtraPeriodLikeInsensitive(String value) {
+            addCriterion("upper(extra_period) like", value.toUpperCase(), "extraPeriod");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}

+ 328 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/Pricings.java

@@ -0,0 +1,328 @@
+package cn.kdan.pdf.backend.core.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class Pricings implements Serializable {
+    private Integer id;
+
+    private Integer mode;
+
+    private Integer amount;
+
+    private String period;
+
+    private Float marketPrice;
+
+    private String description;
+
+    private Date createdAt;
+
+    private Date updatedAt;
+
+    private String productCode;
+
+    private Float appDiscounts;
+
+    private Float webDiscounts;
+
+    private String title;
+
+    private Integer saleType;
+
+    private String pricingDiscountId;
+
+    private String slogan;
+
+    private String sloganEn;
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public Pricings withId(Integer id) {
+        this.setId(id);
+        return this;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getMode() {
+        return mode;
+    }
+
+    public Pricings withMode(Integer mode) {
+        this.setMode(mode);
+        return this;
+    }
+
+    public void setMode(Integer mode) {
+        this.mode = mode;
+    }
+
+    public Integer getAmount() {
+        return amount;
+    }
+
+    public Pricings withAmount(Integer amount) {
+        this.setAmount(amount);
+        return this;
+    }
+
+    public void setAmount(Integer amount) {
+        this.amount = amount;
+    }
+
+    public String getPeriod() {
+        return period;
+    }
+
+    public Pricings withPeriod(String period) {
+        this.setPeriod(period);
+        return this;
+    }
+
+    public void setPeriod(String period) {
+        this.period = period;
+    }
+
+    public Float getMarketPrice() {
+        return marketPrice;
+    }
+
+    public Pricings withMarketPrice(Float marketPrice) {
+        this.setMarketPrice(marketPrice);
+        return this;
+    }
+
+    public void setMarketPrice(Float marketPrice) {
+        this.marketPrice = marketPrice;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public Pricings withDescription(String description) {
+        this.setDescription(description);
+        return this;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Date getCreatedAt() {
+        return createdAt;
+    }
+
+    public Pricings withCreatedAt(Date createdAt) {
+        this.setCreatedAt(createdAt);
+        return this;
+    }
+
+    public void setCreatedAt(Date createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public Date getUpdatedAt() {
+        return updatedAt;
+    }
+
+    public Pricings withUpdatedAt(Date updatedAt) {
+        this.setUpdatedAt(updatedAt);
+        return this;
+    }
+
+    public void setUpdatedAt(Date updatedAt) {
+        this.updatedAt = updatedAt;
+    }
+
+    public String getProductCode() {
+        return productCode;
+    }
+
+    public Pricings withProductCode(String productCode) {
+        this.setProductCode(productCode);
+        return this;
+    }
+
+    public void setProductCode(String productCode) {
+        this.productCode = productCode;
+    }
+
+    public Float getAppDiscounts() {
+        return appDiscounts;
+    }
+
+    public Pricings withAppDiscounts(Float appDiscounts) {
+        this.setAppDiscounts(appDiscounts);
+        return this;
+    }
+
+    public void setAppDiscounts(Float appDiscounts) {
+        this.appDiscounts = appDiscounts;
+    }
+
+    public Float getWebDiscounts() {
+        return webDiscounts;
+    }
+
+    public Pricings withWebDiscounts(Float webDiscounts) {
+        this.setWebDiscounts(webDiscounts);
+        return this;
+    }
+
+    public void setWebDiscounts(Float webDiscounts) {
+        this.webDiscounts = webDiscounts;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public Pricings withTitle(String title) {
+        this.setTitle(title);
+        return this;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Integer getSaleType() {
+        return saleType;
+    }
+
+    public Pricings withSaleType(Integer saleType) {
+        this.setSaleType(saleType);
+        return this;
+    }
+
+    public void setSaleType(Integer saleType) {
+        this.saleType = saleType;
+    }
+
+    public String getPricingDiscountId() {
+        return pricingDiscountId;
+    }
+
+    public Pricings withPricingDiscountId(String pricingDiscountId) {
+        this.setPricingDiscountId(pricingDiscountId);
+        return this;
+    }
+
+    public void setPricingDiscountId(String pricingDiscountId) {
+        this.pricingDiscountId = pricingDiscountId;
+    }
+
+    public String getSlogan() {
+        return slogan;
+    }
+
+    public Pricings withSlogan(String slogan) {
+        this.setSlogan(slogan);
+        return this;
+    }
+
+    public void setSlogan(String slogan) {
+        this.slogan = slogan;
+    }
+
+    public String getSloganEn() {
+        return sloganEn;
+    }
+
+    public Pricings withSloganEn(String sloganEn) {
+        this.setSloganEn(sloganEn);
+        return this;
+    }
+
+    public void setSloganEn(String sloganEn) {
+        this.sloganEn = sloganEn;
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        Pricings other = (Pricings) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getMode() == null ? other.getMode() == null : this.getMode().equals(other.getMode()))
+            && (this.getAmount() == null ? other.getAmount() == null : this.getAmount().equals(other.getAmount()))
+            && (this.getPeriod() == null ? other.getPeriod() == null : this.getPeriod().equals(other.getPeriod()))
+            && (this.getMarketPrice() == null ? other.getMarketPrice() == null : this.getMarketPrice().equals(other.getMarketPrice()))
+            && (this.getDescription() == null ? other.getDescription() == null : this.getDescription().equals(other.getDescription()))
+            && (this.getCreatedAt() == null ? other.getCreatedAt() == null : this.getCreatedAt().equals(other.getCreatedAt()))
+            && (this.getUpdatedAt() == null ? other.getUpdatedAt() == null : this.getUpdatedAt().equals(other.getUpdatedAt()))
+            && (this.getProductCode() == null ? other.getProductCode() == null : this.getProductCode().equals(other.getProductCode()))
+            && (this.getAppDiscounts() == null ? other.getAppDiscounts() == null : this.getAppDiscounts().equals(other.getAppDiscounts()))
+            && (this.getWebDiscounts() == null ? other.getWebDiscounts() == null : this.getWebDiscounts().equals(other.getWebDiscounts()))
+            && (this.getTitle() == null ? other.getTitle() == null : this.getTitle().equals(other.getTitle()))
+            && (this.getSaleType() == null ? other.getSaleType() == null : this.getSaleType().equals(other.getSaleType()))
+            && (this.getPricingDiscountId() == null ? other.getPricingDiscountId() == null : this.getPricingDiscountId().equals(other.getPricingDiscountId()))
+            && (this.getSlogan() == null ? other.getSlogan() == null : this.getSlogan().equals(other.getSlogan()))
+            && (this.getSloganEn() == null ? other.getSloganEn() == null : this.getSloganEn().equals(other.getSloganEn()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getMode() == null) ? 0 : getMode().hashCode());
+        result = prime * result + ((getAmount() == null) ? 0 : getAmount().hashCode());
+        result = prime * result + ((getPeriod() == null) ? 0 : getPeriod().hashCode());
+        result = prime * result + ((getMarketPrice() == null) ? 0 : getMarketPrice().hashCode());
+        result = prime * result + ((getDescription() == null) ? 0 : getDescription().hashCode());
+        result = prime * result + ((getCreatedAt() == null) ? 0 : getCreatedAt().hashCode());
+        result = prime * result + ((getUpdatedAt() == null) ? 0 : getUpdatedAt().hashCode());
+        result = prime * result + ((getProductCode() == null) ? 0 : getProductCode().hashCode());
+        result = prime * result + ((getAppDiscounts() == null) ? 0 : getAppDiscounts().hashCode());
+        result = prime * result + ((getWebDiscounts() == null) ? 0 : getWebDiscounts().hashCode());
+        result = prime * result + ((getTitle() == null) ? 0 : getTitle().hashCode());
+        result = prime * result + ((getSaleType() == null) ? 0 : getSaleType().hashCode());
+        result = prime * result + ((getPricingDiscountId() == null) ? 0 : getPricingDiscountId().hashCode());
+        result = prime * result + ((getSlogan() == null) ? 0 : getSlogan().hashCode());
+        result = prime * result + ((getSloganEn() == null) ? 0 : getSloganEn().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", mode=").append(mode);
+        sb.append(", amount=").append(amount);
+        sb.append(", period=").append(period);
+        sb.append(", marketPrice=").append(marketPrice);
+        sb.append(", description=").append(description);
+        sb.append(", createdAt=").append(createdAt);
+        sb.append(", updatedAt=").append(updatedAt);
+        sb.append(", productCode=").append(productCode);
+        sb.append(", appDiscounts=").append(appDiscounts);
+        sb.append(", webDiscounts=").append(webDiscounts);
+        sb.append(", title=").append(title);
+        sb.append(", saleType=").append(saleType);
+        sb.append(", pricingDiscountId=").append(pricingDiscountId);
+        sb.append(", slogan=").append(slogan);
+        sb.append(", sloganEn=").append(sloganEn);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1266 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/PricingsExample.java


+ 328 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/SetPricings.java

@@ -0,0 +1,328 @@
+package cn.kdan.pdf.backend.core.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class SetPricings implements Serializable {
+    private Integer id;
+
+    private Integer mode;
+
+    private Integer spaceAmount;
+
+    private Integer pointsAmount;
+
+    private Integer maxTraffic;
+
+    private Integer maxFilesize;
+
+    private String period;
+
+    private Float marketPrice;
+
+    private Date createdAt;
+
+    private Date updatedAt;
+
+    private String productCode;
+
+    private Float appDiscounts;
+
+    private Float webDiscounts;
+
+    private String title;
+
+    private Integer saleType;
+
+    private String pricingDiscountId;
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public SetPricings withId(Integer id) {
+        this.setId(id);
+        return this;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getMode() {
+        return mode;
+    }
+
+    public SetPricings withMode(Integer mode) {
+        this.setMode(mode);
+        return this;
+    }
+
+    public void setMode(Integer mode) {
+        this.mode = mode;
+    }
+
+    public Integer getSpaceAmount() {
+        return spaceAmount;
+    }
+
+    public SetPricings withSpaceAmount(Integer spaceAmount) {
+        this.setSpaceAmount(spaceAmount);
+        return this;
+    }
+
+    public void setSpaceAmount(Integer spaceAmount) {
+        this.spaceAmount = spaceAmount;
+    }
+
+    public Integer getPointsAmount() {
+        return pointsAmount;
+    }
+
+    public SetPricings withPointsAmount(Integer pointsAmount) {
+        this.setPointsAmount(pointsAmount);
+        return this;
+    }
+
+    public void setPointsAmount(Integer pointsAmount) {
+        this.pointsAmount = pointsAmount;
+    }
+
+    public Integer getMaxTraffic() {
+        return maxTraffic;
+    }
+
+    public SetPricings withMaxTraffic(Integer maxTraffic) {
+        this.setMaxTraffic(maxTraffic);
+        return this;
+    }
+
+    public void setMaxTraffic(Integer maxTraffic) {
+        this.maxTraffic = maxTraffic;
+    }
+
+    public Integer getMaxFilesize() {
+        return maxFilesize;
+    }
+
+    public SetPricings withMaxFilesize(Integer maxFilesize) {
+        this.setMaxFilesize(maxFilesize);
+        return this;
+    }
+
+    public void setMaxFilesize(Integer maxFilesize) {
+        this.maxFilesize = maxFilesize;
+    }
+
+    public String getPeriod() {
+        return period;
+    }
+
+    public SetPricings withPeriod(String period) {
+        this.setPeriod(period);
+        return this;
+    }
+
+    public void setPeriod(String period) {
+        this.period = period;
+    }
+
+    public Float getMarketPrice() {
+        return marketPrice;
+    }
+
+    public SetPricings withMarketPrice(Float marketPrice) {
+        this.setMarketPrice(marketPrice);
+        return this;
+    }
+
+    public void setMarketPrice(Float marketPrice) {
+        this.marketPrice = marketPrice;
+    }
+
+    public Date getCreatedAt() {
+        return createdAt;
+    }
+
+    public SetPricings withCreatedAt(Date createdAt) {
+        this.setCreatedAt(createdAt);
+        return this;
+    }
+
+    public void setCreatedAt(Date createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public Date getUpdatedAt() {
+        return updatedAt;
+    }
+
+    public SetPricings withUpdatedAt(Date updatedAt) {
+        this.setUpdatedAt(updatedAt);
+        return this;
+    }
+
+    public void setUpdatedAt(Date updatedAt) {
+        this.updatedAt = updatedAt;
+    }
+
+    public String getProductCode() {
+        return productCode;
+    }
+
+    public SetPricings withProductCode(String productCode) {
+        this.setProductCode(productCode);
+        return this;
+    }
+
+    public void setProductCode(String productCode) {
+        this.productCode = productCode;
+    }
+
+    public Float getAppDiscounts() {
+        return appDiscounts;
+    }
+
+    public SetPricings withAppDiscounts(Float appDiscounts) {
+        this.setAppDiscounts(appDiscounts);
+        return this;
+    }
+
+    public void setAppDiscounts(Float appDiscounts) {
+        this.appDiscounts = appDiscounts;
+    }
+
+    public Float getWebDiscounts() {
+        return webDiscounts;
+    }
+
+    public SetPricings withWebDiscounts(Float webDiscounts) {
+        this.setWebDiscounts(webDiscounts);
+        return this;
+    }
+
+    public void setWebDiscounts(Float webDiscounts) {
+        this.webDiscounts = webDiscounts;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public SetPricings withTitle(String title) {
+        this.setTitle(title);
+        return this;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Integer getSaleType() {
+        return saleType;
+    }
+
+    public SetPricings withSaleType(Integer saleType) {
+        this.setSaleType(saleType);
+        return this;
+    }
+
+    public void setSaleType(Integer saleType) {
+        this.saleType = saleType;
+    }
+
+    public String getPricingDiscountId() {
+        return pricingDiscountId;
+    }
+
+    public SetPricings withPricingDiscountId(String pricingDiscountId) {
+        this.setPricingDiscountId(pricingDiscountId);
+        return this;
+    }
+
+    public void setPricingDiscountId(String pricingDiscountId) {
+        this.pricingDiscountId = pricingDiscountId;
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        SetPricings other = (SetPricings) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getMode() == null ? other.getMode() == null : this.getMode().equals(other.getMode()))
+            && (this.getSpaceAmount() == null ? other.getSpaceAmount() == null : this.getSpaceAmount().equals(other.getSpaceAmount()))
+            && (this.getPointsAmount() == null ? other.getPointsAmount() == null : this.getPointsAmount().equals(other.getPointsAmount()))
+            && (this.getMaxTraffic() == null ? other.getMaxTraffic() == null : this.getMaxTraffic().equals(other.getMaxTraffic()))
+            && (this.getMaxFilesize() == null ? other.getMaxFilesize() == null : this.getMaxFilesize().equals(other.getMaxFilesize()))
+            && (this.getPeriod() == null ? other.getPeriod() == null : this.getPeriod().equals(other.getPeriod()))
+            && (this.getMarketPrice() == null ? other.getMarketPrice() == null : this.getMarketPrice().equals(other.getMarketPrice()))
+            && (this.getCreatedAt() == null ? other.getCreatedAt() == null : this.getCreatedAt().equals(other.getCreatedAt()))
+            && (this.getUpdatedAt() == null ? other.getUpdatedAt() == null : this.getUpdatedAt().equals(other.getUpdatedAt()))
+            && (this.getProductCode() == null ? other.getProductCode() == null : this.getProductCode().equals(other.getProductCode()))
+            && (this.getAppDiscounts() == null ? other.getAppDiscounts() == null : this.getAppDiscounts().equals(other.getAppDiscounts()))
+            && (this.getWebDiscounts() == null ? other.getWebDiscounts() == null : this.getWebDiscounts().equals(other.getWebDiscounts()))
+            && (this.getTitle() == null ? other.getTitle() == null : this.getTitle().equals(other.getTitle()))
+            && (this.getSaleType() == null ? other.getSaleType() == null : this.getSaleType().equals(other.getSaleType()))
+            && (this.getPricingDiscountId() == null ? other.getPricingDiscountId() == null : this.getPricingDiscountId().equals(other.getPricingDiscountId()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getMode() == null) ? 0 : getMode().hashCode());
+        result = prime * result + ((getSpaceAmount() == null) ? 0 : getSpaceAmount().hashCode());
+        result = prime * result + ((getPointsAmount() == null) ? 0 : getPointsAmount().hashCode());
+        result = prime * result + ((getMaxTraffic() == null) ? 0 : getMaxTraffic().hashCode());
+        result = prime * result + ((getMaxFilesize() == null) ? 0 : getMaxFilesize().hashCode());
+        result = prime * result + ((getPeriod() == null) ? 0 : getPeriod().hashCode());
+        result = prime * result + ((getMarketPrice() == null) ? 0 : getMarketPrice().hashCode());
+        result = prime * result + ((getCreatedAt() == null) ? 0 : getCreatedAt().hashCode());
+        result = prime * result + ((getUpdatedAt() == null) ? 0 : getUpdatedAt().hashCode());
+        result = prime * result + ((getProductCode() == null) ? 0 : getProductCode().hashCode());
+        result = prime * result + ((getAppDiscounts() == null) ? 0 : getAppDiscounts().hashCode());
+        result = prime * result + ((getWebDiscounts() == null) ? 0 : getWebDiscounts().hashCode());
+        result = prime * result + ((getTitle() == null) ? 0 : getTitle().hashCode());
+        result = prime * result + ((getSaleType() == null) ? 0 : getSaleType().hashCode());
+        result = prime * result + ((getPricingDiscountId() == null) ? 0 : getPricingDiscountId().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", mode=").append(mode);
+        sb.append(", spaceAmount=").append(spaceAmount);
+        sb.append(", pointsAmount=").append(pointsAmount);
+        sb.append(", maxTraffic=").append(maxTraffic);
+        sb.append(", maxFilesize=").append(maxFilesize);
+        sb.append(", period=").append(period);
+        sb.append(", marketPrice=").append(marketPrice);
+        sb.append(", createdAt=").append(createdAt);
+        sb.append(", updatedAt=").append(updatedAt);
+        sb.append(", productCode=").append(productCode);
+        sb.append(", appDiscounts=").append(appDiscounts);
+        sb.append(", webDiscounts=").append(webDiscounts);
+        sb.append(", title=").append(title);
+        sb.append(", saleType=").append(saleType);
+        sb.append(", pricingDiscountId=").append(pricingDiscountId);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1221 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/SetPricingsExample.java


+ 107 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/SetPricingsWithBLOBs.java

@@ -0,0 +1,107 @@
+package cn.kdan.pdf.backend.core.model;
+
+import java.io.Serializable;
+
+public class SetPricingsWithBLOBs extends SetPricings implements Serializable {
+    private String description;
+
+    private String description2;
+
+    private static final long serialVersionUID = 1L;
+
+    public String getDescription() {
+        return description;
+    }
+
+    public SetPricingsWithBLOBs withDescription(String description) {
+        this.setDescription(description);
+        return this;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getDescription2() {
+        return description2;
+    }
+
+    public SetPricingsWithBLOBs withDescription2(String description2) {
+        this.setDescription2(description2);
+        return this;
+    }
+
+    public void setDescription2(String description2) {
+        this.description2 = description2;
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        SetPricingsWithBLOBs other = (SetPricingsWithBLOBs) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getMode() == null ? other.getMode() == null : this.getMode().equals(other.getMode()))
+            && (this.getSpaceAmount() == null ? other.getSpaceAmount() == null : this.getSpaceAmount().equals(other.getSpaceAmount()))
+            && (this.getPointsAmount() == null ? other.getPointsAmount() == null : this.getPointsAmount().equals(other.getPointsAmount()))
+            && (this.getMaxTraffic() == null ? other.getMaxTraffic() == null : this.getMaxTraffic().equals(other.getMaxTraffic()))
+            && (this.getMaxFilesize() == null ? other.getMaxFilesize() == null : this.getMaxFilesize().equals(other.getMaxFilesize()))
+            && (this.getPeriod() == null ? other.getPeriod() == null : this.getPeriod().equals(other.getPeriod()))
+            && (this.getMarketPrice() == null ? other.getMarketPrice() == null : this.getMarketPrice().equals(other.getMarketPrice()))
+            && (this.getCreatedAt() == null ? other.getCreatedAt() == null : this.getCreatedAt().equals(other.getCreatedAt()))
+            && (this.getUpdatedAt() == null ? other.getUpdatedAt() == null : this.getUpdatedAt().equals(other.getUpdatedAt()))
+            && (this.getProductCode() == null ? other.getProductCode() == null : this.getProductCode().equals(other.getProductCode()))
+            && (this.getAppDiscounts() == null ? other.getAppDiscounts() == null : this.getAppDiscounts().equals(other.getAppDiscounts()))
+            && (this.getWebDiscounts() == null ? other.getWebDiscounts() == null : this.getWebDiscounts().equals(other.getWebDiscounts()))
+            && (this.getTitle() == null ? other.getTitle() == null : this.getTitle().equals(other.getTitle()))
+            && (this.getSaleType() == null ? other.getSaleType() == null : this.getSaleType().equals(other.getSaleType()))
+            && (this.getPricingDiscountId() == null ? other.getPricingDiscountId() == null : this.getPricingDiscountId().equals(other.getPricingDiscountId()))
+            && (this.getDescription() == null ? other.getDescription() == null : this.getDescription().equals(other.getDescription()))
+            && (this.getDescription2() == null ? other.getDescription2() == null : this.getDescription2().equals(other.getDescription2()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getMode() == null) ? 0 : getMode().hashCode());
+        result = prime * result + ((getSpaceAmount() == null) ? 0 : getSpaceAmount().hashCode());
+        result = prime * result + ((getPointsAmount() == null) ? 0 : getPointsAmount().hashCode());
+        result = prime * result + ((getMaxTraffic() == null) ? 0 : getMaxTraffic().hashCode());
+        result = prime * result + ((getMaxFilesize() == null) ? 0 : getMaxFilesize().hashCode());
+        result = prime * result + ((getPeriod() == null) ? 0 : getPeriod().hashCode());
+        result = prime * result + ((getMarketPrice() == null) ? 0 : getMarketPrice().hashCode());
+        result = prime * result + ((getCreatedAt() == null) ? 0 : getCreatedAt().hashCode());
+        result = prime * result + ((getUpdatedAt() == null) ? 0 : getUpdatedAt().hashCode());
+        result = prime * result + ((getProductCode() == null) ? 0 : getProductCode().hashCode());
+        result = prime * result + ((getAppDiscounts() == null) ? 0 : getAppDiscounts().hashCode());
+        result = prime * result + ((getWebDiscounts() == null) ? 0 : getWebDiscounts().hashCode());
+        result = prime * result + ((getTitle() == null) ? 0 : getTitle().hashCode());
+        result = prime * result + ((getSaleType() == null) ? 0 : getSaleType().hashCode());
+        result = prime * result + ((getPricingDiscountId() == null) ? 0 : getPricingDiscountId().hashCode());
+        result = prime * result + ((getDescription() == null) ? 0 : getDescription().hashCode());
+        result = prime * result + ((getDescription2() == null) ? 0 : getDescription2().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", description=").append(description);
+        sb.append(", description2=").append(description2);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 328 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/Subscriptions.java

@@ -0,0 +1,328 @@
+package cn.kdan.pdf.backend.core.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class Subscriptions implements Serializable {
+    private Integer id;
+
+    private String memberId;
+
+    private String targetTpe;
+
+    private Integer targetId;
+
+    private Float price;
+
+    private Integer status;
+
+    private Date startDate;
+
+    private Date endDate;
+
+    private Date createdAt;
+
+    private Date updatedAt;
+
+    private Date deletedAt;
+
+    private Integer totalPoints;
+
+    private String totalPeriod;
+
+    private String pricingDiscountId;
+
+    private Integer payment;
+
+    private String memberReferralId;
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public Subscriptions withId(Integer id) {
+        this.setId(id);
+        return this;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getMemberId() {
+        return memberId;
+    }
+
+    public Subscriptions withMemberId(String memberId) {
+        this.setMemberId(memberId);
+        return this;
+    }
+
+    public void setMemberId(String memberId) {
+        this.memberId = memberId;
+    }
+
+    public String getTargetTpe() {
+        return targetTpe;
+    }
+
+    public Subscriptions withTargetTpe(String targetTpe) {
+        this.setTargetTpe(targetTpe);
+        return this;
+    }
+
+    public void setTargetTpe(String targetTpe) {
+        this.targetTpe = targetTpe;
+    }
+
+    public Integer getTargetId() {
+        return targetId;
+    }
+
+    public Subscriptions withTargetId(Integer targetId) {
+        this.setTargetId(targetId);
+        return this;
+    }
+
+    public void setTargetId(Integer targetId) {
+        this.targetId = targetId;
+    }
+
+    public Float getPrice() {
+        return price;
+    }
+
+    public Subscriptions withPrice(Float price) {
+        this.setPrice(price);
+        return this;
+    }
+
+    public void setPrice(Float price) {
+        this.price = price;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public Subscriptions withStatus(Integer status) {
+        this.setStatus(status);
+        return this;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Date getStartDate() {
+        return startDate;
+    }
+
+    public Subscriptions withStartDate(Date startDate) {
+        this.setStartDate(startDate);
+        return this;
+    }
+
+    public void setStartDate(Date startDate) {
+        this.startDate = startDate;
+    }
+
+    public Date getEndDate() {
+        return endDate;
+    }
+
+    public Subscriptions withEndDate(Date endDate) {
+        this.setEndDate(endDate);
+        return this;
+    }
+
+    public void setEndDate(Date endDate) {
+        this.endDate = endDate;
+    }
+
+    public Date getCreatedAt() {
+        return createdAt;
+    }
+
+    public Subscriptions withCreatedAt(Date createdAt) {
+        this.setCreatedAt(createdAt);
+        return this;
+    }
+
+    public void setCreatedAt(Date createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public Date getUpdatedAt() {
+        return updatedAt;
+    }
+
+    public Subscriptions withUpdatedAt(Date updatedAt) {
+        this.setUpdatedAt(updatedAt);
+        return this;
+    }
+
+    public void setUpdatedAt(Date updatedAt) {
+        this.updatedAt = updatedAt;
+    }
+
+    public Date getDeletedAt() {
+        return deletedAt;
+    }
+
+    public Subscriptions withDeletedAt(Date deletedAt) {
+        this.setDeletedAt(deletedAt);
+        return this;
+    }
+
+    public void setDeletedAt(Date deletedAt) {
+        this.deletedAt = deletedAt;
+    }
+
+    public Integer getTotalPoints() {
+        return totalPoints;
+    }
+
+    public Subscriptions withTotalPoints(Integer totalPoints) {
+        this.setTotalPoints(totalPoints);
+        return this;
+    }
+
+    public void setTotalPoints(Integer totalPoints) {
+        this.totalPoints = totalPoints;
+    }
+
+    public String getTotalPeriod() {
+        return totalPeriod;
+    }
+
+    public Subscriptions withTotalPeriod(String totalPeriod) {
+        this.setTotalPeriod(totalPeriod);
+        return this;
+    }
+
+    public void setTotalPeriod(String totalPeriod) {
+        this.totalPeriod = totalPeriod;
+    }
+
+    public String getPricingDiscountId() {
+        return pricingDiscountId;
+    }
+
+    public Subscriptions withPricingDiscountId(String pricingDiscountId) {
+        this.setPricingDiscountId(pricingDiscountId);
+        return this;
+    }
+
+    public void setPricingDiscountId(String pricingDiscountId) {
+        this.pricingDiscountId = pricingDiscountId;
+    }
+
+    public Integer getPayment() {
+        return payment;
+    }
+
+    public Subscriptions withPayment(Integer payment) {
+        this.setPayment(payment);
+        return this;
+    }
+
+    public void setPayment(Integer payment) {
+        this.payment = payment;
+    }
+
+    public String getMemberReferralId() {
+        return memberReferralId;
+    }
+
+    public Subscriptions withMemberReferralId(String memberReferralId) {
+        this.setMemberReferralId(memberReferralId);
+        return this;
+    }
+
+    public void setMemberReferralId(String memberReferralId) {
+        this.memberReferralId = memberReferralId;
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        Subscriptions other = (Subscriptions) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getMemberId() == null ? other.getMemberId() == null : this.getMemberId().equals(other.getMemberId()))
+            && (this.getTargetTpe() == null ? other.getTargetTpe() == null : this.getTargetTpe().equals(other.getTargetTpe()))
+            && (this.getTargetId() == null ? other.getTargetId() == null : this.getTargetId().equals(other.getTargetId()))
+            && (this.getPrice() == null ? other.getPrice() == null : this.getPrice().equals(other.getPrice()))
+            && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus()))
+            && (this.getStartDate() == null ? other.getStartDate() == null : this.getStartDate().equals(other.getStartDate()))
+            && (this.getEndDate() == null ? other.getEndDate() == null : this.getEndDate().equals(other.getEndDate()))
+            && (this.getCreatedAt() == null ? other.getCreatedAt() == null : this.getCreatedAt().equals(other.getCreatedAt()))
+            && (this.getUpdatedAt() == null ? other.getUpdatedAt() == null : this.getUpdatedAt().equals(other.getUpdatedAt()))
+            && (this.getDeletedAt() == null ? other.getDeletedAt() == null : this.getDeletedAt().equals(other.getDeletedAt()))
+            && (this.getTotalPoints() == null ? other.getTotalPoints() == null : this.getTotalPoints().equals(other.getTotalPoints()))
+            && (this.getTotalPeriod() == null ? other.getTotalPeriod() == null : this.getTotalPeriod().equals(other.getTotalPeriod()))
+            && (this.getPricingDiscountId() == null ? other.getPricingDiscountId() == null : this.getPricingDiscountId().equals(other.getPricingDiscountId()))
+            && (this.getPayment() == null ? other.getPayment() == null : this.getPayment().equals(other.getPayment()))
+            && (this.getMemberReferralId() == null ? other.getMemberReferralId() == null : this.getMemberReferralId().equals(other.getMemberReferralId()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getMemberId() == null) ? 0 : getMemberId().hashCode());
+        result = prime * result + ((getTargetTpe() == null) ? 0 : getTargetTpe().hashCode());
+        result = prime * result + ((getTargetId() == null) ? 0 : getTargetId().hashCode());
+        result = prime * result + ((getPrice() == null) ? 0 : getPrice().hashCode());
+        result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode());
+        result = prime * result + ((getStartDate() == null) ? 0 : getStartDate().hashCode());
+        result = prime * result + ((getEndDate() == null) ? 0 : getEndDate().hashCode());
+        result = prime * result + ((getCreatedAt() == null) ? 0 : getCreatedAt().hashCode());
+        result = prime * result + ((getUpdatedAt() == null) ? 0 : getUpdatedAt().hashCode());
+        result = prime * result + ((getDeletedAt() == null) ? 0 : getDeletedAt().hashCode());
+        result = prime * result + ((getTotalPoints() == null) ? 0 : getTotalPoints().hashCode());
+        result = prime * result + ((getTotalPeriod() == null) ? 0 : getTotalPeriod().hashCode());
+        result = prime * result + ((getPricingDiscountId() == null) ? 0 : getPricingDiscountId().hashCode());
+        result = prime * result + ((getPayment() == null) ? 0 : getPayment().hashCode());
+        result = prime * result + ((getMemberReferralId() == null) ? 0 : getMemberReferralId().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", memberId=").append(memberId);
+        sb.append(", targetTpe=").append(targetTpe);
+        sb.append(", targetId=").append(targetId);
+        sb.append(", price=").append(price);
+        sb.append(", status=").append(status);
+        sb.append(", startDate=").append(startDate);
+        sb.append(", endDate=").append(endDate);
+        sb.append(", createdAt=").append(createdAt);
+        sb.append(", updatedAt=").append(updatedAt);
+        sb.append(", deletedAt=").append(deletedAt);
+        sb.append(", totalPoints=").append(totalPoints);
+        sb.append(", totalPeriod=").append(totalPeriod);
+        sb.append(", pricingDiscountId=").append(pricingDiscountId);
+        sb.append(", payment=").append(payment);
+        sb.append(", memberReferralId=").append(memberReferralId);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1236 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/SubscriptionsExample.java


+ 30 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/properties/HttpMatchersProperties.java

@@ -0,0 +1,30 @@
+package cn.kdan.pdf.backend.core.properties;//package properties;
+
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+import java.util.List;
+
+@ConfigurationProperties("http")
+public class HttpMatchersProperties {
+
+    private List<String> requestMatchers;
+
+    private List<String> webMatchers;
+
+    public List<String> getRequestMatchers() {
+        return requestMatchers;
+    }
+
+    public void setRequestMatchers(List<String> requestMatchers) {
+        this.requestMatchers = requestMatchers;
+    }
+
+    public List<String> getWebMatchers() {
+        return webMatchers;
+    }
+
+    public void setWebMatchers(List<String> webMatchers) {
+        this.webMatchers = webMatchers;
+    }
+}

+ 29 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/properties/Oauth2LoginProperties.java

@@ -0,0 +1,29 @@
+package cn.kdan.pdf.backend.core.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "oauth2.login")
+public class Oauth2LoginProperties {
+
+    /**
+     * 智通登录成功携带授权码重定向地址
+     */
+    private String codeRedirectUri;
+
+    /**
+     * 默认账号密码
+     */
+    private String defaultPassword;
+
+    /**
+     * 智通登录失败重定向地址
+     */
+    private String errorRedirectUri;
+
+    /**
+     * 管理端未添加用户登录重定向地址
+     */
+    private String userNotAddRedirectUri;
+}

+ 4 - 0
backend-core/src/main/resources/application-local-db.properties

@@ -0,0 +1,4 @@
+jdbc.driverClassName=com.mysql.jdbc.Driver
+jdbc.url=jdbc\:mysql\://81.68.234.235\:33056/17pdf_backend_dev?useUnicode\=true&characterEncoding\=UTF-8
+jdbc.username=root
+jdbc.password=root123

+ 11 - 0
backend-core/src/main/resources/application-local-redis.properties

@@ -0,0 +1,11 @@
+redis.max-redirects=3
+#最大空闲数
+redis.maxIdle=100
+#客户端超时时间单位是毫秒
+redis.connectionTimeout=100000
+redis.socketTimeout=100000
+redis.maxAttempts=5
+redis.maxTotal=200
+redis.minIdle=10
+redis.nodes=81.68.234.235:6371,81.68.234.235:6372,81.68.234.235:6373,81.68.234.235:6374,81.68.234.235:6375,81.68.234.235:6376
+redis.password=1234

+ 15 - 0
backend-core/src/main/resources/application-local.yml

@@ -0,0 +1,15 @@
+server:
+  port: 8999
+spring:
+  profiles:
+    include: local-db,local-redis
+yunpian:
+  sms:
+    apikey: xxxxx
+    url: https://sms.yunpian.com/v2/sms/batch_send.json
+    sign: xxx
+email:
+  host: xx.xx.com
+  port: 25
+  account: xxx
+  password: xxx

+ 72 - 0
backend-core/src/main/resources/application.yml

@@ -0,0 +1,72 @@
+server:
+  servlet:
+    context-path: /17pdf-backend-core
+spring:
+  application:
+    name: backend-core
+  profiles:
+    active: @spring.profiles.active@
+  datasource:
+    name: mydb
+    url: ${jdbc.url}
+    username: ${jdbc.username}
+    password: ${jdbc.password}
+    # 使用druid数据源
+    type: com.alibaba.druid.pool.DruidDataSource
+    driver-class-name: ${jdbc.driverClassName}
+    filters: stat
+    maxActive: 20
+    initialSize: 1
+    maxWait: 60000
+    minIdle: 1
+    timeBetweenEvictionRunsMillis: 60000
+    minEvictableIdleTimeMillis: 300000
+    validationQuery: select 'x'
+    testWhileIdle: true
+    testOnBorrow: false
+    testOnReturn: false
+    poolPreparedStatements: true
+    maxOpenPreparedStatements: 20
+  servlet:
+    multipart:
+      max-file-size: 20MB
+      max-request-size: 20MB
+  #redis连接池
+  redis:
+    cluster:
+      nodes: ${redis.nodes}
+      max-redirects: ${redis.max-redirects}
+    password: ${redis.password}
+    lettuce:
+      pool:
+        max-active: ${redis.maxTotal}
+        max-wait: ${redis.socketTimeout}
+        max-idle: ${redis.maxIdle}
+        min-idle: ${redis.minIdle}
+  jackson:
+    date-format: yyyy-MM-dd HH:mm:ss
+    time-zone: GMT+8
+
+#不共享一级缓存
+mybatis:
+  configuration:
+    local-cache-scope: statement
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  #    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  #构建数据对象映射文件
+  mapper-locations: classpath:sqlmap/**/*.xml
+  type-aliases-package: cn.kdan.pdf.backend.core.model
+
+pagehelper:
+  helperDialect: mysql
+  reasonable: true
+  supportMethodsArguments: true
+
+swagger:
+  base-package: cn.kdan.pdf.backend.core.controller
+  description: 17pdf api test
+  title: 17pdf api test
+
+logging:
+  level:
+    cn.kdan.pdf.backend.core.mapper: info

+ 38 - 0
backend-core/src/main/resources/generatorConfig.xml

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE generatorConfiguration
+        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
+        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
+
+<generatorConfiguration>
+    <context id="MySQLTables" targetRuntime="MyBatis3">
+        <property name="autoDelimitKeywords" value="true"/>
+        <property name="beginningDelimiter" value="`"/>
+        <property name="endingDelimiter" value="`"/>
+        <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"/>
+        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
+        <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
+        <plugin type="org.mybatis.generator.plugins.CaseInsensitiveLikePlugin"/>
+        <plugin type="org.mybatis.generator.plugins.RowBoundsPlugin"/>
+        <plugin type="org.mybatis.generator.plugins.FluentBuilderMethodsPlugin"/>
+        <commentGenerator>
+            <property name="suppressAllComments" value="true"/>
+        </commentGenerator>
+
+        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
+                        connectionURL="jdbc:mysql://81.68.234.235:33056/17pdf_backend_dev"
+                        userId="root" password="root123"/>
+
+        <javaModelGenerator targetPackage="cn.kdan.pdf.backend.core.model"
+                            targetProject="src/main/java">
+            <property name="enableSubPackages" value="true"/>
+        </javaModelGenerator>
+        <sqlMapGenerator targetPackage="sqlmap" targetProject="src/main/resources">
+            <property name="enableSubPackages" value="true"/>
+        </sqlMapGenerator>
+        <javaClientGenerator type="XMLMAPPER"
+                             targetPackage="cn.kdan.pdf.backend.core.mapper" targetProject="src/main/java">
+            <property name="enableSubPackages" value="true"/>
+        </javaClientGenerator>
+        <table tableName="convert_types"/>
+    </context>
+</generatorConfiguration>

+ 219 - 0
backend-core/src/main/resources/logback-spring.xml

@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
+<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
+<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
+<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
+<configuration  scan="true" scanPeriod="10 seconds">
+
+    <!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
+
+    <contextName>logback</contextName>
+    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
+    <property name="log.path" value="/logs/dev-ops-core" />
+
+    <!-- 彩色日志 -->
+    <!-- 彩色日志依赖的渲染类 -->
+    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
+    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
+    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
+    <!-- 彩色日志格式 -->
+    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+
+
+    <!--输出到控制台-->
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>info</level>
+        </filter>
+        <encoder>
+            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
+            <!-- 设置字符集 -->
+            <charset>UTF-8</charset>
+        </encoder>
+    </appender>
+
+
+    <!--输出到文件-->
+
+    <!-- 时间滚动输出 level为 DEBUG 日志 -->
+    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${log.path}/log_debug.log</file>
+        <!--日志文件输出格式-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [PtxId : %X{PtxId} , SpanId : %X{PspanId}] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset> <!-- 设置字符集 -->
+        </encoder>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志归档 -->
+            <fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--日志文件保留天数-->
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+        <!-- 此日志文件只记录debug级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>debug</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 时间滚动输出 level为 INFO 日志 -->
+    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${log.path}/log_info.log</file>
+        <!--日志文件输出格式-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [PtxId : %X{PtxId} , SpanId : %X{PspanId}] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 每天日志归档路径以及格式 -->
+            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>300MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--日志文件保留天数-->
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+        <!-- 此日志文件只记录info级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>info</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 时间滚动输出 level为 WARN 日志 -->
+    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${log.path}/log_warn.log</file>
+        <!--日志文件输出格式-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [PtxId : %X{PtxId} , SpanId : %X{PspanId}] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+        </encoder>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>300MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--日志文件保留天数-->
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+        <!-- 此日志文件只记录warn级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>warn</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 时间滚动输出 level为 ERROR 日志 -->
+    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${log.path}/log_error.log</file>
+        <!--日志文件输出格式-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [PtxId : %X{PtxId} , SpanId : %X{PspanId}] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+        </encoder>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>300MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--日志文件保留天数-->
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+        <!-- 此日志文件只记录ERROR级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!--
+        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
+        以及指定<appender>。<logger>仅有一个name属性,
+        一个可选的level和一个可选的addtivity属性。
+        name:用来指定受此logger约束的某一个包或者具体的某一个类。
+        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
+              还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
+              如果未设置此属性,那么当前logger将会继承上级的级别。
+        addtivity:是否向上级logger传递打印信息。默认是true。
+    -->
+    <!--<logger name="org.springframework.web" level="info"/>-->
+    <!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>-->
+    <!--
+        使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
+        第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
+        第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
+     -->
+
+
+    <!--
+        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
+        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
+        不能设置为INHERITED或者同义词NULL。默认是DEBUG
+        可以包含零个或多个元素,标识这个appender将会添加到这个logger。
+    -->
+
+    <!--本地环境:打印控制台-->
+    <springProfile name="local">
+        <logger name="com.wondersgroup.cloud" level="debug"/>
+        <root level="info">
+            <appender-ref ref="CONSOLE" />
+        </root>
+    </springProfile>
+
+    <!--开发环境:打印控制台-->
+    <springProfile name="dev">
+        <logger name="com.wondersgroup.cloud" level="debug"/>
+        <root level="info">
+            <appender-ref ref="DEBUG_FILE" />
+            <appender-ref ref="INFO_FILE" />
+            <appender-ref ref="ERROR_FILE" />
+            <appender-ref ref="WARN_FILE" />
+        </root>
+    </springProfile>
+
+    <!--生产环境:输出到文件-->
+    <springProfile name="test">
+        <root level="info">
+            <appender-ref ref="DEBUG_FILE" />
+            <appender-ref ref="INFO_FILE" />
+            <appender-ref ref="ERROR_FILE" />
+            <appender-ref ref="WARN_FILE" />
+        </root>
+    </springProfile>
+
+    <springProfile name="beta">
+        <root level="info">
+            <appender-ref ref="DEBUG_FILE" />
+            <appender-ref ref="INFO_FILE" />
+            <appender-ref ref="ERROR_FILE" />
+            <appender-ref ref="WARN_FILE" />
+        </root>
+    </springProfile>
+
+    <springProfile name="pro">
+        <root level="info">
+            <appender-ref ref="DEBUG_FILE" />
+            <appender-ref ref="INFO_FILE" />
+            <appender-ref ref="ERROR_FILE" />
+            <appender-ref ref="WARN_FILE" />
+        </root>
+    </springProfile>
+
+</configuration>

+ 0 - 0
backend-core/src/main/resources/sqlmap/ConvertTypesMapper.xml


Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác