commit bb41afa86c81c27b91d32174d9f976eb50413730
Author: XinYi Song <2037158277@qq.com>
Date: Thu Feb 10 15:41:52 2022 +0800
搭建智慧城乡项目,并实现mq消息订阅,websocket推送报警信息等功能
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..549e00a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 0000000..c1dd12f
Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..b7cb93e
--- /dev/null
+++ b/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar
diff --git a/mvnw b/mvnw
new file mode 100644
index 0000000..8a8fb22
--- /dev/null
+++ b/mvnw
@@ -0,0 +1,316 @@
+#!/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 /usr/local/etc/mavenrc ] ; then
+ . /usr/local/etc/mavenrc
+ fi
+
+ 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="`\\unset -f command; \\command -v 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/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
+ else
+ jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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" || rm -f "$wrapperJarPath"
+ else
+ wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$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 \
+ $MAVEN_DEBUG_OPTS \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.home=${M2_HOME}" \
+ "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/mvnw.cmd b/mvnw.cmd
new file mode 100644
index 0000000..1d8ab01
--- /dev/null
+++ b/mvnw.cmd
@@ -0,0 +1,188 @@
+@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 "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
+if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\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/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
+
+FOR /F "usebackq 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%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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 "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
+if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\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%
+
+cmd /C exit /B %ERROR_CODE%
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..ee0f15b
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,220 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.4.12
+
+
+ com.xkrs
+ SmartUrbanRural
+ 0.0.1-SNAPSHOT
+ SmartUrbanRural
+ Demo project for Spring Boot
+
+ 5.19
+ 0.11.2
+ 4.5.12
+ 6.1.5.Final
+ 5.4.20.Final
+ UTF-8
+ UTF-8
+ 11
+ 11
+ 11
+ 1.2.76
+ 2.10.5
+ 2.10.5
+ 4.5.2
+ 2.0.4
+ 4.4.3
+ 0.4.0
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-logging
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-log4j2
+
+
+ org.apache.commons
+ commons-pool2
+
+
+ org.postgresql
+ postgresql
+
+
+ mysql
+ mysql-connector-java
+
+
+ io.jsonwebtoken
+ jjwt-api
+ ${jjwt.version}
+
+
+ io.jsonwebtoken
+ jjwt-impl
+ ${jjwt.version}
+ runtime
+
+
+ io.jsonwebtoken
+ jjwt-jackson
+ ${jjwt.version}
+ runtime
+
+
+ nl.basjes.parse.useragent
+ yauaa
+ ${yauaa.version}
+
+
+ org.apache.httpcomponents
+ httpmime
+ ${httpmime.version}
+
+
+ org.hibernate.validator
+ hibernate-validator
+ ${hibernate-validator.version}
+
+
+ org.hibernate
+ hibernate-spatial
+ ${hibernate-spatial.version}
+
+
+ com.alibaba
+ fastjson
+ ${fastjson.version}
+
+
+
+
+ io.springfox
+ springfox-swagger-ui
+ ${springfox-swagger-ui.version}
+
+
+
+ io.springfox
+ springfox-swagger2
+ ${springfox-swagger2.version}
+
+
+
+ net.sf.json-lib
+ json-lib
+ 2.4
+ jdk15
+
+
+ org.apache.httpcomponents
+ httpclient
+ ${httpclient.version}
+
+
+ cn.hutool
+ hutool-all
+ ${hutool-all.version}
+
+
+ io.tus.java.client
+ tus-java-client
+ ${tus-client.version}
+
+
+
+ org.springframework.boot
+ spring-boot-starter-activemq
+ 1.5.0.RELEASE
+
+
+
+ org.apache.activemq
+ activemq-pool
+ 5.15.0
+
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+ provided
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.properties
+ **/*.xml
+
+ false
+
+
+ src/main/resources
+
+ **/*.properties
+ **/*.xml
+ **/*.txt
+
+ false
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/src/main/java/com/xkrs/SmartUrbanRuralApplication.java b/src/main/java/com/xkrs/SmartUrbanRuralApplication.java
new file mode 100644
index 0000000..bb6377e
--- /dev/null
+++ b/src/main/java/com/xkrs/SmartUrbanRuralApplication.java
@@ -0,0 +1,20 @@
+package com.xkrs;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.jms.annotation.EnableJms;
+
+/**
+ * 启动类
+ * @author XinYi Song
+ **/
+@SpringBootApplication
+//启动消息队列
+@EnableJms
+public class SmartUrbanRuralApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SmartUrbanRuralApplication.class, args);
+ }
+
+}
diff --git a/src/main/java/com/xkrs/common/config/BeanConfig.java b/src/main/java/com/xkrs/common/config/BeanConfig.java
new file mode 100644
index 0000000..93c5458
--- /dev/null
+++ b/src/main/java/com/xkrs/common/config/BeanConfig.java
@@ -0,0 +1,70 @@
+package com.xkrs.common.config;
+
+/**
+ * @Author: XinYi Song
+ * @Date: 2022/2/8 14:16
+ */
+import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.activemq.command.ActiveMQQueue;
+import org.apache.activemq.command.ActiveMQTopic;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jms.config.JmsListenerContainerFactory;
+import org.springframework.jms.config.SimpleJmsListenerContainerFactory;
+import org.springframework.jms.core.JmsMessagingTemplate;
+import javax.jms.ConnectionFactory;
+import javax.jms.Queue;
+import javax.jms.Topic;
+
+@Configuration
+public class BeanConfig {
+
+ @Value("${spring.activemq.broker-url}")
+ private String brokerUrl;
+
+ @Value("${spring.activemq.user}")
+ private String username;
+
+ @Value("${spring.activemq.topic-name}")
+ private String password;
+
+ @Value("${spring.activemq.topic-name}")
+ private String topicName;
+
+ @Value("${spring.activemq.topic-name1}")
+ private String topicName1;
+
+ @Bean(name = "topic")
+ public Topic topic() {
+ return new ActiveMQTopic(topicName);
+ }
+
+ @Bean(name = "topic1")
+ public Topic topic1() {
+ return new ActiveMQTopic(topicName1);
+ }
+
+ @Bean
+ public ConnectionFactory connectionFactory(){
+ return new ActiveMQConnectionFactory(username, password, brokerUrl);
+ }
+
+ @Bean
+ public JmsMessagingTemplate jmsMessageTemplate(){
+ return new JmsMessagingTemplate(connectionFactory());
+ }
+
+ /**
+ * 在Topic模式中,对消息的监听需要对containerFactory进行配置
+ * @param connectionFactory
+ * @return
+ */
+ @Bean("topicListener")
+ public JmsListenerContainerFactory> topicJmsListenerContainerFactory(ConnectionFactory connectionFactory){
+ SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
+ factory.setConnectionFactory(connectionFactory);
+ factory.setPubSubDomain(true);
+ return factory;
+ }
+}
diff --git a/src/main/java/com/xkrs/common/config/CorsConfig.java b/src/main/java/com/xkrs/common/config/CorsConfig.java
new file mode 100644
index 0000000..7f8c32f
--- /dev/null
+++ b/src/main/java/com/xkrs/common/config/CorsConfig.java
@@ -0,0 +1,23 @@
+package com.xkrs.common.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import javax.annotation.Resource;
+
+/**
+ * 系统跨域配置
+ * @author tajochen
+ */
+@Configuration
+public class CorsConfig implements WebMvcConfigurer {
+
+ @Resource
+ private CorsInterceptor corsInterceptor;
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(corsInterceptor);
+ }
+}
diff --git a/src/main/java/com/xkrs/common/config/CorsInterceptor.java b/src/main/java/com/xkrs/common/config/CorsInterceptor.java
new file mode 100644
index 0000000..e2103c5
--- /dev/null
+++ b/src/main/java/com/xkrs/common/config/CorsInterceptor.java
@@ -0,0 +1,29 @@
+package com.xkrs.common.config;
+
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 跨域处理
+ * @author tajochen
+ */
+@Component
+public class CorsInterceptor implements HandlerInterceptor {
+
+ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+
+ //添加跨域CORS
+ response.setHeader("Access-Control-Allow-Origin", "*");
+ response.setHeader("Access-Control-Allow-Credentials", "false");
+ response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+ response.setHeader("Access-Control-Allow-Headers", "Content-Type , Authorization," +
+ "Accept,Origin,X-Requested-With");
+ response.setHeader("Access-Control-Max-Age", "216000");
+ response.setHeader("Content-Type","application/json;charset=UTF-8");
+ return true;
+ }
+}
+
diff --git a/src/main/java/com/xkrs/common/config/MvcConfig.java b/src/main/java/com/xkrs/common/config/MvcConfig.java
new file mode 100644
index 0000000..edce463
--- /dev/null
+++ b/src/main/java/com/xkrs/common/config/MvcConfig.java
@@ -0,0 +1,37 @@
+package com.xkrs.common.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.TaskScheduler;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * WebMVC配置
+ * @author Tajochen
+ */
+@Configuration
+public class MvcConfig implements WebMvcConfigurer {
+
+ /**
+ * 放行跨域请求
+ */
+ @Override
+ public void addCorsMappings(CorsRegistry registry) {
+ registry.addMapping("/**")
+ .allowedOrigins("*")
+ .allowedMethods("*")
+ .allowedHeaders("*");
+ }
+
+ /**
+ * 定时任务线程池更改,防止多个任务并行
+ */
+ @Bean
+ public TaskScheduler taskScheduler() {
+ final ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
+ scheduler.setPoolSize(5);
+ return scheduler;
+ }
+}
diff --git a/src/main/java/com/xkrs/common/encapsulation/EncapsulationObejct.java b/src/main/java/com/xkrs/common/encapsulation/EncapsulationObejct.java
new file mode 100644
index 0000000..e11fea7
--- /dev/null
+++ b/src/main/java/com/xkrs/common/encapsulation/EncapsulationObejct.java
@@ -0,0 +1,59 @@
+package com.xkrs.common.encapsulation;
+
+import java.io.Serializable;
+
+/**
+ * 输出信息对象
+ * @author tajochen
+ * @param
+ */
+public class EncapsulationObejct implements Serializable {
+
+ /**
+ * 状态码
+ */
+ int status;
+
+ /**
+ * 提示信息
+ */
+ String msg;
+
+ /**
+ * 数据
+ */
+ T data;
+
+ public int getStatus() {
+ return status;
+ }
+
+ public void setStatus(int status) {
+ this.status = status;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+
+ public void setMsg(String msg) {
+ this.msg = msg;
+ }
+
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+
+ @Override
+ public String toString() {
+ return "EncapsulationObejct{" +
+ "status=" + status +
+ ", msg='" + msg + '\'' +
+ ", data=" + data +
+ '}';
+ }
+}
diff --git a/src/main/java/com/xkrs/common/encapsulation/OutputEncapsulation.java b/src/main/java/com/xkrs/common/encapsulation/OutputEncapsulation.java
new file mode 100644
index 0000000..9bee083
--- /dev/null
+++ b/src/main/java/com/xkrs/common/encapsulation/OutputEncapsulation.java
@@ -0,0 +1,96 @@
+package com.xkrs.common.encapsulation;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.MessageSource;
+import org.springframework.context.support.ResourceBundleMessageSource;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.FieldError;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Properties;
+
+/**
+ * 输出信息封装
+ * @author tajochen
+ */
+@Component
+public class OutputEncapsulation {
+
+ private static final Logger logger = LoggerFactory.getLogger(OutputEncapsulation.class);
+
+ /**
+ * 读取多国语言文件
+ * @return
+ */
+ public static MessageSource messageSource() {
+ Properties properties = new Properties();
+ // 使用ClassLoader加载properties配置文件生成对应的输入流
+ InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("application.properties");
+ // 使用properties对象加载输入流
+ try {
+ properties.load(in);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
+ messageSource.setBasename("i18n/messages");
+ messageSource.setDefaultEncoding("UTF-8");
+ return messageSource;
+ }
+
+ /**
+ * 封装输出数据
+ * @param promptMessageEnum
+ * @param obj
+ * @return
+ */
+ public static String outputEncapsulationObject(PromptMessageEnum promptMessageEnum, Object obj, Locale locale) {
+
+ EncapsulationObejct encapsulationObejct = new EncapsulationObejct();
+ encapsulationObejct.setStatus(promptMessageEnum.getCode());
+ encapsulationObejct.setMsg(messageSource().getMessage(promptMessageEnum.getText(),null,locale));
+ encapsulationObejct.setData(obj);
+
+ ObjectMapper objectMapper = new ObjectMapper();
+ // 忽略无法转换的对象
+ objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false);
+ // 忽略json字符串中不识别的属性
+ objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ // 解决jackson无法反序列化LocalDateTime的问题,引入jsr310标准
+ JavaTimeModule javaTimeModule = new JavaTimeModule();
+ objectMapper.registerModule(javaTimeModule);
+ objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+ String strByEo = "";
+ try {
+ strByEo = objectMapper.writeValueAsString(encapsulationObejct);
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ logger.warn(e.toString());
+ }
+ return strByEo;
+ }
+
+ /**
+ * 输出请求值检验错误信息
+ * @param fieldErrors
+ * @return
+ */
+ public static String outputEncapsulationErrorList(List fieldErrors, Locale locale){
+ List errorMsg = new ArrayList<>();
+ for (FieldError fieldError : fieldErrors) {
+ String errMessage = fieldError.getDefaultMessage().subSequence(1,fieldError.getDefaultMessage().length()-1).toString();
+ errorMsg.add(messageSource().getMessage(errMessage,null,locale));
+ }
+ return outputEncapsulationObject(PromptMessageEnum.PARAM_ILLEGAL,errorMsg,locale);
+ }
+}
diff --git a/src/main/java/com/xkrs/common/encapsulation/PromptMessageEnum.java b/src/main/java/com/xkrs/common/encapsulation/PromptMessageEnum.java
new file mode 100644
index 0000000..74d5bdb
--- /dev/null
+++ b/src/main/java/com/xkrs/common/encapsulation/PromptMessageEnum.java
@@ -0,0 +1,65 @@
+package com.xkrs.common.encapsulation;
+
+/**
+ * 提示信息枚举
+ * @author tajochen
+ */
+public enum PromptMessageEnum{
+
+ // 执行成功
+ SUCCESS(0, "sys.message.success"),
+
+
+ // 用户权限错误或非法操作: 1001-1999
+ USER_NOT_LOGGED(1001, "sys.message.user.not_logged_in"),
+ USER_LOGIN_ERROR(1002, "sys.message.user.login_error"),
+ USER_ACCOUNT_FORBIDDEN(1003, "sys.message.user.account_forbidden"),
+ USER_ACCOUNT_NOT_ACTIVATED(1004, "sys.message.user.account_not_activated"),
+ USER_HAS_OVERTIME(1005, "sys.message.user.overtime"),
+ USER_NO_PERMISSION(1006,"sys.message.user.no_permission"),
+ USER_ALREADY_LOGGED(1007, "sys.message.user.already_logged"),
+
+ // 请求参数错误或非法:2001-2999
+ PARAM_NULL(2001, "sys.message.param.null"),
+ PARAM_ILLEGAL(2002, "sys.message.param.illegal"),
+
+ // 数据返回错误:3001-3999
+ DATA_NONE(3001, "sys.message.data.none"),
+
+ DATA_WRONG(3002, "sys.message.data.wrong"),
+ DATA_EXIT(3003,"sys.message.exit"),
+
+ // 操作失败:4001-4999
+ PROCESS_FAIL(4001,"sys.message.process.fail"),
+ PROCESS_OVERTIME(4002,"sys.message.process.overtime"),
+ FILE_EXISTS(4003,"sys.message.file.exists"),
+ FILE_WRITE_ERROR(4004,"sys.message.file.write.error"),
+ FILE_READ_ERROR(4005,"sys.message.file.read.error"),
+
+ // 系统内部错误或异常:5001-5999
+ SYSTEM_INNER_ERROR(5001,"sys.message.system.inner_error"),
+ SYSTEM_ABNORMAL(5002,"sys.message.system.abnormal"),
+ SYSTEM_BUSY(5003,"sys.message.system.busy"),
+ SYSTEM_MAINTAIN(5004,"sys.message.system.maintain"),
+
+ // 数据库错误:6001-6999
+ DATABASE_ERROR(6001,"sys.message.database.error");
+
+ private int code;
+
+ private String text;
+
+ private PromptMessageEnum(int code,String text) {
+ this.code = code;
+ this.text = text;
+ }
+
+ public String getText() {
+ return this.text;
+ }
+
+ public int getCode() {
+ return this.code;
+ }
+
+}
diff --git a/src/main/java/com/xkrs/common/tools/GetTokenTool.java b/src/main/java/com/xkrs/common/tools/GetTokenTool.java
new file mode 100644
index 0000000..7ed71db
--- /dev/null
+++ b/src/main/java/com/xkrs/common/tools/GetTokenTool.java
@@ -0,0 +1,48 @@
+package com.xkrs.common.tools;
+
+import com.alibaba.fastjson.JSONObject;
+import com.xkrs.util.Md5Util;
+import com.xkrs.util.RequestUtil;
+
+import java.util.Map;
+
+/**
+ * @Author: XinYi Song
+ * @Date: 2022/2/8 8:41
+ */
+public class GetTokenTool {
+ public static String getToken(){
+ String url1 = "https://111.26.161.203:443/admin/API/accounts/authorize";
+ String json1 = "{\n" +
+ " \"userName\": system,\n" +
+ " \"ipAddress\": \"\",\n" +
+ " \"clientType\": \"WINPC\"\n" +
+ "}";
+ // 第一次鉴权
+ String doPostJson = RequestUtil.doPostJson(url1, json1);
+ Map map = JackSonTool.json2map(doPostJson);
+ String randomKey = (String) map.get("randomKey");
+
+ String admin123 = Md5Util.stringToMd5("admin123");
+ String stringToMd5 = Md5Util.stringToMd5("system" + admin123);
+ String toMd5 = Md5Util.stringToMd5(stringToMd5);
+ String md5 = Md5Util.stringToMd5("system:" + "DSS:" + toMd5);
+ String signature = Md5Util.stringToMd5(md5 + ":" + randomKey);
+
+ String url2 = "https://111.26.161.203:443/admin/API/accounts/authorize";
+
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("userName","system");
+ jsonObject.put("randomKey",randomKey);
+ jsonObject.put("mac","");
+ jsonObject.put("encryptType","MD5");
+ jsonObject.put("ipAddress","");
+ jsonObject.put("signature",signature);
+ jsonObject.put("clientType","WINPC");
+ // 第二次鉴权
+ String postJson = RequestUtil.doPostJson(url2, jsonObject.toString());
+ Map map1 = JackSonTool.json2map(postJson);
+ String token = (String) map1.get("token");
+ return token;
+ }
+}
diff --git a/src/main/java/com/xkrs/common/tools/GetVideoTool.java b/src/main/java/com/xkrs/common/tools/GetVideoTool.java
new file mode 100644
index 0000000..3118cb0
--- /dev/null
+++ b/src/main/java/com/xkrs/common/tools/GetVideoTool.java
@@ -0,0 +1,58 @@
+package com.xkrs.common.tools;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.xkrs.util.RequestUtil;
+
+/**
+ * 获取视频连接
+ * @Author: XinYi Song
+ * @Date: 2022/2/9 16:25
+ */
+public class GetVideoTool {
+
+ public static String getVideo() throws JsonProcessingException {
+ String token = GetTokenTool.getToken();
+ String url = "https://111.26.161.203:443/admin/API/SS/Record/GetAlarmRecords?token=" + token;
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("clientType","WINPC_V1");
+ jsonObject.put("clientMac","30:9c:23:79:40:08");
+ jsonObject.put("clientPushId","");
+ jsonObject.put("project","PSDK");
+ jsonObject.put("method","SS.Record.GetAlarmRecords");
+ JSONObject jsonObject1 = new JSONObject();
+ jsonObject1.put("alarmCode","{8348AB45-93EF-E14B-BD85-F8FCB737C655}");
+ jsonObject1.put("optional","/admin/API/SS/Record/GetAlarmRecords");
+ jsonObject.put("data",jsonObject1);
+ String s = RequestUtil.doPostJson(url, jsonObject.toString());
+ ObjectMapper objectMapper = new ObjectMapper();
+ JsonNode jsonNode = objectMapper.readTree(s);
+ JsonNode data = jsonNode.get("data");
+ JsonNode records = data.get("records").get(0);
+
+ String urlVideo = "/admin/API/SS/Playback/StartPlaybackByFile?token=" + token;
+ JSONObject jsonObject2 = new JSONObject();
+ jsonObject2.put("ssId",records.get("ssId").asText());
+ jsonObject2.put("optional",urlVideo);
+ jsonObject2.put("fileName",records.get("recordName").asText());
+ jsonObject2.put("startTime",records.get("startTime").asText());
+ jsonObject2.put("endTime",records.get("endTime").asText());
+ jsonObject2.put("recordType",records.get("recordType").asText());
+ jsonObject2.put("diskId",records.get("diskId").asText());
+ jsonObject2.put("recordSource",records.get("recordSource").asText());
+ jsonObject2.put("channelId",records.get("channelId").asText());
+ jsonObject2.put("streamId",records.get("streamId").asText());
+ jsonObject2.put("enableRtsps","0");
+ jsonObject2.put("nvrId","");
+ JSONObject jsonObject3 = new JSONObject();
+ jsonObject3.put("data",jsonObject2);
+ String s1 = RequestUtil.doPostJson("https://111.26.161.203:443"+urlVideo, jsonObject3.toString());
+ ObjectMapper objectMapper1 = new ObjectMapper();
+ JsonNode jsonNode1 = objectMapper1.readTree(s1);
+ JsonNode data1 = jsonNode1.get("data");
+ String url1 = data1.get("url").asText();
+ return url1;
+ }
+}
diff --git a/src/main/java/com/xkrs/common/tools/JackSonTool.java b/src/main/java/com/xkrs/common/tools/JackSonTool.java
new file mode 100644
index 0000000..e174b4e
--- /dev/null
+++ b/src/main/java/com/xkrs/common/tools/JackSonTool.java
@@ -0,0 +1,174 @@
+package com.xkrs.common.tools;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.*;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * 序列化工具
+ * @author tajochen
+ */
+public class JackSonTool {
+
+ private static final Logger logger = LoggerFactory.getLogger(JackSonTool.class);
+
+ private JackSonTool() {
+ }
+
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+ static {
+ OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+ OBJECT_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ OBJECT_MAPPER.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
+ OBJECT_MAPPER.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
+ OBJECT_MAPPER.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
+ OBJECT_MAPPER.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
+ OBJECT_MAPPER.getSerializerProvider().setNullValueSerializer(new JsonSerializer<>() {
+ @Override
+ public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
+ jsonGenerator.writeString("");
+ }
+ });
+ // 解决jackson无法反序列化LocalDateTime的问题,引入jsr310标准
+ JavaTimeModule javaTimeModule = new JavaTimeModule();
+ OBJECT_MAPPER.registerModule(javaTimeModule);
+ OBJECT_MAPPER.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+ }
+
+ /**
+ * 序列化
+ * @param obj
+ * @param
+ * @return
+ */
+ public static String encode(T obj) {
+ if (Objects.isNull(obj)) {
+ return null;
+ }
+ try {
+ return OBJECT_MAPPER.writeValueAsString(obj);
+ } catch (Exception e) {
+ logger.error("json encode error, obj={}", obj, e);
+ return null;
+ }
+ }
+
+ /**
+ * 反序列化
+ * @param json
+ * @param valueType
+ * @param
+ * @return
+ */
+ public static T decode(String json, Class valueType) {
+ if (!json.isEmpty() && !Objects.isNull(valueType)) {
+ try {
+ return OBJECT_MAPPER.readValue(json, valueType);
+ } catch (Exception e) {
+ logger.error("json decode fail,jsonString={}, type={}", json, valueType.getName(), e);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 反序列化成list
+ * @param
+ * @param json
+ * @param clazz
+ * @return
+ */
+ public static List decode2List(String json, Class clazz) {
+ if (!json.isEmpty() && !Objects.isNull(clazz)) {
+ try {
+ return OBJECT_MAPPER.readValue(json, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));
+ } catch (Exception var3) {
+ logger.error("json decode2list fail,json={},classType={}", json, clazz.getName(), var3);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 字符串转换为 Map
+ *
+ * @param jsonString
+ * @return
+ * @throws Exception
+ */
+ public static Map json2map(String jsonString) {
+
+ try {
+ return OBJECT_MAPPER.readValue(jsonString, Map.class);
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * 字符串转换为 Map
+ */
+ public static Map json2map(String jsonString, Class clazz) {
+ Map map = null;
+ try {
+ map = OBJECT_MAPPER.readValue(jsonString, new TypeReference