Jelajahi Sumber

first commit

xiongzhu 3 tahun lalu
melakukan
f56d38fedd
100 mengubah file dengan 5187 tambahan dan 0 penghapusan
  1. 7 0
      .gitignore
  2. 8 0
      install-jar.sh
  3. TEMPAT SAMPAH
      lib/mozjpeg4j-1.1.jar
  4. TEMPAT SAMPAH
      lib/mychain-rest-client-0.10.2.11-with-dependencies.jar
  5. TEMPAT SAMPAH
      lib/mychainx-java-sdk-0.10.2.9-with-dependencies.jar
  6. TEMPAT SAMPAH
      lib/pngquant4j-1.0.1.jar
  7. 432 0
      pom.xml
  8. 25 0
      src/main/java/com/izouma/nineth/Application.java
  9. 7 0
      src/main/java/com/izouma/nineth/JsonView/UserView.java
  10. 49 0
      src/main/java/com/izouma/nineth/TokenHistory.java
  11. 12 0
      src/main/java/com/izouma/nineth/annotations/Debounce.java
  12. 45 0
      src/main/java/com/izouma/nineth/annotations/EnumFormat.java
  13. 14 0
      src/main/java/com/izouma/nineth/annotations/OperLog.java
  14. 12 0
      src/main/java/com/izouma/nineth/annotations/Searchable.java
  15. 71 0
      src/main/java/com/izouma/nineth/aspect/DebounceAspect.java
  16. 188 0
      src/main/java/com/izouma/nineth/aspect/OperLogAspect.java
  17. 33 0
      src/main/java/com/izouma/nineth/aspect/debounce/DebounceTask.java
  18. 34 0
      src/main/java/com/izouma/nineth/config/AdapayConfig.java
  19. 20 0
      src/main/java/com/izouma/nineth/config/AdapayProperties.java
  20. 24 0
      src/main/java/com/izouma/nineth/config/AlipayConfig.java
  21. 20 0
      src/main/java/com/izouma/nineth/config/AlipayProperties.java
  22. 77 0
      src/main/java/com/izouma/nineth/config/CacheConfig.java
  23. 59 0
      src/main/java/com/izouma/nineth/config/Constants.java
  24. 148 0
      src/main/java/com/izouma/nineth/config/DateConfig.java
  25. 5 0
      src/main/java/com/izouma/nineth/config/EventNames.java
  26. 31 0
      src/main/java/com/izouma/nineth/config/GeneralProperties.java
  27. 30 0
      src/main/java/com/izouma/nineth/config/HibernateJsonConfig.java
  28. 36 0
      src/main/java/com/izouma/nineth/config/LocalDateTimeSerializerConfig.java
  29. 66 0
      src/main/java/com/izouma/nineth/config/RedisKeys.java
  30. 19 0
      src/main/java/com/izouma/nineth/config/SchedulingConfig.java
  31. 16 0
      src/main/java/com/izouma/nineth/config/SnowflakeIdWorkerConfig.java
  32. 24 0
      src/main/java/com/izouma/nineth/config/SpringSecurityAuditorAware.java
  33. 77 0
      src/main/java/com/izouma/nineth/config/SysConstants.java
  34. 98 0
      src/main/java/com/izouma/nineth/config/WebMvcConfig.java
  35. 30 0
      src/main/java/com/izouma/nineth/config/WxMaConfiguration.java
  36. 14 0
      src/main/java/com/izouma/nineth/config/WxMaProperties.java
  37. 74 0
      src/main/java/com/izouma/nineth/config/WxMpConfiguration.java
  38. 13 0
      src/main/java/com/izouma/nineth/config/WxMpProperties.java
  39. 47 0
      src/main/java/com/izouma/nineth/config/WxPayConfiguration.java
  40. 51 0
      src/main/java/com/izouma/nineth/config/WxPayProperties.java
  41. 75 0
      src/main/java/com/izouma/nineth/converter/EnumExcelConverter.java
  42. 26 0
      src/main/java/com/izouma/nineth/converter/FileObjectConverter.java
  43. 41 0
      src/main/java/com/izouma/nineth/converter/FileObjectListConverter.java
  44. 30 0
      src/main/java/com/izouma/nineth/converter/InvitePrizeConverter.java
  45. 40 0
      src/main/java/com/izouma/nineth/converter/InvitePrizeListConverter.java
  46. 30 0
      src/main/java/com/izouma/nineth/converter/JSONObjectConverter.java
  47. 28 0
      src/main/java/com/izouma/nineth/converter/LongArrayConverter.java
  48. 34 0
      src/main/java/com/izouma/nineth/converter/PrivilegeListConverter.java
  49. 34 0
      src/main/java/com/izouma/nineth/converter/PropertyListConverter.java
  50. 27 0
      src/main/java/com/izouma/nineth/converter/StringArrayConverter.java
  51. 24 0
      src/main/java/com/izouma/nineth/converter/StringToMapConverter.java
  52. 32 0
      src/main/java/com/izouma/nineth/converter/SurpriseBoxContentListConverter.java
  53. 42 0
      src/main/java/com/izouma/nineth/domain/Activity.java
  54. 76 0
      src/main/java/com/izouma/nineth/domain/ActivityCollection.java
  55. 46 0
      src/main/java/com/izouma/nineth/domain/ActivityCollectionInfo.java
  56. 81 0
      src/main/java/com/izouma/nineth/domain/ActivityInvite.java
  57. 44 0
      src/main/java/com/izouma/nineth/domain/ActivityMaterial.java
  58. 33 0
      src/main/java/com/izouma/nineth/domain/ActivityOrder.java
  59. 69 0
      src/main/java/com/izouma/nineth/domain/ActivityPriorityDocument.java
  60. 38 0
      src/main/java/com/izouma/nineth/domain/ActivitySurpriseBox.java
  61. 40 0
      src/main/java/com/izouma/nineth/domain/AdapayMerchant.java
  62. 77 0
      src/main/java/com/izouma/nineth/domain/AirDrop.java
  63. 22 0
      src/main/java/com/izouma/nineth/domain/Appointment.java
  64. 232 0
      src/main/java/com/izouma/nineth/domain/Asset.java
  65. 78 0
      src/main/java/com/izouma/nineth/domain/AssetPost.java
  66. 83 0
      src/main/java/com/izouma/nineth/domain/AuditedEntity.java
  67. 49 0
      src/main/java/com/izouma/nineth/domain/AwardActivityCollectionInfo.java
  68. 50 0
      src/main/java/com/izouma/nineth/domain/Banner.java
  69. 100 0
      src/main/java/com/izouma/nineth/domain/BaseEntity.java
  70. 89 0
      src/main/java/com/izouma/nineth/domain/BaseEntityNoID.java
  71. 106 0
      src/main/java/com/izouma/nineth/domain/BlindBoxItem.java
  72. 153 0
      src/main/java/com/izouma/nineth/domain/Collection.java
  73. 36 0
      src/main/java/com/izouma/nineth/domain/CollectionNumber.java
  74. 11 0
      src/main/java/com/izouma/nineth/domain/CollectionProperty.java
  75. 45 0
      src/main/java/com/izouma/nineth/domain/CommissionRecord.java
  76. 51 0
      src/main/java/com/izouma/nineth/domain/Coupon.java
  77. 49 0
      src/main/java/com/izouma/nineth/domain/District.java
  78. 62 0
      src/main/java/com/izouma/nineth/domain/DivMoney.java
  79. 26 0
      src/main/java/com/izouma/nineth/domain/ErrorOrder.java
  80. 71 0
      src/main/java/com/izouma/nineth/domain/ExceptionLog.java
  81. 18 0
      src/main/java/com/izouma/nineth/domain/FileObject.java
  82. 22 0
      src/main/java/com/izouma/nineth/domain/Follow.java
  83. 66 0
      src/main/java/com/izouma/nineth/domain/GiftOrder.java
  84. 52 0
      src/main/java/com/izouma/nineth/domain/IdentityAuth.java
  85. 30 0
      src/main/java/com/izouma/nineth/domain/Invite.java
  86. 60 0
      src/main/java/com/izouma/nineth/domain/InviteDate.java
  87. 21 0
      src/main/java/com/izouma/nineth/domain/InvitePrize.java
  88. 27 0
      src/main/java/com/izouma/nineth/domain/Like.java
  89. 33 0
      src/main/java/com/izouma/nineth/domain/MailRecord.java
  90. 71 0
      src/main/java/com/izouma/nineth/domain/Menu.java
  91. 63 0
      src/main/java/com/izouma/nineth/domain/OperationLog.java
  92. 174 0
      src/main/java/com/izouma/nineth/domain/Order.java
  93. 99 0
      src/main/java/com/izouma/nineth/domain/PaymentInfo.java
  94. 63 0
      src/main/java/com/izouma/nineth/domain/Privilege.java
  95. 33 0
      src/main/java/com/izouma/nineth/domain/PrivilegeOption.java
  96. 33 0
      src/main/java/com/izouma/nineth/domain/Recommend.java
  97. 4 0
      src/main/java/com/izouma/nineth/domain/SSOToken.java
  98. 38 0
      src/main/java/com/izouma/nineth/domain/SmsRecord.java
  99. 57 0
      src/main/java/com/izouma/nineth/domain/SuperUser.java
  100. 27 0
      src/main/java/com/izouma/nineth/domain/SurpriseBoxContent.java

+ 7 - 0
.gitignore

@@ -0,0 +1,7 @@
+.idea
+*.iml
+target
+/logs
+/src/main/resources/application-dev.yaml
+/captchaImg
+.DS_Store

+ 8 - 0
install-jar.sh

@@ -0,0 +1,8 @@
+
+mvn org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file -DgroupId=org.libjpegturbo -DartifactId=mozjpeg4j -Dpackaging=jar -Dversion=1.1 -Dfile=lib/mozjpeg4j-1.1.jar
+
+mvn org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file -DgroupId=org.pngquant -DartifactId=pngquant4j -Dpackaging=jar -Dversion=1.0.1 -Dfile=lib/pngquant4j-1.0.1.jar
+
+mvn install:install-file -DgroupId=com.antfinancial.baas -DartifactId=mychain-rest-lib -Dpackaging=jar -Dversion=0.10.2.11 -Dfile=lib/mychain-rest-client-0.10.2.11-with-dependencies.jar
+
+mvn install:install-file -DgroupId=com.alipay.mychainx -DartifactId=mychainx-sdk -Dpackaging=jar -Dversion=0.10.2.9 -Dfile=lib/mychainx-java-sdk-0.10.2.9-with-dependencies.jar

TEMPAT SAMPAH
lib/mozjpeg4j-1.1.jar


TEMPAT SAMPAH
lib/mychain-rest-client-0.10.2.11-with-dependencies.jar


TEMPAT SAMPAH
lib/mychainx-java-sdk-0.10.2.9-with-dependencies.jar


TEMPAT SAMPAH
lib/pngquant4j-1.0.1.jar


+ 432 - 0
pom.xml

@@ -0,0 +1,432 @@
+<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.3.2.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.izouma</groupId>
+    <artifactId>9th</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>9th</name>
+    <description>9th</description>
+
+    <repositories>
+        <repository>
+            <id>nexus-aliyun</id>
+            <url>https://maven.aliyun.com/repository/central</url>
+        </repository>
+        <repository>
+            <id>jitpack.io</id>
+            <url>https://jitpack.io</url>
+        </repository>
+    </repositories>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <skipTests>true</skipTests>
+        <poi.verion>3.17</poi.verion>
+        <javawx.version>3.5.0</javawx.version>
+        <aliyun.oss.version>2.8.3</aliyun.oss.version>
+        <aliyun.core.version>4.1.0</aliyun.core.version>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>9</source>
+                    <target>9</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-activemq</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-cache</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.data</groupId>
+            <artifactId>spring-data-redis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.lettuce</groupId>
+            <artifactId>lettuce-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.retry</groupId>
+            <artifactId>spring-retry</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-aspects</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.validation</groupId>
+            <artifactId>validation-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-envers</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>1.9.4</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-text</artifactId>
+            <version>1.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.code.findbugs</groupId>
+            <artifactId>annotations</artifactId>
+            <version>3.0.1</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-mp</artifactId>
+            <version>${javawx.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-miniapp</artifactId>
+            <version>${javawx.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-pay</artifactId>
+            <version>${javawx.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-open</artifactId>
+            <version>${javawx.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>${aliyun.oss.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-core</artifactId>
+            <version>${aliyun.core.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.kevinsawicki</groupId>
+            <artifactId>http-request</artifactId>
+            <version>6.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>${poi.verion}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>${poi.verion}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cglib</groupId>
+            <artifactId>cglib</artifactId>
+            <version>3.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>2.2.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.reflections</groupId>
+            <artifactId>reflections</artifactId>
+            <version>0.9.11</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity</artifactId>
+            <version>1.7</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-tools</artifactId>
+            <version>2.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/com.belerweb/pinyin4j -->
+        <dependency>
+            <groupId>com.belerweb</groupId>
+            <artifactId>pinyin4j</artifactId>
+            <version>2.5.1</version>
+        </dependency>
+        <!-- swagger -->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>2.9.1</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>2.9.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-freemarker</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.37</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.ning</groupId>
+            <artifactId>async-http-client</artifactId>
+            <version>1.9.32</version>
+        </dependency>
+        <!-- 钉钉 -->
+
+        <dependency>
+            <groupId>com.github.whvcse</groupId>
+            <artifactId>easy-captcha</artifactId>
+            <version>1.6.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.libjpegturbo</groupId>
+            <artifactId>mozjpeg4j</artifactId>
+            <version>1.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.pngquant</groupId>
+            <artifactId>pngquant4j</artifactId>
+            <version>1.0.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.antfinancial.baas</groupId>
+            <artifactId>mychain-rest-lib</artifactId>
+            <version>0.10.2.11</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-all</artifactId>
+            <version>4.1.29.Final</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-tcnative-boringssl-static</artifactId>
+            <version>2.0.17.Final</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>20.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alipay.sdk</groupId>
+            <artifactId>alipay-sdk-java</artifactId>
+            <version>4.16.57.ALL</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.ipfs</groupId>
+            <artifactId>java-ipfs-http-client</artifactId>
+            <version>v1.3.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.javafaker</groupId>
+            <artifactId>javafaker</artifactId>
+            <version>1.0.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.bytedeco</groupId>
+            <artifactId>javacv-platform</artifactId>
+            <version>1.5.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-hibernate5</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-hibernate4</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-jsr310</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>net.coobird</groupId>
+            <artifactId>thumbnailator</artifactId>
+            <version>0.4.14</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.huifu.adapay.core</groupId>
+            <artifactId>adapay-core-sdk</artifactId>
+            <version>1.2.10</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.huifu.adapay</groupId>
+            <artifactId>adapay-java-sdk</artifactId>
+            <version>1.2.10</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.1.21</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.rocketmq</groupId>
+            <artifactId>rocketmq-spring-boot-starter</artifactId>
+            <version>2.2.0</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>commons-validator</groupId>
+            <artifactId>commons-validator</artifactId>
+            <version>1.7</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-core</artifactId>
+            <version>5.7.21</version>
+        </dependency>
+
+    </dependencies>
+
+</project>

+ 25 - 0
src/main/java/com/izouma/nineth/Application.java

@@ -0,0 +1,25 @@
+package com.izouma.nineth;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
+import org.springframework.retry.annotation.EnableRetry;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+@SpringBootApplication
+@EnableJpaAuditing
+@EnableSwagger2
+@EnableCaching
+@EnableScheduling
+@EnableAsync
+@EnableRetry
+public class Application {
+
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+
+}

+ 7 - 0
src/main/java/com/izouma/nineth/JsonView/UserView.java

@@ -0,0 +1,7 @@
+package com.izouma.nineth.JsonView;
+
+public interface UserView {
+    public static class Redis {
+    }
+
+}

+ 49 - 0
src/main/java/com/izouma/nineth/TokenHistory.java

@@ -0,0 +1,49 @@
+package com.izouma.nineth;
+
+import com.izouma.nineth.domain.BaseEntity;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Index;
+import javax.persistence.Table;
+import java.math.BigDecimal;
+
+@Data
+@Entity
+@Table(indexes = {@Index(columnList = "tokenId")})
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class TokenHistory extends BaseEntity {
+
+    private String tokenId;
+
+    private String operation;
+
+    @Column(precision = 10, scale = 2)
+    private BigDecimal price;
+
+    private String fromUser;
+
+    private Long   fromUserId;
+
+    private String fromAvatar;
+
+    private String toUser;
+
+    private Long   toUserId;
+
+    private String toAvatar;
+
+    private int projectId;
+
+    /**
+     * 关联的资产id
+     */
+    private Long assetId;
+
+}

+ 12 - 0
src/main/java/com/izouma/nineth/annotations/Debounce.java

@@ -0,0 +1,12 @@
+package com.izouma.nineth.annotations;
+
+import java.lang.annotation.*;
+
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface Debounce {
+    String key();
+
+    long delay() default 200L;
+}

+ 45 - 0
src/main/java/com/izouma/nineth/annotations/EnumFormat.java

@@ -0,0 +1,45 @@
+package com.izouma.nineth.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * <pre>
+ * '@EnumFormat 注解 :
+ *  作用 : 用于自定义excel单元格中的内容,转换成对应的枚举值
+ *  属性 :
+ *      value : 要转换的枚举类型
+ *      fromExcel : 指定excel中用户输入的枚举值,可以与toJavaEnum中指定的枚举值一一对应
+ *                  例如 : excel 单元格中输入
+ *                         '待支付' -> OrderStatusEnum.UNPAY
+ *                         '已支付' -> OrderStatusEnum.PAYED
+ *      toJavaEnum : 如上所述
+ *  注意 : toJavaEnum 与 fromExcel 必须搭配使用
+ * </pre>
+ */
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface EnumFormat {
+    /**
+     * 要转换的枚举类型
+     *
+     * @return enum class
+     */
+    Class value();
+
+    /**
+     * 要转换枚举的全部变量名数组集
+     *
+     * @return String[]
+     */
+    String[] toJavaEnum() default {};
+
+    /**
+     * 枚举导出excel时所展示的内容
+     *
+     * @return String[]
+     */
+    String[] fromExcel() default {};
+}

+ 14 - 0
src/main/java/com/izouma/nineth/annotations/OperLog.java

@@ -0,0 +1,14 @@
+package com.izouma.nineth.annotations;
+
+import java.lang.annotation.*;
+
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface OperLog {
+    String value() default "";
+
+    String type() default "";
+
+    String desc() default "";
+}

+ 12 - 0
src/main/java/com/izouma/nineth/annotations/Searchable.java

@@ -0,0 +1,12 @@
+package com.izouma.nineth.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Searchable {
+    boolean value() default true;
+}

+ 71 - 0
src/main/java/com/izouma/nineth/aspect/DebounceAspect.java

@@ -0,0 +1,71 @@
+package com.izouma.nineth.aspect;
+
+import com.izouma.nineth.annotations.Debounce;
+import com.izouma.nineth.aspect.debounce.DebounceTask;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.core.DefaultParameterNameDiscoverer;
+import org.springframework.expression.EvaluationContext;
+import org.springframework.expression.ExpressionParser;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.expression.spel.support.StandardEvaluationContext;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+@Aspect
+@Component
+@Slf4j
+public class DebounceAspect {
+
+    private DefaultParameterNameDiscoverer nameDiscoverer  = new DefaultParameterNameDiscoverer();
+    private HashMap<String, Future<Void>>  debounceStore   = new HashMap<>();
+    private ScheduledExecutorService       executorService = Executors.newScheduledThreadPool(10);
+    private Map<String, Long>              debounceCounter = new HashMap<>();
+
+    @Pointcut("@annotation(com.izouma.nineth.annotations.Debounce)")
+    public void debouncePointCut() {
+    }
+
+    @Around(value = "debouncePointCut() && @annotation(debounce)")
+    public synchronized void debounce(ProceedingJoinPoint joinPoint, Debounce debounce) {
+        ExpressionParser parser = new SpelExpressionParser();
+        EvaluationContext context = new StandardEvaluationContext(joinPoint.getSignature());
+        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
+        Method method = methodSignature.getMethod();
+        String[] paramNames = nameDiscoverer.getParameterNames(method);
+        Object[] args = joinPoint.getArgs();
+        for (int i = 0; i < args.length; i++) {
+            context.setVariable(paramNames[i], args[i]);
+        }
+        String key = Optional.ofNullable(parser.parseExpression(debounce.key()).getValue(context)).map(Object::toString)
+                .orElse("default");
+
+        Future<Void> future = debounceStore.get(key);
+        long lastRun = debounceCounter.getOrDefault(key, 0L);
+        if (future != null && !future.isDone()) {
+            if (System.currentTimeMillis() - lastRun > debounce.delay()) {
+                debounceCounter.put(key, System.currentTimeMillis());
+            } else {
+                future.cancel(false);
+            }
+        }
+        debounceStore.put(key, executorService.schedule(new DebounceTask(joinPoint, (Void) -> {
+            debounceCounter.put(key, System.currentTimeMillis());
+            return null;
+        }), debounce.delay(), TimeUnit.MILLISECONDS));
+
+    }
+
+}

+ 188 - 0
src/main/java/com/izouma/nineth/aspect/OperLogAspect.java

@@ -0,0 +1,188 @@
+package com.izouma.nineth.aspect;
+
+import com.alibaba.fastjson.JSON;
+import com.izouma.nineth.annotations.OperLog;
+import com.izouma.nineth.domain.ExceptionLog;
+import com.izouma.nineth.domain.OperationLog;
+import com.izouma.nineth.domain.User;
+import com.izouma.nineth.repo.ExceptionLogRepo;
+import com.izouma.nineth.repo.OperationLogRepo;
+import com.izouma.nineth.utils.IPUtils;
+import com.izouma.nineth.utils.SecurityUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.AfterThrowing;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Method;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Map;
+
+@Aspect
+@Component
+public class OperLogAspect {
+
+    @Autowired
+    private OperationLogRepo operationLogRepo;
+
+    @Autowired
+    private ExceptionLogRepo exceptionLogRepo;
+
+    /**
+     * 设置操作日志切入点 记录操作日志 在注解的位置切入代码
+     */
+    @Pointcut("@annotation(com.izouma.nineth.annotations.OperLog)")
+    public void operLogPointCut() {
+    }
+
+    /**
+     * 设置操作异常切入点记录异常日志 扫描所有controller包下操作
+     */
+    @Pointcut("execution(* com.izouma.nineth.web..*.*(..))")
+    public void operExceptionLogPointCut() {
+    }
+
+    /**
+     * 正常返回通知,拦截用户操作日志,连接点正常执行完成后执行, 如果连接点抛出异常,则不会执行
+     *
+     * @param joinPoint 切入点
+     * @param keys      返回结果
+     */
+    @AfterReturning(value = "operLogPointCut()", returning = "keys")
+    public void saveOperLog(JoinPoint joinPoint, Object keys) {
+        // 获取RequestAttributes
+        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
+        // 从获取RequestAttributes中获取HttpServletRequest的信息
+        HttpServletRequest request = (HttpServletRequest) requestAttributes
+                .resolveReference(RequestAttributes.REFERENCE_REQUEST);
+
+        OperationLog operationLog = new OperationLog();
+        try {
+            // 从切面织入点处通过反射机制获取织入点处的方法
+            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+            // 获取切入点所在的方法
+            Method method = signature.getMethod();
+            // 获取操作
+            OperLog operLog = method.getAnnotation(OperLog.class);
+            if (operLog != null) {
+                operationLog.setName(operLog.value()); // 操作模块
+                operationLog.setType(operLog.type()); // 操作类型
+                operationLog.setDesc(operLog.desc()); // 操作描述
+            }
+            // 获取请求的类名
+            String className = joinPoint.getTarget().getClass().getName();
+            // 获取请求的方法名
+            String methodName = method.getName();
+            methodName = className + "." + methodName;
+
+            operationLog.setReqMethod(methodName);
+
+            // 请求的参数
+            Map<String, String> rtnMap = null;
+            String params = null;
+            if (request != null) {
+                rtnMap = convertMap(request.getParameterMap());
+                params = JSON.toJSONString(rtnMap);
+            }
+
+            operationLog.setReqParams(params);
+            operationLog.setResp(JSON.toJSONString(keys));
+
+            User user = SecurityUtils.getAuthenticatedUser();
+            if (user != null) {
+                operationLog.setUserId(String.valueOf(user.getId()));
+                operationLog.setUsername(user.getUsername());
+            }
+            operationLog.setReqIp(IPUtils.getIpAddr(request));
+            operationLog.setReqUrl(request != null ? request.getRequestURI() : null);
+            operationLog.setTime(LocalDateTime.now());
+            operationLogRepo.save(operationLog);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 异常返回通知,用于拦截异常日志信息 连接点抛出异常后执行
+     *
+     * @param joinPoint 切入点
+     * @param e         异常信息
+     */
+    @AfterThrowing(pointcut = "operExceptionLogPointCut()", throwing = "e")
+    public void saveExceptionLog(JoinPoint joinPoint, Throwable e) {
+        // 获取RequestAttributes
+        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
+        // 从获取RequestAttributes中获取HttpServletRequest的信息
+        HttpServletRequest request = (HttpServletRequest) requestAttributes
+                .resolveReference(RequestAttributes.REFERENCE_REQUEST);
+
+        ExceptionLog exceptionLog = new ExceptionLog();
+        try {
+            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+            Method method = signature.getMethod();
+            String className = joinPoint.getTarget().getClass().getName();
+            String methodName = method.getName();
+            methodName = className + "." + methodName;
+            exceptionLog.setReqMethod(methodName);
+
+            Map<String, String> rtnMap = convertMap(request.getParameterMap());
+            String params = JSON.toJSONString(rtnMap);
+            exceptionLog.setReqParams(params);
+
+            exceptionLog.setName(e.getClass().getName());
+            exceptionLog.setMessage(stackTraceToString(e.getClass().getName(), e.getMessage(), e
+                    .getStackTrace()));
+            User user = SecurityUtils.getAuthenticatedUser();
+            if (user != null) {
+                exceptionLog.setUserId(String.valueOf(user.getId()));
+                exceptionLog.setUsername(user.getUsername());
+            }
+
+            exceptionLog.setReqUrl(request.getRequestURI());
+            exceptionLog.setReqIp(IPUtils.getIpAddr(request));
+            exceptionLog.setTime(LocalDateTime.now());
+
+            exceptionLogRepo.save(exceptionLog);
+
+        } catch (Exception e2) {
+            e2.printStackTrace();
+        }
+
+    }
+
+    /**
+     * 转换request 请求参数
+     *
+     * @param paramMap request获取的参数数组
+     */
+    public Map<String, String> convertMap(Map<String, String[]> paramMap) {
+        Map<String, String> rtnMap = new HashMap<>();
+        for (String key : paramMap.keySet()) {
+            rtnMap.put(key, paramMap.get(key)[0]);
+        }
+        return rtnMap;
+    }
+
+    /**
+     * 转换异常信息为字符串
+     *
+     * @param exceptionName    异常名称
+     * @param exceptionMessage 异常信息
+     * @param elements         堆栈信息
+     */
+    public String stackTraceToString(String exceptionName, String exceptionMessage, StackTraceElement[] elements) {
+        StringBuilder strBuff = new StringBuilder();
+        for (StackTraceElement stet : elements) {
+            strBuff.append(stet).append("\n");
+        }
+        return exceptionName + ":" + exceptionMessage + "\n\t" + strBuff;
+    }
+}

+ 33 - 0
src/main/java/com/izouma/nineth/aspect/debounce/DebounceTask.java

@@ -0,0 +1,33 @@
+package com.izouma.nineth.aspect.debounce;
+
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+
+import java.util.concurrent.Callable;
+import java.util.function.Function;
+
+@Slf4j
+public class DebounceTask implements Callable<Void> {
+    private final ProceedingJoinPoint  joinPoint;
+    private final Function<Void, Void> callback;
+
+    public DebounceTask(ProceedingJoinPoint joinPoint, Function<Void, Void> callback) {
+        this.joinPoint = joinPoint;
+        this.callback = callback;
+    }
+
+    @Override
+    public Void call() throws Exception {
+        try {
+            this.joinPoint.proceed();
+            if (this.callback != null) {
+                this.callback.apply(null);
+            }
+        } catch (Throwable e) {
+            e.printStackTrace();
+        }
+
+        return null;
+
+    }
+}

+ 34 - 0
src/main/java/com/izouma/nineth/config/AdapayConfig.java

@@ -0,0 +1,34 @@
+package com.izouma.nineth.config;
+
+import com.huifu.adapay.Adapay;
+import com.huifu.adapay.model.MerConfig;
+import lombok.AllArgsConstructor;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+
+@Configuration
+@AllArgsConstructor
+@EnableConfigurationProperties({AdapayProperties.class})
+public class AdapayConfig {
+    private final AdapayProperties adapayProperties;
+
+    @PostConstruct
+    public void init() {
+        Adapay.debug = adapayProperties.isDebug();
+        Adapay.prodMode = adapayProperties.isProd();
+
+        MerConfig merConfig = new MerConfig();
+        merConfig.setApiKey(adapayProperties.getApiKey());
+        merConfig.setApiMockKey(adapayProperties.getMockKey());
+        merConfig.setRSAPrivateKey(adapayProperties.getPrivKey());
+        merConfig.setRSAPublicKey(adapayProperties.getPublicKey());
+        Adapay.publicKey = adapayProperties.getAppPublicKey();
+        try {
+            Adapay.initWithMerConfig(merConfig);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 20 - 0
src/main/java/com/izouma/nineth/config/AdapayProperties.java

@@ -0,0 +1,20 @@
+package com.izouma.nineth.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "adapay")
+public class AdapayProperties {
+    private String  merchant;
+    private String  appId;
+    private boolean debug;
+    private boolean prod;
+    private String  apiKey;
+    private String  mockKey;
+    private String  publicKey;
+    private String  privKey;
+    private String  appPublicKey;
+    private String  wxAppId;
+    private String  notifyUrl;
+}

+ 24 - 0
src/main/java/com/izouma/nineth/config/AlipayConfig.java

@@ -0,0 +1,24 @@
+package com.izouma.nineth.config;
+
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
+import lombok.AllArgsConstructor;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@AllArgsConstructor
+@Configuration
+@EnableConfigurationProperties({AlipayProperties.class, AlipayProperties.class})
+public class AlipayConfig {
+    private final AlipayProperties properties;
+
+    @Bean
+    public AlipayClient alipayClient() {
+        AlipayClient alipayClient =  new DefaultAlipayClient(properties.getGateway(),
+                properties.getAppId(), properties.getPrivateKey(),
+                "json", "UTF-8", properties.getAliPublicKey(), "RSA2");
+
+        return alipayClient;
+    }
+}

+ 20 - 0
src/main/java/com/izouma/nineth/config/AlipayProperties.java

@@ -0,0 +1,20 @@
+package com.izouma.nineth.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "alipay")
+public class AlipayProperties {
+    private String appId;
+    private String gateway;
+    private String privateKey;
+    private String appPublicKey;
+    private String aliPublicKey;
+    private String apiKey;
+    private String appCertPath;
+    private String aliPubCertPath;
+    private String rootCertPath;
+    private String notifyUrl;
+    private String returnUrl;
+}

+ 77 - 0
src/main/java/com/izouma/nineth/config/CacheConfig.java

@@ -0,0 +1,77 @@
+package com.izouma.nineth.config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import com.izouma.nineth.JsonView.UserView;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration;
+import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.cache.RedisCacheConfiguration;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.cache.RedisCacheWriter;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializationContext;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+import java.time.Duration;
+
+
+@Configuration
+@AutoConfigureAfter({RedisAutoConfiguration.class, CacheAutoConfiguration.class})
+@EnableRedisRepositories
+public class CacheConfig {
+
+    @Bean
+    RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
+
+        RedisTemplate<String, Object> template = new RedisTemplate<>();
+        template.setConnectionFactory(redisConnectionFactory);
+
+        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
+        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Object.class);
+
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
+                ObjectMapper.DefaultTyping.NON_FINAL,
+                JsonTypeInfo.As.WRAPPER_ARRAY);
+        mapper.registerModule(new Hibernate5Module()
+                .enable(Hibernate5Module.Feature.FORCE_LAZY_LOADING));
+        mapper.registerModule(new JavaTimeModule());
+        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
+        mapper.setConfig(mapper.getSerializationConfig().withView(UserView.Redis.class));
+
+        serializer.setObjectMapper(mapper);
+
+        template.setValueSerializer(serializer);
+        //使用StringRedisSerializer来序列化和反序列化redis的key值
+        template.setKeySerializer(new StringRedisSerializer());
+        template.setHashKeySerializer(new StringRedisSerializer());
+        template.setHashValueSerializer(serializer);
+        template.afterPropertiesSet();
+        return template;
+    }
+
+    @Bean
+    public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate) {
+        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory());
+        RedisSerializationContext.SerializationPair serializationPair = RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer());
+        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
+        //一般缓存,需要控制时长,防止一直缓存
+        redisCacheConfiguration = redisCacheConfiguration.entryTtl(Duration.ofDays(1));
+        redisCacheConfiguration = redisCacheConfiguration.serializeValuesWith(serializationPair);
+
+        return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
+    }
+}

+ 59 - 0
src/main/java/com/izouma/nineth/config/Constants.java

@@ -0,0 +1,59 @@
+package com.izouma.nineth.config;
+
+public interface Constants {
+
+    public interface Regex {
+        String PHONE    = "^1[3-9]\\d{9}$";
+        String USERNAME = "^[_.@A-Za-z0-9-]*$";
+        String CHINESE  = "^[\\u4e00-\\u9fa5]+$";
+        String ID_NO    = "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0-2]\\d)|3[0-1])\\d{3}$|^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0-2]\\d)|3[0-1])\\d{3}[0-9xX]$";
+    }
+
+    String DEFAULT_AVATAR = "https://9space-2021.oss-cn-shenzhen.aliyuncs.com/image/2021-11-26-18-49-04fkFHRAhM.jpg";
+
+    String bizId = "a00e36c5";
+
+    String kmsKey = "ydtg$@WZ9NH&EB2e";
+
+    String SMS_TOKEN_SECRET = "rjbcsj39s9mg9r";
+
+    /**
+     * 默认的黑洞用户,保存删除的资产
+     */
+    String DEFAULT_BLACK_USER = "1590945";
+
+    /**
+     * 支付行为,支付普通订单
+     */
+    String ACTION_PAY_ORDER = "payOrder";
+
+    /**
+     * 支付行为,支付转赠订单
+     */
+    String ACTION_PAY_GIFT_ORDER = "payGiftOrder";
+
+    /**
+     * 邀请活动开始时间
+     */
+    String  INVITE_STARTDATETIME= "2022-04-18 14:16:23";
+    /**
+     * 邀请活动结束时间
+     */
+    String  INVITE_ENDDATETIME= "2022-04-18 14:16:23";
+
+    /**
+     * 邀请人数
+     */
+    String INVITE_NUM = "0";
+
+    /**
+     * 邀请获得空投藏品ID
+     */
+    String INVITE_COLLECTION = "0";
+
+    /**
+     * 邀请奖励名额
+     */
+    String INVITE_AWARD_PLACES = "6";
+
+}

+ 148 - 0
src/main/java/com/izouma/nineth/config/DateConfig.java

@@ -0,0 +1,148 @@
+package com.izouma.nineth.config;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.*;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.convert.converter.Converter;
+
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+
+@Configuration
+public class DateConfig {
+
+    /**
+     * 默认日期时间格式
+     */
+    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
+    /**
+     * 默认日期格式
+     */
+    public static final String DEFAULT_DATE_FORMAT      = "yyyy-MM-dd";
+    /**
+     * 默认时间格式
+     */
+    public static final String DEFAULT_TIME_FORMAT      = "HH:mm:ss";
+
+    /**
+     * LocalDate转换器,用于转换RequestParam和PathVariable参数
+     */
+    @Bean
+    public Converter<String, LocalDate> localDateConverter() {
+        return new Converter<String, LocalDate>() {
+            @Override
+            public LocalDate convert(String source) {
+                return LocalDate.parse(source, DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT));
+            }
+        };
+    }
+
+    /**
+     * LocalDateTime转换器,用于转换RequestParam和PathVariable参数
+     */
+    @Bean
+    public Converter<String, LocalDateTime> localDateTimeConverter() {
+        return new Converter<String, LocalDateTime>() {
+            @Override
+            public LocalDateTime convert(String source) {
+                return LocalDateTime.parse(source, DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT));
+            }
+        };
+    }
+
+    /**
+     * LocalTime转换器,用于转换RequestParam和PathVariable参数
+     */
+    @Bean
+    public Converter<String, LocalTime> localTimeConverter() {
+        return new Converter<String, LocalTime>() {
+            @Override
+            public LocalTime convert(String source) {
+                return LocalTime.parse(source, DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT));
+            }
+        };
+    }
+
+    /**
+     * Date转换器,用于转换RequestParam和PathVariable参数
+     */
+    @Bean
+    public Converter<String, Date> dateConverter() {
+        return new Converter<String, Date>() {
+            @Override
+            public Date convert(String source) {
+                SimpleDateFormat format = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT);
+                try {
+                    return format.parse(source);
+                } catch (ParseException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        };
+    }
+
+
+    /**
+     * Json序列化和反序列化转换器,用于转换Post请求体中的json以及将我们的对象序列化为返回响应的json
+     */
+    @Bean
+    public ObjectMapper objectMapper() {
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+        objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
+
+        //LocalDateTime系列序列化和反序列化模块,继承自jsr310,我们在这里修改了日期格式
+        JavaTimeModule javaTimeModule = new JavaTimeModule();
+        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
+        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
+        javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
+        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
+        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
+        javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
+
+
+        //Date序列化和反序列化
+        javaTimeModule.addSerializer(Date.class, new JsonSerializer<Date>() {
+            @Override
+            public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
+                SimpleDateFormat formatter = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT);
+                String formattedDate = formatter.format(date);
+                jsonGenerator.writeString(formattedDate);
+            }
+        });
+        javaTimeModule.addDeserializer(Date.class, new JsonDeserializer<Date>() {
+            @Override
+            public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+                SimpleDateFormat format = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT);
+                String date = jsonParser.getText();
+                try {
+                    return format.parse(date);
+                } catch (ParseException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        });
+
+        objectMapper.registerModule(javaTimeModule);
+        return objectMapper;
+    }
+
+
+}
+

+ 5 - 0
src/main/java/com/izouma/nineth/config/EventNames.java

@@ -0,0 +1,5 @@
+package com.izouma.nineth.config;
+
+public class EventNames {
+    public final static String SWITCH_ACCOUNT = "switchAccount";
+}

+ 31 - 0
src/main/java/com/izouma/nineth/config/GeneralProperties.java

@@ -0,0 +1,31 @@
+package com.izouma.nineth.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@ConfigurationProperties(prefix = "general")
+@Data
+public class GeneralProperties {
+    private String  host;
+    private String  contractName;
+    private String  name;
+    private String  org;
+    private String  shortName;
+    private String  createOrderGroup;
+    private String  createOrderTopic;
+//    private String  updateStockGroup;
+//    private String  updateStockTopic;
+//    private String  updateSaleGroup;
+//    private String  updateSaleTopic;
+    private String  orderNotifyGroup;
+    private String  orderNotifyTopic;
+    private String  mintGroup;
+    private String  mintTopic;
+    private String  updateActivityStockGroup;
+    private String  updateActivityStockTopic;
+    private String  broadcastEventGroup;
+    private String  broadcastEventTopic;
+    private boolean notifyServer;
+    private int     dataCenterId;
+    private int     workerId;
+}

+ 30 - 0
src/main/java/com/izouma/nineth/config/HibernateJsonConfig.java

@@ -0,0 +1,30 @@
+package com.izouma.nineth.config;
+
+
+import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import com.fasterxml.jackson.databind.Module;
+
+/**
+ * Hibernate 懒加载失效 因为json序列化
+ */
+@Configuration
+public class HibernateJsonConfig {
+
+    /**
+     * 注册一个额外的Jackson模块
+     *
+     * @return Module
+     */
+    @Bean
+    public Module hibernate5Module() {
+        Hibernate5Module module = new Hibernate5Module();
+        //禁用(表示要忽略@Transient字段属性,默认为true,设置为false禁用)
+        module.disable(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION);
+        //延时加载的对象不使用时设置为null
+        module.enable(Hibernate5Module.Feature.SERIALIZE_IDENTIFIER_FOR_LAZY_NOT_LOADED_OBJECTS);
+        return module;
+    }
+
+}

+ 36 - 0
src/main/java/com/izouma/nineth/config/LocalDateTimeSerializerConfig.java

@@ -0,0 +1,36 @@
+package com.izouma.nineth.config;
+
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+@Configuration
+public class LocalDateTimeSerializerConfig {
+    @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
+    private String pattern;
+
+    @Bean
+    public LocalDateTimeSerializer localDateTimeDeserializer() {
+        return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+    }
+
+    @Bean
+    public LocalDateSerializer localDateSerializer() {
+        return new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+    }
+
+    @Bean
+    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
+        return builder -> {
+            builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer());
+            builder.serializerByType(LocalDate.class, localDateSerializer());
+        };
+    }
+}

+ 66 - 0
src/main/java/com/izouma/nineth/config/RedisKeys.java

@@ -0,0 +1,66 @@
+package com.izouma.nineth.config;
+
+public class RedisKeys {
+    public static final String COLLECTION = "collection::";
+
+    public static final String CREATE_ORDER = "createOrder::";
+
+    public static final String COLLECTION_STOCK = "collectionStock::";
+
+    public static final String MQ_ORDER_STATIS = "mqOrderStatis::";
+
+    //购买订单队列锁定
+    public static final String MQ_ORDER_LOCK = "mqOrderLock::";
+
+    //购买订单锁定
+    public static final String ORDER_LOCK = "orderLock::";
+
+    //转赠资产锁定
+    public static final String GIFT_ASSET_LOCK = "giftAssetLock::";
+
+    //空投锁定
+    public static  final String CREATE_AIR_DROP_LOCK = "createAirDropLock::";
+
+    //转赠订单锁定
+    public static final String GIFT_ORDER_LOCK = "giftOrderLock::";
+
+    //盲盒抽取锁定
+    public static final String BLIND_DRAW_LOCK = "blindDrawLock::";
+
+    public static final String MINT_ACTIVITY_STOCK = "mintActivityStock::";
+
+    //资产铸造锁定
+    public static final String MINT_ASSET_LOCK = "mintAssetLock::";
+
+    public static final String ACTIVITY_PAY_RECORD = "activityPayRecord::";
+
+    public static final String ORDER_UNIQUE_SET = "orderUniqueSet";
+
+    //资产上架检查
+    public static final String ASSET_SHELF_CHECK = "assetShelfCheck";
+
+    /**
+     * 邀请排行榜
+     */
+    public static final String RANKING_INVITE = "ranking_invitel";
+
+    /**
+     * 消费排行榜
+     */
+    public static final String RANKING_CONSUME = "ranking_consume";
+    /**
+     * 绑卡排行榜
+     */
+    public static final String RANKING_BANKCARD = "ranking_bankcard";
+    /**
+     * 邀请空投名额数量
+     */
+    public static final String INVITE_AWARD_PLACES = "invite_award_places::";
+    //优先购
+    public static final String AC_ASSETID = "ac_assetid::";
+    /**
+     * 系统公告已阅读用户Set
+     */
+    public static final String NOTICE_READ_USER = "notice_read_user";
+
+}

+ 19 - 0
src/main/java/com/izouma/nineth/config/SchedulingConfig.java

@@ -0,0 +1,19 @@
+package com.izouma.nineth.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.TaskScheduler;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+
+@Configuration
+public class SchedulingConfig {
+    @Bean
+    public TaskScheduler taskScheduler() {
+        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
+        // 定时任务执行线程池核心线程数
+        taskScheduler.setPoolSize(50);
+        taskScheduler.setRemoveOnCancelPolicy(true);
+        taskScheduler.setThreadNamePrefix("Scheduler-");
+        return taskScheduler;
+    }
+}

+ 16 - 0
src/main/java/com/izouma/nineth/config/SnowflakeIdWorkerConfig.java

@@ -0,0 +1,16 @@
+package com.izouma.nineth.config;
+
+import com.izouma.nineth.utils.SnowflakeIdWorker;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@Slf4j
+public class SnowflakeIdWorkerConfig {
+    @Bean
+    public SnowflakeIdWorker snowflakeIdWorker(GeneralProperties generalProperties) {
+        log.info("init snowflakeIdWorker worker={} dataCenter={}", generalProperties.getWorkerId(), generalProperties.getDataCenterId());
+        return new SnowflakeIdWorker(generalProperties.getWorkerId(), generalProperties.getDataCenterId());
+    }
+}

+ 24 - 0
src/main/java/com/izouma/nineth/config/SpringSecurityAuditorAware.java

@@ -0,0 +1,24 @@
+package com.izouma.nineth.config;
+
+import com.izouma.nineth.domain.User;
+import com.izouma.nineth.utils.SecurityUtils;
+import org.springframework.data.domain.AuditorAware;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Nonnull;
+import java.util.Optional;
+
+@Component
+public class SpringSecurityAuditorAware implements AuditorAware<String> {
+
+    @Override
+    @Nonnull
+    public Optional<String> getCurrentAuditor() {
+        String auditor = "system";
+        User user = SecurityUtils.getAuthenticatedUser();
+        if (user != null) {
+            auditor = user.getNickname() + "(" + user.getId() + ")";
+        }
+        return Optional.of(auditor);
+    }
+}

+ 77 - 0
src/main/java/com/izouma/nineth/config/SysConstants.java

@@ -0,0 +1,77 @@
+package com.izouma.nineth.config;
+
+/**
+ * 参数配置常量
+ *
+ */
+public interface SysConstants {
+
+    /**
+     * gas费用
+     */
+    String GAS_FEE = "gas_fee";
+
+    /**
+     * 转赠gas费用
+     */
+    String GIFT_GAS_FEE = "gift_gas_fee";
+
+    /**
+     * 启用微信公众号支付
+     */
+    String ENABLE_WX_PUB = "enable_wx_pub";
+
+    /**
+     * 使用小程序支付
+     */
+    String ENABLE_WX_LITE = "enable_wx_lite";
+
+    /**
+     * 持有几天可销售
+     */
+    String HOLD_DAYS = "hold_days";
+
+    /**
+     * 支付平台设置
+     */
+    String PAY_PLATFORM = "pay_platform";
+
+    /**
+     * 黑洞账户ID
+     */
+    String BLACK_USER_ID = "black_user_id";
+    /**
+     * 邀请活动开始时间
+     */
+    String  INVITE_STARTDATETIME= "invite_startdatetime";
+    /**
+     * 邀请活动结束时间
+     */
+    String  INVITE_ENDDATETIME= "invite_enddatetime";
+
+    /**
+     * 邀请人数
+     */
+    String INVITE_NUM = "invite_num";
+    /**
+     * 邀请获得空投藏品ID
+     */
+    String INVITE_COLLECTION = "invite_collection";
+
+    /**
+     * 用户默认头像
+     */
+    String DEFAULT_AVATAR = "default_avatar";
+    /**
+     * 邀请奖励名额
+     */
+    String INVITE_AWARD_PLACES = "invite_award_places";
+
+
+    /**
+     * 测试用户ID
+     */
+    String TESTER_USER_ID = "tester_user_id";
+
+
+}

+ 98 - 0
src/main/java/com/izouma/nineth/config/WebMvcConfig.java

@@ -0,0 +1,98 @@
+package com.izouma.nineth.config;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+
+import java.util.List;
+
+@Configuration
+@EnableConfigurationProperties(GeneralProperties.class)
+public class WebMvcConfig implements WebMvcConfigurer {
+    @Value("${storage.local_path}")
+    private String localPath;
+
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        // registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
+        // registry.addResourceHandler("webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
+        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
+        registry.addResourceHandler("/admin/**").addResourceLocations("classpath:/static/admin/");
+        registry.addResourceHandler("/files/**").addResourceLocations("file:" + localPath);
+        registry.addResourceHandler("/MP_verify*").addResourceLocations("classpath:/");
+    }
+
+    @Bean
+    public Docket createApi() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(new ApiInfoBuilder()
+                                 .title("接口文档")
+                                 .version("1.0.0")
+                                 .termsOfServiceUrl("#")
+                                 .description("接口文档")
+                                 .build())
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.izouma.nineth.web"))
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+    @Override
+    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+        converters.stream().filter(converter -> converter instanceof MappingJackson2HttpMessageConverter)
+                .forEach(converter -> {
+                    ObjectMapper objectMapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
+                    SimpleModule simpleModule = new SimpleModule();
+                    simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
+                    simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
+                    objectMapper.registerModule(simpleModule);
+                    ((MappingJackson2HttpMessageConverter) converter).setObjectMapper(objectMapper);
+                });
+        System.out.println(converters);
+    }
+    // @Bean
+    // public MappingJackson2HttpMessageConverter getMappingJackson2HttpMessageConverter() {
+    //     MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
+    //     //设置日期格式
+    //     ObjectMapper objectMapper = new ObjectMapper();
+    //     objectMapper.setDateFormat(CustomDateFormat.instance);
+    //     objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+    //     mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
+    //     //设置中文编码格式
+    //     List<MediaType> list = new ArrayList<>();
+    //     list.add(MediaType.APPLICATION_JSON_UTF8);
+    //     mappingJackson2HttpMessageConverter.setSupportedMediaTypes(list);
+    //     return mappingJackson2HttpMessageConverter;
+    // }
+
+//    @Override
+//    public void addFormatters(FormatterRegistry registry) {
+//        DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
+//        registrar.setUseIsoFormat(true);
+//        registrar.registerFormatters(registry);
+//    }
+
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+        registry.addMapping("/**")
+                .allowedHeaders("*")
+                .allowCredentials(true)
+                .allowedMethods("HEAD", "GET", "PUT", "POST", "DELETE", "PATCH")
+                .exposedHeaders("Content-Disposition");
+    }
+
+}

+ 30 - 0
src/main/java/com/izouma/nineth/config/WxMaConfiguration.java

@@ -0,0 +1,30 @@
+package com.izouma.nineth.config;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
+import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
+import lombok.AllArgsConstructor;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@AllArgsConstructor
+@Configuration
+@EnableConfigurationProperties(WxMaProperties.class)
+public class WxMaConfiguration {
+    private final WxMaProperties properties;
+
+    @Bean
+    public WxMaService wxMaService() {
+        WxMaService service = new WxMaServiceImpl();
+        WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
+        config.setAppid(properties.getAppId());
+        config.setSecret(properties.getAppSecret());
+        config.setToken(properties.getMsgToken());
+        config.setAesKey(properties.getMsgAesKey());
+        config.setMsgDataFormat(properties.getMsgFormat());
+        service.setWxMaConfig(config);
+        return service;
+    }
+
+}

+ 14 - 0
src/main/java/com/izouma/nineth/config/WxMaProperties.java

@@ -0,0 +1,14 @@
+package com.izouma.nineth.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "wx.ma")
+public class WxMaProperties {
+    private String appId;
+    private String appSecret;
+    private String msgToken;
+    private String msgAesKey;
+    private String msgFormat;
+}

+ 74 - 0
src/main/java/com/izouma/nineth/config/WxMpConfiguration.java

@@ -0,0 +1,74 @@
+package com.izouma.nineth.config;
+
+import com.izouma.nineth.mpHandler.LogHandler;
+import lombok.AllArgsConstructor;
+import me.chanjar.weixin.mp.api.WxMpMessageRouter;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
+import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@AllArgsConstructor
+@Configuration
+@EnableConfigurationProperties(WxMpProperties.class)
+public class WxMpConfiguration {
+    private final WxMpProperties properties;
+    private final LogHandler     logHandler;
+
+    @Bean
+    public WxMpService wxMpService() {
+        WxMpDefaultConfigImpl mpConfig = new WxMpDefaultConfigImpl();
+        mpConfig.setAppId(properties.getAppId());
+        mpConfig.setSecret(properties.getAppSecret());
+        mpConfig.setAccessToken(properties.getToken());
+        mpConfig.setAesKey(properties.getAesKey());
+        WxMpService service = new WxMpServiceImpl();
+        service.setWxMpConfigStorage(mpConfig);
+        return service;
+    }
+
+    @Bean
+    public WxMpMessageRouter messageRouter(WxMpService wxMpService) {
+        final WxMpMessageRouter newRouter = new WxMpMessageRouter(wxMpService);
+
+        // 记录所有事件的日志 (异步执行)
+        newRouter.rule().handler(this.logHandler).next();
+
+        /*// 接收客服会话管理事件
+        newRouter.rule().async(false).msgType(EVENT).event(KF_CREATE_SESSION).handler(this.kfSessionHandler).end();
+        newRouter.rule().async(false).msgType(EVENT).event(KF_CLOSE_SESSION).handler(this.kfSessionHandler).end();
+        newRouter.rule().async(false).msgType(EVENT).event(KF_SWITCH_SESSION).handler(this.kfSessionHandler).end();
+
+        // 门店审核事件
+        newRouter.rule().async(false).msgType(EVENT).event(POI_CHECK_NOTIFY).handler(this.storeCheckNotifyHandler).end();
+
+        // 自定义菜单事件
+        newRouter.rule().async(false).msgType(EVENT).event(WxConsts.EventType.CLICK).handler(this.menuHandler).end();
+
+        // 点击菜单连接事件
+        newRouter.rule().async(false).msgType(EVENT).event(WxConsts.EventType.VIEW).handler(this.nullHandler).end();
+
+        // 关注事件
+        newRouter.rule().async(false).msgType(EVENT).event(SUBSCRIBE).handler(this.subscribeHandler).end();
+
+        // 取消关注事件
+        newRouter.rule().async(false).msgType(EVENT).event(UNSUBSCRIBE).handler(this.unsubscribeHandler).end();
+
+        // 上报地理位置事件
+        newRouter.rule().async(false).msgType(EVENT).event(WxConsts.EventType.LOCATION).handler(this.locationHandler).end();
+
+        // 接收地理位置消息
+        newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.LOCATION).handler(this.locationHandler).end();
+
+        // 扫码事件
+        newRouter.rule().async(false).msgType(EVENT).event(WxConsts.EventType.SCAN).handler(this.scanHandler).end();
+
+        // 默认
+        newRouter.rule().async(false).handler(this.msgHandler).end();*/
+
+        return newRouter;
+    }
+
+}

+ 13 - 0
src/main/java/com/izouma/nineth/config/WxMpProperties.java

@@ -0,0 +1,13 @@
+package com.izouma.nineth.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "wx.mp")
+public class WxMpProperties {
+    private String appId;
+    private String appSecret;
+    private String token;
+    private String aesKey;
+}

+ 47 - 0
src/main/java/com/izouma/nineth/config/WxPayConfiguration.java

@@ -0,0 +1,47 @@
+package com.izouma.nineth.config;
+
+import com.github.binarywang.wxpay.config.WxPayConfig;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author Binary Wang
+ */
+@Configuration
+@ConditionalOnClass(WxPayService.class)
+@EnableConfigurationProperties(WxPayProperties.class)
+public class WxPayConfiguration {
+    private WxPayProperties properties;
+
+    @Autowired
+    public WxPayConfiguration(WxPayProperties properties) {
+        this.properties = properties;
+    }
+
+    @Bean
+    @ConditionalOnMissingBean
+    public WxPayService wxService() {
+        WxPayConfig payConfig = new WxPayConfig();
+        payConfig.setAppId(StringUtils.trimToNull(this.properties.getAppId()));
+        payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId()));
+        payConfig.setMchKey(StringUtils.trimToNull(this.properties.getMchKey()));
+        payConfig.setSubAppId(StringUtils.trimToNull(this.properties.getSubAppId()));
+        payConfig.setSubMchId(StringUtils.trimToNull(this.properties.getSubMchId()));
+        payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath()));
+
+        // 可以指定是否使用沙箱环境
+        payConfig.setUseSandboxEnv(false);
+
+        WxPayService wxPayService = new WxPayServiceImpl();
+        wxPayService.setConfig(payConfig);
+        return wxPayService;
+    }
+
+}

+ 51 - 0
src/main/java/com/izouma/nineth/config/WxPayProperties.java

@@ -0,0 +1,51 @@
+package com.izouma.nineth.config;
+
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * wxpay pay properties
+ *
+ * @author Binary Wang
+ */
+@ConfigurationProperties(prefix = "wx.pay")
+@Data
+public class WxPayProperties {
+  /**
+   * 设置微信公众号或者小程序等的appid
+   */
+  private String appId;
+
+  /**
+   * 微信支付商户号
+   */
+  private String mchId;
+
+  /**
+   * 微信支付商户密钥
+   */
+  private String mchKey;
+
+  /**
+   * 服务商模式下的子商户公众账号ID,普通模式请不要配置,请在配置文件中将对应项删除
+   */
+  private String subAppId;
+
+  /**
+   * 服务商模式下的子商户号,普通模式请不要配置,最好是请在配置文件中将对应项删除
+   */
+  private String subMchId;
+
+  /**
+   * apiclient_cert.p12文件的绝对路径,或者如果放在项目中,请以classpath:开头指定
+   */
+  private String keyPath;
+
+  private String notifyUrl;
+
+  private String refundNotifyUrl;
+
+  private String returnUrl;
+}

+ 75 - 0
src/main/java/com/izouma/nineth/converter/EnumExcelConverter.java

@@ -0,0 +1,75 @@
+package com.izouma.nineth.converter;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.CellData;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import com.izouma.nineth.annotations.EnumFormat;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.EnumUtils;
+import org.springframework.util.Assert;
+
+import java.util.Objects;
+
+/**
+ * @author WuKun
+ * @since 2019/10/10
+ */
+public class EnumExcelConverter implements Converter<Enum> {
+
+    @Override
+    public Class supportJavaTypeKey() {
+        return Enum.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public Enum convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
+        String cellDataStr = cellData.getStringValue();
+
+        EnumFormat annotation = contentProperty.getField().getAnnotation(EnumFormat.class);
+        Class enumClazz = annotation.value();
+        String[] fromExcel = annotation.fromExcel();
+        String[] toJavaEnum = annotation.toJavaEnum();
+
+        Enum anEnum = null;
+        if (ArrayUtils.isNotEmpty(fromExcel) && ArrayUtils.isNotEmpty(toJavaEnum)) {
+            Assert.isTrue(fromExcel.length == toJavaEnum.length, "fromExcel 与 toJavaEnum 的长度必须相同");
+            for (int i = 0; i < fromExcel.length; i++) {
+                if (Objects.equals(fromExcel[i], cellDataStr)) {
+                    anEnum = EnumUtils.getEnum(enumClazz, toJavaEnum[i]);
+                }
+            }
+        } else {
+            anEnum = EnumUtils.getEnum(enumClazz, cellDataStr);
+        }
+
+        Assert.notNull(anEnum, "枚举值不合法");
+        return anEnum;
+    }
+
+    @Override
+    public CellData convertToExcelData(Enum value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
+
+        String enumName = value.name();
+
+        EnumFormat annotation = contentProperty.getField().getAnnotation(EnumFormat.class);
+        String[] fromExcel = annotation.fromExcel();
+        String[] toJavaEnum = annotation.toJavaEnum();
+
+        if (ArrayUtils.isNotEmpty(fromExcel) && ArrayUtils.isNotEmpty(toJavaEnum)) {
+            Assert.isTrue(fromExcel.length == toJavaEnum.length, "fromExcel 与 toJavaEnum 的长度必须相同");
+            for (int i = 0; i < toJavaEnum.length; i++) {
+                if (Objects.equals(toJavaEnum[i], enumName)) {
+                    return new CellData(fromExcel[i]);
+                }
+            }
+        }
+        return new CellData(enumName);
+    }
+}

+ 26 - 0
src/main/java/com/izouma/nineth/converter/FileObjectConverter.java

@@ -0,0 +1,26 @@
+package com.izouma.nineth.converter;
+
+import com.alibaba.fastjson.JSON;
+import com.izouma.nineth.domain.FileObject;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
+
+@Converter
+public class FileObjectConverter implements AttributeConverter<FileObject, String> {
+    @Override
+    public String convertToDatabaseColumn(FileObject fileObject) {
+        if (fileObject != null  )
+            return JSON.toJSONString(fileObject);
+        return null;
+    }
+
+    @Override
+    public FileObject convertToEntityAttribute(String s) {
+        if (StringUtils.isNotEmpty(s)) {
+            return JSON.parseObject(s, FileObject.class);
+        }
+        return null;
+    }
+}

+ 41 - 0
src/main/java/com/izouma/nineth/converter/FileObjectListConverter.java

@@ -0,0 +1,41 @@
+package com.izouma.nineth.converter;
+
+import com.alibaba.fastjson.JSON;
+import com.izouma.nineth.domain.FileObject;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+@Converter
+public class FileObjectListConverter implements AttributeConverter<List<FileObject>, String> {
+    @Override
+    public String convertToDatabaseColumn(List<FileObject> list) {
+        if (list != null)
+            return JSON.toJSONString(list);
+        return null;
+    }
+
+    @Override
+    public List<FileObject> convertToEntityAttribute(String s) {
+        if (StringUtils.isNotEmpty(s)) {
+            if (!Pattern.matches("\\[.+]", s)) {
+                return Arrays.stream(s.split(",")).map(ss -> {
+                    FileObject fileObject = new FileObject();
+                    fileObject.setUrl(ss);
+                    return fileObject;
+                }).collect(Collectors.toList());
+            }
+            try {
+                return JSON.parseArray(s, FileObject.class);
+            } catch (Exception e) {
+
+            }
+        }
+        return null;
+    }
+}

+ 30 - 0
src/main/java/com/izouma/nineth/converter/InvitePrizeConverter.java

@@ -0,0 +1,30 @@
+package com.izouma.nineth.converter;
+
+import com.alibaba.fastjson.JSON;
+import com.izouma.nineth.domain.InvitePrize;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
+
+@Converter
+public class InvitePrizeConverter implements AttributeConverter<InvitePrize, String> {
+    @Override
+    public String convertToDatabaseColumn(InvitePrize invitePrize) {
+        if (invitePrize != null  )
+            return JSON.toJSONString(invitePrize);
+        return null;
+    }
+
+    @Override
+    public InvitePrize convertToEntityAttribute(String s) {
+        try {
+            if (StringUtils.isNotEmpty(s)) {
+                return JSON.parseObject(s, InvitePrize.class);
+            }
+            return null;
+        }catch (Exception e){
+            return null;
+        }
+    }
+}

+ 40 - 0
src/main/java/com/izouma/nineth/converter/InvitePrizeListConverter.java

@@ -0,0 +1,40 @@
+package com.izouma.nineth.converter;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.izouma.nineth.domain.ActivityInvite;
+import com.izouma.nineth.domain.InvitePrize;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+import java.util.List;
+
+public class InvitePrizeListConverter implements AttributeConverter<List<InvitePrize>, String> {
+
+    @Override
+    public String convertToDatabaseColumn(List<InvitePrize> collectionProperties) {
+        if (collectionProperties == null) {
+            return null;
+        }
+        return JSON.toJSONString(collectionProperties);
+    }
+
+    @Override
+    public List<InvitePrize> convertToEntityAttribute(String s) {
+        if (StringUtils.isEmpty(s)) {
+            return null;
+        }
+        try {
+            return JSONArray.parseArray(s, InvitePrize.class);
+        } catch (Exception ignored) {
+            System.out.println("转换错误");
+        }
+        return null;
+    }
+
+    public static void main(String[] args) {
+        String str ="{\"id\":\"10061\",\"del\":false,\"inviteStartdatetime\":\"2022-05-17 00:00:00\",\"inviteEnddatetime\":\"2022-05-18 00:00:00\",\"byInvitePrize\":{\"type\":\"asset\",\"inviteCollection\":\"11574\",\"inviteNum\":0},\"prl\":\"https://cosmoscdn.9space.vip/image/2022-05-16-18-35-04hBeHjIqJ.jpg\",\"content\":\"<p>1:活动时间的钱的期望的委屈的</p >\\n<p>2:的委屈的委屈的我确定委屈的委屈的我确定我</p >\\n<p>3:的委屈的委屈的期望的期望的期望的委屈的 的我确定</p >\\n<p>4:分废物废物废物废物<span style=\\\"color: #e03e2d;\\\">粉为废物 </span>分额外废物粉</p >\\n<p>5:违法额外废物废物废物<span style=\\\"color: #3598db;\\\">废物废物粉</span>额外废物分万分额外分</p >\",\"name\":\"测试提交邀请有礼活动\",\"poster\":\"https://cosmoscdn.9space.vip/image/2022-05-16-18-35-00jfyZqufU.jpg\",\"projectId\":1,\"createdAt\":\"2022-05-16 18:36:51\",\"InvitePrizeList\":[{\"type\":\"asset\",\"inviteCollection\":\"11578\",\"inviteNum\":3}]}";
+        ActivityInvite ll = JSONArray.parseObject(str, ActivityInvite.class);
+        System.out.println( ll);
+    }
+}

+ 30 - 0
src/main/java/com/izouma/nineth/converter/JSONObjectConverter.java

@@ -0,0 +1,30 @@
+package com.izouma.nineth.converter;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
+
+@Slf4j
+@Converter
+public class JSONObjectConverter implements AttributeConverter<JSONObject, String> {
+    @Override
+    public String convertToDatabaseColumn(JSONObject jsonObject) {
+        if (jsonObject != null) {
+            return jsonObject.toJSONString();
+        }
+        return null;
+    }
+
+    @Override
+    public JSONObject convertToEntityAttribute(String s) {
+        try {
+            return JSON.parseObject(s);
+        } catch (Exception e) {
+            log.error("parse json error", e);
+        }
+        return null;
+    }
+}

+ 28 - 0
src/main/java/com/izouma/nineth/converter/LongArrayConverter.java

@@ -0,0 +1,28 @@
+package com.izouma.nineth.converter;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Converter
+public class LongArrayConverter implements AttributeConverter<List<Long>, String> {
+    @Override
+    public String convertToDatabaseColumn(List<Long> longs) {
+        if (longs != null && !longs.isEmpty())
+            return StringUtils.join(longs, ",");
+        return null;
+    }
+
+    @Override
+    public List<Long> convertToEntityAttribute(String s) {
+        if (StringUtils.isNotEmpty(s)) {
+            return Arrays.stream(s.split(",")).map(Long::parseLong).collect(Collectors.toList());
+        }
+        return new ArrayList<>();
+    }
+}

+ 34 - 0
src/main/java/com/izouma/nineth/converter/PrivilegeListConverter.java

@@ -0,0 +1,34 @@
+package com.izouma.nineth.converter;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.izouma.nineth.domain.Privilege;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
+import java.util.List;
+
+@Converter
+public class PrivilegeListConverter implements AttributeConverter<List<Privilege>, String> {
+
+    @Override
+    public String convertToDatabaseColumn(List<Privilege> privileges) {
+        if (privileges == null) {
+            return null;
+        }
+        return JSON.toJSONString(privileges);
+    }
+
+    @Override
+    public List<Privilege> convertToEntityAttribute(String s) {
+        if (StringUtils.isEmpty(s)) {
+            return null;
+        }
+        try {
+            return JSONArray.parseArray(s, Privilege.class);
+        } catch (Exception ignored) {
+        }
+        return null;
+    }
+}

+ 34 - 0
src/main/java/com/izouma/nineth/converter/PropertyListConverter.java

@@ -0,0 +1,34 @@
+package com.izouma.nineth.converter;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.izouma.nineth.domain.CollectionProperty;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
+import java.util.List;
+
+@Converter
+public class PropertyListConverter implements AttributeConverter<List<CollectionProperty>, String> {
+
+    @Override
+    public String convertToDatabaseColumn(List<CollectionProperty> collectionProperties) {
+        if (collectionProperties == null) {
+            return null;
+        }
+        return JSON.toJSONString(collectionProperties);
+    }
+
+    @Override
+    public List<CollectionProperty> convertToEntityAttribute(String s) {
+        if (StringUtils.isEmpty(s)) {
+            return null;
+        }
+        try {
+            return JSONArray.parseArray(s, CollectionProperty.class);
+        } catch (Exception ignored) {
+        }
+        return null;
+    }
+}

+ 27 - 0
src/main/java/com/izouma/nineth/converter/StringArrayConverter.java

@@ -0,0 +1,27 @@
+package com.izouma.nineth.converter;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@Converter
+public class StringArrayConverter implements AttributeConverter<List<String>, String> {
+    @Override
+    public String convertToDatabaseColumn(List<String> strings) {
+        if (strings != null && !strings.isEmpty())
+            return StringUtils.join(strings, ",");
+        return null;
+    }
+
+    @Override
+    public List<String> convertToEntityAttribute(String s) {
+        if (StringUtils.isNotEmpty(s)) {
+            return Arrays.asList(s.split(","));
+        }
+        return new ArrayList<>();
+    }
+}

+ 24 - 0
src/main/java/com/izouma/nineth/converter/StringToMapConverter.java

@@ -0,0 +1,24 @@
+package com.izouma.nineth.converter;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.core.convert.converter.Converter;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.util.Map;
+
+@Component
+public class StringToMapConverter implements Converter<String, Map<String, Object>> {
+
+    @Override
+    public Map<String, Object> convert(@Nullable String source) {
+        try {
+            return new ObjectMapper().readValue(source, new TypeReference<Map<String, Object>>() {
+            });
+        } catch (IOException e) {
+            throw new RuntimeException(e.getMessage());
+        }
+    }
+}

+ 32 - 0
src/main/java/com/izouma/nineth/converter/SurpriseBoxContentListConverter.java

@@ -0,0 +1,32 @@
+package com.izouma.nineth.converter;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.izouma.nineth.domain.SurpriseBoxContent;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+import java.util.List;
+
+public class SurpriseBoxContentListConverter implements AttributeConverter<List<SurpriseBoxContent>, String> {
+
+    @Override
+    public String convertToDatabaseColumn(List<SurpriseBoxContent> collectionProperties) {
+        if (collectionProperties == null) {
+            return null;
+        }
+        return JSON.toJSONString(collectionProperties);
+    }
+
+    @Override
+    public List<SurpriseBoxContent> convertToEntityAttribute(String s) {
+        if (StringUtils.isEmpty(s)) {
+            return null;
+        }
+        try {
+            return JSONArray.parseArray(s, SurpriseBoxContent.class);
+        } catch (Exception ignored) {
+        }
+        return null;
+    }
+}

+ 42 - 0
src/main/java/com/izouma/nineth/domain/Activity.java

@@ -0,0 +1,42 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.converter.StringArrayConverter;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Convert;
+import javax.persistence.Entity;
+import java.util.List;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("系列活动")
+public class Activity extends BaseEntity {
+    @Searchable
+    private String name;
+
+    private String cover;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = StringArrayConverter.class)
+    private List<String> detail;
+
+    private int projectId;
+
+    @ApiModelProperty("详情")
+    @Column(columnDefinition = "TEXT")
+    private String content;
+    public Activity(Long id ,String name) {
+        super.setId(id);
+        this.name = name;
+    }
+}

+ 76 - 0
src/main/java/com/izouma/nineth/domain/ActivityCollection.java

@@ -0,0 +1,76 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.enums.ActivityCollectionType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+@ApiModel("活动收集")
+public class ActivityCollection extends BaseEntity {
+    @ApiModelProperty("活动名称")
+    @Searchable
+    private String name;
+
+    @Column(columnDefinition = "TEXT")
+    @ApiModelProperty("图片")
+    private String pic;
+
+    @ApiModelProperty("藏品名称")
+    private String collectionName;
+
+    @ApiModelProperty("藏品ID")
+    private Long collectionId;
+
+    @ApiModelProperty("藏品数量")
+    private int num;
+
+    @ApiModelProperty("剩余数量")
+    private int stock;
+
+    @ApiModelProperty("发行数量")
+    private int total;
+
+    @ApiModelProperty("领取藏品ID")
+    private Long awardCollectionId;
+
+    @ApiModelProperty("领取藏品名称")
+    private String awardCollectionName;
+
+    private int projectId;
+
+    @ApiModelProperty("状态 是否可兑换")
+    @Transient
+    private Boolean collected;
+
+    @ApiModelProperty("类型")
+    @Enumerated(EnumType.ORDINAL)
+    private ActivityCollectionType type;
+
+    @ApiModelProperty("兑换藏品列表")
+    @OneToMany(cascade = {CascadeType.REMOVE,CascadeType.PERSIST})
+    @JoinColumn(name = "activity_id")
+    private List<AwardActivityCollectionInfo> awardList;
+
+    @ApiModelProperty("兑换藏品列表")
+    @OneToMany(cascade = {CascadeType.REMOVE,CascadeType.PERSIST})
+    @JoinColumn(name = "activity_id")
+    private List<ActivityCollectionInfo> activities;
+
+
+    @ApiModelProperty("需要收集的卡片数")
+    @Transient
+    private Integer needCollectedNum;
+
+}

+ 46 - 0
src/main/java/com/izouma/nineth/domain/ActivityCollectionInfo.java

@@ -0,0 +1,46 @@
+package com.izouma.nineth.domain;
+
+import lombok.*;
+
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+
+/**
+ * 活动收集
+ *
+ * @author ZouYuHong
+ */
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+public class ActivityCollectionInfo extends BaseEntity {
+    /**
+     *藏品id
+     */
+    private Long collectionId;
+    /**
+     * 藏品名称
+     */
+    private String collectionName;
+    /**
+     * 数量
+     */
+    private Integer num;
+
+    /**
+     * 用户持有量
+     */
+    @Transient
+    private Integer userHoldNum;
+
+    /**
+     * 图片地址
+     */
+    @Transient
+    private String imgUrl;
+
+
+}

+ 81 - 0
src/main/java/com/izouma/nineth/domain/ActivityInvite.java

@@ -0,0 +1,81 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.converter.FileObjectConverter;
+import com.izouma.nineth.converter.InvitePrizeConverter;
+import com.izouma.nineth.converter.InvitePrizeListConverter;
+import com.izouma.nineth.converter.LongArrayConverter;
+import com.izouma.nineth.enums.AwardDistributionType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+@ApiModel("邀请活动")
+public class ActivityInvite extends BaseEntity {
+
+    @ApiModelProperty("邀请活动开始时间")
+    private LocalDateTime inviteStartdatetime;
+
+    @ApiModelProperty("邀请活动结束时间")
+    private LocalDateTime inviteEnddatetime;
+
+
+    @ApiModelProperty("邀请者奖品发放类型")
+    @Enumerated(EnumType.STRING)
+    private AwardDistributionType awardDistributionType ;
+
+    @ApiModelProperty("邀请者需要要持有藏品ID")
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = LongArrayConverter.class)
+    private List<Long> holdCollectionIds ;
+
+    @ApiModelProperty("邀请者资格:0注册,1需要实名,2需要实名+绑卡")
+    private Integer inviterQualifications ;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = InvitePrizeListConverter.class)
+    @ApiModelProperty("邀请者获得奖品")
+    private List<InvitePrize> invitePrizeList;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = InvitePrizeConverter.class)
+    @ApiModelProperty("被邀请者获得奖品")
+    private InvitePrize byInvitePrize;
+
+    @ApiModelProperty("活动图片")
+    private String prl;
+
+    @ApiModelProperty("活动公告内容")
+    @Column(columnDefinition = "TEXT")
+    private String content;
+
+    @ApiModelProperty("活动名字")
+    private String name;
+
+    @ApiModelProperty("活动海报")
+    private String poster;
+
+    @ApiModelProperty("活动结束邀请者已经发放奖励的玩家手机号")
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = LongArrayConverter.class)
+    private List<Long> phones;
+
+    private int projectId;
+
+
+    @ApiModelProperty("参与活动人员")
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = LongArrayConverter.class)
+    private List<Long> participants;
+}

+ 44 - 0
src/main/java/com/izouma/nineth/domain/ActivityMaterial.java

@@ -0,0 +1,44 @@
+package com.izouma.nineth.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.izouma.nineth.converter.FileObjectListConverter;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Convert;
+import javax.persistence.Entity;
+import java.util.List;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(value = {"hibernateLazyInitializer"}, ignoreUnknown = true)
+public class ActivityMaterial extends BaseEntity {
+    private Long orderId;
+
+    private Long assetId;
+
+    private Long collectionId;
+
+    private String name;
+
+    @ApiModelProperty("图片")
+    @Convert(converter = FileObjectListConverter.class)
+    @Column(columnDefinition = "TEXT")
+    private List<FileObject> pic;
+
+    @ApiModelProperty("编号")
+    private Integer number;
+
+    @ApiModelProperty("分类")
+    private String category;
+
+}

+ 33 - 0
src/main/java/com/izouma/nineth/domain/ActivityOrder.java

@@ -0,0 +1,33 @@
+package com.izouma.nineth.domain;
+
+
+import com.izouma.nineth.annotations.Searchable;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+public class ActivityOrder extends BaseEntity {
+
+    private Long userId;
+
+    @Searchable
+    private String phone;
+
+    private Long activityCollectionId;
+
+    private String activityCollection;
+
+    @Transient
+    private List<ActivityMaterial> material;
+
+}

+ 69 - 0
src/main/java/com/izouma/nineth/domain/ActivityPriorityDocument.java

@@ -0,0 +1,69 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.converter.FileObjectConverter;
+import com.izouma.nineth.converter.LongArrayConverter;
+import com.izouma.nineth.enums.ItemType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+@ApiModel("藏品优先凭证活动")
+public class ActivityPriorityDocument extends BaseEntity {
+
+    @ApiModelProperty("活动名称")
+    @Searchable
+    private String name;
+
+    @Column(columnDefinition = "TEXT")
+    @ApiModelProperty("图片")
+    private String pic;
+
+    @ApiModelProperty("藏品名称")
+    private String collectionName;
+
+    @ApiModelProperty("藏品ID")
+    @Searchable
+    private Long collectionId;
+
+    @ApiModelProperty("提前购买时间(小时)")
+    private int advancePurchaseTime;
+
+    @ApiModelProperty("可提前购买次数")
+    private int advancePurchaseCount;
+
+    @ApiModelProperty("第九空间/cosmos")
+    private int projectId;
+
+    @Column(columnDefinition = "TEXT")
+    @ApiModelProperty("说明")
+    private String text;
+
+    @ApiModelProperty("指定生效藏品ID")
+    @Searchable
+    private Long targetCollectionId;
+
+    @ApiModelProperty("凭证类型")
+    private ItemType ItemName;
+
+    @ApiModelProperty("凭证类型")
+    public Integer ItemId;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = LongArrayConverter.class)
+    @ApiModelProperty("指定生效藏品ID,多藏品")
+    private List<Long> targetCollectionIdList;
+
+
+}

+ 38 - 0
src/main/java/com/izouma/nineth/domain/ActivitySurpriseBox.java

@@ -0,0 +1,38 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.converter.SurpriseBoxContentListConverter;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Convert;
+import javax.persistence.Entity;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+@ApiModel("惊喜盒子配置")
+public class ActivitySurpriseBox extends BaseEntity{
+    @ApiModelProperty("活动名称")
+    @Searchable
+    private String name;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = SurpriseBoxContentListConverter.class)
+    @ApiModelProperty("惊喜盒子里面的东西")
+    private List<SurpriseBoxContent> properties;
+
+    @ApiModelProperty("已经发放盒子数量")
+    private Integer grantCount ;
+
+    @ApiModelProperty("盒子总数")
+    private Integer boxSum ;
+}

+ 40 - 0
src/main/java/com/izouma/nineth/domain/AdapayMerchant.java

@@ -0,0 +1,40 @@
+package com.izouma.nineth.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class AdapayMerchant extends BaseEntity {
+
+    @Column(unique = true, length = 72)
+    private String name;
+
+    @Column(unique = true, length = 72)
+    private String appId;
+
+    private String apiKey;
+
+    private String mockKey;
+
+    @Column(columnDefinition = "TEXT")
+    private String publicKey;
+
+    @Column(columnDefinition = "TEXT")
+    private String privKey;
+
+    private String wxAppId;
+
+    private String status;
+
+    private boolean selected;
+
+}

+ 77 - 0
src/main/java/com/izouma/nineth/domain/AirDrop.java

@@ -0,0 +1,77 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.converter.LongArrayConverter;
+import com.izouma.nineth.converter.StringArrayConverter;
+import com.izouma.nineth.enums.AirDropType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@Entity
+@Table(name = "air_drop", indexes = {
+        @Index(columnList = "name")
+})
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("空投")
+public class AirDrop extends BaseEntity {
+
+    @ApiModelProperty("空投名称")
+    @Searchable
+    private String name;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty("空投类型")
+    private AirDropType type;
+
+    @ApiModelProperty("兑换券ID")
+    private Long couponId;
+
+    @ApiModelProperty("藏品ID")
+    private Long collectionId;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = StringArrayConverter.class)
+    @ApiModelProperty("手机号")
+    private List<String> phone;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = LongArrayConverter.class)
+    @ApiModelProperty("用户ID")
+    private List<Long> userIds;
+
+    @Column(columnDefinition = "TEXT")
+    private String result;
+
+    private int projectId;
+
+    /**
+     * 操作内容
+     */
+    private String operation;
+
+    /**
+     * 投放价格(操作需要标记为出售)
+     */
+    @Column(precision = 10, scale = 2)
+    private BigDecimal dropPrice;
+
+    /**
+     * 成功投放数量
+     */
+    private Integer dropCount;
+
+}

+ 22 - 0
src/main/java/com/izouma/nineth/domain/Appointment.java

@@ -0,0 +1,22 @@
+package com.izouma.nineth.domain;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("预约")
+public class Appointment extends BaseEntity {
+
+    private Long blindBoxId;
+
+    private Long userId;
+}

+ 232 - 0
src/main/java/com/izouma/nineth/domain/Asset.java

@@ -0,0 +1,232 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.converter.FileObjectConverter;
+import com.izouma.nineth.converter.FileObjectListConverter;
+import com.izouma.nineth.converter.PrivilegeListConverter;
+import com.izouma.nineth.converter.PropertyListConverter;
+import com.izouma.nineth.enums.AssetStatus;
+import com.izouma.nineth.enums.CollectionType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.time.LocalDateTime;
+import java.util.List;
+
+
+@Data
+@Entity
+@Table(indexes = {
+        @Index(columnList = "userId"),
+        @Index(columnList = "tokenId"),
+        @Index(columnList = "collectionId"),
+        @Index(columnList = "minterId"),
+        @Index(columnList = "ownerId"),
+})
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("资产")
+public class Asset extends BaseEntity {
+
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    @ApiModelProperty("持有者")
+    private String ownerName;
+
+    @Searchable
+    @ApiModelProperty("藏品ID")
+    private Long collectionId;
+
+    @ApiModelProperty("订单ID")
+    private Long orderId;
+
+    @ApiModelProperty("编号")
+    private Integer number;
+
+    @ApiModelProperty("名称")
+    @Searchable
+    private String name;
+
+    @ApiModelProperty("详情")
+    @Column(columnDefinition = "TEXT")
+    private String detail;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = PropertyListConverter.class)
+    @ApiModelProperty("特性")
+    private List<CollectionProperty> properties;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = PrivilegeListConverter.class)
+    @ApiModelProperty("特权")
+    private List<Privilege> privileges;
+
+    @ApiModelProperty("分类")
+    private String category;
+
+    @ApiModelProperty("是否可转售")
+    private boolean canResale;
+
+    @ApiModelProperty("版税比例")
+    private int royalties;
+
+    @ApiModelProperty("手续费比例")
+    private int serviceCharge;
+
+    @ApiModelProperty("铸造者")
+//    @Searchable
+    private String minter;
+
+    @ApiModelProperty("铸造者ID")
+    private Long minterId;
+
+    @ApiModelProperty("铸造者头像")
+    private String minterAvatar;
+
+    @ApiModelProperty("持有者")
+//    @Searchable
+    private String owner;
+
+    @ApiModelProperty("持有者ID")
+    private Long ownerId;
+
+    @ApiModelProperty("持有者头像")
+    private String ownerAvatar;
+
+    @ApiModelProperty("图片")
+    @Convert(converter = FileObjectListConverter.class)
+    @Column(columnDefinition = "TEXT")
+    private List<FileObject> pic;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = FileObjectConverter.class)
+    private FileObject model3d;
+
+    @ApiModelProperty("tokenId")
+    private String tokenId;
+
+    @ApiModelProperty("tokenId")
+    private String chainTokenId;
+
+    @ApiModelProperty("购买hash")
+    private String txHash;
+
+    @ApiModelProperty("消耗gas")
+    private BigInteger gasUsed;
+
+    @ApiModelProperty("区块高度")
+    private BigInteger blockNumber;
+
+    @ApiModelProperty("ipfs地址")
+    private String ipfsUrl;
+
+    @ApiModelProperty("购买价格")
+    @Column(precision = 10, scale = 2)
+    private BigDecimal price;
+
+    @ApiModelProperty("转让价格")
+    @Column(precision = 10, scale = 2)
+    private BigDecimal sellPrice;
+
+    @ApiModelProperty("转让hash")
+    private String outTxHash;
+
+    @ApiModelProperty("转让订单ID")
+    private Long outOrderId;
+
+    @ApiModelProperty("状态")
+    @Enumerated(EnumType.STRING)
+    private AssetStatus status;
+
+    @ApiModelProperty("是否公开展示")
+    private boolean publicShow;
+
+    @ApiModelProperty("是否寄售")
+    private boolean consignment;
+
+    private Long publicCollectionId;
+
+    private int likes;
+
+    private Long fromAssetId;
+
+    @ApiModelProperty("交易时间")
+    private LocalDateTime outTime;
+
+    private int projectId;
+
+    @ApiModelProperty("类型")
+    @Enumerated(EnumType.STRING)
+    private CollectionType type;
+
+    @ApiModelProperty("是否是实物")
+    private boolean entity;
+
+    @ApiModelProperty("实物截至时间")
+    private LocalDateTime entityTime;
+
+    public static Asset create(Collection collection, User user) {
+        return Asset.builder()
+                .userId(user.getId())
+                .collectionId(collection.getId())
+                .minter(collection.getMinter())
+                .minterId(collection.getMinterId())
+                .minterAvatar(collection.getMinterAvatar())
+                .name(collection.getName())
+                .detail(collection.getDetail())
+                .pic(collection.getPic())
+                .model3d(collection.getModel3d())
+                .properties(collection.getProperties())
+                .privileges(collection.getPrivileges())
+                .category(collection.getCategory())
+                .canResale(collection.isCanResale())
+                .royalties(collection.getRoyalties())
+                .serviceCharge(collection.getServiceCharge())
+                .price(collection.getPrice())
+                .status(AssetStatus.NORMAL)
+                .owner(user.getNickname())
+                .ownerId(user.getId())
+                .ownerAvatar(user.getAvatar())
+                .projectId(collection.getProjectId())
+                .type(collection.getType())
+                .entity(collection.isEntity())
+                .entityTime(collection.getEntityTime())
+                .build();
+    }
+
+    public static Asset create(BlindBoxItem item, User user) {
+        return Asset.builder()
+                .userId(user.getId())
+                .collectionId(item.getCollectionId())
+                .minter(item.getMinter())
+                .minterId(item.getMinterId())
+                .minterAvatar(item.getMinterAvatar())
+                .name(item.getName())
+                .detail(item.getDetail())
+                .pic(item.getPic())
+                .model3d(item.getModel3d())
+                .properties(item.getProperties())
+                .privileges(item.getPrivileges())
+                .category(item.getCategory())
+                .canResale(item.isCanResale())
+                .royalties(item.getRoyalties())
+                .serviceCharge(item.getServiceCharge())
+                .price(item.getPrice())
+                .status(AssetStatus.NORMAL)
+                .owner(user.getNickname())
+                .ownerId(user.getId())
+                .ownerAvatar(user.getAvatar())
+                .projectId(item.getProjectId())
+                .type(item.getType())
+                .build();
+    }
+}

+ 78 - 0
src/main/java/com/izouma/nineth/domain/AssetPost.java

@@ -0,0 +1,78 @@
+package com.izouma.nineth.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.nineth.annotations.EnumFormat;
+import com.izouma.nineth.converter.EnumExcelConverter;
+import com.izouma.nineth.converter.FileObjectConverter;
+import com.izouma.nineth.converter.FileObjectListConverter;
+import com.izouma.nineth.enums.PostStatus;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Data
+@Entity
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("资产邮寄")
+public class AssetPost extends BaseEntity {
+    @ExcelProperty("用户ID")
+    private Long userId;
+
+    @ExcelIgnore
+    private Long assetId;
+
+    @ExcelProperty("名称")
+    @ApiModelProperty("名称")
+    private String name;
+
+    @ExcelProperty("编号")
+    @ApiModelProperty("编号")
+    private Integer number;
+
+    @ExcelIgnore
+    @ApiModelProperty("图片")
+    @Convert(converter = FileObjectListConverter.class)
+    @Column(columnDefinition = "TEXT")
+    private List<FileObject> pic;
+
+    @ExcelIgnore
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = FileObjectConverter.class)
+    private FileObject model3d;
+
+    @ExcelProperty("收货人")
+    @ApiModelProperty("收货人")
+    private String contactName;
+
+    @ExcelProperty("收货电话")
+    @ApiModelProperty("收货电话")
+    private String contactPhone;
+
+    @ExcelProperty("收货地址")
+    @ApiModelProperty("收货地址")
+    private String address;
+
+    @ExcelProperty("快递公司")
+    @ApiModelProperty("快递")
+    private String courier;
+
+    @ExcelProperty("快递单号")
+    @ApiModelProperty("快递单号")
+    private String courierId;
+
+    @EnumFormat(value = PostStatus.class,
+            fromExcel = {"待发货", "待收货", "已完成", "已取消"},
+            toJavaEnum = {"DELIVERY", "RECEIVE", "FINISH", "CANCELLED"})
+    @ExcelProperty(value = "状态", converter = EnumExcelConverter.class)
+    @Enumerated(EnumType.STRING)
+    private PostStatus status;
+}

+ 83 - 0
src/main/java/com/izouma/nineth/domain/AuditedEntity.java

@@ -0,0 +1,83 @@
+package com.izouma.nineth.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.hibernate.envers.Audited;
+import org.springframework.data.annotation.CreatedBy;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedBy;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.EntityListeners;
+import javax.persistence.MappedSuperclass;
+import java.time.LocalDateTime;
+
+@MappedSuperclass
+@Audited
+@EntityListeners(AuditingEntityListener.class)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public abstract class AuditedEntity {
+
+    @JsonIgnore
+    @CreatedBy
+    private String createdBy;
+
+    @JsonIgnore
+    @CreatedDate
+    private LocalDateTime createdAt;
+
+    @JsonIgnore
+    @LastModifiedBy
+    private String modifiedBy;
+
+    @JsonIgnore
+    @LastModifiedDate
+    private LocalDateTime modifiedAt;
+
+    private boolean del;
+
+    public String getCreatedBy() {
+        return createdBy;
+    }
+
+    public void setCreatedBy(String createdBy) {
+        this.createdBy = createdBy;
+    }
+
+    @JsonProperty("createdAt")
+    public LocalDateTime getCreatedAt() {
+        return createdAt;
+    }
+
+    public void setCreatedAt(LocalDateTime createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public String getModifiedBy() {
+        return modifiedBy;
+    }
+
+    public void setModifiedBy(String modifiedBy) {
+        this.modifiedBy = modifiedBy;
+    }
+
+    public LocalDateTime getModifiedAt() {
+        return modifiedAt;
+    }
+
+    public void setModifiedAt(LocalDateTime modifiedAt) {
+        this.modifiedAt = modifiedAt;
+    }
+
+    public boolean isDel() {
+        return del;
+    }
+
+    public void setDel(boolean del) {
+        this.del = del;
+    }
+}

+ 49 - 0
src/main/java/com/izouma/nineth/domain/AwardActivityCollectionInfo.java

@@ -0,0 +1,49 @@
+package com.izouma.nineth.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+
+/**
+ * 活动收集
+ *
+ * @author ZouYuHong
+ */
+@Getter
+@Setter
+@Entity
+@Builder
+@AllArgsConstructor
+public class AwardActivityCollectionInfo extends BaseEntity {
+    /**
+     *藏品id
+     */
+    private Long collectionId;
+    /**
+     * 名称
+     */
+    private String collectionName;
+    /**
+     * 上架数量
+     */
+    private Integer num;
+    /**
+     * 余量
+     */
+    private Integer stock;
+
+    @Transient
+    private String imgUrl;
+
+    @Column(name ="activity_id", insertable = false, updatable = false)
+    private Long activityId;
+
+    public AwardActivityCollectionInfo() {
+        this.stock = num;
+    }
+}

+ 50 - 0
src/main/java/com/izouma/nineth/domain/Banner.java

@@ -0,0 +1,50 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.enums.BannerType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+
+@Data
+@Entity
+@Table(indexes = {@Index(columnList = "type")})
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("Banner")
+public class Banner extends BaseEntity {
+
+    @ApiModelProperty("名称")
+    @Searchable
+    private String name;
+
+    @ApiModelProperty("图片")
+    private String pic;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("排序")
+    private int sort;
+
+    @ApiModelProperty("展示位置")
+    @Enumerated(EnumType.STRING)
+    private BannerType type;
+
+    @ApiModelProperty("跳转")
+    private boolean link;
+
+    @ApiModelProperty("跳转类型")
+    private String linkType;
+
+    @ApiModelProperty("跳转内容")
+    private String linkContent;
+
+    private int projectId;
+}

+ 100 - 0
src/main/java/com/izouma/nineth/domain/BaseEntity.java

@@ -0,0 +1,100 @@
+package com.izouma.nineth.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.hibernate.envers.Audited;
+import org.springframework.data.annotation.CreatedBy;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedBy;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.*;
+import java.time.LocalDateTime;
+
+@MappedSuperclass
+@Audited
+@EntityListeners(AuditingEntityListener.class)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(value = {"hibernateLazyInitializer"}, ignoreUnknown = true)
+public abstract class BaseEntity {
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private Long id;
+
+    @ExcelIgnore
+    @JsonIgnore
+    @CreatedBy
+    private String createdBy;
+
+    @ExcelProperty("创建时间")
+    @JsonIgnore
+    @CreatedDate
+    private LocalDateTime createdAt;
+
+    @ExcelIgnore
+    @JsonIgnore
+    @LastModifiedBy
+    private String modifiedBy;
+
+    @ExcelIgnore
+    @JsonIgnore
+    @LastModifiedDate
+    private LocalDateTime modifiedAt;
+
+    @ExcelIgnore
+    private boolean del;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCreatedBy() {
+        return createdBy;
+    }
+
+    public void setCreatedBy(String createdBy) {
+        this.createdBy = createdBy;
+    }
+
+    @JsonProperty("createdAt")
+    public LocalDateTime getCreatedAt() {
+        return createdAt;
+    }
+
+    public void setCreatedAt(LocalDateTime createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public String getModifiedBy() {
+        return modifiedBy;
+    }
+
+    public void setModifiedBy(String modifiedBy) {
+        this.modifiedBy = modifiedBy;
+    }
+
+    public LocalDateTime getModifiedAt() {
+        return modifiedAt;
+    }
+
+    public void setModifiedAt(LocalDateTime modifiedAt) {
+        this.modifiedAt = modifiedAt;
+    }
+
+    public boolean isDel() {
+        return del;
+    }
+
+    public void setDel(boolean del) {
+        this.del = del;
+    }
+}

+ 89 - 0
src/main/java/com/izouma/nineth/domain/BaseEntityNoID.java

@@ -0,0 +1,89 @@
+package com.izouma.nineth.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.hibernate.envers.Audited;
+import org.springframework.data.annotation.CreatedBy;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedBy;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.EntityListeners;
+import javax.persistence.MappedSuperclass;
+import java.time.LocalDateTime;
+
+@MappedSuperclass
+@Audited
+@EntityListeners(AuditingEntityListener.class)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(value = {"hibernateLazyInitializer"}, ignoreUnknown = true)
+public abstract class BaseEntityNoID {
+    @ExcelIgnore
+    @JsonIgnore
+    @CreatedBy
+    private String createdBy;
+
+    @ExcelProperty("创建时间")
+    @JsonIgnore
+    @CreatedDate
+    private LocalDateTime createdAt;
+
+    @ExcelIgnore
+    @JsonIgnore
+    @LastModifiedBy
+    private String modifiedBy;
+
+    @ExcelIgnore
+    @JsonIgnore
+    @LastModifiedDate
+    private LocalDateTime modifiedAt;
+
+    @ExcelIgnore
+    private boolean del;
+
+    public String getCreatedBy() {
+        return createdBy;
+    }
+
+    public void setCreatedBy(String createdBy) {
+        this.createdBy = createdBy;
+    }
+
+    @JsonProperty("createdAt")
+    public LocalDateTime getCreatedAt() {
+        return createdAt;
+    }
+
+    public void setCreatedAt(LocalDateTime createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public String getModifiedBy() {
+        return modifiedBy;
+    }
+
+    public void setModifiedBy(String modifiedBy) {
+        this.modifiedBy = modifiedBy;
+    }
+
+    public LocalDateTime getModifiedAt() {
+        return modifiedAt;
+    }
+
+    public void setModifiedAt(LocalDateTime modifiedAt) {
+        this.modifiedAt = modifiedAt;
+    }
+
+    public boolean isDel() {
+        return del;
+    }
+
+    public void setDel(boolean del) {
+        this.del = del;
+    }
+}

+ 106 - 0
src/main/java/com/izouma/nineth/domain/BlindBoxItem.java

@@ -0,0 +1,106 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.converter.FileObjectConverter;
+import com.izouma.nineth.converter.FileObjectListConverter;
+import com.izouma.nineth.converter.PrivilegeListConverter;
+import com.izouma.nineth.converter.PropertyListConverter;
+import com.izouma.nineth.enums.CollectionType;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@Entity
+@Table(indexes = {
+        @Index(columnList = "blindBoxId"),
+        @Index(columnList = "collectionId"),
+        @Index(columnList = "minterId"),
+})
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class BlindBoxItem extends BaseEntity {
+
+    @ApiModelProperty("盲盒ID")
+    private Long blindBoxId;
+
+    private Long collectionId;
+
+    @ApiModelProperty("名称")
+    @Searchable
+    private String name;
+
+    @ApiModelProperty("图片")
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = FileObjectListConverter.class)
+    private List<FileObject> pic;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = FileObjectConverter.class)
+    private FileObject model3d;
+
+    @ApiModelProperty("铸造者")
+    @Searchable
+    private String minter;
+
+    @ApiModelProperty("铸造者ID")
+    private Long minterId;
+
+    @ApiModelProperty("铸造者头像")
+    private String minterAvatar;
+
+    @ApiModelProperty("详情")
+    @Column(columnDefinition = "TEXT")
+    private String detail;
+
+    @ApiModelProperty("已售")
+    private int sale;
+
+    @ApiModelProperty("库存")
+    private int stock;
+
+    @ApiModelProperty("发行数量")
+    private int total;
+
+    @ApiModelProperty("价格")
+    @Column(precision = 10, scale = 2)
+    private BigDecimal price;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = PropertyListConverter.class)
+    @ApiModelProperty("特性")
+    private List<CollectionProperty> properties;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = PrivilegeListConverter.class)
+    @ApiModelProperty("特权")
+    private List<Privilege> privileges;
+
+    @ApiModelProperty("是否可转售")
+    private boolean canResale;
+
+    @ApiModelProperty("版税比例")
+    private int royalties;
+
+    @ApiModelProperty("手续费比例")
+    private int serviceCharge;
+
+    @ApiModelProperty("分类")
+    private String category;
+
+    @ApiModelProperty("稀有")
+    private boolean rare;
+
+    private int projectId;
+
+    @ApiModelProperty("类型")
+    @Enumerated(EnumType.STRING)
+    private CollectionType type;
+}

+ 153 - 0
src/main/java/com/izouma/nineth/domain/Collection.java

@@ -0,0 +1,153 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.converter.FileObjectConverter;
+import com.izouma.nineth.converter.FileObjectListConverter;
+import com.izouma.nineth.converter.PrivilegeListConverter;
+import com.izouma.nineth.converter.PropertyListConverter;
+import com.izouma.nineth.enums.CollectionSource;
+import com.izouma.nineth.enums.CollectionType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.Formula;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@Entity
+@Table(name = "collection_info", indexes = {
+        @Index(columnList = "type,source"),
+        @Index(columnList = "minterId"),
+        @Index(columnList = "onShelf"),
+        @Index(columnList = "ownerId"),
+        @Index(columnList = "assetId")
+})
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("藏品")
+public class Collection extends BaseEntity {
+
+    @ApiModelProperty("名称")
+    @Searchable
+    private String name;
+
+    @ApiModelProperty("图片")
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = FileObjectListConverter.class)
+    private List<FileObject> pic;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = FileObjectConverter.class)
+    private FileObject model3d;
+
+    @ApiModelProperty("铸造者")
+    @Searchable
+    private String minter;
+
+    @ApiModelProperty("铸造者ID")
+    private Long minterId;
+
+    @ApiModelProperty("铸造者头像")
+    private String minterAvatar;
+
+    @ApiModelProperty("拥有者")
+//    @Searchable
+    private String owner;
+
+    @ApiModelProperty("拥有者ID")
+    private Long ownerId;
+
+    @ApiModelProperty("拥有者头像")
+    private String ownerAvatar;
+
+    @ApiModelProperty("详情")
+    @Column(columnDefinition = "TEXT")
+    private String detail;
+
+    @ApiModelProperty("类型")
+    @Enumerated(EnumType.STRING)
+    private CollectionType type;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = PropertyListConverter.class)
+    @ApiModelProperty("特性")
+    private List<CollectionProperty> properties;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = PrivilegeListConverter.class)
+    @ApiModelProperty("特权")
+    private List<Privilege> privileges;
+
+    @ApiModelProperty("编号")
+    private Integer number;
+
+    @ApiModelProperty("是否可转售")
+    private boolean canResale;
+
+    @ApiModelProperty("版税比例")
+    private int royalties;
+
+    @ApiModelProperty("手续费比例")
+    private int serviceCharge;
+
+    @ApiModelProperty("分类")
+    private String category;
+
+    @ApiModelProperty("来源")
+    @Enumerated(EnumType.STRING)
+    private CollectionSource source;
+
+    @ApiModelProperty("已售")
+    private int sale;
+
+    @ApiModelProperty("库存")
+    private int stock;
+
+    @ApiModelProperty("发行数量")
+    private int total;
+
+    @ApiModelProperty("点赞")
+    private int likes;
+
+    @ApiModelProperty("上架")
+    private boolean onShelf;
+
+    @ApiModelProperty("可售")
+    private boolean salable;
+
+    @ApiModelProperty("价格")
+    @Column(precision = 10, scale = 2)
+    private BigDecimal price;
+
+    @ApiModelProperty("盲盒开售时间")
+    private LocalDateTime startTime;
+
+    private boolean scheduleSale;
+
+    private int sort;
+
+    private Long assetId;
+
+    private BigDecimal originalPrice;
+
+    private Integer currentNumber;
+
+    @Formula(value = "if(stock = 0, 1, 0)")
+    private int soldOut;
+
+    @ApiModelProperty("是否是实物")
+    private boolean entity;
+
+    @ApiModelProperty("实物截至时间")
+    private LocalDateTime entityTime;
+
+    private int projectId;
+}

+ 36 - 0
src/main/java/com/izouma/nineth/domain/CollectionNumber.java

@@ -0,0 +1,36 @@
+package com.izouma.nineth.domain;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("藏品编号")
+public class CollectionNumber {
+
+    private Long collectionId;
+
+    private String number;
+
+    private int sort;
+
+    private Long ownerId;
+
+    private Long assetId;
+
+    private boolean onShelf;
+
+    private boolean salable;
+
+    private BigDecimal price;
+
+
+}

+ 11 - 0
src/main/java/com/izouma/nineth/domain/CollectionProperty.java

@@ -0,0 +1,11 @@
+package com.izouma.nineth.domain;
+
+import lombok.Data;
+
+@Data
+public class CollectionProperty {
+
+    private String name;
+
+    private String value;
+}

+ 45 - 0
src/main/java/com/izouma/nineth/domain/CommissionRecord.java

@@ -0,0 +1,45 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.annotations.Searchable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import java.math.BigDecimal;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("分销记录")
+public class CommissionRecord extends BaseEntity {
+    @ApiModelProperty("用户ID")
+    @Searchable
+    private Long userId;
+
+    @ApiModelProperty("用户名")
+    @Searchable
+    private String nickname;
+
+    @ApiModelProperty("手机")
+    @Searchable
+    private String phone;
+
+    @ApiModelProperty("订单ID")
+    @Searchable
+    private Long orderId;
+
+    @ApiModelProperty("订单总价")
+    private BigDecimal totalPrice;
+
+    @ApiModelProperty("分成比例")
+    private BigDecimal shareRatio;
+
+    @ApiModelProperty("分成金额")
+    private BigDecimal shareAmount;
+}

+ 51 - 0
src/main/java/com/izouma/nineth/domain/Coupon.java

@@ -0,0 +1,51 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.converter.LongArrayConverter;
+import com.izouma.nineth.dto.GeneralDTO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Convert;
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("兑换券")
+public class Coupon extends BaseEntity {
+
+    @ApiModelProperty("名称")
+    @Searchable
+    private String name;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("指定藏品")
+    private boolean limited;
+
+    @ApiModelProperty("需要支付GAS")
+    private boolean needGas;
+
+    @Convert(converter = LongArrayConverter.class)
+    @Column(columnDefinition = "TEXT")
+    private List<Long> collectionIds;
+
+    private LocalDateTime expiration;
+
+    private int projectId;
+
+    @Transient
+    private List<GeneralDTO> collections;
+}

+ 49 - 0
src/main/java/com/izouma/nineth/domain/District.java

@@ -0,0 +1,49 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.enums.DistrictLevel;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("行政区域")
+public class District extends AuditedEntity {
+    @Id
+    private Long id;
+
+    @Column(length = 10)
+    private String cityCode;
+
+    @Searchable
+    private String name;
+
+    private double lat;
+
+    private double lng;
+
+    @Column(length = 20)
+    @Enumerated(EnumType.STRING)
+    private DistrictLevel level;
+
+    private Long parent;
+
+    private int childCount;
+
+    private int cityCount;
+
+    private int districtCount;
+
+    private int streetCount;
+
+    @Transient
+    private Boolean leaf;
+}

+ 62 - 0
src/main/java/com/izouma/nineth/domain/DivMoney.java

@@ -0,0 +1,62 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.enums.DivStatus;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+
+@Data
+@Entity
+@Table(name = "div_money", indexes = {
+        @Index(columnList = "userId"),
+        @Index(columnList = "orderId"),
+})
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("分账记录")
+public class DivMoney extends BaseEntity{
+
+    @Column(nullable = false)
+    @ApiModelProperty("订单ID")
+    private Long orderId;
+
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    /**
+     * 支付平台关联标识
+     */
+    @ApiModelProperty("会员ID")
+    private String memberId;
+
+
+    @ApiModelProperty("分账总金额")
+    @Column(precision = 10, scale = 2)
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty("分账金额")
+    @Column(precision = 10, scale = 2)
+    private BigDecimal amount;
+
+    @ApiModelProperty("分账比例")
+    private Integer ratio;
+
+    @ApiModelProperty("剩余金额")
+    @Column(precision = 10, scale = 2)
+    private BigDecimal restAmount;
+
+    @ApiModelProperty("是否承担手续费")
+    private boolean feeFlag;
+
+    @ApiModelProperty("状态")
+    @Enumerated(EnumType.STRING)
+    private DivStatus status;
+
+}

+ 26 - 0
src/main/java/com/izouma/nineth/domain/ErrorOrder.java

@@ -0,0 +1,26 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.enums.PayMethod;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class ErrorOrder extends BaseEntity {
+    private Long orderId;
+
+    private String errorMessage;
+
+    private String transactionId;
+
+    private PayMethod payMethod;
+
+    private String type;
+}

+ 71 - 0
src/main/java/com/izouma/nineth/domain/ExceptionLog.java

@@ -0,0 +1,71 @@
+package com.izouma.nineth.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.time.LocalDateTime;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(value = {"hibernateLazyInitializer"}, ignoreUnknown = true)
+@ApiModel("异常日志")
+public class ExceptionLog {
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("异常名称")
+    private String name;
+
+    @ApiModelProperty("操作类型")
+    private String type;
+
+    @ApiModelProperty("用户ID")
+    private String userId;
+
+    @ApiModelProperty("用户名")
+    private String username;
+
+    @ApiModelProperty("描述")
+    @Column(name = "description")
+    private String desc;
+
+    @ApiModelProperty("调用方法")
+    private String reqMethod;
+
+    @ApiModelProperty("请求地址")
+    private String reqUrl;
+
+    @ApiModelProperty("请求参数")
+    @Lob
+    private String reqParams;
+
+    @ApiModelProperty("请求ip")
+    private String reqIp;
+
+    @ApiModelProperty("返回结果")
+    @Lob
+    private String resp;
+
+    @ApiModelProperty("操作时间")
+    private LocalDateTime time;
+
+    @ApiModelProperty("异常消息")
+    @Lob
+    private String message;
+
+    @ApiModelProperty("错误追踪")
+    @Lob
+    private String stackTrace;
+}

+ 18 - 0
src/main/java/com/izouma/nineth/domain/FileObject.java

@@ -0,0 +1,18 @@
+package com.izouma.nineth.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class FileObject {
+    String name;
+
+    String url;
+
+    String thumb;
+
+    String type;
+}

+ 22 - 0
src/main/java/com/izouma/nineth/domain/Follow.java

@@ -0,0 +1,22 @@
+package com.izouma.nineth.domain;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("关注")
+public class Follow extends BaseEntity {
+
+    Long userId;
+
+    Long followUserId;
+}

+ 66 - 0
src/main/java/com/izouma/nineth/domain/GiftOrder.java

@@ -0,0 +1,66 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.enums.OrderStatus;
+import com.izouma.nineth.enums.PayMethod;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.time.LocalDateTime;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class GiftOrder extends BaseEntity {
+    private Long userId;
+
+    private Long assetId;
+
+    private Long collectionId;
+
+    private String name;
+
+    private Long toUserId;
+
+    @Enumerated(EnumType.STRING)
+    private PayMethod payMethod;
+
+    private OrderStatus status;
+
+    @Column(precision = 10, scale = 2)
+    private BigDecimal gasPrice;
+
+    @ApiModelProperty("交易ID")
+    @Searchable
+    private String transactionId;
+
+    @ApiModelProperty("支付时间")
+    private LocalDateTime payTime;
+
+    @ApiModelProperty("取消时间")
+    private LocalDateTime cancelTime;
+
+    @ApiModelProperty("交易hash")
+    private String txHash;
+
+    private BigInteger gasUsed;
+
+    @ApiModelProperty("区块高度")
+    private BigInteger blockNumber;
+
+    private int projectId;
+
+    @ApiModelProperty("订单编号")
+    private String orderNo;
+}

+ 52 - 0
src/main/java/com/izouma/nineth/domain/IdentityAuth.java

@@ -0,0 +1,52 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.enums.AuthStatus;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("身份认证")
+public class IdentityAuth extends BaseEntity {
+
+    @Searchable
+    private Long userId;
+
+    @Searchable
+    private String realName;
+
+    private String phone;
+
+    private String email;
+
+    private String idNo;
+
+    private String idFront;
+
+    private String idBack;
+
+    private boolean org;
+
+    private String orgName;
+
+    private String orgNo;
+
+    private String orgLicense;
+
+    private String orgLicenseExpire;
+
+    @Enumerated(EnumType.STRING)
+    private AuthStatus status;
+
+}

+ 30 - 0
src/main/java/com/izouma/nineth/domain/Invite.java

@@ -0,0 +1,30 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.annotations.Searchable;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class Invite extends BaseEntity {
+    @Searchable
+    private String name;
+
+    @Searchable
+    private String phone;
+
+    @Searchable
+    private String code;
+
+    @Searchable
+    private String remark;
+
+    private int inviteNum;
+}

+ 60 - 0
src/main/java/com/izouma/nineth/domain/InviteDate.java

@@ -0,0 +1,60 @@
+package com.izouma.nineth.domain;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.nineth.annotations.Searchable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Index;
+import javax.persistence.Table;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+@Table(name = "invite_date", indexes = {
+        @Index(columnList = "activityId"),
+        @Index(columnList = "inviterUserId")
+})
+@ApiModel("邀请数据")
+public class InviteDate extends BaseEntity{
+    @ApiModelProperty("活动名称")
+    @Searchable
+    private String name;
+
+    @ApiModelProperty("活动ID")
+    @ExcelProperty("活动ID")
+    private Long activityId;
+
+    @ApiModelProperty("邀请者")
+    @ExcelProperty("邀请者")
+    private Long inviterUserId;
+
+    @ApiModelProperty("邀请者电话")
+    @ExcelProperty("邀请者电话")
+    private String inviterPhone;
+
+    @ApiModelProperty("被邀请者用户ID")
+    @ExcelProperty("被邀请者用户ID")
+    private Long inviteeUserId;
+
+    @ApiModelProperty("空投奖励数量")
+    @ExcelProperty("空投奖励数量")
+    private int airDropAward;
+
+    @ApiModelProperty("邀请状态")
+    @ExcelProperty("邀请状态")
+    private int status;
+
+    @ApiModelProperty("备注")
+    @ExcelProperty("备注")
+    private String remark;
+
+}

+ 21 - 0
src/main/java/com/izouma/nineth/domain/InvitePrize.java

@@ -0,0 +1,21 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.enums.AirDropType;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+
+@Data
+public class InvitePrize {
+
+    @Enumerated(EnumType.STRING)
+    private AirDropType type ;
+
+    @ApiModelProperty("(奖品)藏品/惊喜盒子ID")
+    private Long inviteCollection;
+
+    @ApiModelProperty("邀请人数")
+    private int inviteNum ;
+}

+ 27 - 0
src/main/java/com/izouma/nineth/domain/Like.java

@@ -0,0 +1,27 @@
+package com.izouma.nineth.domain;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.Index;
+import javax.persistence.Table;
+
+@Data
+@Entity
+@Table(name = "like_info", indexes =
+        {@Index(columnList = "userId"), @Index(columnList = "collectionId")})
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("点赞")
+public class Like extends BaseEntity {
+
+    private Long userId;
+
+    private Long collectionId;
+
+}

+ 33 - 0
src/main/java/com/izouma/nineth/domain/MailRecord.java

@@ -0,0 +1,33 @@
+package com.izouma.nineth.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import java.time.LocalDateTime;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("邮件记录")
+public class MailRecord extends BaseEntity {
+    @ApiModelProperty(value = "会话ID", name = "sessionId")
+    private String        sessionId;
+    @ApiModelProperty(value = "邮箱号", name = "phone;")
+    private String        mail;
+    @ApiModelProperty(value = "验证码", name = "code")
+    private String        code;
+    @ApiModelProperty(value = "过期时间", name = "expiresAt")
+    private LocalDateTime expiresAt;
+    @ApiModelProperty(value = "是否过期", name = "expired")
+    private Boolean       expired;
+    @ApiModelProperty(value = "验证码用途", name = "scope")
+    private String        scope;
+}

+ 71 - 0
src/main/java/com/izouma/nineth/domain/Menu.java

@@ -0,0 +1,71 @@
+package com.izouma.nineth.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.izouma.nineth.dto.MenuDTO;
+import com.izouma.nineth.security.Authority;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.Where;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+@Data
+@Entity
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@Where(clause = "active = 1")
+public class Menu extends BaseEntity implements Serializable {
+    private String name;
+
+    private String path;
+
+    private String icon;
+
+    private Integer sort;
+
+    private Long parent;
+
+    private Boolean root;
+
+    private Boolean enabled;
+
+    private Boolean active;
+
+    private String category;
+
+    @OneToMany
+    @JoinColumn(name = "parent", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+    List<Menu> children;
+
+    @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.DETACH})
+    @JoinTable(
+            name = "menu_authority",
+            joinColumns = {@JoinColumn(name = "menu_id", referencedColumnName = "id")},
+            inverseJoinColumns = {@JoinColumn(name = "authority", referencedColumnName = "name")})
+    @ExcelIgnore
+    private Set<Authority> authorities = new HashSet<>();
+
+    public static Menu from(MenuDTO menuDTO) {
+        Menu menu = Menu.builder()
+                .name(menuDTO.getName())
+                .path(menuDTO.getPath())
+                .icon(menuDTO.getIcon())
+                .sort(menuDTO.getSort())
+                .parent(menuDTO.getParent())
+                .root(menuDTO.getRoot())
+                .enabled(menuDTO.getEnabled())
+                .active(menuDTO.getActive())
+                .category(menuDTO.getCategory())
+                .children(null)
+                .build();
+        menu.setId(menuDTO.getId());
+        return menu;
+    }
+}

+ 63 - 0
src/main/java/com/izouma/nineth/domain/OperationLog.java

@@ -0,0 +1,63 @@
+package com.izouma.nineth.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.time.LocalDateTime;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(value = {"hibernateLazyInitializer"}, ignoreUnknown = true)
+@ApiModel("操作日志")
+public class OperationLog {
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("操作名称")
+    private String name;
+
+    @ApiModelProperty("操作类型")
+    private String type;
+
+    @ApiModelProperty("用户ID")
+    private String userId;
+
+    @ApiModelProperty("用户名")
+    private String username;
+
+    @ApiModelProperty("描述")
+    @Column(name = "description")
+    private String desc;
+
+    @ApiModelProperty("调用方法")
+    private String reqMethod;
+
+    @ApiModelProperty("请求地址")
+    private String reqUrl;
+
+    @ApiModelProperty("请求参数")
+    @Lob
+    private String reqParams;
+
+    @ApiModelProperty("请求ip")
+    private String reqIp;
+
+    @ApiModelProperty("返回结果")
+    @Lob
+    private String resp;
+
+    @ApiModelProperty("操作时间")
+    private LocalDateTime time;
+}

+ 174 - 0
src/main/java/com/izouma/nineth/domain/Order.java

@@ -0,0 +1,174 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.converter.FileObjectListConverter;
+import com.izouma.nineth.converter.PrivilegeListConverter;
+import com.izouma.nineth.converter.PropertyListConverter;
+import com.izouma.nineth.enums.CollectionSource;
+import com.izouma.nineth.enums.CollectionType;
+import com.izouma.nineth.enums.OrderStatus;
+import com.izouma.nineth.enums.PayMethod;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@Entity
+@Table(name = "order_info", indexes = {
+        @Index(columnList = "userId"),
+        @Index(columnList = "status"),
+        @Index(columnList = "assetId"),
+        @Index(columnList = "collectionId"),
+        @Index(columnList = "transactionId"),
+        @Index(columnList = "minterId"),
+})
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("订单")
+public class Order extends BaseEntityNoID {
+
+    @Id
+    private Long id;
+
+    @ApiModelProperty("用户ID")
+    @Searchable
+    private Long userId;
+
+    @ApiModelProperty("藏品ID")
+    @Searchable
+    private Long collectionId;
+
+    @ApiModelProperty("数量")
+    private int qty;
+
+    @ApiModelProperty("名称")
+    @Searchable
+    private String name;
+
+    @ApiModelProperty("图片")
+    @Convert(converter = FileObjectListConverter.class)
+    @Column(columnDefinition = "TEXT")
+    private List<FileObject> pic;
+
+    @ApiModelProperty("详情")
+    @Column(columnDefinition = "TEXT")
+    private String detail;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = PropertyListConverter.class)
+    @ApiModelProperty("特性")
+    private List<CollectionProperty> properties;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = PrivilegeListConverter.class)
+    @ApiModelProperty("特权")
+    private List<Privilege> privileges;
+
+    @ApiModelProperty("分类")
+    private String category;
+
+    @ApiModelProperty("是否可转售")
+    private boolean canResale;
+
+    @ApiModelProperty("版税比例")
+    private int royalties;
+
+    @ApiModelProperty("手续费比例")
+    private int serviceCharge;
+
+    @ApiModelProperty("类型")
+    @Enumerated(EnumType.STRING)
+    private CollectionType type;
+
+    @ApiModelProperty("来源")
+    @Enumerated(EnumType.STRING)
+    private CollectionSource source;
+
+    @ApiModelProperty("铸造者")
+    @Searchable
+    private String minter;
+
+    @ApiModelProperty("铸造者ID")
+    @Searchable
+    private Long minterId;
+
+    @ApiModelProperty("铸造者头像")
+    private String minterAvatar;
+
+    @ApiModelProperty("价格")
+    @Column(precision = 10, scale = 2)
+    private BigDecimal price;
+
+    @ApiModelProperty("gas费")
+    @Column(precision = 10, scale = 2)
+    private BigDecimal gasPrice;
+
+    @ApiModelProperty("总价")
+    @Column(precision = 10, scale = 2)
+    private BigDecimal totalPrice;
+
+    @ApiModelProperty("状态")
+    @Enumerated(EnumType.STRING)
+    private OrderStatus status;
+
+    @ApiModelProperty("支付方式")
+    @Enumerated(EnumType.STRING)
+    private PayMethod payMethod;
+
+    @ApiModelProperty("交易ID")
+    @Searchable
+    private String transactionId;
+
+    @ApiModelProperty("支付时间")
+    private LocalDateTime payTime;
+
+    @ApiModelProperty("取消时间")
+    private LocalDateTime cancelTime;
+
+    @ApiModelProperty("交易hash")
+    private String txHash;
+
+    @ApiModelProperty("消耗gas")
+    private BigInteger gasUsed;
+
+    @ApiModelProperty("区块高度")
+    private BigInteger blockNumber;
+
+    @ApiModelProperty("收货人")
+    private String contactName;
+
+    @ApiModelProperty("收货电话")
+    private String contactPhone;
+
+    @ApiModelProperty("收货地址")
+    private String address;
+
+    private Long winCollectionId;
+
+    private Long assetId;
+
+    private boolean hide;
+
+    private Long couponId;
+
+    private Long invitor;
+
+    private boolean opened;
+
+    private int projectId;
+
+    @ApiModelProperty("订单编号")
+    @Searchable
+    private String orderNo;
+
+}

+ 99 - 0
src/main/java/com/izouma/nineth/domain/PaymentInfo.java

@@ -0,0 +1,99 @@
+package com.izouma.nineth.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.enums.OrderStatus;
+import com.izouma.nineth.enums.PayMethod;
+import com.izouma.nineth.enums.PayStatus;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Entity
+@Table(indexes={
+        @Index(columnList="orderId"),
+        @Index(columnList="giftOrderId"),
+        @Index(columnList="orderNo", unique = true),
+
+})
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("支付记录")
+public class PaymentInfo extends BaseEntity{
+
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    @ApiModelProperty("订单ID")
+    private Long orderId;
+
+    @ApiModelProperty("转赠订单ID")
+    private Long giftOrderId;
+
+    @ApiModelProperty("订单编号")
+    @Searchable
+    private String orderNo;
+
+
+    @ApiModelProperty("支付方式")
+    @Enumerated(EnumType.STRING)
+    private PayMethod payMethod;
+
+    @ApiModelProperty("支付渠道")
+    private String payChannel;
+
+    @ApiModelProperty("状态")
+    @Enumerated(EnumType.STRING)
+    private PayStatus status;
+
+    @ApiModelProperty("支付金额")
+    private String payAmt;
+
+    @ApiModelProperty("商户名称")
+    private String merchantName;
+
+    @ApiModelProperty("商品标题")
+    private String goodsTitle;
+
+    @ApiModelProperty("支付失效时间")
+    private String timeExpire;
+
+    @JsonIgnore
+    @ApiModelProperty("通知地址")
+    @Column(length = 500)
+    private String notifyUrl;
+
+    @ApiModelProperty("通知时间")
+    private LocalDateTime notifyTime;
+
+    @ApiModelProperty("交易ID")
+    @Searchable
+    private String transactionId;
+
+    @ApiModelProperty("支付平台")
+    private String payPlatform;
+
+
+    /**
+     * 记录退款流水
+     */
+    @ApiModelProperty("退款流水")
+    private String refundNo;
+
+    @ApiModelProperty("退款时间")
+    private LocalDateTime refundTime;
+
+
+
+
+
+}

+ 63 - 0
src/main/java/com/izouma/nineth/domain/Privilege.java

@@ -0,0 +1,63 @@
+package com.izouma.nineth.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(value = {"hibernateLazyInitializer"}, ignoreUnknown = true)
+public class Privilege {
+    private Long id;
+
+    @ApiModelProperty("特权名称")
+    private String name;
+
+    @ApiModelProperty("特权描述")
+    private String description;
+
+    @ApiModelProperty("简介说明")
+    private String remark;
+
+    @ApiModelProperty("详情")
+    private String detail;
+
+    @ApiModelProperty("类型")
+    private String type;
+
+    private String anywhereType;
+
+    @ApiModelProperty("图标")
+    private List<String> icon;
+
+    @ApiModelProperty("已开启")
+    private boolean opened;
+
+    @ApiModelProperty("开启时间")
+    private LocalDateTime openTime;
+
+    @ApiModelProperty("只能打开一次")
+    private boolean once;
+
+    @ApiModelProperty("每次交易刷新")
+    private boolean refreshOnTransfer;
+
+    @ApiModelProperty("结束时间")
+    private LocalDateTime endTime;
+
+    private Long openedBy;
+
+    @ApiModelProperty("惊喜盒子空盒子数量")
+    private int circulation ;
+
+    @ApiModelProperty("惊喜盒子盲盒ID")
+    private Long mysteryBoxID ;
+}

+ 33 - 0
src/main/java/com/izouma/nineth/domain/PrivilegeOption.java

@@ -0,0 +1,33 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.converter.StringArrayConverter;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Convert;
+import javax.persistence.Entity;
+import java.util.List;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+public class PrivilegeOption extends BaseEntity {
+
+    private String name;
+
+    private String description;
+
+    private String type;
+
+    @Convert(converter = StringArrayConverter.class)
+    @Column(columnDefinition = "TEXT")
+    private List<String> icon;
+
+    private boolean once;
+
+    private boolean refreshOnTransfer;
+
+}

+ 33 - 0
src/main/java/com/izouma/nineth/domain/Recommend.java

@@ -0,0 +1,33 @@
+package com.izouma.nineth.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class Recommend extends BaseEntity {
+
+    @ApiModelProperty("藏品ID")
+    private Long collectionId;
+
+    @ApiModelProperty("名称")
+    private String name;
+
+    @ApiModelProperty("排序")
+    private int sort;
+
+    @ApiModelProperty("类型")
+    private String type;
+
+    private String pic;
+
+    private int projectId;
+}

+ 4 - 0
src/main/java/com/izouma/nineth/domain/SSOToken.java

@@ -0,0 +1,4 @@
+package com.izouma.nineth.domain;
+
+public class SSOToken {
+}

+ 38 - 0
src/main/java/com/izouma/nineth/domain/SmsRecord.java

@@ -0,0 +1,38 @@
+package com.izouma.nineth.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.Index;
+import javax.persistence.Table;
+import java.time.LocalDateTime;
+
+@Data
+@Entity
+@Table(indexes = {
+        @Index(columnList = "phone"),
+        @Index(columnList = "expiresAt")
+})
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "短信验证码记录", description = "短信验证码记录")
+public class SmsRecord extends BaseEntity {
+    @ApiModelProperty(value = "会话ID", name = "sessionId")
+    private String        sessionId;
+    @ApiModelProperty(value = "手机号", name = "phone;")
+    private String        phone;
+    @ApiModelProperty(value = "验证码", name = "code")
+    private String        code;
+    @ApiModelProperty(value = "过期时间", name = "expiresAt")
+    private LocalDateTime expiresAt;
+    @ApiModelProperty(value = "是否过期", name = "expired")
+    private Boolean       expired;
+    @ApiModelProperty(value = "验证码用途", name = "scope")
+    private String        scope;
+}

+ 57 - 0
src/main/java/com/izouma/nineth/domain/SuperUser.java

@@ -0,0 +1,57 @@
+package com.izouma.nineth.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.config.Constants;
+import com.izouma.nineth.security.Authority;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.BatchSize;
+import org.hibernate.annotations.Where;
+
+import javax.persistence.*;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+import java.util.HashSet;
+import java.util.Set;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Where(clause = "enabled = 1")
+@ApiModel(value = "超级用户", description = "超级用户")
+public class SuperUser extends BaseEntity {
+
+    @Pattern(regexp = Constants.Regex.USERNAME)
+    @Size(min = 1, max = 50)
+    @Column(nullable = false, unique = true)
+    @Searchable
+    private String username;
+
+    @Searchable
+    private String nickname;
+
+    private String avatar;
+
+    @JsonIgnore
+    private String password;
+
+    @Searchable
+    private String phone;
+
+    @Column(nullable = false)
+    private Boolean enabled = true;
+
+    @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
+    @JoinTable(
+            name = "super_user_authority",
+            joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
+            inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "name")})
+    @BatchSize(size = 20)
+    @ExcelIgnore
+    private Set<Authority> authorities = new HashSet<>();
+}

+ 27 - 0
src/main/java/com/izouma/nineth/domain/SurpriseBoxContent.java

@@ -0,0 +1,27 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.annotations.Searchable;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.persistence.Column;
+
+@Data
+public class SurpriseBoxContent {
+    @ApiModelProperty("奖励类型(0藏品/盲盒(自动发放),1手动发放(实物/藏品/盲盒),2空盒子)")
+    private Integer type ;
+
+    @ApiModelProperty("藏品ID/盲和ID(藏品类型才有)")
+    @Searchable
+    private Long collectionId;
+
+    @ApiModelProperty("发行数量")
+    private Integer count ;
+
+    @ApiModelProperty("库存")
+    private Integer stock ;
+
+    @Column(columnDefinition = "TEXT")
+    @ApiModelProperty("图片")
+    private String picUrl;
+}

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini