ソースを参照

网易云翻译平台

jessie 5 年 前
コミット
3c4805a143
55 ファイル変更3017 行追加0 行削除
  1. 286 0
      mvnw
  2. 161 0
      mvnw.cmd
  3. 140 0
      pom.xml
  4. 13 0
      src/main/java/com/sprivacy/translate/ServletInitializer.java
  5. 12 0
      src/main/java/com/sprivacy/translate/TranslateApplication.java
  6. 15 0
      src/main/java/com/sprivacy/translate/common/annotation/Log.java
  7. 90 0
      src/main/java/com/sprivacy/translate/common/aspect/SysLogAspect.java
  8. 22 0
      src/main/java/com/sprivacy/translate/common/config/CorsConfig.java
  9. 43 0
      src/main/java/com/sprivacy/translate/common/config/SwaggerConfig.java
  10. 26 0
      src/main/java/com/sprivacy/translate/common/config/WebMvcConfig.java
  11. 24 0
      src/main/java/com/sprivacy/translate/common/exception/TranslateException.java
  12. 35 0
      src/main/java/com/sprivacy/translate/common/exception/TranslateExceptionHandler.java
  13. 51 0
      src/main/java/com/sprivacy/translate/common/http/TranslateResponse.java
  14. 33 0
      src/main/java/com/sprivacy/translate/common/http/TranslateResponseUtils.java
  15. 9 0
      src/main/java/com/sprivacy/translate/common/param/SysConfigParam.java
  16. 82 0
      src/main/java/com/sprivacy/translate/common/schedule/ScheduleJobBean.java
  17. 45 0
      src/main/java/com/sprivacy/translate/common/schedule/ScheduleRunnable.java
  18. 183 0
      src/main/java/com/sprivacy/translate/common/schedule/ScheduleUtils.java
  19. 33 0
      src/main/java/com/sprivacy/translate/common/utils/Constant.java
  20. 97 0
      src/main/java/com/sprivacy/translate/common/utils/DateUtils.java
  21. 28 0
      src/main/java/com/sprivacy/translate/common/utils/HttpContextUtils.java
  22. 65 0
      src/main/java/com/sprivacy/translate/common/utils/IpUtils.java
  23. 52 0
      src/main/java/com/sprivacy/translate/common/utils/Pdf2ImageUtils.java
  24. 42 0
      src/main/java/com/sprivacy/translate/common/utils/SpringContextUtils.java
  25. 30 0
      src/main/java/com/sprivacy/translate/modules/controller/TranslateController.java
  26. 77 0
      src/main/java/com/sprivacy/translate/modules/controller/UserController.java
  27. 90 0
      src/main/java/com/sprivacy/translate/modules/http/BackUser.java
  28. 27 0
      src/main/java/com/sprivacy/translate/modules/http/user/LoginUser.java
  29. 28 0
      src/main/java/com/sprivacy/translate/modules/jpa/ScheduleJobJpa.java
  30. 15 0
      src/main/java/com/sprivacy/translate/modules/jpa/ScheduleJobLogJpa.java
  31. 16 0
      src/main/java/com/sprivacy/translate/modules/jpa/SysLogJpa.java
  32. 23 0
      src/main/java/com/sprivacy/translate/modules/jpa/UserJpa.java
  33. 120 0
      src/main/java/com/sprivacy/translate/modules/model/ScheduleJob.java
  34. 115 0
      src/main/java/com/sprivacy/translate/modules/model/ScheduleJobLog.java
  35. 104 0
      src/main/java/com/sprivacy/translate/modules/model/SysLog.java
  36. 124 0
      src/main/java/com/sprivacy/translate/modules/model/User.java
  37. 57 0
      src/main/java/com/sprivacy/translate/modules/service/MailService.java
  38. 20 0
      src/main/java/com/sprivacy/translate/modules/service/ScheduleJobLogService.java
  39. 59 0
      src/main/java/com/sprivacy/translate/modules/service/ScheduleJobService.java
  40. 30 0
      src/main/java/com/sprivacy/translate/modules/service/UserService.java
  41. 121 0
      src/main/java/com/sprivacy/translate/modules/service/impl/MailServiceImpl.java
  42. 28 0
      src/main/java/com/sprivacy/translate/modules/service/impl/ScheduleJobLogServiceImpl.java
  43. 108 0
      src/main/java/com/sprivacy/translate/modules/service/impl/ScheduleJobServiceImpl.java
  44. 55 0
      src/main/java/com/sprivacy/translate/modules/service/impl/UserServiceImpl.java
  45. 7 0
      src/main/java/com/sprivacy/translate/modules/utils/TextUtils.java
  46. 9 0
      src/main/java/com/sprivacy/translate/properties/CommonProperties.java
  47. 9 0
      src/main/java/com/sprivacy/translate/properties/TranslateProperties.java
  48. 20 0
      src/main/resources/application-dev.yml
  49. 20 0
      src/main/resources/application-prod.yml
  50. 15 0
      src/main/resources/application-test.yml
  51. 23 0
      src/main/resources/application.yml
  52. 5 0
      src/main/resources/banner.txt
  53. 44 0
      src/main/resources/logback-spring.xml
  54. 12 0
      src/main/resources/templates/emailTemplate.html
  55. 19 0
      src/test/java/com/sprivacy/translate/TranslateApplicationTests.java

+ 286 - 0
mvnw

@@ -0,0 +1,286 @@
+#!/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
+#
+#    http://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.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven2 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)`"
+  # TODO classpath?
+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
+    jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
+    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 command -v wget > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found wget ... using wget"
+        fi
+        wget "$jarUrl" -O "$wrapperJarPath"
+    elif command -v curl > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found curl ... using curl"
+        fi
+        curl -o "$wrapperJarPath" "$jarUrl"
+    else
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Falling back to using Java to download"
+        fi
+        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+        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
+
+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 "$@"

+ 161 - 0
mvnw.cmd

@@ -0,0 +1,161 @@
+@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    http://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 Maven2 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 key stroke 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 my 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.4.2/maven-wrapper-0.4.2.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% (
+    echo Found %WRAPPER_JAR%
+) else (
+    echo Couldn't find %WRAPPER_JAR%, downloading it ...
+	echo Downloading from: %DOWNLOAD_URL%
+    powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"
+    echo Finished downloading %WRAPPER_JAR%
+)
+@REM End of extension
+
+%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%

+ 140 - 0
pom.xml

@@ -0,0 +1,140 @@
+<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>com.sprivacy</groupId>
+	<artifactId>translate</artifactId>
+	<version>1.0.0</version>
+	<packaging>war</packaging>
+
+	<name>translate</name>
+	<description>Demo project for Spring Boot</description>
+
+	<parent>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-parent</artifactId>
+		<version>2.1.1.RELEASE</version>
+		<relativePath/> <!-- lookup parent from repository -->
+	</parent>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+		<java.version>1.8</java.version>
+		<!-- swagger.version -->
+		<swagger.version>2.8.0</swagger.version>
+
+		<!-- icepdf.core.version -->
+		<icepdf.core.version>6.2.2</icepdf.core.version>
+
+		<!-- druid.spring.boot.version -->
+		<druid.spring.boot.version>1.1.10</druid.spring.boot.version>
+
+		<!-- commons.lang3.version -->
+		<commons.lang3.version>3.7</commons.lang3.version>
+
+		<!-- fastjson.version -->
+		<fastjson.version>1.2.47</fastjson.version>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-data-jpa</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-web</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+			<!--5.1.34-->
+			<version>5.1.34</version>
+			<!--<scope>runtime</scope>-->
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-tomcat</artifactId>
+			<!--<scope>provided</scope>-->
+		</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-quartz</artifactId>
+		</dependency>
+
+		<!-- swagger接口文档 -->
+		<dependency>
+			<groupId>io.springfox</groupId>
+			<artifactId>springfox-swagger2</artifactId>
+			<version>${swagger.version}</version>
+		</dependency>
+
+		<!-- swagger接口文档 -->
+		<dependency>
+			<groupId>io.springfox</groupId>
+			<artifactId>springfox-swagger-ui</artifactId>
+			<version>${swagger.version}</version>
+		</dependency>
+
+		<!-- icepdf-core PDF转JPG -->
+		<!--<dependency>-->
+			<!--<groupId>org.icepdf.os</groupId>-->
+			<!--<artifactId>icepdf-core</artifactId>-->
+			<!--<version>${icepdf.core.version}</version>-->
+		<!--</dependency>-->
+
+		<!-- druid-spring-boot-starter 阿里巴巴数据库连接池 -->
+		<dependency>
+			<groupId>com.alibaba</groupId>
+			<artifactId>druid-spring-boot-starter</artifactId>
+			<version>${druid.spring.boot.version}</version>
+		</dependency>
+
+		<!-- 常用工具包 -->
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-lang3</artifactId>
+			<version>${commons.lang3.version}</version>
+		</dependency>
+
+		<!-- 阿里巴巴fastjson -->
+		<dependency>
+			<groupId>com.alibaba</groupId>
+			<artifactId>fastjson</artifactId>
+			<version>${fastjson.version}</version>
+		</dependency>
+
+		<!-- springboot 发送邮件 jar包-->
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-mail</artifactId>
+		</dependency>
+
+		<!-- 邮件模板依赖包 -->
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-thymeleaf</artifactId>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+
+
+</project>

+ 13 - 0
src/main/java/com/sprivacy/translate/ServletInitializer.java

@@ -0,0 +1,13 @@
+package com.sprivacy.translate;
+
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+public class ServletInitializer extends SpringBootServletInitializer {
+
+	@Override
+	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+		return application.sources(TranslateApplication.class);
+	}
+
+}

+ 12 - 0
src/main/java/com/sprivacy/translate/TranslateApplication.java

@@ -0,0 +1,12 @@
+package com.sprivacy.translate;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class TranslateApplication {
+
+	public static void main(String[] args) {
+		SpringApplication.run(TranslateApplication.class, args);
+	}
+}

+ 15 - 0
src/main/java/com/sprivacy/translate/common/annotation/Log.java

@@ -0,0 +1,15 @@
+package com.sprivacy.translate.common.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-12-04 13:53
+ * @desc Log
+ **/
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface Log {
+    String value() default "";
+}

+ 90 - 0
src/main/java/com/sprivacy/translate/common/aspect/SysLogAspect.java

@@ -0,0 +1,90 @@
+package com.sprivacy.translate.common.aspect;
+
+import com.alibaba.fastjson.JSON;
+import com.sprivacy.translate.common.annotation.Log;
+import com.sprivacy.translate.common.utils.HttpContextUtils;
+import com.sprivacy.translate.common.utils.IpUtils;
+import com.sprivacy.translate.modules.jpa.SysLogJpa;
+import com.sprivacy.translate.modules.model.SysLog;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+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 guanhuijuan
+ * @create 2018-12-04 13:55
+ * @desc SysLogAspect
+ **/
+@Aspect
+@Component
+public class SysLogAspect {
+    private final static Logger LOGGER = LoggerFactory.getLogger(SysLogAspect.class);
+
+    @Autowired
+    private SysLogJpa sysLogJpa;
+
+    @Pointcut("@annotation(com.sprivacy.translate.common.annotation.Log)")
+    public void logPointCut() {
+    }
+
+    @Around("logPointCut()")
+    public Object around(ProceedingJoinPoint point) throws Throwable {
+        long beginTime = System.currentTimeMillis();
+        // 执行方法
+        Object result = point.proceed();
+        // 执行时长(毫秒)
+        long time = System.currentTimeMillis() - beginTime;
+        // 保存日志
+        saveSysLog(point, time);
+        return result;
+    }
+
+    private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+        Method method = signature.getMethod();
+
+        SysLog sysLog = new SysLog();
+
+        sysLog.setTime(time);
+
+        Log log = method.getAnnotation(Log.class);
+        if (log != null) {
+            // 注解上的描述
+            sysLog.setOperation(log.value());
+            LOGGER.info("Operation:" + log.value());
+        }
+
+        // 请求的方法名
+        String className = joinPoint.getTarget().getClass().getName();
+        String methodName = signature.getName();
+        sysLog.setMethod(className + "." + methodName + "()");
+        LOGGER.info("Method:" + className + "." + methodName + "()");
+
+        // 请求的参数
+        Object[] args = joinPoint.getArgs();
+        String params = JSON.toJSONString(args);
+        sysLog.setParams(params);
+        LOGGER.info("Params:" + params);
+
+        // 获取request
+        HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
+        // 设置IP地址
+        sysLog.setIp(IpUtils.getIpAddr(request));
+        LOGGER.info("IpAddr:" + IpUtils.getIpAddr(request));
+
+        // 日期
+        sysLog.setCreateAt(new Date());
+
+        sysLogJpa.save(sysLog);
+    }
+}

+ 22 - 0
src/main/java/com/sprivacy/translate/common/config/CorsConfig.java

@@ -0,0 +1,22 @@
+package com.sprivacy.translate.common.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-12-04 13:56
+ * @desc CorsConfig 跨域配置
+ **/
+@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);
+    }
+}

+ 43 - 0
src/main/java/com/sprivacy/translate/common/config/SwaggerConfig.java

@@ -0,0 +1,43 @@
+package com.sprivacy.translate.common.config;
+
+import io.swagger.annotations.ApiOperation;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-12-04 13:56
+ * @desc SwaggerConfig
+ **/
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+    @Bean
+    public Docket createRestApi() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())
+                .select()
+                // 加了ApiOperation注解的方法,生成接口文档
+                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+                // 包下的类,生成接口文档
+                .apis(RequestHandlerSelectors.basePackage("com.sprivacy.translate.modules.controller"))
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title("网易人工翻译 - 接口文档")
+                .description("网易人工翻译 - 接口文档")
+                // .termsOfServiceUrl("translate.s-privacy.com")
+                .version("2.0")
+                .build();
+    }
+}

+ 26 - 0
src/main/java/com/sprivacy/translate/common/config/WebMvcConfig.java

@@ -0,0 +1,26 @@
+package com.sprivacy.translate.common.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-12-04 14:01
+ * @desc WebMvcConfig
+ **/
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+
+    @Value("${translate.files-dir}")
+    private String filesDir;
+
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        // 对已上传的文件地址做映射访问
+        registry
+                .addResourceHandler("/files/**")
+                .addResourceLocations("file:" + filesDir);
+    }
+}

+ 24 - 0
src/main/java/com/sprivacy/translate/common/exception/TranslateException.java

@@ -0,0 +1,24 @@
+package com.sprivacy.translate.common.exception;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-12-04 14:02
+ * @desc TranslateException
+ **/
+public class TranslateException extends RuntimeException {
+
+    private Integer code;
+
+    public TranslateException(Integer code, String message) {
+        super(message);
+        this.code = code;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+}

+ 35 - 0
src/main/java/com/sprivacy/translate/common/exception/TranslateExceptionHandler.java

@@ -0,0 +1,35 @@
+package com.sprivacy.translate.common.exception;
+
+import com.sprivacy.translate.common.http.TranslateResponse;
+import com.sprivacy.translate.common.http.TranslateResponseUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-12-04 14:03
+ * @desc TranslateExceptionHandler
+ **/
+@ControllerAdvice
+public class TranslateExceptionHandler {
+    private final static Logger LOGGER = LoggerFactory.getLogger(TranslateException.class);
+
+    /**
+     * 处理自定义异常
+     *
+     * @param e 异常
+     * @return
+     */
+    @ExceptionHandler(TranslateException.class)
+    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
+    @ResponseBody
+    public TranslateResponse handleException(TranslateException e) {
+        LOGGER.error(e.getMessage(), e);
+        return TranslateResponseUtils.error(e.getMessage());
+    }
+}

+ 51 - 0
src/main/java/com/sprivacy/translate/common/http/TranslateResponse.java

@@ -0,0 +1,51 @@
+package com.sprivacy.translate.common.http;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-12-04 14:04
+ * @desc TranslateResponse
+ **/
+public class TranslateResponse<T> {
+    private Integer code;
+    private String message;
+    private T data;
+
+    public TranslateResponse(Integer code, String message, T data) {
+        this.code = code;
+        this.message = message;
+        this.data = data;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+    @Override
+    public String toString() {
+        return "ManageResponse{" +
+                "code=" + code +
+                ", message='" + message + '\'' +
+                ", data=" + data +
+                '}';
+    }
+}

+ 33 - 0
src/main/java/com/sprivacy/translate/common/http/TranslateResponseUtils.java

@@ -0,0 +1,33 @@
+package com.sprivacy.translate.common.http;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-12-04 14:05
+ * @desc TranslateResponseUtils
+ **/
+public class TranslateResponseUtils {
+    public static TranslateResponse<Object> success(int code, String message, Object object) {
+        return new TranslateResponse<>(code, message, object);
+    }
+
+    public static TranslateResponse<String> success(int code, String message, String string) {
+        return new TranslateResponse<>(code, message, string);
+    }
+
+    public static TranslateResponse<Object> success(String message, Object object) {
+        return success(1, message, object);
+    }
+
+    public static TranslateResponse<Object> success(Object object) {
+        return success("操作成功", object);
+    }
+
+    public static TranslateResponse<Object> error(int code, String message) {
+        return new TranslateResponse<>(code, message, null);
+    }
+
+    public static TranslateResponse<Object> error(String message) {
+        return error(0, message);
+    }
+
+}

+ 9 - 0
src/main/java/com/sprivacy/translate/common/param/SysConfigParam.java

@@ -0,0 +1,9 @@
+package com.sprivacy.translate.common.param;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-12-04 14:07
+ * @desc SysConfigParam
+ **/
+public class SysConfigParam {
+}

+ 82 - 0
src/main/java/com/sprivacy/translate/common/schedule/ScheduleJobBean.java

@@ -0,0 +1,82 @@
+package com.sprivacy.translate.common.schedule;
+
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import com.sprivacy.translate.common.utils.SpringContextUtils;
+import com.sprivacy.translate.modules.model.ScheduleJob;
+import com.sprivacy.translate.modules.model.ScheduleJobLog;
+import com.sprivacy.translate.modules.service.ScheduleJobLogService;
+import org.apache.commons.lang3.StringUtils;
+import org.quartz.JobExecutionContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+import java.util.Date;
+import java.util.concurrent.*;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-12-04 14:09
+ * @desc ScheduleJobBean
+ **/
+public class ScheduleJobBean extends QuartzJobBean {
+
+    private final static Logger LOGGER = LoggerFactory.getLogger(ScheduleJobBean.class);
+
+    /**
+     * 手动创建线程池
+     */
+    private ThreadFactory factory = new ThreadFactoryBuilder().setNameFormat("tmp-service-pool-%d").build();
+    private ExecutorService service = new ThreadPoolExecutor(
+            1,
+            1,
+            0L,
+            TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(1024), factory, new ThreadPoolExecutor.AbortPolicy());
+
+    @Override
+    protected void executeInternal(JobExecutionContext jobExecutionContext) {
+
+        ScheduleJob scheduleJob = (ScheduleJob) jobExecutionContext.getMergedJobDataMap().get(ScheduleJob.JOB_PARAM_KEY);
+        // 获取spring bean
+        ScheduleJobLogService scheduleJobLogService = (ScheduleJobLogService) SpringContextUtils.getBean("scheduleJobLogService");
+
+        // 数据库保存执行记录
+        ScheduleJobLog log = new ScheduleJobLog();
+        log.setJobId(scheduleJob.getJobId());
+        log.setBeanName(scheduleJob.getBeanName());
+        log.setMethodName(scheduleJob.getMethodName());
+        log.setParams(scheduleJob.getParams());
+        log.setCreateAt(new Date());
+
+        // 任务开始时间
+        long startTime = System.currentTimeMillis();
+
+        try {
+            // 执行任务
+            LOGGER.info("任务准备执行,任务ID:" + scheduleJob.getJobId());
+            ScheduleRunnable task = new ScheduleRunnable(scheduleJob.getBeanName(),
+                    scheduleJob.getMethodName(), scheduleJob.getParams());
+            Future<?> future = service.submit(task);
+            future.get();
+            // 任务执行总时长
+            long times = System.currentTimeMillis() - startTime;
+            log.setTimes((int) times);
+            // 任务状态 0:成功    1:失败
+            log.setStatus(0);
+
+            LOGGER.info("任务执行完毕,任务ID:" + scheduleJob.getJobId() + "  总共耗时:" + times + "毫秒");
+        } catch (Exception e) {
+            LOGGER.error("任务执行失败,任务ID:" + scheduleJob.getJobId(), e);
+
+            // 任务执行总时长
+            long times = System.currentTimeMillis() - startTime;
+            log.setTimes((int) times);
+
+            // 任务状态 0:成功    1:失败
+            log.setStatus(1);
+            log.setError(StringUtils.substring(e.toString(), 0, 2000));
+        } finally {
+            scheduleJobLogService.insert(log);
+        }
+    }
+}

+ 45 - 0
src/main/java/com/sprivacy/translate/common/schedule/ScheduleRunnable.java

@@ -0,0 +1,45 @@
+package com.sprivacy.translate.common.schedule;
+
+import com.sprivacy.translate.common.exception.TranslateException;
+import com.sprivacy.translate.common.utils.SpringContextUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.util.ReflectionUtils;
+
+import java.lang.reflect.Method;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-12-04 14:14
+ * @desc ScheduleRunnable
+ **/
+public class ScheduleRunnable implements Runnable {
+
+    private Object target;
+    private Method method;
+    private String params;
+
+    public ScheduleRunnable(String beanName, String methodName, String params) throws NoSuchMethodException, SecurityException {
+        this.target = SpringContextUtils.getBean(beanName);
+        this.params = params;
+        if (StringUtils.isNotBlank(params)) {
+            this.method = target.getClass().getDeclaredMethod(methodName, String.class);
+        } else {
+            this.method = target.getClass().getDeclaredMethod(methodName);
+        }
+    }
+
+
+    @Override
+    public void run() {
+        try {
+            ReflectionUtils.makeAccessible(method);
+            if (StringUtils.isNotBlank(params)) {
+                method.invoke(target, params);
+            } else {
+                method.invoke(target);
+            }
+        } catch (Exception e) {
+            throw new TranslateException(500, "定时任务执行失败");
+        }
+    }
+}

+ 183 - 0
src/main/java/com/sprivacy/translate/common/schedule/ScheduleUtils.java

@@ -0,0 +1,183 @@
+package com.sprivacy.translate.common.schedule;
+
+
+import com.sprivacy.translate.common.exception.TranslateException;
+import com.sprivacy.translate.common.utils.Constant;
+import com.sprivacy.translate.modules.model.ScheduleJob;
+import org.quartz.*;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-12-04 14:14
+ * @desc ScheduleUtils
+ **/
+public class ScheduleUtils {
+    private final static String JOB_NAME = "TASK_";
+
+    /**
+     * 获取触发器key
+     *
+     * @param jobId
+     * @return
+     */
+    public static TriggerKey getTriggerKey(Long jobId) {
+        return TriggerKey.triggerKey(JOB_NAME + jobId);
+    }
+
+
+    /**
+     * 获取jobKey
+     *
+     * @param jobId
+     * @return
+     */
+    public static JobKey getJobKey(Long jobId) {
+        return JobKey.jobKey(JOB_NAME + jobId);
+    }
+
+
+    /**
+     * 获取表达式触发器
+     *
+     * @param scheduler
+     * @param jobId
+     * @return
+     */
+    public static CronTrigger getCronTrigger(Scheduler scheduler, Long jobId) {
+        try {
+            return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId));
+        } catch (SchedulerException e) {
+            throw new TranslateException(500, "获取定时任务CronTrigger出现异常");
+        }
+    }
+
+
+    /**
+     * 创建定时任务
+     *
+     * @param scheduler
+     * @param scheduleJob
+     */
+    public static void createScheduleJob(Scheduler scheduler, ScheduleJob scheduleJob) {
+        try {
+            // 构建job信息
+            JobDetail jobDetail = JobBuilder.newJob(ScheduleJobBean.class).withIdentity(getJobKey(scheduleJob.getJobId())).build();
+
+            // 表达式调度构建器
+            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
+                    .withMisfireHandlingInstructionDoNothing();
+
+            // 按新的cronExpression表达式构建一个新的trigger
+            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob.getJobId())).withSchedule(scheduleBuilder).build();
+
+            // 放入参数,运行时的方法可以获取
+            jobDetail.getJobDataMap().put(ScheduleJob.JOB_PARAM_KEY, scheduleJob);
+
+            scheduler.scheduleJob(jobDetail, trigger);
+
+            // 暂停任务
+            if (scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()) {
+                pauseJob(scheduler, scheduleJob.getJobId());
+            }
+        } catch (SchedulerException e) {
+            throw new TranslateException(500, "定时任务创建失败");
+        }
+    }
+
+
+    /**
+     * 更新定时任务
+     *
+     * @param scheduler
+     * @param scheduleJob
+     */
+    public static void updateScheduleJob(Scheduler scheduler, ScheduleJob scheduleJob) {
+        try {
+            TriggerKey triggerKey = getTriggerKey(scheduleJob.getJobId());
+
+            // 表达式调度构建器
+            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
+                    .withMisfireHandlingInstructionDoNothing();
+
+            CronTrigger trigger = getCronTrigger(scheduler, scheduleJob.getJobId());
+
+            // 按新的cronExpression表达式重新构建trigger
+            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
+
+            // 参数
+            trigger.getJobDataMap().put(ScheduleJob.JOB_PARAM_KEY, scheduleJob);
+
+            scheduler.rescheduleJob(triggerKey, trigger);
+
+            // 暂停任务
+            if (scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()) {
+                pauseJob(scheduler, scheduleJob.getJobId());
+            }
+
+        } catch (SchedulerException e) {
+            throw new TranslateException(500, "定时任务更新失败");
+        }
+    }
+
+    /**
+     * 立即执行任务
+     *
+     * @param scheduler
+     * @param scheduleJob
+     */
+    public static void run(Scheduler scheduler, ScheduleJob scheduleJob) {
+        try {
+            //参数
+            JobDataMap dataMap = new JobDataMap();
+            dataMap.put(ScheduleJob.JOB_PARAM_KEY, scheduleJob);
+
+            scheduler.triggerJob(getJobKey(scheduleJob.getJobId()), dataMap);
+        } catch (SchedulerException e) {
+            throw new TranslateException(500, "定时任务立即执行失败");
+        }
+    }
+
+
+    /**
+     * 暂停任务
+     *
+     * @param scheduler
+     * @param jobId
+     */
+    public static void pauseJob(Scheduler scheduler, Long jobId) {
+        try {
+            scheduler.pauseJob(getJobKey(jobId));
+        } catch (SchedulerException e) {
+            throw new TranslateException(500, "定时任务暂停失败");
+        }
+    }
+
+
+    /**
+     * 恢复任务
+     *
+     * @param scheduler
+     * @param jobId
+     */
+    public static void resumeJob(Scheduler scheduler, Long jobId) {
+        try {
+            scheduler.resumeJob(getJobKey(jobId));
+        } catch (SchedulerException e) {
+            throw new TranslateException(500, "定时任务恢复失败");
+        }
+    }
+
+    /**
+     * 删除定时任务
+     *
+     * @param scheduler
+     * @param jobId
+     */
+    public static void deleteScheduleJob(Scheduler scheduler, Long jobId) {
+        try {
+            scheduler.deleteJob(getJobKey(jobId));
+        } catch (SchedulerException e) {
+            throw new TranslateException(500, "定时任务删除失败");
+        }
+    }
+}

+ 33 - 0
src/main/java/com/sprivacy/translate/common/utils/Constant.java

@@ -0,0 +1,33 @@
+package com.sprivacy.translate.common.utils;
+
+/**
+ * @Author: guanhuijuan
+ * @Description: 常量
+ * @Date: 2018/11/21_11:26
+ */
+public class Constant {
+
+    /**
+     * 定时任务状态
+     */
+    public enum ScheduleStatus {
+        /**
+         * 正常
+         */
+        NORMAL(0),
+        /**
+         * 暂停
+         */
+        PAUSE(1);
+
+        private int value;
+
+        ScheduleStatus(int value) {
+            this.value = value;
+        }
+
+        public int getValue() {
+            return value;
+        }
+    }
+}

+ 97 - 0
src/main/java/com/sprivacy/translate/common/utils/DateUtils.java

@@ -0,0 +1,97 @@
+package com.sprivacy.translate.common.utils;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Author: guanhuijuan
+ * @Description: DateUtils 日期时间工具类
+ * @Date: 2018/11/21_11:25
+ */
+public class DateUtils {
+
+    /**
+     * 获取当前格式化日期
+     *
+     * @return String
+     */
+    public static String getCurrentFromatDate() {
+        Date currentDate = new Date();
+        DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        return format.format(currentDate);
+    }
+
+    /**
+     * 获取当前格式化时间
+     *
+     * @return String
+     */
+    public static String getCurrentFromatTime() {
+        Date currentTime = new Date();
+        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return format.format(currentTime);
+    }
+
+    /**
+     * 将指定日期格式化
+     *
+     * @param date 指定格式化的日期
+     * @return String
+     */
+    public static String getFromatDate(Date date) {
+        DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        return format.format(date);
+    }
+
+    /**
+     * 将指定日期格式化
+     *
+     * @param date 指定格式化的时间
+     * @return String
+     */
+    public static String getFromatTime(Date date) {
+        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return format.format(date);
+    }
+
+    /**
+     * 将日期字符串转换成日期类型
+     *
+     * @param date 字符串日期
+     * @return Date
+     */
+    public static Date getDate(String date) {
+        DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            return format.parse(date);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 获取时间
+     *
+     * @param startTime
+     * @param endTime
+     * @return Map<String, Long>
+     */
+    public static Map<String, Long> getDistanceTimes(long startTime, long endTime) {
+        long diff = endTime - startTime;
+        long day = diff / (24 * 60 * 60 * 1000);
+        long hour = (diff / (60 * 60 * 1000) - day * 24);
+        long min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);
+        long sec = (diff / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
+        Map<String, Long> map = new HashMap<>();
+        map.put("day", day);
+        map.put("hour", hour);
+        map.put("min", min);
+        map.put("sec", sec);
+        return map;
+    }
+}

+ 28 - 0
src/main/java/com/sprivacy/translate/common/utils/HttpContextUtils.java

@@ -0,0 +1,28 @@
+package com.sprivacy.translate.common.utils;
+
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @Author: guanhuijuan
+ * @Description: HttpContext工具类
+ * @Date: 2018/11/21_11:25
+ */
+public class HttpContextUtils {
+    public static HttpServletRequest getHttpServletRequest() {
+        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+    }
+
+    public static String getDomain(){
+        HttpServletRequest request = getHttpServletRequest();
+        StringBuffer url = request.getRequestURL();
+        return url.delete(url.length() - request.getRequestURI().length(), url.length()).toString();
+    }
+
+    public static String getOrigin(){
+        HttpServletRequest request = getHttpServletRequest();
+        return request.getHeader("Origin");
+    }
+}

+ 65 - 0
src/main/java/com/sprivacy/translate/common/utils/IpUtils.java

@@ -0,0 +1,65 @@
+package com.sprivacy.translate.common.utils;
+
+import com.alibaba.druid.util.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @Author: guanhuijuan
+ * @Description: IP地址工具类
+ * @Date: 2018/11/21_11:25
+ */
+public class IpUtils {
+
+    private final static Logger LOGGER = LoggerFactory.getLogger(IpUtils.class);
+
+    private final static String UNKNOWN = "unknown";
+
+    private final static int IP_LENGTH = 15;
+
+    private final static String COMMA = ",";
+
+    /**
+     * 获取IP地址
+     * <p>
+     * 使用Nginx等反向代理软件,则不能通过request.getRemoteAddr()获取IP地址
+     * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址
+     *
+     * @param request
+     * @return
+     */
+    public static String getIpAddr(HttpServletRequest request) {
+        String ip = null;
+        try {
+            ip = request.getHeader("x-forwarded-for");
+            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getHeader("Proxy-Client-IP");
+            }
+            if (StringUtils.isEmpty(ip) || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getHeader("WL-Proxy-Client-IP");
+            }
+            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getHeader("HTTP_CLIENT_IP");
+            }
+            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+            }
+            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getRemoteAddr();
+            }
+        } catch (Exception e) {
+            LOGGER.error("IpUtils Error:", e);
+        }
+
+       // 使用代理,则获取第一个IP地址
+       // if(!StringUtils.isEmpty(ip) && ip.length() > IP_LENGTH) {
+		// 	if(ip.indexOf(COMMA) > 0) {
+		// 		ip = ip.substring(0, ip.indexOf(","));
+		// 	}
+		// }
+
+        return ip;
+    }
+}

+ 52 - 0
src/main/java/com/sprivacy/translate/common/utils/Pdf2ImageUtils.java

@@ -0,0 +1,52 @@
+// package com.sprivacy.translate.common.utils;
+//
+// import org.icepdf.core.pobjects.Document;
+// import org.icepdf.core.pobjects.Page;
+// import org.icepdf.core.util.GraphicsRenderingHints;
+// import org.springframework.stereotype.Component;
+//
+// import java.awt.image.BufferedImage;
+// import java.util.ArrayList;
+// import java.util.List;
+//
+// /**
+//  * @Author: guanhuijuan
+//  * @Description: PDF转图片工具类
+//  * @Date: 2018/11/21_11:25
+//  */
+// @Component
+// public class Pdf2ImageUtils {
+//
+//     /**
+//      * pdf文件转成图片
+//      *
+//      * @param pdfPath pdf文件路径
+//      * @param zoom    缩放大小
+//      * @return
+//      * @throws Exception
+//      */
+//     public static List<BufferedImage> tranfer(String pdfPath, float zoom) throws Exception {
+//         List<BufferedImage> bufferedImages = new ArrayList<>();
+//         float rotation = 0f;
+//         // ICEpdf 文件类
+//         Document document = new Document();
+//         document.setFile(pdfPath);
+//         int pageSize = document.getNumberOfPages();
+//         if (pageSize > 0) {
+//             for (int i = 0; i < pageSize; i++) {
+//                 BufferedImage bufferedImage = (BufferedImage) document.getPageImage(
+//                         i,
+//                         GraphicsRenderingHints.SCREEN,
+//                         Page.BOUNDARY_CROPBOX,
+//                         rotation,
+//                         zoom);
+//                 bufferedImages.add(bufferedImage);
+//             }
+//         }
+//         document.dispose();
+//         if (bufferedImages.size() == pageSize) {
+//             return bufferedImages;
+//         }
+//         return null;
+//     }
+// }

+ 42 - 0
src/main/java/com/sprivacy/translate/common/utils/SpringContextUtils.java

@@ -0,0 +1,42 @@
+package com.sprivacy.translate.common.utils;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author fanglang
+ * @date 2018-05-31 15:01
+ * @desc 上下文工具
+ */
+@Component
+public class SpringContextUtils implements ApplicationContextAware {
+
+    public static ApplicationContext applicationContext;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        SpringContextUtils.applicationContext = applicationContext;
+    }
+
+    public static Object getBean(String name) {
+        return applicationContext.getBean(name);
+    }
+
+    public static <T> T getBean(String name, Class<T> requiredType) {
+        return applicationContext.getBean(name, requiredType);
+    }
+
+    public static boolean containsBean(String name) {
+        return applicationContext.containsBean(name);
+    }
+
+    public static boolean isSingleton(String name) {
+        return applicationContext.isSingleton(name);
+    }
+
+    public static Class<? extends Object> getType(String name) {
+        return applicationContext.getType(name);
+    }
+}

+ 30 - 0
src/main/java/com/sprivacy/translate/modules/controller/TranslateController.java

@@ -0,0 +1,30 @@
+package com.sprivacy.translate.modules.controller;
+
+import com.sprivacy.translate.common.http.TranslateResponse;
+import com.sprivacy.translate.common.http.TranslateResponseUtils;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-12-04 15:08
+ * @desc TranslateController
+ **/
+@RestController
+@RequestMapping(value = "/translate")
+public class TranslateController {
+    private final static Logger LOGGER = LoggerFactory.getLogger(TranslateController.class);
+
+    @ApiOperation("网易人工翻译vendor")
+    @GetMapping(value = "/get")
+    public TranslateResponse<String> getUser() {
+        // String vendorStr = "https://f.youdao.com/activity.do?method=newUserCoupon&vendor=s-privacy";
+        String vendorStr = "https://f.youdao.com/activity.do?method=vendorCoupon&vendor=s-privacy";
+        return TranslateResponseUtils.success(1,"获取成功",vendorStr);
+    }
+
+}

+ 77 - 0
src/main/java/com/sprivacy/translate/modules/controller/UserController.java

@@ -0,0 +1,77 @@
+package com.sprivacy.translate.modules.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.sprivacy.translate.common.http.TranslateResponse;
+import com.sprivacy.translate.common.http.TranslateResponseUtils;
+import com.sprivacy.translate.modules.http.BackUser;
+import com.sprivacy.translate.modules.http.user.LoginUser;
+import com.sprivacy.translate.modules.model.User;
+import com.sprivacy.translate.modules.service.UserService;
+import com.sprivacy.translate.modules.utils.TextUtils;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-11-21 17:46
+ * @desc UserController
+ **/
+@RestController
+@RequestMapping(value = "/user")
+public class UserController {
+    private final static Logger LOGGER = LoggerFactory.getLogger(UserController.class);
+
+    @Autowired
+    private UserService userService;
+
+    @ApiOperation("获取用户信息")
+    @GetMapping(value = "/get/info")
+    public TranslateResponse<Object> getUser() {
+        List<User> users = userService.getUserInfo();
+        if (null != users && users.size() > 0) {
+            return TranslateResponseUtils.success(users);
+        } else {
+            return TranslateResponseUtils.error("获取用户信息失败");
+        }
+    }
+
+    @ApiOperation("用户登录")
+    @PostMapping(value = "/login")
+    public TranslateResponse<Object> login(@RequestBody LoginUser loginUser) {
+        LOGGER.info("START LOGIN...");
+        TranslateResponseUtils.error(0,"登录失败");
+        if (!TextUtils.isEmpty(loginUser.getUserName()) && !TextUtils.isEmpty(loginUser.getPasswd())){
+            BackUser backUser = userService.login(loginUser.getUserName(),loginUser.getPasswd());
+            if (null != backUser) {
+                LOGGER.info("END LOGIN...");
+                return TranslateResponseUtils.success(1,"用户名/密码正确,登录成功",backUser);
+            } else {
+                LOGGER.info("END LOGIN...");
+                return TranslateResponseUtils.error(0,"登录失败,用户名或密码错误");
+            }
+        }else {
+            LOGGER.info("END LOGIN...");
+            return TranslateResponseUtils.error(0,"登录失败,用户名或密码为空");
+        }
+
+    }
+
+    @ApiOperation("测试JDBC-Jmeter")
+    @PostMapping("/test/jdbc/jmeter")
+    public TranslateResponse<Object> mod(@RequestBody LoginUser loginUser) {
+        System.err.println("请求成功!"+ JSON.toJSONString(loginUser));
+        return TranslateResponseUtils.success("当前登录用户 "+loginUser.getUserName()+" 的邮箱为:"+loginUser.getPasswd());
+    }
+
+    @ApiOperation("测试JDBC-Jmeter")
+    @GetMapping("/getUserInfos")
+    public TranslateResponse<Object> getUserInfos() {
+        System.err.println("请求成功!");
+        return TranslateResponseUtils.success("获取用户信息失败");
+    }
+}

+ 90 - 0
src/main/java/com/sprivacy/translate/modules/http/BackUser.java

@@ -0,0 +1,90 @@
+package com.sprivacy.translate.modules.http;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-12-04 15:18
+ * @desc BackUser
+ **/
+public class BackUser {
+    private Integer id;
+    private String userName;
+    private String nickName;
+    private String telephone;
+    private String email;
+    private Integer authority;
+    private String department;
+    private String createAt;
+    private String updateAt;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getNickName() {
+        return nickName;
+    }
+
+    public void setNickName(String nickName) {
+        this.nickName = nickName;
+    }
+
+    public String getTelephone() {
+        return telephone;
+    }
+
+    public void setTelephone(String telephone) {
+        this.telephone = telephone;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public Integer getAuthority() {
+        return authority;
+    }
+
+    public void setAuthority(Integer authority) {
+        this.authority = authority;
+    }
+
+    public String getDepartment() {
+        return department;
+    }
+
+    public void setDepartment(String department) {
+        this.department = department;
+    }
+
+    public String getCreateAt() {
+        return createAt;
+    }
+
+    public void setCreateAt(String createAt) {
+        this.createAt = createAt;
+    }
+
+    public String getUpdateAt() {
+        return updateAt;
+    }
+
+    public void setUpdateAt(String updateAt) {
+        this.updateAt = updateAt;
+    }
+}

+ 27 - 0
src/main/java/com/sprivacy/translate/modules/http/user/LoginUser.java

@@ -0,0 +1,27 @@
+package com.sprivacy.translate.modules.http.user;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-12-04 15:17
+ * @desc LoginUser
+ **/
+public class LoginUser {
+    private String userName;
+    private String passwd;
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getPasswd() {
+        return passwd;
+    }
+
+    public void setPasswd(String passwd) {
+        this.passwd = passwd;
+    }
+}

+ 28 - 0
src/main/java/com/sprivacy/translate/modules/jpa/ScheduleJobJpa.java

@@ -0,0 +1,28 @@
+package com.sprivacy.translate.modules.jpa;
+
+import com.sprivacy.translate.modules.model.ScheduleJob;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.io.Serializable;
+
+/**
+ * @Author: guanhuijuan
+ * @Description: ScheduleJobJpa
+ * @Date: 2018/11/21_11:31
+ */
+public interface ScheduleJobJpa extends Serializable, JpaRepository<ScheduleJob, Long>, JpaSpecificationExecutor<ScheduleJob> {
+    /**
+     * 根据jobId更新Status
+     *
+     * @param jodId
+     * @param status
+     * @return
+     */
+    @Modifying
+    @Query("update ScheduleJob sj set sj.status = :status where sj.jobId = :jobId")
+    void updateStatusByJobId(@Param("jobId") long jodId, @Param("status") int status);
+}

+ 15 - 0
src/main/java/com/sprivacy/translate/modules/jpa/ScheduleJobLogJpa.java

@@ -0,0 +1,15 @@
+package com.sprivacy.translate.modules.jpa;
+
+import com.sprivacy.translate.modules.model.ScheduleJobLog;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+import java.io.Serializable;
+
+/**
+ * @Author: guanhuijuan
+ * @Description: ScheduleJobLogJpa
+ * @Date: 2018/11/21_11:31
+ */
+public interface ScheduleJobLogJpa extends Serializable, JpaRepository<ScheduleJobLog, Long>, JpaSpecificationExecutor<ScheduleJobLog> {
+}

+ 16 - 0
src/main/java/com/sprivacy/translate/modules/jpa/SysLogJpa.java

@@ -0,0 +1,16 @@
+package com.sprivacy.translate.modules.jpa;
+
+
+import com.sprivacy.translate.modules.model.SysLog;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+import java.io.Serializable;
+
+/**
+ * @Author: guanhuijuan
+ * @Description: SysLogJpa
+ * @Date: 2018/11/21_11:24
+ */
+public interface SysLogJpa extends Serializable, JpaRepository<SysLog, Long>, JpaSpecificationExecutor<SysLog> {
+}

+ 23 - 0
src/main/java/com/sprivacy/translate/modules/jpa/UserJpa.java

@@ -0,0 +1,23 @@
+package com.sprivacy.translate.modules.jpa;
+
+import com.sprivacy.translate.modules.model.User;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-11-21 18:00
+ * @desc UserJpa
+ **/
+public interface UserJpa extends Serializable, JpaRepository<User,Long>, JpaSpecificationExecutor<User> {
+
+    /**
+     * 根据用户名查找用户列表
+     * @param userName
+     * @return User
+     */
+    User findByUserName(String userName);
+}

+ 120 - 0
src/main/java/com/sprivacy/translate/modules/model/ScheduleJob.java

@@ -0,0 +1,120 @@
+package com.sprivacy.translate.modules.model;
+
+import javax.persistence.*;
+import java.util.Date;
+
+/**
+ * @Author: guanhuijuan
+ * @Description: ScheduleJob
+ * @Date: 2018/11/21_11:31
+ */
+@Entity
+@Table(name = "schedule_job")
+public class ScheduleJob {
+
+    /**
+     * 任务调度参数key
+     */
+    public static final String JOB_PARAM_KEY = "JOB_PARAM_KEY";
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "job_id")
+    private Long jobId;
+
+    @Column(name = "bean_name")
+    private String beanName;
+
+    @Column(name = "method_name")
+    private String methodName;
+
+    @Column(name = "params")
+    private String params;
+
+    @Column(name = "cron_expression")
+    private String cronExpression;
+
+    @Column(name = "status")
+    private Integer status;
+
+    @Column(name = "remark")
+    private String remark;
+
+    @Column(name = "create_by")
+    private Long createBy;
+
+    @Column(name = "create_at")
+    private Date createAt;
+
+    public Long getJobId() {
+        return jobId;
+    }
+
+    public void setJobId(Long jobId) {
+        this.jobId = jobId;
+    }
+
+    public String getBeanName() {
+        return beanName;
+    }
+
+    public void setBeanName(String beanName) {
+        this.beanName = beanName;
+    }
+
+    public String getMethodName() {
+        return methodName;
+    }
+
+    public void setMethodName(String methodName) {
+        this.methodName = methodName;
+    }
+
+    public String getParams() {
+        return params;
+    }
+
+    public void setParams(String params) {
+        this.params = params;
+    }
+
+    public String getCronExpression() {
+        return cronExpression;
+    }
+
+    public void setCronExpression(String cronExpression) {
+        this.cronExpression = cronExpression;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Long getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(Long createBy) {
+        this.createBy = createBy;
+    }
+
+    public Date getCreateAt() {
+        return createAt;
+    }
+
+    public void setCreateAt(Date createAt) {
+        this.createAt = createAt;
+    }
+}

+ 115 - 0
src/main/java/com/sprivacy/translate/modules/model/ScheduleJobLog.java

@@ -0,0 +1,115 @@
+package com.sprivacy.translate.modules.model;
+
+import javax.persistence.*;
+import java.util.Date;
+
+/**
+ * @Author: guanhuijuan
+ * @Description: ScheduleJobLog
+ * @Date: 2018/11/21_11:31
+ */
+@Entity
+@Table(name = "schedule_job_log")
+public class ScheduleJobLog {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "log_id")
+    private Long logId;
+
+    @Column(name = "job_id")
+    private Long jobId;
+
+    @Column(name = "bean_name")
+    private String beanName;
+
+    @Column(name = "method_name")
+    private String methodName;
+
+    @Column(name = "params")
+    private String params;
+
+    @Column(name = "status")
+    private Integer status;
+
+    @Column(name = "error")
+    private String error;
+
+    @Column(name = "times")
+    private Integer times;
+
+    @Column(name = "create_at")
+    private Date createAt;
+
+    public Long getLogId() {
+        return logId;
+    }
+
+    public void setLogId(Long logId) {
+        this.logId = logId;
+    }
+
+    public Long getJobId() {
+        return jobId;
+    }
+
+    public void setJobId(Long jobId) {
+        this.jobId = jobId;
+    }
+
+    public String getBeanName() {
+        return beanName;
+    }
+
+    public void setBeanName(String beanName) {
+        this.beanName = beanName;
+    }
+
+    public String getMethodName() {
+        return methodName;
+    }
+
+    public void setMethodName(String methodName) {
+        this.methodName = methodName;
+    }
+
+    public String getParams() {
+        return params;
+    }
+
+    public void setParams(String params) {
+        this.params = params;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getError() {
+        return error;
+    }
+
+    public void setError(String error) {
+        this.error = error;
+    }
+
+    public Integer getTimes() {
+        return times;
+    }
+
+    public void setTimes(Integer times) {
+        this.times = times;
+    }
+
+    public Date getCreateAt() {
+        return createAt;
+    }
+
+    public void setCreateAt(Date createAt) {
+        this.createAt = createAt;
+    }
+}

+ 104 - 0
src/main/java/com/sprivacy/translate/modules/model/SysLog.java

@@ -0,0 +1,104 @@
+package com.sprivacy.translate.modules.model;
+
+import javax.persistence.*;
+import java.util.Date;
+
+/**
+ * @Author: guanhuijuan
+ * @Description: SysLog
+ * @Date: 2018/11/21_11:19
+ */
+@Entity
+@Table(name = "sys_log")
+public class SysLog {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private Long id;
+
+    @Column(name = "username")
+    private String username;
+
+    @Column(name = "operation")
+    private String operation;
+
+    @Column(name = "method")
+    private String method;
+
+    @Column(name = "params")
+    private String params;
+
+    @Column(name = "time")
+    private Long time;
+
+    @Column(name = "ip")
+    private String ip;
+
+    @Column(name = "create_at")
+    private Date createAt;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getOperation() {
+        return operation;
+    }
+
+    public void setOperation(String operation) {
+        this.operation = operation;
+    }
+
+    public String getMethod() {
+        return method;
+    }
+
+    public void setMethod(String method) {
+        this.method = method;
+    }
+
+    public String getParams() {
+        return params;
+    }
+
+    public void setParams(String params) {
+        this.params = params;
+    }
+
+    public Long getTime() {
+        return time;
+    }
+
+    public void setTime(Long time) {
+        this.time = time;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    public Date getCreateAt() {
+        return createAt;
+    }
+
+    public void setCreateAt(Date createAt) {
+        this.createAt = createAt;
+    }
+}

+ 124 - 0
src/main/java/com/sprivacy/translate/modules/model/User.java

@@ -0,0 +1,124 @@
+package com.sprivacy.translate.modules.model;
+
+import javax.persistence.*;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-11-21 18:02
+ * @desc User
+ **/
+@Entity
+@Table(name = "user")
+public class User {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private Long id;
+
+    @Column(name = "user_name")
+    private String userName;
+
+    @Column(name = "passwd")
+    private String passwd;
+
+    @Column(name = "nick_name")
+    private String nickName;
+
+    @Column(name = "telephone")
+    private String telephone;
+
+    @Column(name = "email")
+    private String email;
+
+    @Column(name = "authority")
+    private Integer authority;
+
+    @Column(name = "department")
+    private String department;
+
+    @Column(name = "create_at")
+    private String createAt;
+
+    @Column(name = "update_at")
+    private String updateAt;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getPasswd() {
+        return passwd;
+    }
+
+    public void setPasswd(String passwd) {
+        this.passwd = passwd;
+    }
+
+    public String getNickName() {
+        return nickName;
+    }
+
+    public void setNickName(String nickName) {
+        this.nickName = nickName;
+    }
+
+    public String getTelephone() {
+        return telephone;
+    }
+
+    public void setTelephone(String telephone) {
+        this.telephone = telephone;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public Integer getAuthority() {
+        return authority;
+    }
+
+    public void setAuthority(Integer authority) {
+        this.authority = authority;
+    }
+
+    public String getDepartment() {
+        return department;
+    }
+
+    public void setDepartment(String department) {
+        this.department = department;
+    }
+
+    public String getCreateAt() {
+        return createAt;
+    }
+
+    public void setCreateAt(String createAt) {
+        this.createAt = createAt;
+    }
+
+    public String getUpdateAt() {
+        return updateAt;
+    }
+
+    public void setUpdateAt(String updateAt) {
+        this.updateAt = updateAt;
+    }
+}

+ 57 - 0
src/main/java/com/sprivacy/translate/modules/service/MailService.java

@@ -0,0 +1,57 @@
+package com.sprivacy.translate.modules.service;
+
+import javax.mail.MessagingException;
+import java.util.List;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-11-22 10:15
+ * @desc MailService
+ **/
+public interface MailService {
+
+    /**
+     * 文本邮件
+     * @param to
+     * @param subject
+     * @param content
+     */
+    void sendSimpleMail(String to, String subject, String content);
+
+    /**
+     * html邮件
+     * @param to
+     * @param subject
+     * @param content
+     */
+    void sendHtmlMail(String to, String subject, String content) throws MessagingException;
+
+    /**
+     * 附件邮件
+     * @param to
+     * @param subject
+     * @param content
+     * @param filePath
+     */
+    void sendAttachmentsMail(String to, String subject, String content, String filePath) throws MessagingException;
+
+    /**
+     * 图片附件
+     * @param to
+     * @param subject
+     * @param content
+     * @param rscPath
+     * @param rscId
+     */
+    void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId) ;
+
+    /**
+     * 多个图片附件
+     * @param to
+     * @param subject
+     * @param content
+     * @param rscPath
+     * @param rscId
+     */
+    void sendInlineResourceMail(String to, String subject, String content, List<String> rscPath, String rscId) ;
+}

+ 20 - 0
src/main/java/com/sprivacy/translate/modules/service/ScheduleJobLogService.java

@@ -0,0 +1,20 @@
+package com.sprivacy.translate.modules.service;
+
+
+import com.sprivacy.translate.modules.model.ScheduleJobLog;
+
+/**
+ * @Author: guanhuijuan
+ * @Description: ScheduleJobLogService
+ * @Date: 2018/11/21_11:33
+ */
+public interface ScheduleJobLogService {
+
+    /**
+     * 插入ScheduleJobLog
+     *
+     * @param scheduleJobLog
+     * @return
+     */
+    ScheduleJobLog insert(ScheduleJobLog scheduleJobLog);
+}

+ 59 - 0
src/main/java/com/sprivacy/translate/modules/service/ScheduleJobService.java

@@ -0,0 +1,59 @@
+package com.sprivacy.translate.modules.service;
+
+
+import com.sprivacy.translate.modules.model.ScheduleJob;
+
+/**
+ * @Author: guanhuijuan
+ * @Description: ScheduleJobService
+ * @Date: 2018/11/21_11:33
+ */
+public interface ScheduleJobService {
+
+    /**
+     * 保存定时任务
+     *
+     * @param scheduleJob
+     */
+    void save(ScheduleJob scheduleJob);
+
+
+    /**
+     * 更新定时任务
+     *
+     * @param scheduleJob
+     */
+    void update(ScheduleJob scheduleJob);
+
+
+    /**
+     * 批量删除定时任务
+     *
+     * @param jobIds
+     */
+    void deleteBatch(Long[] jobIds);
+
+
+    /**
+     * 立即执行
+     *
+     * @param jobIds
+     */
+    void run(Long[] jobIds);
+
+
+    /**
+     * 暂停运行
+     *
+     * @param jobIds
+     */
+    void pause(Long[] jobIds);
+
+
+    /**
+     * 恢复运行
+     *
+     * @param jobIds
+     */
+    void resume(Long[] jobIds);
+}

+ 30 - 0
src/main/java/com/sprivacy/translate/modules/service/UserService.java

@@ -0,0 +1,30 @@
+package com.sprivacy.translate.modules.service;
+
+
+
+import com.sprivacy.translate.modules.http.BackUser;
+import com.sprivacy.translate.modules.model.User;
+
+import java.util.List;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-11-21 10:56
+ * @desc UserService
+ **/
+public interface UserService {
+
+    /**
+     * 获取用户列表
+     * @return List<User>
+     */
+    List<User> getUserInfo();
+
+    /**
+     * 用户登录接口
+     * @param userName
+     * @param passwd
+     * @return BackUser
+     */
+    BackUser login(String userName, String passwd);
+}

+ 121 - 0
src/main/java/com/sprivacy/translate/modules/service/impl/MailServiceImpl.java

@@ -0,0 +1,121 @@
+package com.sprivacy.translate.modules.service.impl;
+
+import com.sprivacy.translate.modules.service.MailService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.mail.SimpleMailMessage;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.MimeMessageHelper;
+import org.springframework.stereotype.Service;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+import java.io.File;
+import java.util.List;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-11-22 10:15
+ * @desc MailServiceImpl
+ **/
+@Service
+public class MailServiceImpl implements MailService {
+    private final static Logger LOGGER = LoggerFactory.getLogger(MailServiceImpl.class);
+    @Value("${spring.mail.username}")
+    private String from;
+
+    @Autowired
+    private JavaMailSender javaMailSender;
+
+    @Override
+    public void sendSimpleMail(String to, String subject, String content) {
+        LOGGER.info("发送文本邮件开始:{},{},{}", to, subject, content);
+        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
+        simpleMailMessage.setTo(to);
+        simpleMailMessage.setSubject(subject);
+        simpleMailMessage.setText(content);
+        simpleMailMessage.setFrom(from);
+        javaMailSender.send(simpleMailMessage);
+    }
+
+    @Override
+    public void sendHtmlMail(String to, String subject, String content) throws MessagingException {
+        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
+        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
+        mimeMessageHelper.setTo(to);
+        mimeMessageHelper.setSubject(subject);
+        mimeMessageHelper.setText(content, true);
+        mimeMessageHelper.setFrom(from);
+        javaMailSender.send(mimeMessage);
+
+    }
+
+    @Override
+    public void sendAttachmentsMail(String to, String subject, String content, String filePath) throws MessagingException {
+        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
+        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
+        mimeMessageHelper.setTo(to);
+        mimeMessageHelper.setSubject(subject);
+        mimeMessageHelper.setText(content, true);
+        mimeMessageHelper.setFrom(from);
+
+        FileSystemResource fileSystemResource = new FileSystemResource(new File(filePath));
+        String fileName = fileSystemResource.getFilename();
+        mimeMessageHelper.addAttachment(fileName, fileSystemResource);
+        mimeMessageHelper.addAttachment(fileName + "_testOne", fileSystemResource);
+        mimeMessageHelper.addAttachment(fileName + "_testTwo", fileSystemResource);
+
+        javaMailSender.send(mimeMessage);
+    }
+
+    @Override
+    public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId) {
+        LOGGER.info("发送静态邮件开始:{},{},{}", to, subject, content,rscPath,rscId);
+        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
+        MimeMessageHelper mimeMessageHelper = null;
+        try {
+            mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
+            mimeMessageHelper.setTo(to);
+            mimeMessageHelper.setSubject(subject);
+            mimeMessageHelper.setText(content, true);
+            mimeMessageHelper.setFrom(from);
+
+            FileSystemResource fileSystemResource = new FileSystemResource(new File(rscPath));
+            mimeMessageHelper.addInline(rscId, fileSystemResource);
+            mimeMessageHelper.addInline(rscId, fileSystemResource);
+            javaMailSender.send(mimeMessage);
+            LOGGER.info("发送静态图片邮件成功");
+        } catch (MessagingException e) {
+            LOGGER.error("发送静态邮件异常", e);
+        }
+
+    }
+
+    @Override
+    public void sendInlineResourceMail(String to, String subject, String content, List<String> rscPath, String rscId) {
+        LOGGER.info("发送静态邮件开始:{},{},{}", to, subject, content,rscPath,rscId);
+        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
+        MimeMessageHelper mimeMessageHelper = null;
+        try {
+            mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
+            mimeMessageHelper.setTo(to);
+            mimeMessageHelper.setSubject(subject);
+            mimeMessageHelper.setText(content, true);
+            mimeMessageHelper.setFrom(from);
+
+            for (String s : rscPath) {
+                FileSystemResource fileSystemResource = new FileSystemResource(new File(s));
+                mimeMessageHelper.addInline(rscId, fileSystemResource);
+            }
+            // mimeMessageHelper.addInline(rscId, fileSystemResource);
+            javaMailSender.send(mimeMessage);
+            LOGGER.info("发送静态图片邮件成功");
+        } catch (MessagingException e) {
+            LOGGER.error("发送静态邮件异常", e);
+        }
+    }
+
+}

+ 28 - 0
src/main/java/com/sprivacy/translate/modules/service/impl/ScheduleJobLogServiceImpl.java

@@ -0,0 +1,28 @@
+package com.sprivacy.translate.modules.service.impl;
+
+
+import com.sprivacy.translate.modules.jpa.ScheduleJobLogJpa;
+import com.sprivacy.translate.modules.model.ScheduleJobLog;
+import com.sprivacy.translate.modules.service.ScheduleJobLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @Author: guanhuijuan
+ * @Description: ScheduleJobLogServiceImpl
+ * @Date: 2018/11/21_11:33
+ */
+@Service("scheduleJobLogService")
+public class ScheduleJobLogServiceImpl implements ScheduleJobLogService {
+
+    @Autowired
+    private ScheduleJobLogJpa scheduleJobLogJpa;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public ScheduleJobLog insert(ScheduleJobLog scheduleJobLog) {
+        return scheduleJobLogJpa.save(scheduleJobLog);
+    }
+}

+ 108 - 0
src/main/java/com/sprivacy/translate/modules/service/impl/ScheduleJobServiceImpl.java

@@ -0,0 +1,108 @@
+package com.sprivacy.translate.modules.service.impl;
+
+
+import com.sprivacy.translate.common.schedule.ScheduleUtils;
+import com.sprivacy.translate.common.utils.Constant;
+import com.sprivacy.translate.modules.jpa.ScheduleJobJpa;
+import com.sprivacy.translate.modules.model.ScheduleJob;
+import com.sprivacy.translate.modules.service.ScheduleJobService;
+import org.quartz.CronTrigger;
+import org.quartz.Scheduler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.PostConstruct;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Author: guanhuijuan
+ * @Description: ScheduleJobServiceImpl
+ * @Date: 2018/11/21_11:33
+ */
+@Service("scheduleJobService")
+public class ScheduleJobServiceImpl implements ScheduleJobService {
+
+    private final static Logger LOGGER = LoggerFactory.getLogger(ScheduleJobServiceImpl.class);
+
+    @Autowired
+    private Scheduler scheduler;
+
+    @Autowired
+    private ScheduleJobJpa scheduleJobJpa;
+
+    /**
+     * 项目启动时初始化定时器
+     */
+    @PostConstruct
+    public void init() {
+        List<ScheduleJob> scheduleJobs = scheduleJobJpa.findAll();
+        if (scheduleJobs.size() > 0) {
+            for (ScheduleJob scheduleJob : scheduleJobs) {
+                CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, scheduleJob.getJobId());
+                // 如果不存在,则创建
+                if (cronTrigger == null) {
+                    ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
+                } else {
+                    ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);
+                }
+            }
+        } else {
+            LOGGER.info("没有需要初始化的定时器");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void save(ScheduleJob scheduleJob) {
+        scheduleJob.setCreateAt(new Date());
+        scheduleJob.setStatus(Constant.ScheduleStatus.NORMAL.getValue());
+        scheduleJobJpa.save(scheduleJob);
+        ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void update(ScheduleJob scheduleJob) {
+        ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);
+        scheduleJobJpa.saveAndFlush(scheduleJob);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteBatch(Long[] jobIds) {
+        for (Long jobId : jobIds) {
+            ScheduleUtils.deleteScheduleJob(scheduler, jobId);
+            scheduleJobJpa.deleteById(jobId);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void run(Long[] jobIds) {
+        for (Long jobId : jobIds) {
+            ScheduleUtils.run(scheduler, scheduleJobJpa.getOne(jobId));
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void pause(Long[] jobIds) {
+        for (Long jobId : jobIds) {
+            ScheduleUtils.pauseJob(scheduler, jobId);
+            scheduleJobJpa.updateStatusByJobId(jobId, Constant.ScheduleStatus.PAUSE.getValue());
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void resume(Long[] jobIds) {
+        for (Long jobId : jobIds) {
+            ScheduleUtils.resumeJob(scheduler, jobId);
+            scheduleJobJpa.updateStatusByJobId(jobId, Constant.ScheduleStatus.NORMAL.getValue());
+        }
+    }
+}

+ 55 - 0
src/main/java/com/sprivacy/translate/modules/service/impl/UserServiceImpl.java

@@ -0,0 +1,55 @@
+package com.sprivacy.translate.modules.service.impl;
+
+import com.sprivacy.translate.modules.http.BackUser;
+import com.sprivacy.translate.modules.jpa.UserJpa;
+import com.sprivacy.translate.modules.model.User;
+import com.sprivacy.translate.modules.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-11-21 17:54
+ * @desc UserServiceImpl
+ **/
+@Service
+public class UserServiceImpl implements UserService {
+
+    @Autowired
+    private UserJpa userJpa;
+
+
+    @Override
+    public List<User> getUserInfo() {
+        List<User> users = userJpa.findAll();
+        if (null != users && users.size() > 0){
+            return users;
+        }
+        return null;
+    }
+
+    @Override
+    public BackUser login(String userName, String passwd) {
+        User findUser = userJpa.findByUserName(userName);
+        if (null != findUser){
+            if (passwd.equals(findUser.getPasswd())){
+                BackUser backUser = new BackUser();
+                backUser.setId(Integer.valueOf(findUser.getId().toString()));
+                backUser.setUserName(findUser.getUserName());
+                backUser.setNickName(findUser.getNickName());
+                backUser.setTelephone(findUser.getTelephone());
+                backUser.setEmail(findUser.getEmail());
+                backUser.setAuthority(findUser.getAuthority());
+                backUser.setDepartment(findUser.getDepartment());
+                backUser.setCreateAt(findUser.getCreateAt());
+                backUser.setUpdateAt(findUser.getUpdateAt());
+                return backUser;
+            }
+        }else {
+            return null;
+        }
+        return null;
+    }
+}

+ 7 - 0
src/main/java/com/sprivacy/translate/modules/utils/TextUtils.java

@@ -0,0 +1,7 @@
+package com.sprivacy.translate.modules.utils;
+
+public class TextUtils {
+    public static boolean isEmpty(CharSequence text) {
+        return null == text || text.length() <= 0;
+    }
+}

+ 9 - 0
src/main/java/com/sprivacy/translate/properties/CommonProperties.java

@@ -0,0 +1,9 @@
+package com.sprivacy.translate.properties;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-11-21 10:55
+ * @desc CommonProperties
+ **/
+public class CommonProperties {
+}

+ 9 - 0
src/main/java/com/sprivacy/translate/properties/TranslateProperties.java

@@ -0,0 +1,9 @@
+package com.sprivacy.translate.properties;
+
+/**
+ * @author guanhuijuan
+ * @create 2018-11-21 10:54
+ * @desc TranslateProperties
+ **/
+public class TranslateProperties {
+}

+ 20 - 0
src/main/resources/application-dev.yml

@@ -0,0 +1,20 @@
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.jdbc.Driver
+    druid:
+      url: jdbc:mysql://192.168.1.73:3306/springboot?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+      username: root
+      password: root
+  jpa:
+    hibernate:
+      ddl-auto: validate
+    show-sql: true
+  mail:
+    host: smtp.163.com
+    username: ghj_941109@163.com
+    password: jessie109
+    default-encoding: utf-8
+translate:
+  files-dir: E:/translate/file/upload/
+  base-url: http://192.168.1.102:8080/translate/upload/

+ 20 - 0
src/main/resources/application-prod.yml

@@ -0,0 +1,20 @@
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.jdbc.Driver
+    druid:
+      url: jdbc:mysql://180.76.154.224:3306/translate?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+      username: root
+      password: sprivacydbpwd
+  jpa:
+    hibernate:
+      ddl-auto: validate
+    show-sql: true
+  mail:
+      host: smtp.163.com
+      username: ghj_941109@163.com
+      password: jessie109
+      default-encoding: utf-8
+translate:
+  files-dir: E:/translate/file/upload/
+  base-url: http://192.168.1.102:8080/translate/upload/

+ 15 - 0
src/main/resources/application-test.yml

@@ -0,0 +1,15 @@
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.jdbc.Driver
+    druid:
+      url: jdbc:mysql://192.168.1.112:3306/springboot?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+      username: root
+      password: root
+  jpa:
+    hibernate:
+      ddl-auto: validate
+    show-sql: true
+translate:
+  files-dir: E:/yixin/file/upload/
+  base-url: http://192.168.1.102:8080/yixin/upload/

+ 23 - 0
src/main/resources/application.yml

@@ -0,0 +1,23 @@
+# tomcat
+server:
+  tomcat:
+    uri-encoding: UTF-8
+    max-threads: 1000
+    min-spare-threads: 30
+  port: 8082
+  connection-timeout: 5000ms
+  servlet:
+    context-path: /translate
+# spring
+spring:
+  profiles:
+    active: dev
+  jackson:
+    time-zone: GMT+8
+    date-format: yyyy-MM-dd HH:mm:ss
+  servlet:
+    multipart:
+      max-file-size: 100MB
+      max-request-size: 100MB
+      enabled: true
+

+ 5 - 0
src/main/resources/banner.txt

@@ -0,0 +1,5 @@
+=======================================================================================================================================================================================================
+
+                                                                                    欢迎使用网易人工翻译平台
+
+=======================================================================================================================================================================================================

+ 44 - 0
src/main/resources/logback-spring.xml

@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <include resource="org/springframework/boot/logging/logback/base.xml" />
+    <logger name="org.springframework.web" level="INFO"/>
+    <logger name="org.springboot.sample" level="TRACE" />
+
+    <!-- 开发、测试环境 -->
+    <springProfile name="dev,test">
+        <logger name="org.springframework.web" level="INFO"/>
+        <logger name="org.springboot.sample" level="INFO" />
+        <logger name="cn.sprivacy.translate" level="DEBUG" />
+    </springProfile>
+
+    <!-- 生产环境 -->
+    <springProfile name="prod">
+        <!-- 定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
+        <property name="log_home" value="/home/translate/logs"/>
+
+        <!-- 按照每天生成日志文件 -->
+        <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
+            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+                <!-- 日志文件输出的文件名 -->
+                <FileNamePattern>${log_home}/runtime.log.%d{yyyy-MM-dd}.log</FileNamePattern>
+                <!-- 日志文件保留天数 -->
+                <MaxHistory>30</MaxHistory>
+            </rollingPolicy>
+            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+                <!-- 格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
+                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+                <!-- 编码 -->
+                <charset>UTF-8</charset>
+            </encoder>
+            <!-- 日志文件最大的大小 -->
+            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+                <MaxFileSize>10MB</MaxFileSize>
+            </triggeringPolicy>
+        </appender>
+
+        <logger name="org.springframework.web" level="ERROR"/>
+        <logger name="org.springboot.sample" level="ERROR" />
+        <logger name="cn.sprivacy.translate" level="ERROR" />
+    </springProfile>
+
+</configuration>

+ 12 - 0
src/main/resources/templates/emailTemplate.html

@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>邮件模板</title>
+</head>
+<body>
+    您好,感谢您的赞助,这是一封测试邮件,请点击下面的链接来帮老大完成开发,感谢您的支持!<br>
+    <!--<a href="#" th:href="@{http://www.ityouknow.com/register/{id}(id=${id})}">激活账户</a>-->
+    <a href="#" th:href="@{https://www.jianshu.com/u/3a9e4a4b5205}">激活账户</a>
+</body>
+</html>

+ 19 - 0
src/test/java/com/sprivacy/translate/TranslateApplicationTests.java

@@ -0,0 +1,19 @@
+package com.sprivacy.translate;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class TranslateApplicationTests {
+	private final static Logger LOGGER = LoggerFactory.getLogger(TranslateApplicationTests.class);
+
+	@Test
+	public void contextLoads() {
+	}
+
+}