Commit 7d998aa6f40015ebb53e01a61ca7c374cf6ddfd3

Authored by 陶汉栋
2 parents 1532fcd9 64cbebcf

Merge branch 'master' of http://git.shunzhi.net/taohd/mycloud

# Conflicts:
#	cloud/haikang/src/main/java/com/sincere/haikang/CMSServer.java
Showing 200 changed files with 8000 additions and 4380 deletions   Show diff stats

Too many changes.

To preserve performance only 100 of 200 files displayed.

cloud/Capture/2019-08-06/2019-08-06_08-34-58.jpg

14.7 KB

cloud/Capture/2019-08-06/2019-08-06_08-35-26.jpg

14.1 KB

cloud/GateSnapPicture/1565064083617GateSnapPicture.jpg

13.7 KB

cloud/GateSnapPicture/1565064085046GateSnapPicture.jpg

13.6 KB

cloud/GateSnapPicture/1565064086448GateSnapPicture.jpg

14.3 KB

cloud/HCAapSDKCom/zlib1.dll
No preview for this file type
cloud/ailive/.gitignore
@@ -1,31 +0,0 @@ @@ -1,31 +0,0 @@
1 -HELP.md  
2 -target/  
3 -!.mvn/wrapper/maven-wrapper.jar  
4 -!**/src/main/**  
5 -!**/src/test/**  
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 -  
30 -### VS Code ###  
31 -.vscode/  
cloud/ailive/.mvn/wrapper/MavenWrapperDownloader.java
@@ -1,114 +0,0 @@ @@ -1,114 +0,0 @@
1 -/*  
2 -Licensed to the Apache Software Foundation (ASF) under one  
3 -or more contributor license agreements. See the NOTICE file  
4 -distributed with this work for additional information  
5 -regarding copyright ownership. The ASF licenses this file  
6 -to you under the Apache License, Version 2.0 (the  
7 -"License"); you may not use this file except in compliance  
8 -with the License. You may obtain a copy of the License at  
9 -  
10 - https://www.apache.org/licenses/LICENSE-2.0  
11 -  
12 -Unless required by applicable law or agreed to in writing,  
13 -software distributed under the License is distributed on an  
14 -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY  
15 -KIND, either express or implied. See the License for the  
16 -specific language governing permissions and limitations  
17 -under the License.  
18 -*/  
19 -  
20 -import java.io.File;  
21 -import java.io.FileInputStream;  
22 -import java.io.FileOutputStream;  
23 -import java.io.IOException;  
24 -import java.net.URL;  
25 -import java.nio.channels.Channels;  
26 -import java.nio.channels.ReadableByteChannel;  
27 -import java.util.Properties;  
28 -  
29 -public class MavenWrapperDownloader {  
30 -  
31 - /**  
32 - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.  
33 - */  
34 - private static final String DEFAULT_DOWNLOAD_URL =  
35 - "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar";  
36 -  
37 - /**  
38 - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to  
39 - * use instead of the default one.  
40 - */  
41 - private static final String MAVEN_WRAPPER_PROPERTIES_PATH =  
42 - ".mvn/wrapper/maven-wrapper.properties";  
43 -  
44 - /**  
45 - * Path where the maven-wrapper.jar will be saved to.  
46 - */  
47 - private static final String MAVEN_WRAPPER_JAR_PATH =  
48 - ".mvn/wrapper/maven-wrapper.jar";  
49 -  
50 - /**  
51 - * Name of the property which should be used to override the default download url for the wrapper.  
52 - */  
53 - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";  
54 -  
55 - public static void main(String args[]) {  
56 - System.out.println("- Downloader started");  
57 - File baseDirectory = new File(args[0]);  
58 - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());  
59 -  
60 - // If the maven-wrapper.properties exists, read it and check if it contains a custom  
61 - // wrapperUrl parameter.  
62 - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);  
63 - String url = DEFAULT_DOWNLOAD_URL;  
64 - if (mavenWrapperPropertyFile.exists()) {  
65 - FileInputStream mavenWrapperPropertyFileInputStream = null;  
66 - try {  
67 - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);  
68 - Properties mavenWrapperProperties = new Properties();  
69 - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);  
70 - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);  
71 - } catch (IOException e) {  
72 - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");  
73 - } finally {  
74 - try {  
75 - if (mavenWrapperPropertyFileInputStream != null) {  
76 - mavenWrapperPropertyFileInputStream.close();  
77 - }  
78 - } catch (IOException e) {  
79 - // Ignore ...  
80 - }  
81 - }  
82 - }  
83 - System.out.println("- Downloading from: : " + url);  
84 -  
85 - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);  
86 - if (!outputFile.getParentFile().exists()) {  
87 - if (!outputFile.getParentFile().mkdirs()) {  
88 - System.out.println(  
89 - "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'");  
90 - }  
91 - }  
92 - System.out.println("- Downloading to: " + outputFile.getAbsolutePath());  
93 - try {  
94 - downloadFileFromURL(url, outputFile);  
95 - System.out.println("Done");  
96 - System.exit(0);  
97 - } catch (Throwable e) {  
98 - System.out.println("- Error downloading");  
99 - e.printStackTrace();  
100 - System.exit(1);  
101 - }  
102 - }  
103 -  
104 - private static void downloadFileFromURL(String urlString, File destination) throws Exception {  
105 - URL website = new URL(urlString);  
106 - ReadableByteChannel rbc;  
107 - rbc = Channels.newChannel(website.openStream());  
108 - FileOutputStream fos = new FileOutputStream(destination);  
109 - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);  
110 - fos.close();  
111 - rbc.close();  
112 - }  
113 -  
114 -}  
cloud/ailive/.mvn/wrapper/maven-wrapper.jar
No preview for this file type
cloud/ailive/.mvn/wrapper/maven-wrapper.properties
@@ -1 +0,0 @@ @@ -1 +0,0 @@
1 -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip  
cloud/ailive/mvnw
@@ -1,286 +0,0 @@ @@ -1,286 +0,0 @@
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 -# Maven2 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 - # TODO classpath?  
118 -fi  
119 -  
120 -if [ -z "$JAVA_HOME" ]; then  
121 - javaExecutable="`which javac`"  
122 - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then  
123 - # readlink(1) is not available as standard on Solaris 10.  
124 - readLink=`which readlink`  
125 - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then  
126 - if $darwin ; then  
127 - javaHome="`dirname \"$javaExecutable\"`"  
128 - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"  
129 - else  
130 - javaExecutable="`readlink -f \"$javaExecutable\"`"  
131 - fi  
132 - javaHome="`dirname \"$javaExecutable\"`"  
133 - javaHome=`expr "$javaHome" : '\(.*\)/bin'`  
134 - JAVA_HOME="$javaHome"  
135 - export JAVA_HOME  
136 - fi  
137 - fi  
138 -fi  
139 -  
140 -if [ -z "$JAVACMD" ] ; then  
141 - if [ -n "$JAVA_HOME" ] ; then  
142 - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then  
143 - # IBM's JDK on AIX uses strange locations for the executables  
144 - JAVACMD="$JAVA_HOME/jre/sh/java"  
145 - else  
146 - JAVACMD="$JAVA_HOME/bin/java"  
147 - fi  
148 - else  
149 - JAVACMD="`which java`"  
150 - fi  
151 -fi  
152 -  
153 -if [ ! -x "$JAVACMD" ] ; then  
154 - echo "Error: JAVA_HOME is not defined correctly." >&2  
155 - echo " We cannot execute $JAVACMD" >&2  
156 - exit 1  
157 -fi  
158 -  
159 -if [ -z "$JAVA_HOME" ] ; then  
160 - echo "Warning: JAVA_HOME environment variable is not set."  
161 -fi  
162 -  
163 -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher  
164 -  
165 -# traverses directory structure from process work directory to filesystem root  
166 -# first directory with .mvn subdirectory is considered project base directory  
167 -find_maven_basedir() {  
168 -  
169 - if [ -z "$1" ]  
170 - then  
171 - echo "Path not specified to find_maven_basedir"  
172 - return 1  
173 - fi  
174 -  
175 - basedir="$1"  
176 - wdir="$1"  
177 - while [ "$wdir" != '/' ] ; do  
178 - if [ -d "$wdir"/.mvn ] ; then  
179 - basedir=$wdir  
180 - break  
181 - fi  
182 - # workaround for JBEAP-8937 (on Solaris 10/Sparc)  
183 - if [ -d "${wdir}" ]; then  
184 - wdir=`cd "$wdir/.."; pwd`  
185 - fi  
186 - # end of workaround  
187 - done  
188 - echo "${basedir}"  
189 -}  
190 -  
191 -# concatenates all lines of a file  
192 -concat_lines() {  
193 - if [ -f "$1" ]; then  
194 - echo "$(tr -s '\n' ' ' < "$1")"  
195 - fi  
196 -}  
197 -  
198 -BASE_DIR=`find_maven_basedir "$(pwd)"`  
199 -if [ -z "$BASE_DIR" ]; then  
200 - exit 1;  
201 -fi  
202 -  
203 -##########################################################################################  
204 -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central  
205 -# This allows using the maven wrapper in projects that prohibit checking in binary data.  
206 -##########################################################################################  
207 -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then  
208 - if [ "$MVNW_VERBOSE" = true ]; then  
209 - echo "Found .mvn/wrapper/maven-wrapper.jar"  
210 - fi  
211 -else  
212 - if [ "$MVNW_VERBOSE" = true ]; then  
213 - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."  
214 - fi  
215 - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"  
216 - while IFS="=" read key value; do  
217 - case "$key" in (wrapperUrl) jarUrl="$value"; break ;;  
218 - esac  
219 - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"  
220 - if [ "$MVNW_VERBOSE" = true ]; then  
221 - echo "Downloading from: $jarUrl"  
222 - fi  
223 - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"  
224 -  
225 - if command -v wget > /dev/null; then  
226 - if [ "$MVNW_VERBOSE" = true ]; then  
227 - echo "Found wget ... using wget"  
228 - fi  
229 - wget "$jarUrl" -O "$wrapperJarPath"  
230 - elif command -v curl > /dev/null; then  
231 - if [ "$MVNW_VERBOSE" = true ]; then  
232 - echo "Found curl ... using curl"  
233 - fi  
234 - curl -o "$wrapperJarPath" "$jarUrl"  
235 - else  
236 - if [ "$MVNW_VERBOSE" = true ]; then  
237 - echo "Falling back to using Java to download"  
238 - fi  
239 - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"  
240 - if [ -e "$javaClass" ]; then  
241 - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then  
242 - if [ "$MVNW_VERBOSE" = true ]; then  
243 - echo " - Compiling MavenWrapperDownloader.java ..."  
244 - fi  
245 - # Compiling the Java class  
246 - ("$JAVA_HOME/bin/javac" "$javaClass")  
247 - fi  
248 - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then  
249 - # Running the downloader  
250 - if [ "$MVNW_VERBOSE" = true ]; then  
251 - echo " - Running MavenWrapperDownloader.java ..."  
252 - fi  
253 - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")  
254 - fi  
255 - fi  
256 - fi  
257 -fi  
258 -##########################################################################################  
259 -# End of extension  
260 -##########################################################################################  
261 -  
262 -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}  
263 -if [ "$MVNW_VERBOSE" = true ]; then  
264 - echo $MAVEN_PROJECTBASEDIR  
265 -fi  
266 -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"  
267 -  
268 -# For Cygwin, switch paths to Windows format before running java  
269 -if $cygwin; then  
270 - [ -n "$M2_HOME" ] &&  
271 - M2_HOME=`cygpath --path --windows "$M2_HOME"`  
272 - [ -n "$JAVA_HOME" ] &&  
273 - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`  
274 - [ -n "$CLASSPATH" ] &&  
275 - CLASSPATH=`cygpath --path --windows "$CLASSPATH"`  
276 - [ -n "$MAVEN_PROJECTBASEDIR" ] &&  
277 - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`  
278 -fi  
279 -  
280 -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain  
281 -  
282 -exec "$JAVACMD" \  
283 - $MAVEN_OPTS \  
284 - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \  
285 - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \  
286 - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"  
cloud/ailive/mvnw.cmd
@@ -1,161 +0,0 @@ @@ -1,161 +0,0 @@
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 Maven2 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 key stroke 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 my 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.4.2/maven-wrapper-0.4.2.jar"  
124 -FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO (  
125 - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B  
126 -)  
127 -  
128 -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central  
129 -@REM This allows using the maven wrapper in projects that prohibit checking in binary data.  
130 -if exist %WRAPPER_JAR% (  
131 - echo Found %WRAPPER_JAR%  
132 -) else (  
133 - echo Couldn't find %WRAPPER_JAR%, downloading it ...  
134 - echo Downloading from: %DOWNLOAD_URL%  
135 - powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"  
136 - echo Finished downloading %WRAPPER_JAR%  
137 -)  
138 -@REM End of extension  
139 -  
140 -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*  
141 -if ERRORLEVEL 1 goto error  
142 -goto end  
143 -  
144 -:error  
145 -set ERROR_CODE=1  
146 -  
147 -:end  
148 -@endlocal & set ERROR_CODE=%ERROR_CODE%  
149 -  
150 -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost  
151 -@REM check for post script, once with legacy .bat ending and once with .cmd ending  
152 -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"  
153 -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"  
154 -:skipRcPost  
155 -  
156 -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'  
157 -if "%MAVEN_BATCH_PAUSE%" == "on" pause  
158 -  
159 -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%  
160 -  
161 -exit /B %ERROR_CODE%  
cloud/ailive/pom.xml
@@ -1,53 +0,0 @@ @@ -1,53 +0,0 @@
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 http://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.1.6.RELEASE</version>  
9 - <relativePath/> <!-- lookup parent from repository -->  
10 - </parent>  
11 - <groupId>com.ali.live</groupId>  
12 - <artifactId>alilive</artifactId>  
13 - <version>0.0.1-SNAPSHOT</version>  
14 - <name>alilive</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-quartz</artifactId>  
25 - </dependency>  
26 - <dependency>  
27 - <groupId>org.springframework.boot</groupId>  
28 - <artifactId>spring-boot-starter-web</artifactId>  
29 - </dependency>  
30 -  
31 - <dependency>  
32 - <groupId>org.springframework.boot</groupId>  
33 - <artifactId>spring-boot-starter-test</artifactId>  
34 - <scope>test</scope>  
35 - </dependency>  
36 -  
37 - <dependency>  
38 - <groupId>com.aliyun</groupId>  
39 - <artifactId>aliyun-java-sdk-live</artifactId>  
40 - <version>3.7.5</version>  
41 - </dependency>  
42 - </dependencies>  
43 -  
44 - <build>  
45 - <plugins>  
46 - <plugin>  
47 - <groupId>org.springframework.boot</groupId>  
48 - <artifactId>spring-boot-maven-plugin</artifactId>  
49 - </plugin>  
50 - </plugins>  
51 - </build>  
52 -  
53 -</project>  
cloud/ailive/src/main/java/com/ali/live/alilive/AliliveApplication.java
@@ -1,13 +0,0 @@ @@ -1,13 +0,0 @@
1 -package com.ali.live.alilive;  
2 -  
3 -import org.springframework.boot.SpringApplication;  
4 -import org.springframework.boot.autoconfigure.SpringBootApplication;  
5 -  
6 -@SpringBootApplication  
7 -public class AliliveApplication {  
8 -  
9 - public static void main(String[] args) {  
10 - SpringApplication.run(AliliveApplication.class, args);  
11 - }  
12 -  
13 -}  
cloud/ailive/src/main/resources/application.properties
No preview for this file type
cloud/ailive/src/test/java/com/ali/live/alilive/AliliveApplicationTests.java
@@ -1,16 +0,0 @@ @@ -1,16 +0,0 @@
1 -package com.ali.live.alilive;  
2 -  
3 -import org.junit.Test;  
4 -import org.junit.runner.RunWith;  
5 -import org.springframework.boot.test.context.SpringBootTest;  
6 -import org.springframework.test.context.junit4.SpringRunner;  
7 -  
8 -@RunWith(SpringRunner.class)  
9 -@SpringBootTest  
10 -public class AliliveApplicationTests {  
11 -  
12 - @Test  
13 - public void contextLoads() {  
14 - }  
15 -  
16 -}  
cloud/autho/.gitignore 0 → 100644
@@ -0,0 +1,31 @@ @@ -0,0 +1,31 @@
  1 +HELP.md
  2 +target/
  3 +!.mvn/wrapper/maven-wrapper.jar
  4 +!**/src/main/**
  5 +!**/src/test/**
  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 +
  30 +### VS Code ###
  31 +.vscode/
cloud/autho/.mvn/wrapper/MavenWrapperDownloader.java 0 → 100644
@@ -0,0 +1,114 @@ @@ -0,0 +1,114 @@
  1 +/*
  2 +Licensed to the Apache Software Foundation (ASF) under one
  3 +or more contributor license agreements. See the NOTICE file
  4 +distributed with this work for additional information
  5 +regarding copyright ownership. The ASF licenses this file
  6 +to you under the Apache License, Version 2.0 (the
  7 +"License"); you may not use this file except in compliance
  8 +with the License. You may obtain a copy of the License at
  9 +
  10 + https://www.apache.org/licenses/LICENSE-2.0
  11 +
  12 +Unless required by applicable law or agreed to in writing,
  13 +software distributed under the License is distributed on an
  14 +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15 +KIND, either express or implied. See the License for the
  16 +specific language governing permissions and limitations
  17 +under the License.
  18 +*/
  19 +
  20 +import java.io.File;
  21 +import java.io.FileInputStream;
  22 +import java.io.FileOutputStream;
  23 +import java.io.IOException;
  24 +import java.net.URL;
  25 +import java.nio.channels.Channels;
  26 +import java.nio.channels.ReadableByteChannel;
  27 +import java.util.Properties;
  28 +
  29 +public class MavenWrapperDownloader {
  30 +
  31 + /**
  32 + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
  33 + */
  34 + private static final String DEFAULT_DOWNLOAD_URL =
  35 + "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar";
  36 +
  37 + /**
  38 + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
  39 + * use instead of the default one.
  40 + */
  41 + private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
  42 + ".mvn/wrapper/maven-wrapper.properties";
  43 +
  44 + /**
  45 + * Path where the maven-wrapper.jar will be saved to.
  46 + */
  47 + private static final String MAVEN_WRAPPER_JAR_PATH =
  48 + ".mvn/wrapper/maven-wrapper.jar";
  49 +
  50 + /**
  51 + * Name of the property which should be used to override the default download url for the wrapper.
  52 + */
  53 + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
  54 +
  55 + public static void main(String args[]) {
  56 + System.out.println("- Downloader started");
  57 + File baseDirectory = new File(args[0]);
  58 + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
  59 +
  60 + // If the maven-wrapper.properties exists, read it and check if it contains a custom
  61 + // wrapperUrl parameter.
  62 + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
  63 + String url = DEFAULT_DOWNLOAD_URL;
  64 + if (mavenWrapperPropertyFile.exists()) {
  65 + FileInputStream mavenWrapperPropertyFileInputStream = null;
  66 + try {
  67 + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
  68 + Properties mavenWrapperProperties = new Properties();
  69 + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
  70 + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
  71 + } catch (IOException e) {
  72 + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
  73 + } finally {
  74 + try {
  75 + if (mavenWrapperPropertyFileInputStream != null) {
  76 + mavenWrapperPropertyFileInputStream.close();
  77 + }
  78 + } catch (IOException e) {
  79 + // Ignore ...
  80 + }
  81 + }
  82 + }
  83 + System.out.println("- Downloading from: : " + url);
  84 +
  85 + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
  86 + if (!outputFile.getParentFile().exists()) {
  87 + if (!outputFile.getParentFile().mkdirs()) {
  88 + System.out.println(
  89 + "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'");
  90 + }
  91 + }
  92 + System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
  93 + try {
  94 + downloadFileFromURL(url, outputFile);
  95 + System.out.println("Done");
  96 + System.exit(0);
  97 + } catch (Throwable e) {
  98 + System.out.println("- Error downloading");
  99 + e.printStackTrace();
  100 + System.exit(1);
  101 + }
  102 + }
  103 +
  104 + private static void downloadFileFromURL(String urlString, File destination) throws Exception {
  105 + URL website = new URL(urlString);
  106 + ReadableByteChannel rbc;
  107 + rbc = Channels.newChannel(website.openStream());
  108 + FileOutputStream fos = new FileOutputStream(destination);
  109 + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
  110 + fos.close();
  111 + rbc.close();
  112 + }
  113 +
  114 +}
cloud/autho/.mvn/wrapper/maven-wrapper.jar 0 → 100644
No preview for this file type
cloud/autho/.mvn/wrapper/maven-wrapper.properties 0 → 100644
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip
cloud/autho/mvnw 0 → 100644
@@ -0,0 +1,286 @@ @@ -0,0 +1,286 @@
  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 +# Maven2 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 + # TODO classpath?
  118 +fi
  119 +
  120 +if [ -z "$JAVA_HOME" ]; then
  121 + javaExecutable="`which javac`"
  122 + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
  123 + # readlink(1) is not available as standard on Solaris 10.
  124 + readLink=`which readlink`
  125 + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
  126 + if $darwin ; then
  127 + javaHome="`dirname \"$javaExecutable\"`"
  128 + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
  129 + else
  130 + javaExecutable="`readlink -f \"$javaExecutable\"`"
  131 + fi
  132 + javaHome="`dirname \"$javaExecutable\"`"
  133 + javaHome=`expr "$javaHome" : '\(.*\)/bin'`
  134 + JAVA_HOME="$javaHome"
  135 + export JAVA_HOME
  136 + fi
  137 + fi
  138 +fi
  139 +
  140 +if [ -z "$JAVACMD" ] ; then
  141 + if [ -n "$JAVA_HOME" ] ; then
  142 + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
  143 + # IBM's JDK on AIX uses strange locations for the executables
  144 + JAVACMD="$JAVA_HOME/jre/sh/java"
  145 + else
  146 + JAVACMD="$JAVA_HOME/bin/java"
  147 + fi
  148 + else
  149 + JAVACMD="`which java`"
  150 + fi
  151 +fi
  152 +
  153 +if [ ! -x "$JAVACMD" ] ; then
  154 + echo "Error: JAVA_HOME is not defined correctly." >&2
  155 + echo " We cannot execute $JAVACMD" >&2
  156 + exit 1
  157 +fi
  158 +
  159 +if [ -z "$JAVA_HOME" ] ; then
  160 + echo "Warning: JAVA_HOME environment variable is not set."
  161 +fi
  162 +
  163 +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
  164 +
  165 +# traverses directory structure from process work directory to filesystem root
  166 +# first directory with .mvn subdirectory is considered project base directory
  167 +find_maven_basedir() {
  168 +
  169 + if [ -z "$1" ]
  170 + then
  171 + echo "Path not specified to find_maven_basedir"
  172 + return 1
  173 + fi
  174 +
  175 + basedir="$1"
  176 + wdir="$1"
  177 + while [ "$wdir" != '/' ] ; do
  178 + if [ -d "$wdir"/.mvn ] ; then
  179 + basedir=$wdir
  180 + break
  181 + fi
  182 + # workaround for JBEAP-8937 (on Solaris 10/Sparc)
  183 + if [ -d "${wdir}" ]; then
  184 + wdir=`cd "$wdir/.."; pwd`
  185 + fi
  186 + # end of workaround
  187 + done
  188 + echo "${basedir}"
  189 +}
  190 +
  191 +# concatenates all lines of a file
  192 +concat_lines() {
  193 + if [ -f "$1" ]; then
  194 + echo "$(tr -s '\n' ' ' < "$1")"
  195 + fi
  196 +}
  197 +
  198 +BASE_DIR=`find_maven_basedir "$(pwd)"`
  199 +if [ -z "$BASE_DIR" ]; then
  200 + exit 1;
  201 +fi
  202 +
  203 +##########################################################################################
  204 +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
  205 +# This allows using the maven wrapper in projects that prohibit checking in binary data.
  206 +##########################################################################################
  207 +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
  208 + if [ "$MVNW_VERBOSE" = true ]; then
  209 + echo "Found .mvn/wrapper/maven-wrapper.jar"
  210 + fi
  211 +else
  212 + if [ "$MVNW_VERBOSE" = true ]; then
  213 + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
  214 + fi
  215 + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
  216 + while IFS="=" read key value; do
  217 + case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
  218 + esac
  219 + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
  220 + if [ "$MVNW_VERBOSE" = true ]; then
  221 + echo "Downloading from: $jarUrl"
  222 + fi
  223 + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
  224 +
  225 + if command -v wget > /dev/null; then
  226 + if [ "$MVNW_VERBOSE" = true ]; then
  227 + echo "Found wget ... using wget"
  228 + fi
  229 + wget "$jarUrl" -O "$wrapperJarPath"
  230 + elif command -v curl > /dev/null; then
  231 + if [ "$MVNW_VERBOSE" = true ]; then
  232 + echo "Found curl ... using curl"
  233 + fi
  234 + curl -o "$wrapperJarPath" "$jarUrl"
  235 + else
  236 + if [ "$MVNW_VERBOSE" = true ]; then
  237 + echo "Falling back to using Java to download"
  238 + fi
  239 + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
  240 + if [ -e "$javaClass" ]; then
  241 + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
  242 + if [ "$MVNW_VERBOSE" = true ]; then
  243 + echo " - Compiling MavenWrapperDownloader.java ..."
  244 + fi
  245 + # Compiling the Java class
  246 + ("$JAVA_HOME/bin/javac" "$javaClass")
  247 + fi
  248 + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
  249 + # Running the downloader
  250 + if [ "$MVNW_VERBOSE" = true ]; then
  251 + echo " - Running MavenWrapperDownloader.java ..."
  252 + fi
  253 + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
  254 + fi
  255 + fi
  256 + fi
  257 +fi
  258 +##########################################################################################
  259 +# End of extension
  260 +##########################################################################################
  261 +
  262 +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
  263 +if [ "$MVNW_VERBOSE" = true ]; then
  264 + echo $MAVEN_PROJECTBASEDIR
  265 +fi
  266 +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
  267 +
  268 +# For Cygwin, switch paths to Windows format before running java
  269 +if $cygwin; then
  270 + [ -n "$M2_HOME" ] &&
  271 + M2_HOME=`cygpath --path --windows "$M2_HOME"`
  272 + [ -n "$JAVA_HOME" ] &&
  273 + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
  274 + [ -n "$CLASSPATH" ] &&
  275 + CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
  276 + [ -n "$MAVEN_PROJECTBASEDIR" ] &&
  277 + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
  278 +fi
  279 +
  280 +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
  281 +
  282 +exec "$JAVACMD" \
  283 + $MAVEN_OPTS \
  284 + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
  285 + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
  286 + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
cloud/autho/mvnw.cmd 0 → 100644
@@ -0,0 +1,161 @@ @@ -0,0 +1,161 @@
  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 Maven2 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 key stroke 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 my 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.4.2/maven-wrapper-0.4.2.jar"
  124 +FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO (
  125 + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
  126 +)
  127 +
  128 +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
  129 +@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
  130 +if exist %WRAPPER_JAR% (
  131 + echo Found %WRAPPER_JAR%
  132 +) else (
  133 + echo Couldn't find %WRAPPER_JAR%, downloading it ...
  134 + echo Downloading from: %DOWNLOAD_URL%
  135 + powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"
  136 + echo Finished downloading %WRAPPER_JAR%
  137 +)
  138 +@REM End of extension
  139 +
  140 +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
  141 +if ERRORLEVEL 1 goto error
  142 +goto end
  143 +
  144 +:error
  145 +set ERROR_CODE=1
  146 +
  147 +:end
  148 +@endlocal & set ERROR_CODE=%ERROR_CODE%
  149 +
  150 +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
  151 +@REM check for post script, once with legacy .bat ending and once with .cmd ending
  152 +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
  153 +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
  154 +:skipRcPost
  155 +
  156 +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
  157 +if "%MAVEN_BATCH_PAUSE%" == "on" pause
  158 +
  159 +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
  160 +
  161 +exit /B %ERROR_CODE%
cloud/autho/pom.xml 0 → 100644
@@ -0,0 +1,106 @@ @@ -0,0 +1,106 @@
  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.1.7.RELEASE</version>
  9 + <relativePath/> <!-- lookup parent from repository -->
  10 + </parent>
  11 + <groupId>com.sincere</groupId>
  12 + <artifactId>autho</artifactId>
  13 + <version>0.0.1</version>
  14 + <name>autho</name>
  15 + <description>Demo project for Spring Boot</description>
  16 +
  17 + <properties>
  18 + <java.version>1.8</java.version>
  19 + <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
  20 + </properties>
  21 +
  22 + <dependencies>
  23 + <dependency>
  24 + <groupId>com.sincere</groupId>
  25 + <artifactId>common</artifactId>
  26 + <version>0.0.1-SNAPSHOT</version>
  27 + </dependency>
  28 + <dependency>
  29 + <groupId>org.springframework.cloud</groupId>
  30 + <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  31 + </dependency>
  32 + <dependency>
  33 + <groupId>org.springframework.cloud</groupId>
  34 + <artifactId>spring-cloud-starter-oauth2</artifactId>
  35 + </dependency>
  36 +
  37 + <dependency>
  38 + <groupId>org.springframework.cloud</groupId>
  39 + <artifactId>spring-cloud-starter-security</artifactId>
  40 + <version>2.1.3.RELEASE</version>
  41 + </dependency>
  42 +
  43 + <dependency>
  44 + <groupId>org.springframework.boot</groupId>
  45 + <artifactId>spring-boot-starter-test</artifactId>
  46 + <scope>test</scope>
  47 + </dependency>
  48 +
  49 + <dependency>
  50 + <groupId>org.springframework.cloud</groupId>
  51 + <artifactId>spring-cloud-starter-openfeign</artifactId>
  52 + </dependency>
  53 +
  54 + <dependency>
  55 + <groupId>org.springframework.boot</groupId>
  56 + <artifactId>spring-boot-starter-data-redis</artifactId>
  57 + </dependency>
  58 + <dependency>
  59 + <groupId>com.alibaba</groupId>
  60 + <artifactId>fastjson</artifactId>
  61 + <version>1.2.58</version>
  62 + <scope>compile</scope>
  63 + </dependency>
  64 +
  65 + <dependency>
  66 + <groupId>io.grpc</groupId>
  67 + <artifactId>grpc-core</artifactId>
  68 + <version>1.18.0</version>
  69 + </dependency>
  70 +
  71 + <dependency>
  72 + <groupId>io.springfox</groupId>
  73 + <artifactId>springfox-swagger2</artifactId>
  74 + <version>2.9.2</version>
  75 + </dependency>
  76 +
  77 + <dependency>
  78 + <groupId>io.springfox</groupId>
  79 + <artifactId>springfox-swagger-ui</artifactId>
  80 + <version>2.9.2</version>
  81 + </dependency>
  82 +
  83 + </dependencies>
  84 +
  85 + <dependencyManagement>
  86 + <dependencies>
  87 + <dependency>
  88 + <groupId>org.springframework.cloud</groupId>
  89 + <artifactId>spring-cloud-dependencies</artifactId>
  90 + <version>${spring-cloud.version}</version>
  91 + <type>pom</type>
  92 + <scope>import</scope>
  93 + </dependency>
  94 + </dependencies>
  95 + </dependencyManagement>
  96 +
  97 + <build>
  98 + <plugins>
  99 + <plugin>
  100 + <groupId>org.springframework.boot</groupId>
  101 + <artifactId>spring-boot-maven-plugin</artifactId>
  102 + </plugin>
  103 + </plugins>
  104 + </build>
  105 +
  106 +</project>
cloud/autho/src/main/java/com/sincere/autho/AuthoApplication.java 0 → 100644
@@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
  1 +package com.sincere.autho;
  2 +
  3 +import org.springframework.boot.SpringApplication;
  4 +import org.springframework.boot.autoconfigure.SpringBootApplication;
  5 +import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  6 +
  7 +@EnableDiscoveryClient
  8 +@SpringBootApplication
  9 +public class AuthoApplication {
  10 +
  11 + public static void main(String[] args) {
  12 + SpringApplication.run(AuthoApplication.class, args);
  13 + }
  14 +
  15 +}
cloud/autho/src/main/java/com/sincere/autho/annotation/EnableLogging.java 0 → 100644
@@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
  1 +package com.sincere.autho.annotation;
  2 +
  3 +import com.sincere.autho.autoconfigure.LoggingConfigurationSelector;
  4 +import org.springframework.context.annotation.Import;
  5 +
  6 +import java.lang.annotation.*;
  7 +
  8 +
  9 +/**
  10 + * 启动日志框架支持
  11 + * @author owen
  12 + * @create 2017年7月2日
  13 + */
  14 +
  15 +@Target(ElementType.TYPE)
  16 +@Retention(RetentionPolicy.RUNTIME)
  17 +@Documented
  18 +//自动装配starter
  19 +@Import(LoggingConfigurationSelector.class)
  20 +public @interface EnableLogging{
  21 +// String name() ;
  22 +}
0 \ No newline at end of file 23 \ No newline at end of file
cloud/autho/src/main/java/com/sincere/autho/annotation/datasource/DataSource.java 0 → 100644
@@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
  1 +package com.sincere.autho.annotation.datasource;
  2 +
  3 +import java.lang.annotation.*;
  4 +
  5 +
  6 +/**
  7 + * 数据源选择
  8 + * @author owen
  9 + * @create 2017年7月2日
  10 + */
  11 +@Target({ElementType.METHOD, ElementType.TYPE})
  12 +@Retention(RetentionPolicy.RUNTIME)
  13 +@Documented
  14 +public @interface DataSource {
  15 + String name();
  16 +}
0 \ No newline at end of file 17 \ No newline at end of file
cloud/autho/src/main/java/com/sincere/autho/annotation/log/LogAnnotation.java 0 → 100644
@@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
  1 +package com.sincere.autho.annotation.log;
  2 +
  3 +import java.lang.annotation.*;
  4 +
  5 +/**
  6 + * 日志注解
  7 + * @author owen
  8 + * @create 2017年7月2日
  9 + */
  10 +@Target({ElementType.METHOD, ElementType.TYPE})
  11 +@Retention(RetentionPolicy.RUNTIME)
  12 +@Documented
  13 +public @interface LogAnnotation {
  14 +
  15 + /**
  16 + * 模块
  17 + * @return
  18 + */
  19 + String module();
  20 +
  21 + /**
  22 + * 记录执行参数
  23 + * @return
  24 + */
  25 + boolean recordRequestParam() default true;
  26 +}
cloud/autho/src/main/java/com/sincere/autho/autoconfigure/LoggingConfigurationSelector.java 0 → 100644
@@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
  1 +package com.sincere.autho.autoconfigure;
  2 +
  3 +import org.springframework.context.annotation.ImportSelector;
  4 +import org.springframework.core.type.AnnotationMetadata;
  5 +
  6 +/**
  7 + * @author owen
  8 + * @create 2017年7月2日
  9 + * 装配bean
  10 + */
  11 +public class LoggingConfigurationSelector implements ImportSelector {
  12 +
  13 + @Override
  14 + public String[] selectImports(AnnotationMetadata importingClassMetadata) {
  15 + // TODO Auto-generated method stub
  16 +// importingClassMetadata.getAllAnnotationAttributes(EnableEcho.class.getName());
  17 + return new String[] {
  18 + "com.sincere.autho.autoconfigure.datasource.DataSourceAspect",
  19 + "com.sincere.autho.autoconfigure.log.LogAnnotationAspect"
  20 + };
  21 + }
  22 +
  23 +}
cloud/autho/src/main/java/com/sincere/autho/autoconfigure/datasource/DataSourceAspect.java 0 → 100644
@@ -0,0 +1,42 @@ @@ -0,0 +1,42 @@
  1 +package com.sincere.autho.autoconfigure.datasource;
  2 +
  3 +import com.sincere.autho.annotation.datasource.DataSource;
  4 +import com.sincere.common.config.DataSourceHolder;
  5 +import com.sincere.common.config.DataSourceKey;
  6 +import org.aspectj.lang.JoinPoint;
  7 +import org.aspectj.lang.annotation.After;
  8 +import org.aspectj.lang.annotation.Aspect;
  9 +import org.aspectj.lang.annotation.Before;
  10 +import org.slf4j.Logger;
  11 +import org.slf4j.LoggerFactory;
  12 +import org.springframework.core.annotation.Order;
  13 +
  14 +/**
  15 + * 切换数据源Advice
  16 + */
  17 +@Aspect
  18 +@Order(-1) // 保证该AOP在@Transactional之前执行
  19 +public class DataSourceAspect {
  20 +
  21 + private static final Logger logger = LoggerFactory.getLogger(DataSourceAspect.class);
  22 +
  23 + @Before("@annotation(ds)")
  24 + public void changeDataSource(JoinPoint point, DataSource ds) throws Throwable {
  25 + String dsId = ds.name();
  26 + try {
  27 + DataSourceKey dataSourceKey = DataSourceKey.valueOf(dsId);
  28 + DataSourceHolder.setDataSourceKey(dataSourceKey);
  29 + } catch (Exception e) {
  30 + logger.error("数据源[{}]不存在,使用默认数据源 > {}", ds.name(), point.getSignature());
  31 + }
  32 +
  33 +
  34 + }
  35 +
  36 + @After("@annotation(ds)")
  37 + public void restoreDataSource(JoinPoint point, DataSource ds) {
  38 + logger.debug("Revert DataSource : {transIdo} > {}", ds.name(), point.getSignature());
  39 + DataSourceHolder.clearDataSourceKey();
  40 + }
  41 +
  42 +}
0 \ No newline at end of file 43 \ No newline at end of file
cloud/autho/src/main/java/com/sincere/autho/autoconfigure/log/LogAnnotationAspect.java 0 → 100644
@@ -0,0 +1,133 @@ @@ -0,0 +1,133 @@
  1 +package com.sincere.autho.autoconfigure.log;
  2 +
  3 +import com.alibaba.fastjson.JSON;
  4 +import com.alibaba.fastjson.JSONObject;
  5 +import com.sincere.autho.annotation.log.LogAnnotation;
  6 +import com.sincere.autho.log.service.LogService;
  7 +import com.sincere.autho.log.service.impl.LogServiceImpl;
  8 +import com.sincere.autho.utils.SysUserUtil;
  9 +import com.sincere.common.model.log.SysLog;
  10 +import com.sincere.common.model.system.LoginAppUser;
  11 +import com.sincere.common.util.SpringUtils;
  12 +import org.aspectj.lang.ProceedingJoinPoint;
  13 +import org.aspectj.lang.annotation.Around;
  14 +import org.aspectj.lang.annotation.Aspect;
  15 +import org.aspectj.lang.reflect.MethodSignature;
  16 +import org.slf4j.Logger;
  17 +import org.slf4j.LoggerFactory;
  18 +import org.springframework.core.annotation.Order;
  19 +
  20 +import javax.servlet.http.HttpServletRequest;
  21 +import javax.servlet.http.HttpServletResponse;
  22 +import java.util.ArrayList;
  23 +import java.util.Date;
  24 +import java.util.List;
  25 +import java.util.concurrent.CompletableFuture;
  26 +import java.util.concurrent.ThreadLocalRandom;
  27 +
  28 +/**
  29 + * 保存日志
  30 + *
  31 + * @author owen
  32 + * @create 2017年7月2日
  33 + */
  34 +@Aspect
  35 +@Order(-1) // 保证该AOP在@Transactional之前执行
  36 +public class LogAnnotationAspect {
  37 +
  38 + private static final Logger logger = LoggerFactory.getLogger(LogAnnotationAspect.class);
  39 +
  40 + @Around("@annotation(ds)")
  41 + public Object logSave(ProceedingJoinPoint joinPoint, LogAnnotation ds) throws Throwable {
  42 +
  43 + // 请求流水号
  44 + String transid = getRandom();
  45 + // 记录开始时间
  46 + long start = System.currentTimeMillis();
  47 + // 获取方法参数
  48 + String url = null;
  49 + String httpMethod = null;
  50 + Object result = null;
  51 + List<Object> httpReqArgs = new ArrayList<Object>();
  52 + SysLog log = new SysLog();
  53 + log.setCreateTime(new Date());
  54 + LoginAppUser loginAppUser = SysUserUtil.getLoginAppUser();
  55 + if (loginAppUser != null) {
  56 + log.setUsername(loginAppUser.getUsername());
  57 + }
  58 +
  59 + MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
  60 +
  61 + LogAnnotation logAnnotation = methodSignature.getMethod().getDeclaredAnnotation(LogAnnotation.class);
  62 + log.setModule(logAnnotation.module() + ":" + methodSignature.getDeclaringTypeName() + "/"
  63 + + methodSignature.getName());
  64 +
  65 + Object[] args = joinPoint.getArgs();// 参数值
  66 + url = methodSignature.getDeclaringTypeName() + "/"+ methodSignature.getName();
  67 + for (Object object : args) {
  68 + if (object instanceof HttpServletRequest) {
  69 + HttpServletRequest request = (HttpServletRequest) object;
  70 + url = request.getRequestURI();
  71 + httpMethod = request.getMethod();
  72 + } else if (object instanceof HttpServletResponse) {
  73 + } else {
  74 +
  75 + httpReqArgs.add(object);
  76 + }
  77 + }
  78 +
  79 + try {
  80 + String params = JSONObject.toJSONString(httpReqArgs);
  81 + log.setParams(params);
  82 + // 打印请求参数参数
  83 + logger.info("开始请求,transid={}, url={} , httpMethod={}, reqData={} ", transid, url, httpMethod, params);
  84 + } catch (Exception e) {
  85 + logger.error("记录参数失败:{}", e.getMessage());
  86 + }
  87 +
  88 + try {
  89 + // 调用原来的方法
  90 + result = joinPoint.proceed();
  91 + log.setFlag(Boolean.TRUE);
  92 + } catch (Exception e) {
  93 + log.setFlag(Boolean.FALSE);
  94 + log.setRemark(e.getMessage());
  95 +
  96 + throw e;
  97 + } finally {
  98 +
  99 + CompletableFuture.runAsync(() -> {
  100 + try {
  101 + if (logAnnotation.recordRequestParam()) {
  102 + LogService logService = SpringUtils.getBean(LogServiceImpl.class);
  103 + logService.save(log);
  104 + }
  105 + } catch (Exception e) {
  106 + logger.error("记录参数失败:{}", e.getMessage());
  107 + }
  108 +
  109 + });
  110 + // 获取回执报文及耗时
  111 + logger.info("请求完成, transid={}, 耗时={}, resp={}:", transid, (System.currentTimeMillis() - start),
  112 + result == null ? null : JSON.toJSONString(result));
  113 +
  114 + }
  115 + return result;
  116 + }
  117 +
  118 + /**
  119 + * 生成日志随机数
  120 + *
  121 + * @return
  122 + */
  123 + public String getRandom() {
  124 + int i = 0;
  125 + StringBuilder st = new StringBuilder();
  126 + while (i < 5) {
  127 + i++;
  128 + st.append(ThreadLocalRandom.current().nextInt(10));
  129 + }
  130 + return st.toString() + System.currentTimeMillis();
  131 + }
  132 +
  133 +}
0 \ No newline at end of file 134 \ No newline at end of file
cloud/autho/src/main/java/com/sincere/autho/config/OAuth2ServerConfig.java 0 → 100644
@@ -0,0 +1,260 @@ @@ -0,0 +1,260 @@
  1 +
  2 +package com.sincere.autho.config;
  3 +
  4 +import com.sincere.autho.service.RedisAuthorizationCodeServices;
  5 +import com.sincere.autho.service.RedisClientDetailsService;
  6 +import com.sincere.autho.token.RedisTemplateTokenStore;
  7 +import com.sincere.common.props.PermitUrlProperties;
  8 +import org.springframework.beans.factory.annotation.Autowired;
  9 +import org.springframework.boot.autoconfigure.AutoConfigureAfter;
  10 +import org.springframework.boot.context.properties.EnableConfigurationProperties;
  11 +import org.springframework.context.annotation.Bean;
  12 +import org.springframework.context.annotation.Configuration;
  13 +import org.springframework.data.redis.core.RedisTemplate;
  14 +import org.springframework.security.authentication.AuthenticationManager;
  15 +import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  16 +import org.springframework.security.config.annotation.web.builders.WebSecurity;
  17 +import org.springframework.security.core.userdetails.UserDetailsService;
  18 +import org.springframework.security.oauth2.common.OAuth2AccessToken;
  19 +import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
  20 +import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
  21 +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
  22 +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
  23 +import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
  24 +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
  25 +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
  26 +import org.springframework.security.oauth2.provider.code.RandomValueAuthorizationCodeServices;
  27 +import org.springframework.security.oauth2.provider.error.WebResponseExceptionTranslator;
  28 +import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
  29 +import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;
  30 +import org.springframework.security.web.util.matcher.RequestMatcher;
  31 +import org.springframework.stereotype.Component;
  32 +import org.springframework.util.AntPathMatcher;
  33 +
  34 +import javax.annotation.Resource;
  35 +import javax.servlet.http.HttpServletRequest;
  36 +import javax.sql.DataSource;
  37 +
  38 +/**
  39 + * @author owen 624191343@qq.com
  40 + * @version 创建时间:2017年11月12日 上午22:57:51
  41 + */
  42 +@Configuration
  43 +public class OAuth2ServerConfig {
  44 +
  45 + @Resource
  46 + private DataSource dataSource;
  47 + @Resource
  48 + private RedisTemplate<String, Object> redisTemplate;
  49 +
  50 + /**
  51 + * 声明 ClientDetails实现
  52 + */
  53 + @Bean
  54 + public RedisClientDetailsService redisClientDetailsService() {
  55 + RedisClientDetailsService clientDetailsService = new RedisClientDetailsService(dataSource);
  56 + clientDetailsService.setRedisTemplate(redisTemplate);
  57 + return clientDetailsService;
  58 + }
  59 +
  60 +
  61 + @Bean
  62 + public RandomValueAuthorizationCodeServices authorizationCodeServices() {
  63 + RedisAuthorizationCodeServices redisAuthorizationCodeServices = new RedisAuthorizationCodeServices();
  64 + redisAuthorizationCodeServices.setRedisTemplate(redisTemplate);
  65 + return redisAuthorizationCodeServices;
  66 + }
  67 +
  68 + /**
  69 + * @author owen 624191343@qq.com
  70 + * @version 创建时间:2017年11月12日 上午22:57:51 默认token存储在内存中
  71 + * DefaultTokenServices默认处理
  72 + */
  73 + @Component
  74 + @Configuration
  75 + @EnableAuthorizationServer
  76 + @AutoConfigureAfter(AuthorizationServerEndpointsConfigurer.class)
  77 + public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
  78 + /**
  79 + * 注入authenticationManager 来支持 password grant type
  80 + */
  81 + @Autowired
  82 + private AuthenticationManager authenticationManager;
  83 +
  84 + @Autowired
  85 + private UserDetailsService userDetailsService;
  86 +
  87 + @Autowired(required = false)
  88 + private RedisTemplateTokenStore redisTokenStore;
  89 +
  90 + @Autowired(required = false)
  91 + private JwtTokenStore jwtTokenStore;
  92 + @Autowired(required = false)
  93 + private JwtAccessTokenConverter jwtAccessTokenConverter;
  94 +
  95 + @Autowired
  96 + private WebResponseExceptionTranslator webResponseExceptionTranslator;
  97 +
  98 + @Autowired
  99 + private RedisClientDetailsService redisClientDetailsService;
  100 +
  101 + @Autowired(required = false)
  102 + private RandomValueAuthorizationCodeServices authorizationCodeServices;
  103 +
  104 + /**
  105 + * 配置身份认证器,配置认证方式,TokenStore,TokenGranter,OAuth2RequestFactory
  106 + */
  107 + public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
  108 +
  109 + if (jwtTokenStore != null) {
  110 + endpoints.tokenStore(jwtTokenStore).authenticationManager(authenticationManager)
  111 + // 支持
  112 + .userDetailsService(userDetailsService);
  113 + // password
  114 + // grant
  115 + // type;
  116 + } else if (redisTokenStore != null) {
  117 + endpoints.tokenStore(redisTokenStore).authenticationManager(authenticationManager)
  118 + // 支持
  119 + .userDetailsService(userDetailsService);
  120 + // password
  121 + // grant
  122 + // type;
  123 + }
  124 +
  125 + if (jwtAccessTokenConverter != null) {
  126 + endpoints.accessTokenConverter(jwtAccessTokenConverter);
  127 + }
  128 +
  129 + endpoints.authorizationCodeServices(authorizationCodeServices);
  130 +
  131 + endpoints.exceptionTranslator(webResponseExceptionTranslator);
  132 +
  133 + }
  134 +
  135 + /**
  136 + * 配置应用名称 应用id
  137 + * 配置OAuth2的客户端相关信息
  138 + */
  139 + @Override
  140 + public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
  141 +
  142 + // if(clientDetailsService!=null){
  143 + // clients.withClientDetails(clientDetailsService);
  144 + // }else{
  145 + // clients.inMemory().withClient("neusoft1").secret("neusoft1")
  146 + // .authorizedGrantTypes("authorization_code", "password",
  147 + // "refresh_token").scopes("all")
  148 + // .resourceIds(SERVER_RESOURCE_ID).accessTokenValiditySeconds(1200)
  149 + // .refreshTokenValiditySeconds(50000)
  150 + // .and().withClient("neusoft2").secret("neusoft2")
  151 + // .authorizedGrantTypes("authorization_code", "password",
  152 + // "refresh_token").scopes("all")
  153 + // .resourceIds(SERVER_RESOURCE_ID).accessTokenValiditySeconds(1200)
  154 + // .refreshTokenValiditySeconds(50000)
  155 + // ;
  156 + // }
  157 + clients.withClientDetails(redisClientDetailsService);
  158 + redisClientDetailsService.loadAllClientToCache();
  159 + }
  160 +
  161 + /**
  162 + * 对应于配置AuthorizationServer安全认证的相关信息,创建ClientCredentialsTokenEndpointFilter核心过滤器
  163 + */
  164 + @Override
  165 + public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
  166 + // url:/oauth/token_key,exposes
  167 + security.tokenKeyAccess("permitAll()")
  168 + /// public key for token
  169 + /// verification if using
  170 + /// JWT tokens
  171 + // url:/oauth/check_token
  172 + .checkTokenAccess("isAuthenticated()")
  173 + // allow check token
  174 + .allowFormAuthenticationForClients();
  175 +
  176 + // security.allowFormAuthenticationForClients();
  177 + //// security.tokenKeyAccess("permitAll()");
  178 + // security.tokenKeyAccess("isAuthenticated()");
  179 + }
  180 +
  181 + }
  182 +
  183 + /**
  184 + * 资源服务
  185 + */
  186 + @Configuration
  187 + @EnableResourceServer
  188 + @EnableConfigurationProperties(PermitUrlProperties.class)
  189 + public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
  190 +
  191 + @Autowired
  192 + private PermitUrlProperties permitUrlProperties;
  193 +
  194 + public void configure(WebSecurity web) throws Exception {
  195 + web.ignoring().antMatchers("/health");
  196 + web.ignoring().antMatchers("/oauth/user/token");
  197 + web.ignoring().antMatchers("/oauth/client/token");
  198 + }
  199 +
  200 + @Override
  201 + public void configure(HttpSecurity http) throws Exception {
  202 + http.requestMatcher(
  203 + /**
  204 + * 判断来源请求是否包含oauth2授权信息
  205 + */
  206 + new RequestMatcher() {
  207 + private AntPathMatcher antPathMatcher = new AntPathMatcher();
  208 +
  209 + @Override
  210 + public boolean matches(HttpServletRequest request) {
  211 + // 请求参数中包含access_token参数
  212 + if (request.getParameter(OAuth2AccessToken.ACCESS_TOKEN) != null) {
  213 + return true;
  214 + }
  215 +
  216 + // 头部的Authorization值以Bearer开头
  217 + String auth = request.getHeader("Authorization");
  218 + if (auth != null) {
  219 + if (auth.startsWith(OAuth2AccessToken.BEARER_TYPE)) {
  220 + return true;
  221 + }
  222 + }
  223 + if (antPathMatcher.match(request.getRequestURI(), "/oauth/userinfo")) {
  224 + return true;
  225 + }
  226 + if (antPathMatcher.match(request.getRequestURI(), "/oauth/remove/token")) {
  227 + return true;
  228 + }
  229 + if (antPathMatcher.match(request.getRequestURI(), "/oauth/get/token")) {
  230 + return true;
  231 + }
  232 + if (antPathMatcher.match(request.getRequestURI(), "/oauth/refresh/token")) {
  233 + return true;
  234 + }
  235 +
  236 + if (antPathMatcher.match(request.getRequestURI(), "/oauth/token/list")) {
  237 + return true;
  238 + }
  239 +
  240 + if (antPathMatcher.match("/clients/**", request.getRequestURI())) {
  241 + return true;
  242 + }
  243 +
  244 + if (antPathMatcher.match("/services/**", request.getRequestURI())) {
  245 + return true;
  246 + }
  247 + if (antPathMatcher.match("/redis/**", request.getRequestURI())) {
  248 + return true;
  249 + }
  250 + return false;
  251 + }
  252 + }
  253 +
  254 + ).authorizeRequests().antMatchers(permitUrlProperties.getIgnored()).permitAll().anyRequest()
  255 + .authenticated();
  256 + }
  257 +
  258 + }
  259 +
  260 +}
cloud/autho/src/main/java/com/sincere/autho/config/SecurityConfig.java 0 → 100644
@@ -0,0 +1,129 @@ @@ -0,0 +1,129 @@
  1 +package com.sincere.autho.config;
  2 +
  3 +import com.sincere.autho.handler.OauthLogoutHandler;
  4 +import com.sincere.common.props.PermitUrlProperties;
  5 +import org.springframework.beans.factory.annotation.Autowired;
  6 +import org.springframework.boot.context.properties.EnableConfigurationProperties;
  7 +import org.springframework.context.annotation.Bean;
  8 +import org.springframework.context.annotation.Configuration;
  9 +import org.springframework.security.authentication.AuthenticationManager;
  10 +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
  11 +import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  12 +import org.springframework.security.config.annotation.web.builders.WebSecurity;
  13 +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  14 +import org.springframework.security.config.http.SessionCreationPolicy;
  15 +import org.springframework.security.core.userdetails.UserDetailsService;
  16 +import org.springframework.security.crypto.password.PasswordEncoder;
  17 +import org.springframework.security.web.AuthenticationEntryPoint;
  18 +import org.springframework.security.web.authentication.AuthenticationFailureHandler;
  19 +import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
  20 +import org.springframework.security.web.authentication.logout.HttpStatusReturningLogoutSuccessHandler;
  21 +
  22 +/**
  23 + * spring security配置
  24 + * 在WebSecurityConfigurerAdapter不拦截oauth要开放的资源
  25 + */
  26 +@Configuration
  27 +//@EnableWebSecurity
  28 +//@EnableGlobalMethodSecurity(prePostEnabled = true)
  29 +@EnableConfigurationProperties(PermitUrlProperties.class)
  30 +public class SecurityConfig extends WebSecurityConfigurerAdapter {
  31 +
  32 + @Autowired
  33 + private AuthenticationSuccessHandler authenticationSuccessHandler;
  34 + @Autowired
  35 + private AuthenticationFailureHandler authenticationFailureHandler;
  36 + // @Autowired
  37 + // private LogoutSuccessHandler logoutSuccessHandler;
  38 + @Autowired(required = false)
  39 + private AuthenticationEntryPoint authenticationEntryPoint;
  40 + @Autowired
  41 + private UserDetailsService userDetailsService;
  42 +
  43 + @Autowired
  44 + private PasswordEncoder passwordEncoder;
  45 +
  46 + @Autowired
  47 + private OauthLogoutHandler oauthLogoutHandler;
  48 + @Autowired
  49 + private PermitUrlProperties permitUrlProperties ;
  50 +
  51 + @Autowired
  52 + private ValidateCodeSecurityConfig validateCodeSecurityConfig ;
  53 +
  54 + @Override
  55 + public void configure(WebSecurity web) throws Exception {
  56 + web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources", "/configuration/security",
  57 + "/swagger-ui.html", "/webjars/**", "/doc.html", "/login.html");
  58 + web.ignoring().antMatchers("/js/**");
  59 + web.ignoring().antMatchers("/css/**");
  60 + web.ignoring().antMatchers("/health");
  61 + // 忽略登录界面
  62 + web.ignoring().antMatchers("/login.html");
  63 + web.ignoring().antMatchers("/index.html");
  64 + web.ignoring().antMatchers("/oauth/user/token");
  65 + web.ignoring().antMatchers("/oauth/client/token");
  66 + web.ignoring().antMatchers("/validata/code/**");
  67 + web.ignoring().antMatchers(permitUrlProperties.getIgnored());
  68 +
  69 + }
  70 + /**
  71 + * 认证管理
  72 + *
  73 + * @return 认证管理对象
  74 + * @throws Exception
  75 + * 认证异常信息
  76 + */
  77 + @Override
  78 + @Bean
  79 + public AuthenticationManager authenticationManagerBean() throws Exception {
  80 + return super.authenticationManagerBean();
  81 + }
  82 +
  83 + @Override
  84 + protected void configure(HttpSecurity http) throws Exception {
  85 + http.csrf().disable();
  86 +
  87 + http.authorizeRequests()
  88 + .anyRequest().authenticated();
  89 + http.formLogin().loginPage("/login.html").loginProcessingUrl("/user/login")
  90 + .successHandler(authenticationSuccessHandler).failureHandler(authenticationFailureHandler);
  91 +
  92 + // 基于密码 等模式可以无session,不支持授权码模式
  93 + if (authenticationEntryPoint != null) {
  94 + http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint);
  95 + http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
  96 +
  97 + } else {
  98 + // 授权码模式单独处理,需要session的支持,此模式可以支持所有oauth2的认证
  99 + http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);
  100 + }
  101 +
  102 + http.logout().logoutSuccessUrl("/login.html")
  103 + .logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler())
  104 + .addLogoutHandler(oauthLogoutHandler).clearAuthentication(true);
  105 +
  106 + //增加验证码处理
  107 + http.apply(validateCodeSecurityConfig) ;
  108 + // http.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler);
  109 + // 解决不允许显示在iframe的问题
  110 + http.headers().frameOptions().disable();
  111 + http.headers().cacheControl();
  112 +
  113 + }
  114 +
  115 + /**
  116 + * 全局用户信息
  117 + *
  118 + * @param auth
  119 + * 认证管理
  120 + * @throws Exception
  121 + * 用户认证异常信息
  122 + */
  123 + @Autowired
  124 + public void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception {
  125 + auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
  126 + }
  127 +
  128 +
  129 +}
cloud/autho/src/main/java/com/sincere/autho/config/ValidateCodeSecurityConfig.java 0 → 100644
@@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
  1 +/**
  2 + *
  3 + */
  4 +package com.sincere.autho.config;
  5 +
  6 +import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
  7 +import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  8 +import org.springframework.security.web.DefaultSecurityFilterChain;
  9 +import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;
  10 +import org.springframework.stereotype.Component;
  11 +
  12 +import javax.annotation.Resource;
  13 +import javax.servlet.Filter;
  14 +
  15 +/**
  16 + * 校验码相关安全配置
  17 + *
  18 + * @author zlt
  19 + */
  20 +@Component("validateCodeSecurityConfig")
  21 +public class ValidateCodeSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {
  22 + @Resource
  23 + private Filter validateCodeFilter;
  24 +
  25 + @Override
  26 + public void configure(HttpSecurity http) {
  27 + http.addFilterBefore(validateCodeFilter, AbstractPreAuthenticatedProcessingFilter.class);
  28 + }
  29 +}
cloud/autho/src/main/java/com/sincere/autho/control/OAuth2Controller.java 0 → 100644
@@ -0,0 +1,482 @@ @@ -0,0 +1,482 @@
  1 +package com.sincere.autho.control;
  2 +
  3 +import com.fasterxml.jackson.core.JsonProcessingException;
  4 +import com.fasterxml.jackson.databind.ObjectMapper;
  5 +import com.sincere.autho.annotation.log.LogAnnotation;
  6 +import com.sincere.autho.service.RedisClientDetailsService;
  7 +import com.sincere.autho.utils.SpringUtil;
  8 +import com.sincere.common.commons.PageResult;
  9 +import com.sincere.common.model.system.LoginAppUser;
  10 +import com.sincere.common.model.system.SysPermission;
  11 +import io.swagger.annotations.Api;
  12 +import io.swagger.annotations.ApiOperation;
  13 +import io.swagger.annotations.ApiParam;
  14 +import org.apache.commons.collections.MapUtils;
  15 +import org.slf4j.Logger;
  16 +import org.slf4j.LoggerFactory;
  17 +import org.springframework.beans.factory.annotation.Autowired;
  18 +import org.springframework.dao.DataAccessException;
  19 +import org.springframework.data.redis.connection.RedisConnection;
  20 +import org.springframework.data.redis.core.Cursor;
  21 +import org.springframework.data.redis.core.RedisCallback;
  22 +import org.springframework.data.redis.core.RedisTemplate;
  23 +import org.springframework.data.redis.core.ScanOptions;
  24 +import org.springframework.http.HttpStatus;
  25 +import org.springframework.security.authentication.AuthenticationManager;
  26 +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
  27 +import org.springframework.security.core.Authentication;
  28 +import org.springframework.security.core.context.SecurityContextHolder;
  29 +import org.springframework.security.crypto.password.PasswordEncoder;
  30 +import org.springframework.security.oauth2.common.OAuth2AccessToken;
  31 +import org.springframework.security.oauth2.common.exceptions.UnapprovedClientAuthenticationException;
  32 +import org.springframework.security.oauth2.provider.*;
  33 +import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails;
  34 +import org.springframework.security.oauth2.provider.client.ClientCredentialsTokenGranter;
  35 +import org.springframework.security.oauth2.provider.refresh.RefreshTokenGranter;
  36 +import org.springframework.security.oauth2.provider.request.DefaultOAuth2RequestFactory;
  37 +import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
  38 +import org.springframework.security.oauth2.provider.token.TokenStore;
  39 +import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken;
  40 +import org.springframework.web.bind.annotation.PostMapping;
  41 +import org.springframework.web.bind.annotation.RequestMapping;
  42 +import org.springframework.web.bind.annotation.RequestParam;
  43 +import org.springframework.web.bind.annotation.RestController;
  44 +
  45 +import javax.annotation.Resource;
  46 +import javax.servlet.http.HttpServletRequest;
  47 +import javax.servlet.http.HttpServletResponse;
  48 +import java.io.IOException;
  49 +import java.util.*;
  50 +
  51 +/**
  52 + * @author 作者 owen E-mail: 624191343@qq.com
  53 + * @version 创建时间:2018年4月28日 下午2:18:54 类说明
  54 + */
  55 +
  56 +@Api(tags = "OAuth2相关操作")
  57 +@RestController
  58 +public class OAuth2Controller {
  59 +
  60 + private static final Logger logger = LoggerFactory.getLogger(OAuth2Controller.class);
  61 + @Resource
  62 + private ObjectMapper objectMapper; // springmvc启动时自动装配json处理类
  63 + @Autowired
  64 + private PasswordEncoder passwordEncoder;
  65 +
  66 + @Autowired
  67 + private TokenStore tokenStore;
  68 +
  69 + @Autowired
  70 + private RedisTemplate<String, Object> redisTemplate;
  71 +
  72 + @ApiOperation(value = "用户名密码获取token")
  73 + @PostMapping("/oauth/user/token")
  74 + public void getUserTokenInfo(
  75 + @ApiParam(required = true, name = "username", value = "账号") @RequestParam(value = "username") String username,
  76 + @ApiParam(required = true, name = "password", value = "密码") @RequestParam(value = "password") String password,
  77 + HttpServletRequest request, HttpServletResponse response) {
  78 + String clientId = request.getHeader("client_id");
  79 + String clientSecret = request.getHeader("client_secret");
  80 +
  81 + try {
  82 +
  83 + if (clientId == null || "".equals(clientId)) {
  84 + throw new UnapprovedClientAuthenticationException("请求头中无client_id信息");
  85 + }
  86 +
  87 + if (clientSecret == null || "".equals(clientSecret)) {
  88 + throw new UnapprovedClientAuthenticationException("请求头中无client_secret信息");
  89 + }
  90 +
  91 + RedisClientDetailsService clientDetailsService = SpringUtil.getBean(RedisClientDetailsService.class);
  92 +
  93 + ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId);
  94 +
  95 + if (clientDetails == null) {
  96 + throw new UnapprovedClientAuthenticationException("clientId对应的信息不存在");
  97 + } else if (!passwordEncoder.matches(clientSecret, clientDetails.getClientSecret())) {
  98 + throw new UnapprovedClientAuthenticationException("clientSecret不匹配");
  99 + }
  100 +
  101 + TokenRequest tokenRequest = new TokenRequest(MapUtils.EMPTY_MAP, clientId, clientDetails.getScope(),
  102 + "customer");
  103 +
  104 + OAuth2Request oAuth2Request = tokenRequest.createOAuth2Request(clientDetails);
  105 +
  106 + UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
  107 +
  108 + AuthenticationManager authenticationManager = SpringUtil.getBean(AuthenticationManager.class);
  109 +
  110 + Authentication authentication = authenticationManager.authenticate(token);
  111 + SecurityContextHolder.getContext().setAuthentication(authentication);
  112 +
  113 + OAuth2Authentication oAuth2Authentication = new OAuth2Authentication(oAuth2Request, authentication);
  114 +
  115 + AuthorizationServerTokenServices authorizationServerTokenServices = SpringUtil
  116 + .getBean("defaultAuthorizationServerTokenServices", AuthorizationServerTokenServices.class);
  117 +
  118 + OAuth2AccessToken oAuth2AccessToken = authorizationServerTokenServices
  119 + .createAccessToken(oAuth2Authentication);
  120 +
  121 + oAuth2Authentication.setAuthenticated(true);
  122 +
  123 + response.setContentType("application/json;charset=UTF-8");
  124 + response.getWriter().write(objectMapper.writeValueAsString(oAuth2AccessToken));
  125 + response.getWriter().flush();
  126 + response.getWriter().close();
  127 +
  128 + } catch (Exception e) {
  129 +
  130 + response.setStatus(HttpStatus.UNAUTHORIZED.value());
  131 +
  132 + response.setContentType("application/json;charset=UTF-8");
  133 +
  134 + Map<String, String> rsp = new HashMap<>();
  135 + rsp.put("resp_code", HttpStatus.UNAUTHORIZED.value() + "");
  136 + rsp.put("rsp_msg", e.getMessage());
  137 +
  138 + try {
  139 + response.getWriter().write(objectMapper.writeValueAsString(rsp));
  140 + response.getWriter().flush();
  141 + response.getWriter().close();
  142 + } catch (JsonProcessingException e1) {
  143 + // TODO Auto-generated catch block
  144 + e1.printStackTrace();
  145 + } catch (IOException e1) {
  146 + // TODO Auto-generated catch block
  147 + e1.printStackTrace();
  148 + }
  149 +
  150 + }
  151 + }
  152 +
  153 +
  154 + @ApiOperation(value = "clientId获取token")
  155 + @PostMapping("/oauth/client/token")
  156 + @LogAnnotation(module = "autho", recordRequestParam = false)
  157 + public void getClientTokenInfo(HttpServletRequest request, HttpServletResponse response) {
  158 +
  159 + String clientId = request.getHeader("client_id");
  160 + String clientSecret = request.getHeader("client_secret");
  161 + try {
  162 +
  163 + if (clientId == null || "".equals(clientId)) {
  164 + throw new UnapprovedClientAuthenticationException("请求参数中无clientId信息");
  165 + }
  166 +
  167 + if (clientSecret == null || "".equals(clientSecret)) {
  168 + throw new UnapprovedClientAuthenticationException("请求参数中无clientSecret信息");
  169 + }
  170 +
  171 + RedisClientDetailsService clientDetailsService = SpringUtil.getBean(RedisClientDetailsService.class);
  172 +
  173 + ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId);
  174 +
  175 + if (clientDetails == null) {
  176 + throw new UnapprovedClientAuthenticationException("clientId对应的信息不存在");
  177 + } else if (!passwordEncoder.matches(clientSecret, clientDetails.getClientSecret())) {
  178 + throw new UnapprovedClientAuthenticationException("clientSecret不匹配");
  179 + }
  180 +
  181 + Map<String, String> map = new HashMap<>();
  182 + map.put("client_secret", clientSecret);
  183 + map.put("client_id", clientId);
  184 + map.put("grant_type", "client_credentials");
  185 + TokenRequest tokenRequest = new TokenRequest(map, clientId, clientDetails.getScope(), "client_credentials");
  186 +
  187 + OAuth2Request oAuth2Request = tokenRequest.createOAuth2Request(clientDetails);
  188 +
  189 + AuthorizationServerTokenServices authorizationServerTokenServices = SpringUtil
  190 + .getBean("defaultAuthorizationServerTokenServices", AuthorizationServerTokenServices.class);
  191 + OAuth2RequestFactory requestFactory = new DefaultOAuth2RequestFactory(clientDetailsService);
  192 + ClientCredentialsTokenGranter clientCredentialsTokenGranter = new ClientCredentialsTokenGranter(
  193 + authorizationServerTokenServices, clientDetailsService, requestFactory);
  194 +
  195 + clientCredentialsTokenGranter.setAllowRefresh(true);
  196 + OAuth2AccessToken oAuth2AccessToken = clientCredentialsTokenGranter.grant("client_credentials",
  197 + tokenRequest);
  198 +
  199 + response.setContentType("application/json;charset=UTF-8");
  200 + response.getWriter().write(objectMapper.writeValueAsString(oAuth2AccessToken));
  201 + response.getWriter().flush();
  202 + response.getWriter().close();
  203 +
  204 + } catch (Exception e) {
  205 +
  206 + response.setStatus(HttpStatus.UNAUTHORIZED.value());
  207 + response.setContentType("application/json;charset=UTF-8");
  208 + Map<String, String> rsp = new HashMap<>();
  209 + rsp.put("resp_code", HttpStatus.UNAUTHORIZED.value() + "");
  210 + rsp.put("rsp_msg", e.getMessage());
  211 +
  212 + try {
  213 + response.getWriter().write(objectMapper.writeValueAsString(rsp));
  214 + response.getWriter().flush();
  215 + response.getWriter().close();
  216 + } catch (JsonProcessingException e1) {
  217 + // TODO Auto-generated catch block
  218 + e1.printStackTrace();
  219 + } catch (IOException e1) {
  220 + // TODO Auto-generated catch block
  221 + e1.printStackTrace();
  222 + }
  223 +
  224 + }
  225 + }
  226 +
  227 + @ApiOperation(value = "access_token刷新token")
  228 + @PostMapping(value = "/oauth/refresh/token", params = "access_token")
  229 + public void refreshTokenInfo(String access_token, HttpServletRequest request, HttpServletResponse response) {
  230 +
  231 + // 拿到当前用户信息
  232 + try {
  233 + Authentication user = SecurityContextHolder.getContext().getAuthentication();
  234 +
  235 + if (user != null) {
  236 + if (user instanceof OAuth2Authentication) {
  237 + Authentication athentication = (Authentication) user;
  238 + OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) athentication.getDetails();
  239 + }
  240 +
  241 + }
  242 + OAuth2AccessToken accessToken = tokenStore.readAccessToken(access_token);
  243 + OAuth2Authentication auth = (OAuth2Authentication) user;
  244 + RedisClientDetailsService clientDetailsService = SpringUtil.getBean(RedisClientDetailsService.class);
  245 +
  246 + ClientDetails clientDetails = clientDetailsService
  247 + .loadClientByClientId(auth.getOAuth2Request().getClientId());
  248 +
  249 + AuthorizationServerTokenServices authorizationServerTokenServices = SpringUtil
  250 + .getBean("defaultAuthorizationServerTokenServices", AuthorizationServerTokenServices.class);
  251 + OAuth2RequestFactory requestFactory = new DefaultOAuth2RequestFactory(clientDetailsService);
  252 +
  253 + RefreshTokenGranter refreshTokenGranter = new RefreshTokenGranter(authorizationServerTokenServices,
  254 + clientDetailsService, requestFactory);
  255 +
  256 + Map<String, String> map = new HashMap<>();
  257 + map.put("grant_type", "refresh_token");
  258 + map.put("refresh_token", accessToken.getRefreshToken().getValue());
  259 + TokenRequest tokenRequest = new TokenRequest(map, auth.getOAuth2Request().getClientId(),
  260 + auth.getOAuth2Request().getScope(), "refresh_token");
  261 +
  262 + OAuth2AccessToken oAuth2AccessToken = refreshTokenGranter.grant("refresh_token", tokenRequest);
  263 +
  264 + tokenStore.removeAccessToken(accessToken);
  265 +
  266 + response.setContentType("application/json;charset=UTF-8");
  267 + response.getWriter().write(objectMapper.writeValueAsString(oAuth2AccessToken));
  268 + response.getWriter().flush();
  269 + response.getWriter().close();
  270 + } catch (Exception e) {
  271 + response.setStatus(HttpStatus.UNAUTHORIZED.value());
  272 + response.setContentType("application/json;charset=UTF-8");
  273 + Map<String, String> rsp = new HashMap<>();
  274 + rsp.put("resp_code", HttpStatus.UNAUTHORIZED.value() + "");
  275 + rsp.put("rsp_msg", e.getMessage());
  276 +
  277 + try {
  278 + response.getWriter().write(objectMapper.writeValueAsString(rsp));
  279 + response.getWriter().flush();
  280 + response.getWriter().close();
  281 + } catch (JsonProcessingException e1) {
  282 + // TODO Auto-generated catch block
  283 + e1.printStackTrace();
  284 + } catch (IOException e1) {
  285 + // TODO Auto-generated catch block
  286 + e1.printStackTrace();
  287 + }
  288 + }
  289 +
  290 + }
  291 +
  292 + /**
  293 + * 移除access_token和refresh_token
  294 + *
  295 + * @param access_token
  296 + */
  297 + @ApiOperation(value = "移除token")
  298 + @PostMapping(value = "/oauth/remove/token", params = "access_token")
  299 + public void removeToken(String access_token) {
  300 +
  301 + // 拿到当前用户信息
  302 + Authentication user = SecurityContextHolder.getContext().getAuthentication();
  303 +
  304 + if (user != null) {
  305 + if (user instanceof OAuth2Authentication) {
  306 + Authentication athentication = (Authentication) user;
  307 + OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) athentication.getDetails();
  308 + }
  309 +
  310 + }
  311 + OAuth2AccessToken accessToken = tokenStore.readAccessToken(access_token);
  312 + if (accessToken != null) {
  313 + // 移除access_token
  314 + tokenStore.removeAccessToken(accessToken);
  315 +
  316 + // 移除refresh_token
  317 + if (accessToken.getRefreshToken() != null) {
  318 + tokenStore.removeRefreshToken(accessToken.getRefreshToken());
  319 + }
  320 +
  321 + }
  322 + }
  323 +
  324 + @ApiOperation(value = "获取token信息")
  325 + @PostMapping(value = "/oauth/get/token", params = "access_token")
  326 + public OAuth2AccessToken getTokenInfo(String access_token) {
  327 +
  328 + // 拿到当前用户信息
  329 + Authentication user = SecurityContextHolder.getContext().getAuthentication();
  330 +
  331 + if (user != null) {
  332 + if (user instanceof OAuth2Authentication) {
  333 + Authentication athentication = (Authentication) user;
  334 + OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) athentication.getDetails();
  335 + }
  336 +
  337 + }
  338 + OAuth2AccessToken accessToken = tokenStore.readAccessToken(access_token);
  339 +
  340 + return accessToken;
  341 +
  342 + }
  343 +
  344 + /**
  345 + * 当前登陆用户信息
  346 + * security获取当前登录用户的方法是SecurityContextHolder.getContext().getAuthentication()
  347 + * 这里的实现类是org.springframework.security.oauth2.provider.OAuth2Authentication
  348 + *
  349 + * @return
  350 + */
  351 + @ApiOperation(value = "当前登陆用户信息")
  352 + @RequestMapping(value = { "/oauth/userinfo" }, produces = "application/json") // 获取用户信息。/auth/user
  353 + public Map<String, Object> getCurrentUserDetail() {
  354 + Map<String, Object> userInfo = new HashMap<>();
  355 + userInfo.put("user", SecurityContextHolder.getContext().getAuthentication().getPrincipal());
  356 + logger.debug("认证详细信息:" + SecurityContextHolder.getContext().getAuthentication().getPrincipal().toString());
  357 +
  358 + List<SysPermission> permissions = new ArrayList<>();
  359 +
  360 + new ArrayList(SecurityContextHolder.getContext().getAuthentication().getAuthorities()).forEach(o -> {
  361 + SysPermission sysPermission = new SysPermission();
  362 + sysPermission.setPermission(o.toString());
  363 + permissions.add(sysPermission);
  364 + });
  365 + // userInfo.put("authorities",
  366 + // AuthorityUtils.authorityListToSet(SecurityContextHolder.getContext().getAuthentication().getAuthorities())
  367 + // );
  368 + userInfo.put("permissions", permissions);
  369 +
  370 + userInfo.put("resp_code", "200");
  371 +
  372 + logger.info("返回信息:{}", userInfo);
  373 +
  374 + return userInfo;
  375 + }
  376 +
  377 + @ApiOperation(value = "token列表")
  378 + @PostMapping("/oauth/token/list")
  379 + public PageResult<HashMap<String, String>> getUserTokenInfo(@RequestParam Map<String, Object> params)
  380 + throws Exception {
  381 + List<HashMap<String, String>> list = new ArrayList<>();
  382 +
  383 + Set<String> keys = redisTemplate.keys("access:" + "*") ;
  384 +// Object key1 = keys.toArray()[0];
  385 +// Object token1 = redisTemplate.opsForValue().get(key1);
  386 + //根据分页参数获取对应数据
  387 + // List<String> pages = findKeysForPage("access:" + "*", MapUtils.getInteger(params, "page"),MapUtils.getInteger(params, "limit"));
  388 +
  389 + for (Object key: keys.toArray()) {
  390 +// String key = page;
  391 +// String accessToken = StringUtils.substringAfter(key, "access:");
  392 +// OAuth2AccessToken token = tokenStore.readAccessToken(accessToken);
  393 + OAuth2AccessToken token = (OAuth2AccessToken)redisTemplate.opsForValue().get(key);
  394 + HashMap<String, String> map = new HashMap<String, String>();
  395 +
  396 + try {
  397 + map.put("token_type", token.getTokenType());
  398 + map.put("token_value", token.getValue());
  399 + map.put("expires_in", token.getExpiresIn()+"");
  400 + } catch (Exception e) {
  401 +
  402 + }
  403 +
  404 +
  405 + OAuth2Authentication oAuth2Auth = tokenStore.readAuthentication(token);
  406 + Authentication authentication = oAuth2Auth.getUserAuthentication();
  407 +
  408 + map.put("client_id", oAuth2Auth.getOAuth2Request().getClientId());
  409 + map.put("grant_type", oAuth2Auth.getOAuth2Request().getGrantType());
  410 +
  411 + if (authentication instanceof UsernamePasswordAuthenticationToken) {
  412 + UsernamePasswordAuthenticationToken authenticationToken = (UsernamePasswordAuthenticationToken) authentication;
  413 +
  414 + if(authenticationToken.getPrincipal() instanceof LoginAppUser ){
  415 + LoginAppUser user = (LoginAppUser) authenticationToken.getPrincipal();
  416 + map.put("user_id", user.getId()+"");
  417 + map.put("user_name", user.getUsername()+"");
  418 + map.put("user_head_imgurl", user.getHeadImgUrl()+"");
  419 + }
  420 +
  421 +
  422 + }else if (authentication instanceof PreAuthenticatedAuthenticationToken){
  423 + //刷新token方式
  424 + PreAuthenticatedAuthenticationToken authenticationToken = (PreAuthenticatedAuthenticationToken) authentication;
  425 + if(authenticationToken.getPrincipal() instanceof LoginAppUser ){
  426 + LoginAppUser user = (LoginAppUser) authenticationToken.getPrincipal();
  427 + map.put("user_id", user.getId()+"");
  428 + map.put("user_name", user.getUsername()+"");
  429 + map.put("user_head_imgurl", user.getHeadImgUrl()+"");
  430 + }
  431 +
  432 + }
  433 + list.add(map);
  434 +
  435 + }
  436 +
  437 +
  438 +
  439 + return PageResult.<HashMap<String, String>>builder().data(list).code(0).count((long) keys.size()).build();
  440 +
  441 + }
  442 +
  443 + public List<String> findKeysForPage(String patternKey, int pageNum, int pageSize) {
  444 +
  445 + Set<String> execute = redisTemplate.execute(new RedisCallback<Set<String>>() {
  446 +
  447 + @Override
  448 + public Set<String> doInRedis(RedisConnection connection) throws DataAccessException {
  449 +
  450 + Set<String> binaryKeys = new HashSet<>();
  451 +
  452 + Cursor<byte[]> cursor = connection
  453 + .scan(new ScanOptions.ScanOptionsBuilder().match(patternKey).count(1000).build());
  454 + int tmpIndex = 0;
  455 + int startIndex = (pageNum - 1) * pageSize;
  456 + int end = pageNum * pageSize;
  457 + while (cursor.hasNext()) {
  458 + if (tmpIndex >= startIndex && tmpIndex < end) {
  459 + binaryKeys.add(new String(cursor.next()));
  460 + tmpIndex++;
  461 + continue;
  462 + }
  463 +
  464 + // 获取到满足条件的数据后,就可以退出了
  465 + if (tmpIndex >= end) {
  466 + break;
  467 + }
  468 +
  469 + tmpIndex++;
  470 + cursor.next();
  471 + }
  472 + connection.close();
  473 + return binaryKeys;
  474 + }
  475 + });
  476 +
  477 + List<String> result = new ArrayList<String>(pageSize);
  478 + result.addAll(execute);
  479 + return result;
  480 + }
  481 +
  482 +}
cloud/autho/src/main/java/com/sincere/autho/control/UserController.java 0 → 100644
@@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
  1 +package com.sincere.autho.control;
  2 +
  3 +import org.springframework.web.bind.annotation.GetMapping;
  4 +import org.springframework.web.bind.annotation.RestController;
  5 +
  6 +import java.security.Principal;
  7 +
  8 +@RestController
  9 +public class UserController {
  10 +
  11 + @GetMapping("/user")
  12 + public Principal user(Principal user){
  13 + return user;
  14 + }
  15 +
  16 +}
cloud/autho/src/main/java/com/sincere/autho/handler/ExceptionHandlerAdvice.java 0 → 100644
@@ -0,0 +1,63 @@ @@ -0,0 +1,63 @@
  1 +package com.sincere.autho.handler;
  2 +
  3 +import io.grpc.StatusRuntimeException;
  4 +import org.springframework.http.HttpStatus;
  5 +import org.springframework.security.access.AccessDeniedException;
  6 +import org.springframework.web.bind.annotation.ExceptionHandler;
  7 +import org.springframework.web.bind.annotation.ResponseStatus;
  8 +import org.springframework.web.bind.annotation.RestControllerAdvice;
  9 +
  10 +import java.util.HashMap;
  11 +import java.util.Map;
  12 +
  13 +
  14 +/**
  15 + * @author 作者 owen E-mail: 624191343@qq.com
  16 + * @version 创建时间:2017年11月12日 上午22:57:51
  17 + * 异常通用处理
  18 +*/
  19 +@RestControllerAdvice
  20 +public class ExceptionHandlerAdvice {
  21 +
  22 + /**
  23 + * IllegalArgumentException异常处理返回json
  24 + * 状态码:400
  25 + * @param exception
  26 + * @return
  27 + */
  28 + @ExceptionHandler({ IllegalArgumentException.class })
  29 + @ResponseStatus(HttpStatus.BAD_REQUEST)
  30 + public Map<String, Object> badRequestException(IllegalArgumentException exception) {
  31 + Map<String, Object> data = new HashMap<>();
  32 + data.put("resp_code", HttpStatus.BAD_REQUEST.value());
  33 + data.put("resp_msg", exception.getMessage());
  34 +
  35 + return data;
  36 + }
  37 + /**
  38 + * AccessDeniedException异常处理返回json
  39 + * 状态码:403
  40 + * @param exception
  41 + * @return
  42 + */
  43 + @ExceptionHandler({ AccessDeniedException.class })
  44 + @ResponseStatus(HttpStatus.FORBIDDEN)
  45 + public Map<String, Object> badMethodExpressException(AccessDeniedException exception) {
  46 + Map<String, Object> data = new HashMap<>();
  47 + data.put("resp_code", HttpStatus.FORBIDDEN.value());
  48 + data.put("resp_msg", exception.getMessage());
  49 +
  50 + return data;
  51 + }
  52 + @ExceptionHandler({ StatusRuntimeException.class })
  53 + @ResponseStatus(HttpStatus.BAD_REQUEST)
  54 + public Map<String, Object> badRequestException(StatusRuntimeException exception) {
  55 + Map<String, Object> data = new HashMap<>();
  56 + data.put("resp_code", HttpStatus.INTERNAL_SERVER_ERROR.value());
  57 + data.put("resp_msg", exception.getMessage());
  58 +
  59 + return data;
  60 + }
  61 +
  62 +
  63 +}
cloud/autho/src/main/java/com/sincere/autho/handler/OauthLogoutHandler.java 0 → 100644
@@ -0,0 +1,90 @@ @@ -0,0 +1,90 @@
  1 +package com.sincere.autho.handler;
  2 +
  3 +import org.slf4j.Logger;
  4 +import org.slf4j.LoggerFactory;
  5 +import org.springframework.beans.factory.annotation.Autowired;
  6 +import org.springframework.security.core.Authentication;
  7 +import org.springframework.security.oauth2.common.OAuth2AccessToken;
  8 +import org.springframework.security.oauth2.common.OAuth2RefreshToken;
  9 +import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails;
  10 +import org.springframework.security.oauth2.provider.token.TokenStore;
  11 +import org.springframework.security.web.authentication.logout.LogoutHandler;
  12 +import org.springframework.util.Assert;
  13 +
  14 +import javax.servlet.http.HttpServletRequest;
  15 +import javax.servlet.http.HttpServletResponse;
  16 +import java.util.Enumeration;
  17 +
  18 +/**
  19 + * @author keets
  20 + * @date 2017/10/17
  21 + */
  22 +public class OauthLogoutHandler implements LogoutHandler {
  23 +
  24 + private static final Logger logger = LoggerFactory.getLogger(OauthLogoutHandler.class);
  25 +
  26 + @Autowired
  27 + private TokenStore tokenStore;
  28 +
  29 + @Override
  30 + public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
  31 + Assert.notNull(tokenStore, "tokenStore must be set");
  32 + String token = extractToken(request);
  33 + if(token!=null || !"".equals(token)){
  34 + OAuth2AccessToken existingAccessToken = tokenStore.readAccessToken(token);
  35 + OAuth2RefreshToken refreshToken;
  36 + if (existingAccessToken != null) {
  37 + if (existingAccessToken.getRefreshToken() != null) {
  38 + logger.info("remove refreshToken!", existingAccessToken.getRefreshToken());
  39 + refreshToken = existingAccessToken.getRefreshToken();
  40 + tokenStore.removeRefreshToken(refreshToken);
  41 + }
  42 + logger.info("remove existingAccessToken!", existingAccessToken);
  43 + tokenStore.removeAccessToken(existingAccessToken);
  44 + }
  45 + return;
  46 + }
  47 +
  48 + }
  49 +
  50 + protected String extractToken(HttpServletRequest request) {
  51 + // first check the header...
  52 + String token = extractHeaderToken(request);
  53 +
  54 + // bearer type allows a request parameter as well
  55 + if (token == null) {
  56 + logger.debug("Token not found in headers. Trying request parameters.");
  57 + token = request.getParameter(OAuth2AccessToken.ACCESS_TOKEN);
  58 + if (token == null) {
  59 + logger.debug("Token not found in request parameters. Not an OAuth2 request.");
  60 + } else {
  61 + request.setAttribute(OAuth2AuthenticationDetails.ACCESS_TOKEN_TYPE, OAuth2AccessToken.BEARER_TYPE);
  62 + }
  63 + }
  64 +
  65 + return token;
  66 + }
  67 +
  68 + protected String extractHeaderToken(HttpServletRequest request) {
  69 + Enumeration<String> headers = request.getHeaders("Authorization");
  70 + while (headers.hasMoreElements()) { // typically there is only one (most
  71 + // servers enforce that)
  72 + String value = headers.nextElement();
  73 + if ((value.toLowerCase().startsWith(OAuth2AccessToken.BEARER_TYPE.toLowerCase()))) {
  74 + String authHeaderValue = value.substring(OAuth2AccessToken.BEARER_TYPE.length()).trim();
  75 + // Add this here for the auth details later. Would be better to
  76 + // change the signature of this method.
  77 + request.setAttribute(OAuth2AuthenticationDetails.ACCESS_TOKEN_TYPE,
  78 + value.substring(0, OAuth2AccessToken.BEARER_TYPE.length()).trim());
  79 + int commaIndex = authHeaderValue.indexOf(',');
  80 + if (commaIndex > 0) {
  81 + authHeaderValue = authHeaderValue.substring(0, commaIndex);
  82 + }
  83 + return authHeaderValue;
  84 + }
  85 + }
  86 +
  87 + return null;
  88 + }
  89 +
  90 +}
cloud/autho/src/main/java/com/sincere/autho/log/dao/LogDao.java 0 → 100644
@@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
  1 +package com.sincere.autho.log.dao;
  2 +
  3 +import com.sincere.common.model.log.SysLog;
  4 +import org.apache.ibatis.annotations.Insert;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +
  7 +@Mapper
  8 +public interface LogDao {
  9 +
  10 + @Insert("insert into sys_log(username, module, params, remark, flag, createTime) values(#{username}, #{module}, #{params}, #{remark}, #{flag}, #{createTime})")
  11 + int save(SysLog log);
  12 +
  13 +}
cloud/autho/src/main/java/com/sincere/autho/log/service/LogService.java 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +package com.sincere.autho.log.service;
  2 +
  3 +
  4 +import com.sincere.common.model.log.SysLog;
  5 +
  6 +public interface LogService {
  7 +
  8 + void save(SysLog log);
  9 +
  10 +
  11 +}
cloud/autho/src/main/java/com/sincere/autho/log/service/impl/LogServiceImpl.java 0 → 100644
@@ -0,0 +1,34 @@ @@ -0,0 +1,34 @@
  1 +package com.sincere.autho.log.service.impl;
  2 +
  3 +import com.sincere.autho.annotation.datasource.DataSource;
  4 +import com.sincere.autho.log.dao.LogDao;
  5 +import com.sincere.autho.log.service.LogService;
  6 +import com.sincere.common.model.log.SysLog;
  7 +import org.springframework.beans.factory.annotation.Autowired;
  8 +import org.springframework.scheduling.annotation.Async;
  9 +import org.springframework.stereotype.Service;
  10 +
  11 +import java.util.Date;
  12 +
  13 +@Service
  14 +public class LogServiceImpl implements LogService {
  15 +
  16 + @Autowired
  17 + private LogDao logDao;
  18 +
  19 + @Async
  20 + @Override
  21 + @DataSource(name="log")
  22 + public void save(SysLog log) {
  23 + if (log.getCreateTime() == null) {
  24 + log.setCreateTime(new Date());
  25 + }
  26 + if (log.getFlag() == null) {
  27 + log.setFlag(Boolean.TRUE);
  28 + }
  29 +
  30 + logDao.save(log);
  31 + }
  32 +
  33 +
  34 +}
cloud/autho/src/main/java/com/sincere/autho/service/RedisAuthorizationCodeServices.java 0 → 100644
@@ -0,0 +1,58 @@ @@ -0,0 +1,58 @@
  1 +package com.sincere.autho.service;
  2 +
  3 +import org.springframework.data.redis.core.RedisTemplate;
  4 +import org.springframework.security.oauth2.provider.OAuth2Authentication;
  5 +import org.springframework.security.oauth2.provider.code.RandomValueAuthorizationCodeServices;
  6 +
  7 +import java.util.concurrent.TimeUnit;
  8 +
  9 +/**
  10 + * JdbcAuthorizationCodeServices替换
  11 + */
  12 +public class RedisAuthorizationCodeServices extends RandomValueAuthorizationCodeServices {
  13 +
  14 + private RedisTemplate<String,Object> redisTemplate ;
  15 +
  16 +
  17 + public RedisTemplate<String, Object> getRedisTemplate() {
  18 + return redisTemplate;
  19 + }
  20 +
  21 + public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
  22 + this.redisTemplate = redisTemplate;
  23 + }
  24 +
  25 + /**
  26 + * 替换JdbcAuthorizationCodeServices的存储策略
  27 + * 将存储code到redis,并设置过期时间,10分钟<br>
  28 + */
  29 + @Override
  30 + protected void store(String code, OAuth2Authentication authentication) {
  31 +
  32 + redisTemplate.opsForValue().set(redisKey(code), authentication, 10, TimeUnit.MINUTES);
  33 +
  34 +
  35 + }
  36 +
  37 + @Override
  38 + protected OAuth2Authentication remove(final String code) {
  39 +
  40 + String codeKey =redisKey(code) ;
  41 +
  42 + OAuth2Authentication token = (OAuth2Authentication) redisTemplate.opsForValue().get(codeKey) ;
  43 +
  44 + this.redisTemplate.delete(codeKey);
  45 +
  46 + return token;
  47 + }
  48 +
  49 + /**
  50 + * redis中 code key的前缀
  51 + *
  52 + * @param code
  53 + * @return
  54 + */
  55 + private String redisKey(String code) {
  56 + return "oauth:code:" + code;
  57 + }
  58 +}
cloud/autho/src/main/java/com/sincere/autho/service/RedisClientDetailsService.java 0 → 100644
@@ -0,0 +1,153 @@ @@ -0,0 +1,153 @@
  1 +package com.sincere.autho.service;
  2 +
  3 +import com.alibaba.fastjson.JSONObject;
  4 +import org.apache.commons.lang.StringUtils;
  5 +import org.slf4j.Logger;
  6 +import org.slf4j.LoggerFactory;
  7 +import org.springframework.data.redis.core.RedisTemplate;
  8 +import org.springframework.security.oauth2.common.exceptions.InvalidClientException;
  9 +import org.springframework.security.oauth2.provider.ClientDetails;
  10 +import org.springframework.security.oauth2.provider.NoSuchClientException;
  11 +import org.springframework.security.oauth2.provider.client.BaseClientDetails;
  12 +import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService;
  13 +import org.springframework.util.CollectionUtils;
  14 +
  15 +import javax.sql.DataSource;
  16 +import java.util.List;
  17 +
  18 +
  19 +/**
  20 + * @author owen 624191343@qq.com
  21 + * @version 创建时间:2017年11月12日 上午22:57:51
  22 + * 类说明
  23 + * 将oauth_client_details表数据缓存到redis,这里做个缓存优化
  24 + * layui模块中有对oauth_client_details的crud, 注意同步redis的数据
  25 + * 注意对oauth_client_details清楚redis db部分数据的清空
  26 + */
  27 +
  28 +public class RedisClientDetailsService extends JdbcClientDetailsService {
  29 +
  30 +
  31 + // 扩展 默认的 ClientDetailsService, 增加逻辑删除判断( status = 1)
  32 + private static final String SELECT_CLIENT_DETAILS_SQL = "select client_id, client_secret, resource_ids, scope, authorized_grant_types, " +
  33 + "web_server_redirect_uri, authorities, access_token_validity, refresh_token_validity, additional_information, autoapprove " +
  34 + "from oauth_client_details where client_id = ? and `status` = 1 ";
  35 +
  36 +
  37 + private static final String SELECT_FIND_STATEMENT = "select client_id, client_secret,resource_ids, scope, "
  38 + + "authorized_grant_types, web_server_redirect_uri, authorities, access_token_validity, "
  39 + + "refresh_token_validity, additional_information, autoapprove from oauth_client_details where `status` = 1 order by client_id " ;
  40 +
  41 + /**
  42 + * 缓存client的redis key,这里是hash结构存储
  43 + */
  44 + private static final String CACHE_CLIENT_KEY = "oauth_client_details";
  45 +
  46 + private Logger logger = LoggerFactory.getLogger(RedisClientDetailsService.class) ;
  47 +
  48 + private RedisTemplate<String,Object> redisTemplate ;
  49 +
  50 + public RedisTemplate<String, Object> getRedisTemplate() {
  51 + return redisTemplate;
  52 + }
  53 +
  54 + public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
  55 + this.redisTemplate = redisTemplate;
  56 + }
  57 +
  58 + public RedisClientDetailsService(DataSource dataSource) {
  59 + super(dataSource);
  60 + setSelectClientDetailsSql(SELECT_CLIENT_DETAILS_SQL) ;
  61 + setFindClientDetailsSql(SELECT_FIND_STATEMENT) ;
  62 + }
  63 +
  64 +
  65 +
  66 + @Override
  67 + public ClientDetails loadClientByClientId(String clientId) throws InvalidClientException {
  68 + ClientDetails clientDetails = null;
  69 +
  70 + // 先从redis获取
  71 + String value = (String) redisTemplate.boundHashOps(CACHE_CLIENT_KEY).get(clientId);
  72 + if (StringUtils.isBlank(value)) {
  73 + clientDetails = cacheAndGetClient(clientId);
  74 + } else {
  75 + clientDetails = JSONObject.parseObject(value, BaseClientDetails.class);
  76 + }
  77 +
  78 + return clientDetails;
  79 + }
  80 +
  81 + /**
  82 + * 缓存client并返回client
  83 + *
  84 + * @param clientId
  85 + * @return
  86 + */
  87 + private ClientDetails cacheAndGetClient(String clientId) {
  88 + // 从数据库读取
  89 + ClientDetails clientDetails = null ;
  90 + try {
  91 + clientDetails = super.loadClientByClientId(clientId);
  92 + if (clientDetails != null) {
  93 + // 写入redis缓存
  94 + redisTemplate.boundHashOps(CACHE_CLIENT_KEY).put(clientId, JSONObject.toJSONString(clientDetails));
  95 + logger.info("缓存clientId:{},{}", clientId, clientDetails);
  96 + }
  97 + }catch (NoSuchClientException e){
  98 + logger.info("clientId:{},{}", clientId, clientId );
  99 + }catch (InvalidClientException e) {
  100 + // TODO Auto-generated catch block
  101 + e.printStackTrace();
  102 + }
  103 +
  104 + return clientDetails;
  105 + }
  106 +
  107 + @Override
  108 + public void updateClientDetails(ClientDetails clientDetails) throws NoSuchClientException {
  109 + super.updateClientDetails(clientDetails);
  110 + cacheAndGetClient(clientDetails.getClientId());
  111 + }
  112 +
  113 + @Override
  114 + public void updateClientSecret(String clientId, String secret) throws NoSuchClientException {
  115 + super.updateClientSecret(clientId, secret);
  116 + cacheAndGetClient(clientId);
  117 + }
  118 +
  119 + @Override
  120 + public void removeClientDetails(String clientId) throws NoSuchClientException {
  121 + super.removeClientDetails(clientId);
  122 + removeRedisCache(clientId);
  123 + }
  124 +
  125 + /**
  126 + * 删除redis缓存
  127 + *
  128 + * @param clientId
  129 + */
  130 + private void removeRedisCache(String clientId) {
  131 + redisTemplate.boundHashOps(CACHE_CLIENT_KEY).delete(clientId);
  132 + }
  133 +
  134 + /**
  135 + * 将oauth_client_details全表刷入redis
  136 + */
  137 + public void loadAllClientToCache() {
  138 + if (redisTemplate.hasKey(CACHE_CLIENT_KEY)) {
  139 + return;
  140 + }
  141 + logger.info("将oauth_client_details全表刷入redis");
  142 +
  143 + List<ClientDetails> list = super.listClientDetails();
  144 + if (CollectionUtils.isEmpty(list)) {
  145 + logger.error("oauth_client_details表数据为空,请检查");
  146 + return;
  147 + }
  148 +
  149 + list.parallelStream().forEach(client -> {
  150 + redisTemplate.boundHashOps(CACHE_CLIENT_KEY).put(client.getClientId(), JSONObject.toJSONString(client));
  151 + });
  152 + }
  153 +}
cloud/autho/src/main/java/com/sincere/autho/token/RedisTemplateTokenStore.java 0 → 100644
@@ -0,0 +1,331 @@ @@ -0,0 +1,331 @@
  1 +package com.sincere.autho.token;
  2 +
  3 +import com.sincere.common.model.system.LoginAppUser;
  4 +import org.springframework.data.redis.core.RedisTemplate;
  5 +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
  6 +import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken;
  7 +import org.springframework.security.oauth2.common.ExpiringOAuth2RefreshToken;
  8 +import org.springframework.security.oauth2.common.OAuth2AccessToken;
  9 +import org.springframework.security.oauth2.common.OAuth2RefreshToken;
  10 +import org.springframework.security.oauth2.provider.OAuth2Authentication;
  11 +import org.springframework.security.oauth2.provider.token.AuthenticationKeyGenerator;
  12 +import org.springframework.security.oauth2.provider.token.DefaultAuthenticationKeyGenerator;
  13 +import org.springframework.security.oauth2.provider.token.TokenStore;
  14 +
  15 +import java.time.Instant;
  16 +import java.time.LocalDateTime;
  17 +import java.time.ZoneId;
  18 +import java.util.*;
  19 +import java.util.concurrent.TimeUnit;
  20 +
  21 +/**
  22 + * @version redis集群存储token
  23 + */
  24 +
  25 +public class RedisTemplateTokenStore implements TokenStore {
  26 +
  27 + private static final String ACCESS = "access:";
  28 + private static final String AUTH_TO_ACCESS = "auth_to_access:";
  29 + private static final String AUTH = "auth:";
  30 + private static final String REFRESH_AUTH = "refresh_auth:";
  31 + private static final String ACCESS_TO_REFRESH = "access_to_refresh:";
  32 + private static final String REFRESH = "refresh:";
  33 + private static final String REFRESH_TO_ACCESS = "refresh_to_access:";
  34 + private static final String CLIENT_ID_TO_ACCESS = "client_id_to_access:";
  35 + private static final String UNAME_TO_ACCESS = "uname_to_access:";
  36 + private static final String TOKEN = "token:";
  37 +
  38 + private RedisTemplate<String, Object> redisTemplate;
  39 +
  40 + public RedisTemplate<String, Object> getRedisTemplate() {
  41 + return redisTemplate;
  42 + }
  43 +
  44 + public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
  45 + this.redisTemplate = redisTemplate;
  46 + }
  47 +
  48 + private AuthenticationKeyGenerator authenticationKeyGenerator = new DefaultAuthenticationKeyGenerator();
  49 +
  50 + public void setAuthenticationKeyGenerator(AuthenticationKeyGenerator authenticationKeyGenerator) {
  51 + this.authenticationKeyGenerator = authenticationKeyGenerator;
  52 + }
  53 +
  54 + public OAuth2AccessToken getAccessToken(OAuth2Authentication authentication) {
  55 + String key = authenticationKeyGenerator.extractKey(authentication);
  56 + OAuth2AccessToken accessToken = (OAuth2AccessToken) redisTemplate.opsForValue().get(AUTH_TO_ACCESS + key);
  57 + if (accessToken != null
  58 + && !key.equals(authenticationKeyGenerator.extractKey(readAuthentication(accessToken.getValue())))) {
  59 + // Keep the stores consistent (maybe the same user is represented by
  60 + // this authentication but the details
  61 + // have changed)
  62 + storeAccessToken(accessToken, authentication);
  63 + }
  64 + return accessToken;
  65 + }
  66 +
  67 + public OAuth2Authentication readAuthentication(OAuth2AccessToken token) {
  68 + return readAuthentication(token.getValue());
  69 + }
  70 +
  71 + public OAuth2Authentication readAuthentication(String token) {
  72 + return (OAuth2Authentication) this.redisTemplate.opsForValue().get(AUTH + token);
  73 + }
  74 +
  75 + public OAuth2Authentication readAuthenticationForRefreshToken(OAuth2RefreshToken token) {
  76 + return readAuthenticationForRefreshToken(token.getValue());
  77 + }
  78 +
  79 + public OAuth2Authentication readAuthenticationForRefreshToken(String token) {
  80 + return (OAuth2Authentication) this.redisTemplate.opsForValue().get(REFRESH_AUTH + token);
  81 + }
  82 +
  83 + public void storeAccessToken(OAuth2AccessToken token, OAuth2Authentication authentication) {
  84 +
  85 + OAuth2AccessToken existingAccessToken = this.getAccessToken(authentication);
  86 +
  87 + this.redisTemplate.opsForValue().set(ACCESS + token.getValue(), token);
  88 + this.redisTemplate.opsForValue().set(AUTH + token.getValue(), authentication);
  89 + this.redisTemplate.opsForValue().set(AUTH_TO_ACCESS + authenticationKeyGenerator.extractKey(authentication),
  90 + token);
  91 +
  92 + Map<String, Object> params = new HashMap<>();
  93 +
  94 + params.put("clientId", authentication.getOAuth2Request().getClientId());
  95 +
  96 + if (authentication.getUserAuthentication() instanceof UsernamePasswordAuthenticationToken) {
  97 + UsernamePasswordAuthenticationToken authenticationToken = (UsernamePasswordAuthenticationToken) authentication
  98 + .getUserAuthentication();
  99 + LoginAppUser appUser = (LoginAppUser) authenticationToken.getPrincipal();
  100 + params.put("username", appUser.getUsername());
  101 + params.put("authorities", appUser.getAuthorities());
  102 + }
  103 +
  104 + if (!params.isEmpty()) {
  105 + this.redisTemplate.opsForValue().set(TOKEN + token.getValue(), params);
  106 + }
  107 +
  108 + if (!authentication.isClientOnly()) {
  109 + if (existingAccessToken != null) {
  110 + if (!existingAccessToken.isExpired()) {
  111 + int seconds = token.getExpiresIn();
  112 + redisTemplate.expire(UNAME_TO_ACCESS + authentication.getOAuth2Request().getClientId(), seconds,
  113 + TimeUnit.SECONDS);
  114 + } else {
  115 + redisTemplate.opsForList().rightPush(UNAME_TO_ACCESS + getApprovalKey(authentication), token);
  116 + }
  117 + } else {
  118 + redisTemplate.opsForList().rightPush(UNAME_TO_ACCESS + getApprovalKey(authentication), token);
  119 + }
  120 +
  121 + }
  122 +
  123 + if (existingAccessToken != null) {
  124 + if (!existingAccessToken.isExpired()) {
  125 + int seconds = token.getExpiresIn();
  126 + redisTemplate.expire(CLIENT_ID_TO_ACCESS + authentication.getOAuth2Request().getClientId(), seconds,
  127 + TimeUnit.SECONDS);
  128 +
  129 + } else {
  130 + redisTemplate.opsForList()
  131 + .rightPush(CLIENT_ID_TO_ACCESS + authentication.getOAuth2Request().getClientId(), token);
  132 + }
  133 + } else {
  134 + redisTemplate.opsForList().rightPush(CLIENT_ID_TO_ACCESS + authentication.getOAuth2Request().getClientId(),
  135 + token);
  136 + }
  137 +
  138 + if (token.getExpiration() != null) {
  139 +
  140 + int seconds = token.getExpiresIn();
  141 + redisTemplate.expire(ACCESS + token.getValue(), seconds, TimeUnit.SECONDS);
  142 + redisTemplate.expire(AUTH + token.getValue(), seconds, TimeUnit.SECONDS);
  143 + redisTemplate.expire(TOKEN + token.getValue(), seconds, TimeUnit.SECONDS);
  144 + redisTemplate.expire(AUTH_TO_ACCESS + authenticationKeyGenerator.extractKey(authentication), seconds,
  145 + TimeUnit.SECONDS);
  146 + redisTemplate.expire(CLIENT_ID_TO_ACCESS + authentication.getOAuth2Request().getClientId(), seconds,
  147 + TimeUnit.SECONDS);
  148 + redisTemplate.expire(UNAME_TO_ACCESS + getApprovalKey(authentication), seconds, TimeUnit.SECONDS);
  149 + }
  150 +
  151 + OAuth2RefreshToken refreshToken = token.getRefreshToken();
  152 +
  153 + if (token.getRefreshToken() != null && token.getRefreshToken().getValue() != null) {
  154 + this.redisTemplate.opsForValue().set(REFRESH_TO_ACCESS + token.getRefreshToken().getValue(),
  155 + token.getValue());
  156 + this.redisTemplate.opsForValue().set(ACCESS_TO_REFRESH + token.getValue(),
  157 + token.getRefreshToken().getValue());
  158 +
  159 + if (refreshToken instanceof ExpiringOAuth2RefreshToken) {
  160 + ExpiringOAuth2RefreshToken expiringRefreshToken = (ExpiringOAuth2RefreshToken) refreshToken;
  161 + Date expiration = expiringRefreshToken.getExpiration();
  162 + if (expiration != null) {
  163 + int seconds = Long.valueOf((expiration.getTime() - System.currentTimeMillis()) / 1000L).intValue();
  164 +
  165 + redisTemplate.expire(REFRESH_TO_ACCESS + token.getRefreshToken().getValue(), seconds,
  166 + TimeUnit.SECONDS);
  167 + redisTemplate.expire(ACCESS_TO_REFRESH + token.getValue(), seconds, TimeUnit.SECONDS);
  168 +
  169 + }
  170 + }
  171 +
  172 + }
  173 + }
  174 +
  175 + private String getApprovalKey(OAuth2Authentication authentication) {
  176 + String userName = authentication.getUserAuthentication() == null ? ""
  177 + : authentication.getUserAuthentication().getName();
  178 + return getApprovalKey(authentication.getOAuth2Request().getClientId(), userName);
  179 + }
  180 +
  181 + private String getApprovalKey(String clientId, String userName) {
  182 + return clientId + (userName == null ? "" : ":" + userName);
  183 + }
  184 +
  185 + public void removeAccessToken(OAuth2AccessToken accessToken) {
  186 + removeAccessToken(accessToken.getValue());
  187 + }
  188 +
  189 + public OAuth2AccessToken readAccessToken(String tokenValue) {
  190 +
  191 + OAuth2Authentication oauth2Authentication = (OAuth2Authentication) this.redisTemplate.opsForValue()
  192 + .get(AUTH + tokenValue);
  193 + OAuth2AccessToken oauth2AccessToken = (OAuth2AccessToken) this.redisTemplate.opsForValue()
  194 + .get(ACCESS + tokenValue);
  195 + if (oauth2Authentication != null) {
  196 + String auth_to_access = authenticationKeyGenerator.extractKey(oauth2Authentication);
  197 + if (oauth2AccessToken != null) {
  198 + if (oauth2AccessToken.getExpiresIn() < 180) {
  199 +
  200 + if (oauth2AccessToken instanceof DefaultOAuth2AccessToken) {
  201 + DefaultOAuth2AccessToken token = (DefaultOAuth2AccessToken) oauth2AccessToken;
  202 +// Calendar cal = Calendar.getInstance();
  203 +// cal.add(Calendar.DATE, 30);
  204 +// Date date = cal.getTime();
  205 + /**
  206 + * 自动续费 30分钟
  207 + */
  208 + LocalDateTime t1 = LocalDateTime.now().plusMinutes(30);
  209 + ZoneId zone = ZoneId.systemDefault();
  210 + Instant instant = t1.atZone(zone).toInstant();
  211 + Date date = Date.from(instant);
  212 +
  213 + token.setExpiration(date);
  214 +
  215 + int seconds = token.getExpiresIn();
  216 +
  217 + this.redisTemplate.opsForValue().set(AUTH_TO_ACCESS + auth_to_access, token, seconds,
  218 + TimeUnit.SECONDS);
  219 + this.redisTemplate.opsForValue().set(ACCESS + token.getValue(), token, seconds,
  220 + TimeUnit.SECONDS);
  221 +
  222 + redisTemplate.expire(AUTH + token.getValue(), seconds, TimeUnit.SECONDS);
  223 + redisTemplate.expire(TOKEN + token.getValue(), seconds, TimeUnit.SECONDS);
  224 +
  225 + redisTemplate.expire(
  226 + CLIENT_ID_TO_ACCESS + oauth2Authentication.getOAuth2Request().getClientId(), seconds,
  227 + TimeUnit.SECONDS);
  228 + redisTemplate.expire(UNAME_TO_ACCESS + getApprovalKey(oauth2Authentication), seconds,
  229 + TimeUnit.SECONDS);
  230 +
  231 + }
  232 +
  233 + }
  234 + }
  235 + }
  236 +
  237 + return oauth2AccessToken;
  238 + }
  239 +
  240 + public void removeAccessToken(String tokenValue) {
  241 + OAuth2AccessToken removed = (OAuth2AccessToken) redisTemplate.opsForValue().get(ACCESS + tokenValue);
  242 + // Don't remove the refresh token - it's up to the caller to do that
  243 + OAuth2Authentication authentication = (OAuth2Authentication) this.redisTemplate.opsForValue()
  244 + .get(AUTH + tokenValue);
  245 +
  246 + this.redisTemplate.delete(AUTH + tokenValue);
  247 + redisTemplate.delete(ACCESS + tokenValue);
  248 + redisTemplate.delete(TOKEN + tokenValue);
  249 + this.redisTemplate.delete(ACCESS_TO_REFRESH + tokenValue);
  250 +
  251 + if (authentication != null) {
  252 + this.redisTemplate.delete(AUTH_TO_ACCESS + authenticationKeyGenerator.extractKey(authentication));
  253 +
  254 + String clientId = authentication.getOAuth2Request().getClientId();
  255 +
  256 + // redisTemplate.opsForList().rightPush("UNAME_TO_ACCESS:"+getApprovalKey(authentication),
  257 + // token) ;
  258 + redisTemplate.opsForList().leftPop(UNAME_TO_ACCESS + getApprovalKey(clientId, authentication.getName()));
  259 +
  260 + redisTemplate.opsForList().leftPop(CLIENT_ID_TO_ACCESS + clientId);
  261 +
  262 + this.redisTemplate.delete(AUTH_TO_ACCESS + authenticationKeyGenerator.extractKey(authentication));
  263 + }
  264 + }
  265 +
  266 + public void storeRefreshToken(OAuth2RefreshToken refreshToken, OAuth2Authentication authentication) {
  267 + this.redisTemplate.opsForValue().set(REFRESH + refreshToken.getValue(), refreshToken);
  268 + this.redisTemplate.opsForValue().set(REFRESH_AUTH + refreshToken.getValue(), authentication);
  269 + }
  270 +
  271 + public OAuth2RefreshToken readRefreshToken(String tokenValue) {
  272 + return (OAuth2RefreshToken) this.redisTemplate.opsForValue().get(REFRESH + tokenValue);
  273 + }
  274 +
  275 + public void removeRefreshToken(OAuth2RefreshToken refreshToken) {
  276 + removeRefreshToken(refreshToken.getValue());
  277 + }
  278 +
  279 + public void removeRefreshToken(String tokenValue) {
  280 + this.redisTemplate.delete(REFRESH + tokenValue);
  281 + this.redisTemplate.delete(REFRESH_AUTH + tokenValue);
  282 + this.redisTemplate.delete(REFRESH_TO_ACCESS + tokenValue);
  283 + }
  284 +
  285 + public void removeAccessTokenUsingRefreshToken(OAuth2RefreshToken refreshToken) {
  286 + removeAccessTokenUsingRefreshToken(refreshToken.getValue());
  287 + }
  288 +
  289 + private void removeAccessTokenUsingRefreshToken(String refreshToken) {
  290 +
  291 + String token = (String) this.redisTemplate.opsForValue().get(REFRESH_TO_ACCESS + refreshToken);
  292 +
  293 + if (token != null) {
  294 + redisTemplate.delete(REFRESH_TO_ACCESS + refreshToken);
  295 + }
  296 + }
  297 +
  298 + public Collection<OAuth2AccessToken> findTokensByClientIdAndUserName(String clientId, String userName) {
  299 + List<Object> result = redisTemplate.opsForList().range(UNAME_TO_ACCESS + getApprovalKey(clientId, userName), 0,
  300 + -1);
  301 +
  302 + if (result == null || result.size() == 0) {
  303 + return Collections.<OAuth2AccessToken>emptySet();
  304 + }
  305 + List<OAuth2AccessToken> accessTokens = new ArrayList<OAuth2AccessToken>(result.size());
  306 +
  307 + for (Iterator<Object> it = result.iterator(); it.hasNext();) {
  308 + OAuth2AccessToken accessToken = (OAuth2AccessToken) it.next();
  309 + accessTokens.add(accessToken);
  310 + }
  311 +
  312 + return Collections.<OAuth2AccessToken>unmodifiableCollection(accessTokens);
  313 + }
  314 +
  315 + public Collection<OAuth2AccessToken> findTokensByClientId(String clientId) {
  316 + List<Object> result = redisTemplate.opsForList().range((CLIENT_ID_TO_ACCESS + clientId), 0, -1);
  317 +
  318 + if (result == null || result.size() == 0) {
  319 + return Collections.<OAuth2AccessToken>emptySet();
  320 + }
  321 + List<OAuth2AccessToken> accessTokens = new ArrayList<OAuth2AccessToken>(result.size());
  322 +
  323 + for (Iterator<Object> it = result.iterator(); it.hasNext();) {
  324 + OAuth2AccessToken accessToken = (OAuth2AccessToken) it.next();
  325 + accessTokens.add(accessToken);
  326 + }
  327 +
  328 + return Collections.<OAuth2AccessToken>unmodifiableCollection(accessTokens);
  329 + }
  330 +
  331 +}
cloud/autho/src/main/java/com/sincere/autho/utils/SpringUtil.java 0 → 100644
@@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
  1 +package com.sincere.autho.utils;
  2 +
  3 +import org.springframework.beans.BeansException;
  4 +import org.springframework.context.ApplicationContext;
  5 +import org.springframework.context.ApplicationContextAware;
  6 +import org.springframework.core.env.Environment;
  7 +import org.springframework.stereotype.Component;
  8 +
  9 +/**
  10 + * spring获取bean工具类
  11 + *
  12 + *
  13 + */
  14 +@Component
  15 +public class SpringUtil implements ApplicationContextAware {
  16 +
  17 + private static ApplicationContext applicationContext = null;
  18 +
  19 + @Override
  20 + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  21 + SpringUtil.applicationContext = applicationContext;
  22 + }
  23 +
  24 + public static <T> T getBean(Class<T> cla) {
  25 + return applicationContext.getBean(cla);
  26 + }
  27 +
  28 + public static <T> T getBean(String name, Class<T> cal) {
  29 + return applicationContext.getBean(name, cal);
  30 + }
  31 +
  32 + public static String getProperty(String key) {
  33 + return applicationContext.getBean(Environment.class).getProperty(key);
  34 + }
  35 +}
cloud/autho/src/main/java/com/sincere/autho/utils/SysUserUtil.java 0 → 100644
@@ -0,0 +1,41 @@ @@ -0,0 +1,41 @@
  1 +package com.sincere.autho.utils;
  2 +
  3 +import com.sincere.common.model.system.LoginAppUser;
  4 +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
  5 +import org.springframework.security.core.Authentication;
  6 +import org.springframework.security.core.context.SecurityContextHolder;
  7 +import org.springframework.security.oauth2.provider.OAuth2Authentication;
  8 +import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken;
  9 +
  10 +/**
  11 + * @author 作者 owen E-mail: 624191343@qq.com
  12 + * @version 创建时间:2017年11月12日 上午22:57:51 获取用户信息
  13 + */
  14 +public class SysUserUtil {
  15 +
  16 + /**
  17 + * 获取登陆的 LoginAppUser
  18 + *
  19 + * @return
  20 + */
  21 + @SuppressWarnings("rawtypes")
  22 + public static LoginAppUser getLoginAppUser() {
  23 + Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
  24 + if (authentication instanceof OAuth2Authentication) {
  25 + OAuth2Authentication oAuth2Auth = (OAuth2Authentication) authentication;
  26 + authentication = oAuth2Auth.getUserAuthentication();
  27 +
  28 + if (authentication instanceof UsernamePasswordAuthenticationToken) {
  29 + UsernamePasswordAuthenticationToken authenticationToken = (UsernamePasswordAuthenticationToken) authentication;
  30 + return (LoginAppUser) authenticationToken.getPrincipal();
  31 + } else if (authentication instanceof PreAuthenticatedAuthenticationToken) {
  32 + // 刷新token方式
  33 + PreAuthenticatedAuthenticationToken authenticationToken = (PreAuthenticatedAuthenticationToken) authentication;
  34 + return (LoginAppUser) authenticationToken.getPrincipal();
  35 +
  36 + }
  37 + }
  38 +
  39 + return null;
  40 + }
  41 +}
cloud/autho/src/main/resources/application.yaml 0 → 100644
@@ -0,0 +1,96 @@ @@ -0,0 +1,96 @@
  1 +server:
  2 + port: 8763
  3 +
  4 +spring:
  5 + application:
  6 + name: auth-server
  7 +session:
  8 + store-type: redis
  9 + datasource:
  10 + dynamic:
  11 + enable: true
  12 + druid:
  13 + # JDBC 配置(驱动类自动从url的mysql识别,数据源类型自动识别)
  14 + core:
  15 + url: jdbc:mysql://localhost/oauth-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
  16 + username: root
  17 + password: root
  18 + driver-class-name: com.mysql.jdbc.Driver
  19 + log:
  20 + url: jdbc:mysql://59.110.164.254:3306/log-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
  21 + username: root
  22 + password: root
  23 + driver-class-name: com.mysql.jdbc.Driver
  24 + #连接池配置(通常来说,只需要修改initialSize、minIdle、maxActive
  25 + initial-size: 1
  26 + max-active: 20
  27 + min-idle: 1
  28 + # 配置获取连接等待超时的时间
  29 + max-wait: 60000
  30 + #打开PSCache,并且指定每个连接上PSCache的大小
  31 + pool-prepared-statements: true
  32 + max-pool-prepared-statement-per-connection-size: 20
  33 + validation-query: SELECT 'x'
  34 + test-on-borrow: false
  35 + test-on-return: false
  36 + test-while-idle: true
  37 + #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  38 + time-between-eviction-runs-millis: 60000
  39 + #配置一个连接在池中最小生存的时间,单位是毫秒
  40 + min-evictable-idle-time-millis: 300000
  41 + filters: stat,wall
  42 + # WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter
  43 + #是否启用StatFilter默认值true
  44 + web-stat-filter.enabled: true
  45 + web-stat-filter.url-pattern: /*
  46 + web-stat-filter.exclusions: "*.js , *.gif ,*.jpg ,*.png ,*.css ,*.ico , /druid/*"
  47 + web-stat-filter.session-stat-max-count: 1000
  48 + web-stat-filter.profile-enable: true
  49 + # StatViewServlet配置
  50 + #展示Druid的统计信息,StatViewServlet的用途包括:1.提供监控信息展示的html页面2.提供监控信息的JSON API
  51 + #是否启用StatViewServlet默认值true
  52 + stat-view-servlet.enabled: true
  53 + #根据配置中的url-pattern来访问内置监控页面,如果是上面的配置,内置监控页面的首页是/druid/index.html例如:
  54 + #http://110.76.43.235:9000/druid/index.html
  55 + #http://110.76.43.235:8080/mini-web/druid/index.html
  56 + stat-view-servlet.url-pattern: /druid/*
  57 + #允许清空统计数据
  58 + stat-view-servlet.reset-enable: true
  59 + stat-view-servlet.login-username: admin
  60 + stat-view-servlet.login-password: admin
  61 + #StatViewSerlvet展示出来的监控信息比较敏感,是系统运行的内部情况,如果你需要做访问控制,可以配置allow和deny这两个参数
  62 + #deny优先于allow,如果在deny列表中,就算在allow列表中,也会被拒绝。如果allow没有配置或者为空,则允许所有访问
  63 + #配置的格式
  64 + #<IP>
  65 + #或者<IP>/<SUB_NET_MASK_size>其中128.242.127.1/24
  66 + #24表示,前面24位是子网掩码,比对的时候,前面24位相同就匹配,不支持IPV6。
  67 + #stat-view-servlet.allow=
  68 + #stat-view-servlet.deny=128.242.127.1/24,128.242.128.1
  69 + # Spring监控配置,说明请参考Druid Github Wiki,配置_Druid和Spring关联监控配置
  70 + #aop-patterns= # Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔
  71 +################### mysq end ##########################
  72 +
  73 +
  74 +eureka:
  75 + instance:
  76 + hostname: localhost
  77 + lease-expiration-duration-in-seconds: 60
  78 + lease-renewal-interval-in-seconds: 10
  79 + client:
  80 + service-url:
  81 + defaultZone: http://121.40.109.21:8761/eureka/,http://121.40.109.21:8762/eureka/
  82 +
  83 +
  84 + redis:
  85 + ################### redis 单机版 start ##########################
  86 + host: localhost
  87 + port: 6379
  88 + timeout: 6000
  89 + database: 2
  90 + lettuce:
  91 + pool:
  92 + max-active: 10 # 连接池最大连接数(使用负值表示没有限制),如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)
  93 + max-idle: 8 # 连接池中的最大空闲连接 ,默认值也是8
  94 + max-wait: 100 # # 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
  95 + min-idle: 2 # 连接池中的最小空闲连接 ,默认值也是0
  96 + shutdown-timeout: 100ms
0 \ No newline at end of file 97 \ No newline at end of file
cloud/autho/src/test/java/com/sincere/autho/AuthoApplicationTests.java 0 → 100644
@@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
  1 +package com.sincere.autho;
  2 +
  3 +import org.junit.Test;
  4 +import org.junit.runner.RunWith;
  5 +import org.springframework.boot.test.context.SpringBootTest;
  6 +import org.springframework.test.context.junit4.SpringRunner;
  7 +
  8 +@RunWith(SpringRunner.class)
  9 +@SpringBootTest
  10 +public class AuthoApplicationTests {
  11 +
  12 + @Test
  13 + public void contextLoads() {
  14 + }
  15 +
  16 +}
cloud/cloud-server/.gitignore
@@ -1,31 +0,0 @@ @@ -1,31 +0,0 @@
1 -HELP.md  
2 -target/  
3 -!.mvn/wrapper/maven-wrapper.jar  
4 -!**/src/main/**  
5 -!**/src/test/**  
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 -  
30 -### VS Code ###  
31 -.vscode/  
cloud/cloud-server/.mvn/wrapper/MavenWrapperDownloader.java
@@ -1,114 +0,0 @@ @@ -1,114 +0,0 @@
1 -/*  
2 -Licensed to the Apache Software Foundation (ASF) under one  
3 -or more contributor license agreements. See the NOTICE file  
4 -distributed with this work for additional information  
5 -regarding copyright ownership. The ASF licenses this file  
6 -to you under the Apache License, Version 2.0 (the  
7 -"License"); you may not use this file except in compliance  
8 -with the License. You may obtain a copy of the License at  
9 -  
10 - https://www.apache.org/licenses/LICENSE-2.0  
11 -  
12 -Unless required by applicable law or agreed to in writing,  
13 -software distributed under the License is distributed on an  
14 -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY  
15 -KIND, either express or implied. See the License for the  
16 -specific language governing permissions and limitations  
17 -under the License.  
18 -*/  
19 -  
20 -import java.io.File;  
21 -import java.io.FileInputStream;  
22 -import java.io.FileOutputStream;  
23 -import java.io.IOException;  
24 -import java.net.URL;  
25 -import java.nio.channels.Channels;  
26 -import java.nio.channels.ReadableByteChannel;  
27 -import java.util.Properties;  
28 -  
29 -public class MavenWrapperDownloader {  
30 -  
31 - /**  
32 - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.  
33 - */  
34 - private static final String DEFAULT_DOWNLOAD_URL =  
35 - "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar";  
36 -  
37 - /**  
38 - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to  
39 - * use instead of the default one.  
40 - */  
41 - private static final String MAVEN_WRAPPER_PROPERTIES_PATH =  
42 - ".mvn/wrapper/maven-wrapper.properties";  
43 -  
44 - /**  
45 - * Path where the maven-wrapper.jar will be saved to.  
46 - */  
47 - private static final String MAVEN_WRAPPER_JAR_PATH =  
48 - ".mvn/wrapper/maven-wrapper.jar";  
49 -  
50 - /**  
51 - * Name of the property which should be used to override the default download url for the wrapper.  
52 - */  
53 - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";  
54 -  
55 - public static void main(String args[]) {  
56 - System.out.println("- Downloader started");  
57 - File baseDirectory = new File(args[0]);  
58 - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());  
59 -  
60 - // If the maven-wrapper.properties exists, read it and check if it contains a custom  
61 - // wrapperUrl parameter.  
62 - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);  
63 - String url = DEFAULT_DOWNLOAD_URL;  
64 - if (mavenWrapperPropertyFile.exists()) {  
65 - FileInputStream mavenWrapperPropertyFileInputStream = null;  
66 - try {  
67 - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);  
68 - Properties mavenWrapperProperties = new Properties();  
69 - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);  
70 - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);  
71 - } catch (IOException e) {  
72 - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");  
73 - } finally {  
74 - try {  
75 - if (mavenWrapperPropertyFileInputStream != null) {  
76 - mavenWrapperPropertyFileInputStream.close();  
77 - }  
78 - } catch (IOException e) {  
79 - // Ignore ...  
80 - }  
81 - }  
82 - }  
83 - System.out.println("- Downloading from: : " + url);  
84 -  
85 - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);  
86 - if (!outputFile.getParentFile().exists()) {  
87 - if (!outputFile.getParentFile().mkdirs()) {  
88 - System.out.println(  
89 - "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'");  
90 - }  
91 - }  
92 - System.out.println("- Downloading to: " + outputFile.getAbsolutePath());  
93 - try {  
94 - downloadFileFromURL(url, outputFile);  
95 - System.out.println("Done");  
96 - System.exit(0);  
97 - } catch (Throwable e) {  
98 - System.out.println("- Error downloading");  
99 - e.printStackTrace();  
100 - System.exit(1);  
101 - }  
102 - }  
103 -  
104 - private static void downloadFileFromURL(String urlString, File destination) throws Exception {  
105 - URL website = new URL(urlString);  
106 - ReadableByteChannel rbc;  
107 - rbc = Channels.newChannel(website.openStream());  
108 - FileOutputStream fos = new FileOutputStream(destination);  
109 - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);  
110 - fos.close();  
111 - rbc.close();  
112 - }  
113 -  
114 -}  
cloud/cloud-server/.mvn/wrapper/maven-wrapper.jar
No preview for this file type
cloud/cloud-server/.mvn/wrapper/maven-wrapper.properties
@@ -1 +0,0 @@ @@ -1 +0,0 @@
1 -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip  
cloud/cloud-server/mvnw
@@ -1,286 +0,0 @@ @@ -1,286 +0,0 @@
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 -# Maven2 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 - # TODO classpath?  
118 -fi  
119 -  
120 -if [ -z "$JAVA_HOME" ]; then  
121 - javaExecutable="`which javac`"  
122 - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then  
123 - # readlink(1) is not available as standard on Solaris 10.  
124 - readLink=`which readlink`  
125 - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then  
126 - if $darwin ; then  
127 - javaHome="`dirname \"$javaExecutable\"`"  
128 - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"  
129 - else  
130 - javaExecutable="`readlink -f \"$javaExecutable\"`"  
131 - fi  
132 - javaHome="`dirname \"$javaExecutable\"`"  
133 - javaHome=`expr "$javaHome" : '\(.*\)/bin'`  
134 - JAVA_HOME="$javaHome"  
135 - export JAVA_HOME  
136 - fi  
137 - fi  
138 -fi  
139 -  
140 -if [ -z "$JAVACMD" ] ; then  
141 - if [ -n "$JAVA_HOME" ] ; then  
142 - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then  
143 - # IBM's JDK on AIX uses strange locations for the executables  
144 - JAVACMD="$JAVA_HOME/jre/sh/java"  
145 - else  
146 - JAVACMD="$JAVA_HOME/bin/java"  
147 - fi  
148 - else  
149 - JAVACMD="`which java`"  
150 - fi  
151 -fi  
152 -  
153 -if [ ! -x "$JAVACMD" ] ; then  
154 - echo "Error: JAVA_HOME is not defined correctly." >&2  
155 - echo " We cannot execute $JAVACMD" >&2  
156 - exit 1  
157 -fi  
158 -  
159 -if [ -z "$JAVA_HOME" ] ; then  
160 - echo "Warning: JAVA_HOME environment variable is not set."  
161 -fi  
162 -  
163 -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher  
164 -  
165 -# traverses directory structure from process work directory to filesystem root  
166 -# first directory with .mvn subdirectory is considered project base directory  
167 -find_maven_basedir() {  
168 -  
169 - if [ -z "$1" ]  
170 - then  
171 - echo "Path not specified to find_maven_basedir"  
172 - return 1  
173 - fi  
174 -  
175 - basedir="$1"  
176 - wdir="$1"  
177 - while [ "$wdir" != '/' ] ; do  
178 - if [ -d "$wdir"/.mvn ] ; then  
179 - basedir=$wdir  
180 - break  
181 - fi  
182 - # workaround for JBEAP-8937 (on Solaris 10/Sparc)  
183 - if [ -d "${wdir}" ]; then  
184 - wdir=`cd "$wdir/.."; pwd`  
185 - fi  
186 - # end of workaround  
187 - done  
188 - echo "${basedir}"  
189 -}  
190 -  
191 -# concatenates all lines of a file  
192 -concat_lines() {  
193 - if [ -f "$1" ]; then  
194 - echo "$(tr -s '\n' ' ' < "$1")"  
195 - fi  
196 -}  
197 -  
198 -BASE_DIR=`find_maven_basedir "$(pwd)"`  
199 -if [ -z "$BASE_DIR" ]; then  
200 - exit 1;  
201 -fi  
202 -  
203 -##########################################################################################  
204 -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central  
205 -# This allows using the maven wrapper in projects that prohibit checking in binary data.  
206 -##########################################################################################  
207 -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then  
208 - if [ "$MVNW_VERBOSE" = true ]; then  
209 - echo "Found .mvn/wrapper/maven-wrapper.jar"  
210 - fi  
211 -else  
212 - if [ "$MVNW_VERBOSE" = true ]; then  
213 - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."  
214 - fi  
215 - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"  
216 - while IFS="=" read key value; do  
217 - case "$key" in (wrapperUrl) jarUrl="$value"; break ;;  
218 - esac  
219 - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"  
220 - if [ "$MVNW_VERBOSE" = true ]; then  
221 - echo "Downloading from: $jarUrl"  
222 - fi  
223 - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"  
224 -  
225 - if command -v wget > /dev/null; then  
226 - if [ "$MVNW_VERBOSE" = true ]; then  
227 - echo "Found wget ... using wget"  
228 - fi  
229 - wget "$jarUrl" -O "$wrapperJarPath"  
230 - elif command -v curl > /dev/null; then  
231 - if [ "$MVNW_VERBOSE" = true ]; then  
232 - echo "Found curl ... using curl"  
233 - fi  
234 - curl -o "$wrapperJarPath" "$jarUrl"  
235 - else  
236 - if [ "$MVNW_VERBOSE" = true ]; then  
237 - echo "Falling back to using Java to download"  
238 - fi  
239 - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"  
240 - if [ -e "$javaClass" ]; then  
241 - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then  
242 - if [ "$MVNW_VERBOSE" = true ]; then  
243 - echo " - Compiling MavenWrapperDownloader.java ..."  
244 - fi  
245 - # Compiling the Java class  
246 - ("$JAVA_HOME/bin/javac" "$javaClass")  
247 - fi  
248 - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then  
249 - # Running the downloader  
250 - if [ "$MVNW_VERBOSE" = true ]; then  
251 - echo " - Running MavenWrapperDownloader.java ..."  
252 - fi  
253 - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")  
254 - fi  
255 - fi  
256 - fi  
257 -fi  
258 -##########################################################################################  
259 -# End of extension  
260 -##########################################################################################  
261 -  
262 -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}  
263 -if [ "$MVNW_VERBOSE" = true ]; then  
264 - echo $MAVEN_PROJECTBASEDIR  
265 -fi  
266 -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"  
267 -  
268 -# For Cygwin, switch paths to Windows format before running java  
269 -if $cygwin; then  
270 - [ -n "$M2_HOME" ] &&  
271 - M2_HOME=`cygpath --path --windows "$M2_HOME"`  
272 - [ -n "$JAVA_HOME" ] &&  
273 - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`  
274 - [ -n "$CLASSPATH" ] &&  
275 - CLASSPATH=`cygpath --path --windows "$CLASSPATH"`  
276 - [ -n "$MAVEN_PROJECTBASEDIR" ] &&  
277 - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`  
278 -fi  
279 -  
280 -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain  
281 -  
282 -exec "$JAVACMD" \  
283 - $MAVEN_OPTS \  
284 - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \  
285 - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \  
286 - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"  
cloud/cloud-server/mvnw.cmd
@@ -1,161 +0,0 @@ @@ -1,161 +0,0 @@
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 Maven2 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 key stroke 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 my 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.4.2/maven-wrapper-0.4.2.jar"  
124 -FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO (  
125 - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B  
126 -)  
127 -  
128 -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central  
129 -@REM This allows using the maven wrapper in projects that prohibit checking in binary data.  
130 -if exist %WRAPPER_JAR% (  
131 - echo Found %WRAPPER_JAR%  
132 -) else (  
133 - echo Couldn't find %WRAPPER_JAR%, downloading it ...  
134 - echo Downloading from: %DOWNLOAD_URL%  
135 - powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"  
136 - echo Finished downloading %WRAPPER_JAR%  
137 -)  
138 -@REM End of extension  
139 -  
140 -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*  
141 -if ERRORLEVEL 1 goto error  
142 -goto end  
143 -  
144 -:error  
145 -set ERROR_CODE=1  
146 -  
147 -:end  
148 -@endlocal & set ERROR_CODE=%ERROR_CODE%  
149 -  
150 -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost  
151 -@REM check for post script, once with legacy .bat ending and once with .cmd ending  
152 -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"  
153 -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"  
154 -:skipRcPost  
155 -  
156 -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'  
157 -if "%MAVEN_BATCH_PAUSE%" == "on" pause  
158 -  
159 -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%  
160 -  
161 -exit /B %ERROR_CODE%  
cloud/cloud-server/pom.xml
@@ -1,56 +0,0 @@ @@ -1,56 +0,0 @@
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 http://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.1.6.RELEASE</version>  
9 - <relativePath/> <!-- lookup parent from repository -->  
10 - </parent>  
11 - <groupId>com.example</groupId>  
12 - <artifactId>cloud-server</artifactId>  
13 - <version>0.0.1-SNAPSHOT</version>  
14 - <name>cloud-server</name>  
15 - <description>Demo project for Spring Boot</description>  
16 -  
17 - <properties>  
18 - <java.version>1.8</java.version>  
19 - <spring-cloud.version>Greenwich.SR2</spring-cloud.version>  
20 - </properties>  
21 -  
22 - <dependencies>  
23 - <dependency>  
24 - <groupId>org.springframework.cloud</groupId>  
25 - <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>  
26 - </dependency>  
27 -  
28 - <dependency>  
29 - <groupId>org.springframework.boot</groupId>  
30 - <artifactId>spring-boot-starter-test</artifactId>  
31 - <scope>test</scope>  
32 - </dependency>  
33 - </dependencies>  
34 -  
35 - <dependencyManagement>  
36 - <dependencies>  
37 - <dependency>  
38 - <groupId>org.springframework.cloud</groupId>  
39 - <artifactId>spring-cloud-dependencies</artifactId>  
40 - <version>${spring-cloud.version}</version>  
41 - <type>pom</type>  
42 - <scope>import</scope>  
43 - </dependency>  
44 - </dependencies>  
45 - </dependencyManagement>  
46 -  
47 - <build>  
48 - <plugins>  
49 - <plugin>  
50 - <groupId>org.springframework.boot</groupId>  
51 - <artifactId>spring-boot-maven-plugin</artifactId>  
52 - </plugin>  
53 - </plugins>  
54 - </build>  
55 -  
56 -</project>  
cloud/cloud-server/src/main/java/com/example/cloudserver/CloudServerApplication.java
@@ -1,15 +0,0 @@ @@ -1,15 +0,0 @@
1 -package com.example.cloudserver;  
2 -  
3 -import org.springframework.boot.SpringApplication;  
4 -import org.springframework.boot.autoconfigure.SpringBootApplication;  
5 -import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;  
6 -  
7 -@EnableEurekaServer  
8 -@SpringBootApplication  
9 -public class CloudServerApplication {  
10 -  
11 - public static void main(String[] args) {  
12 - SpringApplication.run(CloudServerApplication.class, args);  
13 - }  
14 -  
15 -}  
cloud/cloud-server/src/main/resources/application.yaml
@@ -1,9 +0,0 @@ @@ -1,9 +0,0 @@
1 -server:  
2 - port: 10087  
3 -  
4 -eureka:  
5 - instance:  
6 - hostname: localhost  
7 - client:  
8 - fetch-registry: false  
9 - register-with-eureka: false  
cloud/cloud-server/src/test/java/com/example/cloudserver/CloudServerApplicationTests.java
@@ -1,16 +0,0 @@ @@ -1,16 +0,0 @@
1 -package com.example.cloudserver;  
2 -  
3 -import org.junit.Test;  
4 -import org.junit.runner.RunWith;  
5 -import org.springframework.boot.test.context.SpringBootTest;  
6 -import org.springframework.test.context.junit4.SpringRunner;  
7 -  
8 -@RunWith(SpringRunner.class)  
9 -@SpringBootTest  
10 -public class CloudServerApplicationTests {  
11 -  
12 - @Test  
13 - public void contextLoads() {  
14 - }  
15 -  
16 -}  
cloud/common/.gitignore 0 → 100644
@@ -0,0 +1,31 @@ @@ -0,0 +1,31 @@
  1 +HELP.md
  2 +target/
  3 +!.mvn/wrapper/maven-wrapper.jar
  4 +!**/src/main/**
  5 +!**/src/test/**
  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 +
  30 +### VS Code ###
  31 +.vscode/
cloud/common/.mvn/wrapper/MavenWrapperDownloader.java 0 → 100644
@@ -0,0 +1,114 @@ @@ -0,0 +1,114 @@
  1 +/*
  2 +Licensed to the Apache Software Foundation (ASF) under one
  3 +or more contributor license agreements. See the NOTICE file
  4 +distributed with this work for additional information
  5 +regarding copyright ownership. The ASF licenses this file
  6 +to you under the Apache License, Version 2.0 (the
  7 +"License"); you may not use this file except in compliance
  8 +with the License. You may obtain a copy of the License at
  9 +
  10 + https://www.apache.org/licenses/LICENSE-2.0
  11 +
  12 +Unless required by applicable law or agreed to in writing,
  13 +software distributed under the License is distributed on an
  14 +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15 +KIND, either express or implied. See the License for the
  16 +specific language governing permissions and limitations
  17 +under the License.
  18 +*/
  19 +
  20 +import java.io.File;
  21 +import java.io.FileInputStream;
  22 +import java.io.FileOutputStream;
  23 +import java.io.IOException;
  24 +import java.net.URL;
  25 +import java.nio.channels.Channels;
  26 +import java.nio.channels.ReadableByteChannel;
  27 +import java.util.Properties;
  28 +
  29 +public class MavenWrapperDownloader {
  30 +
  31 + /**
  32 + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
  33 + */
  34 + private static final String DEFAULT_DOWNLOAD_URL =
  35 + "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar";
  36 +
  37 + /**
  38 + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
  39 + * use instead of the default one.
  40 + */
  41 + private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
  42 + ".mvn/wrapper/maven-wrapper.properties";
  43 +
  44 + /**
  45 + * Path where the maven-wrapper.jar will be saved to.
  46 + */
  47 + private static final String MAVEN_WRAPPER_JAR_PATH =
  48 + ".mvn/wrapper/maven-wrapper.jar";
  49 +
  50 + /**
  51 + * Name of the property which should be used to override the default download url for the wrapper.
  52 + */
  53 + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
  54 +
  55 + public static void main(String args[]) {
  56 + System.out.println("- Downloader started");
  57 + File baseDirectory = new File(args[0]);
  58 + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
  59 +
  60 + // If the maven-wrapper.properties exists, read it and check if it contains a custom
  61 + // wrapperUrl parameter.
  62 + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
  63 + String url = DEFAULT_DOWNLOAD_URL;
  64 + if (mavenWrapperPropertyFile.exists()) {
  65 + FileInputStream mavenWrapperPropertyFileInputStream = null;
  66 + try {
  67 + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
  68 + Properties mavenWrapperProperties = new Properties();
  69 + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
  70 + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
  71 + } catch (IOException e) {
  72 + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
  73 + } finally {
  74 + try {
  75 + if (mavenWrapperPropertyFileInputStream != null) {
  76 + mavenWrapperPropertyFileInputStream.close();
  77 + }
  78 + } catch (IOException e) {
  79 + // Ignore ...
  80 + }
  81 + }
  82 + }
  83 + System.out.println("- Downloading from: : " + url);
  84 +
  85 + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
  86 + if (!outputFile.getParentFile().exists()) {
  87 + if (!outputFile.getParentFile().mkdirs()) {
  88 + System.out.println(
  89 + "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'");
  90 + }
  91 + }
  92 + System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
  93 + try {
  94 + downloadFileFromURL(url, outputFile);
  95 + System.out.println("Done");
  96 + System.exit(0);
  97 + } catch (Throwable e) {
  98 + System.out.println("- Error downloading");
  99 + e.printStackTrace();
  100 + System.exit(1);
  101 + }
  102 + }
  103 +
  104 + private static void downloadFileFromURL(String urlString, File destination) throws Exception {
  105 + URL website = new URL(urlString);
  106 + ReadableByteChannel rbc;
  107 + rbc = Channels.newChannel(website.openStream());
  108 + FileOutputStream fos = new FileOutputStream(destination);
  109 + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
  110 + fos.close();
  111 + rbc.close();
  112 + }
  113 +
  114 +}
cloud/common/.mvn/wrapper/maven-wrapper.jar 0 → 100644
No preview for this file type
cloud/common/.mvn/wrapper/maven-wrapper.properties 0 → 100644
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip
cloud/common/mvnw 0 → 100644
@@ -0,0 +1,286 @@ @@ -0,0 +1,286 @@
  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 +# Maven2 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 + # TODO classpath?
  118 +fi
  119 +
  120 +if [ -z "$JAVA_HOME" ]; then
  121 + javaExecutable="`which javac`"
  122 + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
  123 + # readlink(1) is not available as standard on Solaris 10.
  124 + readLink=`which readlink`
  125 + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
  126 + if $darwin ; then
  127 + javaHome="`dirname \"$javaExecutable\"`"
  128 + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
  129 + else
  130 + javaExecutable="`readlink -f \"$javaExecutable\"`"
  131 + fi
  132 + javaHome="`dirname \"$javaExecutable\"`"
  133 + javaHome=`expr "$javaHome" : '\(.*\)/bin'`
  134 + JAVA_HOME="$javaHome"
  135 + export JAVA_HOME
  136 + fi
  137 + fi
  138 +fi
  139 +
  140 +if [ -z "$JAVACMD" ] ; then
  141 + if [ -n "$JAVA_HOME" ] ; then
  142 + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
  143 + # IBM's JDK on AIX uses strange locations for the executables
  144 + JAVACMD="$JAVA_HOME/jre/sh/java"
  145 + else
  146 + JAVACMD="$JAVA_HOME/bin/java"
  147 + fi
  148 + else
  149 + JAVACMD="`which java`"
  150 + fi
  151 +fi
  152 +
  153 +if [ ! -x "$JAVACMD" ] ; then
  154 + echo "Error: JAVA_HOME is not defined correctly." >&2
  155 + echo " We cannot execute $JAVACMD" >&2
  156 + exit 1
  157 +fi
  158 +
  159 +if [ -z "$JAVA_HOME" ] ; then
  160 + echo "Warning: JAVA_HOME environment variable is not set."
  161 +fi
  162 +
  163 +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
  164 +
  165 +# traverses directory structure from process work directory to filesystem root
  166 +# first directory with .mvn subdirectory is considered project base directory
  167 +find_maven_basedir() {
  168 +
  169 + if [ -z "$1" ]
  170 + then
  171 + echo "Path not specified to find_maven_basedir"
  172 + return 1
  173 + fi
  174 +
  175 + basedir="$1"
  176 + wdir="$1"
  177 + while [ "$wdir" != '/' ] ; do
  178 + if [ -d "$wdir"/.mvn ] ; then
  179 + basedir=$wdir
  180 + break
  181 + fi
  182 + # workaround for JBEAP-8937 (on Solaris 10/Sparc)
  183 + if [ -d "${wdir}" ]; then
  184 + wdir=`cd "$wdir/.."; pwd`
  185 + fi
  186 + # end of workaround
  187 + done
  188 + echo "${basedir}"
  189 +}
  190 +
  191 +# concatenates all lines of a file
  192 +concat_lines() {
  193 + if [ -f "$1" ]; then
  194 + echo "$(tr -s '\n' ' ' < "$1")"
  195 + fi
  196 +}
  197 +
  198 +BASE_DIR=`find_maven_basedir "$(pwd)"`
  199 +if [ -z "$BASE_DIR" ]; then
  200 + exit 1;
  201 +fi
  202 +
  203 +##########################################################################################
  204 +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
  205 +# This allows using the maven wrapper in projects that prohibit checking in binary data.
  206 +##########################################################################################
  207 +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
  208 + if [ "$MVNW_VERBOSE" = true ]; then
  209 + echo "Found .mvn/wrapper/maven-wrapper.jar"
  210 + fi
  211 +else
  212 + if [ "$MVNW_VERBOSE" = true ]; then
  213 + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
  214 + fi
  215 + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
  216 + while IFS="=" read key value; do
  217 + case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
  218 + esac
  219 + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
  220 + if [ "$MVNW_VERBOSE" = true ]; then
  221 + echo "Downloading from: $jarUrl"
  222 + fi
  223 + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
  224 +
  225 + if command -v wget > /dev/null; then
  226 + if [ "$MVNW_VERBOSE" = true ]; then
  227 + echo "Found wget ... using wget"
  228 + fi
  229 + wget "$jarUrl" -O "$wrapperJarPath"
  230 + elif command -v curl > /dev/null; then
  231 + if [ "$MVNW_VERBOSE" = true ]; then
  232 + echo "Found curl ... using curl"
  233 + fi
  234 + curl -o "$wrapperJarPath" "$jarUrl"
  235 + else
  236 + if [ "$MVNW_VERBOSE" = true ]; then
  237 + echo "Falling back to using Java to download"
  238 + fi
  239 + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
  240 + if [ -e "$javaClass" ]; then
  241 + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
  242 + if [ "$MVNW_VERBOSE" = true ]; then
  243 + echo " - Compiling MavenWrapperDownloader.java ..."
  244 + fi
  245 + # Compiling the Java class
  246 + ("$JAVA_HOME/bin/javac" "$javaClass")
  247 + fi
  248 + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
  249 + # Running the downloader
  250 + if [ "$MVNW_VERBOSE" = true ]; then
  251 + echo " - Running MavenWrapperDownloader.java ..."
  252 + fi
  253 + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
  254 + fi
  255 + fi
  256 + fi
  257 +fi
  258 +##########################################################################################
  259 +# End of extension
  260 +##########################################################################################
  261 +
  262 +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
  263 +if [ "$MVNW_VERBOSE" = true ]; then
  264 + echo $MAVEN_PROJECTBASEDIR
  265 +fi
  266 +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
  267 +
  268 +# For Cygwin, switch paths to Windows format before running java
  269 +if $cygwin; then
  270 + [ -n "$M2_HOME" ] &&
  271 + M2_HOME=`cygpath --path --windows "$M2_HOME"`
  272 + [ -n "$JAVA_HOME" ] &&
  273 + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
  274 + [ -n "$CLASSPATH" ] &&
  275 + CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
  276 + [ -n "$MAVEN_PROJECTBASEDIR" ] &&
  277 + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
  278 +fi
  279 +
  280 +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
  281 +
  282 +exec "$JAVACMD" \
  283 + $MAVEN_OPTS \
  284 + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
  285 + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
  286 + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
cloud/common/mvnw.cmd 0 → 100644
@@ -0,0 +1,161 @@ @@ -0,0 +1,161 @@
  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 Maven2 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 key stroke 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 my 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.4.2/maven-wrapper-0.4.2.jar"
  124 +FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO (
  125 + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
  126 +)
  127 +
  128 +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
  129 +@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
  130 +if exist %WRAPPER_JAR% (
  131 + echo Found %WRAPPER_JAR%
  132 +) else (
  133 + echo Couldn't find %WRAPPER_JAR%, downloading it ...
  134 + echo Downloading from: %DOWNLOAD_URL%
  135 + powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"
  136 + echo Finished downloading %WRAPPER_JAR%
  137 +)
  138 +@REM End of extension
  139 +
  140 +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
  141 +if ERRORLEVEL 1 goto error
  142 +goto end
  143 +
  144 +:error
  145 +set ERROR_CODE=1
  146 +
  147 +:end
  148 +@endlocal & set ERROR_CODE=%ERROR_CODE%
  149 +
  150 +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
  151 +@REM check for post script, once with legacy .bat ending and once with .cmd ending
  152 +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
  153 +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
  154 +:skipRcPost
  155 +
  156 +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
  157 +if "%MAVEN_BATCH_PAUSE%" == "on" pause
  158 +
  159 +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
  160 +
  161 +exit /B %ERROR_CODE%
cloud/common/pom.xml 0 → 100644
@@ -0,0 +1,90 @@ @@ -0,0 +1,90 @@
  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.1.7.RELEASE</version>
  9 + <relativePath/> <!-- lookup parent from repository -->
  10 + </parent>
  11 + <groupId>com.sincere</groupId>
  12 + <artifactId>common</artifactId>
  13 + <version>0.0.1-SNAPSHOT</version>
  14 + <name>common</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</artifactId>
  25 + </dependency>
  26 +
  27 + <dependency>
  28 + <groupId>org.springframework.boot</groupId>
  29 + <artifactId>spring-boot-starter-test</artifactId>
  30 + <scope>test</scope>
  31 + </dependency>
  32 +
  33 + <dependency>
  34 + <groupId>org.springframework.boot</groupId>
  35 + <artifactId>spring-boot</artifactId>
  36 + </dependency>
  37 + <dependency>
  38 + <groupId>com.baomidou</groupId>
  39 + <artifactId>mybatis-plus-core</artifactId>
  40 + <version>3.0.1</version>
  41 + <scope>compile</scope>
  42 + </dependency>
  43 +
  44 + <dependency>
  45 + <groupId>com.baomidou</groupId>
  46 + <artifactId>mybatis-plus-extension</artifactId>
  47 + <version>3.0.1</version>
  48 + <scope>compile</scope>
  49 + </dependency>
  50 +
  51 + <dependency>
  52 + <groupId>org.apache.tomcat.embed</groupId>
  53 + <artifactId>tomcat-embed-core</artifactId>
  54 + </dependency>
  55 +
  56 + <dependency>
  57 + <groupId>io.jsonwebtoken</groupId>
  58 + <artifactId>jjwt</artifactId>
  59 + <version>0.9.0</version>
  60 + </dependency>
  61 +
  62 + <dependency>
  63 + <groupId>org.springframework.security</groupId>
  64 + <artifactId>spring-security-core</artifactId>
  65 + </dependency>
  66 +
  67 + <dependency>
  68 + <groupId>org.projectlombok</groupId>
  69 + <artifactId>lombok</artifactId>
  70 + </dependency>
  71 +
  72 +
  73 + <dependency>
  74 + <groupId>commons-collections</groupId>
  75 + <artifactId>commons-collections</artifactId>
  76 + <version>3.2.2</version>
  77 + </dependency>
  78 +
  79 + </dependencies>
  80 +
  81 + <build>
  82 + <plugins>
  83 + <plugin>
  84 + <groupId>org.springframework.boot</groupId>
  85 + <artifactId>spring-boot-maven-plugin</artifactId>
  86 + </plugin>
  87 + </plugins>
  88 + </build>
  89 +
  90 +</project>
cloud/common/src/main/java/com/sincere/common/CommonApplication.java 0 → 100644
@@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
  1 +package com.sincere.common;
  2 +
  3 +import org.springframework.boot.SpringApplication;
  4 +import org.springframework.boot.autoconfigure.SpringBootApplication;
  5 +
  6 +@SpringBootApplication
  7 +public class CommonApplication {
  8 +
  9 + public static void main(String[] args) {
  10 + SpringApplication.run(CommonApplication.class, args);
  11 + }
  12 +
  13 +}
cloud/common/src/main/java/com/sincere/common/commons/CodeEnum.java 0 → 100644
@@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
  1 +package com.sincere.common.commons;
  2 +
  3 +/**
  4 + * @Author: [gitgeek]
  5 + * @Date: [2018-08-02 08:50]
  6 + * @Description: [ ]
  7 + * @Version: [1.0.0]
  8 + * @Copy: [com.zzg]
  9 + */
  10 +public enum CodeEnum {
  11 + SUCCESS(0),
  12 + ERROR(1);
  13 +
  14 + private Integer code;
  15 + CodeEnum(Integer code){
  16 + this.code = code;
  17 + }
  18 +
  19 + public Integer getCode() {
  20 + return code;
  21 + }
  22 +
  23 + public void setCode(Integer code) {
  24 + this.code = code;
  25 + }
  26 +}
cloud/common/src/main/java/com/sincere/common/commons/PageResult.java 0 → 100644
@@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
  1 +package com.sincere.common.commons;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Builder;
  5 +import lombok.Data;
  6 +import lombok.NoArgsConstructor;
  7 +
  8 +import java.io.Serializable;
  9 +import java.util.List;
  10 +
  11 +
  12 +/**
  13 + * @author 作者 owen E-mail: 624191343@qq.com
  14 + * @version 创建时间:2017年11月12日 上午22:57:51
  15 + * 分页实体类
  16 + * total 总数
  17 + * code 是否成功
  18 + * data 当前页结果集
  19 + */
  20 +@Data
  21 +@Builder
  22 +@NoArgsConstructor
  23 +@AllArgsConstructor
  24 +public class PageResult<T> implements Serializable {
  25 +
  26 + private static final long serialVersionUID = -275582248840137389L;
  27 + private Long count;
  28 + private int code;
  29 + private List<T> data;
  30 +}
cloud/common/src/main/java/com/sincere/common/commons/Result.java 0 → 100644
@@ -0,0 +1,49 @@ @@ -0,0 +1,49 @@
  1 +package com.sincere.common.commons;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Data;
  5 +import lombok.NoArgsConstructor;
  6 +
  7 +import java.io.Serializable;
  8 +
  9 +/**
  10 + * @Author: [zhangzhiguang]
  11 + * @Date: [2018-08-01 23:39]
  12 + * @Description: [ ]
  13 + * @Version: [1.0.0]
  14 + * @Copy: [com.zzg]
  15 + */
  16 +@Data
  17 +@NoArgsConstructor
  18 +@AllArgsConstructor
  19 +public class Result<T> implements Serializable {
  20 +
  21 + private T datas;
  22 + private Integer resp_code;
  23 + private String resp_msg;
  24 +
  25 + public static <T> Result<T> succeed(String msg) {
  26 + return succeedWith(null, CodeEnum.SUCCESS.getCode(),msg);
  27 + }
  28 +
  29 + public static <T> Result<T> succeed(T model, String msg) {
  30 + return succeedWith(model, CodeEnum.SUCCESS.getCode(),msg);
  31 + }
  32 +
  33 + public static <T> Result<T> succeedWith(T datas, Integer code,String msg) {
  34 + return new Result<T>(datas, code, msg);
  35 + }
  36 +
  37 + public static <T> Result<T> failed(String msg) {
  38 + return failedWith(null, CodeEnum.ERROR.getCode(), msg);
  39 + }
  40 +
  41 + public static <T> Result<T> failed(T model,String msg) {
  42 + return failedWith(model, CodeEnum.ERROR.getCode(), msg);
  43 + }
  44 +
  45 + public static <T> Result<T> failedWith(T datas, Integer code, String msg) {
  46 + return new Result<T>( datas, code, msg);
  47 + }
  48 +
  49 +}
cloud/common/src/main/java/com/sincere/common/config/DataSourceHolder.java 0 → 100644
@@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
  1 +package com.sincere.common.config;
  2 +
  3 +
  4 +/**
  5 + * 用于数据源切换
  6 + *
  7 + */
  8 +public class DataSourceHolder {
  9 +
  10 + private static final ThreadLocal<DataSourceKey> dataSourceKey = new ThreadLocal<>();
  11 +
  12 + public static DataSourceKey getDataSourceKey() {
  13 + return dataSourceKey.get();
  14 + }
  15 +
  16 + public static void setDataSourceKey(DataSourceKey type) {
  17 + dataSourceKey.set(type);
  18 + }
  19 +
  20 + public static void clearDataSourceKey() {
  21 + dataSourceKey.remove();
  22 + }
  23 +
  24 +
  25 +}
0 \ No newline at end of file 26 \ No newline at end of file
cloud/common/src/main/java/com/sincere/common/config/DataSourceKey.java 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +package com.sincere.common.config;
  2 +
  3 +/**
  4 + * 数据源定义
  5 + *
  6 + * @author owen
  7 + * @create 2017年7月2日
  8 + */
  9 +public enum DataSourceKey {
  10 + core, log ,sharding
  11 +}
0 \ No newline at end of file 12 \ No newline at end of file
cloud/common/src/main/java/com/sincere/common/constants/CommonConstants.java 0 → 100644
@@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
  1 +package com.sincere.common.constants;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/10/17 15:18
  6 + * @description:
  7 + */
  8 +public interface CommonConstants {
  9 +
  10 + /**
  11 + * 树的根节点值
  12 + */
  13 + Integer TREE_ROOT = -1;
  14 +
  15 + String PANDA_REDIS_LIST_LEY = "panda_client_id_to_access:cloud";
  16 +
  17 + String DEFAULT_PARAMTER_KEY = "parameter";
  18 +
  19 +
  20 +
  21 +}
cloud/common/src/main/java/com/sincere/common/constants/MqQueueNameConstant.java 0 → 100644
@@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
  1 +package com.sincere.common.constants;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/11/14 15:42
  6 + */
  7 +public interface MqQueueNameConstant {
  8 +
  9 + /**
  10 + * 系统日志队列
  11 + */
  12 + String SYS_LOG_QUEUE= "sys_log_queue";
  13 + /**
  14 + * 短信验证码队列
  15 + */
  16 + String MOBILE_CODE_QUEUE= "mobile_code_queue";
  17 + /**
  18 + * 邮件队列
  19 + */
  20 + String MAIL_CODE_QUEUE= "mail_code_queue";
  21 +}
cloud/common/src/main/java/com/sincere/common/constants/PandaServiceNameConstants.java 0 → 100644
@@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
  1 +package com.sincere.common.constants;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/11/14 15:52
  6 + */
  7 +public interface PandaServiceNameConstants {
  8 +
  9 + String PANDA_AUTH = "PANDA_AUTH";
  10 + String PANDA_COMMON = "PANDA_COMMON";
  11 + String PANDA_CONFIG_SERVER = "PANDA_CONFIG_SERVER";
  12 + String PANDA_GATEWAY = "PANDA_GATEWAY";
  13 + String PANDA_SERVER = "PANDA_SERVER";
  14 + String PANDA_USER_SERVICE = "PANDA_USER_SERVICE";
  15 + String PANDA_GEN_SERVICE = "PANDA_GEN_SERVICE";
  16 +
  17 +}
cloud/common/src/main/java/com/sincere/common/constants/SecurityConstants.java 0 → 100644
@@ -0,0 +1,61 @@ @@ -0,0 +1,61 @@
  1 +package com.sincere.common.constants;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/10/9 15:10
  6 + * @description: 安全配置常量
  7 + */
  8 +public interface SecurityConstants {
  9 +
  10 + /**
  11 + * token的header key
  12 + */
  13 + String TOKEN_HEADER = "Authorization";
  14 +
  15 + String CLOUD = "panda";
  16 +
  17 + String CLOUD_PREFIX = "panda_";
  18 +
  19 + /**
  20 + * jwt 加密key
  21 + */
  22 + String SIGN_KEY = "PANDA";
  23 +
  24 + /**
  25 + * sys_oauth_client_details 字段
  26 + */
  27 + String CLIENT_FIELDS = "client_id, client_secret, resources_ids, scope, authorized_grant_types,"
  28 + + "web_server_redirect_uri, authorities, access_token_validity,"
  29 + + "refresh_token_validity, addition_information, autoapprove";
  30 +
  31 + /**
  32 + * jdbcClientDetailsService查询sql
  33 + */
  34 + String BASE_FIND_STATEMENT = "select " + CLIENT_FIELDS + " from sys_oauth_client_details";
  35 +
  36 + /**
  37 + * 默认查询语句
  38 + */
  39 + String DEFAULT_FIND_STATEMENT = BASE_FIND_STATEMENT + " order by client_id";
  40 +
  41 + /**
  42 + * 根据client_id查询
  43 + */
  44 + String DEFAULT_FIND_STATEMENT_BY_CLIENT_ID = BASE_FIND_STATEMENT + " where client_id = ?";
  45 +
  46 +
  47 + String SPRING_SECURITY_MOBILE_KEY = "mobile";
  48 +
  49 + String SPRING_SECURITY_CODE_KEY = "code";
  50 +
  51 + /**
  52 + * 手机验证码登录的地址
  53 + */
  54 + String SPRING_SECURITY_MOBILE_TOKEN_URL = "/mobile/token";
  55 +
  56 +
  57 + String REDIS_CODE_PREFIX = "panda_code:";
  58 +
  59 + Integer REDIS_CODE_EXPIRE = 60;
  60 +
  61 +}
cloud/common/src/main/java/com/sincere/common/constants/UserConstants.java 0 → 100644
@@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
  1 +package com.sincere.common.constants;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/10/17 09:24
  6 + * @description:
  7 + */
  8 +public interface UserConstants {
  9 +
  10 + /**
  11 + * jwt中 用户id的key
  12 + */
  13 + String USER_ID = "userId";
  14 +
  15 +
  16 + /**
  17 + * jwt中 用户userName的key
  18 + */
  19 + String USER_NAME = "userName";
  20 +
  21 + /**
  22 + * jwt中 角色集合的key
  23 + */
  24 + String AUTHORITIES = "authorities";
  25 +
  26 +}
cloud/common/src/main/java/com/sincere/common/entity/SysUser.java 0 → 100644
@@ -0,0 +1,99 @@ @@ -0,0 +1,99 @@
  1 +package com.sincere.common.entity;
  2 +
  3 +
  4 +import lombok.Data;
  5 +import lombok.experimental.Accessors;
  6 +
  7 +import java.time.LocalDateTime;
  8 +
  9 +/**
  10 + * <p>
  11 + * 用户表
  12 + * </p>
  13 + *
  14 + * @author yukong
  15 + * @since 2018-10-08
  16 + */
  17 +@Data
  18 +@Accessors(chain = true)
  19 +public class SysUser {
  20 +
  21 + private static final long serialVersionUID = 1L;
  22 +
  23 + /**
  24 + * 主键ID
  25 + */
  26 + private Integer userId;
  27 +
  28 + /**
  29 + * 用户名
  30 + */
  31 + private String username;
  32 +
  33 + /**
  34 + * 密码
  35 + */
  36 + private String password;
  37 +
  38 + /**
  39 + * 邮箱
  40 + */
  41 + private String email;
  42 +
  43 + /**
  44 + * 手机号码
  45 + */
  46 + private String mobile;
  47 +
  48 + /**
  49 + * qq号码
  50 + */
  51 + private String qq;
  52 +
  53 + /**
  54 + * 微信号码
  55 + */
  56 + private String wechat;
  57 +
  58 + /**
  59 + * 微博url
  60 + */
  61 + private String weibo;
  62 +
  63 + /**
  64 + * 头像url
  65 + */
  66 + private String avatar;
  67 +
  68 + /**
  69 + * qq openid
  70 + */
  71 + private String qqOpenid;
  72 +
  73 + /**
  74 + * 微信openid
  75 + */
  76 + private String wechatOpenid;
  77 +
  78 + /**
  79 + * 微博openid
  80 + */
  81 + private String weiboOpenid;
  82 +
  83 + /**
  84 + * 创建时间
  85 + */
  86 + private LocalDateTime createTime;
  87 +
  88 + /**
  89 + * 更新时间
  90 + */
  91 + private LocalDateTime modifyTime;
  92 +
  93 + /**
  94 + * 是否删除 0-未删除 1-删除
  95 + */
  96 + private String delFlag;
  97 +
  98 +
  99 +}
cloud/common/src/main/java/com/sincere/common/enums/ApiErrorCodeEnum.java 0 → 100644
@@ -0,0 +1,57 @@ @@ -0,0 +1,57 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +
  4 +import com.baomidou.mybatisplus.extension.api.IErrorCode;
  5 +
  6 +/**
  7 + * @author yukong
  8 + * @date 2019-04-20 18:54
  9 + */
  10 +public enum ApiErrorCodeEnum implements IErrorCode {
  11 + /**
  12 + * 失败
  13 + */
  14 + FAILED(-1, "失败"),
  15 + /**
  16 + * 成功
  17 + */
  18 + SUCCESS(0, "成功"),
  19 +
  20 + /**
  21 + * 认证失败
  22 + */
  23 + AUTHORIZED_FAILED(-2, "用户名或密码错误");
  24 +
  25 + private final long code;
  26 + private final String msg;
  27 +
  28 + ApiErrorCodeEnum(final long code, final String msg) {
  29 + this.code = code;
  30 + this.msg = msg;
  31 + }
  32 +
  33 + public static ApiErrorCodeEnum fromCode(long code) {
  34 + ApiErrorCodeEnum[] ecs = ApiErrorCodeEnum.values();
  35 + for (ApiErrorCodeEnum ec : ecs) {
  36 + if (ec.getCode() == code) {
  37 + return ec;
  38 + }
  39 + }
  40 + return SUCCESS;
  41 + }
  42 +
  43 + @Override
  44 + public long getCode() {
  45 + return code;
  46 + }
  47 +
  48 + @Override
  49 + public String getMsg() {
  50 + return msg;
  51 + }
  52 +
  53 + @Override
  54 + public String toString() {
  55 + return String.format(" ErrorCode:{code=%s, msg=%s} ", code, msg);
  56 + }
  57 +}
0 \ No newline at end of file 58 \ No newline at end of file
cloud/common/src/main/java/com/sincere/common/enums/DataStatusEnum.java 0 → 100644
@@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/10/9 14:35
  6 + * @description: 数据状态枚举
  7 + */
  8 +public enum DataStatusEnum {
  9 +
  10 + NORMAL("0", "正常"),
  11 + LOCK("1","删除");
  12 +
  13 +
  14 + private String code;
  15 +
  16 + private String message;
  17 +
  18 + DataStatusEnum(String code, String message) {
  19 + this.code = code;
  20 + this.message = message;
  21 + }
  22 +
  23 + public String getCode() {
  24 + return code;
  25 + }
  26 +
  27 + public String getMessage() {
  28 + return message;
  29 + }
  30 +}
cloud/common/src/main/java/com/sincere/common/enums/JobDataStatusEnum.java 0 → 100644
@@ -0,0 +1,37 @@ @@ -0,0 +1,37 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +/**
  4 + * @author yukong
  5 + * @date 2018/10/9 14:35
  6 + * @description job任务状态枚举
  7 + */
  8 +public enum JobDataStatusEnum {
  9 +
  10 + /**
  11 + * 运行中
  12 + */
  13 + UP(0, "运行"),
  14 +
  15 + /**
  16 + * 停止
  17 + */
  18 + STOP(1,"停止");
  19 +
  20 +
  21 + private Integer code;
  22 +
  23 + private String message;
  24 +
  25 + JobDataStatusEnum(Integer code, String message) {
  26 + this.code = code;
  27 + this.message = message;
  28 + }
  29 +
  30 + public Integer getCode() {
  31 + return code;
  32 + }
  33 +
  34 + public String getMessage() {
  35 + return message;
  36 + }
  37 +}
cloud/common/src/main/java/com/sincere/common/enums/OperationStatusEnum.java 0 → 100644
@@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/10/9 14:35
  6 + * @description: 用户状态枚举
  7 + */
  8 +public enum OperationStatusEnum {
  9 +
  10 + SUCCESS("0", "成功"),
  11 + FAIL("1","失败");
  12 +
  13 +
  14 + private String code;
  15 +
  16 + private String message;
  17 +
  18 + OperationStatusEnum(String code, String message) {
  19 + this.code = code;
  20 + this.message = message;
  21 + }
  22 +
  23 + public String getCode() {
  24 + return code;
  25 + }
  26 +
  27 + public String getMessage() {
  28 + return message;
  29 + }
  30 +}
cloud/common/src/main/java/com/sincere/common/enums/PasswordEncoderEnum.java 0 → 100644
@@ -0,0 +1,27 @@ @@ -0,0 +1,27 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +/**
  4 + * @author yukong
  5 + * @date 2019-04-23 14:15
  6 + */
  7 +public enum PasswordEncoderEnum {
  8 +
  9 + /**
  10 + * bcrypt加密
  11 + */
  12 + BCRYPT("{bcrypt}"),
  13 + /**
  14 + * 明文
  15 + */
  16 + NOOP("{noop}");
  17 +
  18 + private String value;
  19 +
  20 + private PasswordEncoderEnum(String value){
  21 + this.value = value;
  22 + }
  23 +
  24 + public String getValue() {
  25 + return value;
  26 + }
  27 +}
cloud/common/src/main/java/com/sincere/common/enums/ResourceTypeEnum.java 0 → 100644
@@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/10/17 16:03
  6 + * @description: 资源类型枚举
  7 + */
  8 +public enum ResourceTypeEnum {
  9 + MENU("0", "菜单"),
  10 + BUTTON("1","按钮");
  11 +
  12 +
  13 + private String code;
  14 +
  15 + private String message;
  16 +
  17 + ResourceTypeEnum(String code, String message) {
  18 + this.code = code;
  19 + this.message = message;
  20 + }
  21 +
  22 + public String getCode() {
  23 + return code;
  24 + }
  25 +
  26 + public String getMessage() {
  27 + return message;
  28 + }
  29 +}
cloud/common/src/main/java/com/sincere/common/enums/ResponseCodeEnum.java 0 → 100644
@@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/10/12 10:51
  6 + * @description: 响应信息code枚举
  7 + */
  8 +public enum ResponseCodeEnum {
  9 +
  10 + SUCCESS(0, "success"),
  11 +
  12 + NOT_LOGIN(-1,"need login"),
  13 +
  14 + FAIL(-1,"fail"),
  15 +
  16 + PERMISSION_DEFINED(2,"permission defined");
  17 +
  18 +
  19 + private Integer code;
  20 +
  21 + private String message;
  22 +
  23 + ResponseCodeEnum(Integer code, String message) {
  24 + this.code = code;
  25 + this.message = message;
  26 + }
  27 +
  28 + public Integer getCode() {
  29 + return code;
  30 + }
  31 +
  32 + public String getMessage() {
  33 + return message;
  34 + }
  35 +
  36 +}
cloud/common/src/main/java/com/sincere/common/enums/SmsMessageChannnelEnum.java 0 → 100644
@@ -0,0 +1,27 @@ @@ -0,0 +1,27 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +import lombok.Getter;
  4 +
  5 +/**
  6 + * @author: yukong
  7 + * @date: 2018/12/3 10:44
  8 + */
  9 +
  10 +public enum SmsMessageChannnelEnum {
  11 +
  12 + /**
  13 + * 腾讯云
  14 + */
  15 + TENCENT_CLOUD("smsTencentCloudMessageHandler", "腾讯云");
  16 +
  17 + @Getter
  18 + String code;
  19 +
  20 + @Getter
  21 + String desc;
  22 +
  23 + private SmsMessageChannnelEnum(String code, String desc) {
  24 + this.code = code;
  25 + this.desc = desc;
  26 + }
  27 +}
cloud/common/src/main/java/com/sincere/common/enums/SmsTemplateEnum.java 0 → 100644
@@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +import lombok.Getter;
  4 +
  5 +/**
  6 + * @author: yukong
  7 + * @date: 2018/12/14 14:53
  8 + */
  9 +public enum SmsTemplateEnum {
  10 +
  11 + /**
  12 + * 腾讯云
  13 + */
  14 + LOGIN_CODE("程序咖啡厅", "238684");
  15 +
  16 + @Getter
  17 + String signName;
  18 +
  19 + @Getter
  20 + String tempalte;
  21 +
  22 + private SmsTemplateEnum(String signName, String tempalte) {
  23 + this.signName = signName;
  24 + this.tempalte = tempalte;
  25 + }
  26 +}
cloud/common/src/main/java/com/sincere/common/enums/SysLogTypeEnum.java 0 → 100644
@@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/10/17 16:03
  6 + * @description: 资源类型枚举
  7 + */
  8 +public enum SysLogTypeEnum {
  9 + LOGIN("0", "登录日志"),
  10 + OPERATOR("1","操作日志");
  11 +
  12 +
  13 + private String code;
  14 +
  15 + private String message;
  16 +
  17 + SysLogTypeEnum(String code, String message) {
  18 + this.code = code;
  19 + this.message = message;
  20 + }
  21 +
  22 + public String getCode() {
  23 + return code;
  24 + }
  25 +
  26 + public String getMessage() {
  27 + return message;
  28 + }
  29 +}
cloud/common/src/main/java/com/sincere/common/enums/UserStatusEnum.java 0 → 100644
@@ -0,0 +1,37 @@ @@ -0,0 +1,37 @@
  1 +package com.sincere.common.enums;
  2 +
  3 +/**
  4 + * @author: yukong
  5 + * @date: 2018/10/9 14:35
  6 + * @description: 用户状态枚举
  7 + */
  8 +public enum UserStatusEnum {
  9 +
  10 + /**
  11 + * 正常
  12 + */
  13 + NORMAL("0", "正常"),
  14 +
  15 + /**
  16 + * 锁定
  17 + */
  18 + LOCK("1","锁定");
  19 +
  20 +
  21 + private String code;
  22 +
  23 + private String message;
  24 +
  25 + UserStatusEnum(String code, String message) {
  26 + this.code = code;
  27 + this.message = message;
  28 + }
  29 +
  30 + public String getCode() {
  31 + return code;
  32 + }
  33 +
  34 + public String getMessage() {
  35 + return message;
  36 + }
  37 +}
cloud/common/src/main/java/com/sincere/common/model/log/SysLog.java 0 → 100644
@@ -0,0 +1,37 @@ @@ -0,0 +1,37 @@
  1 +package com.sincere.common.model.log;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Builder;
  5 +import lombok.Data;
  6 +import lombok.NoArgsConstructor;
  7 +
  8 +import java.io.Serializable;
  9 +import java.util.Date;
  10 +
  11 +
  12 +/**
  13 +* @author 作者 owen E-mail: 624191343@qq.com
  14 +* @version 创建时间:2017年11月12日 上午22:57:51
  15 +* 日志实体
  16 + */
  17 +@Builder
  18 +@Data
  19 +@NoArgsConstructor
  20 +@AllArgsConstructor
  21 +public class SysLog implements Serializable {
  22 +
  23 + private static final long serialVersionUID = -5398795297842978376L;
  24 +
  25 + private Long id;
  26 +// 用户名
  27 + private String username;
  28 +// 归属模块
  29 + private String module;
  30 +// 执行方法的参数值
  31 + private String params;
  32 + private String remark;
  33 +// 是否执行成功
  34 + private Boolean flag;
  35 +
  36 + private Date createTime;
  37 +}
cloud/common/src/main/java/com/sincere/common/model/system/LoginAppUser.java 0 → 100644
@@ -0,0 +1,93 @@ @@ -0,0 +1,93 @@
  1 +package com.sincere.common.model.system;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonIgnore;
  4 +import lombok.Getter;
  5 +import lombok.Setter;
  6 +import org.springframework.security.core.GrantedAuthority;
  7 +import org.springframework.security.core.authority.SimpleGrantedAuthority;
  8 +import org.springframework.security.core.userdetails.UserDetails;
  9 +import org.springframework.util.CollectionUtils;
  10 +
  11 +import java.io.Serializable;
  12 +import java.util.Collection;
  13 +import java.util.HashSet;
  14 +import java.util.Set;
  15 +
  16 +/**
  17 + * 用户实体绑定spring security
  18 + */
  19 +@Getter
  20 +@Setter
  21 +public class LoginAppUser extends SysUser implements UserDetails {
  22 +
  23 + /**
  24 + *
  25 + */
  26 + private static final long serialVersionUID = -3685249101751401211L;
  27 +
  28 + private Set<SysRole> sysRoles;
  29 +
  30 + private Set<String> permissions;
  31 +
  32 + /***
  33 + * 权限重写
  34 + */
  35 + @JsonIgnore
  36 + @Override
  37 + public Collection<? extends GrantedAuthority> getAuthorities() {
  38 + Collection<GrantedAuthority> collection = new HashSet<>();
  39 + if (!CollectionUtils.isEmpty(sysRoles)) {
  40 + sysRoles.parallelStream().forEach(role -> {
  41 + if (role.getCode().startsWith("ROLE_")) {
  42 + collection.add(new SimpleGrantedAuthority(role.getCode()));
  43 + } else {
  44 + collection.add(new SimpleGrantedAuthority("ROLE_" + role.getCode()));
  45 + }
  46 + });
  47 + }
  48 +
  49 + if (!CollectionUtils.isEmpty(permissions)) {
  50 + permissions.parallelStream().forEach(per -> {
  51 + collection.add(new SimpleGrantedAuthority(per));
  52 + });
  53 + }
  54 +
  55 + return collection;
  56 + }
  57 +
  58 +
  59 + @JsonIgnore
  60 + public Collection<? extends GrantedAuthority> putAll( Collection<GrantedAuthority> collections) {
  61 + Collection<GrantedAuthority> collection = new HashSet<>();
  62 +
  63 + collection.addAll(collections) ;
  64 +
  65 + return collection;
  66 + }
  67 +
  68 +
  69 + @Override
  70 + public boolean isAccountNonExpired() {
  71 + return true;
  72 + }
  73 +
  74 + @Override
  75 + public boolean isAccountNonLocked() {
  76 + return true;
  77 + }
  78 +
  79 + @Override
  80 + public boolean isCredentialsNonExpired() {
  81 + return true;
  82 + }
  83 +
  84 + @Override
  85 + public boolean isEnabled() {
  86 + return getEnabled();
  87 + }
  88 +
  89 + @Override
  90 + protected Serializable pkVal() {
  91 + return null;
  92 + }
  93 +}
cloud/common/src/main/java/com/sincere/common/model/system/SysMenu.java 0 → 100644
@@ -0,0 +1,37 @@ @@ -0,0 +1,37 @@
  1 +package com.sincere.common.model.system;
  2 +
  3 +import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  4 +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
  5 +import lombok.Data;
  6 +
  7 +import java.io.Serializable;
  8 +import java.util.Date;
  9 +import java.util.List;
  10 +import java.util.Set;
  11 +
  12 +@Data
  13 +public class SysMenu implements Serializable {
  14 +
  15 + private static final long serialVersionUID = 749360940290141180L;
  16 + @JsonSerialize(using= ToStringSerializer.class)
  17 + private Long id;
  18 + private Long parentId;
  19 + private String name;
  20 + private String css;
  21 + private String url;
  22 + private String path;
  23 + private Integer sort;
  24 + private Date createTime;
  25 + private Date updateTime;
  26 + private Integer isMenu;
  27 + private Boolean hidden;
  28 +
  29 +
  30 + private List<SysMenu> subMenus;
  31 +
  32 + private Long roleId;
  33 + private Set<Long> menuIds;
  34 +
  35 +
  36 +
  37 +}
cloud/common/src/main/java/com/sincere/common/model/system/SysPermission.java 0 → 100644
@@ -0,0 +1,47 @@ @@ -0,0 +1,47 @@
  1 +package com.sincere.common.model.system;
  2 +
  3 +import com.baomidou.mybatisplus.annotation.IdType;
  4 +import com.baomidou.mybatisplus.annotation.TableField;
  5 +import com.baomidou.mybatisplus.annotation.TableId;
  6 +import com.baomidou.mybatisplus.annotation.TableName;
  7 +import com.baomidou.mybatisplus.extension.activerecord.Model;
  8 +import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  9 +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
  10 +import lombok.Data;
  11 +
  12 +import java.io.Serializable;
  13 +import java.util.Date;
  14 +import java.util.Set;
  15 +
  16 +
  17 +/**
  18 + * @author 作者 owen E-mail: 624191343@qq.com
  19 + * @version 创建时间:2017年11月12日 上午22:57:51
  20 + * 权限标识
  21 + */
  22 +@Data
  23 +@TableName("sys_permission")
  24 +public class SysPermission extends Model<SysPermission> implements Serializable {
  25 + /**
  26 + *
  27 + */
  28 + private static final long serialVersionUID = 1389727646460449239L;
  29 + @TableId(value="id",type= IdType.ID_WORKER) //雪花算法 id生成策略
  30 + @JsonSerialize(using= ToStringSerializer.class)
  31 + private Long id;
  32 + private String permission;
  33 + private String name;
  34 + @TableField(value="createTime")
  35 + private Date createTime;
  36 + @TableField(value="updateTime")
  37 + private Date updateTime;
  38 + @TableField(exist=false)
  39 + private Long roleId;
  40 + @TableField(exist=false)
  41 + private Set<Long> authIds;
  42 +
  43 + @Override
  44 + protected Serializable pkVal() {
  45 + return null;
  46 + }
  47 +}
cloud/common/src/main/java/com/sincere/common/model/system/SysRole.java 0 → 100644
@@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
  1 +package com.sincere.common.model.system;
  2 +
  3 +import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  4 +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
  5 +import lombok.Data;
  6 +
  7 +import java.io.Serializable;
  8 +import java.util.Date;
  9 +
  10 +/**
  11 + * @author 作者 owen E-mail: 624191343@qq.com
  12 + * @version 创建时间:2017年11月12日 上午22:57:51
  13 + * 角色
  14 + */
  15 +@Data
  16 +public class SysRole implements Serializable {
  17 +
  18 + /**
  19 + *
  20 + */
  21 + private static final long serialVersionUID = 4497149010220586111L;
  22 + @JsonSerialize(using= ToStringSerializer.class)
  23 + private Long id;
  24 + private String code;
  25 + private String name;
  26 + private Date createTime;
  27 + private Date updateTime;
  28 + private Long userId;
  29 +}
cloud/common/src/main/java/com/sincere/common/model/system/SysUser.java 0 → 100644
@@ -0,0 +1,60 @@ @@ -0,0 +1,60 @@
  1 +package com.sincere.common.model.system;
  2 +
  3 +import com.baomidou.mybatisplus.annotation.IdType;
  4 +import com.baomidou.mybatisplus.annotation.TableField;
  5 +import com.baomidou.mybatisplus.annotation.TableId;
  6 +import com.baomidou.mybatisplus.annotation.TableName;
  7 +import com.baomidou.mybatisplus.extension.activerecord.Model;
  8 +import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  9 +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
  10 +import lombok.Data;
  11 +
  12 +import java.io.Serializable;
  13 +import java.util.Date;
  14 +import java.util.List;
  15 +
  16 +/**
  17 + * @author 作者 owen E-mail: 624191343@qq.com
  18 + * @version 创建时间:2017年11月12日 上午22:57:51
  19 + * 用户实体
  20 + */
  21 +@Data
  22 +@TableName("sys_user")
  23 +public class SysUser extends Model<SysUser> implements Serializable {
  24 +
  25 + /**
  26 + *
  27 + */
  28 + private static final long serialVersionUID = -5886012896705137070L;
  29 + @TableId(value="id",type= IdType.ID_WORKER) //雪花算法 id生成策略
  30 + @JsonSerialize(using= ToStringSerializer.class)
  31 + private Long id;
  32 + private String username;
  33 + private String password;
  34 + private String nickname;
  35 + private String headImgUrl;
  36 + private String phone;
  37 + private Integer sex;
  38 + private Boolean enabled;
  39 + private String type;
  40 + @TableField(value="createTime")
  41 + private Date createTime;
  42 + @TableField(value="updateTime")
  43 + private Date updateTime;
  44 +
  45 + @TableField(exist=false)
  46 + private List<SysRole> roles;
  47 +
  48 + @TableField(exist=false)
  49 + private String roleId;
  50 +
  51 + @TableField(exist=false)
  52 + private String oldPassword;
  53 + @TableField(exist=false)
  54 + private String newPassword;
  55 +
  56 + @Override
  57 + protected Serializable pkVal() {
  58 + return null;
  59 + }
  60 +}
cloud/common/src/main/java/com/sincere/common/model/system/SysUserRole.java 0 → 100644
@@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
  1 +package com.sincere.common.model.system;
  2 +
  3 +import lombok.Data;
  4 +
  5 +/**
  6 + * @Author: [gitgeek]
  7 + * @Date: [2018-08-06 21:29]
  8 + * @Description: [ ]
  9 + * @Version: [1.0.0]
  10 + * @Copy: [com.zzg]
  11 + */
  12 +@Data
  13 +public class SysUserRole {
  14 +
  15 + private String userId;
  16 + private String roleId;
  17 +
  18 +}
cloud/common/src/main/java/com/sincere/common/model/system/constants/UserType.java 0 → 100644
@@ -0,0 +1,19 @@ @@ -0,0 +1,19 @@
  1 +package com.sincere.common.model.system.constants;
  2 +
  3 +
  4 +/**
  5 + * @author 作者 owen E-mail: 624191343@qq.com
  6 + * @version 创建时间:2017年11月12日 上午22:57:51
  7 + * 用户类型
  8 + */
  9 +public enum UserType {
  10 +
  11 + /**
  12 + * 前端app用户
  13 + */
  14 + APP,
  15 + /**
  16 + * 后端管理用户
  17 + */
  18 + BACKEND
  19 +}
cloud/common/src/main/java/com/sincere/common/props/PermitUrlProperties.java 0 → 100644
@@ -0,0 +1,55 @@ @@ -0,0 +1,55 @@
  1 +package com.sincere.common.props;
  2 +
  3 +import org.springframework.boot.context.properties.ConfigurationProperties;
  4 +
  5 +import java.util.ArrayList;
  6 +import java.util.List;
  7 +
  8 +/**
  9 + * @author 作者 owen E-mail: 624191343@qq.com
  10 + * @version 创建时间:2017年11月12日 上午22:57:51 url白名单处理 application.yml中配置需要放权的url白名单
  11 + */
  12 +// @ConfigurationProperties(prefix = "permit")
  13 +@ConfigurationProperties(prefix = "security.oauth2")
  14 +public class PermitUrlProperties {
  15 +
  16 + /**
  17 + * 监控中心和swagger需要访问的url
  18 + */
  19 + private static final String[] ENDPOINTS = {
  20 + "/**/actuator/**" , "/**/actuator/**/**" , //断点监控
  21 + "/**/v2/api-docs/**", "/**/swagger-ui.html", "/**/swagger-resources/**", "/**/webjars/**", //swagger
  22 + "/**/turbine.stream","/**/turbine.stream**/**", "/**/hystrix", "/**/hystrix.stream", "/**/hystrix/**", "/**/hystrix/**/**", "/**/proxy.stream/**" , //熔断监控
  23 + "/**/druid/**", "/**/favicon.ico", "/**/prometheus"
  24 + };
  25 +
  26 + private String[] ignored;
  27 +
  28 + /**
  29 + * 需要放开权限的url
  30 + *
  31 + * @param urls
  32 + * 自定义的url
  33 + * @return 自定义的url和监控中心需要访问的url集合
  34 + */
  35 + public String[] getIgnored() {
  36 + if (ignored == null || ignored.length == 0) {
  37 + return ENDPOINTS;
  38 + }
  39 +
  40 + List<String> list = new ArrayList<>();
  41 + for (String url : ENDPOINTS) {
  42 + list.add(url);
  43 + }
  44 + for (String url : ignored) {
  45 + list.add(url);
  46 + }
  47 +
  48 + return list.toArray(new String[list.size()]);
  49 + }
  50 +
  51 + public void setIgnored(String[] ignored) {
  52 + this.ignored = ignored;
  53 + }
  54 +
  55 +}
cloud/common/src/main/java/com/sincere/common/util/ApiResult.java 0 → 100644
@@ -0,0 +1,51 @@ @@ -0,0 +1,51 @@
  1 +package com.sincere.common.util;
  2 +
  3 +import com.sincere.common.enums.ResponseCodeEnum;
  4 +import lombok.Data;
  5 +
  6 +import java.io.Serializable;
  7 +
  8 +/**
  9 + * @author: yukong
  10 + * @date: 2018/10/12 10:39
  11 + * @description: 统一响应信息主体
  12 + */
  13 +@Data
  14 +public class ApiResult<T> implements Serializable {
  15 +
  16 + private T data;
  17 +
  18 + private Integer code = ResponseCodeEnum.SUCCESS.getCode();
  19 +
  20 + private String message = ResponseCodeEnum.SUCCESS.getMessage();
  21 +
  22 + public ApiResult() {
  23 + }
  24 +
  25 + public ApiResult(T data) {
  26 + this.data = data;
  27 + }
  28 +
  29 + public ApiResult(T data, String message) {
  30 + this.data = data;
  31 + this.message = message;
  32 + }
  33 +
  34 + public ApiResult(T data, ResponseCodeEnum responseCode) {
  35 + this.data = data;
  36 + this.code = responseCode.getCode();
  37 + this.message = responseCode.getMessage();
  38 + }
  39 +
  40 + public ApiResult(Throwable throwable) {
  41 + this.message = throwable.getMessage();
  42 + this.code = ResponseCodeEnum.FAIL.getCode();
  43 + }
  44 +
  45 + public ApiResult(Throwable throwable, ResponseCodeEnum code) {
  46 + this.message = throwable.getMessage();
  47 + this.code = code.getCode();
  48 + }
  49 +
  50 +
  51 +}
cloud/common/src/main/java/com/sincere/common/util/SpringUtils.java 0 → 100644
@@ -0,0 +1,37 @@ @@ -0,0 +1,37 @@
  1 +package com.sincere.common.util;
  2 +
  3 +import org.springframework.beans.BeansException;
  4 +import org.springframework.context.ApplicationContext;
  5 +import org.springframework.context.ApplicationContextAware;
  6 +import org.springframework.core.env.Environment;
  7 +import org.springframework.stereotype.Component;
  8 +
  9 +/**
  10 + * spring获取bean工具类
  11 + *
  12 +* @author 作者 owen E-mail: 624191343@qq.com
  13 + * @version 创建时间:2018年3月20日 下午10:13:18 类说明
  14 + *
  15 + */
  16 +@Component
  17 +public class SpringUtils implements ApplicationContextAware {
  18 +
  19 + private static ApplicationContext applicationContext = null;
  20 +
  21 + @Override
  22 + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  23 + SpringUtils.applicationContext = applicationContext;
  24 + }
  25 +
  26 + public static <T> T getBean(Class<T> cla) {
  27 + return applicationContext.getBean(cla);
  28 + }
  29 +
  30 + public static <T> T getBean(String name, Class<T> cal) {
  31 + return applicationContext.getBean(name, cal);
  32 + }
  33 +
  34 + public static String getProperty(String key) {
  35 + return applicationContext.getBean(Environment.class).getProperty(key);
  36 + }
  37 +}
cloud/common/src/main/java/com/sincere/common/util/UrlUtil.java 0 → 100644
@@ -0,0 +1,47 @@ @@ -0,0 +1,47 @@
  1 +package com.sincere.common.util;
  2 +
  3 +import javax.servlet.http.HttpServletRequest;
  4 +import java.io.PrintWriter;
  5 +import java.io.StringWriter;
  6 +
  7 +/**
  8 + * @author: yukong
  9 + * @date: 2018/11/14 19:50
  10 + */
  11 +public class UrlUtil {
  12 +
  13 + /**
  14 + * 获取目标主机的ip
  15 + * @param request
  16 + * @return
  17 + */
  18 + public static String getRemoteHost(HttpServletRequest request) {
  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 +
  32 +
  33 + /**
  34 + * 获取完整的异常栈信息
  35 + * @param t
  36 + * @return
  37 + */
  38 + public static String getTrace(Throwable t) {
  39 + StringWriter stringWriter= new StringWriter();
  40 + PrintWriter writer= new PrintWriter(stringWriter);
  41 + t.printStackTrace(writer);
  42 + StringBuffer buffer= stringWriter.getBuffer();
  43 + return buffer.toString();
  44 + }
  45 +
  46 +
  47 +}
cloud/common/src/main/java/com/sincere/common/util/UserUtil.java 0 → 100644
@@ -0,0 +1,95 @@ @@ -0,0 +1,95 @@
  1 +package com.sincere.common.util;
  2 +
  3 +import com.sincere.common.constants.SecurityConstants;
  4 +import com.sincere.common.constants.UserConstants;
  5 +import io.jsonwebtoken.Claims;
  6 +import io.jsonwebtoken.Jwts;
  7 +import lombok.extern.slf4j.Slf4j;
  8 +
  9 +import javax.servlet.http.HttpServletRequest;
  10 +import java.util.Base64;
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * @author: yukong
  15 + * @date: 2018/10/17 08:56
  16 + * @description:
  17 + */
  18 +@Slf4j
  19 +public class UserUtil {
  20 +
  21 + /**
  22 + * 获取请求中的token
  23 + * @param request
  24 + * @return token
  25 + */
  26 + public static String getToken(HttpServletRequest request){
  27 + String authorization = request.getHeader(SecurityConstants.TOKEN_HEADER);
  28 + if(authorization == null){
  29 + return null;
  30 + }
  31 + String token = authorization.split(" ")[1];
  32 + log.info("获取token成功,值为{}", token);
  33 + return token;
  34 + }
  35 +
  36 + /**
  37 + * 获取jwt中的claims信息
  38 + * @param token
  39 + * @return claim
  40 + */
  41 + public static Claims getClaims(String token) {
  42 + String key = Base64.getEncoder().encodeToString(SecurityConstants.SIGN_KEY.getBytes());
  43 + Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
  44 + return claims;
  45 + }
  46 +
  47 + /**
  48 + * 获取请求中的userId
  49 + * @param request
  50 + * @return userId
  51 + */
  52 + public static Integer getUserId(HttpServletRequest request){
  53 + String token = getToken(request);
  54 + if(token == null){
  55 + return null;
  56 + }
  57 + Claims claims = getClaims(token);
  58 + Integer userId = (Integer) claims.get(UserConstants.USER_ID);
  59 + log.info("获取userId成功,值为", userId);
  60 + return userId;
  61 + }
  62 +
  63 + /**
  64 + * 获取请求中的userId
  65 + * @param request
  66 + * @return userId
  67 + */
  68 + public static String getUserName(HttpServletRequest request){
  69 + String token = getToken(request);
  70 + if(token == null){
  71 + return null;
  72 + }
  73 + Claims claims = getClaims(token);
  74 + String username = (String) claims.get(UserConstants.USER_NAME);
  75 + log.info("获取username成功,值为", username);
  76 + return username;
  77 + }
  78 +
  79 + /**
  80 + * 获取请求中的roles集合
  81 + * @param request
  82 + * @return roles
  83 + */
  84 + public static List<String> getRoles(HttpServletRequest request) {
  85 + String token = getToken(request);
  86 + if(token == null){
  87 + return null;
  88 + }
  89 + Claims claims = getClaims(token);
  90 + List<String> roles = (List<String>) claims.get(UserConstants.AUTHORITIES);
  91 + return roles;
  92 + }
  93 +
  94 +
  95 +}