张延森 il y a 4 ans
révision
8813234ccc
29 fichiers modifiés avec 1814 ajouts et 0 suppressions
  1. 33
    0
      .gitignore
  2. 310
    0
      mvnw
  3. 182
    0
      mvnw.cmd
  4. 205
    0
      pom.xml
  5. 16
    0
      src/main/java/com/yunzhi/demo/SpringApplication.java
  6. 4
    0
      src/main/java/com/yunzhi/demo/common/BaseController.java
  7. 17
    0
      src/main/java/com/yunzhi/demo/common/EncryptUtils.java
  8. 26
    0
      src/main/java/com/yunzhi/demo/common/ExcelUtils.java
  9. 93
    0
      src/main/java/com/yunzhi/demo/common/JWTUtils.java
  10. 68
    0
      src/main/java/com/yunzhi/demo/common/OSSUtils.java
  11. 67
    0
      src/main/java/com/yunzhi/demo/common/ResponseBean.java
  12. 145
    0
      src/main/java/com/yunzhi/demo/common/SMSCaptcha.java
  13. 71
    0
      src/main/java/com/yunzhi/demo/common/SMSUtils.java
  14. 120
    0
      src/main/java/com/yunzhi/demo/common/StringUtils.java
  15. 34
    0
      src/main/java/com/yunzhi/demo/common/WxUtils.java
  16. 39
    0
      src/main/java/com/yunzhi/demo/config/AliyunConfig.java
  17. 35
    0
      src/main/java/com/yunzhi/demo/config/BaseConfig.java
  18. 34
    0
      src/main/java/com/yunzhi/demo/config/InterceptorConfig.java
  19. 14
    0
      src/main/java/com/yunzhi/demo/config/MybatisPlusConfig.java
  20. 24
    0
      src/main/java/com/yunzhi/demo/config/SwagggerConfig.java
  21. 24
    0
      src/main/java/com/yunzhi/demo/config/WeixinConfig.java
  22. 67
    0
      src/main/java/com/yunzhi/demo/controller/LoginController.java
  23. 19
    0
      src/main/java/com/yunzhi/demo/exception/GlobalExceptionHandler.java
  24. 57
    0
      src/main/java/com/yunzhi/demo/interceptor/PermissionInterceptor.java
  25. 16
    0
      src/main/java/com/yunzhi/demo/vo/LoginParam.java
  26. 16
    0
      src/main/resources/application-dev.yml
  27. 10
    0
      src/main/resources/application-prod.yml
  28. 55
    0
      src/main/resources/application.yml
  29. 13
    0
      src/test/java/com/yunzhi/demo/SpringApplicationTests.java

+ 33
- 0
.gitignore Voir le fichier

@@ -0,0 +1,33 @@
1
+HELP.md
2
+target/
3
+!.mvn/wrapper/maven-wrapper.jar
4
+!**/src/main/**/target/
5
+!**/src/test/**/target/
6
+
7
+### STS ###
8
+.apt_generated
9
+.classpath
10
+.factorypath
11
+.project
12
+.settings
13
+.springBeans
14
+.sts4-cache
15
+
16
+### IntelliJ IDEA ###
17
+.idea
18
+*.iws
19
+*.iml
20
+*.ipr
21
+
22
+### NetBeans ###
23
+/nbproject/private/
24
+/nbbuild/
25
+/dist/
26
+/nbdist/
27
+/.nb-gradle/
28
+build/
29
+!**/src/main/**/build/
30
+!**/src/test/**/build/
31
+
32
+### VS Code ###
33
+.vscode/

+ 310
- 0
mvnw Voir le fichier

@@ -0,0 +1,310 @@
1
+#!/bin/sh
2
+# ----------------------------------------------------------------------------
3
+# Licensed to the Apache Software Foundation (ASF) under one
4
+# or more contributor license agreements.  See the NOTICE file
5
+# distributed with this work for additional information
6
+# regarding copyright ownership.  The ASF licenses this file
7
+# to you under the Apache License, Version 2.0 (the
8
+# "License"); you may not use this file except in compliance
9
+# with the License.  You may obtain a copy of the License at
10
+#
11
+#    https://www.apache.org/licenses/LICENSE-2.0
12
+#
13
+# Unless required by applicable law or agreed to in writing,
14
+# software distributed under the License is distributed on an
15
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
+# KIND, either express or implied.  See the License for the
17
+# specific language governing permissions and limitations
18
+# under the License.
19
+# ----------------------------------------------------------------------------
20
+
21
+# ----------------------------------------------------------------------------
22
+# Maven Start Up Batch script
23
+#
24
+# Required ENV vars:
25
+# ------------------
26
+#   JAVA_HOME - location of a JDK home dir
27
+#
28
+# Optional ENV vars
29
+# -----------------
30
+#   M2_HOME - location of maven2's installed home dir
31
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
32
+#     e.g. to debug Maven itself, use
33
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
34
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
35
+# ----------------------------------------------------------------------------
36
+
37
+if [ -z "$MAVEN_SKIP_RC" ] ; then
38
+
39
+  if [ -f /etc/mavenrc ] ; then
40
+    . /etc/mavenrc
41
+  fi
42
+
43
+  if [ -f "$HOME/.mavenrc" ] ; then
44
+    . "$HOME/.mavenrc"
45
+  fi
46
+
47
+fi
48
+
49
+# OS specific support.  $var _must_ be set to either true or false.
50
+cygwin=false;
51
+darwin=false;
52
+mingw=false
53
+case "`uname`" in
54
+  CYGWIN*) cygwin=true ;;
55
+  MINGW*) mingw=true;;
56
+  Darwin*) darwin=true
57
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
58
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
59
+    if [ -z "$JAVA_HOME" ]; then
60
+      if [ -x "/usr/libexec/java_home" ]; then
61
+        export JAVA_HOME="`/usr/libexec/java_home`"
62
+      else
63
+        export JAVA_HOME="/Library/Java/Home"
64
+      fi
65
+    fi
66
+    ;;
67
+esac
68
+
69
+if [ -z "$JAVA_HOME" ] ; then
70
+  if [ -r /etc/gentoo-release ] ; then
71
+    JAVA_HOME=`java-config --jre-home`
72
+  fi
73
+fi
74
+
75
+if [ -z "$M2_HOME" ] ; then
76
+  ## resolve links - $0 may be a link to maven's home
77
+  PRG="$0"
78
+
79
+  # need this for relative symlinks
80
+  while [ -h "$PRG" ] ; do
81
+    ls=`ls -ld "$PRG"`
82
+    link=`expr "$ls" : '.*-> \(.*\)$'`
83
+    if expr "$link" : '/.*' > /dev/null; then
84
+      PRG="$link"
85
+    else
86
+      PRG="`dirname "$PRG"`/$link"
87
+    fi
88
+  done
89
+
90
+  saveddir=`pwd`
91
+
92
+  M2_HOME=`dirname "$PRG"`/..
93
+
94
+  # make it fully qualified
95
+  M2_HOME=`cd "$M2_HOME" && pwd`
96
+
97
+  cd "$saveddir"
98
+  # echo Using m2 at $M2_HOME
99
+fi
100
+
101
+# For Cygwin, ensure paths are in UNIX format before anything is touched
102
+if $cygwin ; then
103
+  [ -n "$M2_HOME" ] &&
104
+    M2_HOME=`cygpath --unix "$M2_HOME"`
105
+  [ -n "$JAVA_HOME" ] &&
106
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
107
+  [ -n "$CLASSPATH" ] &&
108
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
109
+fi
110
+
111
+# For Mingw, ensure paths are in UNIX format before anything is touched
112
+if $mingw ; then
113
+  [ -n "$M2_HOME" ] &&
114
+    M2_HOME="`(cd "$M2_HOME"; pwd)`"
115
+  [ -n "$JAVA_HOME" ] &&
116
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
117
+fi
118
+
119
+if [ -z "$JAVA_HOME" ]; then
120
+  javaExecutable="`which javac`"
121
+  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
122
+    # readlink(1) is not available as standard on Solaris 10.
123
+    readLink=`which readlink`
124
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
125
+      if $darwin ; then
126
+        javaHome="`dirname \"$javaExecutable\"`"
127
+        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
128
+      else
129
+        javaExecutable="`readlink -f \"$javaExecutable\"`"
130
+      fi
131
+      javaHome="`dirname \"$javaExecutable\"`"
132
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
133
+      JAVA_HOME="$javaHome"
134
+      export JAVA_HOME
135
+    fi
136
+  fi
137
+fi
138
+
139
+if [ -z "$JAVACMD" ] ; then
140
+  if [ -n "$JAVA_HOME"  ] ; then
141
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
142
+      # IBM's JDK on AIX uses strange locations for the executables
143
+      JAVACMD="$JAVA_HOME/jre/sh/java"
144
+    else
145
+      JAVACMD="$JAVA_HOME/bin/java"
146
+    fi
147
+  else
148
+    JAVACMD="`which java`"
149
+  fi
150
+fi
151
+
152
+if [ ! -x "$JAVACMD" ] ; then
153
+  echo "Error: JAVA_HOME is not defined correctly." >&2
154
+  echo "  We cannot execute $JAVACMD" >&2
155
+  exit 1
156
+fi
157
+
158
+if [ -z "$JAVA_HOME" ] ; then
159
+  echo "Warning: JAVA_HOME environment variable is not set."
160
+fi
161
+
162
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
163
+
164
+# traverses directory structure from process work directory to filesystem root
165
+# first directory with .mvn subdirectory is considered project base directory
166
+find_maven_basedir() {
167
+
168
+  if [ -z "$1" ]
169
+  then
170
+    echo "Path not specified to find_maven_basedir"
171
+    return 1
172
+  fi
173
+
174
+  basedir="$1"
175
+  wdir="$1"
176
+  while [ "$wdir" != '/' ] ; do
177
+    if [ -d "$wdir"/.mvn ] ; then
178
+      basedir=$wdir
179
+      break
180
+    fi
181
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
182
+    if [ -d "${wdir}" ]; then
183
+      wdir=`cd "$wdir/.."; pwd`
184
+    fi
185
+    # end of workaround
186
+  done
187
+  echo "${basedir}"
188
+}
189
+
190
+# concatenates all lines of a file
191
+concat_lines() {
192
+  if [ -f "$1" ]; then
193
+    echo "$(tr -s '\n' ' ' < "$1")"
194
+  fi
195
+}
196
+
197
+BASE_DIR=`find_maven_basedir "$(pwd)"`
198
+if [ -z "$BASE_DIR" ]; then
199
+  exit 1;
200
+fi
201
+
202
+##########################################################################################
203
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
204
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
205
+##########################################################################################
206
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
207
+    if [ "$MVNW_VERBOSE" = true ]; then
208
+      echo "Found .mvn/wrapper/maven-wrapper.jar"
209
+    fi
210
+else
211
+    if [ "$MVNW_VERBOSE" = true ]; then
212
+      echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
213
+    fi
214
+    if [ -n "$MVNW_REPOURL" ]; then
215
+      jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
216
+    else
217
+      jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
218
+    fi
219
+    while IFS="=" read key value; do
220
+      case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
221
+      esac
222
+    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
223
+    if [ "$MVNW_VERBOSE" = true ]; then
224
+      echo "Downloading from: $jarUrl"
225
+    fi
226
+    wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
227
+    if $cygwin; then
228
+      wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
229
+    fi
230
+
231
+    if command -v wget > /dev/null; then
232
+        if [ "$MVNW_VERBOSE" = true ]; then
233
+          echo "Found wget ... using wget"
234
+        fi
235
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
236
+            wget "$jarUrl" -O "$wrapperJarPath"
237
+        else
238
+            wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
239
+        fi
240
+    elif command -v curl > /dev/null; then
241
+        if [ "$MVNW_VERBOSE" = true ]; then
242
+          echo "Found curl ... using curl"
243
+        fi
244
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
245
+            curl -o "$wrapperJarPath" "$jarUrl" -f
246
+        else
247
+            curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
248
+        fi
249
+
250
+    else
251
+        if [ "$MVNW_VERBOSE" = true ]; then
252
+          echo "Falling back to using Java to download"
253
+        fi
254
+        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
255
+        # For Cygwin, switch paths to Windows format before running javac
256
+        if $cygwin; then
257
+          javaClass=`cygpath --path --windows "$javaClass"`
258
+        fi
259
+        if [ -e "$javaClass" ]; then
260
+            if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
261
+                if [ "$MVNW_VERBOSE" = true ]; then
262
+                  echo " - Compiling MavenWrapperDownloader.java ..."
263
+                fi
264
+                # Compiling the Java class
265
+                ("$JAVA_HOME/bin/javac" "$javaClass")
266
+            fi
267
+            if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
268
+                # Running the downloader
269
+                if [ "$MVNW_VERBOSE" = true ]; then
270
+                  echo " - Running MavenWrapperDownloader.java ..."
271
+                fi
272
+                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
273
+            fi
274
+        fi
275
+    fi
276
+fi
277
+##########################################################################################
278
+# End of extension
279
+##########################################################################################
280
+
281
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
282
+if [ "$MVNW_VERBOSE" = true ]; then
283
+  echo $MAVEN_PROJECTBASEDIR
284
+fi
285
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
286
+
287
+# For Cygwin, switch paths to Windows format before running java
288
+if $cygwin; then
289
+  [ -n "$M2_HOME" ] &&
290
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
291
+  [ -n "$JAVA_HOME" ] &&
292
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
293
+  [ -n "$CLASSPATH" ] &&
294
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
295
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
296
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
297
+fi
298
+
299
+# Provide a "standardized" way to retrieve the CLI args that will
300
+# work with both Windows and non-Windows executions.
301
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
302
+export MAVEN_CMD_LINE_ARGS
303
+
304
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
305
+
306
+exec "$JAVACMD" \
307
+  $MAVEN_OPTS \
308
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
309
+  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
310
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

+ 182
- 0
mvnw.cmd Voir le fichier

@@ -0,0 +1,182 @@
1
+@REM ----------------------------------------------------------------------------
2
+@REM Licensed to the Apache Software Foundation (ASF) under one
3
+@REM or more contributor license agreements.  See the NOTICE file
4
+@REM distributed with this work for additional information
5
+@REM regarding copyright ownership.  The ASF licenses this file
6
+@REM to you under the Apache License, Version 2.0 (the
7
+@REM "License"); you may not use this file except in compliance
8
+@REM with the License.  You may obtain a copy of the License at
9
+@REM
10
+@REM    https://www.apache.org/licenses/LICENSE-2.0
11
+@REM
12
+@REM Unless required by applicable law or agreed to in writing,
13
+@REM software distributed under the License is distributed on an
14
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+@REM KIND, either express or implied.  See the License for the
16
+@REM specific language governing permissions and limitations
17
+@REM under the License.
18
+@REM ----------------------------------------------------------------------------
19
+
20
+@REM ----------------------------------------------------------------------------
21
+@REM Maven Start Up Batch script
22
+@REM
23
+@REM Required ENV vars:
24
+@REM JAVA_HOME - location of a JDK home dir
25
+@REM
26
+@REM Optional ENV vars
27
+@REM M2_HOME - location of maven2's installed home dir
28
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
29
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
30
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
31
+@REM     e.g. to debug Maven itself, use
32
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
33
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
34
+@REM ----------------------------------------------------------------------------
35
+
36
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
37
+@echo off
38
+@REM set title of command window
39
+title %0
40
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
41
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
42
+
43
+@REM set %HOME% to equivalent of $HOME
44
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
45
+
46
+@REM Execute a user defined script before this one
47
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
48
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
49
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
50
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
51
+:skipRcPre
52
+
53
+@setlocal
54
+
55
+set ERROR_CODE=0
56
+
57
+@REM To isolate internal variables from possible post scripts, we use another setlocal
58
+@setlocal
59
+
60
+@REM ==== START VALIDATION ====
61
+if not "%JAVA_HOME%" == "" goto OkJHome
62
+
63
+echo.
64
+echo Error: JAVA_HOME not found in your environment. >&2
65
+echo Please set the JAVA_HOME variable in your environment to match the >&2
66
+echo location of your Java installation. >&2
67
+echo.
68
+goto error
69
+
70
+:OkJHome
71
+if exist "%JAVA_HOME%\bin\java.exe" goto init
72
+
73
+echo.
74
+echo Error: JAVA_HOME is set to an invalid directory. >&2
75
+echo JAVA_HOME = "%JAVA_HOME%" >&2
76
+echo Please set the JAVA_HOME variable in your environment to match the >&2
77
+echo location of your Java installation. >&2
78
+echo.
79
+goto error
80
+
81
+@REM ==== END VALIDATION ====
82
+
83
+:init
84
+
85
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
86
+@REM Fallback to current working directory if not found.
87
+
88
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
89
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
90
+
91
+set EXEC_DIR=%CD%
92
+set WDIR=%EXEC_DIR%
93
+:findBaseDir
94
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
95
+cd ..
96
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
97
+set WDIR=%CD%
98
+goto findBaseDir
99
+
100
+:baseDirFound
101
+set MAVEN_PROJECTBASEDIR=%WDIR%
102
+cd "%EXEC_DIR%"
103
+goto endDetectBaseDir
104
+
105
+:baseDirNotFound
106
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
107
+cd "%EXEC_DIR%"
108
+
109
+:endDetectBaseDir
110
+
111
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
112
+
113
+@setlocal EnableExtensions EnableDelayedExpansion
114
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
115
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
116
+
117
+:endReadAdditionalConfig
118
+
119
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
120
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
121
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
122
+
123
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
124
+
125
+FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
126
+    IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
127
+)
128
+
129
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
130
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
131
+if exist %WRAPPER_JAR% (
132
+    if "%MVNW_VERBOSE%" == "true" (
133
+        echo Found %WRAPPER_JAR%
134
+    )
135
+) else (
136
+    if not "%MVNW_REPOURL%" == "" (
137
+        SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
138
+    )
139
+    if "%MVNW_VERBOSE%" == "true" (
140
+        echo Couldn't find %WRAPPER_JAR%, downloading it ...
141
+        echo Downloading from: %DOWNLOAD_URL%
142
+    )
143
+
144
+    powershell -Command "&{"^
145
+		"$webclient = new-object System.Net.WebClient;"^
146
+		"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
147
+		"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
148
+		"}"^
149
+		"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
150
+		"}"
151
+    if "%MVNW_VERBOSE%" == "true" (
152
+        echo Finished downloading %WRAPPER_JAR%
153
+    )
154
+)
155
+@REM End of extension
156
+
157
+@REM Provide a "standardized" way to retrieve the CLI args that will
158
+@REM work with both Windows and non-Windows executions.
159
+set MAVEN_CMD_LINE_ARGS=%*
160
+
161
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
162
+if ERRORLEVEL 1 goto error
163
+goto end
164
+
165
+:error
166
+set ERROR_CODE=1
167
+
168
+:end
169
+@endlocal & set ERROR_CODE=%ERROR_CODE%
170
+
171
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
172
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
173
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
174
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
175
+:skipRcPost
176
+
177
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
178
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
179
+
180
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
181
+
182
+exit /B %ERROR_CODE%

+ 205
- 0
pom.xml Voir le fichier

@@ -0,0 +1,205 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4
+	<modelVersion>4.0.0</modelVersion>
5
+	<parent>
6
+		<groupId>org.springframework.boot</groupId>
7
+		<artifactId>spring-boot-starter-parent</artifactId>
8
+		<version>2.3.2.RELEASE</version>
9
+		<relativePath/> <!-- lookup parent from repository -->
10
+	</parent>
11
+	<groupId>com.yunzhi</groupId>
12
+	<artifactId>serivce-template</artifactId>
13
+	<version>0.0.1-SNAPSHOT</version>
14
+	<name>demo</name>
15
+	<description>Demo project for Spring Boot</description>
16
+
17
+	<properties>
18
+		<java.version>1.8</java.version>
19
+	</properties>
20
+
21
+	<dependencies>
22
+		<dependency>
23
+			<groupId>org.springframework.boot</groupId>
24
+			<artifactId>spring-boot-starter-web</artifactId>
25
+		</dependency>
26
+
27
+		<dependency>
28
+			<groupId>org.springframework.boot</groupId>
29
+			<artifactId>spring-boot-starter-test</artifactId>
30
+			<scope>test</scope>
31
+			<exclusions>
32
+				<exclusion>
33
+					<groupId>org.junit.vintage</groupId>
34
+					<artifactId>junit-vintage-engine</artifactId>
35
+				</exclusion>
36
+			</exclusions>
37
+		</dependency>
38
+
39
+		<!--mysql start-->
40
+		<dependency>
41
+			<groupId>mysql</groupId>
42
+			<artifactId>mysql-connector-java</artifactId>
43
+			<scope>runtime</scope>
44
+		</dependency>
45
+		<!--mysql end-->
46
+
47
+		<!--mybatis-plus start-->
48
+		<dependency>
49
+			<groupId>com.baomidou</groupId>
50
+			<artifactId>mybatis-plus-boot-starter</artifactId>
51
+			<version>3.1.1</version>
52
+		</dependency>
53
+		<!--mybatis-plus end-->
54
+
55
+		<!--fastjson start-->
56
+		<dependency>
57
+			<groupId>com.alibaba</groupId>
58
+			<artifactId>fastjson</artifactId>
59
+			<version>1.2.56</version>
60
+		</dependency>
61
+		<!--fastjson end-->
62
+
63
+		<!--jwt start-->
64
+		<dependency>
65
+			<groupId>io.jsonwebtoken</groupId>
66
+			<artifactId>jjwt-api</artifactId>
67
+			<version>0.11.2</version>
68
+		</dependency>
69
+		<dependency>
70
+			<groupId>io.jsonwebtoken</groupId>
71
+			<artifactId>jjwt-impl</artifactId>
72
+			<version>0.11.2</version>
73
+			<scope>runtime</scope>
74
+		</dependency>
75
+		<dependency>
76
+			<groupId>io.jsonwebtoken</groupId>
77
+			<artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred -->
78
+			<version>0.11.2</version>
79
+			<scope>runtime</scope>
80
+		</dependency>
81
+		<!--jwt end-->
82
+
83
+		<!--oss start-->
84
+		<dependency>
85
+			<groupId>com.aliyun.oss</groupId>
86
+			<artifactId>aliyun-sdk-oss</artifactId>
87
+			<version>2.8.3</version>
88
+		</dependency>
89
+		<!--oss end-->
90
+
91
+		<dependency>
92
+			<groupId>com.aliyun</groupId>
93
+			<artifactId>aliyun-java-sdk-core</artifactId>
94
+			<version>[4.4.9,5.0.0)</version>
95
+		</dependency>
96
+
97
+		<!--excel start-->
98
+		<dependency>
99
+			<groupId>com.alibaba</groupId>
100
+			<artifactId>easyexcel</artifactId>
101
+			<version>2.0.4</version>
102
+		</dependency>
103
+		<!--excel end-->
104
+
105
+		<!--weixin-miniapp start-->
106
+		<dependency>
107
+			<groupId>com.github.binarywang</groupId>
108
+			<artifactId>weixin-java-miniapp</artifactId>
109
+			<version>3.8.0</version>
110
+		</dependency>
111
+		<!--weixin-miniapp start-->
112
+
113
+		<!--lombok start-->
114
+		<dependency>
115
+			<groupId>org.projectlombok</groupId>
116
+			<artifactId>lombok</artifactId>
117
+			<optional>true</optional>
118
+		</dependency>
119
+		<!--lombok end-->
120
+
121
+		<!--swagger start-->
122
+		<dependency>
123
+			<groupId>io.springfox</groupId>
124
+			<artifactId>springfox-boot-starter</artifactId>
125
+			<version>3.0.0</version>
126
+		</dependency>
127
+		<!--swagger end-->
128
+	</dependencies>
129
+
130
+	<profiles>
131
+		<profile>
132
+			<id>dev</id>
133
+			<properties>
134
+				<profileActive>dev</profileActive>
135
+			</properties>
136
+			<activation>
137
+				<activeByDefault>true</activeByDefault>
138
+			</activation>
139
+
140
+			<build>
141
+				<plugins>
142
+					<plugin>
143
+						<groupId>org.springframework.boot</groupId>
144
+						<artifactId>spring-boot-maven-plugin</artifactId>
145
+					</plugin>
146
+				</plugins>
147
+				<resources>
148
+					<resource>
149
+						<directory>src/main/resources</directory>
150
+						<filtering>true</filtering>
151
+					</resource>
152
+				</resources>
153
+			</build>
154
+		</profile>
155
+
156
+		<profile>
157
+			<id>prod</id>
158
+			<properties>
159
+				<profileActive>prod</profileActive>
160
+			</properties>
161
+			<activation>
162
+				<activeByDefault>false</activeByDefault>
163
+			</activation>
164
+
165
+			<build>
166
+				<plugins>
167
+					<plugin>
168
+						<groupId>org.springframework.boot</groupId>
169
+						<artifactId>spring-boot-maven-plugin</artifactId>
170
+					</plugin>
171
+
172
+					<!-- 跳过测试 -->
173
+					<plugin>
174
+						<groupId>org.apache.maven.plugins</groupId>
175
+						<artifactId>maven-surefire-plugin</artifactId>
176
+						<configuration>
177
+							<skipTests>true</skipTests>
178
+							<testFailureIgnore>true</testFailureIgnore>
179
+						</configuration>
180
+					</plugin>
181
+				</plugins>
182
+				<resources>
183
+					<resource>
184
+						<directory>src/main/resources</directory>
185
+						<filtering>true</filtering>
186
+						<excludes>
187
+							<exclude>application.yml</exclude>
188
+							<exclude>application-*.yml</exclude>
189
+						</excludes>
190
+					</resource>
191
+					<resource>
192
+						<directory>src/main/resources</directory>
193
+						<filtering>true</filtering>
194
+						<includes>
195
+							<include>application.yml</include>
196
+							<include>application-${profileActive}.yml</include>
197
+						</includes>
198
+						<targetPath>${project.build.directory}/config</targetPath>
199
+					</resource>
200
+				</resources>
201
+			</build>
202
+		</profile>
203
+	</profiles>
204
+
205
+</project>

+ 16
- 0
src/main/java/com/yunzhi/demo/SpringApplication.java Voir le fichier

@@ -0,0 +1,16 @@
1
+package com.yunzhi.demo;
2
+
3
+import org.springframework.boot.autoconfigure.SpringBootApplication;
4
+import org.springframework.scheduling.annotation.EnableAsync;
5
+import org.springframework.transaction.annotation.EnableTransactionManagement;
6
+
7
+@EnableAsync
8
+@EnableTransactionManagement
9
+@SpringBootApplication
10
+public class SpringApplication {
11
+
12
+	public static void main(String[] args) {
13
+		org.springframework.boot.SpringApplication.run(SpringApplication.class, args);
14
+	}
15
+
16
+}

+ 4
- 0
src/main/java/com/yunzhi/demo/common/BaseController.java Voir le fichier

@@ -0,0 +1,4 @@
1
+package com.yunzhi.demo.common;
2
+
3
+public class BaseController {
4
+}

+ 17
- 0
src/main/java/com/yunzhi/demo/common/EncryptUtils.java Voir le fichier

@@ -0,0 +1,17 @@
1
+package com.yunzhi.demo.common;
2
+
3
+import org.springframework.util.DigestUtils;
4
+
5
+public class EncryptUtils {
6
+
7
+    public static String md5(String str, String ...slats) {
8
+        String slat = "";
9
+        if (null != slats && slats.length > 0) {
10
+            slat = slats[0];
11
+        }
12
+
13
+        String base = str + slat;
14
+        String md5 = DigestUtils.md5DigestAsHex(base.getBytes());
15
+        return md5;
16
+    }
17
+}

+ 26
- 0
src/main/java/com/yunzhi/demo/common/ExcelUtils.java Voir le fichier

@@ -0,0 +1,26 @@
1
+package com.yunzhi.demo.common;
2
+
3
+import com.alibaba.excel.EasyExcel;
4
+
5
+import javax.servlet.http.HttpServletResponse;
6
+import java.io.IOException;
7
+import java.util.List;
8
+
9
+public class ExcelUtils {
10
+
11
+    /**
12
+     * 发送 excel 到客户端
13
+     * 暂时只支持单 sheet 页
14
+     * @param response
15
+     * @param data
16
+     * @param fileName
17
+     * @throws IOException
18
+     */
19
+    public static void flush(HttpServletResponse response, Class dataClass, List data, String fileName) throws IOException {
20
+        response.setContentType("application/vnd.ms-excel");
21
+        response.setCharacterEncoding("utf-8");
22
+        response.setHeader("Content-disposition", "attachment;filename="+StringUtils.urlEncode(fileName)+".xlsx");
23
+
24
+        EasyExcel.write(response.getOutputStream(), dataClass).sheet("sheet1").doWrite(data);
25
+    }
26
+}

+ 93
- 0
src/main/java/com/yunzhi/demo/common/JWTUtils.java Voir le fichier

@@ -0,0 +1,93 @@
1
+package com.yunzhi.demo.common;
2
+
3
+import io.jsonwebtoken.Claims;
4
+import io.jsonwebtoken.Jws;
5
+import io.jsonwebtoken.Jwts;
6
+import io.jsonwebtoken.security.Keys;
7
+import lombok.extern.slf4j.Slf4j;
8
+
9
+import javax.crypto.SecretKey;
10
+import javax.servlet.http.HttpServletRequest;
11
+import javax.servlet.http.HttpServletResponse;
12
+import java.time.LocalDateTime;
13
+import java.time.ZoneId;
14
+import java.util.Base64;
15
+import java.util.Date;
16
+import java.util.Map;
17
+
18
+/**
19
+ * JWTUtils
20
+ * jwt 辅助类
21
+ * https://github.com/jwtk/jjwt
22
+ */
23
+@Slf4j
24
+public class JWTUtils {
25
+
26
+    // 过期时间 5 分钟
27
+    static final long EXPIRE_TIME = 5 * 60;
28
+
29
+    // 私钥
30
+    static final SecretKey SECRET_KEY = Keys.hmacShaKeyFor(Base64.getEncoder().encode("Yansen is so handsome. He is a good man. Everyone like him !!!".getBytes()));
31
+
32
+    // 请求头
33
+    public static final String AUTH_HEADER = "X-Authorization-JWT";
34
+
35
+    /**
36
+     * 生成 token, claims 里必须要有 userId
37
+     * @param claims
38
+     * @return
39
+     */
40
+    public static String encode(Map<String, Object> claims) {
41
+        Date[] datePair = getDatePair();
42
+        Date iat = datePair[0];
43
+        Date exp = datePair[1];
44
+
45
+        return Jwts.builder().setIssuer(claims.get("userId").toString()).setIssuedAt(iat).setExpiration(exp).addClaims(claims).signWith(SECRET_KEY).compact();
46
+    }
47
+
48
+    public static Map<String, Object> decode(String token) throws Exception {
49
+        return parse(token);
50
+    }
51
+
52
+    public static String refresh(String token) {
53
+        try {
54
+            Claims claims = parse(token);
55
+            return encode(claims);
56
+        } catch (Exception e) {
57
+            log.error("解析 JWT Token 失败: {}", e.getMessage());
58
+        }
59
+        return null;
60
+    }
61
+
62
+    public static void refresh(String jws, HttpServletResponse response) {
63
+        if (!StringUtils.isEmpty(jws)) {
64
+            String token =  refresh(jws);
65
+            response.addHeader(AUTH_HEADER, token);
66
+        }
67
+    }
68
+
69
+    public static String getToken(HttpServletRequest request) {
70
+        return request.getHeader(AUTH_HEADER);
71
+    }
72
+
73
+    public static void verify(String token) throws Exception {
74
+        parse(token);
75
+    }
76
+
77
+    private static Date[] getDatePair() {
78
+        LocalDateTime now = LocalDateTime.now();
79
+        Date iat = Date.from(now.atZone(ZoneId.systemDefault()).toInstant());
80
+        Date exp = Date.from(now.plusSeconds(EXPIRE_TIME).atZone(ZoneId.systemDefault()).toInstant());
81
+        return new Date[]{iat, exp};
82
+    }
83
+
84
+    private static Claims parse(String token) throws Exception {
85
+        if (token == null || "".equals(token)) {
86
+            throw new Exception("Token 不能为空");
87
+        }
88
+
89
+        long skew = 5;
90
+        Jws<Claims> claimsJws = Jwts.parserBuilder().setAllowedClockSkewSeconds(skew).setSigningKey(SECRET_KEY).build().parseClaimsJws(token);
91
+        return claimsJws.getBody();
92
+    }
93
+}

+ 68
- 0
src/main/java/com/yunzhi/demo/common/OSSUtils.java Voir le fichier

@@ -0,0 +1,68 @@
1
+package com.yunzhi.demo.common;
2
+
3
+import com.aliyun.oss.OSSClient;
4
+import com.yunzhi.demo.config.AliyunConfig;
5
+import org.springframework.beans.factory.annotation.Autowired;
6
+import org.springframework.stereotype.Component;
7
+import org.springframework.web.multipart.MultipartFile;
8
+
9
+import java.io.*;
10
+
11
+@Component
12
+public class OSSUtils {
13
+
14
+    @Autowired
15
+    AliyunConfig aliyunConfig;
16
+
17
+    /**
18
+     * 上传文件
19
+     * @param mf 上传的文件
20
+     * @param toDirs 上传到的目录
21
+     * @return
22
+     */
23
+    public String putObject(MultipartFile mf, String ... toDirs) throws IOException {
24
+        String fName = formatFileName(mf.getOriginalFilename());
25
+        String preFix = String.valueOf(System.currentTimeMillis());
26
+        String toDir = "/";
27
+        if (null != toDirs && toDirs.length > 0) {
28
+            toDir = toDirs[0];
29
+        }
30
+        String nwFName = toDir + preFix + "-" + fName;
31
+        nwFName = StringUtils.trim(nwFName,"/");
32
+
33
+        return putFile(nwFName, new ByteArrayInputStream(mf.getBytes()));
34
+    }
35
+
36
+    public String putObject(File f, String ... toDirs) throws FileNotFoundException {
37
+        String fName = formatFileName(f.getName());
38
+        String preFix = String.valueOf(System.currentTimeMillis());
39
+        String toDir = "/";
40
+        if (null != toDirs && toDirs.length > 0) {
41
+            toDir = toDirs[0];
42
+        }
43
+        String nwFName = toDir + preFix + "-" + fName;
44
+        nwFName = StringUtils.trim(nwFName,"/");
45
+
46
+        InputStream inputStream = new FileInputStream(f);
47
+        return putFile(nwFName, inputStream);
48
+    }
49
+
50
+    private String formatFileName(String fName) {
51
+        return StringUtils.ifNull(fName, StringUtils.random(16) + ".png");
52
+    }
53
+
54
+    private String putFile(String fname, InputStream input) {
55
+        OSSClient ossClient = new OSSClient(aliyunConfig.getOss().getEndpoint(), aliyunConfig.getAccessKeyId(), aliyunConfig.getAccessKeySecret());
56
+        ossClient.putObject(aliyunConfig.getOss().getBucketName(), fname, input);
57
+        ossClient.shutdown();
58
+
59
+        // String url = ossClient.generatePresignedUrl(AliOSSUtils.oss.getBucketName(), fname, expiration).toString();
60
+
61
+        String preURL = aliyunConfig.getOss().getBucketURL();
62
+        if (!preURL.endsWith("/")) {
63
+            preURL += "/";
64
+        }
65
+
66
+        return preURL + fname.replaceAll("\\ ", "%20");
67
+    }
68
+}

+ 67
- 0
src/main/java/com/yunzhi/demo/common/ResponseBean.java Voir le fichier

@@ -0,0 +1,67 @@
1
+package com.yunzhi.demo.common;
2
+
3
+import java.io.Serializable;
4
+
5
+/**
6
+ * 接口统一状态返回BEAN.
7
+ */
8
+public class ResponseBean<T> implements Serializable {
9
+
10
+    private static final long serialVersionUID = 3593827217136880822L;
11
+
12
+    public static final int CODE_SUCCESS = 1000;
13
+    public static final int ERROR_AUTH_FAIL = 1001;
14
+    public static final int ERROR_AUTH_EXPIRED = 1002;
15
+    public static final int ERROR_MISSING_PARAMS = 1003;
16
+    public static final int ERROR_ILLEGAL_PARAMS = 1004;
17
+    public static final int ERROR_UNAVAILABLE = 1005;
18
+
19
+    private int code;
20
+    private String message;
21
+    private T data;
22
+
23
+    public ResponseBean() {
24
+        code = ResponseBean.CODE_SUCCESS;
25
+    }
26
+
27
+    public static <T> ResponseBean success(T data, String ...msgs) {
28
+        ResponseBean responseBean = new ResponseBean();
29
+        responseBean.code = ResponseBean.CODE_SUCCESS;
30
+        responseBean.data = data;
31
+
32
+        if (null != msgs && msgs.length > 0) {
33
+            responseBean.message = msgs[0];
34
+        }
35
+
36
+        return responseBean;
37
+    }
38
+
39
+    public static <T> ResponseBean error(String msg, int code, T ...datas) {
40
+        ResponseBean responseBean = new ResponseBean();
41
+        responseBean.code = code;
42
+        responseBean.message = msg;
43
+
44
+        if (null != datas && datas.length > 0) {
45
+            responseBean.data = datas[0];
46
+        }
47
+
48
+        return responseBean;
49
+    }
50
+
51
+    public int getCode() {
52
+        return code;
53
+    }
54
+
55
+    public String getMessage() {
56
+        return message;
57
+    }
58
+
59
+    public T getData() {
60
+        return data;
61
+    }
62
+    
63
+    @Override
64
+    public String toString() {
65
+        return  "{ code: "+code+", message: "+message+", data: <T> }";
66
+    }
67
+}

+ 145
- 0
src/main/java/com/yunzhi/demo/common/SMSCaptcha.java Voir le fichier

@@ -0,0 +1,145 @@
1
+package com.yunzhi.demo.common;
2
+
3
+import com.yunzhi.demo.config.AliyunConfig;
4
+import lombok.Data;
5
+import lombok.experimental.Accessors;
6
+import lombok.extern.slf4j.Slf4j;
7
+import org.springframework.beans.factory.annotation.Autowired;
8
+import org.springframework.scheduling.annotation.EnableScheduling;
9
+import org.springframework.scheduling.annotation.Scheduled;
10
+import org.springframework.stereotype.Component;
11
+
12
+import java.time.LocalDateTime;
13
+import java.util.Hashtable;
14
+import java.util.Random;
15
+
16
+@Slf4j
17
+@Component
18
+@EnableScheduling
19
+public class SMSCaptcha {
20
+    @Autowired
21
+    AliyunConfig aliyunConfig;
22
+
23
+    @Autowired
24
+    SMSUtils smsUtils;
25
+
26
+    // 默认超时时间, 单位秒
27
+    Integer expireSec = 5 * 60;
28
+
29
+    // 缓存电话列表
30
+    Hashtable<String, Phone> allPhones = new Hashtable<>();
31
+
32
+    /**
33
+     * 发送验证码
34
+     * @param tel
35
+     * @param captcha
36
+     * @throws Exception
37
+     */
38
+    public void send(String tel, String captcha) throws Exception {
39
+        if (null == captcha) {
40
+            throw new Exception("没有有效的验证码");
41
+        }
42
+
43
+        Phone phone = new Phone()
44
+                .setNumber(tel)
45
+                .setCaptcha(captcha)
46
+                .setExpire(expireTime());
47
+
48
+
49
+        SMSUtils.Message message = new SMSUtils.Message()
50
+                .setCode(aliyunConfig.getSms().getCaptcha().getCode())
51
+                .setSign(aliyunConfig.getSms().getCaptcha().getSign())
52
+                .setTel(tel)
53
+                .setContent("{ \"code\": \"" + captcha + "\" }");
54
+
55
+        try {
56
+            smsUtils.sendMessage(message);
57
+        } catch (Exception e) {
58
+            // 修改友好点的错误
59
+            throw new Exception("发送验证码失败");
60
+        }
61
+
62
+        log.info(String.format("发送验证码 %s 到手机 %s", captcha, tel));
63
+
64
+        // 发送成功, 写入缓存
65
+        toCache(phone);
66
+    }
67
+
68
+    /**
69
+     * 校验验证码
70
+     * @param tel
71
+     * @param captcha
72
+     * @return
73
+     */
74
+    public boolean validate(String tel, String captcha) {
75
+        Phone phone = fromCache(tel);
76
+        if (null == phone) {
77
+            return false;
78
+        }
79
+
80
+        if (null == captcha || !captcha.equals(phone.getCaptcha())) {
81
+            return false;
82
+        }
83
+
84
+        // 过期则清除缓存
85
+        boolean res = checkExpire(phone);
86
+        if (res) {
87
+            clearCache(phone);
88
+        }
89
+
90
+        return !res;
91
+    }
92
+
93
+    /**
94
+     * 辅助方法: 随机生成验证码
95
+     * @param length
96
+     * @return
97
+     */
98
+    public String randCaptcha(int length) {
99
+        Random random = new Random();
100
+        String res = "";
101
+        for (int i = 0; i < length; i ++) {
102
+            int num = random.nextInt(10);
103
+            res += String.valueOf(num);
104
+        }
105
+        return res;
106
+    }
107
+
108
+    /**
109
+     * 定时任务 每半小时 清除一次不用的手机号
110
+     */
111
+    @Scheduled(fixedRate = 1000 * 60 * 30)
112
+    public void clearUnused() {
113
+        for (Phone phone: allPhones.values()) {
114
+            if (checkExpire(phone)) {
115
+                clearCache(phone);
116
+            }
117
+        }
118
+    }
119
+
120
+    private Phone fromCache(String phone) {
121
+        return allPhones.get(phone);
122
+    }
123
+    private void toCache(Phone phone) {
124
+        allPhones.put(phone.getNumber(), phone);
125
+    }
126
+    private void clearCache(Phone phone) { allPhones.remove(phone); }
127
+
128
+    private LocalDateTime expireTime() {
129
+        return LocalDateTime.now().plusSeconds(expireSec);
130
+    }
131
+
132
+    // 过期返回 true
133
+    private boolean checkExpire(Phone phone) {
134
+        return LocalDateTime.now().isAfter(phone.getExpire());
135
+    }
136
+
137
+    @Data
138
+    @Accessors(chain = true)
139
+    public static class Phone {
140
+        String number;
141
+        String captcha;
142
+        LocalDateTime expire;
143
+    }
144
+
145
+}

+ 71
- 0
src/main/java/com/yunzhi/demo/common/SMSUtils.java Voir le fichier

@@ -0,0 +1,71 @@
1
+package com.yunzhi.demo.common;
2
+
3
+import com.aliyuncs.CommonRequest;
4
+import com.aliyuncs.CommonResponse;
5
+import com.aliyuncs.DefaultAcsClient;
6
+import com.aliyuncs.IAcsClient;
7
+import com.aliyuncs.http.MethodType;
8
+import com.aliyuncs.profile.DefaultProfile;
9
+import com.yunzhi.demo.config.AliyunConfig;
10
+import lombok.Data;
11
+import lombok.experimental.Accessors;
12
+import lombok.extern.slf4j.Slf4j;
13
+import org.springframework.beans.factory.InitializingBean;
14
+import org.springframework.beans.factory.annotation.Autowired;
15
+import org.springframework.stereotype.Component;
16
+
17
+@Slf4j
18
+@Component
19
+public class SMSUtils implements InitializingBean {
20
+
21
+    IAcsClient acsClient;
22
+
23
+    //产品名称:云通信短信API产品,开发者无需替换
24
+    static final String product = "Dysmsapi";
25
+    //产品域名,开发者无需替换
26
+    static final String domain = "dysmsapi.aliyuncs.com";
27
+    //API 的名称,开发者无需替换
28
+    static final String action = "SendSms";
29
+    //API RegionId,开发者无需替换
30
+    static final String regionId = "cn-hangzhou";
31
+    //API 版本,开发者无需替换
32
+    static final String verison = "2017-05-25";
33
+
34
+    @Autowired
35
+    AliyunConfig aliyunConfig;
36
+
37
+    public void sendMessage(Message message) throws Exception {
38
+        request(message);
39
+    }
40
+
41
+    private CommonResponse request(Message message) throws Exception {
42
+        CommonRequest request = new CommonRequest();
43
+        request.setSysMethod(MethodType.POST);
44
+        request.setSysDomain(domain);
45
+        request.setSysVersion(verison);
46
+        request.setSysAction(action);
47
+        request.putQueryParameter("RegionId", regionId);
48
+        request.putQueryParameter("PhoneNumbers", message.getTel());
49
+        request.putQueryParameter("SignName", message.getSign());
50
+        request.putQueryParameter("TemplateCode", message.getCode());
51
+        request.putQueryParameter("TemplateParam", message.getContent());
52
+
53
+        return acsClient.getCommonResponse(request);
54
+    }
55
+
56
+    @Override
57
+    public void afterPropertiesSet() throws Exception {
58
+        AliyunConfig.Sms sms = aliyunConfig.getSms();
59
+        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", aliyunConfig.getAccessKeyId(), aliyunConfig.getAccessKeySecret());
60
+        acsClient = new DefaultAcsClient(profile);
61
+    }
62
+
63
+    @Data
64
+    @Accessors(chain = true)
65
+    public static class Message {
66
+        String code;
67
+        String tel;
68
+        String sign;
69
+        String content;
70
+    }
71
+}

+ 120
- 0
src/main/java/com/yunzhi/demo/common/StringUtils.java Voir le fichier

@@ -0,0 +1,120 @@
1
+package com.yunzhi.demo.common;
2
+
3
+import java.io.UnsupportedEncodingException;
4
+import java.net.URLEncoder;
5
+import java.util.Random;
6
+import java.util.regex.Matcher;
7
+import java.util.regex.Pattern;
8
+
9
+public class StringUtils {
10
+    private static Pattern humpPattern = Pattern.compile("[A-Z]");
11
+
12
+    public static boolean isEmpty(String str) {
13
+        return null == str || "".equals(str.trim()) || "null".equals(str) || "undefined".equals(str);
14
+    }
15
+
16
+    public static String trim(String src, String...st) {
17
+        if (null == src) return src;
18
+        if (null == st || st.length == 0) return src.trim();
19
+
20
+        String start = st[0];
21
+        if (!src.startsWith(start)) {
22
+            return src;
23
+        }
24
+
25
+        return src.substring(start.length());
26
+    }
27
+
28
+    public static String trimEnd(String src, String str) {
29
+        if (null == src || null == str) {
30
+            return src;
31
+        }
32
+
33
+        if (src.endsWith(str)) {
34
+            return src.substring(0, src.length() - str.length());
35
+        }
36
+
37
+        return src;
38
+    }
39
+
40
+    public static String ifNull(String src, String defaultVal) {
41
+        return isEmpty(src) ? defaultVal : src;
42
+    }
43
+
44
+    public static String random(int length) {
45
+        String str="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
46
+        Random random = new Random();
47
+        StringBuffer sb = new StringBuffer();
48
+        for(int i=0;i<length;i++){
49
+            int number=random.nextInt(62);
50
+            sb.append(str.charAt(number));
51
+        }
52
+        return sb.toString();
53
+    }
54
+
55
+    public static String urlEncode(String str) {
56
+        try {
57
+            return URLEncoder.encode(str, "UTF-8");
58
+        } catch (UnsupportedEncodingException e) {
59
+            e.printStackTrace();
60
+            return str;
61
+        }
62
+    }
63
+
64
+    public static String humpToLine(String str) {
65
+        if (null == str || "".equals(str)) return "";
66
+
67
+        Matcher matcher = humpPattern.matcher(str);
68
+        StringBuffer sb = new StringBuffer();
69
+        while (matcher.find()) {
70
+            matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
71
+        }
72
+        matcher.appendTail(sb);
73
+        return sb.toString();
74
+    }
75
+
76
+    public static String strToUnicode(String str) {
77
+        char[] chars = str.toCharArray();
78
+        String returnStr = "";
79
+        for (int i = 0; i < chars.length; i++) {
80
+            returnStr += "\\u" + Integer.toString(chars[i], 16);
81
+        }
82
+        return returnStr;
83
+    }
84
+
85
+    public static String repeat(String src, int len) {
86
+        if (null == src) {
87
+            return null;
88
+        }
89
+
90
+        if (len <= 0) {
91
+            return src;
92
+        }
93
+
94
+        String res = "";
95
+        for (int i = 0; i < len; i ++) {
96
+            res += src;
97
+        }
98
+
99
+        return res;
100
+    }
101
+
102
+    public static String lpad(String src, String padStr, int len) {
103
+        if (null == src) {
104
+            return null;
105
+        }
106
+
107
+        if (len <= 0 || src.length() >= len) {
108
+            return src;
109
+        }
110
+
111
+        if (null == padStr) {
112
+            padStr = "";
113
+        }
114
+
115
+        int padLen = len - src.length();
116
+        String prefix = repeat(padStr, padLen);
117
+        prefix = prefix.substring(0, padLen);
118
+        return prefix + src;
119
+    }
120
+}

+ 34
- 0
src/main/java/com/yunzhi/demo/common/WxUtils.java Voir le fichier

@@ -0,0 +1,34 @@
1
+package com.yunzhi.demo.common;
2
+
3
+import cn.binarywang.wx.miniapp.api.WxMaService;
4
+import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
5
+import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
6
+import com.yunzhi.demo.config.WeixinConfig;
7
+import org.springframework.beans.factory.annotation.Autowired;
8
+import org.springframework.stereotype.Component;
9
+
10
+@Component
11
+public class WxUtils {
12
+    private static WxMaService service;
13
+
14
+    @Autowired
15
+    public WxUtils(WeixinConfig config) {
16
+        setService(config);
17
+    }
18
+
19
+    private void setService(WeixinConfig config) {
20
+        WxMaDefaultConfigImpl conf = new WxMaDefaultConfigImpl();
21
+        conf.setAppid(config.getMiniapp().getAppid());
22
+        conf.setSecret(config.getMiniapp().getSecret());
23
+        conf.setToken(config.getMiniapp().getToken());
24
+        conf.setAesKey(config.getMiniapp().getAesKey());
25
+        conf.setMsgDataFormat(config.getMiniapp().getMsgDataFormat());
26
+
27
+        WxMaService service = new WxMaServiceImpl();
28
+        service.setWxMaConfig(conf);
29
+    }
30
+
31
+    public WxMaService getService() {
32
+        return service;
33
+    }
34
+}

+ 39
- 0
src/main/java/com/yunzhi/demo/config/AliyunConfig.java Voir le fichier

@@ -0,0 +1,39 @@
1
+package com.yunzhi.demo.config;
2
+
3
+import lombok.Data;
4
+import org.springframework.boot.context.properties.ConfigurationProperties;
5
+import org.springframework.boot.context.properties.NestedConfigurationProperty;
6
+import org.springframework.stereotype.Component;
7
+
8
+@Data
9
+@Component
10
+@ConfigurationProperties(prefix = "aliyun")
11
+public class AliyunConfig {
12
+    private String accessKeyId;
13
+    private String accessKeySecret;
14
+
15
+    @NestedConfigurationProperty
16
+    private Oss oss = new Oss();
17
+
18
+    @NestedConfigurationProperty
19
+    private Sms sms = new Sms();
20
+
21
+    @Data
22
+    public  static class Oss {
23
+        private String endpoint;
24
+        private String bucketName;
25
+        private String bucketURL;
26
+    }
27
+
28
+    @Data
29
+    public static class Sms {
30
+        @NestedConfigurationProperty
31
+        private Captcha captcha = new Captcha();
32
+    }
33
+
34
+    @Data
35
+    public static class Captcha {
36
+        private String code;
37
+        private String sign;
38
+    }
39
+}

+ 35
- 0
src/main/java/com/yunzhi/demo/config/BaseConfig.java Voir le fichier

@@ -0,0 +1,35 @@
1
+package com.yunzhi.demo.config;
2
+
3
+import com.yunzhi.demo.interceptor.PermissionInterceptor;
4
+import lombok.Data;
5
+import org.springframework.beans.factory.annotation.Autowired;
6
+import org.springframework.context.annotation.Configuration;
7
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
8
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
9
+
10
+import javax.annotation.PostConstruct;
11
+
12
+@Data
13
+@Configuration
14
+public class BaseConfig implements WebMvcConfigurer {
15
+
16
+    @Autowired
17
+    private PermissionInterceptor permissionInterceptor;
18
+
19
+    @Autowired
20
+    private InterceptorConfig interceptorConfig;
21
+
22
+    @PostConstruct
23
+    public void init() {
24
+    }
25
+
26
+    @Override
27
+    public void addInterceptors(InterceptorRegistry registry) {
28
+        // 自定义拦截器,添加拦截路径和排除拦截路径
29
+        if (interceptorConfig.getPermission().isEnable()) {
30
+            registry.addInterceptor(permissionInterceptor)
31
+                    .addPathPatterns(interceptorConfig.getPermission().getIncludePaths())
32
+                    .excludePathPatterns(interceptorConfig.getPermission().getExcludePaths());
33
+        }
34
+    }
35
+}

+ 34
- 0
src/main/java/com/yunzhi/demo/config/InterceptorConfig.java Voir le fichier

@@ -0,0 +1,34 @@
1
+package com.yunzhi.demo.config;
2
+
3
+import lombok.Data;
4
+import org.springframework.boot.context.properties.ConfigurationProperties;
5
+import org.springframework.boot.context.properties.NestedConfigurationProperty;
6
+import org.springframework.stereotype.Component;
7
+
8
+@Data
9
+@Component
10
+@ConfigurationProperties(prefix = "interceptor")
11
+public class InterceptorConfig {
12
+
13
+    @NestedConfigurationProperty
14
+    private Config permission = new Config();
15
+
16
+    @Data
17
+    public static class Config {
18
+
19
+        /**
20
+         * 是否启用
21
+         */
22
+        private boolean enable;
23
+
24
+        /**
25
+         * 包含的路径
26
+         */
27
+        private String[] includePaths = new String[]{};
28
+
29
+        /**
30
+         * 排除路径
31
+         */
32
+        private String[] excludePaths = new String[]{};
33
+    }
34
+}

+ 14
- 0
src/main/java/com/yunzhi/demo/config/MybatisPlusConfig.java Voir le fichier

@@ -0,0 +1,14 @@
1
+package com.yunzhi.demo.config;
2
+
3
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
4
+import org.springframework.context.annotation.Bean;
5
+import org.springframework.context.annotation.Configuration;
6
+
7
+@Configuration
8
+public class MybatisPlusConfig {
9
+
10
+    @Bean
11
+    public PaginationInterceptor paginationInterceptor() {
12
+        return new PaginationInterceptor();
13
+    }
14
+}

+ 24
- 0
src/main/java/com/yunzhi/demo/config/SwagggerConfig.java Voir le fichier

@@ -0,0 +1,24 @@
1
+package com.yunzhi.demo.config;
2
+
3
+import io.swagger.annotations.Api;
4
+import org.springframework.context.annotation.Bean;
5
+import org.springframework.context.annotation.Configuration;
6
+import springfox.documentation.builders.PathSelectors;
7
+import springfox.documentation.builders.RequestHandlerSelectors;
8
+import springfox.documentation.spi.DocumentationType;
9
+import springfox.documentation.spring.web.plugins.Docket;
10
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
11
+
12
+@Configuration
13
+@EnableSwagger2
14
+public class SwagggerConfig {
15
+    @Bean
16
+    public Docket docket() {
17
+        return new Docket(DocumentationType.SWAGGER_2)
18
+                .select()
19
+                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
20
+                .paths(PathSelectors.any())
21
+                .build();
22
+
23
+    }
24
+}

+ 24
- 0
src/main/java/com/yunzhi/demo/config/WeixinConfig.java Voir le fichier

@@ -0,0 +1,24 @@
1
+package com.yunzhi.demo.config;
2
+
3
+import lombok.Data;
4
+import org.springframework.boot.context.properties.ConfigurationProperties;
5
+import org.springframework.boot.context.properties.NestedConfigurationProperty;
6
+import org.springframework.stereotype.Component;
7
+
8
+@Data
9
+@Component
10
+@ConfigurationProperties(prefix = "weixin")
11
+public class WeixinConfig {
12
+
13
+    @NestedConfigurationProperty
14
+    private Miniapp miniapp = new Miniapp();
15
+
16
+    @Data
17
+    public static class Miniapp {
18
+        private String appid;
19
+        private String secret;
20
+        private String token;
21
+        private String aesKey;
22
+        private String msgDataFormat;
23
+    }
24
+}

+ 67
- 0
src/main/java/com/yunzhi/demo/controller/LoginController.java Voir le fichier

@@ -0,0 +1,67 @@
1
+package com.yunzhi.demo.controller;
2
+
3
+import com.yunzhi.demo.common.*;
4
+//import com.yunzhi.niucai.entity.SysUser;
5
+//import com.yunzhi.niucai.service.ISysUserService;
6
+//import org.springframework.beans.factory.annotation.Autowired;
7
+import com.yunzhi.demo.vo.LoginParam;
8
+import io.swagger.annotations.Api;
9
+import io.swagger.annotations.ApiOperation;
10
+import io.swagger.annotations.ApiParam;
11
+import org.springframework.web.bind.annotation.PostMapping;
12
+import org.springframework.web.bind.annotation.RequestBody;
13
+import org.springframework.web.bind.annotation.RestController;
14
+
15
+//import java.util.HashMap;
16
+
17
+
18
+@Api(tags = "登入/登出")
19
+@RestController
20
+public class LoginController extends BaseController {
21
+
22
+//    @Autowired
23
+//    ISysUserService iSysUserService;
24
+
25
+    @PostMapping("/login")
26
+    @ApiOperation(value="登录", notes = "登录", httpMethod = "POST", response = ResponseBean.class)
27
+    public ResponseBean login(@ApiParam("登录参数") @RequestBody LoginParam loginParam) throws Exception {
28
+//        if (null == loginParam) {
29
+//            return ResponseBean.error("账户或密码不能为空", ResponseBean.ERROR_ILLEGAL_PARAMS);
30
+//        }
31
+//
32
+//        String userName = loginParam.get("userName");
33
+//        String password = loginParam.get("password");
34
+//
35
+//        if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(password)) {
36
+//            return ResponseBean.error("账户或密码不能为空", ResponseBean.ERROR_ILLEGAL_PARAMS);
37
+//        }
38
+//
39
+//        SysUser sysUser = iSysUserService.getLoginUser(userName);
40
+//        if (null == sysUser) {
41
+//            return ResponseBean.error("账户或密码不正确", ResponseBean.ERROR_ILLEGAL_PARAMS);
42
+//        }
43
+//
44
+//        if (!checkPassword(password, sysUser.getPassword(), sysUser.getUserId().toString())) {
45
+//            return ResponseBean.error("账户或密码不正确", ResponseBean.ERROR_ILLEGAL_PARAMS);
46
+//        }
47
+//
48
+//        if (!iSysUserService.checkStatus(sysUser)) {
49
+//            return ResponseBean.error("用户状态不正确, 请联系管理人员", ResponseBean.ERROR_UNAVAILABLE);
50
+//        }
51
+//
52
+//        // 生成 token
53
+//        Map<String, Object> claims = new HashMap<String, Object>(){{
54
+//            put("userId", sysUser.getUserId());
55
+//        }};
56
+//        String jws = JWTUtils.encode(claims);
57
+//        sysUser.setPassword(null);
58
+//        sysUser.setToken(jws);
59
+//
60
+//        return ResponseBean.success(sysUser);
61
+        return ResponseBean.success("");
62
+    }
63
+
64
+    private boolean checkPassword(String src, String targ, String salt) {
65
+        return EncryptUtils.md5(src, salt).equals(targ);
66
+    }
67
+}

+ 19
- 0
src/main/java/com/yunzhi/demo/exception/GlobalExceptionHandler.java Voir le fichier

@@ -0,0 +1,19 @@
1
+package com.yunzhi.demo.exception;
2
+
3
+import com.yunzhi.demo.common.ResponseBean;
4
+import lombok.extern.slf4j.Slf4j;
5
+import org.springframework.web.bind.annotation.ExceptionHandler;
6
+import org.springframework.web.bind.annotation.ResponseBody;
7
+import org.springframework.web.bind.annotation.RestControllerAdvice;
8
+
9
+@Slf4j
10
+@RestControllerAdvice
11
+public class GlobalExceptionHandler {
12
+
13
+    @ResponseBody
14
+    @ExceptionHandler(Exception.class)
15
+    public ResponseBean handleException(Exception e){
16
+        log.error(e.getMessage(),e);
17
+        return ResponseBean.error(e.getMessage(), ResponseBean.ERROR_UNAVAILABLE);
18
+    }
19
+}

+ 57
- 0
src/main/java/com/yunzhi/demo/interceptor/PermissionInterceptor.java Voir le fichier

@@ -0,0 +1,57 @@
1
+package com.yunzhi.demo.interceptor;
2
+
3
+import com.alibaba.fastjson.JSONObject;
4
+import com.yunzhi.demo.common.JWTUtils;
5
+import com.yunzhi.demo.common.ResponseBean;
6
+import com.yunzhi.demo.common.StringUtils;
7
+import lombok.extern.slf4j.Slf4j;
8
+import org.springframework.stereotype.Component;
9
+import org.springframework.web.servlet.HandlerInterceptor;
10
+import org.springframework.web.servlet.ModelAndView;
11
+
12
+import javax.servlet.http.HttpServletRequest;
13
+import javax.servlet.http.HttpServletResponse;
14
+import java.io.IOException;
15
+
16
+
17
+@Slf4j
18
+@Component
19
+public class PermissionInterceptor implements HandlerInterceptor {
20
+
21
+    @Override
22
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
23
+        log.info("Request URI: {}", request.getRequestURI());
24
+
25
+        // JWT
26
+        String jws = JWTUtils.getToken(request);
27
+        if (StringUtils.isEmpty(jws)) {
28
+            responseTokenError(response, "鉴权失败, 请先进行登录操作");
29
+            return false;
30
+        }
31
+
32
+        try {
33
+            JWTUtils.verify(jws);
34
+        } catch (Exception e) {
35
+            log.error("鉴权失败: {}", e.getMessage());
36
+            responseTokenError(response, "鉴权失败, 请重新登录");
37
+            return false;
38
+        }
39
+
40
+        return true;
41
+    }
42
+
43
+    @Override
44
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object obj, ModelAndView mv) throws Exception {
45
+        // 刷新 TOKEN
46
+        String jws = JWTUtils.getToken(request);
47
+        JWTUtils.refresh(jws, response);
48
+    }
49
+
50
+    private void responseTokenError(HttpServletResponse response, String error) throws IOException {
51
+        response.addHeader("Content-type", "application/json");
52
+        response.getOutputStream().write(
53
+                JSONObject.toJSONBytes(
54
+                        ResponseBean.error(error, ResponseBean.ERROR_AUTH_FAIL)
55
+                ));
56
+    }
57
+}

+ 16
- 0
src/main/java/com/yunzhi/demo/vo/LoginParam.java Voir le fichier

@@ -0,0 +1,16 @@
1
+package com.yunzhi.demo.vo;
2
+
3
+import io.swagger.annotations.ApiModel;
4
+import io.swagger.annotations.ApiModelProperty;
5
+import lombok.Data;
6
+
7
+@ApiModel(description = "登录参数")
8
+@Data
9
+public class LoginParam {
10
+
11
+    @ApiModelProperty("用户名")
12
+    String userName;
13
+
14
+    @ApiModelProperty("密码, MD5 加密后数据")
15
+    String password;
16
+}

+ 16
- 0
src/main/resources/application-dev.yml Voir le fichier

@@ -0,0 +1,16 @@
1
+###
2
+spring:
3
+  servlet:
4
+    multipart:
5
+      max-file-size: 10MB
6
+      max-request-size: 50MB
7
+  datasource:
8
+    url: jdbc:mysql://rm-uf6z3z6jq11x653d77o.mysql.rds.aliyuncs.com:3306/niucai?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
9
+    username: niucai
10
+    password: 1qaz#EDC
11
+
12
+###
13
+logging:
14
+  level:
15
+    root: info
16
+    springfox: info

+ 10
- 0
src/main/resources/application-prod.yml Voir le fichier

@@ -0,0 +1,10 @@
1
+###
2
+spring:
3
+  servlet:
4
+    multipart:
5
+      max-file-size: 10MB
6
+      max-request-size: 50MB
7
+  datasource:
8
+    url: jdbc:mysql://rm-uf6z3z6jq11x653d77o.mysql.rds.aliyuncs.com:3306/niucai?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
9
+    username: niucai
10
+    password: 1qaz#EDC

+ 55
- 0
src/main/resources/application.yml Voir le fichier

@@ -0,0 +1,55 @@
1
+###
2
+server:
3
+  port: 8080
4
+  servlet:
5
+    context-path: /api
6
+
7
+###
8
+interceptor:
9
+  permission:
10
+    enable: true
11
+    include-paths: /**
12
+    exclude-paths:
13
+      - /login
14
+      - /logout
15
+      - /swagger-ui/**
16
+      - /swagger-resources/**
17
+      - /v2/**
18
+
19
+###
20
+mybatis-plus:
21
+  configuration:
22
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
23
+    call-setters-on-nulls: true
24
+  mapper-locations: classpath:mapper/**/*.xml
25
+
26
+###
27
+aliyun:
28
+  accessKeyId: LTAI4FdMQNh1xUoiqqbKJ15J
29
+  accessKeySecret: F7vmuXBu8IrhouQYYhFMLRhIRivIzb
30
+  oss:
31
+    endpoint: oss-cn-shanghai.aliyuncs.com
32
+    bucketName: njcj
33
+    bucketURL: https://njcj.oss-cn-shanghai.aliyuncs.com
34
+  sms:
35
+    captcha:
36
+      code: SMS_195585471
37
+      sign: 云致
38
+
39
+###
40
+weixin:
41
+  miniapp:
42
+    appid: wxd6f47a9bb3052175
43
+    secret: 28f33b6bbc0f778c11a0bb234a7d6d4e
44
+    token:
45
+    aesKey:
46
+    msgDataFormat: JSON
47
+
48
+###
49
+spring:
50
+  application:
51
+    name: demo
52
+  profiles:
53
+    active: @profileActive@
54
+
55
+

+ 13
- 0
src/test/java/com/yunzhi/demo/SpringApplicationTests.java Voir le fichier

@@ -0,0 +1,13 @@
1
+package com.yunzhi.demo;
2
+
3
+import org.junit.jupiter.api.Test;
4
+import org.springframework.boot.test.context.SpringBootTest;
5
+
6
+@SpringBootTest
7
+class SpringApplicationTests {
8
+
9
+	@Test
10
+	void contextLoads() {
11
+	}
12
+
13
+}