xiongzhu 2 سال پیش
کامیت
20e89159e7
100فایلهای تغییر یافته به همراه5570 افزوده شده و 0 حذف شده
  1. 37 0
      .gitignore
  2. 114 0
      .mvn/wrapper/MavenWrapperDownloader.java
  3. BIN
      .mvn/wrapper/maven-wrapper.jar
  4. 1 0
      .mvn/wrapper/maven-wrapper.properties
  5. 7 0
      build.sh
  6. 8 0
      install-jar.sh
  7. 286 0
      mvnw
  8. 161 0
      mvnw.cmd
  9. 379 0
      pom.xml
  10. 22 0
      src/main/java/com/izouma/awesomeAdmin/Application.java
  11. 25 0
      src/main/java/com/izouma/awesomeAdmin/annotations/RedisLock.java
  12. 12 0
      src/main/java/com/izouma/awesomeAdmin/annotations/Searchable.java
  13. 89 0
      src/main/java/com/izouma/awesomeAdmin/aspect/RedisLockAspect.java
  14. 42 0
      src/main/java/com/izouma/awesomeAdmin/config/AWSConfig.java
  15. 15 0
      src/main/java/com/izouma/awesomeAdmin/config/AWSProperties.java
  16. 21 0
      src/main/java/com/izouma/awesomeAdmin/config/AlipayConfig.java
  17. 15 0
      src/main/java/com/izouma/awesomeAdmin/config/AlipayISVProperties.java
  18. 14 0
      src/main/java/com/izouma/awesomeAdmin/config/AlipayProperties.java
  19. 126 0
      src/main/java/com/izouma/awesomeAdmin/config/CacheConfig.java
  20. 12 0
      src/main/java/com/izouma/awesomeAdmin/config/CloudPayProperties.java
  21. 88 0
      src/main/java/com/izouma/awesomeAdmin/config/Constants.java
  22. 148 0
      src/main/java/com/izouma/awesomeAdmin/config/DateConfig.java
  23. 20 0
      src/main/java/com/izouma/awesomeAdmin/config/ErrorPageConfig.java
  24. 10 0
      src/main/java/com/izouma/awesomeAdmin/config/GeneralProperties.java
  25. 13 0
      src/main/java/com/izouma/awesomeAdmin/config/GeneralPropertiesConfig.java
  26. 21 0
      src/main/java/com/izouma/awesomeAdmin/config/GlobalPayProperties.java
  27. 36 0
      src/main/java/com/izouma/awesomeAdmin/config/LocalDateTimeSerializerConfig.java
  28. 14 0
      src/main/java/com/izouma/awesomeAdmin/config/LuckPayProperties.java
  29. 32 0
      src/main/java/com/izouma/awesomeAdmin/config/PageDeserializer.java
  30. 200 0
      src/main/java/com/izouma/awesomeAdmin/config/PageJacksonModule.java
  31. 19 0
      src/main/java/com/izouma/awesomeAdmin/config/SchedulingConfig.java
  32. 38 0
      src/main/java/com/izouma/awesomeAdmin/config/SortJacksonModule.java
  33. 84 0
      src/main/java/com/izouma/awesomeAdmin/config/SortJsonComponent.java
  34. 24 0
      src/main/java/com/izouma/awesomeAdmin/config/SpringSecurityAuditorAware.java
  35. 108 0
      src/main/java/com/izouma/awesomeAdmin/config/WebMvcConfig.java
  36. 30 0
      src/main/java/com/izouma/awesomeAdmin/config/WxMaConfig.java
  37. 14 0
      src/main/java/com/izouma/awesomeAdmin/config/WxMaProperties.java
  38. 74 0
      src/main/java/com/izouma/awesomeAdmin/config/WxMpConfig.java
  39. 13 0
      src/main/java/com/izouma/awesomeAdmin/config/WxMpProperties.java
  40. 46 0
      src/main/java/com/izouma/awesomeAdmin/config/WxPayConfig.java
  41. 98 0
      src/main/java/com/izouma/awesomeAdmin/config/WxPayProperties.java
  42. 25 0
      src/main/java/com/izouma/awesomeAdmin/converter/DurationConverter.java
  43. 30 0
      src/main/java/com/izouma/awesomeAdmin/converter/JSONObjectConverter.java
  44. 26 0
      src/main/java/com/izouma/awesomeAdmin/converter/LongArrayConverter.java
  45. 25 0
      src/main/java/com/izouma/awesomeAdmin/converter/StringArrayConverter.java
  46. 24 0
      src/main/java/com/izouma/awesomeAdmin/converter/StringToMapConverter.java
  47. 40 0
      src/main/java/com/izouma/awesomeAdmin/converter/UserAuthoritySerializer.java
  48. 11 0
      src/main/java/com/izouma/awesomeAdmin/dao/RankInvite.java
  49. 45 0
      src/main/java/com/izouma/awesomeAdmin/domain/Address.java
  50. 24 0
      src/main/java/com/izouma/awesomeAdmin/domain/Article.java
  51. 73 0
      src/main/java/com/izouma/awesomeAdmin/domain/AuditedEntity.java
  52. 42 0
      src/main/java/com/izouma/awesomeAdmin/domain/BalanceRecord.java
  53. 33 0
      src/main/java/com/izouma/awesomeAdmin/domain/Banner.java
  54. 84 0
      src/main/java/com/izouma/awesomeAdmin/domain/BaseEntity.java
  55. 90 0
      src/main/java/com/izouma/awesomeAdmin/domain/BaseEntityNoID.java
  56. 38 0
      src/main/java/com/izouma/awesomeAdmin/domain/Bonus.java
  57. 54 0
      src/main/java/com/izouma/awesomeAdmin/domain/Category.java
  58. 41 0
      src/main/java/com/izouma/awesomeAdmin/domain/CommissionRecord.java
  59. 35 0
      src/main/java/com/izouma/awesomeAdmin/domain/CommissionStat.java
  60. 103 0
      src/main/java/com/izouma/awesomeAdmin/domain/Delegation.java
  61. 64 0
      src/main/java/com/izouma/awesomeAdmin/domain/DemoProduct.java
  62. 46 0
      src/main/java/com/izouma/awesomeAdmin/domain/FinanceOrder.java
  63. 38 0
      src/main/java/com/izouma/awesomeAdmin/domain/FinanceProduct.java
  64. 48 0
      src/main/java/com/izouma/awesomeAdmin/domain/JuniorContribution.java
  65. 33 0
      src/main/java/com/izouma/awesomeAdmin/domain/Menu.java
  66. 139 0
      src/main/java/com/izouma/awesomeAdmin/domain/Order.java
  67. 40 0
      src/main/java/com/izouma/awesomeAdmin/domain/OrderRate.java
  68. 111 0
      src/main/java/com/izouma/awesomeAdmin/domain/Product.java
  69. 38 0
      src/main/java/com/izouma/awesomeAdmin/domain/RechargeOrder.java
  70. 49 0
      src/main/java/com/izouma/awesomeAdmin/domain/SaleBatch.java
  71. 32 0
      src/main/java/com/izouma/awesomeAdmin/domain/SmsRecord.java
  72. 26 0
      src/main/java/com/izouma/awesomeAdmin/domain/SubAccount.java
  73. 44 0
      src/main/java/com/izouma/awesomeAdmin/domain/SysConfig.java
  74. 72 0
      src/main/java/com/izouma/awesomeAdmin/domain/TrialOrder.java
  75. 67 0
      src/main/java/com/izouma/awesomeAdmin/domain/TrialProduct.java
  76. 125 0
      src/main/java/com/izouma/awesomeAdmin/domain/User.java
  77. 49 0
      src/main/java/com/izouma/awesomeAdmin/domain/UserBalance.java
  78. 43 0
      src/main/java/com/izouma/awesomeAdmin/domain/UserBankCard.java
  79. 25 0
      src/main/java/com/izouma/awesomeAdmin/domain/UserCollection.java
  80. 37 0
      src/main/java/com/izouma/awesomeAdmin/domain/UserMoneyRecord.java
  81. 58 0
      src/main/java/com/izouma/awesomeAdmin/domain/WithdrawApply.java
  82. 55 0
      src/main/java/com/izouma/awesomeAdmin/domain/WorkOrder.java
  83. 30 0
      src/main/java/com/izouma/awesomeAdmin/dto/CommissionDetail.java
  84. 43 0
      src/main/java/com/izouma/awesomeAdmin/dto/CommissionOrder.java
  85. 35 0
      src/main/java/com/izouma/awesomeAdmin/dto/CommissionOverview.java
  86. 25 0
      src/main/java/com/izouma/awesomeAdmin/dto/DailySales.java
  87. 32 0
      src/main/java/com/izouma/awesomeAdmin/dto/JuniorDTO.java
  88. 13 0
      src/main/java/com/izouma/awesomeAdmin/dto/LoginDTO.java
  89. 35 0
      src/main/java/com/izouma/awesomeAdmin/dto/OrderDTO.java
  90. 48 0
      src/main/java/com/izouma/awesomeAdmin/dto/OrderDetailDTO.java
  91. 34 0
      src/main/java/com/izouma/awesomeAdmin/dto/OrderUser.java
  92. 17 0
      src/main/java/com/izouma/awesomeAdmin/dto/PageQuery.java
  93. 32 0
      src/main/java/com/izouma/awesomeAdmin/dto/PageWrapper.java
  94. 24 0
      src/main/java/com/izouma/awesomeAdmin/dto/PerformanceStat.java
  95. 62 0
      src/main/java/com/izouma/awesomeAdmin/dto/RankDTO.java
  96. 22 0
      src/main/java/com/izouma/awesomeAdmin/dto/UserCollectionDTO.java
  97. 72 0
      src/main/java/com/izouma/awesomeAdmin/dto/UserOrderDTO.java
  98. 39 0
      src/main/java/com/izouma/awesomeAdmin/dto/WithdrawApplyDetail.java
  99. 354 0
      src/main/java/com/izouma/awesomeAdmin/dto/gen/GenCode.java
  100. 55 0
      src/main/java/com/izouma/awesomeAdmin/dto/gen/Subtable.java

+ 37 - 0
.gitignore

@@ -0,0 +1,37 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+
+### VS Code ###
+.vscode/
+
+.DS_Store
+/src/main/paintingmarket/node_modules/
+
+firstcashtestbot
+firstcashtestbot.wal.*

+ 114 - 0
.mvn/wrapper/MavenWrapperDownloader.java

@@ -0,0 +1,114 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+    /**
+     * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+     */
+    private static final String DEFAULT_DOWNLOAD_URL =
+            "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar";
+
+    /**
+     * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+     * use instead of the default one.
+     */
+    private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+            ".mvn/wrapper/maven-wrapper.properties";
+
+    /**
+     * Path where the maven-wrapper.jar will be saved to.
+     */
+    private static final String MAVEN_WRAPPER_JAR_PATH =
+            ".mvn/wrapper/maven-wrapper.jar";
+
+    /**
+     * Name of the property which should be used to override the default download url for the wrapper.
+     */
+    private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+    public static void main(String args[]) {
+        System.out.println("- Downloader started");
+        File baseDirectory = new File(args[0]);
+        System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+        // If the maven-wrapper.properties exists, read it and check if it contains a custom
+        // wrapperUrl parameter.
+        File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+        String url = DEFAULT_DOWNLOAD_URL;
+        if (mavenWrapperPropertyFile.exists()) {
+            FileInputStream mavenWrapperPropertyFileInputStream = null;
+            try {
+                mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+                Properties mavenWrapperProperties = new Properties();
+                mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+                url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+            } catch (IOException e) {
+                System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+            } finally {
+                try {
+                    if (mavenWrapperPropertyFileInputStream != null) {
+                        mavenWrapperPropertyFileInputStream.close();
+                    }
+                } catch (IOException e) {
+                    // Ignore ...
+                }
+            }
+        }
+        System.out.println("- Downloading from: : " + url);
+
+        File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+        if (!outputFile.getParentFile().exists()) {
+            if (!outputFile.getParentFile().mkdirs()) {
+                System.out.println(
+                        "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+            }
+        }
+        System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+        try {
+            downloadFileFromURL(url, outputFile);
+            System.out.println("Done");
+            System.exit(0);
+        } catch (Throwable e) {
+            System.out.println("- Error downloading");
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+
+    private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+        URL website = new URL(urlString);
+        ReadableByteChannel rbc;
+        rbc = Channels.newChannel(website.openStream());
+        FileOutputStream fos = new FileOutputStream(destination);
+        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+        fos.close();
+        rbc.close();
+    }
+
+}

BIN
.mvn/wrapper/maven-wrapper.jar


+ 1 - 0
.mvn/wrapper/maven-wrapper.properties

@@ -0,0 +1 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip

+ 7 - 0
build.sh

@@ -0,0 +1,7 @@
+git checkout
+git pull
+#(cd src/main/vue && npm run build)
+mvn clean package
+systemctl stop zmj
+cp target/zhumj-0.0.1-SNAPSHOT.jar /var/www/zmj/zhumj-0.0.1-SNAPSHOT.jar
+systemctl start zmj

+ 8 - 0
install-jar.sh

@@ -0,0 +1,8 @@
+
+mvn org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file \
+-DgroupId=com.dingtalk \
+-DartifactId=client-sdk.api \
+-Dpackaging=jar \
+-Dversion=1.0.2 \
+-Dfile=lib/client-sdk.api-1.0.2.jar \
+-DlocalRepositoryPath=libs

+ 286 - 0
mvnw

@@ -0,0 +1,286 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#    https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven2 Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+#   JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+#   M2_HOME - location of maven2's installed home dir
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
+#     e.g. to debug Maven itself, use
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+  if [ -f /etc/mavenrc ] ; then
+    . /etc/mavenrc
+  fi
+
+  if [ -f "$HOME/.mavenrc" ] ; then
+    . "$HOME/.mavenrc"
+  fi
+
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  MINGW*) mingw=true;;
+  Darwin*) darwin=true
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+    if [ -z "$JAVA_HOME" ]; then
+      if [ -x "/usr/libexec/java_home" ]; then
+        export JAVA_HOME="`/usr/libexec/java_home`"
+      else
+        export JAVA_HOME="/Library/Java/Home"
+      fi
+    fi
+    ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+  ## resolve links - $0 may be a link to maven's home
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+      PRG="$link"
+    else
+      PRG="`dirname "$PRG"`/$link"
+    fi
+  done
+
+  saveddir=`pwd`
+
+  M2_HOME=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  M2_HOME=`cd "$M2_HOME" && pwd`
+
+  cd "$saveddir"
+  # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --unix "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME="`(cd "$M2_HOME"; pwd)`"
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+  # TODO classpath?
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="`which javac`"
+  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=`which readlink`
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+      if $darwin ; then
+        javaHome="`dirname \"$javaExecutable\"`"
+        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+      else
+        javaExecutable="`readlink -f \"$javaExecutable\"`"
+      fi
+      javaHome="`dirname \"$javaExecutable\"`"
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="`which java`"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly." >&2
+  echo "  We cannot execute $JAVACMD" >&2
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+  if [ -z "$1" ]
+  then
+    echo "Path not specified to find_maven_basedir"
+    return 1
+  fi
+
+  basedir="$1"
+  wdir="$1"
+  while [ "$wdir" != '/' ] ; do
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+    if [ -d "${wdir}" ]; then
+      wdir=`cd "$wdir/.."; pwd`
+    fi
+    # end of workaround
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' < "$1")"
+  fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+  exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Found .mvn/wrapper/maven-wrapper.jar"
+    fi
+else
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+    fi
+    jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
+    while IFS="=" read key value; do
+      case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+      esac
+    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Downloading from: $jarUrl"
+    fi
+    wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+
+    if command -v wget > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found wget ... using wget"
+        fi
+        wget "$jarUrl" -O "$wrapperJarPath"
+    elif command -v curl > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found curl ... using curl"
+        fi
+        curl -o "$wrapperJarPath" "$jarUrl"
+    else
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Falling back to using Java to download"
+        fi
+        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+        if [ -e "$javaClass" ]; then
+            if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Compiling MavenWrapperDownloader.java ..."
+                fi
+                # Compiling the Java class
+                ("$JAVA_HOME/bin/javac" "$javaClass")
+            fi
+            if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                # Running the downloader
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Running MavenWrapperDownloader.java ..."
+                fi
+                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+            fi
+        fi
+    fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+  echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+  $MAVEN_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

+ 161 - 0
mvnw.cmd

@@ -0,0 +1,161 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    https://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven2 Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM     e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not_found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not_found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
+FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO (
+	IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B 
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+    echo Found %WRAPPER_JAR%
+) else (
+    echo Couldn't find %WRAPPER_JAR%, downloading it ...
+	echo Downloading from: %DOWNLOAD_URL%
+    powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"
+    echo Finished downloading %WRAPPER_JAR%
+)
+@REM End of extension
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%

+ 379 - 0
pom.xml

@@ -0,0 +1,379 @@
+<?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.6.5</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.izouma</groupId>
+    <artifactId>art-trade</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>art-trade</name>
+    <description>art-trade</description>
+
+    <repositories>
+        <repository>
+            <id>nexus-aliyun</id>
+            <url>https://maven.aliyun.com/repository/public</url>
+        </repository>
+        <repository>
+            <id>central</id>
+            <url>https://repo1.maven.org/maven2/</url>
+        </repository>
+        <repository>
+            <id>Local repository</id>
+            <url>file://${basedir}/libs</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>
+        </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-data-redis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-cache</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>javax.validation</groupId>
+            <artifactId>validation-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+<!--        <dependency>-->
+<!--            <groupId>org.springframework.boot</groupId>-->
+<!--            <artifactId>spring-boot-starter-data-redis</artifactId>-->
+<!--        </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.0.4</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>
+
+        <!-- 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>3.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>3.0.0</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.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.8.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.javafaker</groupId>
+            <artifactId>javafaker</artifactId>
+            <version>1.0.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <version>3.3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>javase</artifactId>
+            <version>3.3.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alipay.sdk</groupId>
+            <artifactId>alipay-sdk-java</artifactId>
+            <version>4.9.13.ALL</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>javax.cache</groupId>
+            <artifactId>cache-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.kstyrc</groupId>
+            <artifactId>embedded-redis</artifactId>
+            <version>0.6</version>
+        </dependency>
+
+
+
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-envers</artifactId>
+        </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>software.amazon.awssdk</groupId>
+            <artifactId>ec2</artifactId>
+            <version>2.16.104</version>
+        </dependency>
+
+        <dependency>
+            <groupId>software.amazon.awssdk</groupId>
+            <artifactId>s3</artifactId>
+            <version>2.16.104</version>
+        </dependency>
+
+        <dependency>
+            <groupId>software.amazon.awssdk</groupId>
+            <artifactId>dynamodb</artifactId>
+            <version>2.16.104</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson-spring-boot-starter</artifactId>
+            <version>3.17.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.telegram</groupId>
+            <artifactId>telegrambots</artifactId>
+            <version>6.5.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.telegram</groupId>
+            <artifactId>telegrambots-abilities</artifactId>
+            <version>6.5.0</version>
+        </dependency>
+    </dependencies>
+
+</project>

+ 22 - 0
src/main/java/com/izouma/awesomeAdmin/Application.java

@@ -0,0 +1,22 @@
+package com.izouma.awesomeAdmin;
+
+import com.izouma.awesomeAdmin.web.TelegramBot;
+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.scheduling.annotation.EnableScheduling;
+import org.telegram.telegrambots.meta.TelegramBotsApi;
+import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
+import org.telegram.telegrambots.updatesreceivers.DefaultBotSession;
+
+@SpringBootApplication
+@EnableJpaAuditing
+@EnableCaching
+@EnableScheduling
+public class Application {
+
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+}

+ 25 - 0
src/main/java/com/izouma/awesomeAdmin/annotations/RedisLock.java

@@ -0,0 +1,25 @@
+package com.izouma.awesomeAdmin.annotations;
+
+import java.lang.annotation.*;
+import java.util.concurrent.TimeUnit;
+
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface RedisLock {
+    String value();
+
+    long expire() default 10;
+
+    TimeUnit unit() default TimeUnit.SECONDS;
+
+    Behavior behavior() default Behavior.THROW;
+
+    String message() default "获取锁失败";
+
+    enum Behavior {
+        WAIT,
+        THROW
+    }
+
+}

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

@@ -0,0 +1,12 @@
+package com.izouma.awesomeAdmin.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;
+}

+ 89 - 0
src/main/java/com/izouma/awesomeAdmin/aspect/RedisLockAspect.java

@@ -0,0 +1,89 @@
+package com.izouma.awesomeAdmin.aspect;
+
+import com.izouma.awesomeAdmin.annotations.RedisLock;
+import com.izouma.awesomeAdmin.exception.BusinessException;
+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.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+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.Optional;
+
+@Aspect
+@Component
+@Slf4j
+public class RedisLockAspect {
+
+    private final DefaultParameterNameDiscoverer nameDiscoverer = new DefaultParameterNameDiscoverer();
+
+    private final RedissonClient redissonClient;
+
+    public RedisLockAspect(RedissonClient redissonClient) {
+        this.redissonClient = redissonClient;
+    }
+
+    @Pointcut("@annotation(com.izouma.awesomeAdmin.annotations.RedisLock)")
+    public void redisLockPointCut() {
+    }
+
+    @Around(value = "redisLockPointCut() && @annotation(redisLock)")
+    public Object redisLock(ProceedingJoinPoint joinPoint, RedisLock redisLock) {
+        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 = redisLock.value();
+        try {
+            key = Optional.ofNullable(parser.parseExpression(redisLock.value()).getValue(context))
+                    .map(Object::toString)
+                    .orElse("default");
+        } catch (Exception ignored) {
+        }
+        log.info("enter redisLock aspect key: {}", key);
+        RLock lock = redissonClient.getLock(key);
+        if (redisLock.behavior() == RedisLock.Behavior.WAIT) {
+            lock.lock(redisLock.expire(), redisLock.unit());
+            log.info("get redisLock success");
+        } else {
+            if (!lock.tryLock()) {
+                log.info("get redisLock fail");
+                throw new BusinessException(redisLock.message());
+            }
+            log.info("get redisLock success");
+        }
+        Object res = null;
+        try {
+            res = joinPoint.proceed();
+            try {
+                lock.unlock();
+            } catch (Exception ignored) {
+            }
+        } catch (Throwable e) {
+            try {
+                lock.unlock();
+            } catch (Exception ignored) {
+            }
+            if (e instanceof BusinessException) {
+                throw (BusinessException) e;
+            }
+            throw new RuntimeException(e);
+        }
+        return res;
+    }
+}

+ 42 - 0
src/main/java/com/izouma/awesomeAdmin/config/AWSConfig.java

@@ -0,0 +1,42 @@
+package com.izouma.awesomeAdmin.config;
+
+import lombok.AllArgsConstructor;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import software.amazon.awssdk.auth.credentials.AwsCredentials;
+import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.s3.S3Client;
+
+@AllArgsConstructor
+@Configuration
+@EnableConfigurationProperties({AWSProperties.class})
+public class AWSConfig {
+
+    private AWSProperties awsProperties;
+
+    @Bean
+    public AwsCredentialsProvider credential() {
+        return () -> new AwsCredentials() {
+
+            @Override
+            public String accessKeyId() {
+                return awsProperties.getAccessKeyId();
+            }
+
+            @Override
+            public String secretAccessKey() {
+                return awsProperties.getSecretAccessKey();
+            }
+        };
+    }
+
+    @Bean
+    public S3Client s3Client() {
+        return S3Client.builder()
+                .credentialsProvider(credential())
+                .region(Region.of(awsProperties.getS3Region()))
+                .build();
+    }
+}

+ 15 - 0
src/main/java/com/izouma/awesomeAdmin/config/AWSProperties.java

@@ -0,0 +1,15 @@
+package com.izouma.awesomeAdmin.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "aws")
+public class AWSProperties {
+
+    private String accessKeyId;
+    private String secretAccessKey;
+    private String s3BucketName;
+    private String s3Region;
+
+}

+ 21 - 0
src/main/java/com/izouma/awesomeAdmin/config/AlipayConfig.java

@@ -0,0 +1,21 @@
+package com.izouma.awesomeAdmin.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, AlipayISVProperties.class})
+public class AlipayConfig {
+    private final AlipayProperties properties;
+
+    @Bean
+    public AlipayClient alipayClient() {
+        return new DefaultAlipayClient(properties.getGateway(), properties.getAppId(), properties.getPrivateKey(),
+                "json", "UTF-8", properties.getAliPublicKey(), "RSA2");
+    }
+}

+ 15 - 0
src/main/java/com/izouma/awesomeAdmin/config/AlipayISVProperties.java

@@ -0,0 +1,15 @@
+package com.izouma.awesomeAdmin.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "alipay-isv")
+public class AlipayISVProperties {
+    private String appId;
+    private String gateway;
+    private String privateKey;
+    private String appPublicKey;
+    private String aliPublicKey;
+}

+ 14 - 0
src/main/java/com/izouma/awesomeAdmin/config/AlipayProperties.java

@@ -0,0 +1,14 @@
+package com.izouma.awesomeAdmin.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;
+}

+ 126 - 0
src/main/java/com/izouma/awesomeAdmin/config/CacheConfig.java

@@ -0,0 +1,126 @@
+package com.izouma.awesomeAdmin.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.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import com.izouma.awesomeAdmin.domain.User;
+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.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+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;
+import java.util.HashMap;
+import java.util.Map;
+
+
+@Configuration
+@AutoConfigureAfter({RedisAutoConfiguration.class, CacheAutoConfiguration.class})
+public class CacheConfig {
+
+    public Jackson2JsonRedisSerializer<?> jackson2JsonRedisSerializer() {
+
+        //使用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);
+        SimpleModule simpleModule = new SimpleModule();
+        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
+        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
+        mapper.registerModule(simpleModule);
+
+        serializer.setObjectMapper(mapper);
+        return serializer;
+    }
+
+    @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(User.View.Detail.class));
+        SimpleModule simpleModule = new SimpleModule();
+        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
+        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
+        mapper.registerModule(simpleModule);
+//        mapper.registerModule(new PageJacksonModule());
+//        mapper.registerModule(new SortJacksonModule());
+
+        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(RedisConnectionFactory redisConnectionFactory) {
+        Jackson2JsonRedisSerializer<?> serializer = jackson2JsonRedisSerializer();
+        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
+                .entryTtl(Duration.ofMinutes(30))
+                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer));
+        Map<String, RedisCacheConfiguration> redisCacheConfigurationMap = new HashMap<>();
+
+        redisCacheConfigurationMap.put("financeProductSale", RedisCacheConfiguration.defaultCacheConfig()
+                .entryTtl(Duration.ofDays(1))
+                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer)));
+
+        redisCacheConfigurationMap.put("rankByProfit", RedisCacheConfiguration.defaultCacheConfig()
+                .entryTtl(Duration.ofMinutes(10))
+                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer)));
+
+        redisCacheConfigurationMap.put("rankByInvite", RedisCacheConfiguration.defaultCacheConfig()
+                .entryTtl(Duration.ofMinutes(1))
+                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer)));
+
+        redisCacheConfigurationMap.put("financeOrderRank", RedisCacheConfiguration.defaultCacheConfig()
+                .entryTtl(Duration.ofMinutes(1))
+                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer)));
+
+        return RedisCacheManager.builder(redisConnectionFactory)
+                .cacheDefaults(redisCacheConfiguration)
+                .withInitialCacheConfigurations(redisCacheConfigurationMap)
+                .build();
+    }
+
+}

+ 12 - 0
src/main/java/com/izouma/awesomeAdmin/config/CloudPayProperties.java

@@ -0,0 +1,12 @@
+package com.izouma.awesomeAdmin.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "cloudpay")
+public class CloudPayProperties {
+    private String merNo;
+    private String secret;
+    private String notifyUrl;
+}

+ 88 - 0
src/main/java/com/izouma/awesomeAdmin/config/Constants.java

@@ -0,0 +1,88 @@
+package com.izouma.awesomeAdmin.config;
+
+import java.time.LocalTime;
+
+public interface Constants {
+
+    public interface Regex {
+        String PHONE    = "^\\d{10}$";
+        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://zhumj.oss-cn-hangzhou.aliyuncs.com/image/user.jpg";
+
+    String SMS_SIGN_NAME = "走马信息";
+
+    String SMS_TEMPLATE_CODE_GENERIC = "SMS_175485688";
+
+    String PLATFORM_COMMISSION = "platform_commission"; //平台分成比例
+
+    String SUPERIOR_COMMISSION = "superior_commission"; //佣金分成比例
+
+    String MAX_RISE_RATE = "max_rise_rate"; //最大上涨比例
+
+    String SELL_TIME = "sell_time"; //抢购时间
+
+    String SELL_END_TIME = "sell_end_time"; //抢购时间
+
+    String DELEGATION_TIME = "delegation_time"; //委托时间
+
+    String MAX_PRICE = "max_price"; //最高金额限制
+
+    String SPLIT_PRICE = "split_price"; //分裂金额
+
+    String DELEGATION_ACTIVE_TIME = "delegation_active_time"; //委托上架时间
+
+    String SYSTEM_OPEN = "SYSTEM_OPEN"; //开苑开关
+
+    LocalTime TIME_MAX = LocalTime.of(23, 59, 59);
+
+    interface BalanceRemark {
+        String PAY        = "balance.record.pay";
+        String RECEIPT    = "balance.record.receipt";
+        String RECHARGE   = "balance.record.recharge";
+        String WITHDRAW   = "balance.record.withdraw";
+        String COMMISSION = "balance.record.commission";
+        String STAKE      = "balance.record.stake";
+        String REDEEM     = "balance.record.redeem";
+        String RETURN     = "balance.record.return";
+        String BONUS      = "balance.record.bonus";
+    }
+
+    interface Config {
+        String WITHDRAW_FEE_RATE             = "withdraw_fee_rate";
+        String WITHDRAW_FEE_LOW_RATE         = "withdraw_fee_low_rate";
+        String FINANCE_PRODUCT_START_TIME    = "f_product_start_time";
+        String FINANCE_PRODUCT_END_TIME      = "f_product_end_time";
+        String FINANCE_PRODUCT_STOCK         = "f_product_stock";
+        String FINANCE_RATE                  = "f_rate";
+        String BONUS_RATE                    = "bonus_rate";
+        String CUSTOMER_SERVICE              = "customer_service";
+        String CUSTOMER_JSON                 = "customer_json";
+        String FINANCE_PRODUCT_MIN_AMOUNT    = "f_pro_min_am";
+        String FINANCE_PRODUCT_DEFAULT_STOCK = "f_pro_def_stock";
+        String BONUS_MIN_AMOUNT              = "bonus_min_am";
+        String PAY_CHANNEL                   = "pay_channel";
+        String WITHDRAW_CHANNEL              = "withdraw_channel";
+        String GLOBAL_PAY_METHOD             = "global_pay_method";
+        String MIN_WITHDRAW_AMOUNT           = "min_withdraw_amount";
+    }
+
+    interface Redis {
+        String FINANCE_PRODUCT_SALE = "financeProductSale::";
+        String UPDATE_STOCK_QUEUE   = "updateStockQueue";
+    }
+
+    interface ErrorCode {
+        int INSUFFICIENT_BALANCE = -2;
+        int NO_BANK_CARD         = -3;
+    }
+
+    interface PayChannel {
+        String LUCK_PAY   = "luckPay";
+        String CLOUD_PAY  = "cloudPay";
+        String GLOBAL_PAY = "globalPay";
+    }
+}

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

@@ -0,0 +1,148 @@
+package com.izouma.awesomeAdmin.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;
+    }
+
+
+}
+

+ 20 - 0
src/main/java/com/izouma/awesomeAdmin/config/ErrorPageConfig.java

@@ -0,0 +1,20 @@
+package com.izouma.awesomeAdmin.config;
+
+import org.springframework.boot.web.server.ConfigurableWebServerFactory;
+import org.springframework.boot.web.server.ErrorPage;
+import org.springframework.boot.web.server.WebServerFactoryCustomizer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpStatus;
+
+@Configuration
+public class ErrorPageConfig {
+    @Bean
+    public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() {
+
+        return (factory -> {
+            ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/static/admin/index.html");
+            factory.addErrorPages(errorPage404);
+        });
+    }
+}

+ 10 - 0
src/main/java/com/izouma/awesomeAdmin/config/GeneralProperties.java

@@ -0,0 +1,10 @@
+package com.izouma.awesomeAdmin.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "general")
+public class GeneralProperties {
+    private String host;
+}

+ 13 - 0
src/main/java/com/izouma/awesomeAdmin/config/GeneralPropertiesConfig.java

@@ -0,0 +1,13 @@
+package com.izouma.awesomeAdmin.config;
+
+import lombok.AllArgsConstructor;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@AllArgsConstructor
+@Configuration
+@EnableConfigurationProperties({GeneralProperties.class})
+public class GeneralPropertiesConfig {
+
+
+}

+ 21 - 0
src/main/java/com/izouma/awesomeAdmin/config/GlobalPayProperties.java

@@ -0,0 +1,21 @@
+package com.izouma.awesomeAdmin.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "global-pay")
+public class GlobalPayProperties {
+
+    private String merNo;
+
+    private String md5Key;
+
+    private String publicKey;
+
+    private String privateKey;
+
+    private String platformPublicKey;
+
+    private String notifyUrl;
+}

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

@@ -0,0 +1,36 @@
+package com.izouma.awesomeAdmin.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());
+        };
+    }
+}

+ 14 - 0
src/main/java/com/izouma/awesomeAdmin/config/LuckPayProperties.java

@@ -0,0 +1,14 @@
+package com.izouma.awesomeAdmin.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "luckpay")
+public class LuckPayProperties {
+    private String merNo;
+    private String privateKey;
+    private String publicKey;
+    private String appPublicKey;
+    private String notifyUrl;
+}

+ 32 - 0
src/main/java/com/izouma/awesomeAdmin/config/PageDeserializer.java

@@ -0,0 +1,32 @@
+package com.izouma.awesomeAdmin.config;
+
+import com.fasterxml.jackson.core.JacksonException;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.PageRequest;
+
+import java.io.IOException;
+import java.util.List;
+
+public class PageDeserializer extends StdDeserializer<PageImpl> {
+
+    public PageDeserializer() {
+        super(PageImpl.class);
+    }
+
+    @Override
+    public PageImpl deserialize(JsonParser p, DeserializationContext ctx) throws IOException, JacksonException {
+        int number = ctx.readValue(p, int.class);
+        int numberOfElements = ctx.readValue(p, int.class);
+        long totalElements = ctx.readValue(p, long.class);
+        long totalPages = ctx.readValue(p, long.class);
+        int size = ctx.readValue(p, int.class);
+        List content = ctx.readValue(p, List.class);
+        new PageImpl<>(content, PageRequest.of(number, size), totalElements);
+        return null;
+    }
+
+
+}

+ 200 - 0
src/main/java/com/izouma/awesomeAdmin/config/PageJacksonModule.java

@@ -0,0 +1,200 @@
+package com.izouma.awesomeAdmin.config;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.function.Function;
+
+import com.fasterxml.jackson.annotation.JsonAlias;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.core.Version;
+import com.fasterxml.jackson.databind.Module;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+
+/**
+ * This Jackson module provides support to deserialize Spring {@link Page} objects.
+ *
+ * @author Pascal Büttiker
+ * @author Olga Maciaszek-Sharma
+ * @author Pedro Mendes
+ * @author Nikita Konev
+ */
+public class PageJacksonModule extends Module {
+
+    @Override
+    public String getModuleName() {
+        return "PageJacksonModule";
+    }
+
+    @Override
+    public Version version() {
+        return new Version(0, 1, 0, "", null, null);
+    }
+
+    @Override
+    public void setupModule(SetupContext context) {
+        context.setMixInAnnotations(Page.class, PageMixIn.class);
+    }
+
+    @JsonDeserialize(as = SimplePageImpl.class)
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    private interface PageMixIn {
+
+    }
+
+    static class SimplePageImpl<T> implements Page<T> {
+
+        private final Page<T> delegate;
+
+        SimplePageImpl(@JsonProperty("content") List<T> content, @JsonProperty("number") int number,
+                       @JsonProperty("size") int size, @JsonProperty("totalElements") @JsonAlias({ "total-elements",
+                "total_elements", "totalelements", "TotalElements" }) long totalElements,
+                       @JsonProperty("sort") Sort sort) {
+            if (size > 0) {
+                PageRequest pageRequest;
+                if (sort != null) {
+                    pageRequest = PageRequest.of(number, size, sort);
+                }
+                else {
+                    pageRequest = PageRequest.of(number, size);
+                }
+                delegate = new PageImpl<>(content, pageRequest, totalElements);
+            }
+            else {
+                delegate = new PageImpl<>(content);
+            }
+        }
+
+        @JsonProperty
+        @Override
+        public int getTotalPages() {
+            return delegate.getTotalPages();
+        }
+
+        @JsonProperty
+        @Override
+        public long getTotalElements() {
+            return delegate.getTotalElements();
+        }
+
+        @JsonProperty
+        @Override
+        public int getNumber() {
+            return delegate.getNumber();
+        }
+
+        @JsonProperty
+        @Override
+        public int getSize() {
+            return delegate.getSize();
+        }
+
+        @JsonProperty
+        @Override
+        public int getNumberOfElements() {
+            return delegate.getNumberOfElements();
+        }
+
+        @JsonProperty
+        @Override
+        public List<T> getContent() {
+            return delegate.getContent();
+        }
+
+        @JsonProperty
+        @Override
+        public boolean hasContent() {
+            return delegate.hasContent();
+        }
+
+        @JsonIgnore
+        @Override
+        public Sort getSort() {
+            return delegate.getSort();
+        }
+
+        @JsonProperty
+        @Override
+        public boolean isFirst() {
+            return delegate.isFirst();
+        }
+
+        @JsonProperty
+        @Override
+        public boolean isLast() {
+            return delegate.isLast();
+        }
+
+        @JsonIgnore
+        @Override
+        public boolean hasNext() {
+            return delegate.hasNext();
+        }
+
+        @JsonIgnore
+        @Override
+        public boolean hasPrevious() {
+            return delegate.hasPrevious();
+        }
+
+        @JsonIgnore
+        @Override
+        public Pageable nextPageable() {
+            return delegate.nextPageable();
+        }
+
+        @JsonIgnore
+        @Override
+        public Pageable previousPageable() {
+            return delegate.previousPageable();
+        }
+
+        @JsonIgnore
+        @Override
+        public <S> Page<S> map(Function<? super T, ? extends S> converter) {
+            return delegate.map(converter);
+        }
+
+        @JsonIgnore
+        @Override
+        public Iterator<T> iterator() {
+            return delegate.iterator();
+        }
+
+        @JsonIgnore
+        @Override
+        public Pageable getPageable() {
+            return delegate.getPageable();
+        }
+
+        @JsonIgnore
+        @Override
+        public boolean isEmpty() {
+            return delegate.isEmpty();
+        }
+
+        @Override
+        public int hashCode() {
+            return delegate.hashCode();
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            return delegate.equals(obj);
+        }
+
+        @Override
+        public String toString() {
+            return delegate.toString();
+        }
+
+    }
+
+}

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

@@ -0,0 +1,19 @@
+package com.izouma.awesomeAdmin.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(4);
+        taskScheduler.setRemoveOnCancelPolicy(true);
+        taskScheduler.setThreadNamePrefix("Scheduler-");
+        return taskScheduler;
+    }
+}

+ 38 - 0
src/main/java/com/izouma/awesomeAdmin/config/SortJacksonModule.java

@@ -0,0 +1,38 @@
+package com.izouma.awesomeAdmin.config;
+
+import com.fasterxml.jackson.core.Version;
+import com.fasterxml.jackson.databind.Module;
+import com.fasterxml.jackson.databind.module.SimpleDeserializers;
+import com.fasterxml.jackson.databind.module.SimpleSerializers;
+import org.springframework.data.domain.Sort;
+
+/**
+ * This Jackson module provides support for serializing and deserializing for Spring
+ * {@link Sort} object.
+ *
+ * @author Can Bezmen
+ */
+public class SortJacksonModule extends Module {
+
+    @Override
+    public String getModuleName() {
+        return "SortModule";
+    }
+
+    @Override
+    public Version version() {
+        return new Version(0, 1, 0, "", null, null);
+    }
+
+    @Override
+    public void setupModule(SetupContext context) {
+        SimpleSerializers serializers = new SimpleSerializers();
+        serializers.addSerializer(Sort.class, new SortJsonComponent.SortSerializer());
+        context.addSerializers(serializers);
+
+        SimpleDeserializers deserializers = new SimpleDeserializers();
+        deserializers.addDeserializer(Sort.class, new SortJsonComponent.SortDeserializer());
+        context.addDeserializers(deserializers);
+    }
+
+}

+ 84 - 0
src/main/java/com/izouma/awesomeAdmin/config/SortJsonComponent.java

@@ -0,0 +1,84 @@
+package com.izouma.awesomeAdmin.config;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.TreeNode;
+import com.fasterxml.jackson.databind.*;
+import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import org.springframework.data.domain.Sort;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This class provides provides support for serializing and deserializing for Spring
+ * {@link Sort} object.
+ *
+ * @author Can Bezmen
+ */
+public class SortJsonComponent {
+
+    public static class SortSerializer extends JsonSerializer<Sort> {
+
+        @Override
+        public void serialize(Sort value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+            gen.writeStartArray();
+            value.iterator().forEachRemaining(v -> {
+                try {
+                    gen.writeObject(v);
+                } catch (IOException e) {
+                    throw new RuntimeException("Couldn't serialize object " + v);
+                }
+            });
+            gen.writeEndArray();
+        }
+
+        public void serializeWithType(Sort value, JsonGenerator gen, SerializerProvider serializers,
+                                      TypeSerializer typeSer) throws IOException {
+            gen.writeStartArray();
+            value.iterator().forEachRemaining(v -> {
+                try {
+                    gen.writeObject(v);
+                } catch (IOException e) {
+                    throw new RuntimeException("Couldn't serialize object " + v);
+                }
+            });
+            gen.writeEndArray();
+        }
+
+        @Override
+        public Class<Sort> handledType() {
+            return Sort.class;
+        }
+
+    }
+
+    public static class SortDeserializer extends JsonDeserializer<Sort> {
+
+        @Override
+        public Sort deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
+                throws IOException {
+            TreeNode treeNode = jsonParser.getCodec().readTree(jsonParser);
+            if (treeNode.isArray()) {
+                ArrayNode arrayNode = (ArrayNode) treeNode;
+                List<Sort.Order> orders = new ArrayList<>();
+                for (JsonNode jsonNode : arrayNode) {
+                    Sort.Order order = new Sort.Order(Sort.Direction.valueOf(jsonNode.get("direction").textValue()),
+                            jsonNode.get("property").textValue());
+                    orders.add(order);
+                }
+                return Sort.by(orders);
+            }
+            return null;
+        }
+
+        @Override
+        public Class<Sort> handledType() {
+            return Sort.class;
+        }
+
+    }
+
+}

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

@@ -0,0 +1,24 @@
+package com.izouma.awesomeAdmin.config;
+
+import com.izouma.awesomeAdmin.domain.User;
+import com.izouma.awesomeAdmin.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);
+    }
+}

+ 108 - 0
src/main/java/com/izouma/awesomeAdmin/config/WebMvcConfig.java

@@ -0,0 +1,108 @@
+package com.izouma.awesomeAdmin.config;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.izouma.awesomeAdmin.domain.User;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.support.ResourceBundleMessageSource;
+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
+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("/files/**").addResourceLocations("file:" + localPath);
+    }
+
+    @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.awesomeAdmin.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);
+//                    objectMapper.registerModule(new PageJacksonModule());
+//                    objectMapper.registerModule(new SortJacksonModule());
+                    ((MappingJackson2HttpMessageConverter) converter).setObjectMapper(objectMapper);
+                    objectMapper.setConfig(objectMapper.getSerializationConfig().withView(User.View.Basic.class));
+                });
+    }
+
+    // @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("*")
+                .allowedOriginPatterns("*")
+                .allowCredentials(true)
+                .allowedMethods("HEAD", "GET", "PUT", "POST", "DELETE", "PATCH")
+                .exposedHeaders("Content-Disposition");
+    }
+
+    @Bean
+    public ResourceBundleMessageSource messageSource() {
+        ResourceBundleMessageSource rs = new ResourceBundleMessageSource();
+        rs.setBasename("messages");
+        rs.setDefaultEncoding("UTF-8");
+        rs.setUseCodeAsDefaultMessage(true);
+        return rs;
+    }
+}

+ 30 - 0
src/main/java/com/izouma/awesomeAdmin/config/WxMaConfig.java

@@ -0,0 +1,30 @@
+package com.izouma.awesomeAdmin.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 WxMaConfig {
+    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/awesomeAdmin/config/WxMaProperties.java

@@ -0,0 +1,14 @@
+package com.izouma.awesomeAdmin.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/awesomeAdmin/config/WxMpConfig.java

@@ -0,0 +1,74 @@
+package com.izouma.awesomeAdmin.config;
+
+import com.izouma.awesomeAdmin.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 WxMpConfig {
+    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/awesomeAdmin/config/WxMpProperties.java

@@ -0,0 +1,13 @@
+package com.izouma.awesomeAdmin.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;
+}

+ 46 - 0
src/main/java/com/izouma/awesomeAdmin/config/WxPayConfig.java

@@ -0,0 +1,46 @@
+package com.izouma.awesomeAdmin.config;
+
+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 WxPayConfig {
+    private WxPayProperties properties;
+
+    @Autowired
+    public WxPayConfig(WxPayProperties properties) {
+        this.properties = properties;
+    }
+
+    @Bean
+    @ConditionalOnMissingBean
+    public WxPayService wxService() {
+        com.github.binarywang.wxpay.config.WxPayConfig payConfig = new com.github.binarywang.wxpay.config.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;
+    }
+
+}

+ 98 - 0
src/main/java/com/izouma/awesomeAdmin/config/WxPayProperties.java

@@ -0,0 +1,98 @@
+package com.izouma.awesomeAdmin.config;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+
+/**
+ * wxpay pay properties
+ *
+ * @author Binary Wang
+ */
+@ConfigurationProperties(prefix = "wx.pay")
+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;
+
+  public String getAppId() {
+    return this.appId;
+  }
+
+  public void setAppId(String appId) {
+    this.appId = appId;
+  }
+
+  public String getMchId() {
+    return mchId;
+  }
+
+  public void setMchId(String mchId) {
+    this.mchId = mchId;
+  }
+
+  public String getMchKey() {
+    return mchKey;
+  }
+
+  public void setMchKey(String mchKey) {
+    this.mchKey = mchKey;
+  }
+
+  public String getSubAppId() {
+    return subAppId;
+  }
+
+  public void setSubAppId(String subAppId) {
+    this.subAppId = subAppId;
+  }
+
+  public String getSubMchId() {
+    return subMchId;
+  }
+
+  public void setSubMchId(String subMchId) {
+    this.subMchId = subMchId;
+  }
+
+  public String getKeyPath() {
+    return this.keyPath;
+  }
+
+  public void setKeyPath(String keyPath) {
+    this.keyPath = keyPath;
+  }
+
+  @Override
+  public String toString() {
+    return ToStringBuilder.reflectionToString(this,
+        ToStringStyle.MULTI_LINE_STYLE);
+  }
+}

+ 25 - 0
src/main/java/com/izouma/awesomeAdmin/converter/DurationConverter.java

@@ -0,0 +1,25 @@
+package com.izouma.awesomeAdmin.converter;
+
+import com.alibaba.fastjson.JSONObject;
+
+import javax.persistence.AttributeConverter;
+import java.time.Duration;
+
+public class DurationConverter implements AttributeConverter<Duration, Long> {
+
+    @Override
+    public Long convertToDatabaseColumn(Duration attribute) {
+        if (attribute == null) {
+            return null;
+        }
+        return attribute.toMillis();
+    }
+
+    @Override
+    public Duration convertToEntityAttribute(Long dbData) {
+        if (dbData == null) {
+            return null;
+        }
+        return Duration.ofMillis(dbData);
+    }
+}

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

@@ -0,0 +1,30 @@
+package com.izouma.awesomeAdmin.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;
+    }
+}

+ 26 - 0
src/main/java/com/izouma/awesomeAdmin/converter/LongArrayConverter.java

@@ -0,0 +1,26 @@
+package com.izouma.awesomeAdmin.converter;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+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<>();
+    }
+}

+ 25 - 0
src/main/java/com/izouma/awesomeAdmin/converter/StringArrayConverter.java

@@ -0,0 +1,25 @@
+package com.izouma.awesomeAdmin.converter;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+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/awesomeAdmin/converter/StringToMapConverter.java

@@ -0,0 +1,24 @@
+package com.izouma.awesomeAdmin.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());
+        }
+    }
+}

+ 40 - 0
src/main/java/com/izouma/awesomeAdmin/converter/UserAuthoritySerializer.java

@@ -0,0 +1,40 @@
+package com.izouma.awesomeAdmin.converter;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonToken;
+import com.fasterxml.jackson.core.type.WritableTypeId;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
+import com.izouma.awesomeAdmin.security.Authority;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+
+public class UserAuthoritySerializer extends JsonSerializer<Set<Authority>> {
+    @Override
+    public void serialize(Set<Authority> value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+        if (value == null) {
+            gen.writeNull();
+        } else {
+            gen.writeStartArray();
+            for (Authority authority : value) {
+                gen.writeObject(authority);
+            }
+            gen.writeEndArray();
+        }
+    }
+
+    @Override
+    public void serializeWithType(Set<Authority> value, JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException {
+        HashSet<Authority> set = new HashSet<>(value);
+        WritableTypeId typeId = typeSer.writeTypePrefix(gen, typeSer.typeId(set, JsonToken.VALUE_STRING));
+        gen.writeStartArray();
+        for (Authority authority : set) {
+            gen.writeObject(authority);
+        }
+        gen.writeEndArray();
+        typeSer.writeTypeSuffix(gen, typeId);
+    }
+}

+ 11 - 0
src/main/java/com/izouma/awesomeAdmin/dao/RankInvite.java

@@ -0,0 +1,11 @@
+package com.izouma.awesomeAdmin.dao;
+
+public interface RankInvite {
+    Long getUserId();
+
+    String getNickname();
+
+    String getAvatar();
+
+    long getJuniorCount();
+}

+ 45 - 0
src/main/java/com/izouma/awesomeAdmin/domain/Address.java

@@ -0,0 +1,45 @@
+package com.izouma.awesomeAdmin.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 Address extends BaseEntity {
+
+    @Column(nullable = false)
+    private Long userId;
+
+    @Column(nullable = false)
+    private String province;
+
+    @Column(nullable = false)
+    private String city;
+
+    @Column(nullable = false)
+    private String district;
+
+    @Column(nullable = false)
+    private String address;
+
+    @Column(nullable = false)
+    private String name;
+
+    @Column(nullable = false)
+    private String phone;
+
+    @Column(nullable = false)
+    private Boolean isDefault = false;
+
+    public String getFullAddress() {
+        return province + " " + city + " " + district + " " + address;
+    }
+}

+ 24 - 0
src/main/java/com/izouma/awesomeAdmin/domain/Article.java

@@ -0,0 +1,24 @@
+package com.izouma.awesomeAdmin.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 Article extends BaseEntity {
+
+    public String title;
+
+    private String cover;
+
+    @Column(columnDefinition = "LONGTEXT")
+    public String detail;
+}

+ 73 - 0
src/main/java/com/izouma/awesomeAdmin/domain/AuditedEntity.java

@@ -0,0 +1,73 @@
+package com.izouma.awesomeAdmin.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;
+
+    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;
+    }
+}

+ 42 - 0
src/main/java/com/izouma/awesomeAdmin/domain/BalanceRecord.java

@@ -0,0 +1,42 @@
+package com.izouma.awesomeAdmin.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Table(indexes = {
+        @Index(columnList = "userId")
+})
+public class BalanceRecord extends BaseEntity {
+
+    private Long userId;
+
+    private LocalDateTime time;
+
+    @Column(precision = 19, scale = 2)
+    private BigDecimal amount;
+
+    @Column(precision = 19, scale = 2)
+    private BigDecimal balance;
+
+    @Column(precision = 19, scale = 2)
+    private BigDecimal lastBalance;
+
+    private String remark;
+
+    private Long orderId;
+
+    private String withdrawId;
+
+    private String extra;
+}

+ 33 - 0
src/main/java/com/izouma/awesomeAdmin/domain/Banner.java

@@ -0,0 +1,33 @@
+package com.izouma.awesomeAdmin.domain;
+
+import com.izouma.awesomeAdmin.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.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class Banner extends BaseEntity {
+    @ApiModelProperty(value = "图片", name = "pic")
+    private String pic;
+
+    @ApiModelProperty(value = "描述", name = "remark")
+    private String remark;
+
+    @ApiModelProperty(value = "地址", name = "url")
+    private String url;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "类型", name = "type")
+    private BannerType type;
+}

+ 84 - 0
src/main/java/com/izouma/awesomeAdmin/domain/BaseEntity.java

@@ -0,0 +1,84 @@
+package com.izouma.awesomeAdmin.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.*;
+import java.time.LocalDateTime;
+
+@MappedSuperclass
+@Audited
+@EntityListeners(AuditingEntityListener.class)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(value = {"hibernateLazyInitializer"}, ignoreUnknown = true)
+@SequenceGenerator(name = "hibernate_sequence", sequenceName = "hibernate_sequence", allocationSize = 100)
+public abstract class BaseEntity {
+    @Id
+    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "hibernate_sequence")
+    private Long id;
+
+    @JsonIgnore
+    @CreatedBy
+    private String createdBy;
+
+    @JsonIgnore
+    @CreatedDate
+    private LocalDateTime createdAt;
+
+    @JsonIgnore
+    @LastModifiedBy
+    private String modifiedBy;
+
+    @JsonIgnore
+    @LastModifiedDate
+    private LocalDateTime modifiedAt;
+
+    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;
+    }
+}

+ 90 - 0
src/main/java/com/izouma/awesomeAdmin/domain/BaseEntityNoID.java

@@ -0,0 +1,90 @@
+package com.izouma.awesomeAdmin.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.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.Column;
+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
+    @Column(columnDefinition = "bit(1) default 0")
+    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;
+    }
+}

+ 38 - 0
src/main/java/com/izouma/awesomeAdmin/domain/Bonus.java

@@ -0,0 +1,38 @@
+package com.izouma.awesomeAdmin.domain;
+
+import com.alibaba.fastjson.JSONObject;
+import com.izouma.awesomeAdmin.converter.JSONObjectConverter;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class Bonus extends BaseEntity {
+    public enum Status {
+        PENDING, END, FINISH
+    }
+
+    @Column(precision = 19, scale = 2)
+    private BigDecimal amount;
+
+    private LocalDateTime startTime;
+
+    private LocalDateTime endTime;
+
+    @Enumerated(EnumType.STRING)
+    @Column(length = 20)
+    private Status status;
+
+    @Column(columnDefinition = "longtext")
+    @Convert(converter = JSONObjectConverter.class)
+    private JSONObject finalRank;
+}

+ 54 - 0
src/main/java/com/izouma/awesomeAdmin/domain/Category.java

@@ -0,0 +1,54 @@
+package com.izouma.awesomeAdmin.domain;
+
+import com.github.javafaker.Business;
+import com.izouma.awesomeAdmin.exception.BusinessException;
+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 java.time.LocalDateTime;
+import java.time.LocalTime;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "分类", description = "分类")
+public class Category extends BaseEntity {
+
+    @ApiModelProperty(value = "名称", name = "name")
+    private String name;
+
+    @ApiModelProperty(value = "图标", name = "icon")
+    private String icon;
+
+    @Column(nullable = false, columnDefinition = "bit default 1")
+    @ApiModelProperty("是否打开")
+    private boolean open = true;
+
+    @Column(nullable = false, columnDefinition = "time default '11:00:00'")
+    @ApiModelProperty("抢购开始时间")
+    private LocalTime openTime;
+
+    @Column(nullable = false, columnDefinition = "time default '10:59:59'")
+    @ApiModelProperty("抢购结束时间")
+    private LocalTime closeTime;
+
+    public void checkTime() {
+        LocalTime now = LocalTime.now();
+        if (closeTime.isAfter(openTime)) {
+            if (now.isBefore(openTime)) throw new BusinessException("抢购未开始");
+            if (now.isAfter(closeTime)) throw new BusinessException("抢购已结束");
+        } else {
+            if (now.isAfter(closeTime) && now.isBefore(openTime)) {
+                throw new BusinessException("抢购未开始");
+            }
+        }
+    }
+}

+ 41 - 0
src/main/java/com/izouma/awesomeAdmin/domain/CommissionRecord.java

@@ -0,0 +1,41 @@
+package com.izouma.awesomeAdmin.domain;
+
+import com.izouma.awesomeAdmin.dto.JuniorDTO;
+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
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "佣金记录", description = "佣金记录")
+public class CommissionRecord extends BaseEntity {
+    @Column(nullable = false)
+    private Long userId;
+
+    @Column(nullable = false)
+    @ApiModelProperty(value = "下级ID", name = "juniorId")
+    private Long juniorId;
+
+    @Column(nullable = false)
+    @ApiModelProperty(value = "订单ID", name = "orderId")
+    private Long orderId;
+
+    @Column(nullable = false, precision = 10, scale = 2)
+    @ApiModelProperty(value = "金额", name = "amount")
+    private BigDecimal amount;
+
+    @Transient
+    private Order order;
+
+    @Transient
+    private JuniorDTO junior;
+}

+ 35 - 0
src/main/java/com/izouma/awesomeAdmin/domain/CommissionStat.java

@@ -0,0 +1,35 @@
+package com.izouma.awesomeAdmin.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+import java.math.BigDecimal;
+
+@Data
+@Table(uniqueConstraints = {@UniqueConstraint(columnNames = {"userId"})})
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class CommissionStat extends BaseEntity {
+
+    private Long userId;
+
+    private int commissionNum;
+
+    private BigDecimal commissionSum;
+
+    private int inviteNum;
+
+    public CommissionStat(Long userId) {
+        this.userId = userId;
+        this.commissionNum = 0;
+        this.commissionSum = BigDecimal.ZERO;
+        this.inviteNum = 0;
+    }
+}

+ 103 - 0
src/main/java/com/izouma/awesomeAdmin/domain/Delegation.java

@@ -0,0 +1,103 @@
+package com.izouma.awesomeAdmin.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.izouma.awesomeAdmin.converter.DurationConverter;
+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.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+import org.hibernate.annotations.Where;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.time.Duration;
+import java.time.LocalDateTime;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "委托", description = "委托")
+@Where(clause = "enabled = 1")
+public class Delegation extends BaseEntity {
+
+    @ApiModelProperty(value = "用户ID", name = "userId")
+    private Long userId;
+
+    @ApiModelProperty(value = "商品ID", name = "productId")
+    private Long productId;
+
+    @ApiModelProperty(value = "卖家订单ID", name = "orderId")
+    private Long sellerOrderId;
+
+    @ApiModelProperty(value = "买家订单ID", name = "orderId")
+    private Long buyerOrderId;
+
+    @Column(precision = 10, scale = 2)
+    @ApiModelProperty(value = "原价", name = "originalPrice")
+    private BigDecimal originalPrice;
+
+    @Column(precision = 10, scale = 2)
+    @ApiModelProperty(value = "最终价", name = "finalPrice")
+    private BigDecimal finalPrice;
+
+    @Column(precision = 10, scale = 2)
+    private BigDecimal capital;
+
+    @Column(precision = 10, scale = 2)
+    private BigDecimal premium;
+
+    @Column(precision = 10, scale = 2)
+    @ApiModelProperty(value = "手续费", name = "serviceCharge")
+    private BigDecimal serviceCharge;
+
+    @Column(precision = 10, scale = 4)
+    @ApiModelProperty(value = "涨价比例", name = "riseRate")
+    private BigDecimal riseRate;
+
+    @Column(nullable = false)
+    @JsonIgnore
+    @ExcelIgnore
+    private Boolean active = true;
+
+    @Column(nullable = false)
+    @JsonIgnore
+    @ExcelIgnore
+    private Boolean enabled = true;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "userId", insertable = false, updatable = false, foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))
+    @NotFound(action = NotFoundAction.IGNORE)
+    @ExcelIgnore
+    private User user;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "sellerOrderId", insertable = false, updatable = false, foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))
+    @NotFound(action = NotFoundAction.IGNORE)
+    @ExcelIgnore
+    private Order sellerOrder;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "buyerOrderId", insertable = false, updatable = false, foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))
+    @NotFound(action = NotFoundAction.IGNORE)
+    @ExcelIgnore
+    private Order buyerOrder;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "productId", insertable = false, updatable = false, foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))
+    @NotFound(action = NotFoundAction.IGNORE)
+    @ExcelIgnore
+    private Product product;
+
+    private Long batchId;
+
+    private boolean delay;
+
+    private LocalDateTime delayTo;
+}

+ 64 - 0
src/main/java/com/izouma/awesomeAdmin/domain/DemoProduct.java

@@ -0,0 +1,64 @@
+package com.izouma.awesomeAdmin.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.izouma.awesomeAdmin.annotations.Searchable;
+import com.izouma.awesomeAdmin.converter.StringArrayConverter;
+import com.izouma.awesomeAdmin.enums.ProductStatus;
+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.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+import org.hibernate.annotations.Where;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@Entity
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ApiModel(value = "演示商品", description = "演示商品")
+public class DemoProduct extends BaseEntity {
+
+    @Searchable
+    @ApiModelProperty(value = "名称", name = "name")
+    private String name;
+
+    @ApiModelProperty(value = "简介", name = "intro")
+    private String intro;
+
+    @Searchable
+    @ApiModelProperty(value = "作者", name = "author")
+    private String author;
+
+    @Lob
+    @Convert(converter = StringArrayConverter.class)
+    @ApiModelProperty(value = "图片", name = "pic")
+    private List<String> pic;
+
+    @Column(precision = 10, scale = 2)
+    @ApiModelProperty(value = "原始价格", name = "originalPrice")
+    private BigDecimal originalPrice;
+
+    @Column(precision = 10, scale = 2)
+    @ApiModelProperty(value = "当前价格", name = "currentPrice")
+    private BigDecimal currentPrice;
+
+    @ApiModelProperty(value = "销量", name = "sales")
+    private Integer sales = 0;
+
+    @ApiModelProperty(value = "分类", name = "category")
+    private Long categoryId;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "categoryId", insertable = false, updatable = false)
+    @NotFound(action = NotFoundAction.IGNORE)
+    private Category category;
+}

+ 46 - 0
src/main/java/com/izouma/awesomeAdmin/domain/FinanceOrder.java

@@ -0,0 +1,46 @@
+package com.izouma.awesomeAdmin.domain;
+
+import com.izouma.awesomeAdmin.dto.RankDTO;
+import com.izouma.awesomeAdmin.enums.FinanceOrderStatus;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.sql.Timestamp;
+import java.time.LocalDateTime;
+
+@Data
+@Table(uniqueConstraints = {
+        @UniqueConstraint(columnNames = {"userId", "productId"})
+})
+@SqlResultSetMapping(name = "rank", classes = {
+        @ConstructorResult(targetClass = RankDTO.class, columns = {
+                @ColumnResult(name = "userId", type = Long.class),
+                @ColumnResult(name = "nickname", type = String.class),
+                @ColumnResult(name = "avatar", type = String.class),
+                @ColumnResult(name = "stake", type = BigDecimal.class),
+                @ColumnResult(name = "money", type = BigDecimal.class)})
+})
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class FinanceOrder extends BaseEntity {
+    private Long userId;
+
+    private Long productId;
+
+    @Column(precision = 19, scale = 2)
+    private BigDecimal stakeAmount;
+
+    @Enumerated(EnumType.STRING)
+    private FinanceOrderStatus status;
+
+    @Column(precision = 19, scale = 2)
+    private BigDecimal profit;
+
+    private LocalDateTime redeemTime;
+}

+ 38 - 0
src/main/java/com/izouma/awesomeAdmin/domain/FinanceProduct.java

@@ -0,0 +1,38 @@
+package com.izouma.awesomeAdmin.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class FinanceProduct extends BaseEntity {
+
+    public enum Status {
+        PENDING, ONGOING, END
+    }
+
+    @Column(precision = 19, scale = 2)
+    private BigDecimal amount;
+
+    private int total;
+
+    private int stock;
+
+    private LocalDateTime startTime;
+
+    private LocalDateTime endTime;
+
+    @Enumerated(EnumType.STRING)
+    @Column(length = 20)
+    private Status status;
+
+}

+ 48 - 0
src/main/java/com/izouma/awesomeAdmin/domain/JuniorContribution.java

@@ -0,0 +1,48 @@
+package com.izouma.awesomeAdmin.domain;
+
+import com.izouma.awesomeAdmin.dto.JuniorDTO;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+import javax.persistence.UniqueConstraint;
+import java.math.BigDecimal;
+
+@Data
+@Table(uniqueConstraints = {@UniqueConstraint(columnNames = {"userId", "juniorId"})})
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("下级贡献佣金统计")
+public class JuniorContribution extends BaseEntity {
+
+    private Long userId;
+
+    private Long juniorId;
+
+    private int orderNum;
+
+    private BigDecimal orderSum;
+
+    private int commissionNum;
+
+    private BigDecimal commissionSum;
+
+    @Transient
+    private JuniorDTO junior;
+
+    public JuniorContribution(Long userId, Long juniorId) {
+        this.userId = userId;
+        this.juniorId = juniorId;
+        this.orderNum = 0;
+        this.orderSum = BigDecimal.ZERO;
+        this.commissionNum = 0;
+        this.commissionSum = BigDecimal.ZERO;
+    }
+}

+ 33 - 0
src/main/java/com/izouma/awesomeAdmin/domain/Menu.java

@@ -0,0 +1,33 @@
+package com.izouma.awesomeAdmin.domain;
+
+import lombok.Data;
+import org.hibernate.annotations.Where;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@Entity
+@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;
+
+    @OneToMany
+    @JoinColumn(name = "parent", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+    List<Menu> children;
+}

+ 139 - 0
src/main/java/com/izouma/awesomeAdmin/domain/Order.java

@@ -0,0 +1,139 @@
+package com.izouma.awesomeAdmin.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.izouma.awesomeAdmin.annotations.Searchable;
+import com.izouma.awesomeAdmin.converter.StringArrayConverter;
+import com.izouma.awesomeAdmin.type.JSONLocalizedString;
+import com.izouma.awesomeAdmin.type.JSONLocalizedStringConverter;
+import com.izouma.awesomeAdmin.enums.OrderStatus;
+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;
+import java.util.List;
+
+@Data
+@Entity(name = "order_info")
+@Table(indexes = {@Index(columnList = "status")})
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "订单", description = "订单")
+public class Order extends BaseEntity {
+
+    @ApiModelProperty(value = "用户ID", name = "userId")
+    private Long userId;
+
+    @ApiModelProperty(value = "原用户ID", name = "fromUserId")
+    private Long fromUserId;
+
+    @ApiModelProperty(value = "卖给", name = "toUserId")
+    private Long toUserId;
+
+    @ApiModelProperty(value = "商品ID", name = "productId")
+    private Long productId;
+
+    @Searchable
+    @ApiModelProperty(value = "名称", name = "name")
+    @Convert(converter = JSONLocalizedStringConverter.class)
+    private JSONLocalizedString name;
+
+    @ApiModelProperty(value = "简介", name = "intro")
+    @Convert(converter = JSONLocalizedStringConverter.class)
+    private JSONLocalizedString intro;
+
+    @Searchable
+    @ApiModelProperty(value = "作者", name = "author")
+    @Convert(converter = JSONLocalizedStringConverter.class)
+    private JSONLocalizedString author;
+
+    @Lob
+    @Convert(converter = StringArrayConverter.class)
+    @ApiModelProperty(value = "图片", name = "pic")
+    private List<String> pic;
+
+    @Column(precision = 10, scale = 2)
+    @ApiModelProperty(value = "价格", name = "price")
+    private BigDecimal totalPrice;
+
+    @Column(precision = 10, scale = 2)
+    private BigDecimal capital;
+
+    @Column(precision = 10, scale = 2)
+    private BigDecimal premium;
+
+    @Column(precision = 10, scale = 2)
+    @ApiModelProperty(value = "出售价格", name = "sellPrice")
+    private BigDecimal sellPrice;
+
+    @ApiModelProperty(value = "收货地址", name = "address")
+    private String address;
+
+    @ApiModelProperty(value = "手机", name = "phone")
+    private String phone;
+
+    @ApiModelProperty(value = "姓名", name = "name")
+    private String contactName;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "状态", name = "status")
+    @Column(length = 20)
+    private OrderStatus status;
+
+    @Column(nullable = false)
+    @ApiModelProperty(value = "已评价", name = "rated")
+    private Boolean rated = false;
+
+    @ApiModelProperty(value = "支付时间", name = "paidTime")
+    private LocalDateTime paidTime;
+
+    @ApiModelProperty(value = "取消时间", name = "cancelTime")
+    private LocalDateTime cancelTime;
+
+    @ApiModelProperty(value = "确认时间", name = "confirmTime")
+    private LocalDateTime confirmTime;
+
+    @ApiModelProperty(value = "托管时间", name = "confirmTime")
+    private LocalDateTime delegateTime;
+
+    @ApiModelProperty(value = "出售时间", name = "soldTime")
+    private LocalDateTime soldTime;
+
+    @ApiModelProperty(value = "发货时间", name = "shipTime")
+    private LocalDateTime shipTime;
+
+    @ApiModelProperty(value = "收货时间", name = "receiveTime")
+    private LocalDateTime receiveTime;
+
+    @ApiModelProperty(value = "物流公司代码", name = "logisticsType")
+    private String logisticsType;
+
+    @ApiModelProperty(value = "物流单号", name = "logisticsNo")
+    private String logisticsNo;
+
+    private boolean createProduct;
+
+    @Transient
+    @ExcelIgnore
+    private User user;
+
+    @Transient
+    @ExcelIgnore
+    private User fromUser;
+
+    @Transient
+    @ExcelIgnore
+    private Product product;
+
+    private boolean locked;
+
+    private boolean del;
+
+    private Long batchId;
+}

+ 40 - 0
src/main/java/com/izouma/awesomeAdmin/domain/OrderRate.java

@@ -0,0 +1,40 @@
+package com.izouma.awesomeAdmin.domain;
+
+import com.izouma.awesomeAdmin.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(value = "评价", description = "评价")
+public class OrderRate extends BaseEntity {
+    private Long userId;
+
+    private Long orderId;
+
+    private Long productId;
+
+    @ApiModelProperty(value = "评价", name = "comment")
+    private String comment;
+
+    @Column(columnDefinition = "text")
+    @Convert(converter = StringArrayConverter.class)
+    @ApiModelProperty(value = "图片", name = "pic")
+    private List<String> pic;
+
+    @Column(name = "show_rate", nullable = false)
+    @ApiModelProperty(value = "显示", name = "show")
+    private Boolean show = false;
+}

+ 111 - 0
src/main/java/com/izouma/awesomeAdmin/domain/Product.java

@@ -0,0 +1,111 @@
+package com.izouma.awesomeAdmin.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.izouma.awesomeAdmin.annotations.Searchable;
+import com.izouma.awesomeAdmin.converter.StringArrayConverter;
+import com.izouma.awesomeAdmin.type.JSONLocalizedString;
+import com.izouma.awesomeAdmin.type.JSONLocalizedStringConverter;
+import com.izouma.awesomeAdmin.enums.ProductStatus;
+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.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+import org.hibernate.annotations.Where;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Where(clause = "enabled = 1")
+@ApiModel(value = "商品", description = "商品")
+public class Product extends BaseEntity {
+
+    @Searchable
+    @ApiModelProperty(value = "名称", name = "name")
+    @Convert(converter = JSONLocalizedStringConverter.class)
+    private JSONLocalizedString name;
+
+    @ApiModelProperty(value = "简介", name = "intro")
+    @Convert(converter = JSONLocalizedStringConverter.class)
+    private JSONLocalizedString intro;
+
+    @Searchable
+    @ApiModelProperty(value = "作者", name = "author")
+    @Convert(converter = JSONLocalizedStringConverter.class)
+    private JSONLocalizedString author;
+
+    @Lob
+    @Convert(converter = StringArrayConverter.class)
+    @ApiModelProperty(value = "图片", name = "pic")
+    private List<String> pic;
+
+    @Column(columnDefinition = "longtext")
+    @Convert(converter = JSONLocalizedStringConverter.class)
+    private JSONLocalizedString detail;
+
+    @Column(precision = 10, scale = 2)
+    @ApiModelProperty(value = "原始价格", name = "originalPrice")
+    private BigDecimal originalPrice;
+
+    @Column(precision = 10, scale = 2)
+    @ApiModelProperty(value = "当前价格", name = "currentPrice")
+    private BigDecimal currentPrice;
+
+    @Column(precision = 10, scale = 2)
+    private BigDecimal capital;
+
+    @Column(precision = 10, scale = 2)
+    private BigDecimal premium;
+
+    @ApiModelProperty(value = "销量", name = "sales")
+    private Integer sales = 0;
+
+    @ApiModelProperty(value = "用户ID", name = "userId")
+    private Long userId;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "状态", name = "status")
+    private ProductStatus status;
+
+    @Column(nullable = false)
+    @JsonIgnore
+    @ExcelIgnore
+    private Boolean enabled = true;
+
+    @ApiModelProperty(value = "分类", name = "category")
+    private Long categoryId;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "categoryId", insertable = false, updatable = false)
+    @NotFound(action = NotFoundAction.IGNORE)
+    private Category category;
+
+    @ApiModelProperty(value = "委托ID", name = "delegationId")
+    private Long delegationId;
+
+    @Column(nullable = false)
+    @ApiModelProperty(value = "商品池", name = "reserve")
+    private Boolean reserve;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "userId", insertable = false, updatable = false, foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))
+    @NotFound(action = NotFoundAction.IGNORE)
+    private User user;
+
+    private boolean locked;
+
+    private Long batchId;
+
+    private LocalDateTime delayTo;
+}

+ 38 - 0
src/main/java/com/izouma/awesomeAdmin/domain/RechargeOrder.java

@@ -0,0 +1,38 @@
+package com.izouma.awesomeAdmin.domain;
+
+
+import com.izouma.awesomeAdmin.annotations.Searchable;
+import com.izouma.awesomeAdmin.enums.RechargeOrderStatus;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class RechargeOrder extends BaseEntityNoID {
+    @Id
+    @GenericGenerator(name = "custom-id", strategy = "com.izouma.awesomeAdmin.utils.SnowflakeIdGenerator")
+    @GeneratedValue(strategy = GenerationType.AUTO, generator = "custom-id")
+    private Long id;
+
+    @Searchable
+    private Long userId;
+
+    @Column(precision = 19, scale = 2)
+    private BigDecimal amount;
+
+    @Enumerated(EnumType.STRING)
+    @Column(length = 20)
+    private RechargeOrderStatus status;
+
+    private String channel;
+
+}

+ 49 - 0
src/main/java/com/izouma/awesomeAdmin/domain/SaleBatch.java

@@ -0,0 +1,49 @@
+package com.izouma.awesomeAdmin.domain;
+
+import com.izouma.awesomeAdmin.converter.DurationConverter;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.boot.convert.PeriodFormat;
+import org.springframework.boot.convert.PeriodStyle;
+
+import javax.persistence.Convert;
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+import java.math.BigDecimal;
+import java.time.Duration;
+import java.time.LocalTime;
+import java.time.Period;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class SaleBatch extends BaseEntity {
+
+    private String name;
+
+    private Boolean enabled;
+
+    private LocalTime saleStart;
+
+    private LocalTime saleEnd;
+
+    private LocalTime delegateStart;
+
+    private LocalTime delegateEnd;
+
+    private BigDecimal riseRate;
+
+    private String cover;
+
+    @Transient
+    private boolean hidden;
+
+    private boolean delayDelegate;
+
+    @Convert(converter = DurationConverter.class)
+    private Duration delayDuration;
+}

+ 32 - 0
src/main/java/com/izouma/awesomeAdmin/domain/SmsRecord.java

@@ -0,0 +1,32 @@
+package com.izouma.awesomeAdmin.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 java.time.LocalDateTime;
+
+@Data
+@Entity
+@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;
+}

+ 26 - 0
src/main/java/com/izouma/awesomeAdmin/domain/SubAccount.java

@@ -0,0 +1,26 @@
+package com.izouma.awesomeAdmin.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 SubAccount extends BaseEntity {
+
+    private String name;
+
+    private String domain;
+
+    private String username;
+
+    private String password;
+}

+ 44 - 0
src/main/java/com/izouma/awesomeAdmin/domain/SysConfig.java

@@ -0,0 +1,44 @@
+package com.izouma.awesomeAdmin.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.repository.NoRepositoryBean;
+
+import javax.persistence.*;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class SysConfig extends AuditedEntity {
+    @Id
+    @Column(length = 25, unique = true)
+    @ApiModelProperty(value = "名称", name = "name")
+    private String name;
+
+    @Column(name = "description")
+    @ApiModelProperty(value = "描述", name = "desc")
+    private String desc;
+
+    @ApiModelProperty(value = "值", name = "value")
+    private String value;
+
+    @Enumerated(EnumType.STRING)
+    private ValueType type;
+
+    private String options;
+
+    public enum ValueType {
+        STRING,
+        TIME,
+        DATE,
+        DATETIME,
+        BOOLEAN,
+        NUMBER,
+        SELECT
+    }
+}

+ 72 - 0
src/main/java/com/izouma/awesomeAdmin/domain/TrialOrder.java

@@ -0,0 +1,72 @@
+package com.izouma.awesomeAdmin.domain;
+
+import com.izouma.awesomeAdmin.annotations.Searchable;
+import com.izouma.awesomeAdmin.converter.StringArrayConverter;
+import com.izouma.awesomeAdmin.enums.OrderStatus;
+import com.izouma.awesomeAdmin.type.JSONLocalizedString;
+import com.izouma.awesomeAdmin.type.JSONLocalizedStringConverter;
+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.Lob;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class TrialOrder extends BaseEntity {
+
+    private Long productId;
+
+    private Long userId;
+
+    private OrderStatus status;
+
+    @Searchable
+    @ApiModelProperty(value = "名称", name = "name")
+    @Convert(converter = JSONLocalizedStringConverter.class)
+    private JSONLocalizedString name;
+
+    @ApiModelProperty(value = "简介", name = "intro")
+    @Convert(converter = JSONLocalizedStringConverter.class)
+    private JSONLocalizedString intro;
+
+    @Searchable
+    @ApiModelProperty(value = "作者", name = "author")
+    @Convert(converter = JSONLocalizedStringConverter.class)
+    private JSONLocalizedString author;
+
+    @Lob
+    @Convert(converter = StringArrayConverter.class)
+    @ApiModelProperty(value = "图片", name = "pic")
+    private List<String> pic;
+
+    @Column(precision = 10, scale = 2)
+    @ApiModelProperty(value = "价格", name = "price")
+    private BigDecimal totalPrice;
+
+    @ApiModelProperty(value = "支付时间", name = "paidTime")
+    private LocalDateTime paidTime;
+
+    @ApiModelProperty(value = "取消时间", name = "cancelTime")
+    private LocalDateTime cancelTime;
+
+    @ApiModelProperty(value = "确认时间", name = "confirmTime")
+    private LocalDateTime confirmTime;
+
+    @ApiModelProperty(value = "托管时间", name = "confirmTime")
+    private LocalDateTime delegateTime;
+
+    @ApiModelProperty(value = "出售时间", name = "soldTime")
+    private LocalDateTime soldTime;
+}

+ 67 - 0
src/main/java/com/izouma/awesomeAdmin/domain/TrialProduct.java

@@ -0,0 +1,67 @@
+package com.izouma.awesomeAdmin.domain;
+
+
+import com.izouma.awesomeAdmin.annotations.Searchable;
+import com.izouma.awesomeAdmin.converter.StringArrayConverter;
+import com.izouma.awesomeAdmin.enums.ProductStatus;
+import com.izouma.awesomeAdmin.type.JSONLocalizedString;
+import com.izouma.awesomeAdmin.type.JSONLocalizedStringConverter;
+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
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class TrialProduct extends BaseEntity {
+
+    @Searchable
+    @ApiModelProperty(value = "名称", name = "name")
+    @Convert(converter = JSONLocalizedStringConverter.class)
+    private JSONLocalizedString name;
+
+    @ApiModelProperty(value = "简介", name = "intro")
+    @Convert(converter = JSONLocalizedStringConverter.class)
+    private JSONLocalizedString intro;
+
+    @Searchable
+    @ApiModelProperty(value = "作者", name = "author")
+    @Convert(converter = JSONLocalizedStringConverter.class)
+    private JSONLocalizedString author;
+
+    @Lob
+    @Convert(converter = StringArrayConverter.class)
+    @ApiModelProperty(value = "图片", name = "pic")
+    private List<String> pic;
+
+    @Column(columnDefinition = "longtext")
+    @Convert(converter = JSONLocalizedStringConverter.class)
+    private JSONLocalizedString detail;
+
+    @Column(precision = 10, scale = 2)
+    @ApiModelProperty(value = "原始价格", name = "originalPrice")
+    private BigDecimal originalPrice;
+
+    @Column(precision = 10, scale = 2)
+    @ApiModelProperty(value = "当前价格", name = "currentPrice")
+    private BigDecimal currentPrice;
+
+    @ApiModelProperty(value = "销量", name = "sales")
+    private Integer sales = 0;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "状态", name = "status")
+    private ProductStatus status;
+
+    @ApiModelProperty(value = "分类", name = "category")
+    private Long categoryId;
+
+}

+ 125 - 0
src/main/java/com/izouma/awesomeAdmin/domain/User.java

@@ -0,0 +1,125 @@
+package com.izouma.awesomeAdmin.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonView;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.izouma.awesomeAdmin.annotations.Searchable;
+import com.izouma.awesomeAdmin.config.Constants;
+import com.izouma.awesomeAdmin.converter.UserAuthoritySerializer;
+import com.izouma.awesomeAdmin.dto.RankDTO;
+import com.izouma.awesomeAdmin.security.Authority;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+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.io.Serializable;
+import java.math.BigDecimal;
+import java.util.HashSet;
+import java.util.Set;
+
+@Data
+@Entity
+@Table(uniqueConstraints = {@UniqueConstraint(columnNames = {"nickname"})},
+        indexes = {@Index(columnList = "nickname"), @Index(columnList = "createdAt")}
+)
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Where(clause = "enabled = 1")
+@ApiModel(value = "用户", description = "用户")
+@JsonView(User.View.Basic.class)
+public class User extends BaseEntity implements Serializable {
+
+    public interface View {
+        interface Basic {
+        }
+
+        interface Detail {
+        }
+    }
+
+    @Size(min = 1, max = 50)
+    @Column(nullable = false, unique = true)
+    @Searchable
+    private String username;
+
+    @Searchable
+    @Column(nullable = false, unique = true, length = 128)
+    private String nickname;
+
+    private String avatar;
+
+    @JsonView(View.Detail.class)
+    private String password;
+
+    @Column(nullable = false)
+    private Boolean enabled = true;
+
+    @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.DETACH})
+    @JoinTable(
+            name = "user_authority",
+            joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))},
+            inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "name", foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))})
+    @BatchSize(size = 20)
+    @ExcelIgnore
+    @JsonSerialize(using = UserAuthoritySerializer.class, as = HashSet.class)
+    private Set<Authority> authorities = new HashSet<>();
+
+    private String openId;
+
+    private String sex;
+
+    private String language;
+
+    private String city;
+
+    private String province;
+
+    private String country;
+
+    @Searchable
+    private String phone;
+
+    private String email;
+
+    private Long superiorId;
+
+    @Column(precision = 10, scale = 2, nullable = false)
+    private BigDecimal money;
+
+    private String aliAccount;
+
+    private String aliName;
+
+    @JsonProperty
+    public boolean getHasPassword() {
+        return StringUtils.isNotEmpty(password);
+    }
+
+    private String alipayUserId;
+
+    private boolean banned;
+
+    @Column(columnDefinition = "int(11) default 3")
+    private int maxOrderCount = 4;
+
+    @Column(columnDefinition = "int(11) default 0")
+    private int complainNum = 0;
+
+    private int juniorCount = 0;
+
+    @Transient
+    private boolean newRegister = false;
+
+    private boolean paid;
+}

+ 49 - 0
src/main/java/com/izouma/awesomeAdmin/domain/UserBalance.java

@@ -0,0 +1,49 @@
+
+package com.izouma.awesomeAdmin.domain;
+
+import com.izouma.awesomeAdmin.annotations.Searchable;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import java.math.BigDecimal;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserBalance extends BaseEntityNoID {
+    @Id
+    @Searchable
+    private Long userId;
+
+    @Column(precision = 19, scale = 2)
+    private BigDecimal balance;
+
+    @Column(precision = 19, scale = 2)
+    private BigDecimal lastBalance;
+
+    @Column(precision = 19, scale = 2)
+    private BigDecimal feeFreeAllowances;
+
+    @Column(precision = 19, scale = 2)
+    private BigDecimal rechargeAccumulation;
+
+    @Column(precision = 19, scale = 2)
+    private BigDecimal withdrawAccumulation;
+
+    @Column(precision = 19, scale = 2)
+    private BigDecimal profitAccumulation;
+
+    public UserBalance(Long userId) {
+        this.userId = userId;
+        this.balance = BigDecimal.ZERO;
+        this.lastBalance = BigDecimal.ZERO;
+        this.feeFreeAllowances = BigDecimal.ZERO;
+        this.rechargeAccumulation = BigDecimal.ZERO;
+        this.withdrawAccumulation = BigDecimal.ZERO;
+    }
+}

+ 43 - 0
src/main/java/com/izouma/awesomeAdmin/domain/UserBankCard.java

@@ -0,0 +1,43 @@
+package com.izouma.awesomeAdmin.domain;
+
+import com.izouma.awesomeAdmin.annotations.Searchable;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.annotation.Nonnull;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserBankCard extends BaseEntity {
+
+    @Searchable
+    private Long userId;
+
+    @Nonnull
+    @Searchable
+    private String name;
+
+    @Nonnull
+    private String mail;
+
+    @Nonnull
+    @Searchable
+    private String phone;
+
+    @Nonnull
+    private String bankName;
+
+    @Nonnull
+    private String bankCode;
+
+    @Nonnull
+    @Searchable
+    private String account;
+
+    private boolean del;
+}

+ 25 - 0
src/main/java/com/izouma/awesomeAdmin/domain/UserCollection.java

@@ -0,0 +1,25 @@
+package com.izouma.awesomeAdmin.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.Table;
+import javax.persistence.UniqueConstraint;
+
+@Data
+@Entity
+@Table(uniqueConstraints = @UniqueConstraint(columnNames = {"userId", "productId"}))
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "收藏", description = "收藏")
+public class UserCollection extends BaseEntity {
+
+    private Long userId;
+
+    private Long productId;
+}

+ 37 - 0
src/main/java/com/izouma/awesomeAdmin/domain/UserMoneyRecord.java

@@ -0,0 +1,37 @@
+package com.izouma.awesomeAdmin.domain;
+
+import com.izouma.awesomeAdmin.enums.MoneyRecordType;
+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;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class UserMoneyRecord extends BaseEntity {
+    private Long userId;
+
+    @Column(precision = 10, scale = 2, nullable = false)
+    private BigDecimal modify;
+
+    @Column(precision = 10, scale = 2, nullable = false)
+    private BigDecimal balance;
+
+    private Long juniorId;
+
+    private Long orderId;
+
+    @Enumerated(EnumType.STRING)
+    private MoneyRecordType type;
+
+    private String remark;
+}

+ 58 - 0
src/main/java/com/izouma/awesomeAdmin/domain/WithdrawApply.java

@@ -0,0 +1,58 @@
+package com.izouma.awesomeAdmin.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.izouma.awesomeAdmin.enums.WithdrawStatus;
+import com.izouma.awesomeAdmin.security.Authority;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.BatchSize;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.util.HashSet;
+import java.util.Set;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class WithdrawApply extends BaseEntity {
+    @Column(nullable = false)
+    @ApiModelProperty(value = "用户ID", name = "userId")
+    private Long userId;
+
+    @Column(nullable = false, precision = 10, scale = 2)
+    @ApiModelProperty(value = "金额", name = "amount")
+    private BigDecimal amount;
+
+    @Column(nullable = false, precision = 10, scale = 2)
+    private BigDecimal feeFreeAllowances;
+
+    @Column(nullable = false, precision = 10, scale = 2)
+    private BigDecimal feeRate;
+
+    @Column(nullable = false, precision = 10, scale = 2)
+    private BigDecimal feeAmount;
+
+    @Column(nullable = false)
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "状态", name = "status")
+    private WithdrawStatus status;
+
+    private String txId;
+
+    private String remark;
+
+    @Transient
+    private UserBankCard userBankCard;
+
+    private String channel;
+
+    private boolean separateFee = false;
+}

+ 55 - 0
src/main/java/com/izouma/awesomeAdmin/domain/WorkOrder.java

@@ -0,0 +1,55 @@
+package com.izouma.awesomeAdmin.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.izouma.awesomeAdmin.annotations.Searchable;
+import com.izouma.awesomeAdmin.converter.StringArrayConverter;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(description = "工单", value = "工单")
+public class WorkOrder extends BaseEntity {
+    @Searchable
+    private Long userId;
+
+    @Searchable
+    private Long orderId;
+
+    private String title;
+
+    private String detail;
+
+    private String remark;
+
+    private Boolean complete;
+
+    private String action;
+
+    @Convert(converter = StringArrayConverter.class)
+    @Column(columnDefinition = "TEXT(1000)")
+    private List<String> pics;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "userId", insertable = false, updatable = false, foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))
+    @NotFound(action = NotFoundAction.IGNORE)
+    @ExcelIgnore
+    private User user;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "orderId", insertable = false, updatable = false, foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))
+    @NotFound(action = NotFoundAction.IGNORE)
+    @ExcelIgnore
+    private Order order;
+}

+ 30 - 0
src/main/java/com/izouma/awesomeAdmin/dto/CommissionDetail.java

@@ -0,0 +1,30 @@
+package com.izouma.awesomeAdmin.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "佣金明细", description = "佣金明细")
+public class CommissionDetail {
+    @ApiModelProperty(value = "总计", name = "total")
+    private BigDecimal total;
+
+    @ApiModelProperty(value = "已提现", name = "withdraw")
+    private BigDecimal withdraw;
+
+    @ApiModelProperty(value = "可提现", name = "available")
+    private BigDecimal available;
+
+    @ApiModelProperty(value = "待收货", name = "notChecked")
+    private BigDecimal notChecked;
+
+}

+ 43 - 0
src/main/java/com/izouma/awesomeAdmin/dto/CommissionOrder.java

@@ -0,0 +1,43 @@
+package com.izouma.awesomeAdmin.dto;
+
+import com.izouma.awesomeAdmin.type.JSONLocalizedString;
+import com.izouma.awesomeAdmin.type.JSONLocalizedStringConverter;
+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.Convert;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("分销订单")
+public class CommissionOrder {
+    @ApiModelProperty(value = "订单ID", name = "orderId")
+    private Long orderId;
+
+    @ApiModelProperty(value = "下单时间", name = "createdAt")
+    private LocalDateTime createdAt;
+
+    @ApiModelProperty(value = "下级ID", name = "juniorId")
+    private Long juniorId;
+
+    @ApiModelProperty(value = "佣金", name = "commission")
+    private BigDecimal commission;
+
+    @ApiModelProperty(value = "图片", name = "pic")
+    private String pic;
+
+    @ApiModelProperty(value = "名称", name = "name")
+    @Convert(converter = JSONLocalizedStringConverter.class)
+    private JSONLocalizedString name;
+
+    @ApiModelProperty(value = "价格", name = "price")
+    private BigDecimal price;
+}

+ 35 - 0
src/main/java/com/izouma/awesomeAdmin/dto/CommissionOverview.java

@@ -0,0 +1,35 @@
+package com.izouma.awesomeAdmin.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "分销概览", description = "分销概览")
+public class CommissionOverview {
+    @ApiModelProperty(value = "总计", name = "total")
+    private BigDecimal total;
+
+    @ApiModelProperty(value = "已提现", name = "withdraw")
+    private BigDecimal withdraw;
+
+    @ApiModelProperty(value = "可提现", name = "available")
+    private BigDecimal available;
+
+    @ApiModelProperty(value = "分销订单数", name = "orderCount")
+    private Integer orderCount;
+
+    @ApiModelProperty(value = "下线人数", name = "juniorCount")
+    private Integer juniorCount;
+
+    @ApiModelProperty(value = "上级", name = "superior")
+    private String superior;
+}

+ 25 - 0
src/main/java/com/izouma/awesomeAdmin/dto/DailySales.java

@@ -0,0 +1,25 @@
+package com.izouma.awesomeAdmin.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class DailySales {
+    private LocalDate date;
+
+    private BigDecimal order;
+
+    private BigDecimal delegation;
+
+    private BigDecimal commission;
+
+    private BigDecimal recharge;
+}

+ 32 - 0
src/main/java/com/izouma/awesomeAdmin/dto/JuniorDTO.java

@@ -0,0 +1,32 @@
+package com.izouma.awesomeAdmin.dto;
+
+import com.izouma.awesomeAdmin.domain.User;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "下级", description = "下级")
+public class JuniorDTO {
+    private String nickname;
+
+    private String avatar;
+
+    private LocalDateTime createdAt;
+
+    private BigDecimal commission;
+
+    public JuniorDTO(User user) {
+        this.nickname = user.getNickname();
+        this.avatar = user.getAvatar();
+        this.createdAt = user.getCreatedAt();
+    }
+}

+ 13 - 0
src/main/java/com/izouma/awesomeAdmin/dto/LoginDTO.java

@@ -0,0 +1,13 @@
+package com.izouma.awesomeAdmin.dto;
+
+import com.izouma.awesomeAdmin.domain.User;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class LoginDTO {
+    private String  token;
+    private User    user;
+    private boolean newRegister;
+}

+ 35 - 0
src/main/java/com/izouma/awesomeAdmin/dto/OrderDTO.java

@@ -0,0 +1,35 @@
+package com.izouma.awesomeAdmin.dto;
+
+import com.izouma.awesomeAdmin.enums.OrderStatus;
+import com.izouma.awesomeAdmin.type.JSONLocalizedString;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "订单", description = "订单")
+public class OrderDTO {
+    private Long orderId;
+
+    private String nickname;
+
+    private String avatar;
+
+    private JSONLocalizedString name;
+
+    private String pic;
+
+    private BigDecimal price;
+
+    private LocalDateTime createdAt;
+
+    private OrderStatus status;
+}

+ 48 - 0
src/main/java/com/izouma/awesomeAdmin/dto/OrderDetailDTO.java

@@ -0,0 +1,48 @@
+package com.izouma.awesomeAdmin.dto;
+
+import com.izouma.awesomeAdmin.domain.Order;
+import com.izouma.awesomeAdmin.domain.User;
+import com.izouma.awesomeAdmin.enums.OrderStatus;
+
+import javax.persistence.JoinColumn;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+public interface OrderDetailDTO {
+    Long getUserId();
+
+    Long getFromUserId();
+
+    Long productId();
+
+    BigDecimal getTotalPrice();
+
+    String getAddress();
+
+    String getPhone();
+
+    String getName();
+
+    OrderStatus getStatus();
+
+    Boolean getRated();
+
+    LocalDateTime getPaidTime();
+
+    LocalDateTime getConfirmTime();
+
+    LocalDateTime getDelegateTime();
+
+    LocalDateTime getSoldTime();
+
+    LocalDateTime getShipTime();
+
+    LocalDateTime getReceiveTime();
+
+    String getLogisticsType();
+
+    String getLogisticsNo();
+
+    @JoinColumn(name = "userId")
+    User getUser();
+}

+ 34 - 0
src/main/java/com/izouma/awesomeAdmin/dto/OrderUser.java

@@ -0,0 +1,34 @@
+package com.izouma.awesomeAdmin.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class OrderUser {
+    private Long userId;
+
+    private String nickname;
+
+    private String username;
+
+    private String avatar;
+
+    private String superiorName;
+
+    private int juniorNum;
+
+    private BigDecimal totalCommission;
+
+    private BigDecimal totalOrder;
+
+    private int maxOrderCount;
+
+    private int complainNum;
+}

+ 17 - 0
src/main/java/com/izouma/awesomeAdmin/dto/PageQuery.java

@@ -0,0 +1,17 @@
+package com.izouma.awesomeAdmin.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class PageQuery {
+    private int                 page  = 0;
+    private int                 size  = 20;
+    private String              sort;
+    private String              search;
+    private Map<String, Object> query = new HashMap<>();
+}

+ 32 - 0
src/main/java/com/izouma/awesomeAdmin/dto/PageWrapper.java

@@ -0,0 +1,32 @@
+package com.izouma.awesomeAdmin.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.PageRequest;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class PageWrapper<T> {
+    private List<T> content;
+
+    private int page;
+
+    private int size;
+
+    private long total;
+
+    public Page<T> toPage() {
+        return new PageImpl<>(content, PageRequest.of(page, size), total);
+    }
+
+    public static <T> PageWrapper<T> of(Page<T> page) {
+        return new PageWrapper<>(page.getContent(), page.getPageable().getPageNumber(),
+                page.getPageable().getPageSize(), page.getTotalElements());
+    }
+}

+ 24 - 0
src/main/java/com/izouma/awesomeAdmin/dto/PerformanceStat.java

@@ -0,0 +1,24 @@
+package com.izouma.awesomeAdmin.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.domain.Page;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "业绩统计", description = "业绩统计")
+public class PerformanceStat {
+    private BigDecimal totalAmount;
+
+    private int orderCount;
+
+    private Page<OrderDTO> orders;
+}

+ 62 - 0
src/main/java/com/izouma/awesomeAdmin/dto/RankDTO.java

@@ -0,0 +1,62 @@
+package com.izouma.awesomeAdmin.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.NamedNativeQueries;
+import javax.persistence.NamedNativeQuery;
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "排名信息", description = "排名信息")
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(value = {"hibernateLazyInitializer"}, ignoreUnknown = true)
+public class RankDTO {
+    private Long userId;
+
+    private String nickname;
+
+    private String avatar;
+
+    private BigDecimal money;
+
+    private int rank;
+
+    private BigDecimal withdrawAccumulation;
+
+    private BigDecimal roi;
+
+    private int juniorCount;
+
+    private BigDecimal stake;
+
+    public RankDTO(Long userId, String nickname, String avatar, BigDecimal money) {
+        this.userId = userId;
+        this.nickname = nickname;
+        this.avatar = avatar;
+        this.money = money;
+    }
+
+    public RankDTO(Long userId, String nickname, String avatar, long juniorCount) {
+        this.userId = userId;
+        this.nickname = nickname;
+        this.avatar = avatar;
+        this.juniorCount = (int) juniorCount;
+    }
+
+    public RankDTO(Long userId, String nickname, String avatar, BigDecimal stake, BigDecimal money) {
+        this.userId = userId;
+        this.nickname = nickname;
+        this.avatar = avatar;
+        this.stake = stake;
+        this.money = money;
+    }
+}

+ 22 - 0
src/main/java/com/izouma/awesomeAdmin/dto/UserCollectionDTO.java

@@ -0,0 +1,22 @@
+package com.izouma.awesomeAdmin.dto;
+
+import com.izouma.awesomeAdmin.domain.Product;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class UserCollectionDTO {
+    private Long          id;
+    private Long          userId;
+    private Long          productId;
+    private LocalDateTime createdAt;
+    private Product       product;
+}
+

+ 72 - 0
src/main/java/com/izouma/awesomeAdmin/dto/UserOrderDTO.java

@@ -0,0 +1,72 @@
+package com.izouma.awesomeAdmin.dto;
+
+import com.izouma.awesomeAdmin.domain.Product;
+import com.izouma.awesomeAdmin.domain.User;
+import com.izouma.awesomeAdmin.enums.OrderStatus;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class UserOrderDTO {
+    private Long id;
+
+    private Long userId;
+
+    private Long fromUserId;
+
+    private Long productId;
+
+    private BigDecimal totalPrice;
+
+    private BigDecimal sellPrice;
+
+    private String address;
+
+    private String phone;
+
+    private String name;
+
+    private OrderStatus status;
+
+    private Boolean rated = false;
+
+    private LocalDateTime paidTime;
+
+    private LocalDateTime cancelTime;
+
+    private LocalDateTime confirmTime;
+
+    private LocalDateTime delegateTime;
+
+    private LocalDateTime soldTime;
+
+    private LocalDateTime shipTime;
+
+    private LocalDateTime receiveTime;
+
+    private String logisticsType;
+
+    private String logisticsNo;
+
+    private Product productInfo;
+
+    private User fromUserInfo;
+
+    private LocalDateTime createdAt;
+
+    private boolean locked;
+
+    private Long batchId;
+}

+ 39 - 0
src/main/java/com/izouma/awesomeAdmin/dto/WithdrawApplyDetail.java

@@ -0,0 +1,39 @@
+package com.izouma.awesomeAdmin.dto;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.izouma.awesomeAdmin.domain.CommissionRecord;
+import com.izouma.awesomeAdmin.enums.WithdrawStatus;
+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.HashSet;
+import java.util.List;
+import java.util.Set;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "提现详情", description = "提现详情")
+public class WithdrawApplyDetail {
+    @ApiModelProperty(value = "用户ID", name = "userId")
+    private Long userId;
+
+    @ApiModelProperty(value = "金额", name = "amount")
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "审核金额", name = "auditAmount")
+    private BigDecimal auditAmount;
+
+    @ApiModelProperty(value = "状态", name = "status")
+    private WithdrawStatus status;
+
+    @ApiModelProperty(value = "订单", name = "订单")
+    private List<CommissionOrder> commissionOrders;
+}

+ 354 - 0
src/main/java/com/izouma/awesomeAdmin/dto/gen/GenCode.java

@@ -0,0 +1,354 @@
+package com.izouma.awesomeAdmin.dto.gen;
+
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+import java.util.List;
+
+/**
+ * gen_code_model 实体类
+ * Fri May 04 15:57:06 CST 2018  Suo Chen Cheng
+ */
+@JsonAutoDetect
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class GenCode {
+
+    /**
+     * id
+     */
+    private Integer id;
+
+    /**
+     * 表名
+     */
+    private String tableName;
+
+    /**
+     * 类名
+     */
+    private String className;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 是否生成表
+     */
+    private Boolean genTable;
+
+    /**
+     * 是否生成类
+     */
+    private Boolean genClass;
+
+    /**
+     * 是否生成列表页面
+     */
+    private Boolean genList;
+
+    /**
+     * 是否生成表单页面
+     */
+    private Boolean genForm;
+
+    /**
+     * 是否生成路由
+     */
+    private Boolean genRouter;
+
+    /**
+     * 字段表id
+     */
+    private String fieldId;
+
+    /**
+     * java生成路径
+     */
+    private String javaPath;
+
+    /**
+     * vue生成路径
+     */
+    private String viewPath;
+
+    /**
+     * 路由生成路径
+     */
+    private String routerPath;
+
+    /**
+     * resources生成路径
+     */
+    private String resourcesPath;
+
+    /**
+     * 数据库类型:Mysql/SqlServer
+     */
+    private String dataBaseType;
+
+    private List<TableField> fields;    // 表字段
+    private TableField primaryField; //主键字段
+
+    private Boolean readTable;
+
+    /**
+     * 数据库CODE,使用什么数据源S
+     */
+    private String dataSourceCode;
+
+    /**
+     * 生成代码的JSON Str
+     */
+    private String genJson;
+
+    private String searchKey;
+
+    private String delFlag;
+
+    private String typeFlag;
+
+    private List<Subtable> subtables;
+
+    private boolean update;
+
+    private String basePackage;//基础包路径
+
+    private String tablePackage;//对象的包名
+
+    private String genPackage;//子包名
+
+
+    public List<TableField> getFields() {
+        return fields;
+    }
+
+    public void setFields(List<TableField> fields) {
+        this.fields = fields;
+    }
+
+    public TableField getPrimaryField() {
+        return primaryField;
+    }
+
+    public void setPrimaryField(TableField primaryField) {
+        this.primaryField = primaryField;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setTableName(String tableName) {
+        this.tableName = tableName;
+    }
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setGenTable(Boolean genTable) {
+        this.genTable = genTable;
+    }
+
+    public Boolean getGenTable() {
+        return genTable;
+    }
+
+    public void setGenClass(Boolean genClass) {
+        this.genClass = genClass;
+    }
+
+    public Boolean getGenClass() {
+        return genClass;
+    }
+
+    public void setGenList(Boolean genList) {
+        this.genList = genList;
+    }
+
+    public Boolean getGenList() {
+        return genList;
+    }
+
+    public void setGenForm(Boolean genForm) {
+        this.genForm = genForm;
+    }
+
+    public Boolean getGenForm() {
+        return genForm;
+    }
+
+    public void setFieldId(String fieldId) {
+        this.fieldId = fieldId;
+    }
+
+    public String getFieldId() {
+        return fieldId;
+    }
+
+    public String getJavaPath() {
+        return javaPath;
+    }
+
+    public void setJavaPath(String javaPath) {
+        this.javaPath = javaPath;
+    }
+
+    public String getViewPath() {
+        return viewPath;
+    }
+
+    public void setViewPath(String viewPath) {
+        this.viewPath = viewPath;
+    }
+
+    public String getDataBaseType() {
+        return dataBaseType;
+    }
+
+    public void setDataBaseType(String dataBaseType) {
+        this.dataBaseType = dataBaseType;
+    }
+
+    public Boolean getReadTable() {
+        return readTable;
+    }
+
+    public void setReadTable(Boolean readTable) {
+        this.readTable = readTable;
+    }
+
+    public String getRouterPath() {
+        return routerPath;
+    }
+
+    public void setRouterPath(String routerPath) {
+        this.routerPath = routerPath;
+    }
+
+    public Boolean getGenRouter() {
+        return genRouter;
+    }
+
+    public void setGenRouter(Boolean genRouter) {
+        this.genRouter = genRouter;
+    }
+
+    public String getDataSourceCode() {
+        return dataSourceCode;
+    }
+
+    public void setDataSourceCode(String dataSourceCode) {
+        this.dataSourceCode = dataSourceCode;
+    }
+
+    public String getGenJson() {
+        return genJson;
+    }
+
+    public void setGenJson(String genJson) {
+        this.genJson = genJson;
+    }
+
+    public String getSearchKey() {
+        return searchKey;
+    }
+
+    public void setSearchKey(String searchKey) {
+        this.searchKey = searchKey;
+    }
+
+    public String getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(String delFlag) {
+        this.delFlag = delFlag;
+    }
+
+    public String getTypeFlag() {
+        return typeFlag;
+    }
+
+    public void setTypeFlag(String typeFlag) {
+        this.typeFlag = typeFlag;
+    }
+
+    public List<Subtable> getSubtables() {
+        return subtables;
+    }
+
+    public void setSubtables(List<Subtable> subtables) {
+        this.subtables = subtables;
+    }
+
+    public boolean getUpdate() {
+        return update;
+    }
+
+    public void setUpdate(boolean update) {
+        this.update = update;
+    }
+
+    public String getResourcesPath() {
+        return resourcesPath;
+    }
+
+    public void setResourcesPath(String resourcesPath) {
+        this.resourcesPath = resourcesPath;
+    }
+
+    public boolean isUpdate() {
+        return update;
+    }
+
+    public String getBasePackage() {
+        return basePackage;
+    }
+
+    public void setBasePackage(String basePackage) {
+        this.basePackage = basePackage;
+    }
+
+    public String getTablePackage() {
+        return tablePackage;
+    }
+
+    public void setTablePackage(String tablePackage) {
+        this.tablePackage = tablePackage;
+    }
+
+    public String getGenPackage() {
+        return genPackage;
+    }
+
+    public void setGenPackage(String genPackage) {
+        this.genPackage = genPackage;
+    }
+}
+

+ 55 - 0
src/main/java/com/izouma/awesomeAdmin/dto/gen/Subtable.java

@@ -0,0 +1,55 @@
+package com.izouma.awesomeAdmin.dto.gen;
+
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+/**
+ * table_field 实体类
+ * Fri May 04 13:38:24 CST 2018  Suo Chen Cheng
+ */
+@JsonAutoDetect
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class Subtable {
+
+    private String name;
+
+    private String column;
+
+    private String subColumn;
+
+    private String subCode;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getColumn() {
+        return column;
+    }
+
+    public void setColumn(String column) {
+        this.column = column;
+    }
+
+    public String getSubColumn() {
+        return subColumn;
+    }
+
+    public void setSubColumn(String subColumn) {
+        this.subColumn = subColumn;
+    }
+
+    public String getSubCode() {
+        return subCode;
+    }
+
+    public void setSubCode(String subCode) {
+        this.subCode = subCode;
+    }
+}
+

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است