# Compiled class file | |||||
*.class | |||||
HELP.md | |||||
target/ | |||||
!.mvn/wrapper/maven-wrapper.jar | |||||
!**/src/main/** | |||||
!**/src/test/** | |||||
# Log file | |||||
*.log | |||||
### STS ### | |||||
.apt_generated | |||||
.classpath | |||||
.factorypath | |||||
.project | |||||
.settings | |||||
.springBeans | |||||
.sts4-cache | |||||
# BlueJ files | |||||
*.ctxt | |||||
### IntelliJ IDEA ### | |||||
.idea | |||||
*.iws | |||||
*.iml | |||||
*.ipr | |||||
# Mobile Tools for Java (J2ME) | |||||
.mtj.tmp/ | |||||
### NetBeans ### | |||||
/nbproject/private/ | |||||
/nbbuild/ | |||||
/dist/ | |||||
/nbdist/ | |||||
/.nb-gradle/ | |||||
build/ | |||||
# Package Files # | |||||
*.jar | |||||
*.war | |||||
*.nar | |||||
*.ear | |||||
*.zip | |||||
*.tar.gz | |||||
*.rar | |||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml | |||||
hs_err_pid* | |||||
### VS Code ### | |||||
.vscode/ |
/* | |||||
* Copyright 2007-present the original author or authors. | |||||
* | |||||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||||
* you may not use this file except in compliance with the License. | |||||
* You may obtain a copy of the License at | |||||
* | |||||
* https://www.apache.org/licenses/LICENSE-2.0 | |||||
* | |||||
* Unless required by applicable law or agreed to in writing, software | |||||
* distributed under the License is distributed on an "AS IS" BASIS, | |||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
* See the License for the specific language governing permissions and | |||||
* limitations under the License. | |||||
*/ | |||||
import java.net.*; | |||||
import java.io.*; | |||||
import java.nio.channels.*; | |||||
import java.util.Properties; | |||||
public class MavenWrapperDownloader { | |||||
private static final String WRAPPER_VERSION = "0.5.6"; | |||||
/** | |||||
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. | |||||
*/ | |||||
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" | |||||
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; | |||||
/** | |||||
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to | |||||
* use instead of the default one. | |||||
*/ | |||||
private static final String MAVEN_WRAPPER_PROPERTIES_PATH = | |||||
".mvn/wrapper/maven-wrapper.properties"; | |||||
/** | |||||
* Path where the maven-wrapper.jar will be saved to. | |||||
*/ | |||||
private static final String MAVEN_WRAPPER_JAR_PATH = | |||||
".mvn/wrapper/maven-wrapper.jar"; | |||||
/** | |||||
* Name of the property which should be used to override the default download url for the wrapper. | |||||
*/ | |||||
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; | |||||
public static void main(String args[]) { | |||||
System.out.println("- Downloader started"); | |||||
File baseDirectory = new File(args[0]); | |||||
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); | |||||
// If the maven-wrapper.properties exists, read it and check if it contains a custom | |||||
// wrapperUrl parameter. | |||||
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); | |||||
String url = DEFAULT_DOWNLOAD_URL; | |||||
if (mavenWrapperPropertyFile.exists()) { | |||||
FileInputStream mavenWrapperPropertyFileInputStream = null; | |||||
try { | |||||
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); | |||||
Properties mavenWrapperProperties = new Properties(); | |||||
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); | |||||
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); | |||||
} catch (IOException e) { | |||||
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); | |||||
} finally { | |||||
try { | |||||
if (mavenWrapperPropertyFileInputStream != null) { | |||||
mavenWrapperPropertyFileInputStream.close(); | |||||
} | |||||
} catch (IOException e) { | |||||
// Ignore ... | |||||
} | |||||
} | |||||
} | |||||
System.out.println("- Downloading from: " + url); | |||||
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); | |||||
if (!outputFile.getParentFile().exists()) { | |||||
if (!outputFile.getParentFile().mkdirs()) { | |||||
System.out.println( | |||||
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); | |||||
} | |||||
} | |||||
System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); | |||||
try { | |||||
downloadFileFromURL(url, outputFile); | |||||
System.out.println("Done"); | |||||
System.exit(0); | |||||
} catch (Throwable e) { | |||||
System.out.println("- Error downloading"); | |||||
e.printStackTrace(); | |||||
System.exit(1); | |||||
} | |||||
} | |||||
private static void downloadFileFromURL(String urlString, File destination) throws Exception { | |||||
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { | |||||
String username = System.getenv("MVNW_USERNAME"); | |||||
char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); | |||||
Authenticator.setDefault(new Authenticator() { | |||||
@Override | |||||
protected PasswordAuthentication getPasswordAuthentication() { | |||||
return new PasswordAuthentication(username, password); | |||||
} | |||||
}); | |||||
} | |||||
URL website = new URL(urlString); | |||||
ReadableByteChannel rbc; | |||||
rbc = Channels.newChannel(website.openStream()); | |||||
FileOutputStream fos = new FileOutputStream(destination); | |||||
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); | |||||
fos.close(); | |||||
rbc.close(); | |||||
} | |||||
} |
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip | |||||
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar |
#!/bin/sh | |||||
# ---------------------------------------------------------------------------- | |||||
# Licensed to the Apache Software Foundation (ASF) under one | |||||
# or more contributor license agreements. See the NOTICE file | |||||
# distributed with this work for additional information | |||||
# regarding copyright ownership. The ASF licenses this file | |||||
# to you under the Apache License, Version 2.0 (the | |||||
# "License"); you may not use this file except in compliance | |||||
# with the License. You may obtain a copy of the License at | |||||
# | |||||
# https://www.apache.org/licenses/LICENSE-2.0 | |||||
# | |||||
# Unless required by applicable law or agreed to in writing, | |||||
# software distributed under the License is distributed on an | |||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |||||
# KIND, either express or implied. See the License for the | |||||
# specific language governing permissions and limitations | |||||
# under the License. | |||||
# ---------------------------------------------------------------------------- | |||||
# ---------------------------------------------------------------------------- | |||||
# Maven Start Up Batch script | |||||
# | |||||
# Required ENV vars: | |||||
# ------------------ | |||||
# JAVA_HOME - location of a JDK home dir | |||||
# | |||||
# Optional ENV vars | |||||
# ----------------- | |||||
# M2_HOME - location of maven2's installed home dir | |||||
# MAVEN_OPTS - parameters passed to the Java VM when running Maven | |||||
# e.g. to debug Maven itself, use | |||||
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 | |||||
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files | |||||
# ---------------------------------------------------------------------------- | |||||
if [ -z "$MAVEN_SKIP_RC" ] ; then | |||||
if [ -f /etc/mavenrc ] ; then | |||||
. /etc/mavenrc | |||||
fi | |||||
if [ -f "$HOME/.mavenrc" ] ; then | |||||
. "$HOME/.mavenrc" | |||||
fi | |||||
fi | |||||
# OS specific support. $var _must_ be set to either true or false. | |||||
cygwin=false; | |||||
darwin=false; | |||||
mingw=false | |||||
case "`uname`" in | |||||
CYGWIN*) cygwin=true ;; | |||||
MINGW*) mingw=true;; | |||||
Darwin*) darwin=true | |||||
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home | |||||
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html | |||||
if [ -z "$JAVA_HOME" ]; then | |||||
if [ -x "/usr/libexec/java_home" ]; then | |||||
export JAVA_HOME="`/usr/libexec/java_home`" | |||||
else | |||||
export JAVA_HOME="/Library/Java/Home" | |||||
fi | |||||
fi | |||||
;; | |||||
esac | |||||
if [ -z "$JAVA_HOME" ] ; then | |||||
if [ -r /etc/gentoo-release ] ; then | |||||
JAVA_HOME=`java-config --jre-home` | |||||
fi | |||||
fi | |||||
if [ -z "$M2_HOME" ] ; then | |||||
## resolve links - $0 may be a link to maven's home | |||||
PRG="$0" | |||||
# need this for relative symlinks | |||||
while [ -h "$PRG" ] ; do | |||||
ls=`ls -ld "$PRG"` | |||||
link=`expr "$ls" : '.*-> \(.*\)$'` | |||||
if expr "$link" : '/.*' > /dev/null; then | |||||
PRG="$link" | |||||
else | |||||
PRG="`dirname "$PRG"`/$link" | |||||
fi | |||||
done | |||||
saveddir=`pwd` | |||||
M2_HOME=`dirname "$PRG"`/.. | |||||
# make it fully qualified | |||||
M2_HOME=`cd "$M2_HOME" && pwd` | |||||
cd "$saveddir" | |||||
# echo Using m2 at $M2_HOME | |||||
fi | |||||
# For Cygwin, ensure paths are in UNIX format before anything is touched | |||||
if $cygwin ; then | |||||
[ -n "$M2_HOME" ] && | |||||
M2_HOME=`cygpath --unix "$M2_HOME"` | |||||
[ -n "$JAVA_HOME" ] && | |||||
JAVA_HOME=`cygpath --unix "$JAVA_HOME"` | |||||
[ -n "$CLASSPATH" ] && | |||||
CLASSPATH=`cygpath --path --unix "$CLASSPATH"` | |||||
fi | |||||
# For Mingw, ensure paths are in UNIX format before anything is touched | |||||
if $mingw ; then | |||||
[ -n "$M2_HOME" ] && | |||||
M2_HOME="`(cd "$M2_HOME"; pwd)`" | |||||
[ -n "$JAVA_HOME" ] && | |||||
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" | |||||
fi | |||||
if [ -z "$JAVA_HOME" ]; then | |||||
javaExecutable="`which javac`" | |||||
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then | |||||
# readlink(1) is not available as standard on Solaris 10. | |||||
readLink=`which readlink` | |||||
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then | |||||
if $darwin ; then | |||||
javaHome="`dirname \"$javaExecutable\"`" | |||||
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" | |||||
else | |||||
javaExecutable="`readlink -f \"$javaExecutable\"`" | |||||
fi | |||||
javaHome="`dirname \"$javaExecutable\"`" | |||||
javaHome=`expr "$javaHome" : '\(.*\)/bin'` | |||||
JAVA_HOME="$javaHome" | |||||
export JAVA_HOME | |||||
fi | |||||
fi | |||||
fi | |||||
if [ -z "$JAVACMD" ] ; then | |||||
if [ -n "$JAVA_HOME" ] ; then | |||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then | |||||
# IBM's JDK on AIX uses strange locations for the executables | |||||
JAVACMD="$JAVA_HOME/jre/sh/java" | |||||
else | |||||
JAVACMD="$JAVA_HOME/bin/java" | |||||
fi | |||||
else | |||||
JAVACMD="`which java`" | |||||
fi | |||||
fi | |||||
if [ ! -x "$JAVACMD" ] ; then | |||||
echo "Error: JAVA_HOME is not defined correctly." >&2 | |||||
echo " We cannot execute $JAVACMD" >&2 | |||||
exit 1 | |||||
fi | |||||
if [ -z "$JAVA_HOME" ] ; then | |||||
echo "Warning: JAVA_HOME environment variable is not set." | |||||
fi | |||||
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher | |||||
# traverses directory structure from process work directory to filesystem root | |||||
# first directory with .mvn subdirectory is considered project base directory | |||||
find_maven_basedir() { | |||||
if [ -z "$1" ] | |||||
then | |||||
echo "Path not specified to find_maven_basedir" | |||||
return 1 | |||||
fi | |||||
basedir="$1" | |||||
wdir="$1" | |||||
while [ "$wdir" != '/' ] ; do | |||||
if [ -d "$wdir"/.mvn ] ; then | |||||
basedir=$wdir | |||||
break | |||||
fi | |||||
# workaround for JBEAP-8937 (on Solaris 10/Sparc) | |||||
if [ -d "${wdir}" ]; then | |||||
wdir=`cd "$wdir/.."; pwd` | |||||
fi | |||||
# end of workaround | |||||
done | |||||
echo "${basedir}" | |||||
} | |||||
# concatenates all lines of a file | |||||
concat_lines() { | |||||
if [ -f "$1" ]; then | |||||
echo "$(tr -s '\n' ' ' < "$1")" | |||||
fi | |||||
} | |||||
BASE_DIR=`find_maven_basedir "$(pwd)"` | |||||
if [ -z "$BASE_DIR" ]; then | |||||
exit 1; | |||||
fi | |||||
########################################################################################## | |||||
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central | |||||
# This allows using the maven wrapper in projects that prohibit checking in binary data. | |||||
########################################################################################## | |||||
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then | |||||
if [ "$MVNW_VERBOSE" = true ]; then | |||||
echo "Found .mvn/wrapper/maven-wrapper.jar" | |||||
fi | |||||
else | |||||
if [ "$MVNW_VERBOSE" = true ]; then | |||||
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." | |||||
fi | |||||
if [ -n "$MVNW_REPOURL" ]; then | |||||
jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" | |||||
else | |||||
jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" | |||||
fi | |||||
while IFS="=" read key value; do | |||||
case "$key" in (wrapperUrl) jarUrl="$value"; break ;; | |||||
esac | |||||
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" | |||||
if [ "$MVNW_VERBOSE" = true ]; then | |||||
echo "Downloading from: $jarUrl" | |||||
fi | |||||
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" | |||||
if $cygwin; then | |||||
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` | |||||
fi | |||||
if command -v wget > /dev/null; then | |||||
if [ "$MVNW_VERBOSE" = true ]; then | |||||
echo "Found wget ... using wget" | |||||
fi | |||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then | |||||
wget "$jarUrl" -O "$wrapperJarPath" | |||||
else | |||||
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" | |||||
fi | |||||
elif command -v curl > /dev/null; then | |||||
if [ "$MVNW_VERBOSE" = true ]; then | |||||
echo "Found curl ... using curl" | |||||
fi | |||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then | |||||
curl -o "$wrapperJarPath" "$jarUrl" -f | |||||
else | |||||
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f | |||||
fi | |||||
else | |||||
if [ "$MVNW_VERBOSE" = true ]; then | |||||
echo "Falling back to using Java to download" | |||||
fi | |||||
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" | |||||
# For Cygwin, switch paths to Windows format before running javac | |||||
if $cygwin; then | |||||
javaClass=`cygpath --path --windows "$javaClass"` | |||||
fi | |||||
if [ -e "$javaClass" ]; then | |||||
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then | |||||
if [ "$MVNW_VERBOSE" = true ]; then | |||||
echo " - Compiling MavenWrapperDownloader.java ..." | |||||
fi | |||||
# Compiling the Java class | |||||
("$JAVA_HOME/bin/javac" "$javaClass") | |||||
fi | |||||
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then | |||||
# Running the downloader | |||||
if [ "$MVNW_VERBOSE" = true ]; then | |||||
echo " - Running MavenWrapperDownloader.java ..." | |||||
fi | |||||
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") | |||||
fi | |||||
fi | |||||
fi | |||||
fi | |||||
########################################################################################## | |||||
# End of extension | |||||
########################################################################################## | |||||
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} | |||||
if [ "$MVNW_VERBOSE" = true ]; then | |||||
echo $MAVEN_PROJECTBASEDIR | |||||
fi | |||||
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" | |||||
# For Cygwin, switch paths to Windows format before running java | |||||
if $cygwin; then | |||||
[ -n "$M2_HOME" ] && | |||||
M2_HOME=`cygpath --path --windows "$M2_HOME"` | |||||
[ -n "$JAVA_HOME" ] && | |||||
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` | |||||
[ -n "$CLASSPATH" ] && | |||||
CLASSPATH=`cygpath --path --windows "$CLASSPATH"` | |||||
[ -n "$MAVEN_PROJECTBASEDIR" ] && | |||||
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` | |||||
fi | |||||
# Provide a "standardized" way to retrieve the CLI args that will | |||||
# work with both Windows and non-Windows executions. | |||||
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" | |||||
export MAVEN_CMD_LINE_ARGS | |||||
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain | |||||
exec "$JAVACMD" \ | |||||
$MAVEN_OPTS \ | |||||
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ | |||||
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ | |||||
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" |
@REM ---------------------------------------------------------------------------- | |||||
@REM Licensed to the Apache Software Foundation (ASF) under one | |||||
@REM or more contributor license agreements. See the NOTICE file | |||||
@REM distributed with this work for additional information | |||||
@REM regarding copyright ownership. The ASF licenses this file | |||||
@REM to you under the Apache License, Version 2.0 (the | |||||
@REM "License"); you may not use this file except in compliance | |||||
@REM with the License. You may obtain a copy of the License at | |||||
@REM | |||||
@REM https://www.apache.org/licenses/LICENSE-2.0 | |||||
@REM | |||||
@REM Unless required by applicable law or agreed to in writing, | |||||
@REM software distributed under the License is distributed on an | |||||
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |||||
@REM KIND, either express or implied. See the License for the | |||||
@REM specific language governing permissions and limitations | |||||
@REM under the License. | |||||
@REM ---------------------------------------------------------------------------- | |||||
@REM ---------------------------------------------------------------------------- | |||||
@REM Maven Start Up Batch script | |||||
@REM | |||||
@REM Required ENV vars: | |||||
@REM JAVA_HOME - location of a JDK home dir | |||||
@REM | |||||
@REM Optional ENV vars | |||||
@REM M2_HOME - location of maven2's installed home dir | |||||
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands | |||||
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending | |||||
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven | |||||
@REM e.g. to debug Maven itself, use | |||||
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 | |||||
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files | |||||
@REM ---------------------------------------------------------------------------- | |||||
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' | |||||
@echo off | |||||
@REM set title of command window | |||||
title %0 | |||||
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' | |||||
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% | |||||
@REM set %HOME% to equivalent of $HOME | |||||
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") | |||||
@REM Execute a user defined script before this one | |||||
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre | |||||
@REM check for pre script, once with legacy .bat ending and once with .cmd ending | |||||
if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" | |||||
if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" | |||||
:skipRcPre | |||||
@setlocal | |||||
set ERROR_CODE=0 | |||||
@REM To isolate internal variables from possible post scripts, we use another setlocal | |||||
@setlocal | |||||
@REM ==== START VALIDATION ==== | |||||
if not "%JAVA_HOME%" == "" goto OkJHome | |||||
echo. | |||||
echo Error: JAVA_HOME not found in your environment. >&2 | |||||
echo Please set the JAVA_HOME variable in your environment to match the >&2 | |||||
echo location of your Java installation. >&2 | |||||
echo. | |||||
goto error | |||||
:OkJHome | |||||
if exist "%JAVA_HOME%\bin\java.exe" goto init | |||||
echo. | |||||
echo Error: JAVA_HOME is set to an invalid directory. >&2 | |||||
echo JAVA_HOME = "%JAVA_HOME%" >&2 | |||||
echo Please set the JAVA_HOME variable in your environment to match the >&2 | |||||
echo location of your Java installation. >&2 | |||||
echo. | |||||
goto error | |||||
@REM ==== END VALIDATION ==== | |||||
:init | |||||
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". | |||||
@REM Fallback to current working directory if not found. | |||||
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% | |||||
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir | |||||
set EXEC_DIR=%CD% | |||||
set WDIR=%EXEC_DIR% | |||||
:findBaseDir | |||||
IF EXIST "%WDIR%"\.mvn goto baseDirFound | |||||
cd .. | |||||
IF "%WDIR%"=="%CD%" goto baseDirNotFound | |||||
set WDIR=%CD% | |||||
goto findBaseDir | |||||
:baseDirFound | |||||
set MAVEN_PROJECTBASEDIR=%WDIR% | |||||
cd "%EXEC_DIR%" | |||||
goto endDetectBaseDir | |||||
:baseDirNotFound | |||||
set MAVEN_PROJECTBASEDIR=%EXEC_DIR% | |||||
cd "%EXEC_DIR%" | |||||
:endDetectBaseDir | |||||
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig | |||||
@setlocal EnableExtensions EnableDelayedExpansion | |||||
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a | |||||
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% | |||||
:endReadAdditionalConfig | |||||
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" | |||||
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" | |||||
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain | |||||
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" | |||||
FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( | |||||
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B | |||||
) | |||||
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central | |||||
@REM This allows using the maven wrapper in projects that prohibit checking in binary data. | |||||
if exist %WRAPPER_JAR% ( | |||||
if "%MVNW_VERBOSE%" == "true" ( | |||||
echo Found %WRAPPER_JAR% | |||||
) | |||||
) else ( | |||||
if not "%MVNW_REPOURL%" == "" ( | |||||
SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" | |||||
) | |||||
if "%MVNW_VERBOSE%" == "true" ( | |||||
echo Couldn't find %WRAPPER_JAR%, downloading it ... | |||||
echo Downloading from: %DOWNLOAD_URL% | |||||
) | |||||
powershell -Command "&{"^ | |||||
"$webclient = new-object System.Net.WebClient;"^ | |||||
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ | |||||
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ | |||||
"}"^ | |||||
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ | |||||
"}" | |||||
if "%MVNW_VERBOSE%" == "true" ( | |||||
echo Finished downloading %WRAPPER_JAR% | |||||
) | |||||
) | |||||
@REM End of extension | |||||
@REM Provide a "standardized" way to retrieve the CLI args that will | |||||
@REM work with both Windows and non-Windows executions. | |||||
set MAVEN_CMD_LINE_ARGS=%* | |||||
%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* | |||||
if ERRORLEVEL 1 goto error | |||||
goto end | |||||
:error | |||||
set ERROR_CODE=1 | |||||
:end | |||||
@endlocal & set ERROR_CODE=%ERROR_CODE% | |||||
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost | |||||
@REM check for post script, once with legacy .bat ending and once with .cmd ending | |||||
if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" | |||||
if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" | |||||
:skipRcPost | |||||
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' | |||||
if "%MAVEN_BATCH_PAUSE%" == "on" pause | |||||
if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% | |||||
exit /B %ERROR_CODE% |
<?xml version="1.0" encoding="UTF-8"?> | |||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||||
<modelVersion>4.0.0</modelVersion> | |||||
<parent> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-parent</artifactId> | |||||
<version>2.1.2.RELEASE</version> | |||||
</parent> | |||||
<groupId>com.xdf</groupId> | |||||
<artifactId>creative</artifactId> | |||||
<version>0.0.1-SNAPSHOT</version> | |||||
<name>creative</name> | |||||
<description>wenchuangban project for Spring Boot</description> | |||||
<properties> | |||||
<java.version>1.8</java.version> | |||||
</properties> | |||||
<dependencies> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-web</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-test</artifactId> | |||||
<scope>test</scope> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-aop</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-tomcat</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-jdbc</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-json</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-validation</artifactId> | |||||
</dependency> | |||||
<!-- 获取配置文件内容 注入实体get方法--> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-configuration-processor</artifactId> | |||||
<optional>true</optional> | |||||
</dependency> | |||||
<!-- alibaba start --> | |||||
<dependency> | |||||
<groupId>com.alibaba</groupId> | |||||
<artifactId>druid-spring-boot-starter</artifactId> | |||||
<version>1.1.20</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.alibaba</groupId> | |||||
<artifactId>fastjson</artifactId> | |||||
<version>1.2.62</version> | |||||
</dependency> | |||||
<!-- swagger start 可通过注解生成接口文档,包括接口名、请求方法、参数、返回信息等等--> | |||||
<dependency> | |||||
<groupId>io.springfox</groupId> | |||||
<artifactId>springfox-swagger2</artifactId> | |||||
<version>2.9.2</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>io.springfox</groupId> | |||||
<artifactId>springfox-swagger-ui</artifactId> | |||||
<version>2.9.2</version> | |||||
</dependency> | |||||
<!-- apache commons start --> | |||||
<dependency> | |||||
<groupId>org.apache.commons</groupId> | |||||
<artifactId>commons-lang3</artifactId> | |||||
<version>3.9</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.commons</groupId> | |||||
<artifactId>commons-collections4</artifactId> | |||||
<version>4.4</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>commons-net</groupId> | |||||
<artifactId>commons-net</artifactId> | |||||
<version>3.6</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.commons</groupId> | |||||
<artifactId>commons-pool2</artifactId> | |||||
<version>2.7.0</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>commons-io</groupId> | |||||
<artifactId>commons-io</artifactId> | |||||
<version>2.6</version> | |||||
</dependency> | |||||
<!-- JWT+SHIRO--> | |||||
<dependency> | |||||
<groupId>com.auth0</groupId> | |||||
<artifactId>java-jwt</artifactId> | |||||
<version>3.8.3</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.shiro</groupId> | |||||
<artifactId>shiro-spring</artifactId> | |||||
<version>1.4.0</version> | |||||
</dependency> | |||||
<!-- mybatis-plus begin --> | |||||
<dependency> | |||||
<groupId>com.baomidou</groupId> | |||||
<artifactId>mybatis-plus-boot-starter</artifactId> | |||||
<version>3.1.0</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.velocity</groupId> | |||||
<artifactId>velocity</artifactId> | |||||
<version>1.7</version> | |||||
<scope>provided</scope> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>mysql</groupId> | |||||
<artifactId>mysql-connector-java</artifactId> | |||||
<version>5.1.47</version> | |||||
</dependency> | |||||
<!-- 对象属性复制 --> | |||||
<dependency> | |||||
<groupId>org.mapstruct</groupId> | |||||
<artifactId>mapstruct</artifactId> | |||||
<version>1.3.0.Final</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.mapstruct</groupId> | |||||
<artifactId>mapstruct-processor</artifactId> | |||||
<version>1.3.0.Final</version> | |||||
<scope>provided</scope> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.projectlombok</groupId> | |||||
<artifactId>lombok</artifactId> | |||||
<optional>true</optional> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-test</artifactId> | |||||
<scope>test</scope> | |||||
<exclusions> | |||||
<exclusion> | |||||
<groupId>org.junit.vintage</groupId> | |||||
<artifactId>junit-vintage-engine</artifactId> | |||||
</exclusion> | |||||
</exclusions> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>junit</groupId> | |||||
<artifactId>junit</artifactId> | |||||
<version>4.12</version> | |||||
<scope>test</scope> | |||||
</dependency> | |||||
<!-- 分页支持pageHelper --> | |||||
</dependencies> | |||||
<build> | |||||
<finalName>cultural_creative_server</finalName> | |||||
<plugins> | |||||
<plugin> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-maven-plugin</artifactId> | |||||
</plugin> | |||||
<plugin> | |||||
<groupId>org.apache.maven.plugins</groupId> | |||||
<artifactId>maven-resources-plugin</artifactId> | |||||
<version>3.0.2</version> | |||||
<configuration> | |||||
<encoding>UTF-8</encoding> | |||||
</configuration> | |||||
</plugin> | |||||
</plugins> | |||||
</build> | |||||
</project> |
package com.xdf.creative; | |||||
import org.mybatis.spring.annotation.MapperScan; | |||||
import org.springframework.boot.SpringApplication; | |||||
import org.springframework.boot.autoconfigure.SpringBootApplication; | |||||
import org.springframework.boot.context.properties.EnableConfigurationProperties; | |||||
import org.springframework.boot.web.servlet.ServletComponentScan; | |||||
import org.springframework.context.annotation.ComponentScan; | |||||
import org.springframework.transaction.annotation.EnableTransactionManagement; | |||||
import springfox.documentation.swagger2.annotations.EnableSwagger2; | |||||
@EnableConfigurationProperties | |||||
@EnableSwagger2 | |||||
@ComponentScan(value = "com.xdf.**.**") | |||||
@MapperScan({"com.xdf.creative.**.mapper"}) | |||||
@ServletComponentScan | |||||
@EnableTransactionManagement | |||||
@SpringBootApplication | |||||
public class CreativeApplication { | |||||
public static void main(String[] args) { | |||||
SpringApplication.run(CreativeApplication.class, args); | |||||
} | |||||
} |
package com.xdf.creative.base.controller; | |||||
import com.baomidou.mybatisplus.extension.api.ApiController; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.web.context.request.RequestContextHolder; | |||||
import org.springframework.web.context.request.ServletRequestAttributes; | |||||
import javax.servlet.http.HttpServletRequest; | |||||
import javax.servlet.http.HttpServletResponse; | |||||
/** | |||||
* @author DeanYe | |||||
* @date 2018-11-08 | |||||
*/ | |||||
@Slf4j | |||||
public abstract class BaseController extends ApiController { | |||||
/** | |||||
* 获取当前请求 | |||||
* | |||||
* @return request | |||||
*/ | |||||
public HttpServletRequest getRequest() { | |||||
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); | |||||
} | |||||
/** | |||||
* 获取当前请求 | |||||
* | |||||
* @return response | |||||
*/ | |||||
public HttpServletResponse getResponse() { | |||||
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); | |||||
} | |||||
} |
package com.xdf.creative.base.entity; | |||||
import io.swagger.annotations.ApiModel; | |||||
import java.io.Serializable; | |||||
/** | |||||
* 实体父类 | |||||
* | |||||
* @author DeanYe | |||||
* @date 2018-11-08 | |||||
*/ | |||||
@ApiModel("BaseEntity") | |||||
public abstract class BaseEntity implements Serializable { | |||||
} |
package com.xdf.creative.base.params; | |||||
import io.swagger.annotations.ApiModel; | |||||
import lombok.Data; | |||||
import javax.validation.constraints.NotNull; | |||||
import java.io.Serializable; | |||||
/** | |||||
* @author DeanYe | |||||
* @date 2018-11-08 | |||||
*/ | |||||
@Data | |||||
@ApiModel("ID参数") | |||||
public class IdParam implements Serializable { | |||||
private static final long serialVersionUID = -5353973980674510450L; | |||||
@NotNull(message = "ID不能为空") | |||||
private Long id; | |||||
} |
package com.xdf.creative.base.params; | |||||
import com.xdf.creative.constant.CommonConstant; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import java.io.Serializable; | |||||
/** | |||||
* 查询参数 | |||||
*/ | |||||
@Data | |||||
@ApiModel("查询参数对象") | |||||
public abstract class QueryParam implements Serializable { | |||||
private static final long serialVersionUID = -3263921252635611410L; | |||||
@ApiModelProperty(value = "页码,默认为1") | |||||
private Integer pageNum = CommonConstant.DEFAULT_PAGE_INDEX; | |||||
@ApiModelProperty(value = "页大小,默认为10") | |||||
private Integer pageSize = CommonConstant.DEFAULT_PAGE_SIZE; | |||||
// @ApiModelProperty(value = "排序字段") | |||||
// private String[] order = {"create_time"}; | |||||
// @ApiModelProperty(value = "排序类型默认降序 DESC/ASC") | |||||
// private boolean[] doAsc = {CommonConstant.DEFAULT_PAGE_ORDER_TYPE}; | |||||
@ApiModelProperty(value = "排序字段") | |||||
private String[] order = {}; | |||||
@ApiModelProperty(value = "排序类型默认降序 DESC/ASC") | |||||
private boolean[] doAsc = {}; | |||||
} |
package com.xdf.creative.base.params.creative; | |||||
import com.baomidou.mybatisplus.annotation.IdType; | |||||
import com.baomidou.mybatisplus.annotation.TableId; | |||||
import com.xdf.creative.base.params.QueryParam; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import lombok.EqualsAndHashCode; | |||||
import lombok.experimental.Accessors; | |||||
import javax.validation.constraints.NotNull; | |||||
import java.util.Date; | |||||
/** | |||||
* <p> | |||||
* 操作日志 查询参数对象 | |||||
* </p> | |||||
* | |||||
* @author lgw | |||||
* @date 2020-03-02 | |||||
*/ | |||||
@Data | |||||
@Accessors(chain = true) | |||||
@EqualsAndHashCode(callSuper = true) | |||||
@ApiModel(value = "SysOperationLogQueryParam对象", description = "操作日志查询参数") | |||||
public class SysOperationLogQueryParam extends QueryParam { | |||||
private static final long serialVersionUID = 1L; | |||||
@ApiModelProperty(value = "用户操作日志主键") | |||||
@TableId(value = "id", type = IdType.AUTO) | |||||
@NotNull(message = "用户操作日志主键不能为空") | |||||
private Long id; | |||||
@ApiModelProperty(value = "日志名称") | |||||
private String logName; | |||||
@ApiModelProperty(value = "用户id") | |||||
private Long userId; | |||||
@ApiModelProperty(value = "api名称") | |||||
private String api; | |||||
@ApiModelProperty(value = "方法名称") | |||||
private String method; | |||||
@ApiModelProperty(value = "创建时间") | |||||
private Date createTime; | |||||
@ApiModelProperty(value = "是否执行成功(0失败1成功)") | |||||
private Integer succeed; | |||||
@ApiModelProperty(value = "具体消息备注") | |||||
private String detail; | |||||
} |
package com.xdf.creative.base.params.creative; | |||||
import com.baomidou.mybatisplus.annotation.IdType; | |||||
import com.baomidou.mybatisplus.annotation.TableId; | |||||
import com.xdf.creative.base.params.QueryParam; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import lombok.EqualsAndHashCode; | |||||
import lombok.experimental.Accessors; | |||||
/** | |||||
* <p> | |||||
* 全国行政区域[sys_region] 查询参数对象 | |||||
* </p> | |||||
* | |||||
* @author DeanYe | |||||
* @date 2019-11-06 | |||||
*/ | |||||
@Data | |||||
@Accessors(chain = true) | |||||
@EqualsAndHashCode(callSuper = true) | |||||
@ApiModel(value = "SysRegionQueryParam对象", description = "全国行政区域[sys_region]查询参数") | |||||
public class SysRegionQueryParam extends QueryParam { | |||||
private static final long serialVersionUID = 1L; | |||||
@ApiModelProperty(value = "主键ID") | |||||
@TableId(value = "id", type = IdType.AUTO) | |||||
private Long id; | |||||
@ApiModelProperty(value = "行政区代码") | |||||
private String regionId; | |||||
@ApiModelProperty(value = "行政区域名称") | |||||
private String regionName; | |||||
@ApiModelProperty(value = "上级行政区域") | |||||
private String parRegionId; | |||||
@ApiModelProperty(value = "值:0、草稿 1、提交") | |||||
private Integer state; | |||||
private String descript; | |||||
} |
package com.xdf.creative.base.service; | |||||
import com.baomidou.mybatisplus.extension.service.IService; | |||||
/** | |||||
* | |||||
* @param <T> | |||||
*/ | |||||
public interface BaseService<T> extends IService<T> { | |||||
// Long getUserId(); | |||||
// | |||||
// Long getOrganizeId(); | |||||
// | |||||
// Integer getOrganizeType(); | |||||
// | |||||
// String getRegionId(); | |||||
// | |||||
// boolean verifyUserPermission(Long userId); | |||||
// | |||||
// boolean verifyOrganizePermission(Long organizeId); | |||||
} |
package com.xdf.creative.base.service.impl; | |||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | |||||
import com.xdf.creative.base.params.QueryParam; | |||||
import com.xdf.creative.base.service.BaseService; | |||||
import com.xdf.creative.util.CollectionTools; | |||||
/** | |||||
* | |||||
* @param <M> | |||||
* @param <T> | |||||
*/ | |||||
public abstract class BaseServiceImpl<M extends BaseMapper<T>, T> extends ServiceImpl<M, T> implements BaseService<T> { | |||||
// @Autowired | |||||
// private JwtTokenUtil jwtTokenUtil; | |||||
// @Autowired | |||||
// private JwtUtil jwtUtil; | |||||
/** | |||||
* 分页排序设置 | |||||
* 默认按创建时间Desc降序排列 | |||||
* | |||||
* @param queryParam | |||||
* @return | |||||
*/ | |||||
protected Page setPageParam(QueryParam queryParam) { | |||||
Page page = new Page(); | |||||
page.setCurrent(queryParam.getPageNum()); | |||||
page.setSize(queryParam.getPageSize()); | |||||
if (CollectionTools.isNoEmptyArr(queryParam.getOrder())) { | |||||
String[] ascArray = new String[queryParam.getOrder().length]; | |||||
String[] descArray = new String[queryParam.getOrder().length]; | |||||
int ascIndex = 0; | |||||
int descIndex = 0; | |||||
for (int i = 0; i < queryParam.getOrder().length; i++) { | |||||
boolean asc = false; | |||||
if (queryParam.getOrder().length == queryParam.getDoAsc().length) { | |||||
asc = queryParam.getDoAsc()[i]; | |||||
} else if (1 == queryParam.getDoAsc().length) { | |||||
asc = queryParam.getDoAsc()[0]; | |||||
} | |||||
if (asc) { | |||||
ascArray[ascIndex] = queryParam.getOrder()[i]; | |||||
ascIndex++; | |||||
} else { | |||||
descArray[descIndex] = queryParam.getOrder()[i]; | |||||
descIndex++; | |||||
} | |||||
} | |||||
if (descArray.length > 0) { | |||||
page.setDesc(descArray); | |||||
} | |||||
if (ascArray.length > 0) { | |||||
page.setAsc(ascArray); | |||||
} | |||||
} | |||||
return page; | |||||
} | |||||
protected Page setPage(QueryParam queryParam) { | |||||
Page page = new Page<>(queryParam.getPageNum(), queryParam.getPageSize(), true); | |||||
return page; | |||||
} | |||||
// @Override | |||||
// public Long getUserId() { | |||||
// String token = jwtTokenUtil.getToken(); | |||||
// return jwtUtil.getUserId(token); | |||||
// } | |||||
// | |||||
// @Override | |||||
// public Integer getOrganizeType() { | |||||
// String token = jwtTokenUtil.getToken(); | |||||
// return jwtUtil.getOrganizeType(token); | |||||
// } | |||||
// | |||||
// @Override | |||||
// public Long getOrganizeId() { | |||||
// String token = jwtTokenUtil.getToken(); | |||||
// return jwtUtil.getOrganizeId(token); | |||||
// } | |||||
// | |||||
// @Override | |||||
// public String getRegionId() { | |||||
// String token = jwtTokenUtil.getToken(); | |||||
// return jwtUtil.getRegionId(token); | |||||
// } | |||||
// | |||||
// @Override | |||||
// public boolean verifyUserPermission(Long userId) { | |||||
// boolean passageFlag = false; | |||||
// if (getUserId() == userId || (getUserId() == 1 && getOrganizeId() == 1)) { | |||||
// passageFlag = true; | |||||
// } | |||||
// return passageFlag; | |||||
// } | |||||
// | |||||
// @Override | |||||
// public boolean verifyOrganizePermission(Long organizeId) { | |||||
// boolean passageFlag = false; | |||||
// if (getOrganizeId() == organizeId || (getUserId() == 1 && getOrganizeId() == 1)) { | |||||
// passageFlag = true; | |||||
// } | |||||
// return passageFlag; | |||||
// } | |||||
} |
package com.xdf.creative.base.vo; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
/** | |||||
* <p> | |||||
* 公共ID-NAME-VO对象 | |||||
* </p> | |||||
* | |||||
* @author DeanYe | |||||
* @since 2018-11-08 | |||||
*/ | |||||
@ApiModel("ID-NAME-VO") | |||||
@Data | |||||
public class CommonIdName { | |||||
@ApiModelProperty("id") | |||||
private String id; | |||||
@ApiModelProperty("名称") | |||||
private String name; | |||||
} |
package com.xdf.creative.base.vo.creative; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import lombok.experimental.Accessors; | |||||
import java.io.Serializable; | |||||
import java.util.Date; | |||||
/** | |||||
* <p> | |||||
* 操作日志 查询结果对象 | |||||
* </p> | |||||
* | |||||
* @author lgw | |||||
* @date 2020-03-02 | |||||
*/ | |||||
@Data | |||||
@Accessors(chain = true) | |||||
@ApiModel(value = "SysOperationLogQueryVo对象", description = "操作日志查询参数") | |||||
public class SysOperationLogQueryVo implements Serializable { | |||||
private static final long serialVersionUID = 1L; | |||||
@ApiModelProperty(value = "用户操作日志主键") | |||||
private Long id; | |||||
@ApiModelProperty(value = "日志名称") | |||||
private String logName; | |||||
@ApiModelProperty(value = "用户id") | |||||
private Long userId; | |||||
@ApiModelProperty(value = "api名称") | |||||
private String api; | |||||
@ApiModelProperty(value = "方法名称") | |||||
private String method; | |||||
@ApiModelProperty(value = "创建时间") | |||||
private Date createTime; | |||||
@ApiModelProperty(value = "是否执行成功(0失败1成功)") | |||||
private Integer succeed; | |||||
@ApiModelProperty(value = "具体消息备注") | |||||
private String detail; | |||||
} |
package com.xdf.creative.base.vo.creative; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import lombok.experimental.Accessors; | |||||
import java.io.Serializable; | |||||
/** | |||||
* <p> | |||||
* 全国行政区域[sys_region] 查询结果对象 | |||||
* </p> | |||||
* | |||||
* @author DeanYe | |||||
* @date 2019-11-06 | |||||
*/ | |||||
@Data | |||||
@Accessors(chain = true) | |||||
@ApiModel(value = "SysRegionQueryVo对象", description = "全国行政区域[sys_region]查询参数") | |||||
public class SysRegionQueryVo implements Serializable { | |||||
private static final long serialVersionUID = 1L; | |||||
@ApiModelProperty(value = "主键ID") | |||||
private Long id; | |||||
@ApiModelProperty(value = "行政区代码") | |||||
private String regionId; | |||||
@ApiModelProperty(value = "行政区域名称") | |||||
private String regionName; | |||||
@ApiModelProperty(value = "上级行政区域") | |||||
private String parRegionId; | |||||
@ApiModelProperty(value = "值:0、草稿 1、提交") | |||||
private Integer state; | |||||
private String descript; | |||||
} |
package com.xdf.creative.config; | |||||
import org.springframework.context.annotation.Configuration; | |||||
import org.springframework.web.servlet.config.annotation.CorsRegistry; | |||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | |||||
@Configuration | |||||
public class CorsConfig implements WebMvcConfigurer { | |||||
@Override | |||||
public void addCorsMappings(CorsRegistry registry) { | |||||
registry.addMapping("/**") | |||||
.allowedOrigins("*") | |||||
.allowCredentials(true) | |||||
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") | |||||
.maxAge(3600); | |||||
} | |||||
} |
package com.xdf.creative.config; | |||||
import com.baomidou.mybatisplus.core.injector.ISqlInjector; | |||||
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector; | |||||
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; | |||||
import org.springframework.context.annotation.Bean; | |||||
import org.springframework.context.annotation.Configuration; | |||||
@Configuration | |||||
public class MybatisPlusConfig { | |||||
/** | |||||
* 配置分页 | |||||
*/ | |||||
@Bean | |||||
public PaginationInterceptor paginationInterceptor() { | |||||
return new PaginationInterceptor(); | |||||
} | |||||
@Bean | |||||
public ISqlInjector sqlInjector() { | |||||
return new LogicSqlInjector(); | |||||
} | |||||
} |
package com.xdf.creative.constant; | |||||
/** | |||||
* 常量 | |||||
* | |||||
*/ | |||||
public interface CommonConstant { | |||||
/** | |||||
* 默认页码为1 | |||||
*/ | |||||
Integer DEFAULT_PAGE_INDEX = 1; | |||||
/** | |||||
* 默认页大小为10 | |||||
*/ | |||||
Integer DEFAULT_PAGE_SIZE = 10; | |||||
/** | |||||
* 默认降序排序 | |||||
*/ | |||||
boolean DEFAULT_PAGE_ORDER_TYPE = false; | |||||
/** | |||||
* 登录用户 | |||||
*/ | |||||
String LOGIN_SYS_USER = "loginSysUser"; | |||||
/** | |||||
* JWT用户名 | |||||
*/ | |||||
String JWT_USERID = "userId"; | |||||
/** | |||||
* 登录类型 | |||||
*/ | |||||
String JWT_LOGINTYPE = "loginType"; | |||||
/** | |||||
* 登录组织id | |||||
*/ | |||||
String JWT_ORGANIZE = "organizeId"; | |||||
/** | |||||
* 登录组织辖区id | |||||
*/ | |||||
String JWT_REGIONID = "regionId"; | |||||
/** | |||||
* 登录组织类型 0 普通用户 1、企业 2、金融机构 3、投资机构 4、服务机构 5、园区 6、协(商会) 7、项目管理公司 8 区文创办 9 市文创办 99 公司后台管理 | |||||
*/ | |||||
String JWT_ORGANIZETYPE = "organizeType"; | |||||
/** | |||||
* JWT用户名 | |||||
*/ | |||||
String JWT_USERNAME = "username"; | |||||
/** | |||||
* JWT刷新新token响应状态码 | |||||
*/ | |||||
int JWT_REFRESH_TOKEN_CODE = 4460; | |||||
/** | |||||
* JWT刷新新token响应状态码, | |||||
* Redis中不存在,但jwt未过期,不生成新的token,返回4461状态码 | |||||
*/ | |||||
int JWT_INVALID_TOKEN_CODE = 4461; | |||||
/** | |||||
* 初始密码 | |||||
*/ | |||||
String INIT_PWD = "123456"; | |||||
/** | |||||
* 默认头像 | |||||
*/ | |||||
String DEFAULT_HEAD_URL = ""; | |||||
/** | |||||
* 管理员角色名称 | |||||
*/ | |||||
String ADMIN_ROLE_NAME = "管理员"; | |||||
String ADMIN_LOGIN = "adminLogin"; | |||||
/** | |||||
* 验证码token | |||||
*/ | |||||
String VERIFY_TOKEN = "verifyToken"; | |||||
/** | |||||
* 图片 | |||||
*/ | |||||
String IMAGE = "image"; | |||||
/** | |||||
* JPEG | |||||
*/ | |||||
String JPEG = "JPEG"; | |||||
/** | |||||
* base64前缀 | |||||
*/ | |||||
String BASE64_PREFIX = "data:image/png;base64,"; | |||||
} |
package com.xdf.creative.enums; | |||||
/** | |||||
* <p> | |||||
* REST API 响应码 | |||||
* </p> | |||||
* | |||||
* @author DeanYe | |||||
* @since 2018-11-08 | |||||
*/ | |||||
public enum ApiCode { | |||||
SUCCESS(200, "操作成功"), | |||||
TOKEN_IS_EMPTY(4400, "TOKEN不能为空"), | |||||
UNAUTHORIZED(4401, "非法访问"), | |||||
NOT_PERMISSION(4403, "没有权限"), | |||||
NOT_FOUND(4404, "你请求的资源不存在"), | |||||
USERNAME_ERROR(4405, "用户名不正确"), | |||||
PASSWORD_ERROR(4406, "密码不正确"), | |||||
USER_DISABLE(4407, "用户不可用"), | |||||
VERIFICATION_CODE_ERROR(4408, "验证码不正确"), | |||||
TOKEN_INVALID(4409, "无效令牌"), | |||||
REFRESH_TOKEN_ERROR(4410, "刷新令牌异常"), | |||||
FAIL(5500, "操作失败"), | |||||
LOGIN_EXCEPTION(4000, "登陆失败"), | |||||
SYSTEM_EXCEPTION(5000, "系统异常!"), | |||||
PARAMETER_EXCEPTION(5001, "请求参数校验异常"), | |||||
PARAMETER_PARSE_EXCEPTION(5002, "请求参数解析异常"), | |||||
HTTP_MEDIA_TYPE_EXCEPTION(5003, "HTTP Media 类型异常"), | |||||
SERVICE_EXCEPTION(5004, "RPC下游服务异常"), | |||||
; | |||||
private final int code; | |||||
private final String msg; | |||||
ApiCode(final int code, final String msg) { | |||||
this.code = code; | |||||
this.msg = msg; | |||||
} | |||||
public static ApiCode getApiCode(int code) { | |||||
ApiCode[] ecs = ApiCode.values(); | |||||
for (ApiCode ec : ecs) { | |||||
if (ec.getCode() == code) { | |||||
return ec; | |||||
} | |||||
} | |||||
return SUCCESS; | |||||
} | |||||
public int getCode() { | |||||
return code; | |||||
} | |||||
public String getMsg() { | |||||
return msg; | |||||
} | |||||
} |
package com.xdf.creative.enums; | |||||
/** | |||||
* 命名表名+功能 | |||||
* <p> | |||||
* 六位代码 1、admin后台管理 2、文促会官网 3、业务服务bus 4、投融资 5、 | |||||
* 末位已数据库表排序 | |||||
*/ | |||||
public enum StatusCode { | |||||
//修改数据 传入主键查不到数据 | |||||
FORM_SUBMIT_UPDATE_VERIFY(000001, "当前数据不存在或已删除,请刷新后再试!"), | |||||
//修改数据未传主键id | |||||
FORM_SUBMIT_ID_VERIFY(000002, "未知数据标识,请重新选择!"), | |||||
AUTH_UPDATE_VERIFY_ERROR(000003, "存在非法访问,请刷新后再试!"), | |||||
FORM_AUDIT_STATE_VERIFY(000004, "只能操作待审核的数据!"), | |||||
FORM_UPDATE_STATE_VERIFY(000005, "只能操作草稿状态的数据!"), | |||||
FORM_AUTH_UPDATE_VERIFY_ERROR(000006, "存在非法更新!"), | |||||
SMS_SEND_VERIFICATION_CODE_SUCCESS(20000, "短信发送成功"), | |||||
SMS_SEND_VERIFICATION_CODE_FAIL(20001, "短信发送失败"), | |||||
SMS_MESSAGE_VERIFICATION_CODE_VERIFY(20002, "验证码已过期!"), | |||||
SMS_MESSAGE_VERIFICATION_CODE_ERROR(20003, "验证码错误!"), | |||||
; | |||||
private int status; | |||||
private String msg; | |||||
StatusCode(int status, String msg) { | |||||
this.status = status; | |||||
this.msg = msg; | |||||
} | |||||
public boolean isSuccess() { | |||||
return getStatus() == 10000; | |||||
} | |||||
public int getStatus() { | |||||
return status; | |||||
} | |||||
public String getCode() { | |||||
return name(); | |||||
} | |||||
public String getMsg() { | |||||
return String.format(msg, ""); | |||||
} | |||||
public String getMsg(Object... format) { | |||||
if (format == null) { | |||||
return getMsg(); | |||||
} | |||||
return String.format(msg, format); | |||||
} | |||||
} |
package com.xdf.creative.module.controller; | |||||
import com.xdf.creative.base.controller.BaseController; | |||||
import com.xdf.creative.base.params.IdParam; | |||||
import com.xdf.creative.base.params.creative.SysOperationLogQueryParam; | |||||
import com.xdf.creative.base.vo.creative.SysOperationLogQueryVo; | |||||
import com.xdf.creative.module.entity.SysOperationLog; | |||||
import com.xdf.creative.module.service.SysOperationLogService; | |||||
import com.xdf.creative.util.page.ApiResult; | |||||
import com.xdf.creative.util.page.PageTool; | |||||
import io.swagger.annotations.Api; | |||||
import io.swagger.annotations.ApiOperation; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import org.springframework.web.bind.annotation.PostMapping; | |||||
import org.springframework.web.bind.annotation.RequestBody; | |||||
import org.springframework.web.bind.annotation.RequestMapping; | |||||
import org.springframework.web.bind.annotation.RestController; | |||||
import javax.validation.Valid; | |||||
/** | |||||
* <p> | |||||
* 操作日志 前端控制器 | |||||
* </p> | |||||
* | |||||
* @author lgw | |||||
* @since 2020-03-02 | |||||
*/ | |||||
@Slf4j | |||||
@RestController | |||||
@RequestMapping("/sysOperationLog") | |||||
@Api("操作日志 API") | |||||
public class SysOperationLogController extends BaseController { | |||||
@Autowired | |||||
private SysOperationLogService sysOperationLogService; | |||||
/** | |||||
* 添加操作日志 | |||||
*/ | |||||
@PostMapping("/add") | |||||
@ApiOperation(value = "添加SysOperationLog对象", notes = "添加操作日志", response = ApiResult.class) | |||||
public ApiResult<Boolean> addSysOperationLog(@Valid @RequestBody SysOperationLog sysOperationLog) throws Exception { | |||||
boolean flag = sysOperationLogService.save(sysOperationLog); | |||||
return ApiResult.result(flag); | |||||
} | |||||
/** | |||||
* 修改操作日志 | |||||
*/ | |||||
@PostMapping("/update") | |||||
@ApiOperation(value = "修改SysOperationLog对象", notes = "修改操作日志", response = ApiResult.class) | |||||
public ApiResult<Boolean> updateSysOperationLog(@Valid @RequestBody SysOperationLog sysOperationLog) throws Exception { | |||||
boolean flag = sysOperationLogService.updateById(sysOperationLog); | |||||
return ApiResult.result(flag); | |||||
} | |||||
/** | |||||
* 删除操作日志 | |||||
*/ | |||||
@PostMapping("/delete") | |||||
@ApiOperation(value = "删除SysOperationLog对象", notes = "删除操作日志", response = ApiResult.class) | |||||
public ApiResult<Boolean> deleteSysOperationLog(@Valid @RequestBody IdParam idParam) throws Exception { | |||||
boolean flag = sysOperationLogService.removeById(idParam.getId()); | |||||
return ApiResult.result(flag); | |||||
} | |||||
/** | |||||
* 获取操作日志 | |||||
*/ | |||||
@PostMapping("/info") | |||||
@ApiOperation(value = "获取SysOperationLog对象详情", notes = "查看操作日志", response = SysOperationLogQueryVo.class) | |||||
public ApiResult<SysOperationLogQueryVo> getSysOperationLog(@Valid @RequestBody IdParam idParam) throws Exception { | |||||
SysOperationLogQueryVo sysOperationLogQueryVo = sysOperationLogService.getSysOperationLogById(idParam.getId()); | |||||
return ApiResult.ok(sysOperationLogQueryVo); | |||||
} | |||||
/** | |||||
* 操作日志分页列表 | |||||
*/ | |||||
@PostMapping("/getPageList") | |||||
@ApiOperation(value = "获取SysOperationLog分页列表", notes = "操作日志分页列表", response = SysOperationLogQueryVo.class) | |||||
public ApiResult<PageTool<SysOperationLogQueryVo>> getSysOperationLogPageList(@Valid @RequestBody SysOperationLogQueryParam sysOperationLogQueryParam) throws Exception { | |||||
PageTool<SysOperationLogQueryVo> pageList = sysOperationLogService.getSysOperationLogPageList(sysOperationLogQueryParam); | |||||
return ApiResult.ok(pageList); | |||||
} | |||||
} | |||||
package com.xdf.creative.module.controller; | |||||
import com.xdf.creative.base.controller.BaseController; | |||||
import com.xdf.creative.base.params.IdParam; | |||||
import com.xdf.creative.base.params.creative.SysRegionQueryParam; | |||||
import com.xdf.creative.base.vo.creative.SysRegionQueryVo; | |||||
import com.xdf.creative.module.entity.SysRegion; | |||||
import com.xdf.creative.module.service.SysRegionService; | |||||
import com.xdf.creative.support.aop.OperationLogger; | |||||
import com.xdf.creative.util.page.ApiResult; | |||||
import com.xdf.creative.util.page.PageTool; | |||||
import io.swagger.annotations.Api; | |||||
import io.swagger.annotations.ApiOperation; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import org.springframework.web.bind.annotation.*; | |||||
import javax.validation.Valid; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* 全国行政区域[sys_region] 前端控制器 | |||||
* </p> | |||||
* | |||||
* @author DeanYe | |||||
* @since 2019-11-06 | |||||
*/ | |||||
@Slf4j | |||||
@RestController | |||||
@RequestMapping("/sysRegion") | |||||
@Api("全国行政区域[sys_region] API") | |||||
public class SysRegionController extends BaseController { | |||||
@Autowired | |||||
private SysRegionService sysRegionService; | |||||
/** | |||||
* 添加全国行政区域[sys_region] | |||||
* | |||||
* @param sysRegion | |||||
* @return | |||||
* @throws Exception | |||||
*/ | |||||
@PostMapping("/add") | |||||
@ApiOperation(value = "添加SysRegion对象", notes = "添加全国行政区域[sys_region]", response = ApiResult.class) | |||||
public ApiResult<Boolean> addSysRegion(@Valid @RequestBody SysRegion sysRegion) throws Exception { | |||||
boolean flag = sysRegionService.save(sysRegion); | |||||
return ApiResult.result(flag); | |||||
} | |||||
/** | |||||
* 修改全国行政区域[sys_region] | |||||
*/ | |||||
@PostMapping("/update") | |||||
@ApiOperation(value = "修改SysRegion对象", notes = "修改全国行政区域[sys_region]", response = ApiResult.class) | |||||
public ApiResult<Boolean> updateSysRegion(@Valid @RequestBody SysRegion sysRegion) throws Exception { | |||||
boolean flag = sysRegionService.updateById(sysRegion); | |||||
return ApiResult.result(flag); | |||||
} | |||||
/** | |||||
* 删除全国行政区域[sys_region] | |||||
*/ | |||||
@PostMapping("/delete") | |||||
@ApiOperation(value = "删除SysRegion对象", notes = "删除全国行政区域[sys_region]", response = ApiResult.class) | |||||
public ApiResult<Boolean> deleteSysRegion(@Valid @RequestBody IdParam idParam) throws Exception { | |||||
boolean flag = sysRegionService.removeById(idParam.getId()); | |||||
return ApiResult.result(flag); | |||||
} | |||||
/** | |||||
* 获取全国行政区域[sys_region] | |||||
*/ | |||||
@PostMapping("/info") | |||||
@ApiOperation(value = "获取SysRegion对象详情", notes = "查看全国行政区域[sys_region]", response = SysRegionQueryVo.class) | |||||
public ApiResult<SysRegionQueryVo> getSysRegion(@Valid @RequestBody IdParam idParam) throws Exception { | |||||
SysRegionQueryVo sysRegionQueryVo = sysRegionService.getSysRegionById(idParam.getId()); | |||||
return ApiResult.ok(sysRegionQueryVo); | |||||
} | |||||
/** | |||||
* 全国行政区域[sys_region]分页列表 | |||||
*/ | |||||
@GetMapping("/getPageList") | |||||
@ApiOperation(value = "获取SysRegion分页列表", notes = "全国行政区域[sys_region]分页列表", response = SysRegionQueryVo.class) | |||||
public ApiResult<PageTool<SysRegionQueryVo>> getSysRegionPageList(@Valid @RequestBody SysRegionQueryParam sysRegionQueryParam) throws Exception { | |||||
PageTool<SysRegionQueryVo> pageList = sysRegionService.getSysRegionPageList(sysRegionQueryParam); | |||||
return ApiResult.ok(pageList); | |||||
} | |||||
/** | |||||
* 全国行政区域[sys_region]分页列表 | |||||
*/ | |||||
@OperationLogger(value = "获取SysRegion列表") //这里添加了AOP的自定义注解 | |||||
@PostMapping("/getRegionList") | |||||
@ApiOperation(value = "获取SysRegion列表", notes = "全国行政区域[sys_region]分页列表", response = SysRegionQueryVo.class) | |||||
public ApiResult<List<SysRegionQueryVo>> getSysRegionList(@Valid @RequestBody SysRegionQueryParam sysRegionQueryParam) throws Exception { | |||||
return ApiResult.ok(sysRegionService.getSysRegionList(sysRegionQueryParam)); | |||||
} | |||||
} | |||||
package com.xdf.creative.module.entity; | |||||
import com.baomidou.mybatisplus.annotation.IdType; | |||||
import com.baomidou.mybatisplus.annotation.TableId; | |||||
import com.xdf.creative.base.entity.BaseEntity; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import lombok.EqualsAndHashCode; | |||||
import lombok.experimental.Accessors; | |||||
import java.util.Date; | |||||
/** | |||||
* <p> | |||||
* 操作日志 | |||||
* </p> | |||||
* | |||||
* @author lgw | |||||
* @since 2020-03-02 | |||||
*/ | |||||
@Data | |||||
@Accessors(chain = true) | |||||
@EqualsAndHashCode(callSuper = true) | |||||
@ApiModel(value = "SysOperationLog对象", description = "操作日志") | |||||
public class SysOperationLog extends BaseEntity { | |||||
private static final long serialVersionUID = 1L; | |||||
@ApiModelProperty(value = "用户操作日志主键") | |||||
@TableId(value = "id", type = IdType.AUTO) | |||||
private Long id; | |||||
@ApiModelProperty(value = "日志名称") | |||||
private String logName; | |||||
@ApiModelProperty(value = "用户id") | |||||
private Long userId; | |||||
@ApiModelProperty(value = "api名称") | |||||
private String api; | |||||
@ApiModelProperty(value = "方法名称") | |||||
private String method; | |||||
@ApiModelProperty(value = "创建时间") | |||||
private Date createTime; | |||||
@ApiModelProperty(value = "是否执行成功(0失败1成功)") | |||||
private Integer succeed; | |||||
@ApiModelProperty(value = "具体消息备注") | |||||
private String detail; | |||||
} |
package com.xdf.creative.module.entity; | |||||
import com.baomidou.mybatisplus.annotation.IdType; | |||||
import com.baomidou.mybatisplus.annotation.TableId; | |||||
import com.xdf.creative.base.entity.BaseEntity; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import lombok.EqualsAndHashCode; | |||||
import lombok.experimental.Accessors; | |||||
/** | |||||
* 全国行政区域[sys_region] | |||||
*/ | |||||
@Data | |||||
@Accessors(chain = true) | |||||
@EqualsAndHashCode(callSuper = true) | |||||
@ApiModel(value = "SysRegion对象", description = "全国行政区域[sys_region]") | |||||
public class SysRegion extends BaseEntity { | |||||
private static final long serialVersionUID = 1L; | |||||
@ApiModelProperty(value = "主键ID") | |||||
@TableId(value = "id", type = IdType.AUTO) | |||||
private Long id; | |||||
@ApiModelProperty(value = "行政区代码") | |||||
private String regionId; | |||||
@ApiModelProperty(value = "行政区域名称") | |||||
private String regionName; | |||||
@ApiModelProperty(value = "上级行政区域") | |||||
private String parRegionId; | |||||
@ApiModelProperty(value = "值:0、草稿 1、提交") | |||||
private Integer state; | |||||
private String descript; | |||||
} |
package com.xdf.creative.module.mapper; | |||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |||||
import com.baomidou.mybatisplus.core.metadata.IPage; | |||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |||||
import com.xdf.creative.base.params.creative.SysOperationLogQueryParam; | |||||
import com.xdf.creative.base.vo.creative.SysOperationLogQueryVo; | |||||
import com.xdf.creative.module.entity.SysOperationLog; | |||||
import org.apache.ibatis.annotations.Param; | |||||
import org.springframework.stereotype.Repository; | |||||
import java.io.Serializable; | |||||
/** | |||||
* <p> | |||||
* 操作日志 Mapper 接口 | |||||
* </p> | |||||
* | |||||
* @author lgw | |||||
* @since 2020-03-02 | |||||
*/ | |||||
@Repository | |||||
public interface SysOperationLogMapper extends BaseMapper<SysOperationLog> { | |||||
/** | |||||
* 根据ID获取查询对象 | |||||
* | |||||
* @param id | |||||
* @return | |||||
*/ | |||||
SysOperationLogQueryVo getSysOperationLogById(Serializable id); | |||||
/** | |||||
* 获取分页对象 | |||||
* | |||||
* @param page | |||||
* @param sysOperationLogQueryParam | |||||
* @return | |||||
*/ | |||||
IPage<SysOperationLogQueryVo> getSysOperationLogPageList(@Param("page") Page page, @Param("param") SysOperationLogQueryParam sysOperationLogQueryParam); | |||||
} |
package com.xdf.creative.module.mapper; | |||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |||||
import com.baomidou.mybatisplus.core.metadata.IPage; | |||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |||||
import com.xdf.creative.base.params.creative.SysRegionQueryParam; | |||||
import com.xdf.creative.base.vo.creative.SysRegionQueryVo; | |||||
import com.xdf.creative.module.entity.SysRegion; | |||||
import org.apache.ibatis.annotations.Param; | |||||
import org.springframework.stereotype.Repository; | |||||
import java.io.Serializable; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* 全国行政区域[sys_region] Mapper 接口 | |||||
* </p> | |||||
* | |||||
* @author DeanYe | |||||
* @since 2019-11-06 | |||||
*/ | |||||
@Repository | |||||
public interface SysRegionMapper extends BaseMapper<SysRegion> { | |||||
/** | |||||
* 根据ID获取查询对象 | |||||
* | |||||
* @param id | |||||
* @return | |||||
*/ | |||||
SysRegionQueryVo getSysRegionById(Serializable id); | |||||
/** | |||||
* 获取分页对象 | |||||
* | |||||
* @param page | |||||
* @param sysRegionQueryParam | |||||
* @return | |||||
*/ | |||||
IPage<SysRegionQueryVo> getSysRegionPageList(@Param("page") Page page, @Param("param") SysRegionQueryParam sysRegionQueryParam); | |||||
/** | |||||
* 不分页查询 | |||||
* | |||||
* @param sysRegionQueryParam | |||||
* @return | |||||
*/ | |||||
List<SysRegionQueryVo> getSysRegionList(@Param("param") SysRegionQueryParam sysRegionQueryParam); | |||||
} |
package com.xdf.creative.module.service; | |||||
import com.xdf.creative.base.params.creative.SysOperationLogQueryParam; | |||||
import com.xdf.creative.base.service.BaseService; | |||||
import com.xdf.creative.base.vo.creative.SysOperationLogQueryVo; | |||||
import com.xdf.creative.module.entity.SysOperationLog; | |||||
import com.xdf.creative.util.page.PageTool; | |||||
import java.io.Serializable; | |||||
/** | |||||
* <p> | |||||
* 操作日志 服务类 | |||||
* </p> | |||||
* | |||||
* @author lgw | |||||
* @since 2020-03-02 | |||||
*/ | |||||
public interface SysOperationLogService extends BaseService<SysOperationLog> { | |||||
/** | |||||
* 根据ID获取查询对象 | |||||
* | |||||
* @param id | |||||
* @return | |||||
*/ | |||||
SysOperationLogQueryVo getSysOperationLogById(Serializable id) throws Exception; | |||||
/** | |||||
* 获取分页对象 | |||||
* | |||||
* @param sysOperationLogQueryParam | |||||
* @return | |||||
*/ | |||||
PageTool<SysOperationLogQueryVo> getSysOperationLogPageList(SysOperationLogQueryParam sysOperationLogQueryParam) throws Exception; | |||||
} |
package com.xdf.creative.module.service; | |||||
import com.xdf.creative.base.params.creative.SysRegionQueryParam; | |||||
import com.xdf.creative.base.service.BaseService; | |||||
import com.xdf.creative.base.vo.creative.SysRegionQueryVo; | |||||
import com.xdf.creative.module.entity.SysRegion; | |||||
import com.xdf.creative.util.page.PageTool; | |||||
import java.io.Serializable; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* 全国行政区域[sys_region] 服务类 | |||||
* </p> | |||||
* | |||||
* @author DeanYe | |||||
* @since 2019-11-06 | |||||
*/ | |||||
public interface SysRegionService extends BaseService<SysRegion> { | |||||
/** | |||||
* 根据ID获取查询对象 | |||||
* | |||||
* @param id | |||||
* @return | |||||
*/ | |||||
SysRegionQueryVo getSysRegionById(Serializable id) throws Exception; | |||||
/** | |||||
* 获取分页对象 | |||||
* | |||||
* @param sysRegionQueryParam | |||||
* @return | |||||
*/ | |||||
PageTool<SysRegionQueryVo> getSysRegionPageList(SysRegionQueryParam sysRegionQueryParam) throws Exception; | |||||
/** | |||||
* 不分页查询 | |||||
* | |||||
* @param sysRegionQueryParam | |||||
* @return | |||||
*/ | |||||
List<SysRegionQueryVo> getSysRegionList(SysRegionQueryParam sysRegionQueryParam); | |||||
} |
package com.xdf.creative.module.service.impl; | |||||
import com.baomidou.mybatisplus.core.metadata.IPage; | |||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |||||
import com.xdf.creative.base.params.creative.SysOperationLogQueryParam; | |||||
import com.xdf.creative.base.service.impl.BaseServiceImpl; | |||||
import com.xdf.creative.base.vo.creative.SysOperationLogQueryVo; | |||||
import com.xdf.creative.module.entity.SysOperationLog; | |||||
import com.xdf.creative.module.mapper.SysOperationLogMapper; | |||||
import com.xdf.creative.module.service.SysOperationLogService; | |||||
import com.xdf.creative.util.page.PageTool; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import org.springframework.stereotype.Service; | |||||
import org.springframework.transaction.annotation.Transactional; | |||||
import java.io.Serializable; | |||||
/** | |||||
* <p> | |||||
* 操作日志 服务实现类 | |||||
* </p> | |||||
* | |||||
* @author lgw | |||||
* @since 2020-03-02 | |||||
*/ | |||||
@Slf4j | |||||
@Service | |||||
@Transactional(rollbackFor = Exception.class) | |||||
public class SysOperationLogServiceImpl extends BaseServiceImpl<SysOperationLogMapper, SysOperationLog> implements SysOperationLogService { | |||||
@Autowired | |||||
private SysOperationLogMapper sysOperationLogMapper; | |||||
@Override | |||||
public SysOperationLogQueryVo getSysOperationLogById(Serializable id) throws Exception { | |||||
return sysOperationLogMapper.getSysOperationLogById(id); | |||||
} | |||||
@Override | |||||
public PageTool<SysOperationLogQueryVo> getSysOperationLogPageList(SysOperationLogQueryParam sysOperationLogQueryParam) throws Exception { | |||||
Page page = setPageParam(sysOperationLogQueryParam); | |||||
IPage<SysOperationLogQueryVo> iPage = sysOperationLogMapper.getSysOperationLogPageList(page, sysOperationLogQueryParam); | |||||
return new PageTool(iPage); | |||||
} | |||||
} |
package com.xdf.creative.module.service.impl; | |||||
import com.baomidou.mybatisplus.core.metadata.IPage; | |||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |||||
import com.xdf.creative.base.params.creative.SysRegionQueryParam; | |||||
import com.xdf.creative.base.service.impl.BaseServiceImpl; | |||||
import com.xdf.creative.base.vo.creative.SysRegionQueryVo; | |||||
import com.xdf.creative.module.entity.SysRegion; | |||||
import com.xdf.creative.module.mapper.SysRegionMapper; | |||||
import com.xdf.creative.module.service.SysRegionService; | |||||
import com.xdf.creative.util.page.PageTool; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import org.springframework.stereotype.Service; | |||||
import org.springframework.transaction.annotation.Transactional; | |||||
import java.io.Serializable; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* 全国行政区域[sys_region] 服务实现类 | |||||
* </p> | |||||
* | |||||
* @author DeanYe | |||||
* @since 2019-11-06 | |||||
*/ | |||||
@Slf4j | |||||
@Service | |||||
@Transactional(rollbackFor = Exception.class) | |||||
public class SysRegionServiceImpl extends BaseServiceImpl<SysRegionMapper, SysRegion> implements SysRegionService { | |||||
@Autowired | |||||
private SysRegionMapper sysRegionMapper; | |||||
@Override | |||||
public SysRegionQueryVo getSysRegionById(Serializable id) throws Exception { | |||||
return sysRegionMapper.getSysRegionById(id); | |||||
} | |||||
/** | |||||
* 不分页查询 | |||||
* | |||||
* @param sysRegionQueryParam | |||||
* @return | |||||
* @throws Exception | |||||
*/ | |||||
@Override | |||||
public List<SysRegionQueryVo> getSysRegionList(SysRegionQueryParam sysRegionQueryParam) { | |||||
return sysRegionMapper.getSysRegionList(sysRegionQueryParam); | |||||
} | |||||
@Override | |||||
public PageTool<SysRegionQueryVo> getSysRegionPageList(SysRegionQueryParam sysRegionQueryParam) throws Exception { | |||||
Page page = setPageParam(sysRegionQueryParam); | |||||
IPage<SysRegionQueryVo> iPage = sysRegionMapper.getSysRegionPageList(page, sysRegionQueryParam); | |||||
return new PageTool(iPage); | |||||
} | |||||
} |
package com.xdf.creative.module; | |||||
public class test { | |||||
} |
package com.xdf.creative.support.aop; | |||||
import java.lang.annotation.ElementType; | |||||
import java.lang.annotation.Retention; | |||||
import java.lang.annotation.RetentionPolicy; | |||||
import java.lang.annotation.Target; | |||||
/** | |||||
* @author : lgw | |||||
* @date : 17:55 2020/3/2 | |||||
*/ | |||||
@Retention(RetentionPolicy.RUNTIME)//注解会在class中存在,运行时可通过反射获取 | |||||
@Target(ElementType.METHOD)//目标是方法 | |||||
public @interface OperationLogger { | |||||
String value() default ""; | |||||
} |
package com.xdf.creative.support.aop; | |||||
import com.alibaba.fastjson.JSON; | |||||
import com.xdf.creative.module.entity.SysOperationLog; | |||||
import com.xdf.creative.module.service.SysOperationLogService; | |||||
import com.xdf.creative.util.IpUtil; | |||||
import org.aspectj.lang.JoinPoint; | |||||
import org.aspectj.lang.annotation.AfterReturning; | |||||
import org.aspectj.lang.annotation.Aspect; | |||||
import org.aspectj.lang.annotation.Pointcut; | |||||
import org.aspectj.lang.reflect.MethodSignature; | |||||
import org.slf4j.Logger; | |||||
import org.slf4j.LoggerFactory; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import org.springframework.stereotype.Component; | |||||
import javax.servlet.http.HttpServletRequest; | |||||
import java.lang.reflect.Method; | |||||
import java.util.Date; | |||||
/** | |||||
* @author : lgw | |||||
* @date : 17:57 2020/3/2 | |||||
*/ | |||||
@Aspect | |||||
@Component | |||||
public class SysOperationLogAspect { | |||||
@Autowired | |||||
private SysOperationLogService sysOperationLogService; | |||||
private static final Logger logger = LoggerFactory.getLogger(SysOperationLogAspect.class); | |||||
//定义切点 @Pointcut | |||||
//在注解的位置切入代码 | |||||
@Pointcut("@annotation( com.xdf.creative.support.aop.OperationLogger)") | |||||
public void logPoinCut() { | |||||
} | |||||
//切面 配置通知 | |||||
@AfterReturning("logPoinCut()") | |||||
public void saveSysLog(JoinPoint joinPoint) { | |||||
System.out.println("切面。。。。。"); | |||||
//保存日志 | |||||
SysOperationLog sysOperationLog = new SysOperationLog(); | |||||
//从切面织入点处通过反射机制获取织入点处的方法 | |||||
MethodSignature signature = (MethodSignature) joinPoint.getSignature(); | |||||
//获取切入点所在的方法 | |||||
Method method = signature.getMethod(); | |||||
//获取操作 | |||||
OperationLogger operationLogger = method.getAnnotation(OperationLogger.class); | |||||
if (operationLogger != null) { | |||||
String value = operationLogger.value(); | |||||
sysOperationLog.setDetail(value);//保存获取的操作 | |||||
} | |||||
//获取请求的类名 | |||||
String className = joinPoint.getTarget().getClass().getName(); | |||||
//获取请求的方法名 | |||||
String methodName = method.getName(); | |||||
sysOperationLog.setMethod(className + "." + methodName); | |||||
//请求的参数 | |||||
Object[] args = joinPoint.getArgs(); | |||||
//将参数所在的数组转换成json | |||||
// String params = JSON.toJSONString(args); | |||||
// sysOperationLog.setParams(params); | |||||
sysOperationLog.setCreateTime(new Date()); | |||||
//获取用户名 | |||||
// sysOperationLog.setUserId(ShiroUtils.getUserEntity().getUsername()); | |||||
sysOperationLog.setUserId((long)1); | |||||
//获取用户ip地址 | |||||
sysOperationLog.setApi(IpUtil.getRequestIp()); | |||||
//调用service保存SysLog实体类到数据库 | |||||
sysOperationLogService.save(sysOperationLog); | |||||
} | |||||
} |
package com.xdf.creative.util; | |||||
public class CollectionTools { | |||||
public static boolean isEmptyArr(String[] arr) { | |||||
if (arr == null || arr.length == 0) { | |||||
return true; | |||||
} | |||||
return false; | |||||
} | |||||
public static boolean isNoEmptyArr(String[] arr) { | |||||
if (arr != null && arr.length != 0) { | |||||
return true; | |||||
} | |||||
return false; | |||||
} | |||||
} |
package com.xdf.creative.util; | |||||
import org.springframework.web.context.request.RequestContextHolder; | |||||
import org.springframework.web.context.request.ServletRequestAttributes; | |||||
import javax.servlet.http.HttpServletRequest; | |||||
/** | |||||
* IP地址工具类 | |||||
* @author xudongdong | |||||
* | |||||
*/ | |||||
public class IpUtil { | |||||
/** | |||||
* 私有化构造器 | |||||
*/ | |||||
private IpUtil() { | |||||
} | |||||
/** | |||||
* 获取请求用户的IP地址 | |||||
* | |||||
* @return | |||||
*/ | |||||
public static String getRequestIp() { | |||||
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); | |||||
HttpServletRequest request = attributes.getRequest(); | |||||
return getRequestIp(request); | |||||
} | |||||
/** | |||||
* 获取真实IP地址 | |||||
* <p>使用getRealIP代替该方法</p> | |||||
* @param request req | |||||
* @return ip | |||||
*/ | |||||
@Deprecated | |||||
public static String getRequestIp(HttpServletRequest request) { | |||||
// 获取客户端ip地址 | |||||
String clientIp = request.getHeader("x-forwarded-for"); | |||||
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) { | |||||
clientIp = request.getHeader("Proxy-Client-IP"); | |||||
} | |||||
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) { | |||||
clientIp = request.getHeader("WL-Proxy-Client-IP"); | |||||
} | |||||
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) { | |||||
clientIp = request.getRemoteAddr(); | |||||
} | |||||
/* | |||||
* 对于获取到多ip的情况下,找到公网ip. | |||||
*/ | |||||
String sIP = null; | |||||
if (clientIp != null && !clientIp.contains("unknown") && clientIp.indexOf(",") > 0) { | |||||
String[] ipsz = clientIp.split(","); | |||||
for (String anIpsz : ipsz) { | |||||
if (!isInnerIP(anIpsz.trim())) { | |||||
sIP = anIpsz.trim(); | |||||
break; | |||||
} | |||||
} | |||||
/* | |||||
* 如果多ip都是内网ip,则取第一个ip. | |||||
*/ | |||||
if (null == sIP) { | |||||
sIP = ipsz[0].trim(); | |||||
} | |||||
clientIp = sIP; | |||||
} | |||||
if (clientIp != null && clientIp.contains("unknown")){ | |||||
clientIp =clientIp.replaceAll("unknown,", ""); | |||||
clientIp = clientIp.trim(); | |||||
} | |||||
if ("".equals(clientIp) || null == clientIp){ | |||||
clientIp = "127.0.0.1"; | |||||
} | |||||
return clientIp; | |||||
} | |||||
/** | |||||
* 判断IP是否是内网地址 | |||||
* @param ipAddress ip地址 | |||||
* @return 是否是内网地址 | |||||
*/ | |||||
public static boolean isInnerIP(String ipAddress) { | |||||
boolean isInnerIp; | |||||
long ipNum = getIpNum(ipAddress); | |||||
/** | |||||
私有IP:A类 10.0.0.0-10.255.255.255 | |||||
B类 172.16.0.0-172.31.255.255 | |||||
C类 192.168.0.0-192.168.255.255 | |||||
当然,还有127这个网段是环回地址 | |||||
**/ | |||||
long aBegin = getIpNum("10.0.0.0"); | |||||
long aEnd = getIpNum("10.255.255.255"); | |||||
long bBegin = getIpNum("172.16.0.0"); | |||||
long bEnd = getIpNum("172.31.255.255"); | |||||
long cBegin = getIpNum("192.168.0.0"); | |||||
long cEnd = getIpNum("192.168.255.255"); | |||||
isInnerIp = isInner(ipNum, aBegin, aEnd) || isInner(ipNum, bBegin, bEnd) || isInner(ipNum, cBegin, cEnd) | |||||
|| ipAddress.equals("127.0.0.1"); | |||||
return isInnerIp; | |||||
} | |||||
private static long getIpNum(String ipAddress) { | |||||
String[] ip = ipAddress.split("\\."); | |||||
long a = Integer.parseInt(ip[0]); | |||||
long b = Integer.parseInt(ip[1]); | |||||
long c = Integer.parseInt(ip[2]); | |||||
long d = Integer.parseInt(ip[3]); | |||||
return a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d; | |||||
} | |||||
private static boolean isInner(long userIp, long begin, long end) { | |||||
return (userIp >= begin) && (userIp <= end); | |||||
} | |||||
public static String getRealIP(HttpServletRequest request){ | |||||
// 获取客户端ip地址 | |||||
String clientIp = request.getHeader("x-forwarded-for"); | |||||
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) { | |||||
clientIp = request.getRemoteAddr(); | |||||
} | |||||
String[] clientIps = clientIp.split(","); | |||||
if(clientIps.length <= 1) return clientIp.trim(); | |||||
// 判断是否来自CDN | |||||
if(isComefromCDN(request)){ | |||||
if(clientIps.length>=2) return clientIps[clientIps.length-2].trim(); | |||||
} | |||||
return clientIps[clientIps.length-1].trim(); | |||||
} | |||||
private static boolean isComefromCDN(HttpServletRequest request) { | |||||
String host = request.getHeader("host"); | |||||
return host.contains("www.189.cn") ||host.contains("shouji.189.cn") || host.contains( | |||||
"image2.chinatelecom-ec.com") || host.contains( | |||||
"image1.chinatelecom-ec.com"); | |||||
} | |||||
} |
package com.xdf.creative.util; | |||||
public class StringUtil { | |||||
public static String replaceSpecialCharacter(String str) { | |||||
String newStr = str.trim(); | |||||
for (; ; ) { | |||||
if (newStr.contains("\\\\")) { | |||||
newStr = newStr.replaceAll("\\\\", ""); | |||||
} else if (newStr.contains("r")) { | |||||
newStr = newStr.replaceAll("r", ""); | |||||
} else if (newStr.contains("n")) { | |||||
newStr = newStr.replaceAll("n", ""); | |||||
} else { | |||||
return newStr; | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* 判断是否空字符串 | |||||
* | |||||
* @param str | |||||
* @return | |||||
*/ | |||||
public static boolean isEmpty(String str) { | |||||
return ((str == null) || (str.trim().equals(""))); | |||||
} | |||||
/** | |||||
* 判断是否非空字符串 | |||||
* | |||||
* @param str | |||||
* @return | |||||
*/ | |||||
public static boolean isNotEmpty(String str) { | |||||
return !((str == null) || (str.trim().equals(""))); | |||||
} | |||||
public static boolean longIsNotEmpty(Long val) { | |||||
return !((val == null) || (val == 0)); | |||||
} | |||||
} |
package com.xdf.creative.util.page; | |||||
import com.alibaba.fastjson.annotation.JSONField; | |||||
import com.fasterxml.jackson.annotation.JsonFormat; | |||||
import com.xdf.creative.enums.ApiCode; | |||||
import com.xdf.creative.enums.StatusCode; | |||||
import com.xdf.creative.util.StringUtil; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Builder; | |||||
import lombok.Data; | |||||
import lombok.experimental.Accessors; | |||||
import java.io.Serializable; | |||||
import java.util.Date; | |||||
import java.util.HashMap; | |||||
import java.util.Map; | |||||
/** | |||||
* <p> | |||||
* REST API 返回结果 | |||||
* </p> | |||||
* | |||||
* @author DeanYe | |||||
* @since 2018-11-08 | |||||
*/ | |||||
@Data | |||||
@Accessors(chain = true) | |||||
@Builder | |||||
@AllArgsConstructor | |||||
public class ApiResult<T> implements Serializable { | |||||
private int code; | |||||
private T data; | |||||
private String msg; | |||||
@JSONField(format = "yyyy-MM-dd HH:mm:ss") | |||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | |||||
private Date time; | |||||
public ApiResult() { | |||||
} | |||||
public static ApiResult result(boolean flag) { | |||||
if (flag) { | |||||
return ok(); | |||||
} | |||||
return fail(""); | |||||
} | |||||
public static ApiResult result(ApiCode apiCode) { | |||||
return result(apiCode, null); | |||||
} | |||||
public static ApiResult result(ApiCode apiCode, Object data) { | |||||
return result(apiCode, null, data); | |||||
} | |||||
public static ApiResult error(StatusCode statusCode) { | |||||
ApiResult r = new ApiResult(); | |||||
r.setCode(statusCode.getStatus()); | |||||
r.setMsg(statusCode.getMsg()); | |||||
r.setTime(new Date()); | |||||
return r; | |||||
} | |||||
public static ApiResult result(ApiCode apiCode, String msg, Object data) { | |||||
String message = apiCode.getMsg(); | |||||
if (StringUtil.isNotEmpty(msg)) { | |||||
message = msg; | |||||
} | |||||
return ApiResult.builder() | |||||
.code(apiCode.getCode()) | |||||
.msg(message) | |||||
.data(data) | |||||
.time(new Date()) | |||||
.build(); | |||||
} | |||||
public static ApiResult ok() { | |||||
return ok(null); | |||||
} | |||||
public static ApiResult ok(Object data) { | |||||
return result(ApiCode.SUCCESS, data); | |||||
} | |||||
public static ApiResult ok(Object data, String msg) { | |||||
return result(ApiCode.SUCCESS, msg, data); | |||||
} | |||||
public static ApiResult okMap(String key, Object value) { | |||||
Map<String, Object> map = new HashMap<>(); | |||||
map.put(key, value); | |||||
return ok(map); | |||||
} | |||||
public static ApiResult fail(ApiCode apiCode) { | |||||
return result(apiCode, null); | |||||
} | |||||
public static ApiResult fail(ApiCode code, String msg) { | |||||
return result(code, msg, null); | |||||
} | |||||
public static ApiResult fail(String msg) { | |||||
return result(ApiCode.FAIL, msg, null); | |||||
} | |||||
public static ApiResult fail(ApiCode apiCode, Object data) { | |||||
if (ApiCode.SUCCESS == apiCode) { | |||||
throw new RuntimeException("失败结果状态码不能为" + ApiCode.SUCCESS.getCode()); | |||||
} | |||||
return result(apiCode, data); | |||||
} | |||||
public static ApiResult fail(String key, Object value) { | |||||
Map<String, Object> map = new HashMap<>(); | |||||
map.put(key, value); | |||||
return result(ApiCode.FAIL, map); | |||||
} | |||||
public static ApiResult fail() { | |||||
return fail(ApiCode.FAIL); | |||||
} | |||||
} |
package com.xdf.creative.util.page; | |||||
import com.alibaba.fastjson.annotation.JSONField; | |||||
import com.baomidou.mybatisplus.core.metadata.IPage; | |||||
import com.fasterxml.jackson.annotation.JsonProperty; | |||||
import java.io.Serializable; | |||||
import java.util.Collections; | |||||
import java.util.List; | |||||
/** | |||||
* @author DeanYe | |||||
* @date 2018-11-08 | |||||
*/ | |||||
public class PageTool<T> implements Serializable { | |||||
private static final long serialVersionUID = -1683800405530086022L; | |||||
@JSONField(name = "total") | |||||
@JsonProperty("total") | |||||
private long total = 0; | |||||
@JSONField(name = "records") | |||||
@JsonProperty("records") | |||||
private List<T> records = Collections.emptyList(); | |||||
public PageTool() { | |||||
} | |||||
public PageTool(IPage<T> iPage) { | |||||
this.total = iPage.getTotal(); | |||||
this.records = iPage.getRecords(); | |||||
} | |||||
public PageTool(List<T> list, long total) { | |||||
this.total = total; | |||||
this.records = list; | |||||
} | |||||
public long getTotal() { | |||||
return total; | |||||
} | |||||
public void setTotal(long total) { | |||||
this.total = total; | |||||
} | |||||
public List<T> getRecords() { | |||||
return records; | |||||
} | |||||
public void setRecords(List<T> records) { | |||||
this.records = records; | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
return "Paging{" + | |||||
"total=" + total + | |||||
", records=" + records + | |||||
'}'; | |||||
} | |||||
} |
############################# 恵諒揃抄、極笥tomcat start ############################# | |||||
############################# 访问路径、端口tomcat start ############################# | |||||
server: | |||||
address: | |||||
port: 8999 | |||||
servlet: | |||||
context-path: / | |||||
tomcat: | |||||
max-threads: 1000 | |||||
min-spare-threads: 30 | |||||
uri-encoding: utf-8 | |||||
spring: | |||||
application: | |||||
name: creative-service | |||||
http: | |||||
encoding: | |||||
charset: UTF-8 | |||||
enabled: true | |||||
force: true | |||||
jackson: | |||||
date-format: yyy-MM-dd HH:mm:ss | |||||
time-zone: GMT+8 | |||||
banner: | |||||
charset: UTF-8 | |||||
location: classpath:banner.txt | |||||
profiles: | |||||
active: dev | |||||
datasource: | |||||
driver-class-name: com.mysql.jdbc.Driver | |||||
platform: mysql | |||||
type: com.alibaba.druid.pool.DruidDataSource | |||||
url: jdbc:mysql://192.168.1.101:3306/creative_db?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true | |||||
username: root | |||||
password: 123456 | |||||
druid: | |||||
filter: | |||||
slf4j: | |||||
enabled: true | |||||
stat: | |||||
log-slow-sql: true | |||||
merge-sql: true | |||||
slow-sql-millis: 3000 | |||||
wall: | |||||
config: | |||||
delete-allow: true | |||||
drop-table-allow: false | |||||
enabled: true | |||||
filters: stat,wall,slf4j | |||||
initial-size: 10 | |||||
max-active: 100 | |||||
max-pool-prepared-statement-per-connection-size: 20 | |||||
max-wait: 60000 | |||||
min-evictable-idle-time-millis: 300000 | |||||
min-idle: 10 | |||||
pool-prepared-statements: true | |||||
stat-view-servlet: | |||||
enabled: true | |||||
login-password: druid123 | |||||
login-username: druid | |||||
url-pattern: /druid/* | |||||
test-on-borrow: false | |||||
test-on-return: false | |||||
test-while-idle: true | |||||
time-between-eviction-runs-millis: 60000 | |||||
validation-query: SELECT 1 | |||||
validation-query-timeout: 60000 | |||||
############################### mybatis-plus start ################################# | |||||
mybatis-plus: | |||||
check-config-location: true | |||||
configuration: | |||||
map-underscore-to-camel-case: true | |||||
global-config: | |||||
db-config: | |||||
id-type: id_worker | |||||
logic-delete-value: 0 | |||||
logic-not-delete-value: 1 | |||||
mapper-locations: classpath*:mapper/*Mapper.xml | |||||
type-aliases-package: com.xdf.creative.module.entity | |||||
################################ mybatis-plus end ################################## | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<configuration scan="true"> | |||||
<!-- 日志输出上下文名称 --> | |||||
<contextName>creative</contextName> | |||||
<!-- 输出日志到控制台 ConsoleAppender --> | |||||
<appender name="ConsoleAppender" class="ch.qos.logback.core.ConsoleAppender"> | |||||
<encoder> | |||||
<!--<pattern>%d %p (%file:%line\)- %m%n</pattern>--> | |||||
<!--格式化输出:%d:表示日期 %thread:表示线程名 %-5level:级别从左显示5个字符宽度 %msg:日志消息 %n:是换行符--> | |||||
<pattern>1-%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %msg%n</pattern> | |||||
<charset>UTF-8</charset> | |||||
</encoder> | |||||
</appender> | |||||
<!-- 输出日志到文件 每天一个文件 --> | |||||
<!--输出每天的运行日志到文件SystemOut.log--> | |||||
<appender name="SystemOutFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||||
<!-- 正在记录的日志文件的路径及文件名 --> | |||||
<file>/logs/creative/SystemOut.log</file> | |||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 --> | |||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||||
<!-- 归档的日志文件的路径。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> | |||||
<fileNamePattern>/logs/creative/sys_bak/SystemOut-%d{yyyy-MM-dd}.%i.log</fileNamePattern> | |||||
<!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始 --> | |||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> | |||||
<maxFileSize>2MB</maxFileSize> | |||||
</timeBasedFileNamingAndTriggeringPolicy> | |||||
</rollingPolicy> | |||||
<!-- 追加方式记录日志 --> | |||||
<append>true</append> | |||||
<!-- 日志文件的格式 --> | |||||
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> | |||||
<pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern> | |||||
<charset>utf-8</charset> | |||||
</encoder> | |||||
<!-- 此日志文件记录debug及以上级别的 --> | |||||
<filter class="ch.qos.logback.classic.filter.LevelFilter"> | |||||
<level>debug</level> | |||||
<onMatch>ACCEPT</onMatch> | |||||
<onMismatch>DENY</onMismatch> | |||||
</filter> | |||||
</appender> | |||||
<!-- 输出日志到文件 每天一个文件 --> | |||||
<!--输出每天的运行日志到文件SystemErrOut.log--> | |||||
<appender name="ErrOutFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||||
<!-- 正在记录的日志文件的路径及文件名 --> | |||||
<file>/logs/creative/SystemErrOut.log</file> | |||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 --> | |||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||||
<!-- 归档的日志文件的路径。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> | |||||
<fileNamePattern>/logs/creative/err_bak/SystemErrOut-%d{yyyy-MM-dd}.%i.log</fileNamePattern> | |||||
<!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始 --> | |||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> | |||||
<maxFileSize>2MB</maxFileSize> | |||||
</timeBasedFileNamingAndTriggeringPolicy> | |||||
</rollingPolicy> | |||||
<!-- 追加方式记录日志 --> | |||||
<append>true</append> | |||||
<!-- 日志文件的格式 --> | |||||
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> | |||||
<pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern> | |||||
<charset>utf-8</charset> | |||||
</encoder> | |||||
<!-- 此日志文件记录error及以上级别的 --> | |||||
<filter class="ch.qos.logback.classic.filter.LevelFilter"> | |||||
<level>error</level> | |||||
<onMatch>ACCEPT</onMatch> | |||||
<onMismatch>DENY</onMismatch> | |||||
</filter> | |||||
</appender> | |||||
<!-- 输出日志到文件 文件大小到达指定尺寸的时候文件会自动回滚 --> | |||||
<!-- 输出运行的SQL语句日志到文件SqlOut.log --> | |||||
<appender name="SqlOutFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||||
<!-- 正在记录的日志文件的路径及文件名 --> | |||||
<file>/logs/creative/SystemSqlOut.log</file> | |||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 --> | |||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||||
<!-- 归档的日志文件的路径。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> | |||||
<fileNamePattern>/logs/creative/sql_bak/SystemSqlOut-%d{yyyy-MM-dd}.%i.log</fileNamePattern> | |||||
<!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始 --> | |||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> | |||||
<maxFileSize>2MB</maxFileSize> | |||||
</timeBasedFileNamingAndTriggeringPolicy> | |||||
</rollingPolicy> | |||||
<!-- 追加方式记录日志 --> | |||||
<append>true</append> | |||||
<!-- 日志文件的格式 --> | |||||
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> | |||||
<pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern> | |||||
<charset>utf-8</charset> | |||||
</encoder> | |||||
<!-- 此日志文件记录sql trace --> | |||||
<filter class="ch.qos.logback.classic.filter.LevelFilter"> | |||||
<level>debug</level> | |||||
<onMatch>ACCEPT</onMatch> | |||||
<onMismatch>DENY</onMismatch> | |||||
</filter> | |||||
</appender> | |||||
<!--这个logger的设置是:举例在org.springframework包下面的所有输出日志必须级别level在info及以上级别才会被输出!--> | |||||
<!--这样可以避免输出一些spring框架的许多常见debug信息!--> | |||||
<logger name="org.springframework" level="info"/> | |||||
<logger name="org.json" level="error"/> | |||||
<logger name="io.netty" level="info"/> | |||||
<logger name="org.slf4j" level="info"/> | |||||
<logger name="ch.qos.logback" level="info"/> | |||||
<!-- 生产环境配置文件 --> | |||||
<springProfile name="prod"> | |||||
<!-- 下面是打印 mybatis sql语句日志的配置 --> | |||||
<logger name="com.xdf.creative.module.mapper"> | |||||
<level value="debug"/> | |||||
<appender-ref ref="SqlOutFileAppender"/> | |||||
</logger> | |||||
<root level="DEBUG"> | |||||
<appender-ref ref="ErrOutFileAppender"/> | |||||
<appender-ref ref="SystemOutFileAppender"/> | |||||
<appender-ref ref="ConsoleAppender"/> | |||||
</root> | |||||
</springProfile> | |||||
<!-- 测试环境配置文件 --> | |||||
<springProfile name="test"> | |||||
<!-- 下面是打印 mybatis sql语句日志的配置 --> | |||||
<logger name="com.xdf.creative.module.mapper"> | |||||
<level value="debug"/> | |||||
<appender-ref ref="SqlOutFileAppender"/> | |||||
</logger> | |||||
<root level="DEBUG"> | |||||
<appender-ref ref="ErrOutFileAppender"/> | |||||
<appender-ref ref="SystemOutFileAppender"/> | |||||
<appender-ref ref="ConsoleAppender"/> | |||||
</root> | |||||
</springProfile> | |||||
<!--开发环境配置文件--> | |||||
<springProfile name="dev"> | |||||
<root level="DEBUG"> | |||||
<appender-ref ref="ConsoleAppender"/> | |||||
</root> | |||||
</springProfile> | |||||
</configuration> |
<?xml version="1.0" encoding="UTF-8"?> | |||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||||
<mapper namespace="com.xdf.creative.module.mapper.SysOperationLogMapper"> | |||||
<!-- 通用查询结果列 --> | |||||
<sql id="Base_Column_List"> | |||||
id, log_name, user_id, api, method, create_time, succeed, detail | |||||
</sql> | |||||
<sql id="Base_If_Condition"> | |||||
<where> | |||||
<if test="param.id !=null and param.id!=''"> | |||||
and id=#{param.id} | |||||
</if> | |||||
<if test="param.logName !=null and param.logName!=''"> | |||||
and log_name=#{param.logName} | |||||
</if> | |||||
<if test="param.userId !=null and param.userId!=''"> | |||||
and user_id=#{param.userId} | |||||
</if> | |||||
<if test="param.api !=null and param.api!=''"> | |||||
and api=#{param.api} | |||||
</if> | |||||
<if test="param.method !=null and param.method!=''"> | |||||
and method=#{param.method} | |||||
</if> | |||||
<if test="param.createTime !=null and param.createTime!=''"> | |||||
and create_time=#{param.createTime} | |||||
</if> | |||||
<if test="param.succeed !=null and param.succeed!=''"> | |||||
and succeed=#{param.succeed} | |||||
</if> | |||||
<if test="param.detail !=null and param.detail!=''"> | |||||
and detail=#{param.detail} | |||||
</if> | |||||
</where> | |||||
</sql> | |||||
<!--根据ID查询--> | |||||
<select id="getSysOperationLogById" resultType="com.xdf.creative.base.vo.creative.SysOperationLogQueryVo"> | |||||
select | |||||
<include refid="Base_Column_List"/> | |||||
from sys_operation_log where id = #{id} | |||||
</select> | |||||
<!--分页查询--> | |||||
<select id="getSysOperationLogPageList" | |||||
resultType="com.xdf.creative.base.vo.creative.SysOperationLogQueryVo" | |||||
parameterType="com.xdf.creative.base.params.creative.SysOperationLogQueryParam"> | |||||
select | |||||
<include refid="Base_Column_List"/> | |||||
from sys_operation_log | |||||
<include refid="Base_If_Condition"/> | |||||
</select> | |||||
</mapper> |
<?xml version="1.0" encoding="UTF-8"?> | |||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||||
<mapper namespace="com.xdf.creative.module.mapper.SysRegionMapper"> | |||||
<!-- 通用查询结果列 --> | |||||
<sql id="Base_Column_List"> | |||||
id, region_id, region_name, par_region_id, state, descript | |||||
</sql> | |||||
<sql id="Base_If_Condition"> | |||||
<where> | |||||
<if test="param.id !=null and param.id!=''"> | |||||
and id=#{param.id} | |||||
</if> | |||||
<if test="param.regionId !=null and param.regionId!=''"> | |||||
and region_id like CONCAT('',#{param.regionId},'%') | |||||
</if> | |||||
<if test="param.regionName !=null and param.regionName!=''"> | |||||
and region_name=#{param.regionName} | |||||
</if> | |||||
<if test="param.parRegionId !=null and param.parRegionId!=''"> | |||||
and par_region_id like CONCAT('',#{param.parRegionId},'%') | |||||
</if> | |||||
<if test="param.state !=null and param.state!=''"> | |||||
and state=#{param.state} | |||||
</if> | |||||
<if test="param.descript !=null and param.descript!=''"> | |||||
and descript=#{param.descript} | |||||
</if> | |||||
</where> | |||||
</sql> | |||||
<!--根据ID查询--> | |||||
<select id="getSysRegionById" resultType="com.xdf.creative.base.vo.creative.SysRegionQueryVo"> | |||||
select | |||||
<include refid="Base_Column_List"/> | |||||
from sys_region where id = #{id} | |||||
</select> | |||||
<!--不分页查询--> | |||||
<select id="getSysRegionList" | |||||
resultType="com.xdf.creative.base.vo.creative.SysRegionQueryVo" | |||||
parameterType="com.xdf.creative.base.params.creative.SysRegionQueryParam"> | |||||
select | |||||
<include refid="Base_Column_List"/> | |||||
from sys_region | |||||
<include refid="Base_If_Condition"/> | |||||
</select> | |||||
<!--分页查询--> | |||||
<select id="getSysRegionPageList" | |||||
resultType="com.xdf.creative.base.vo.creative.SysRegionQueryVo" | |||||
parameterType="com.xdf.creative.base.params.creative.SysRegionQueryParam"> | |||||
select | |||||
<include refid="Base_Column_List"/> | |||||
from sys_region | |||||
<include refid="Base_If_Condition"/> | |||||
</select> | |||||
</mapper> |
package com.xdf.creative; | |||||
import org.junit.Test; | |||||
import org.springframework.boot.test.context.SpringBootTest; | |||||
@SpringBootTest | |||||
class CreativeApplicationTests { | |||||
@Test | |||||
void contextLoads() { | |||||
} | |||||
} |