Browse Source

First commit

hanqingsong 3 years ago
commit
2476e57818

+ 33 - 0
.gitignore

@@ -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/

BIN
.mvn/wrapper/maven-wrapper.jar


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

@@ -0,0 +1,2 @@
1
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip
2
+wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar

+ 316 - 0
mvnw

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

+ 188 - 0
mvnw.cmd

@@ -0,0 +1,188 @@
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 "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
50
+if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\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/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
124
+
125
+FOR /F "usebackq 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%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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% ^
162
+  %JVM_CONFIG_MAVEN_PROPS% ^
163
+  %MAVEN_OPTS% ^
164
+  %MAVEN_DEBUG_OPTS% ^
165
+  -classpath %WRAPPER_JAR% ^
166
+  "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
167
+  %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
168
+if ERRORLEVEL 1 goto error
169
+goto end
170
+
171
+:error
172
+set ERROR_CODE=1
173
+
174
+:end
175
+@endlocal & set ERROR_CODE=%ERROR_CODE%
176
+
177
+if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
178
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
179
+if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
180
+if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
181
+:skipRcPost
182
+
183
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
184
+if "%MAVEN_BATCH_PAUSE%"=="on" pause
185
+
186
+if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
187
+
188
+cmd /C exit /B %ERROR_CODE%

+ 70 - 0
pom.xml

@@ -0,0 +1,70 @@
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.12.RELEASE</version>
9
+        <relativePath/> <!-- lookup parent from repository -->
10
+    </parent>
11
+    <groupId>com.unissoft</groupId>
12
+    <artifactId>smart-grp-nof-common</artifactId>
13
+    <version>0.0.1-SNAPSHOT</version>
14
+    <name>smart-grp-nof-common</name>
15
+    <description>Demo project for Spring Boot</description>
16
+    <properties>
17
+        <java.version>1.8</java.version>
18
+    </properties>
19
+    <dependencies>
20
+        <!-- mybatisplus与springboot整合 -->
21
+        <dependency>
22
+            <groupId>com.baomidou</groupId>
23
+            <artifactId>mybatis-plus-boot-starter</artifactId>
24
+            <version>3.4.1</version>
25
+        </dependency>
26
+        <dependency>
27
+            <groupId>org.springframework.boot</groupId>
28
+            <artifactId>spring-boot-starter-web</artifactId>
29
+        </dependency>
30
+        <!-- @Min -->
31
+        <dependency>
32
+            <groupId>org.springframework.boot</groupId>
33
+            <artifactId>spring-boot-starter-validation</artifactId>
34
+        </dependency>
35
+        <!-- 雪花漂移算法 -->
36
+        <!-- https://mvnrepository.com/artifact/com.github.yitter/yitter-idgenerator -->
37
+        <dependency>
38
+            <groupId>com.github.yitter</groupId>
39
+            <artifactId>yitter-idgenerator</artifactId>
40
+            <version>1.0.6</version>
41
+        </dependency>
42
+        <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-core -->
43
+        <dependency>
44
+            <groupId>cn.hutool</groupId>
45
+            <artifactId>hutool-core</artifactId>
46
+            <version>5.7.19</version>
47
+        </dependency>
48
+        <!-- https://mvnrepository.com/artifact/org.redisson/redisson-spring-boot-starter -->
49
+        <dependency>
50
+            <groupId>org.redisson</groupId>
51
+            <artifactId>redisson-spring-boot-starter</artifactId>
52
+            <version>3.16.8</version>
53
+        </dependency>
54
+        <dependency>
55
+            <groupId>org.projectlombok</groupId>
56
+            <artifactId>lombok</artifactId>
57
+            <!--<scope>provided</scope>-->
58
+        </dependency>
59
+    </dependencies>
60
+
61
+    <build>
62
+        <plugins>
63
+            <plugin>
64
+                <groupId>org.springframework.boot</groupId>
65
+                <artifactId>spring-boot-maven-plugin</artifactId>
66
+            </plugin>
67
+        </plugins>
68
+    </build>
69
+
70
+</project>

+ 13 - 0
src/main/java/com/unissoft/SmartGrpNofCommonApplication.java

@@ -0,0 +1,13 @@
1
+package com.unissoft;
2
+
3
+import org.springframework.boot.SpringApplication;
4
+import org.springframework.boot.autoconfigure.SpringBootApplication;
5
+
6
+@SpringBootApplication
7
+public class SmartGrpNofCommonApplication {
8
+
9
+    public static void main(String[] args) {
10
+        SpringApplication.run(SmartGrpNofCommonApplication.class, args);
11
+    }
12
+
13
+}

+ 65 - 0
src/main/java/com/unissoft/common/DateUtils.java

@@ -0,0 +1,65 @@
1
+package com.unissoft.common;
2
+
3
+import java.text.SimpleDateFormat;
4
+import java.util.Date;
5
+
6
+public class DateUtils {
7
+
8
+    public static String startTime = " 00:00:00";
9
+    public static String endTime = " 23:59:59";
10
+    //字符串转date
11
+    public static Date stringToData(String str) {
12
+        try {
13
+            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(str);
14
+        } catch (Exception e) {
15
+            e.printStackTrace();
16
+        }
17
+        return null;
18
+    }
19
+
20
+    //获取时间
21
+    public static Date getDate() {
22
+        return new Date();
23
+    }
24
+
25
+    //date转string
26
+    public static String dateToString(Date time) {
27
+        String dateString = null;
28
+        try {
29
+            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
30
+            dateString = formatter.format(time);
31
+            return dateString;
32
+        } catch (Exception e) {
33
+            e.printStackTrace();
34
+        }
35
+        return null;
36
+    }
37
+
38
+    // 获取日期格式化
39
+    public static String formatDate(Date date) {
40
+        SimpleDateFormat dateTime = new SimpleDateFormat("yyyy-MM-dd");
41
+        return dateTime.format(date);
42
+    }
43
+
44
+    // 获取日期格式化
45
+    public static String getCurrentDate() {
46
+        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//设置日期格式
47
+        return df.format(new Date());
48
+    }
49
+
50
+    // 获取日期格式化
51
+    public static String getNYR() {
52
+        SimpleDateFormat dateTime = new SimpleDateFormat("yyyyMMdd");
53
+        return dateTime.format(new Date());
54
+    }
55
+
56
+    //字符串转date
57
+    public static Date stringToData(String str,String format) {
58
+        try {
59
+            return new SimpleDateFormat(format).parse(str);
60
+        } catch (Exception e) {
61
+            e.printStackTrace();
62
+        }
63
+        return null;
64
+    }
65
+}

+ 38 - 0
src/main/java/com/unissoft/common/MD5Util.java

@@ -0,0 +1,38 @@
1
+package com.unissoft.common;
2
+
3
+import java.security.MessageDigest;
4
+import java.security.NoSuchAlgorithmException;
5
+
6
+/**
7
+ * @author qingsong.han
8
+ * @description: md5加密
9
+ * @create 2020-02-12 15:34
10
+ */
11
+public class MD5Util {
12
+
13
+    private static final String KEY = "qshan";
14
+    private static final int LEN = 16;
15
+
16
+    public static String getMD5(String plainText) {
17
+        try {
18
+            MessageDigest md = MessageDigest.getInstance("MD5");//获取MD5实例
19
+            md.update((KEY+plainText).getBytes());//此处传入要加密的byte类型值
20
+            byte[] digest = md.digest();//此处得到的是md5加密后的byte类型值
21
+            int i;
22
+            StringBuilder sb = new StringBuilder();
23
+            for (byte b : digest) {
24
+                i = b;
25
+                if (i < 0)
26
+                    i += 256;
27
+                if (i < 16)
28
+                    sb.append(0);
29
+                sb.append(Integer.toHexString(i));//通过Integer.toHexString方法把值变为16进制
30
+            }
31
+            return sb.toString().substring(0, LEN);//从下标0开始,length目的是截取多少长度的值
32
+        } catch (NoSuchAlgorithmException e) {
33
+            e.printStackTrace();
34
+            return null;
35
+        }
36
+    }
37
+
38
+}

+ 15 - 0
src/main/java/com/unissoft/common/MyConstant.java

@@ -0,0 +1,15 @@
1
+package com.unissoft.common;
2
+
3
+/**
4
+ * @author qingsong.han
5
+ * @description:
6
+ * @create 2021-10-19 19:41
7
+ */
8
+public class MyConstant {
9
+
10
+    //是否
11
+    public static final int ZERO = 0;
12
+    // id为空
13
+    public static final String ID_NULL = "删除标识不正确!";
14
+
15
+}

+ 88 - 0
src/main/java/com/unissoft/common/PageParam.java

@@ -0,0 +1,88 @@
1
+package com.unissoft.common;
2
+
3
+import javax.validation.constraints.Min;
4
+
5
+/**
6
+ * 分页参数类
7
+ */
8
+public class PageParam {
9
+    /**
10
+     * 当前页
11
+     */
12
+    @Min(value = 1) // 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
13
+    private int pageIndex;
14
+    /**
15
+     * 当前页有多少数据
16
+     */
17
+    @Min(value = 1) // 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
18
+    private int pageSize;
19
+    /**
20
+     * 要查的字段(别名=model属性名)
21
+     */
22
+    private String sqlColumns;
23
+    /**
24
+     * 排序
25
+     */
26
+    private String sort;
27
+    /**
28
+     * 条件
29
+     */
30
+    private String condition;
31
+
32
+    public PageParam() {
33
+    }
34
+
35
+    public PageParam(int pageIndex, int pageSize, String sort, String condition) {
36
+        this.pageIndex = pageIndex;
37
+        this.pageSize = pageSize;
38
+        this.sort = sort;
39
+        this.condition = condition;
40
+    }
41
+
42
+    public String getSort() {
43
+        return sort;
44
+    }
45
+
46
+    public void setSort(String sort) {
47
+        this.sort = sort;
48
+    }
49
+
50
+    public String getSqlColumns() {
51
+        return sqlColumns;
52
+    }
53
+
54
+    public void setSqlColumns(String sqlColumns) {
55
+        this.sqlColumns = sqlColumns;
56
+    }
57
+
58
+    public int getPageStart() {
59
+        if (pageIndex > 0) {
60
+            return (pageIndex - 1) * pageSize;
61
+        }
62
+        return pageIndex;
63
+    }
64
+
65
+    public int getPageIndex() {
66
+        return pageIndex;
67
+    }
68
+
69
+    public void setPageIndex(int pageIndex) {
70
+        this.pageIndex = pageIndex;
71
+    }
72
+
73
+    public int getPageSize() {
74
+        return pageSize;
75
+    }
76
+
77
+    public void setPageSize(int pageSize) {
78
+        this.pageSize = pageSize;
79
+    }
80
+
81
+    public String getCondition() {
82
+        return condition;
83
+    }
84
+
85
+    public void setCondition(String condition) {
86
+        this.condition = condition;
87
+    }
88
+}

+ 134 - 0
src/main/java/com/unissoft/common/ResultEnum.java

@@ -0,0 +1,134 @@
1
+package com.unissoft.common;
2
+
3
+
4
+/**
5
+ * 结果枚举
6
+ */
7
+public enum ResultEnum {
8
+    /**
9
+     * 操作成功!
10
+     */
11
+    CODE_1(200, "操作成功!"),
12
+    /**
13
+     * 操作失败!
14
+     */
15
+    CODE_2(600, "操作失败!"),
16
+    /**
17
+     * 调用xxx服务失败!
18
+     */
19
+    CODE_3(3, "调用xxx服务失败!"),
20
+    /**
21
+     * 验证码错误或已过期!
22
+     */
23
+    CODE_4(4, "验证码错误或已过期!"),
24
+    /**
25
+     * 获取验证码!
26
+     */
27
+    CODE_12(12, "验证成功!"),
28
+    /**
29
+     * 用户名或者密码错误!
30
+     */
31
+    CODE_5(203, "用户名或者密码错误!"),
32
+    /**
33
+     * 账号已存在!
34
+     */
35
+    CODE_6(6, "账号已存在!"),
36
+    /**
37
+     * 该client_id不存在
38
+     */
39
+    CODE_7(200, "该client_id不存在!"),
40
+    /**
41
+     * token已失效或者已经注销登录过了!
42
+     */
43
+    CODE_8(200, "token已失效或者已经注销登录过了!"),
44
+
45
+    /**
46
+     * 文件不能为空!
47
+     */
48
+    CODE_9(9, "文件不能为空!"),
49
+    /**
50
+     * 文件格式不正确!
51
+     */
52
+    CODE_10(10, "文件格式不正确!"),
53
+    /**
54
+     * 文件不存在,下载失败!
55
+     */
56
+    CODE_11(11, "文件不存在,下载失败!"),
57
+
58
+
59
+    /**
60
+     * token无效!
61
+     */
62
+    CODE_401(401, "你的账号已在其它设备登录!"),
63
+    /**
64
+     * 抱歉,您没有访问权限!
65
+     */
66
+    CODE_403(403, "抱歉,您没有访问权限!"),
67
+
68
+    /**
69
+     * 请求超时,请稍后再试!
70
+     */
71
+    CODE_504(504, "请求超时,请稍后再试!"),
72
+
73
+    /**
74
+     * 服务器神游中!
75
+     */
76
+    CODE_666(666, "服务器神游中!");
77
+
78
+
79
+    /**
80
+     * 状态码
81
+     */
82
+    private Integer code;
83
+
84
+    /**
85
+     * 消息
86
+     */
87
+    private String msg;
88
+
89
+    ResultEnum(Integer code, String msg) {
90
+        this.code = code;
91
+        this.msg = msg;
92
+    }
93
+
94
+    public Integer getCode() {
95
+        return code;
96
+    }
97
+
98
+    public void setCode(Integer code) {
99
+        this.code = code;
100
+    }
101
+
102
+    public String getMsg() {
103
+        return msg;
104
+    }
105
+
106
+    public void setMsg(String msg) {
107
+        this.msg = msg;
108
+    }
109
+}
110
+
111
+//    CODE_4(4, "账号或者密码错误!"),
112
+//    CODE_5(5, "图像数据为空!"),
113
+//    CODE_6(6, "图像数据传输异常!"),
114
+//    CODE_7(7, "图片上传大小不能超过5M!"),
115
+//    CODE_8(8, "图片上传格式错误!"),
116
+//    CODE_9(9, "手机号码不能为空!"),
117
+//    CODE_10(10, "短信验证码不能为空!"),
118
+//    CODE_11(11, "短信验证码错误!"),
119
+//    CODE_12(12, "登陆类型不能为空!"),
120
+//    CODE_13(13, "openId不能为空!"),
121
+//    CODE_14(14, "该手机号码已被注册!"),
122
+//    CODE_15(15, "userId不能为空!"),
123
+//    CODE_16(16, "姓名不能为空!"),
124
+//    CODE_17(17, "身份证号码不能为空!"),
125
+//    CODE_18(18, "身份证正面照不能为空!"),
126
+//    CODE_19(19, "身份证反面照不能为空!"),
127
+//    CODE_20(20, "行驶证正面照不能为空!"),
128
+//    CODE_21(21, "行驶证反面照不能为空!"),
129
+//    CODE_22(22, "该用户还没通过审核!"),
130
+//    CODE_23(23, "账号不能为空!"),
131
+//    CODE_24(24, "密码不能为空!"),
132
+//    CODE_25(25, "该账号已被占用!"),
133
+//    CODE_26(26, "参数错误!"),
134
+//    CODE_50(50, "过期时间不能为空!"),

+ 130 - 0
src/main/java/com/unissoft/common/ResultView.java

@@ -0,0 +1,130 @@
1
+package com.unissoft.common;
2
+
3
+/**
4
+ * 结果视图类
5
+ */
6
+public class ResultView {
7
+    /**
8
+     * 状态码
9
+     */
10
+    private Integer code;
11
+
12
+    /**
13
+     * 消息
14
+     */
15
+    private String msg;
16
+
17
+    /**
18
+     * 数据
19
+     */
20
+    private Object data;
21
+
22
+    /**
23
+     * 成功
24
+     *
25
+     * @return 结果视图
26
+     */
27
+    public static ResultView success() {
28
+        return new ResultView();
29
+    }
30
+
31
+    /**
32
+     * 成功
33
+     *
34
+     * @param data 数据
35
+     * @return 结果视图
36
+     */
37
+    public static ResultView success(Object data) {
38
+        return new ResultView(data);
39
+    }
40
+
41
+    /**
42
+     * 错误
43
+     *
44
+     * @return 结果视图
45
+     */
46
+    public static ResultView error() {
47
+        return new ResultView(ResultEnum.CODE_2.getCode(), ResultEnum.CODE_2.getMsg());
48
+    }
49
+
50
+    /**
51
+     * 错误
52
+     *
53
+     * @param resultEnum 结果枚举
54
+     * @return 结果视图
55
+     */
56
+    public static ResultView error(ResultEnum resultEnum) {
57
+        return new ResultView(resultEnum.getCode(), resultEnum.getMsg());
58
+    }
59
+
60
+    /**
61
+     * 调用服务的错误
62
+     *
63
+     * @param serviceName 服务名
64
+     * @return 结果视图
65
+     */
66
+    public static ResultView hystrixError(String serviceName) {
67
+        ResultEnum resultEnum = ResultEnum.CODE_3;
68
+        String msg = resultEnum.getMsg().replace("xxx", serviceName);
69
+        return new ResultView(resultEnum.getCode(), msg);
70
+    }
71
+
72
+    /**
73
+     * 自定义错误消息
74
+     *
75
+     * @param msg 错误消息
76
+     * @return 结果视图
77
+     */
78
+    public static ResultView error(String msg) {
79
+        return new ResultView(ResultEnum.CODE_2.getCode(), msg);
80
+    }
81
+
82
+    private ResultView() {
83
+        this.code = ResultEnum.CODE_1.getCode();
84
+        this.msg = ResultEnum.CODE_1.getMsg();
85
+    }
86
+
87
+    private ResultView(Object data) {
88
+        this.data = data;
89
+        this.code = ResultEnum.CODE_1.getCode();
90
+        this.msg = ResultEnum.CODE_1.getMsg();
91
+    }
92
+
93
+    private ResultView(Integer code, String msg) {
94
+        this.code = code;
95
+        this.msg = msg;
96
+    }
97
+
98
+    public Integer getCode() {
99
+        return code;
100
+    }
101
+
102
+    public void setCode(Integer code) {
103
+        this.code = code;
104
+    }
105
+
106
+    public String getMsg() {
107
+        return msg;
108
+    }
109
+
110
+    public void setMsg(String msg) {
111
+        this.msg = msg;
112
+    }
113
+
114
+    public Object getData() {
115
+        return data;
116
+    }
117
+
118
+    public void setData(Object data) {
119
+        this.data = data;
120
+    }
121
+
122
+    @Override
123
+    public String toString() {
124
+        return "ResultView{" +
125
+                "code=" + code +
126
+                ", msg='" + msg + '\'' +
127
+                ", data=" + data +
128
+                '}';
129
+    }
130
+}

+ 19 - 0
src/main/java/com/unissoft/common/SystemLog.java

@@ -0,0 +1,19 @@
1
+package com.unissoft.common;
2
+
3
+import java.lang.annotation.*;
4
+
5
+/**
6
+ * @author qingsong.han
7
+ * @description: 系统操作日志自定义注解
8
+ * @create 2021-10-21 14:37
9
+ */
10
+@Documented
11
+@Target(ElementType.METHOD)
12
+@Retention(RetentionPolicy.RUNTIME)
13
+@SuppressWarnings("all")
14
+public @interface SystemLog {
15
+//    String value() default "";
16
+    String operModul() default ""; // 操作模块
17
+    String operType() default "";  // 操作类型
18
+    String operDesc() default "";  // 操作说明
19
+}

+ 19 - 0
src/main/java/com/unissoft/common/UuidUtils.java

@@ -0,0 +1,19 @@
1
+package com.unissoft.common;
2
+
3
+import org.springframework.stereotype.Component;
4
+
5
+import java.util.UUID;
6
+
7
+@Component
8
+public class UuidUtils {
9
+
10
+    /**
11
+     * 生成32位随机数
12
+     *
13
+     * @return 返回32位随机数
14
+     */
15
+    public static String getCode() {
16
+        UUID uuid = UUID.randomUUID();
17
+        return uuid.toString().replace("-", "");
18
+    }
19
+}

+ 27 - 0
src/main/java/com/unissoft/config/MybatisPlusConfig.java

@@ -0,0 +1,27 @@
1
+package com.unissoft.config;
2
+
3
+import com.baomidou.mybatisplus.annotation.DbType;
4
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
5
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
6
+import org.springframework.context.annotation.Bean;
7
+import org.springframework.context.annotation.Configuration;
8
+
9
+/**
10
+ * @author qingsong.han
11
+ * @description:
12
+ * @create 2021-10-20 15:35
13
+ */
14
+@Configuration
15
+public class MybatisPlusConfig {
16
+
17
+    /**
18
+     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题
19
+     */
20
+    @Bean
21
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
22
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
23
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
24
+        return interceptor;
25
+    }
26
+
27
+}

+ 31 - 0
src/main/java/com/unissoft/utils/IPUtils.java

@@ -0,0 +1,31 @@
1
+package com.unissoft.utils;
2
+
3
+import javax.servlet.http.HttpServletRequest;
4
+
5
+/**
6
+ * @author qingsong.han
7
+ * @description: 获取ip工具类
8
+ * @create 2021-10-21 15:56
9
+ */
10
+public class IPUtils {
11
+    /**
12
+     * 获取IP地址
13
+     * <p>
14
+     * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址
15
+     * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址
16
+     */
17
+    public static String getRemoteIP(HttpServletRequest request) {
18
+
19
+        String ip = request.getHeader("x-forwarded-for");
20
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
21
+            ip = request.getHeader("Proxy-Client-IP");
22
+        }
23
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
24
+            ip = request.getHeader("WL-Proxy-Client-IP");
25
+        }
26
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
27
+            ip = request.getRemoteAddr();
28
+        }
29
+        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
30
+    }
31
+}

+ 136 - 0
src/main/java/com/unissoft/utils/RedissonUtil.java

@@ -0,0 +1,136 @@
1
+package com.unissoft.utils;
2
+
3
+import org.redisson.api.RLock;
4
+import org.redisson.api.RedissonClient;
5
+import org.springframework.stereotype.Component;
6
+
7
+import javax.annotation.Resource;
8
+import java.util.concurrent.TimeUnit;
9
+
10
+/**
11
+ * @author qingsong.han
12
+ * @description: Redisson分布式锁工具类
13
+ * @create 2022-06-07 15:25
14
+ */
15
+
16
+@Component
17
+public class RedissonUtil {
18
+
19
+    @Resource
20
+    private RedissonClient redissonClient;
21
+
22
+    /**
23
+     * 加锁
24
+     * @param lockKey
25
+     * @return
26
+     */
27
+    public RLock lock(String lockKey) {
28
+        RLock lock = redissonClient.getLock(lockKey);
29
+        lock.lock();
30
+        return lock;
31
+    }
32
+
33
+    /**
34
+     * 带超时的锁
35
+     * @param lockKey
36
+     * @param timeout 超时时间 单位:秒
37
+     */
38
+    public RLock lock(String lockKey, long timeout) {
39
+        RLock lock = redissonClient.getLock(lockKey);
40
+        lock.lock(timeout, TimeUnit.SECONDS);
41
+        return lock;
42
+    }
43
+
44
+    /**
45
+     * 带超时的锁
46
+     * @param lockKey
47
+     * @param unit 时间单位
48
+     * @param timeout 超时时间
49
+     */
50
+    public RLock lock(String lockKey, TimeUnit unit , long timeout) {
51
+        RLock lock = redissonClient.getLock(lockKey);
52
+        lock.lock(timeout, unit);
53
+        return lock;
54
+    }
55
+
56
+    /**
57
+     * 尝试获取锁
58
+     * @param lockKey
59
+     * @param waitTime 最多等待时间
60
+     * @param unit TimeUnit时间单位
61
+     * @return
62
+     */
63
+    public  boolean tryLock(String lockKey,long waitTime, TimeUnit unit) {
64
+        RLock lock = redissonClient.getLock(lockKey);
65
+        try {
66
+            return lock.tryLock(waitTime, unit);
67
+        } catch (InterruptedException e) {
68
+            return false;
69
+        }
70
+    }
71
+
72
+    /**
73
+     * 尝试获取锁
74
+     * @param lockKey
75
+     * @param waitTime 最多等待时间
76
+     * @param leaseTime 上锁后自动释放锁时间
77
+     * @return
78
+     */
79
+    public  boolean tryLock(String lockKey, long waitTime, long leaseTime) {
80
+        RLock lock = redissonClient.getLock(lockKey);
81
+        try {
82
+            return lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS);
83
+        } catch (InterruptedException e) {
84
+            return false;
85
+        }
86
+    }
87
+
88
+    /**
89
+     * 尝试获取锁
90
+     * @param lockKey
91
+     * @param unit 时间单位
92
+     * @param waitTime 最多等待时间
93
+     * @param leaseTime 上锁后自动释放锁时间
94
+     * @return
95
+     */
96
+    public boolean tryLock(String lockKey, TimeUnit unit, long waitTime, long leaseTime) {
97
+        RLock lock = redissonClient.getLock(lockKey);
98
+        try {
99
+            return lock.tryLock(waitTime, leaseTime, unit);
100
+        } catch (InterruptedException e) {
101
+            return false;
102
+        }
103
+    }
104
+
105
+    /**
106
+     * 释放锁
107
+     * @param lockKey
108
+     */
109
+    public void unlock(String lockKey) {
110
+        RLock lock = redissonClient.getLock(lockKey);
111
+        lock.unlock();
112
+    }
113
+
114
+    /**
115
+     * 若没用锁情况下,就不调用释放锁的代码,若有锁情况下才调用释放锁
116
+     * @param lockKey
117
+     */
118
+    public void unlockIgnore(String lockKey) {
119
+        RLock lock = redissonClient.getLock(lockKey);
120
+        if ( !lock.isLocked() ) {
121
+            return ;
122
+        }
123
+        lock.unlock();
124
+    }
125
+
126
+
127
+    /**
128
+     * 释放锁
129
+     * @param lock
130
+     */
131
+    public void unlock(RLock lock) {
132
+        lock.unlock();
133
+    }
134
+
135
+
136
+}

+ 94 - 0
src/main/java/com/unissoft/utils/SystemInitConfig.java

@@ -0,0 +1,94 @@
1
+package com.unissoft.utils;
2
+
3
+import cn.hutool.core.net.NetUtil;
4
+import com.github.yitter.contract.IdGeneratorOptions;
5
+import com.github.yitter.idgen.YitIdHelper;
6
+import lombok.extern.slf4j.Slf4j;
7
+import org.springframework.boot.CommandLineRunner;
8
+import org.springframework.core.annotation.Order;
9
+import org.springframework.data.redis.core.RedisTemplate;
10
+import org.springframework.data.redis.core.ValueOperations;
11
+import org.springframework.stereotype.Component;
12
+
13
+import javax.annotation.Resource;
14
+
15
+/**
16
+ * @author qingsong.han
17
+ * @description:
18
+ * @create 2022-06-07 15:28
19
+ */
20
+@Slf4j
21
+@Component
22
+@Order(0)
23
+public class SystemInitConfig implements CommandLineRunner {
24
+
25
+    @Resource
26
+    private RedissonUtil redissonUtil;
27
+
28
+    @Resource
29
+    private RedisTemplate redisTemplate;
30
+
31
+    /**
32
+     * 分布式锁Key
33
+     */
34
+    private static final String CACHE_ID_GENERATOR = "LOCK_ID_GENERATOR";
35
+
36
+    /**
37
+     * 最大机器号Key
38
+     */
39
+    private static final String CACHE_WORKERID_MAXID= "CACHE_WORKERID_MAXID";
40
+
41
+    /**
42
+     * 已分配的机器号Key
43
+     */
44
+    private static final String CACHE_ID_IP = "CACHE_ID_IP";
45
+
46
+    @Override
47
+    public void run(String... args) throws Exception {
48
+        //获取mac地址
49
+        String macAddress = NetUtil.getLocalhost().getHostAddress();
50
+        log.info("{} 配置分布式workerid 缓存========开始",macAddress);
51
+        boolean existWorkerId =  redisTemplate.opsForHash().hasKey(CACHE_ID_IP, macAddress);
52
+        //若已缓存在缓存中,直接跳过不设置
53
+        if (existWorkerId) {
54
+            Integer workerId = (Integer) redisTemplate.opsForHash().get(CACHE_ID_IP, macAddress);
55
+            log.info("{} 已配置分布式workerid ...",macAddress);
56
+            initWorkerId(workerId );
57
+            return ;
58
+        }
59
+        try {
60
+            //分布式锁等待120秒,执行时长最大120秒
61
+            boolean  locked = redissonUtil.tryLock(CACHE_ID_GENERATOR, 120, 120);
62
+            if (!locked) {
63
+                throw new RuntimeException(macAddress+"设置分布式Id机器号失败");
64
+            }
65
+            ValueOperations<String,Integer> stringOperation = redisTemplate.opsForValue();
66
+            boolean initWorkerId = stringOperation.setIfAbsent(CACHE_WORKERID_MAXID, 1);
67
+            if( !initWorkerId ) {
68
+                //若已存在key,对最大的机器号自增1
69
+                stringOperation.increment(CACHE_WORKERID_MAXID);
70
+            }
71
+            Integer workerId =   stringOperation.get(CACHE_WORKERID_MAXID);
72
+            initWorkerId(workerId);
73
+            //设置mac地址 - workerid 到hash结构
74
+            redisTemplate.opsForHash().put(CACHE_ID_IP,macAddress,workerId);
75
+            log.info("已配置分布式workerid ,{} - {}",macAddress,workerId);
76
+        } finally {
77
+            redissonUtil.unlock(CACHE_ID_GENERATOR);
78
+            log.info("{} 配置分布式workerid 缓存========结束",macAddress);
79
+        }
80
+
81
+    }
82
+
83
+    private void initWorkerId(Integer workerId){
84
+        IdGeneratorOptions options = new IdGeneratorOptions( workerId.shortValue());
85
+        YitIdHelper.setIdGenerator(options);
86
+    }
87
+
88
+    public static void main(String[] args) {
89
+        for (int i = 0; i < 10; i++) {
90
+            System.out.println(YitIdHelper.nextId());
91
+        }
92
+    }
93
+
94
+}