diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..a2a3040aa86debfd8826d9c2b5c816314c17d9fe --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/** +!**/src/test/** + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ + +### VS Code ### +.vscode/ diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000000000000000000000000000000000000..a45eb6ba269cd38f8965cef786729790945d9537 --- /dev/null +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,118 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if (mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if (mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if (!outputFile.getParentFile().exists()) { + if (!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054 Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000000000000000000000000000000000..642d572ce90e5085986bdd9c9204b9404f028084 --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/README.md b/README.md index ad29e8cd831935c869155fb368b942ff73ee4acc..0c0c93088042dbfdbff70a3a3264c04499997d08 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +<<<<<<< HEAD +======= +<<<<<<< HEAD +>>>>>>> 7119a3d (first) # 笔记复习记录 #### 介绍 @@ -37,3 +41,12 @@ Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +<<<<<<< HEAD +======= +======= +# 工程简介 + +# 延伸阅读 + +>>>>>>> bce3fce (1) +>>>>>>> 7119a3d (first) diff --git a/SpringBoot.md b/SpringBoot.md new file mode 100644 index 0000000000000000000000000000000000000000..02915707fc35ffced25beb1e161d7da413afd4ef --- /dev/null +++ b/SpringBoot.md @@ -0,0 +1,9 @@ +# SpringBoot + 众所周知 Spring 应用需要进行大量的配置,各种 XML 配置和注解配置让人眼花缭乱,且极容易出错,因此 Spring 一度被称为“配置地狱”。 + 为了简化 Spring 应用的搭建和开发过程,Pivotal 团队在 Spring 基础上提供了一套全新的开源的框架,它就是 Spring Boot。 + SpringBoot = Spring + SpringMVC + 其他框架 + 单元测试 + 内置Tomcat + +## SpringBoot的新注解 + @SpringBootApplication 应用于SpringBoot主应用入口程序 + @MapperScan 用于配置MyBatis的Mapper路径 + diff --git a/mvnw b/mvnw new file mode 100644 index 0000000000000000000000000000000000000000..3c8a5537314954d53ec2fb774b34fe5d5a5f253a --- /dev/null +++ b/mvnw @@ -0,0 +1,322 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ]; then + + if [ -f /etc/mavenrc ]; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ]; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false +darwin=false +mingw=false +case "$(uname)" in +CYGWIN*) cygwin=true ;; +MINGW*) mingw=true ;; +Darwin*) + darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="$(/usr/libexec/java_home)" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ]; then + if [ -r /etc/gentoo-release ]; then + JAVA_HOME=$(java-config --jre-home) + fi +fi + +if [ -z "$M2_HOME" ]; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ]; do + ls=$(ls -ld "$PRG") + link=$(expr "$ls" : '.*-> \(.*\)$') + if expr "$link" : '/.*' >/dev/null; then + PRG="$link" + else + PRG="$(dirname "$PRG")/$link" + fi + done + + saveddir=$(pwd) + + M2_HOME=$(dirname "$PRG")/.. + + # make it fully qualified + M2_HOME=$(cd "$M2_HOME" && pwd) + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=$(cygpath --unix "$M2_HOME") + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --unix "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --unix "$CLASSPATH") +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw; then + [ -n "$M2_HOME" ] && + M2_HOME="$( ( + cd "$M2_HOME" + pwd + ))" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="$( ( + cd "$JAVA_HOME" + pwd + ))" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr \"$javaExecutable\" : '\([^ ]*\)')" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=$(which readlink) + if [ ! $(expr "$readLink" : '\([^ ]*\)') = "no" ]; then + if $darwin; then + javaHome="$(dirname \"$javaExecutable\")" + javaExecutable="$(cd \"$javaHome\" && pwd -P)/javac" + else + javaExecutable="$(readlink -f \"$javaExecutable\")" + fi + javaHome="$(dirname \"$javaExecutable\")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ]; then + if [ -n "$JAVA_HOME" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="$(which java)" + fi +fi + +if [ ! -x "$JAVACMD" ]; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ]; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ]; then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ]; do + if [ -d "$wdir"/.mvn ]; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=$( + cd "$wdir/.." + pwd + ) + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' <"$1")" + fi +} + +BASE_DIR=$(find_maven_basedir "$(pwd)") +if [ -z "$BASE_DIR" ]; then + exit 1 +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in wrapperUrl) + jarUrl="$value" + break + ;; + esac + done <"$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") + fi + + if command -v wget >/dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl >/dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=$(cygpath --path --windows "$javaClass") + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=$(cygpath --path --windows "$M2_HOME") + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --windows "$CLASSPATH") + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000000000000000000000000000000000000..c8d43372c986d97911cdc21bd87e0cbe3d83bdda --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..63b480e33856479d24b3558f8fe87897a5c2dff8 --- /dev/null +++ b/pom.xml @@ -0,0 +1,174 @@ + + + 4.0.0 + com.student.zhang + study-springboot + 0.0.1-SNAPSHOT + Study-SpringBoot + Demo project for Spring Boot + + + 1.8 + UTF-8 + UTF-8 + 2.3.7.RELEASE + + + + + org.springframework.boot + spring-boot-starter-data-jdbc + + + + + + + + + + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-websocket + + + + + + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.4 + + + + + javax + javaee-api + 8.0 + + + + com.auth0 + java-jwt + 4.0.0 + + + + com.alibaba + fastjson + 1.2.83 + + + + org.aspectj + aspectjrt + 1.9.6 + + + org.aspectj + aspectjtools + 1.9.6 + + + org.aspectj + aspectjweaver + 1.9.6 + + + org.springframework.boot + spring-boot-starter-validation + + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + + mysql + mysql-connector-java + runtime + + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + UTF-8 + + + + org.springframework.boot + spring-boot-maven-plugin + 2.3.7.RELEASE + + com.student.zhang.StudySpringBootApplication + + + + repackage + + repackage + + + + + + + + diff --git a/src/main/java/com/student/zhang/StudySpringBootApplication.java b/src/main/java/com/student/zhang/StudySpringBootApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..6a2270b41e6d2aa6dac768d5c18001d2154714a5 --- /dev/null +++ b/src/main/java/com/student/zhang/StudySpringBootApplication.java @@ -0,0 +1,15 @@ +package com.student.zhang; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@MapperScan(value = "com.student.zhang.mapper") +public class StudySpringBootApplication { + + public static void main(String[] args) { + SpringApplication.run(StudySpringBootApplication.class, args); + } + +} diff --git a/src/main/java/com/student/zhang/aspect/ControllerAspect.java b/src/main/java/com/student/zhang/aspect/ControllerAspect.java new file mode 100644 index 0000000000000000000000000000000000000000..a247cd7f61695f346735edea1a8f36c6641ce151 --- /dev/null +++ b/src/main/java/com/student/zhang/aspect/ControllerAspect.java @@ -0,0 +1,61 @@ +package com.student.zhang.aspect; + +import lombok.extern.slf4j.Slf4j; +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.springframework.stereotype.Component; +import org.springframework.validation.BindingResult; +import org.springframework.validation.ObjectError; + +import javax.validation.ValidationException; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 定义 Controller的切面 + */ +@Slf4j +@Aspect +@Component +public class ControllerAspect { + + /** + * 定义切入点 + */ + @Pointcut("execution(* com.student.zhang.controller.*.*(..))") + private void method() {} + + + /** + * 定义环绕通知 + * @param joinPoint 加入点 + */ + @Around("method()") + public Object actionAround(ProceedingJoinPoint joinPoint) throws Throwable { + List errors = null; //定义的BindingResult中的异常信息 + for (Object arg : joinPoint.getArgs()) { + if (arg instanceof BindingResult) { +// List collect = ((BindingResult) arg).getAllErrors().stream().distinct().collect(Collectors +// .toList()); + BindingResult result = (BindingResult) arg; //定义检验绑定结果对象 + errors = result.getAllErrors().stream().distinct().collect(Collectors.toList()); + break; + } + } + if (errors != null && errors.size() > 0) { //说明有验证信息 + StringBuilder stringBuffer = new StringBuilder(); + for (ObjectError error : errors) { + log.error("JSR异常:" + error.getDefaultMessage()); + stringBuffer.append(",").append(error.getDefaultMessage()); + } + stringBuffer.deleteCharAt(0); //去掉第1个“,” + //这里抛出这个异常的目的:是为了阻断程序的运行 + throw new ValidationException(stringBuffer.toString()); + } + return joinPoint.proceed(); + } + + +} diff --git a/src/main/java/com/student/zhang/aspect/ServiceAspect.java b/src/main/java/com/student/zhang/aspect/ServiceAspect.java new file mode 100644 index 0000000000000000000000000000000000000000..93e8bced86607cb496f0cee530a55b8fe7c024f5 --- /dev/null +++ b/src/main/java/com/student/zhang/aspect/ServiceAspect.java @@ -0,0 +1,119 @@ +package com.student.zhang.aspect; + +import com.student.zhang.entity.Clazz; +import com.student.zhang.entity.SystemLog; + +import com.student.zhang.service.ISystemLogService; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.*; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 定义 Service接口的切面 + */ +@Slf4j +//@Aspect +@Component +public class ServiceAspect { + + /** + * 定义切入点 + */ + @Pointcut("execution(* com.student.zhang.service.impl.*ServiceImpl.*(..))") + private void method() {} + + + /** + * 定义前置通知 + * @param joinPoint 加入点 + */ + @Before("method()") + public void actionBefore(JoinPoint joinPoint) { + System.out.println("actionBefore------------------------------"); + log.debug("增加的前置代码...执行方法:" + joinPoint.getSignature().getName() + "\t参数数量:" + joinPoint.getArgs().length + "\t" + LocalDateTime.now()); + recordSystemLog(joinPoint.getSignature().toShortString(), "前置通知", joinPoint.getArgs().length, ""); + } + + + /** + * 定义返回结果通知 + * @param joinPoint 加入点 + * @param object 返回结果 + */ + @AfterReturning(pointcut = "method()", returning = "object") + public void actionReturning(JoinPoint joinPoint, Object object) { + log.debug("增加的获取返回结果代码...执行方法:" + joinPoint.getSignature().getName() + "\t返回:" + (object != null ? object : "无") + "\t" + LocalDateTime.now()); + recordSystemLog(joinPoint.getSignature().toShortString(), "返回结果通知", joinPoint.getArgs().length, object != null ? object : ""); + } + + /** + * 定义后置通知 + * @param joinPoint 加入点 + */ + @After("method()") + public void actionAfter(JoinPoint joinPoint) { + log.debug("增加的后置代码...执行方法:" + joinPoint.getSignature().getName() + "\t" + LocalDateTime.now()); + recordSystemLog(joinPoint.getSignature().toShortString(), "后置通知", joinPoint.getArgs().length, ""); + } + + /** + * 定义异常通知 + * @param joinPoint 加入点 + * @param e 触发的异常 + */ + @AfterThrowing(pointcut = "method()", throwing = "e") + public void actionThrowing(JoinPoint joinPoint, Exception e) { + log.debug("增加的处理异常的代码...异常:" + e.getMessage() + "\t" + LocalDateTime.now()); + recordSystemLog(joinPoint.getSignature().toShortString(), "异常通知", joinPoint.getArgs().length, e.getMessage()); + } + + + /** + * 定义环绕通知 + * @param joinPoint 加入点 + */ + @Around("method()") + public Object actionAround(ProceedingJoinPoint joinPoint) throws Throwable { + log.debug("增加的环绕代码...执行方法:" + joinPoint.getSignature().getName() + "\t" + joinPoint.getSignature().toShortString() + "\t" + joinPoint.getTarget() + "\t" + LocalDateTime.now()); + + //执行原来的方法,并获取其返回结果赋值于result + Object result = joinPoint.proceed(); + switch (joinPoint.getSignature().toShortString()) { + case "ClazzServiceImpl.list()": + //对原来获取的结果进行手动干预(改值) + List clazzList = (List) result; + clazzList.add(new Clazz(20, "六年级1班")); + clazzList.remove(0); + return clazzList; + } + + + recordSystemLog(joinPoint.getSignature().toShortString(), "环绕通知", joinPoint.getArgs().length, result); + return result; + } + + + @Resource + ISystemLogService systemLogService; + + /** + * 记录操作日志 + * @param method + * @param notice + * @param paramCount + * @param returnValue + */ + private void recordSystemLog(String method, String notice, int paramCount, Object returnValue) { + SystemLog systemLog = new SystemLog(method, notice, paramCount, returnValue.toString()); + //保存日志 + systemLogService.save(systemLog); + } + + +} diff --git a/src/main/java/com/student/zhang/aspect/TestAspect.java b/src/main/java/com/student/zhang/aspect/TestAspect.java new file mode 100644 index 0000000000000000000000000000000000000000..47686d536d8991500428a2109c6a297e7593e946 --- /dev/null +++ b/src/main/java/com/student/zhang/aspect/TestAspect.java @@ -0,0 +1,22 @@ +package com.student.zhang.aspect; + +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; + +//@Component +//@Aspect +@Slf4j +public class TestAspect { + + @Pointcut("execution(* com.student.zhang.service.impl.StudentServiceImpl.*(..))") + public void method() { + } + + @Before("method()") + public void testBefore(JoinPoint joinPoint) { + log.info("前置通知————执行的方法名称:" + joinPoint.getSignature().getName()); + } + +} diff --git a/src/main/java/com/student/zhang/bean/Page.java b/src/main/java/com/student/zhang/bean/Page.java new file mode 100644 index 0000000000000000000000000000000000000000..41b398c7a92d64b82d88b582beb9302062692678 --- /dev/null +++ b/src/main/java/com/student/zhang/bean/Page.java @@ -0,0 +1,51 @@ +package com.student.zhang.bean; + +import java.util.List; + +/** + * 分页类 + */ +public class Page { + + private int total = 0; //总记录数 + private int pageIndex = 1; //当前页码 + private int pageSize; //页大小 + private int pageCount; //页数 + private List records; //返回的数据集合 + + public Page(int pageIndex, int pageSize) { + this.pageIndex = pageIndex; + this.pageSize = pageSize; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + if (total > 0) { + this.pageCount = (int) Math.ceil((double)total / (double) pageSize); + } + } + + public int getPageIndex() { + return pageIndex; + } + + public int getPageSize() { + return pageSize; + } + + public int getPageCount() { + return pageCount; + } + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } +} diff --git a/src/main/java/com/student/zhang/config/WebMvcConfig.java b/src/main/java/com/student/zhang/config/WebMvcConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..8a97159761defe85cc0f8cb8146e00b6074c2404 --- /dev/null +++ b/src/main/java/com/student/zhang/config/WebMvcConfig.java @@ -0,0 +1,26 @@ +package com.student.zhang.config; + +import com.student.zhang.interceptor.TokenInterceptor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * @author By Zhang + */ +@Configuration +public class WebMvcConfig implements WebMvcConfigurer { + + + /** + * 添加一个拦截器 + * @param registry + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + TokenInterceptor tokenInterceptor = new TokenInterceptor(); + registry.addInterceptor(tokenInterceptor) + .addPathPatterns("/**") + .excludePathPatterns("/user/login"); + } +} diff --git a/src/main/java/com/student/zhang/controller/BaseController.java b/src/main/java/com/student/zhang/controller/BaseController.java new file mode 100644 index 0000000000000000000000000000000000000000..1c4ff39edf00a855f81c13caa13ab9acfdda34ff --- /dev/null +++ b/src/main/java/com/student/zhang/controller/BaseController.java @@ -0,0 +1,38 @@ +package com.student.zhang.controller; + + +import com.student.zhang.utils.ViewUtils; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class BaseController { + + @Resource + HttpServletRequest request; + @Resource + HttpServletResponse response; + + /** + * 成功 + * @param message + * @param value + * @return + */ + protected Object success(String message, Object value) { + return ViewUtils.view(message, value, 200); + } + + /** + * 失败 + * @param message + * @param state + * @return + */ + protected Object fail(String message, int state) { + response.setStatus(state); + return ViewUtils.view(message, null ,state); + } + +} diff --git a/src/main/java/com/student/zhang/controller/BorrowRecordController.java b/src/main/java/com/student/zhang/controller/BorrowRecordController.java new file mode 100644 index 0000000000000000000000000000000000000000..f7c4f2efd66fd32c58a19f55011c72ec2658fbe3 --- /dev/null +++ b/src/main/java/com/student/zhang/controller/BorrowRecordController.java @@ -0,0 +1,32 @@ +package com.student.zhang.controller; + +import com.student.zhang.entity.BorrowRecord; +import com.student.zhang.service.IBorrowRecordService; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.sql.SQLException; + +/** + * @author By Zhang + */ +@RestController +@RequestMapping("borrowRecord") +public class BorrowRecordController extends BaseController{ + + @Resource + IBorrowRecordService borrowRecordService; + + @PostMapping("update") + public Object update(@RequestBody BorrowRecord borrowRecord){ + borrowRecordService.save(borrowRecord); + return success("success",null) ; + } + + + @GetMapping + public Object getRecord() throws SQLException { + int borrowRecord = borrowRecordService.getBorrowRecord(); + return success("success",borrowRecord); + } +} diff --git a/src/main/java/com/student/zhang/controller/ClazzController.java b/src/main/java/com/student/zhang/controller/ClazzController.java new file mode 100644 index 0000000000000000000000000000000000000000..adf5d57ed764808bb60c036d75a605c8c0470034 --- /dev/null +++ b/src/main/java/com/student/zhang/controller/ClazzController.java @@ -0,0 +1,53 @@ +package com.student.zhang.controller; + +import com.student.zhang.bean.Page; +import com.student.zhang.entity.Clazz; +import com.student.zhang.service.IClazzService; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +/** + * 班级类控制器 + */ +@RestController +@RequestMapping("clazz") +public class ClazzController extends BaseController { + + @Resource + IClazzService clazzService; + + /** + * 获取班级列表 + * @return + */ + @PostMapping + public Object index(Integer pageIndex) { + Page clazzPage = clazzService.list(pageIndex); + return success("success", clazzPage); + } + + /** + * 新增/编辑 + * @return + */ + @PostMapping("edit") + public Object edit(@Valid @RequestBody Clazz clazz, BindingResult result) { + clazzService.save(clazz); + return success("success", null); + } + + /** + * 删除 + * @param id + * @return + */ + @PostMapping("delete") + public Object delete(@RequestParam String id) { + clazzService.remove(Integer.parseInt(id)); + return success("success", null) ; + } + +} diff --git a/src/main/java/com/student/zhang/controller/CourseController.java b/src/main/java/com/student/zhang/controller/CourseController.java new file mode 100644 index 0000000000000000000000000000000000000000..780d93ce96855446be73e1a1e17124ace237f7f6 --- /dev/null +++ b/src/main/java/com/student/zhang/controller/CourseController.java @@ -0,0 +1,55 @@ +package com.student.zhang.controller; + +import com.student.zhang.bean.Page; +import com.student.zhang.entity.Course; +import com.student.zhang.service.ICourseService; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +/** + * 课程类控制器 + */ +@RestController +@RequestMapping("course") +public class CourseController extends BaseController { + + @Resource + ICourseService courseService; + + /** + * 课程列表 + * @param pageIndex + * @return + */ + @PostMapping("list") + public Object index( Integer pageIndex){ + Page coursePage = courseService.list(pageIndex); + return success("success", coursePage); + } + + /** + * 新增/编辑 + * @param course + * @return + */ + @PostMapping("edit") + public Object edit(@Valid @RequestBody Course course, BindingResult result){ + courseService.save(course); + return success("success", null) ; + } + + /** + * 删除课程 + * @param id + * @return + */ + @GetMapping("delete/{id}") + public Object delete(@PathVariable Integer id){ + courseService.remove(id); + return success("success", null) ; + } + +} diff --git a/src/main/java/com/student/zhang/controller/FileController.java b/src/main/java/com/student/zhang/controller/FileController.java new file mode 100644 index 0000000000000000000000000000000000000000..cdc9af23bc20729059f1e59038f646af147b692c --- /dev/null +++ b/src/main/java/com/student/zhang/controller/FileController.java @@ -0,0 +1,145 @@ +package com.student.zhang.controller; + + +import com.student.zhang.exception.ServiceValidationException; +import com.student.zhang.service.IUserService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.ServletOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.sql.SQLException; + +/** + * 文件相关控制器 + */ +@Slf4j +@RestController +@RequestMapping("file") +public class FileController extends BaseController { + + /** + * 文件上传 + * @param partFile + * @return + * @throws IOException + */ + @PostMapping("upload") + public Object upload(@ModelAttribute MultipartFile partFile) throws IOException { + //获取图片名称 + String fileName = partFile.getOriginalFilename(); //获取原始文件名 + /* + partFile.getOriginalFilename() ==> baiqian.jpg + */ +// String fileName = new Date().getTime() + partFile.getOriginalFilename().substring(partFile.getOriginalFilename().indexOf(".")); + //设置文件保存的路径 + String uploadPath = request.getServletContext().getInitParameter("uploadPath"); + File fileFolderPath = new File(uploadPath); + if (!fileFolderPath.exists()) fileFolderPath.mkdirs(); //如果上传路径不存在,则创建上传路径 + log.info("uploadPath:" + uploadPath); + //创建一个保存文件 + File storeFile = new File(fileFolderPath + "/" + fileName); + partFile.transferTo(storeFile); //保存文件到指定File对象,并写到磁盘上 + return success(null,"/upload/" + fileName); + } + + /** + * 文件列表 + * @return + */ + @GetMapping("list") + public Object list() { + String uploadPath = request.getServletContext().getInitParameter("uploadPath"); + File fileFolderPath = new File(uploadPath); + String[] files = fileFolderPath.list(); + return success(null, files); + } + + /** + * 文件下载 + * @param fileName + * @throws IOException + */ + @Resource + IUserService userService; +// @GetMapping("download/{token}/{flag}/{fileName}") 使用超链接调整去实现文件下载 + @GetMapping("download/{flag}/{fileName}") + public void download(@PathVariable String fileName, @PathVariable String flag) throws IOException, SQLException { + String account = (String) request.getAttribute("sign"); //获取当前下载者的学生账号 + if (account == null) { + throw new ServiceValidationException("No permission, please log in first.", 401); + } + log.info(account + "进入下载,文件:" + fileName); + userService.downloadFile(account); //每下载一次,就余额就减少deMoney元 + + //请求响应头 + response.setHeader("Content-Type", "application/x-msdownload"); + response.setHeader("Content-Disposition", "attachment;filename=" + toUTF8String(fileName)); + //获取文件保存的路径 + String uploadPath = request.getServletContext().getInitParameter("uploadPath"); + File file = new File(uploadPath + "/" + fileName); //获取要下载的文件对象 + log.info("file:"+file); + if (!file.exists()) { + throw new ServiceValidationException("file is not exits", 402); + } + //输入流 + FileInputStream inputStream = new FileInputStream(file); + //输出流 + ServletOutputStream outputStream = response.getOutputStream(); + outputStream.flush(); + int read = 0; //读取次数 + byte[] bytes = new byte[1024]; + while (inputStream != null && (read = inputStream.read(bytes)) != -1) { + outputStream.write(bytes, 0, read); + } + //把文件流输出 + outputStream.flush(); + //关闭流 + inputStream.close(); + outputStream.close(); + } + + + /** + * 下载文件的文件名的字符编码转换 + * @param str + * @return + */ + private String toUTF8String(String str) { + StringBuffer stringBuffer = new StringBuffer(); + int length = str.length(); + for (int i = 0; i< length; i++) { + //取出字符串中的每个字符 + char c = str.charAt(i); + //Unicode码值为0~255时,不做处理 + if (c >= 0 && c <= 255) { + stringBuffer.append(c); + } else { + //进行UTF-8转码 + byte b[]; + try{ + b = Character.toString(c).getBytes("UTF-8"); + } catch (UnsupportedEncodingException exception) { + exception.printStackTrace(); + b = null; + } + //转换为%HH的字符串形式 + for (int j = 0; j < b.length; j++) { + int k = b[j]; + if (k < 0) { + k &= 255; + } + stringBuffer.append("%" + Integer.toHexString(k).toUpperCase()); + } + } + } + return stringBuffer.toString(); + } + + +} diff --git a/src/main/java/com/student/zhang/controller/ScoreController.java b/src/main/java/com/student/zhang/controller/ScoreController.java new file mode 100644 index 0000000000000000000000000000000000000000..a2114104514f041405478637379fd4c1c95ae789 --- /dev/null +++ b/src/main/java/com/student/zhang/controller/ScoreController.java @@ -0,0 +1,82 @@ +package com.student.zhang.controller; + +import com.student.zhang.entity.Score; +import com.student.zhang.service.IScoreService; +import lombok.Data; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 成绩类控制器 + */ +@RestController +@RequestMapping("score") +public class ScoreController extends BaseController { + @Resource + IScoreService scoreService; + + + @Data + static class ScoreParam{ + private Integer[] courseIds; //保存课程id + private Integer[] studentIds; //保存学生id + private int pageIndex; //保存页码 + + @Override + public String toString() { + return "ScoreParam{" + + "courseIds=" + Arrays.toString(courseIds) + + ", studentIds=" + Arrays.toString(studentIds) + + ", pageIndex=" + pageIndex + + '}'; + } + } + + /** + * 成绩列表 + * @param scoreParam + * @return + */ + @PostMapping("list") + public Object index( @RequestBody ScoreParam scoreParam){ + List> maps = scoreService.list(scoreParam.getPageIndex(),scoreParam.getCourseIds(),scoreParam.getStudentIds()); + HashMap scoreMap = new HashMap<>(); + int total = scoreService.getTotal(); + scoreMap.put("pageIndex",scoreParam.getPageIndex()); //当前页码 + scoreMap.put("countPage",(int) Math.ceil((double)total / (double) 5)); //计算总共有多少页 + scoreMap.put("records",maps); //获取数据库的数据,以map数据类型存储 + scoreMap.put("total",scoreService.getTotal()); //获取总共有多少页 + return success("success", scoreMap); + } + + /** + * 新增/编辑 + * @param score + * @return + */ + @PostMapping("edit") + public Object edit(@Valid @RequestBody Score score, BindingResult result){ + scoreService.save(score); + return success("success", null); + + } + + /** + * 删除成绩 + * @param id + * @return + */ + @GetMapping("delete/{id}") + public Object delete(@PathVariable Integer id){ + scoreService.remove(id); + return success("success", null); + } + +} diff --git a/src/main/java/com/student/zhang/controller/StudentController.java b/src/main/java/com/student/zhang/controller/StudentController.java new file mode 100644 index 0000000000000000000000000000000000000000..c9abb176c2d4aa389f2dd7456e09f447c83fd797 --- /dev/null +++ b/src/main/java/com/student/zhang/controller/StudentController.java @@ -0,0 +1,80 @@ +package com.student.zhang.controller; + +import com.student.zhang.bean.Page; +import com.student.zhang.entity.Student; +import com.student.zhang.service.IStudentService; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.sql.SQLException; + +/** + * 学生类控制器 + */ +@RestController +@RequestMapping("student") +@Slf4j +public class StudentController extends BaseController { + + @Resource + IStudentService studentService; + + @Data + static class ListParam { + @NotNull(message = "页码必须传递") + private Integer pageIndex; + @NotNull(message = "班级ID必须传递") + private Integer clazzId; + private String name; + } + + /** + * 学生列表 + * @param param + * @return + */ + @PostMapping("list") + public Object index(@Valid @RequestBody ListParam param, BindingResult result){ + Page studentPage = studentService.list(param.getPageIndex(), param.getClazzId(), param.getName()); + return success("success", studentPage); + } + + /** + * 新增/编辑 + * @param student + * @return + */ + @PostMapping("edit") + public Object edit(@RequestBody Student student){ + studentService.save(student); + return success("success", null); + } + + /** + * 删除学生 + * @param id + * @return + */ + @GetMapping("delete/{id}") + public Object delete(@PathVariable Integer id){ + studentService.remove(id); + return success("success", null) ; + + } + + /** + * 借钱 + * @return + */ + @GetMapping("borrowMoney/{money}") + public Object borrowMoney(@PathVariable Integer money) throws SQLException { + studentService.borrowMoney(16, 37, money); + return success("success", null); + } + +} diff --git a/src/main/java/com/student/zhang/controller/TeacherController.java b/src/main/java/com/student/zhang/controller/TeacherController.java new file mode 100644 index 0000000000000000000000000000000000000000..7e8df4ccb2f30ce538f44fd8dc11de12c914bfe0 --- /dev/null +++ b/src/main/java/com/student/zhang/controller/TeacherController.java @@ -0,0 +1,59 @@ +package com.student.zhang.controller; + +import com.student.zhang.bean.Page; +import com.student.zhang.entity.Teacher; +import com.student.zhang.service.ITeacherService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +/** + * 教师类控制器 + */ +@Slf4j +@RestController +@RequestMapping("teacher") +public class TeacherController extends BaseController { + + @Resource + ITeacherService teacherService; + + + /** + * 教师列表 + * @param pageIndex + * @return + */ + @PostMapping("list") + public Object index( Integer pageIndex){ + Page teacherPage = teacherService.list(pageIndex); + return success("success", teacherPage); + } + + /** + * 新增/编辑 + * @param teacher + * @return + */ + @PostMapping("edit") + public Object edit(@Valid @RequestBody Teacher teacher, BindingResult result){ + log.info("teacherId:"+teacher.getId()); + teacherService.save(teacher); + return success("success", null); + } + + /** + * 删除教师 + * @param id + * @return + */ + @GetMapping("delete/{id}") + public Object delete(@PathVariable Integer id){ + teacherService.remove(id); + return success("success", null); + } + +} diff --git a/src/main/java/com/student/zhang/controller/UserController.java b/src/main/java/com/student/zhang/controller/UserController.java new file mode 100644 index 0000000000000000000000000000000000000000..8852f1bb39de4acb8ba9758da20b388b05989c1c --- /dev/null +++ b/src/main/java/com/student/zhang/controller/UserController.java @@ -0,0 +1,184 @@ +package com.student.zhang.controller; + +import com.alibaba.fastjson.JSONObject; +import com.student.zhang.entity.User; +import com.student.zhang.service.IUserService; +import com.student.zhang.utils.SecurityUtils; +import com.student.zhang.utils.TokenUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.Date; + +@Slf4j +@RestController +@RequestMapping("user") +public class UserController extends BaseController { + + /** + * 登录(使用req来获取数据) + * + * @return + */ + /* + @PostMapping("login") + public Object login(HttpServletRequest req, HttpServletResponse resp) { + + //账号 + String account = req.getParameter("account"); + //密码 + String password = SecurityUtils.md5Encrypt(req.getParameter("password")); + + log.info("接收到的account:" + account); + log.info("接收到的password:" + password); + + JSONObject object = new JSONObject(true); + object.put("state", 200); + object.put("message", "login success"); + object.put("timestamp", LocalDateTime.now()); + + return object.toJSONString(); + } + */ + + @Resource + IUserService userService; + + /** + * 登录 + * + * @param user + * @return + */ + @PostMapping("login") + public Object login(@Valid @RequestBody User user, BindingResult result) { + //密码 + user.setPassword(SecurityUtils.md5Encrypt(user.getPassword())); + userService.login(user); + JSONObject value = new JSONObject(); + Date issuedTime = new Date(); + Date expiresTime = new Date(issuedTime.getTime() + 1000 * 60 * 60 * 200); //过期时间为72个小时 + value.put("token", TokenUtils.generate(user.getAccount(), issuedTime, expiresTime)); + return success("登录成功", value); + } + /** + * 获取积分 + * @return + */ + @GetMapping("getMoney") + public Object getIntegral() { + String account = request.getAttribute("sign").toString(); + User user = userService.getByAccount(account); + return success("success", user.getMoney()); + } + + /** + * 测试SpringBoot项目 + * @return + */ + @GetMapping("test") + public Object test(){ + return success("success","这是我的第一个SpringBoot项目"); + } + + + + /** + * 退出 + * + * @return + */ + @GetMapping("logout/{count}/{name}") + public Object logout(@PathVariable Integer count, @PathVariable String name) { + + log.info("执行到logout方法了..."); + log.info(request.getMethod()); + log.info("接收到的count:" + count); + log.info("接收到的name:" + name); + + JSONObject object = new JSONObject(true); + object.put("state", 200); + object.put("message", "logout success"); + object.put("timestamp", LocalDateTime.now()); + + return object.toJSONString(); + } + + /** + * 注册(使用request和@RequestParam接收参数) + * @return + */ + /* + @PostMapping("register") + public Object register(@RequestParam String account, String password, String email) { + User user = new User(); + user.setAccount(account); + user.setPassword(password); + user.setEmail(email); + user.setRealname(request.getParameter("realname")); + user.setMobile(request.getParameter("mobile")); + user.setSex(request.getParameter("sex")); + user.setBirthday(new Date(request.getParameter("birthday").replace("-","/"))); //1990-10-04 + + log.info("接收到的user参数:" + user); + + + JSONObject object = new JSONObject(true); + object.put("state", 200); + object.put("message", "register success"); + object.put("timestamp", LocalDateTime.now()); + + return object.toJSONString(); + } + */ + + /** + * 注册(使用@ModelAttribute) + * + * @param user + * @return + */ + @PostMapping("register") + public Object register(@ModelAttribute User user) { + log.info("接收到的user参数:" + user); + String md5Encrypt = SecurityUtils.md5Encrypt(user.getPassword()); + user.setPassword(md5Encrypt); + userService.register(user); + return success("注册成功", null); + } + + + /** + * 注册(使用@RequestBody) + * + * @param user + * @return + */ + @PostMapping("registerJson") + public Object registerJson(User user) { + + log.info("接收到的user参数:" + user); + + JSONObject object = new JSONObject(true); + object.put("state", 200); + object.put("message", "register success"); + object.put("timestamp", LocalDateTime.now()); + + return object.toJSONString(); + } + + + @PostMapping("add") + public Object add(@RequestBody String content) { + log.info("接收到的content参数:" + content); + JSONObject object = new JSONObject(true); + object.put("state", 200); + object.put("message", "add success"); + object.put("timestamp", LocalDateTime.now()); + return object.toJSONString(); + } +} diff --git a/src/main/java/com/student/zhang/entity/BorrowRecord.java b/src/main/java/com/student/zhang/entity/BorrowRecord.java new file mode 100644 index 0000000000000000000000000000000000000000..0f21a7d296465d3def7710723e88881eb4c1c0fb --- /dev/null +++ b/src/main/java/com/student/zhang/entity/BorrowRecord.java @@ -0,0 +1,33 @@ +package com.student.zhang.entity; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 借钱记录类 + */ +@Data +public class BorrowRecord implements Serializable { + private Integer id; + private Integer student_1Id; + private Integer student_2Id; + private Integer money; + + public BorrowRecord() { + } + + public BorrowRecord(Integer student_1Id, Integer student_2Id, Integer money) { + this.student_1Id = student_1Id; + this.student_2Id = student_2Id; + this.money = money; + } + + public BorrowRecord(Integer id, Integer student_1Id, Integer student_2Id, Integer money) { + this.id = id; + this.student_1Id = student_1Id; + this.student_2Id = student_2Id; + this.money = money; + } + +} diff --git a/src/main/java/com/student/zhang/entity/Clazz.java b/src/main/java/com/student/zhang/entity/Clazz.java new file mode 100644 index 0000000000000000000000000000000000000000..5d555970fafbb73c0d01017659ca72a3547cb611 --- /dev/null +++ b/src/main/java/com/student/zhang/entity/Clazz.java @@ -0,0 +1,34 @@ +package com.student.zhang.entity; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 班级类 + */ +@Data +public class Clazz implements Serializable { + public Clazz() { + } + + private Integer id; + @NotBlank(message = "班级名称不能为空") + private String name; + + public Clazz(Integer id, String name) { + this.id = id; + this.name = name; + } + + public Clazz(String name) { + this.name = name; + } + + + @Override + public String toString() { + return "id=" + id +" name=" + name; + } +} diff --git a/src/main/java/com/student/zhang/entity/Course.java b/src/main/java/com/student/zhang/entity/Course.java new file mode 100644 index 0000000000000000000000000000000000000000..007741535a16efffeff6e700f284280b698e1acd --- /dev/null +++ b/src/main/java/com/student/zhang/entity/Course.java @@ -0,0 +1,38 @@ +package com.student.zhang.entity; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 教师类 + */ +@Data +public class Course implements Serializable { + private Integer id; + @NotBlank(message = "课程名称不能为空") + private String name; + @NotNull(message = "教师id不能为空") + private Integer teacher_id; + + public Course() { + } + + public Course(String name, Integer teacher_id) { + this.name = name; + this.teacher_id = teacher_id; + } + + public Course(Integer id, String name, Integer teacher_id) { + this.id = id; + this.name = name; + this.teacher_id = teacher_id; + } + + @Override + public String toString() { + return id +"\t\t"+ name+"\t\t"+teacher_id ; + } +} diff --git a/src/main/java/com/student/zhang/entity/Score.java b/src/main/java/com/student/zhang/entity/Score.java new file mode 100644 index 0000000000000000000000000000000000000000..fc3617430c01bbe0102357bc5fbbeda9c063b81a --- /dev/null +++ b/src/main/java/com/student/zhang/entity/Score.java @@ -0,0 +1,40 @@ +package com.student.zhang.entity; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +public class Score implements Serializable { + private Integer id; + @NotNull(message = "学生id不能为空") + private Integer student_id ; + @NotNull(message = "课程id不能为空") + private Integer course_id; + @NotNull(message = "成绩不能为空") + private Integer num; + + public Score() { + } + + public Score(Integer id, Integer student_id, Integer course_id, Integer num) { + this.id = id; + this.student_id = student_id; + this.course_id = course_id; + this.num = num; + } + + public Score(Integer student_id, Integer course_id, Integer num) { + this.student_id = student_id; + this.course_id = course_id; + this.num = num; + } + + + + @Override + public String toString() { + return id + "\t\t"+ student_id+ "\t\t" +course_id+ "\t\t" + num ; + } +} diff --git a/src/main/java/com/student/zhang/entity/Student.java b/src/main/java/com/student/zhang/entity/Student.java new file mode 100644 index 0000000000000000000000000000000000000000..9a06500963dca50dfc709ecec64126d83893bb35 --- /dev/null +++ b/src/main/java/com/student/zhang/entity/Student.java @@ -0,0 +1,95 @@ +package com.student.zhang.entity; + +import lombok.Data; + +import javax.validation.constraints.Max; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 学生类 + */ +@Data +public class Student implements Serializable { + + private Integer id; + @NotBlank(message = "学生姓名不能为空") + private String name; + @NotNull(message = "班级ID不能为空") + private Integer clazzId; + @NotNull(message = "性别不能为空") + private String sex; + private String className; + @Max(value = 120, message = "年龄不能超过120") + @NotNull(message = "年龄不能为空") + private Integer age; + private String address; + private LocalDateTime createtime; + private Integer money; + + public Student() { + } + + public Student(Integer id, String name, Integer classId, String sex, Integer age, String address) { + this.id=id; + this.name=name; + this.clazzId=classId; + this.sex=sex; + this.age=age; + this.address=address; + } + + + + + + public Student(String name, Integer clazzId, String sex, Integer age, String address) { + this.name = name; + this.clazzId = clazzId; + this.sex = sex; + this.age = age; + this.address = address; + } + + public Student(String name, Integer clazzId, String sex, String className, Integer age, String address) { + this.name = name; + this.clazzId = clazzId; + this.sex = sex; + this.className = className; + this.age = age; + this.address = address; + } + + public Student(String name, Integer clazzId, String sex, Integer age, String address, LocalDateTime createtime) { + this.name = name; + this.clazzId = clazzId; + this.sex = sex; + this.age = age; + this.address = address; + this.createtime = createtime; + } + + public Student(Integer id, String name, Integer clazzId, String sex, Integer age, String address, LocalDateTime createtime) { + this.id = id; + this.name = name; + this.clazzId = clazzId; + this.sex = sex; + this.age = age; + this.address = address; + this.createtime = createtime; + } + + + @Override + public String toString() { + return id + + "\t" + name + + "\t" + clazzId + + "\t" + sex + + "\t" + age + + "\t" + address + + "\t" + createtime; + } +} diff --git a/src/main/java/com/student/zhang/entity/SystemLog.java b/src/main/java/com/student/zhang/entity/SystemLog.java new file mode 100644 index 0000000000000000000000000000000000000000..c367af7bf369fb37dc6b09f72ef87480805fe5d5 --- /dev/null +++ b/src/main/java/com/student/zhang/entity/SystemLog.java @@ -0,0 +1,47 @@ +package com.student.zhang.entity; + +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 系统操作日志类 + */ +@Data +public class SystemLog implements Serializable { + private Integer id; + private String method; + private String notice; + private Integer paramCount; + private String returnValue; + private LocalDateTime localDateTime; + + public SystemLog() { + } + + public SystemLog(Integer id, String method, String notice, Integer paramCount, String returnValue, LocalDateTime localDateTime) { + this.id = id; + this.method = method; + this.notice = notice; + this.paramCount = paramCount; + this.returnValue = returnValue; + this.localDateTime = localDateTime; + } + + public SystemLog(String method, String notice, Integer paramCount, String returnValue, LocalDateTime localDateTime) { + this.method = method; + this.notice = notice; + this.paramCount = paramCount; + this.returnValue = returnValue; + this.localDateTime = localDateTime; + } + + + public SystemLog(String method, String notice, int paramCount, String toString) { + this.method=method; + this.notice=notice; + this.paramCount=paramCount; + + } +} diff --git a/src/main/java/com/student/zhang/entity/Teacher.java b/src/main/java/com/student/zhang/entity/Teacher.java new file mode 100644 index 0000000000000000000000000000000000000000..51754dc227c042c1153c5f1138fe56e1b24bc7df --- /dev/null +++ b/src/main/java/com/student/zhang/entity/Teacher.java @@ -0,0 +1,33 @@ +package com.student.zhang.entity; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 教师类 + */ +@Data +public class Teacher implements Serializable { + private Integer id; + @NotBlank(message = "教师名称不能为空") + private String name; + + public Teacher(Integer id, String name) { + this.id = id; + this.name = name; + } + + public Teacher(String name) { + this.name = name; + } + + public Teacher() { + } + + @Override + public String toString() { + return id +"\t"+ name ; + } +} diff --git a/src/main/java/com/student/zhang/entity/User.java b/src/main/java/com/student/zhang/entity/User.java new file mode 100644 index 0000000000000000000000000000000000000000..3ec1ecf1fbe8926bd2922b6de1454d9d2c54ab95 --- /dev/null +++ b/src/main/java/com/student/zhang/entity/User.java @@ -0,0 +1,32 @@ +package com.student.zhang.entity; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +@Data +public class User implements Serializable { + private int id; + @NotBlank(message = "账号不能为空") + private String account; + @NotBlank(message = "密码不能为空") + private String password; + private Integer money; + + public User() { + } + + public User(String account, String password) { + this.account = account; + this.password = password; + } + + + + public User(int id, String account, String password) { + this.id = id; + this.account = account; + this.password = password; + } +} diff --git a/src/main/java/com/student/zhang/exception/ServiceValidationException.java b/src/main/java/com/student/zhang/exception/ServiceValidationException.java new file mode 100644 index 0000000000000000000000000000000000000000..3184069ac1e9ce127dda185ad08a5dfc04883e19 --- /dev/null +++ b/src/main/java/com/student/zhang/exception/ServiceValidationException.java @@ -0,0 +1,21 @@ +package com.student.zhang.exception; + + +import lombok.Data; + +import javax.validation.ValidationException; + +/** + * 自定义一个基于Service层的验证异常 + */ +@Data +public class ServiceValidationException extends ValidationException { + + private int state; + + public ServiceValidationException(String message, int state) { + super(message); + this.state = state; + } + +} diff --git a/src/main/java/com/student/zhang/handler/GlobalExceptionHandler.java b/src/main/java/com/student/zhang/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..4a52bd599cae32e74dc67ca3ad9862fbed98d0f9 --- /dev/null +++ b/src/main/java/com/student/zhang/handler/GlobalExceptionHandler.java @@ -0,0 +1,68 @@ +package com.student.zhang.handler; + + +import com.student.zhang.exception.ServiceValidationException; +import com.student.zhang.utils.ViewUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.ValidationException; + +/** + * 全局异常处理器:监听并处理整个项目的异常 + */ +@Slf4j +@RestControllerAdvice +public class GlobalExceptionHandler { + + /** + * 捕捉 ServiceValidationException异常并处理 + * @param exception + * @param response + * @return + */ + @ExceptionHandler({ServiceValidationException.class}) + public Object catchServiceValidationException(ServiceValidationException exception, HttpServletResponse response) { + log.error("catchServiceValidationException捕获到异常了=====>" + exception); + return getResult(response, exception.getMessage(), exception.getState()); + } + + /** + * 捕捉 ValidationException异常并处理,这里主要是为了监听和处理JSR303数据校验的异常, + * @param exception + * @param response + * @return + */ + @ExceptionHandler({ValidationException.class}) + public Object catchValidationException(ValidationException exception, HttpServletResponse response) { + log.error("catchValidationException捕获到异常了=====>" + exception); + return getResult(response, exception.getMessage(), 400); + } + + /** + * 捕捉 其它异常并处理 + * @param exception + * @param response + * @return + */ + @ExceptionHandler({Exception.class}) + public Object catchOtherException(Exception exception, HttpServletResponse response) { + log.error("catchOtherException捕获到其它异常了=====>" + exception); + exception.printStackTrace(); + return getResult(response, "服务器端发生了异常", 500); + } + + /** + * 获取结果 + * @param message + * @param state + * @return + */ + private String getResult(HttpServletResponse response, String message, int state) { + response.setStatus(state); + return ViewUtils.view(message, null, state); + } + +} diff --git a/src/main/java/com/student/zhang/interceptor/ServiceMethodInterceptor.java b/src/main/java/com/student/zhang/interceptor/ServiceMethodInterceptor.java new file mode 100644 index 0000000000000000000000000000000000000000..50bbd7f1ea091e5fa57067a8c202c727c6542a93 --- /dev/null +++ b/src/main/java/com/student/zhang/interceptor/ServiceMethodInterceptor.java @@ -0,0 +1,27 @@ +package com.student.zhang.interceptor;//package com.student.zhang.interceptor; +// +//import org.aopalliance.intercept.MethodInterceptor; +//import org.aopalliance.intercept.MethodInvocation; +//import org.springframework.stereotype.Component; +// +//import java.lang.reflect.Method; +// +///** +// * 服务类方法拦截器,用于实现AOP +// */ +//@Component +//public class ServiceMethodInterceptor implements MethodInterceptor { +// +// @Override +// public Object invoke(MethodInvocation invocation) throws Throwable { +// +// Method method = invocation.getMethod(); //通过反射获取到当前执行的方法 +// System.out.println("增加的前置代码...方法名称:" + method.getName()); +// +// Object result = invocation.proceed(); //相当于执行原本的方法,并获取返回的结果 +// +// System.out.println("增加的后置代码..." + result); +// return result; +// } +// +//} diff --git a/src/main/java/com/student/zhang/interceptor/TokenInterceptor.java b/src/main/java/com/student/zhang/interceptor/TokenInterceptor.java new file mode 100644 index 0000000000000000000000000000000000000000..8efacc5c035845ef6bbe37f28b0380e49622311a --- /dev/null +++ b/src/main/java/com/student/zhang/interceptor/TokenInterceptor.java @@ -0,0 +1,45 @@ +package com.student.zhang.interceptor; + + +import com.student.zhang.exception.ServiceValidationException; +import com.student.zhang.utils.TokenUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Token认证拦截器 + */ +@Slf4j +public class TokenInterceptor implements HandlerInterceptor { + + /** + * 在请求前进行拦截,进行Token认证 + * + * @param request + * @param response + * @param handler + * @return true:放行 false:拒绝 + * @throws Exception + */ + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { + log.debug("执行了TokenInterceptor拦截器......."); + + //1. 先从header里面获取token令牌 + String token = request.getHeader("Token"); + + //2. 使用TokenUtils进行验证 + Object sign = TokenUtils.verify(token); + if (sign == null) { + //说明令牌验证未通过 + throw new ServiceValidationException("Token验证未通过", 401); + } + log.info("Token认证通过,标识为:" + sign); + request.setAttribute("sign", sign); + return true; + } +} diff --git a/src/main/java/com/student/zhang/listener/MyListener.java b/src/main/java/com/student/zhang/listener/MyListener.java new file mode 100644 index 0000000000000000000000000000000000000000..cd314748ab58e19fb341eb401fc6682d4c4bcbab --- /dev/null +++ b/src/main/java/com/student/zhang/listener/MyListener.java @@ -0,0 +1,77 @@ +package com.student.zhang.listener; + +import javax.servlet.*; +import javax.servlet.annotation.WebListener; +import java.io.UnsupportedEncodingException; + +/** + * 我的监听器 + */ +@WebListener +public class MyListener implements ServletContextListener, ServletContextAttributeListener, + ServletRequestListener, ServletRequestAttributeListener { + + + @Override + public void contextInitialized(ServletContextEvent sce) { + //在这里写一些项目初始化工作的代码 + ServletContext context = sce.getServletContext(); //通过ServletContext事件对象获取ServletContext源对象 + context.setAttribute("visits", context.getInitParameter("visits")); //将ServletContext初始值中的visits放入ServletContext的属性中 + System.out.println("ServletContext创建好了"); + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + //在这里写一些web容器关闭的时候的一些代码,比如一些资源释放等 + System.out.println("ServletContext销毁了"); + } + + @Override + public void attributeAdded(ServletContextAttributeEvent scae) { +// System.out.println("ServletContext新增属性了,新增的属性名:" + scae.getName() + ",属性值:" + scae.getValue()); + } + + @Override + public void attributeRemoved(ServletContextAttributeEvent scae) { +// System.out.println("ServletContext删除属性了,删除的属性名:" + scae.getName() + ",属性值:" + scae.getValue()); + } + + @Override + public void attributeReplaced(ServletContextAttributeEvent scae) { +// System.out.println("ServletContext替换属性了,替换的属性名:" + scae.getName() + ",属性值:" + scae.getValue()); + } + + @Override + public void attributeAdded(ServletRequestAttributeEvent srae) { +// System.out.println("ServletRequest新增属性了,新增的属性名:" + srae.getName() + ",属性值:" + srae.getValue()); + } + + @Override + public void attributeRemoved(ServletRequestAttributeEvent srae) { +// System.out.println("ServletRequest移除属性了,移除的属性名:" + srae.getName() + ",属性值:" + srae.getValue()); + } + + @Override + public void attributeReplaced(ServletRequestAttributeEvent srae) { +// System.out.println("ServletRequest替换属性了,替换的属性名:" + srae.getName() + ",属性值:" + srae.getValue()); + } + + @Override + public void requestInitialized(ServletRequestEvent sre) { + //在这里写一些请求初始化的代码 + ServletRequest request = sre.getServletRequest(); + try { + request.setCharacterEncoding("utf-8"); //设置请求的字符集编码 + } catch (UnsupportedEncodingException exception) { + exception.printStackTrace(); + } + +// System.out.println("ServletRequest创建好了"); + } + + @Override + public void requestDestroyed(ServletRequestEvent sre) { + //在这里写一些请求执行完毕被销毁的代码 +// System.out.println("ServletRequest执行完毕,销毁了"); + } +} diff --git a/src/main/java/com/student/zhang/mapper/IBorrowRecordMapper.java b/src/main/java/com/student/zhang/mapper/IBorrowRecordMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..3e0afa8dc32d783ee11c8e4e08496a6d1b974028 --- /dev/null +++ b/src/main/java/com/student/zhang/mapper/IBorrowRecordMapper.java @@ -0,0 +1,45 @@ +package com.student.zhang.mapper; + +import com.student.zhang.entity.BorrowRecord; +import org.apache.ibatis.annotations.CacheNamespace; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.cache.decorators.LruCache; + +/** + * 借钱记录类Mapper + */ +@Mapper +@CacheNamespace( + eviction = LruCache.class, + flushInterval = 100000, + size = 100, + readWrite = false //读写,如果需要设置为只读,则设置为false +) +public interface IBorrowRecordMapper { + + + /*** + * 添加借钱记录 + * @param borrowRecord + * @return + */ + @Insert("insert into borrow_record values(default,#{student_1Id},#{student_2Id},#{money},now())") + boolean save(BorrowRecord borrowRecord); + + + /** + * 获取借钱记录 + * + * @return + */ + @Select("select count(0) from borrow_record") + int getBorrowRecord(); + + + @Select("select count(0) from borrow_record where student1_id=#{studentId} or student2_id=#{studentId}") + int countByStudentId(int studentId); + + +} diff --git a/src/main/java/com/student/zhang/mapper/IClazzMapper.java b/src/main/java/com/student/zhang/mapper/IClazzMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..8757f745b50cacb7e4ce86ef8d01f8bef4e93bb6 --- /dev/null +++ b/src/main/java/com/student/zhang/mapper/IClazzMapper.java @@ -0,0 +1,79 @@ +package com.student.zhang.mapper; + +import com.student.zhang.entity.Clazz; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * 班级类Mapper + */ +@Mapper +public interface IClazzMapper { + + /** + * 查询所有班级数据 + * + * @return + */ + @Select("") + List select(@Param("pageIndex") int pageIndex, @Param("pageSize") int pageSize); + + + /** + * 新增班级数据 + * + * @param clazz 班级 + * @return + */ + @Insert(" insert into clazz\n" + + " values (default, #{name})") + int insert(Clazz clazz); + + /** + * 根据id删除班级信息 + * + * @param id + * @return + */ + @Delete(" delete\n" + + " from clazz\n" + + " where id = #{id}") + int delete(@Param("id") int id); + + /** + * 修改班级信息 + * + * @param clazz + * @return + */ + @Update(" delete\n" + + " from clazz\n" + + " where id = #{id}") + int update(Clazz clazz); + + /** + * 根据班级名称去查询数据库里面是否有即将新增的班级信息 + * + * @param name + * @return + */ + @Select(" select count(0)\n" + + " from clazz\n" + + " where name = #{name}") + int countByName(String name); + + /** + * 根据班级ID查询条数 + * + * @param id + * @return + */ + @Select(" select count(0)\n" + + " from clazz\n" + + " where id = #{id}") + int countById(int id); + +} diff --git a/src/main/java/com/student/zhang/mapper/ICourseMapper.java b/src/main/java/com/student/zhang/mapper/ICourseMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..f2df8b49e1ccad55121e45c0c57c14141f5106b1 --- /dev/null +++ b/src/main/java/com/student/zhang/mapper/ICourseMapper.java @@ -0,0 +1,119 @@ +package com.student.zhang.mapper; + +import com.student.zhang.entity.Course; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * 课程类Mapper + */ +@Mapper +public interface ICourseMapper { + + /** + * 查询所有课程数据 + * + * @return + */ + @Select("") + List select(@Param("pageIndex") int pageIndex, @Param("pageSize") int pageSize); + + + /** + * 新增课程数据 + * + * @param course 课程 + * @return + */ + @Insert(" insert into course\n" + + " values (default, #{name}, #{teacher_id})") + int insert(Course course); + + /** + * 获取数据表中总共有多少条数据 + * + * @return + */ + @Select(" select count(0)\n" + + " from course") + int countPage(); + + /** + * 根据id删除课程信息 + * + * @param id + * @return + */ + @Delete(" delete\n" + + " from course\n" + + " where id = #{id}") + int delete(@Param("id") int id); + + /** + * 修改课程信息 + * + * @param course + * @return + */ + @Update("") + int update(Course course); + + /** + * 根据课程名称去查询数据库里面是否有即将新增的课程信息 + * + * @param name + * @return + */ + @Select(" select count(0)\n" + + " from course\n" + + " where name = #{name}") + int countByName(@Param("name") String name); + + /** + * 根据课程ID查询条数 + * + * @param id + * @return + */ + @Select(" select count(0)\n" + + " from course\n" + + " where id = #{id}") + int countById(@Param("id") int id); + + /** + * 根据课程中的TeacherId查询课程表条数(目的:删除teacher表数据) + * + * @param teacher_id + * @return + */ + @Select(" select count(0)\n" + + " from teacher\n" + + " where id = #{teacher_id}") + int countByTeacherId(int teacher_id); + + /** + * 根据teacher表中的Id查询教师表条数(目的:为了新增course表的数据,因为course表中的teacher_id 字段与teacher表绑定) + * + * @param teacherId 教师编号 + * @return + */ + @Select("select count(0)\n" + + " from teacher\n" + + " where id = #{teacher_id}") + int countByTeacherIdForCourse(int teacherId); + +} diff --git a/src/main/java/com/student/zhang/mapper/IScoreMapper.java b/src/main/java/com/student/zhang/mapper/IScoreMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..cc8060ceee18a772a2361c20653bd2f93db70459 --- /dev/null +++ b/src/main/java/com/student/zhang/mapper/IScoreMapper.java @@ -0,0 +1,129 @@ +package com.student.zhang.mapper; + +import com.student.zhang.entity.Score; +import org.apache.ibatis.annotations.*; + +import java.util.List; +import java.util.Map; + +/** + * 学生类Mapper + */ +@Mapper +public interface IScoreMapper { + + + /** + * 查询所有成绩数据 + * + * @return + */ + + List> select(@Param("pageIndex") int pageIndex, + @Param("pageSize") int pageSize, + @Param("courseIds") Integer[] courseIds, + @Param("studentIds") Integer[] studentIds); + + + /** + * 获取数据表中总共有多少条数据 + * + * @return + */ + @Select(" select count(0)\n" + + " from score") + int getTotal(); + + /** + * 根据StudentID查询学生表条数(目的:为了删除student表的数据,查看score表中是否有引用) + * + * @param student_id + * @return + */ + @Select(" select count(0)\n" + + " from score\n" + + " where student_id = #{student_id}") + int countByStudentId(int student_id); + + /** + * 根据学生id查询总分 + * + * @param student_id + * @return + */ + @Select(" select sum(num)\n" + + " from score\n" + + " where student_id = #{student_id}") + int selectSumByStudentId(int student_id); + + /** + * 根据CourseId查询课程表条数(目的:为了删除course表的数据,查看score表中是否有引用) + * + * @param course_id + * @return + */ + @Select("select count(0)\n" + + " from score\n" + + " where course_id = #{course_id}") + int countByCourseId(int course_id); + + /** + * 新增成绩数据 + * + * @param score 成绩 + * @return 新增结果 + */ + @Insert(" insert into score\n" + + " values (default, #{student_id}, #{course_id}, #{num})") + int insert(Score score); + + /** + * 根据id删除成绩表信息 + * + * @param id + * @return + */ + @Delete(" delete\n" + + " from score\n" + + " where id = #{id}") + int delete(int id); + + /** + * 修改成绩表信息 + * + * @param score + * @return + */ + @Update("update score\n" + + " set student_id=#{student_id},\n" + + " course_id=#{course_id},\n" + + " num=#{num}\n" + + " where id = #{id}") + int update(Score score); + + /** + * 根据班级ID和课程ID一起去查询数据库里面是否有即将新增的成绩表信息 + * + * @param student_id 学生编号 + * @param course_id 课程编号 + * @return 是否存在学生和课程一样的信息 + */ + @Select(" select count(0)\n" + + " from score\n" + + " where student_id = #{student_id}\n" + + " and course_id = #{course_id}") + int countByStuIdAndCourseId(@Param("student_id") int student_id, @Param("course_id") int course_id); + + /** + * 根据成绩ID查询条数 + * + * @param id + * @return + */ + @Select(" select count(0)\n" + + " from score\n" + + " where id = #{id}") + int countById(int id); + + +} diff --git a/src/main/java/com/student/zhang/mapper/IStudentMapper.java b/src/main/java/com/student/zhang/mapper/IStudentMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..cb4b9e55863a1174a702998c4a0d99e79973d27c --- /dev/null +++ b/src/main/java/com/student/zhang/mapper/IStudentMapper.java @@ -0,0 +1,145 @@ +package com.student.zhang.mapper; + +import com.student.zhang.entity.Student; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * 学生类Mapper + */ +@Mapper +@CacheNamespace +public interface IStudentMapper { + + + + /** + * 查询所有学生数据 + * + * @param pageIndex + * @param pageSize + * @param clazzId + * @param name + * @return + */ + @Select("") + @Results( + id = "studentResult", + value = { + @Result(property = "clazzId", column = "class_id"), + } + ) + List select(@Param("pageIndex") int pageIndex, + @Param("pageSize") int pageSize, + @Param("clazzId") Integer clazzId, + @Param("name") String name); + + /** + * 根据学生ID修改其money + * + * @param studentId + * @param money 需要增减的数值 + * @return + */ + @Update(" update student set money=money-#{money} where id=#{studentId}") + int updateMoney(@Param("studentId") int studentId, @Param("money") int money); + + + /** + * 获取数据表中总共有多少条数据 + * + * @return + */ + @Select(" select count(0) from student") + int countPage(); + + /** + * 新增学生数据 + * + * @param student 学生 + * @return + */ + @Insert("insert into student values(default, #{name}, #{clazzId}, #{sex}, #{age}, #{address}, now(), #{money})") + int insert(Student student); + + /** + * 根据id删除学生信息 + * + * @param id + * @return + */ + @Delete("delete from student where id=#{id}") + int delete(@Param("id") int id); + + /** + * 修改学生信息 + * + * @param student + * @return + */ + @Update("") + int update(Student student); + + /** + * 根据学生名称去查询数据库里面是否有即将新增的学生信息 + * + * @param name + * @return + */ + @Select(" select count(0) from student where name=#{name}") + int countByName(String name); + + /** + * 根据学生ID查询条数 + * + * @param id + * @return + */ + @Select("select count(0) from student where id=#{id}") + int countById(@Param("id") int id); + + /** + * 根据学生ID查询学生表条数(目的:为了删除Clazz表中的数据) + * + * @param class_id + * @return + */ + @Select("select count(0) from student where class_id=#{clazzId}") + int countByClazzId(@Param("clazzId") int class_id); + + /** + * 根据clazz表中的Id查询班级表条数(目的:为了新增student表的数据,因为student表中的clazz_id 字段与clazz绑定) + * + * @param clazzId + * @return + */ + @Select(" select count(0) from clazz where id=#{id}") + int countByClazzIdForStudent(@Param("id") int clazzId); + +} diff --git a/src/main/java/com/student/zhang/mapper/ISystemLogMapper.java b/src/main/java/com/student/zhang/mapper/ISystemLogMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..0328bf10ae94a1c25106f0d5f34a9cf8f545796e --- /dev/null +++ b/src/main/java/com/student/zhang/mapper/ISystemLogMapper.java @@ -0,0 +1,58 @@ +package com.student.zhang.mapper; + +import com.student.zhang.entity.SystemLog; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 系统日志类Mapper + */ +@Mapper +public interface ISystemLogMapper { + + + /** + * 查询所有系统日志数据 + * + * @return + */ + @Select("") + List select(@Param("pageIndex") int pageIndex, @Param("pageSize") int pageSize); + + + /** + * 获取数据表中总共有多少条数据 + * + * @return + */ + int countPage(); + + /** + * 新增系统日志数据 + * + * @param systemLog 系统日志 + * @return + */ + int insert(SystemLog systemLog); + + /** + * 根据id删除系统日志信息 + * + * @param id + * @return + */ + int delete(@Param("id") int id); + + /** + * 根据系统日志ID查询条数 + * + * @param id + * @return + */ + int countById(int id); + + +} diff --git a/src/main/java/com/student/zhang/mapper/ITeacherMapper.java b/src/main/java/com/student/zhang/mapper/ITeacherMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..553a3244b43330a80f3cb48522b6c9f829709227 --- /dev/null +++ b/src/main/java/com/student/zhang/mapper/ITeacherMapper.java @@ -0,0 +1,91 @@ +package com.student.zhang.mapper; + +import com.student.zhang.entity.Teacher; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * 教师类Mapper + */ +@Mapper +public interface ITeacherMapper { + + + /** + * 获取教师的数据 + * + * @return + */ + @Select("") + List select(@Param("pageIndex") int pageIndex, @Param("pageSize") int pageSize); + + + /** + * 获取数据表中总共有多少条数据 + * + * @return + */ + @Select("select count(0) from teacher") + int countPage(); + + /** + * 新增教师数据 + * + * @param teacher 教师 + * @return + */ + @Insert(" insert into teacher\n" + + " values (default, #{name})") + int insert(Teacher teacher); + + /** + * 根据id删除教师信息 + * + * @param id + * @return + */ + @Delete(" delete\n" + + " from teacher\n" + + " where id = #{id}") + int delete(@Param("id") int id); + + /** + * 修改教师信息 + * + * @param teacher + * @return + */ + @Update(" update teacher\n" + + " set name=#{name}\n" + + " where id = #{id}") + int update(Teacher teacher); + + /** + * 根据教师名称去查询数据库里面是否有即将新增的教师信息 + * + * @param name + * @return + */ + @Select(" select count(0)\n" + + " from teacher\n" + + " where name = #{name}") + int countByName(@Param("name") String name); + + /** + * 根据教师ID查询条数 + * + * @param id + * @return + */ + @Select(" select count(0)\n" + + "from teacher\n" + + "where id = #{id}") + int countById(@Param("id") int id); + + +} diff --git a/src/main/java/com/student/zhang/mapper/IUserMapper.java b/src/main/java/com/student/zhang/mapper/IUserMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..05871a5af79632a8ec0f1eccb31151ef435dcdb6 --- /dev/null +++ b/src/main/java/com/student/zhang/mapper/IUserMapper.java @@ -0,0 +1,55 @@ +package com.student.zhang.mapper; + +import com.student.zhang.entity.User; +import org.apache.ibatis.annotations.*; + +/** + * 用户类Mapper + */ +@Mapper +public interface IUserMapper { + + + /** + * 根据用户账号、密码查询用户对象 + * + * @param account + * @return + */ + @Select("select * from user where account=#{account}") + User selectByAccount(@Param("account") String account); + + /** + * 根据用户账号、密码查询条数 + * + * @param user + * @return + */ + @Select("select count(0) from user where account=#{account} and password=#{password}") + int selectByUser(User user); + + /** + * 更新用户积分 + * + * @param account + * @param Money + * @return + */ + @Update(" update user set money =money-#{money} where account=#{account}") + int update(@Param("account") String account, @Param("money") Integer Money); + + /** + * 新增用户数据 + * + * @param user 用户 + * @return + */ + @Insert(" insert into user values(default,#{account},#{password},#{money})") + @Options( + keyProperty = "id", + useGeneratedKeys = true + ) + int insert(User user); + + +} diff --git a/src/main/java/com/student/zhang/service/IBorrowRecordService.java b/src/main/java/com/student/zhang/service/IBorrowRecordService.java new file mode 100644 index 0000000000000000000000000000000000000000..e12c81bd81e7905f3997fd9ec4fb5b16a78a5596 --- /dev/null +++ b/src/main/java/com/student/zhang/service/IBorrowRecordService.java @@ -0,0 +1,26 @@ +package com.student.zhang.service; + + +import com.student.zhang.entity.BorrowRecord; + +import java.sql.SQLException; + +public interface IBorrowRecordService { + + /*** + * 添加借钱记录 + * @param borrowRecord + * @return + */ + boolean save(BorrowRecord borrowRecord); + + + int countByStudentId(int studentId); + + /** + * 获取借钱记录 + * @return + */ + int getBorrowRecord() throws SQLException; + +} diff --git a/src/main/java/com/student/zhang/service/IClazzService.java b/src/main/java/com/student/zhang/service/IClazzService.java new file mode 100644 index 0000000000000000000000000000000000000000..2b0a770124afd2cf822b3f060d9e68f91ef5f381 --- /dev/null +++ b/src/main/java/com/student/zhang/service/IClazzService.java @@ -0,0 +1,34 @@ +package com.student.zhang.service; + + +import com.student.zhang.bean.Page; +import com.student.zhang.entity.Clazz; + +/** + * 班级服务接口 + */ +public interface IClazzService { + + /** + * 获取班级列表 + * @return + */ + Page list(int pageIndex); + + + + /** + * 用于对数据进行修改和新增 + * @param clazz 班级 + * @return + */ + boolean save(Clazz clazz); + + /** + * 删除班级信息 + * @param id + * @return + */ + boolean remove(int id); + +} diff --git a/src/main/java/com/student/zhang/service/ICourseService.java b/src/main/java/com/student/zhang/service/ICourseService.java new file mode 100644 index 0000000000000000000000000000000000000000..79aba7677a2f91409391d9b0ed645c840685be86 --- /dev/null +++ b/src/main/java/com/student/zhang/service/ICourseService.java @@ -0,0 +1,27 @@ +package com.student.zhang.service; + + +import com.student.zhang.bean.Page; +import com.student.zhang.entity.Course; + +/** + *获取课程列表 + */ +public interface ICourseService { + + Page list(int pageIndex); + + /** + * 用于对数据进行修改和新增 + * @param course 课程 + * @return + */ + boolean save(Course course); + + /** + * 删除课程信息 + * @param id + * @return + */ + boolean remove(int id); +} diff --git a/src/main/java/com/student/zhang/service/IScoreService.java b/src/main/java/com/student/zhang/service/IScoreService.java new file mode 100644 index 0000000000000000000000000000000000000000..4c4634a57182149c62c32b0730a8f646fe0916c4 --- /dev/null +++ b/src/main/java/com/student/zhang/service/IScoreService.java @@ -0,0 +1,44 @@ +package com.student.zhang.service; + + +import com.student.zhang.entity.Score; + +import java.util.List; +import java.util.Map; + +/** + * 成绩业务接口 + */ +public interface IScoreService { + + /** + * 获取成绩列表 + * @return + */ + List> list(int pageIndex,Integer[] courseId,Integer[] studentId); + + /** + * 用于对数据进行修改和新增 + * @param score 成绩表 + * @return + */ + boolean save(Score score); + + /** + * 删除成绩表 信息 + * @param id + * @return + */ + boolean remove(int id); + + + /** + * 计算总共的数量 + * @return + */ + int getTotal(); + + + int getSumByStudentId(int studentId); + +} diff --git a/src/main/java/com/student/zhang/service/IStudentService.java b/src/main/java/com/student/zhang/service/IStudentService.java new file mode 100644 index 0000000000000000000000000000000000000000..5339b3bf77ad128caf9f47c498d848747b29737e --- /dev/null +++ b/src/main/java/com/student/zhang/service/IStudentService.java @@ -0,0 +1,45 @@ +package com.student.zhang.service; + + +import com.student.zhang.bean.Page; +import com.student.zhang.entity.Student; + +import java.sql.SQLException; + +/** + * 学生服务接口 + */ +public interface IStudentService { + + /** + * 获取学生列表 + * @return + */ + Page list(int pageIndex, Integer clazzId, String name); + + + /** + * 用于对数据进行修改和新增 + * @param student 教师 + * @return + */ + boolean save(Student student); + + /** + * 删除教师信息 + * @param id + * @return + */ + boolean remove(int id); + + /** + * 学生借钱 + * @param student1Id + * @param student2Id + * @param money + * @return + * @throws SQLException + */ + boolean borrowMoney(int student1Id, int student2Id, int money) throws SQLException; + +} diff --git a/src/main/java/com/student/zhang/service/ISystemLogService.java b/src/main/java/com/student/zhang/service/ISystemLogService.java new file mode 100644 index 0000000000000000000000000000000000000000..3f99e0ecbdfe0baa9d07ce749a176006b46f2dce --- /dev/null +++ b/src/main/java/com/student/zhang/service/ISystemLogService.java @@ -0,0 +1,26 @@ +package com.student.zhang.service; + + +import com.student.zhang.bean.Page; +import com.student.zhang.entity.SystemLog; + +/** + * 系统日志接口 + */ +public interface ISystemLogService { + Page list(int pageIndex); + + /** + * 用于对数据进行修改和新增 + * @param systemLog 系统日志 + * @return + */ + boolean save(SystemLog systemLog); + + /** + * 删除系统日志信息 + * @param id + * @return + */ + boolean remove(int id); +} diff --git a/src/main/java/com/student/zhang/service/ITeacherService.java b/src/main/java/com/student/zhang/service/ITeacherService.java new file mode 100644 index 0000000000000000000000000000000000000000..3b05bc4885884e8d11040241afbbc610a0c6b21a --- /dev/null +++ b/src/main/java/com/student/zhang/service/ITeacherService.java @@ -0,0 +1,28 @@ +package com.student.zhang.service; + + +import com.student.zhang.bean.Page; +import com.student.zhang.entity.Teacher; + +/** + *获取教师列表 + */ +public interface ITeacherService { + Page list(int pageIndex); + + + + /** + * 用于对数据进行修改和新增 + * @param teacher 教师 + * @return + */ + boolean save(Teacher teacher); + + /** + * 删除教师信息 + * @param id + * @return + */ + boolean remove(int id); +} diff --git a/src/main/java/com/student/zhang/service/IUserService.java b/src/main/java/com/student/zhang/service/IUserService.java new file mode 100644 index 0000000000000000000000000000000000000000..eb4133dcabe181b9aa85189ab502cf6fc669b3b0 --- /dev/null +++ b/src/main/java/com/student/zhang/service/IUserService.java @@ -0,0 +1,35 @@ +package com.student.zhang.service; + + +import com.student.zhang.entity.User; + +public interface IUserService { + + + /** + * 登录 + * @param user + * @return 是否成功 + */ + void login(User user); + + + boolean register(User user); + + + /** + * 根据账号获取User对象 + * @param account + * @return + */ + User getByAccount(String account); + + + /** + * 指定账号下载文件 + * @param account + */ + void downloadFile(String account); + + +} diff --git a/src/main/java/com/student/zhang/service/impl/BorrowRecordServiceImpl.java b/src/main/java/com/student/zhang/service/impl/BorrowRecordServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..37ef98f58def132728bc25ebe0a8eb3796830e24 --- /dev/null +++ b/src/main/java/com/student/zhang/service/impl/BorrowRecordServiceImpl.java @@ -0,0 +1,43 @@ +package com.student.zhang.service.impl; + +import com.student.zhang.entity.BorrowRecord; +import com.student.zhang.exception.ServiceValidationException; +import com.student.zhang.mapper.IBorrowRecordMapper; +import com.student.zhang.service.IBorrowRecordService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service("borrowRecordService") +@Slf4j +public class BorrowRecordServiceImpl implements IBorrowRecordService { + @Resource + IBorrowRecordMapper borrowRecordMapper; + + + /*** + * 添加借钱记录 + * @param borrowRecord + * @return + */ + @Override + public boolean save(BorrowRecord borrowRecord) { + return borrowRecordMapper.save(borrowRecord); + } + + @Override + public int countByStudentId(int studentId) { + return 0; + } + + @Override + public int getBorrowRecord() { + if (borrowRecordMapper.getBorrowRecord()==0){ + throw new ServiceValidationException("没找到数据",402); + } + return borrowRecordMapper.getBorrowRecord(); + } + + +} diff --git a/src/main/java/com/student/zhang/service/impl/ClazzServiceImpl.java b/src/main/java/com/student/zhang/service/impl/ClazzServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..f0960934fff90da46ccc94d0f403ff02baeae0ee --- /dev/null +++ b/src/main/java/com/student/zhang/service/impl/ClazzServiceImpl.java @@ -0,0 +1,59 @@ +package com.student.zhang.service.impl; + + +import com.student.zhang.bean.Page; +import com.student.zhang.entity.Clazz; +import com.student.zhang.exception.ServiceValidationException; +import com.student.zhang.mapper.IClazzMapper; +import com.student.zhang.mapper.IStudentMapper; +import com.student.zhang.service.IClazzService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Slf4j +/** + * 班级服务实现类 + */ +@Service("clazzService") +public class ClazzServiceImpl implements IClazzService { + + @Resource + private IStudentMapper studentMapper; + @Resource + private IClazzMapper clazzMapper; + + @Override + public Page list(int pageIndex) { + Page clazzPage = new Page(pageIndex, 5); + clazzPage.setRecords(clazzMapper.select(pageIndex, 5)); + clazzPage.setTotal(studentMapper.countPage()); + return clazzPage; + } + + @Override + public boolean save(Clazz clazz) { + if (clazz.getId() != null && clazzMapper.countById(clazz.getId()) == 0) { + throw new ServiceValidationException("该班ID不存在", 402); + + } + if (clazzMapper.countByName(clazz.getName()) > 0) { + throw new ServiceValidationException("该班级名称已存在", 402); + } + //如果class的id不存在,那么就新增一个班级,如果存在,就修改 + return clazz.getId() == null ? clazzMapper.insert(clazz) > 0 : clazzMapper.update(clazz) > 0; + } + + @Override + public boolean remove(int id) { + if (studentMapper.countByClazzId(id) > 0) { + throw new ServiceValidationException("该数据与其他表有关联,不能删除!", 402); + } + if (clazzMapper.countById(id) == 0) { + throw new ServiceValidationException("ID不存在,没有这个班级,无需删除!", 402); + } + return clazzMapper.delete(id) > 0; + } + +} diff --git a/src/main/java/com/student/zhang/service/impl/CourseServiceImpl.java b/src/main/java/com/student/zhang/service/impl/CourseServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..3ee6373c11488168f0d06cf75fe8635afe1cd30d --- /dev/null +++ b/src/main/java/com/student/zhang/service/impl/CourseServiceImpl.java @@ -0,0 +1,56 @@ +package com.student.zhang.service.impl; + + +import com.student.zhang.bean.Page; +import com.student.zhang.entity.Course; +import com.student.zhang.exception.ServiceValidationException; +import com.student.zhang.mapper.ICourseMapper; +import com.student.zhang.mapper.IScoreMapper; +import com.student.zhang.service.ICourseService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Slf4j +@Service("courseService") +public class CourseServiceImpl implements ICourseService { + @Resource + private ICourseMapper courseMapper; + @Resource + private IScoreMapper scoreMapper; + + @Override + public Page list(int pageIndex) { + Page studentPage = new Page(pageIndex, 5); + studentPage.setRecords(courseMapper.select(pageIndex, 5)); + studentPage.setTotal(courseMapper.countPage()); + return studentPage; + } + + @Override + public boolean save(Course course) { + if (course.getId() != null && courseMapper.countById(course.getId()) == 0) { + throw new ServiceValidationException("该课程ID不存在", 402); + } + if (courseMapper.countByName(course.getName()) > 0) { + throw new ServiceValidationException("该课程名称已存在", 402); + } + if (courseMapper.countByTeacherIdForCourse(course.getTeacher_id())==0){ + throw new ServiceValidationException("新增失败,教师表中没有该教师,不能选修该老师课程!", 402); + } + //如果class的id不存在,那么就新增一个课程,如果存在,就修改 + return course.getId() == null ? courseMapper.insert(course) > 0 : courseMapper.update(course) > 0; + } + + @Override + public boolean remove(int id) { + if (scoreMapper.countByCourseId(id) > 0) { + throw new ServiceValidationException("该数据与其他表有关联,不能删除", 402); + } + if (courseMapper.countById(id) == 0) { + throw new ServiceValidationException("ID不存在,没有这个课程,无需删除", 402); + } + return courseMapper.delete(id) > 0; + } +} diff --git a/src/main/java/com/student/zhang/service/impl/ScoreServiceImpl.java b/src/main/java/com/student/zhang/service/impl/ScoreServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..da453d58e4ca7fe4b65cc5a70849a8b5c4b2dc05 --- /dev/null +++ b/src/main/java/com/student/zhang/service/impl/ScoreServiceImpl.java @@ -0,0 +1,78 @@ +package com.student.zhang.service.impl; + + +import com.student.zhang.entity.Score; +import com.student.zhang.exception.ServiceValidationException; +import com.student.zhang.mapper.ICourseMapper; +import com.student.zhang.mapper.IScoreMapper; +import com.student.zhang.mapper.IStudentMapper; +import com.student.zhang.service.IScoreService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +@Slf4j +/** + * 成绩业务实现类 + */ +@Service("scoreService") +public class ScoreServiceImpl implements IScoreService { + + @Resource + private IScoreMapper scoreMapper; + @Resource + private IStudentMapper studentMapper; + @Resource + private ICourseMapper courseMapper; + + + + @Override + public List> list(int pageIndex, Integer[] courseId, Integer[] studentId) { + List> maps = scoreMapper.select(pageIndex, 5,courseId,studentId); + String hello = new String("hello"); + String a="hello"; + + return maps; + } + + @Override + public boolean save(Score score) { + if (score.getId() != null && scoreMapper.countById(score.getId()) == 0) { + throw new ServiceValidationException("该班ID不存在", 402); + } + if (score.getId() == null && scoreMapper.countByStuIdAndCourseId(score.getStudent_id(), score.getCourse_id()) > 0) { + throw new ServiceValidationException("该成绩已经在成绩表中存在,无需再次添加!", 402); + } + if ((studentMapper.countById(score.getStudent_id()) < 1) || (courseMapper.countById(score.getCourse_id()) < 1)) { + throw new ServiceValidationException("您输入的学生编号或者课程编号不存在,不能修改和添加", 402); + } + //如果score的id不存在,那么就新增一个成绩,如果存在,就修改 + return score.getId() == null ? scoreMapper.insert(score) > 0 : scoreMapper.update(score) > 0; + } + + @Override + public boolean remove(int id) { + if (scoreMapper.countById(id) == 0) { + throw new ServiceValidationException("ID不存在,没有这个成绩,无需删除!", 402); + } + return scoreMapper.delete(id) > 0; + } + + @Override + public int getTotal() { + return scoreMapper.getTotal(); + } + + + + @Override + public int getSumByStudentId(int studentId) { + return scoreMapper.selectSumByStudentId(studentId); + } + + +} diff --git a/src/main/java/com/student/zhang/service/impl/StudentServiceImpl.java b/src/main/java/com/student/zhang/service/impl/StudentServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..d4d5b9770eb9d283ed9cd2966e0546ce74f30a5d --- /dev/null +++ b/src/main/java/com/student/zhang/service/impl/StudentServiceImpl.java @@ -0,0 +1,119 @@ +package com.student.zhang.service.impl; + + +import com.student.zhang.bean.Page; + +import com.student.zhang.entity.BorrowRecord; +import com.student.zhang.entity.Student; +import com.student.zhang.exception.ServiceValidationException; +import com.student.zhang.mapper.IBorrowRecordMapper; +import com.student.zhang.mapper.IScoreMapper; +import com.student.zhang.mapper.IStudentMapper; +import com.student.zhang.service.IBorrowRecordService; +import com.student.zhang.service.IStudentService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.TransactionStatus; + +import javax.annotation.Resource; +import java.sql.SQLException; +import java.time.LocalDateTime; + +/** + * 学生服务实现类 + */ +@Service("studentService") +@Slf4j +public class StudentServiceImpl implements IStudentService { + + @Resource + IBorrowRecordMapper borrowRecordMapper; + @Resource + TransactionDefinition transactionDefinition; //配置事务定义器 + @Resource + PlatformTransactionManager transactionManager; //配置事务管理器 + @Resource + IBorrowRecordService borrowRecordService; + + + @Resource + private IScoreMapper scoreMapper; + @Resource + IStudentMapper studentMapper; + + @Override + public Page list(int pageIndex, Integer clazzId, String name) { + Page studentPage = new Page(pageIndex, 5); + studentPage.setRecords(studentMapper.select(pageIndex, 5, clazzId, name)); + studentPage.setTotal(studentMapper.countPage()); + return studentPage; + } + +// @Override +// @Transactional +// public boolean borrowMoney(int student1Id, int student2Id, int money) throws SQLException { +// int result2 = studentMapper.updateMoney(student2Id, -money); //加钱 +// int result1 = studentMapper.updateMoney(student1Id, money); //减钱 +// if (result1 > 0 && result2 > 0) { +// borrowRecordDao.insert(new BorrowRecord(student1Id, student2Id, money)); +// log.info("成功添加借钱记录" + "-----" + LocalDateTime.now()); +// return true; +// } else { +// log.info("添加失败"); +// return false; +// } +// } + + + @Override + public boolean save(Student student) { + if (student.getId() != null && studentMapper.countById(student.getId()) == 0) { + throw new ServiceValidationException("该学生ID不存在", 402); + } + //不允许重名 +// if (studentMapper.countByName(student.getName()) > 0) { +// throw new ServiceValidationException("该学生名称已存在", 402); +// } + if (studentMapper.countByClazzIdForStudent(student.getClazzId()) == 0) { + throw new ServiceValidationException("新增失败,班级表中没有该班级,不能为其分配该班级!!", 402); + } + if (student.getId() == null) { + student.setMoney(100); //当创建新的学生时,初始余额100元 + return studentMapper.insert(student) > 0; + } else { + return studentMapper.update(student) > 0; + } + } + + @Override + public boolean remove(int id) { + if (scoreMapper.countByStudentId(id) > 0 || borrowRecordMapper.countByStudentId(id) > 0) { + throw new ServiceValidationException("该学生与其他表有关联,不能删除", 402); + } + if (studentMapper.countById(id) == 0) { + throw new ServiceValidationException("ID不存在,没有这个学生,无需删除!", 402); + } + return studentMapper.delete(id) > 0; + } + + public boolean borrowMoney(int student1Id, int student2Id, int money) throws SQLException { + //创建一个事务状态对象 + TransactionStatus transactionStatus = transactionManager.getTransaction(transactionDefinition); + borrowRecordService.save(new BorrowRecord(student1Id, student2Id, money)); + try { + int result2 = studentMapper.updateMoney(student2Id, -money); //加钱 + int result1 = studentMapper.updateMoney(student1Id, money); //减钱 + //如果上面的若干代码均未报错,则提交事务 + transactionManager.commit(transactionStatus); + log.info("成功添加借钱记录-----金额:" + money + "------" + LocalDateTime.now()); + return result1 > 0 & result2 > 0; + } catch (Exception exception) { + //如果上面的若干代码有一处报错,则try里面的代码执行的结果全数回滚 + transactionManager.rollback(transactionStatus); + log.info("添加失败借钱记录-----" + LocalDateTime.now()); + } + return false; + } +} diff --git a/src/main/java/com/student/zhang/service/impl/SystemLogServiceImpl.java b/src/main/java/com/student/zhang/service/impl/SystemLogServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..ac6b41be75d6d75bf3c58419f72dbe19c59e5159 --- /dev/null +++ b/src/main/java/com/student/zhang/service/impl/SystemLogServiceImpl.java @@ -0,0 +1,61 @@ +package com.student.zhang.service.impl; + + +import com.student.zhang.bean.Page; +import com.student.zhang.entity.SystemLog; +import com.student.zhang.mapper.ISystemLogMapper; +import com.student.zhang.service.ISystemLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 系统日志服务实现类 + */ +@Slf4j +@Service("systemLogService") +public class SystemLogServiceImpl implements ISystemLogService { + + @Resource + private ISystemLogMapper systemLogMapper; + + /** + * 获取系统日志信息 + * @param pageIndex + * @return + */ + @Override + public Page list(int pageIndex) { + Page systemLogPage = new Page(pageIndex, 5); + systemLogPage.setRecords(systemLogMapper.select(pageIndex, 5)); + systemLogPage.setTotal(systemLogMapper.countPage()); + return systemLogPage; + } + + + /** + * 添加系统日志 + * @param systemLog 系统日志 + * @return + */ + @Override + public boolean save(SystemLog systemLog) { + if (systemLogMapper.insert(systemLog)>0){ + log.info("成功保存系统操作日志记录......"); + return true; + } + return false; + } + + /** + * 移除系统日志 + * @param id + * @return + */ + @Override + public boolean remove(int id) { + return systemLogMapper.delete(id)>0; + } + +} diff --git a/src/main/java/com/student/zhang/service/impl/TeacherServiceImpl.java b/src/main/java/com/student/zhang/service/impl/TeacherServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..3da8d8374d512b42ec7780b7f9e15fcd8b6a34b8 --- /dev/null +++ b/src/main/java/com/student/zhang/service/impl/TeacherServiceImpl.java @@ -0,0 +1,57 @@ +package com.student.zhang.service.impl; + + +import com.student.zhang.bean.Page; +import com.student.zhang.entity.Teacher; +import com.student.zhang.exception.ServiceValidationException; +import com.student.zhang.mapper.ICourseMapper; +import com.student.zhang.mapper.ITeacherMapper; +import com.student.zhang.service.ITeacherService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Slf4j +@Service("teacherService") +public class TeacherServiceImpl implements ITeacherService { + + @Resource + private ITeacherMapper teacherMapper; + @Resource + private ICourseMapper courseMapper; + + @Override + public Page list(int pageIndex) { + Page studentPage = new Page(pageIndex, 5); + studentPage.setRecords(teacherMapper.select(pageIndex, 5)); + studentPage.setTotal(teacherMapper.countPage()); + return studentPage; + } + + + + @Override + public boolean save(Teacher teacher) { + if (teacher.getId() != null && teacherMapper.countById(teacher.getId()) == 0) { + throw new ServiceValidationException("该教师ID不存在", 402); + } + if (teacherMapper.countByName(teacher.getName()) > 0) { + throw new ServiceValidationException("该教师名称已存在", 402); + } + //如果class的id不存在,那么就新增一个教师,如果存在,就修改 + return teacher.getId() == null ? teacherMapper.insert(teacher) > 0 : teacherMapper.update(teacher) > 0; + } + + @Override + public boolean remove(int id) { + if (courseMapper.countByTeacherId(id) > 0) { + throw new ServiceValidationException("该数据与其他表有关联,不能删除", 402); + } + if (teacherMapper.countById(id) == 0) { + throw new ServiceValidationException("ID不存在,没有这个教师,无需删除!", 402); + } + return teacherMapper.delete(id) > 0; + } + +} diff --git a/src/main/java/com/student/zhang/service/impl/UserServiceImpl.java b/src/main/java/com/student/zhang/service/impl/UserServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..8c0535af5cb7776b6a93372c1099316c2a90ba9e --- /dev/null +++ b/src/main/java/com/student/zhang/service/impl/UserServiceImpl.java @@ -0,0 +1,57 @@ +package com.student.zhang.service.impl; + +import com.student.zhang.entity.User; +import com.student.zhang.exception.ServiceValidationException; +import com.student.zhang.mapper.IUserMapper; +import com.student.zhang.service.IUserService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 班级服务实现类 + */ +@Service("userService") +public class UserServiceImpl implements IUserService { + + @Resource + private IUserMapper userMapper; + + @Override + public void login(User user) throws ServiceValidationException { + User loginUser = userMapper.selectByAccount(user.getAccount()); + if (loginUser == null) { + //未找到该用户 + throw new ServiceValidationException("登录失败,账号不存在,请前往注册", 401); + } + if (!loginUser.getPassword().equals(user.getPassword())) { + //检测到用户,但是密码错误 + throw new ServiceValidationException("登录失败,账号或密码错误", 401); + } + + } + @Override + public User getByAccount(String account) { + return userMapper.selectByAccount(account); + } + + @Override + public void downloadFile(String account) { + int deMoney = 5; //单次下载扣除的积分 + User user = userMapper.selectByAccount(account); //获取当前登录者对象 + if (user.getMoney() < 5) { + //积分不足,不允许下载 + throw new ServiceValidationException("积分不足,不允许下载", 402); + } + userMapper.update(account,deMoney); //执行扣除积分 + } + + @Override + public boolean register(User user) { + if (userMapper.selectByAccount(user.getAccount())!=null) + throw new ServiceValidationException("注册失败,账号已经存在",402); + user.setMoney(100); //用户注册就有100元 + return userMapper.insert(user)>0; + } + +} diff --git a/src/main/java/com/student/zhang/utils/SecurityUtils.java b/src/main/java/com/student/zhang/utils/SecurityUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..3bb66cb3e31fb2db7fa7da587b18a5a0014ba861 --- /dev/null +++ b/src/main/java/com/student/zhang/utils/SecurityUtils.java @@ -0,0 +1,35 @@ +package com.student.zhang.utils; + +import java.security.MessageDigest; + +public class SecurityUtils { + + /** + * MD5加密 + * + * @param input + * @return + */ + public static String md5Encrypt(String input) { + char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + try { + byte[] btInput = input.getBytes(); + MessageDigest mdInst = MessageDigest.getInstance("MD5"); + mdInst.update(btInput); + byte[] md = mdInst.digest(); + int j = md.length; + char str[] = new char[j * 2]; + int k = 0; + for (int i = 0; i < j; i++) { + byte byte0 = md[i]; + str[k++] = hexDigits[byte0 >>> 4 & 0xf]; + str[k++] = hexDigits[byte0 & 0xf]; + } + return new String(str); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + +} diff --git a/src/main/java/com/student/zhang/utils/ServletUtils.java b/src/main/java/com/student/zhang/utils/ServletUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..e37e00fc994de7d80d880c8527a15ffc84ed2c4d --- /dev/null +++ b/src/main/java/com/student/zhang/utils/ServletUtils.java @@ -0,0 +1,28 @@ +package com.student.zhang.utils; + +import javax.servlet.ServletContext; + +public class ServletUtils { + + /** + * 记录访问量 + * @param context + * @return 返回访问量 + */ + public static int recordVisits(ServletContext context) { +// Object visitsObj = context.getAttribute("visits"); //从上下文属性中获取visits属性值 +// if (visitsObj == null) { +// //获取上下文初始化参数,然后赋值给visits对象 +// visits = Integer.parseInt(context.getInitParameter("visits")); +// } else { +// visits = Integer.parseInt(visitsObj.toString()); +// } + + + int visits = Integer.parseInt(context.getAttribute("visits").toString());//从上下文属性中获取visits属性值 + //获取完之后,再将visits存入上下文属性中 + context.setAttribute("visits", ++visits); + return visits; + } + +} diff --git a/src/main/java/com/student/zhang/utils/TokenUtils.java b/src/main/java/com/student/zhang/utils/TokenUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..e9de29d4dc830ed8ef594ee892e9346875d7931d --- /dev/null +++ b/src/main/java/com/student/zhang/utils/TokenUtils.java @@ -0,0 +1,58 @@ +package com.student.zhang.utils; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.interfaces.DecodedJWT; + +import java.util.Date; + +/** + * 令牌工具类 + */ +public class TokenUtils { + + final static String issuer = "hong"; + final static String secret = "123456"; + + static Algorithm algorithm = Algorithm.HMAC256(secret); //创建一个HMAC256算法对象 + + /** + * 生成令牌 + * @param sign 标识 + * @param issuedTime 令牌创建时间 + * @param expiresTime 令牌过期时间 + * @return + */ + public static String generate(Object sign, Date issuedTime, Date expiresTime) { + String token = JWT.create() + .withIssuer(issuer) //配置令牌创建者 + .withIssuedAt(issuedTime) //配置令牌创建时间 + .withExpiresAt(expiresTime) //配置令牌过期时间 + .withClaim("sign", sign.toString()) //配置令牌携带标识 + .sign(algorithm); //完成签名,并生成token + + return token; + } + + + /** + * 验证Token + * @param token + * @return 令牌携带标识,如果返回了正常的字符串,说明验证通过。如果返回null,说明验证未通过。 + */ + public static String verify(String token) { + try { + JWTVerifier verifier = JWT.require(algorithm).withIssuer(issuer).build(); //创建JWT验证器对象 + DecodedJWT decodedJWT = verifier.verify(token); + String result = decodedJWT.getClaim("sign").toString(); + if (result.startsWith("\"")) result = result.substring(1); + if (result.endsWith("\"")) result = result.substring(0, result.length() - 1); + return result; + } catch (Exception e) { + System.err.println("Token '" + token + "' is not certified\t" + e.getMessage()); + return null; + } + } + +} diff --git a/src/main/java/com/student/zhang/utils/ViewUtils.java b/src/main/java/com/student/zhang/utils/ViewUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..8aa7f670e5b85e4297da5766c5ea81b9666cd7d2 --- /dev/null +++ b/src/main/java/com/student/zhang/utils/ViewUtils.java @@ -0,0 +1,35 @@ +package com.student.zhang.utils; + + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; + +import java.time.LocalDateTime; + +/** + * 视图工作类 + */ +public class ViewUtils { + + /** + * 返回JSON数据 + * @param message + * @param value + * @param state + * @return + */ + public static String view(String message, Object value, int state) { + JSONObject object = new JSONObject(true); + object.put("state", state); + if (message != null) { + object.put("message", message); + } + if (value != null) { + object.put("value", JSON.toJSON(value)); + } + object.put("timestamp", LocalDateTime.now()); + return object.toJSONString(); + } + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..138aff3b3ad1d433df0b6d61dd4c8e6e8cd063b8 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,21 @@ +mybatis: + mapper-locations: classpath:mapper/*xml + configuration: + map-underscore-to-camel-case: true + cache-enabled: true +server: + port: 8080 + servlet: + context-path: /api +spring: + application: + name: Study-SpringBoot + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + name: defaultDataSource + password: 1149591237 + url: jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 + username: root +logging: + level: + com.student.zhang.mapper: trace diff --git a/src/main/resources/banner.txt b/src/main/resources/banner.txt new file mode 100644 index 0000000000000000000000000000000000000000..22243696c2ec183a7b012a1605b0f994b949b794 --- /dev/null +++ b/src/main/resources/banner.txt @@ -0,0 +1,13 @@ + + _____________________________________________________ + _______ | | + / _____ | | 项目启动啦 | + / /(__) || | | + ________/ / |OO| || | | + | |-------|| | | +(| | -.|| |_______________________ | + | ____ \ ||_________||____________ | ____ ____ | +/| / __ \ |______|| / __ \ / __ \ | | / __ \ / __ \ |\ +\|| / \ |_______________| / \ |_| / \ |__| |___________| / \ |__| / \|_|/ + | () | | () | | () | | () | | () | + \__/ \__/ \__/ \__/ \__/ \ No newline at end of file diff --git a/src/main/resources/mapper/clazz.xml b/src/main/resources/mapper/clazz.xml new file mode 100644 index 0000000000000000000000000000000000000000..a0d3cbbf68465459e581032170859fac4a31aafc --- /dev/null +++ b/src/main/resources/mapper/clazz.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/course.xml b/src/main/resources/mapper/course.xml new file mode 100644 index 0000000000000000000000000000000000000000..c2a9092ea4a953d6b424b95890465f563c89e250 --- /dev/null +++ b/src/main/resources/mapper/course.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/score.xml b/src/main/resources/mapper/score.xml new file mode 100644 index 0000000000000000000000000000000000000000..e4142776ed6c1c17a81704dcd934443c788dacc1 --- /dev/null +++ b/src/main/resources/mapper/score.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/student.xml b/src/main/resources/mapper/student.xml new file mode 100644 index 0000000000000000000000000000000000000000..1c19121507d0231c0388a93e44402fc46cd29be7 --- /dev/null +++ b/src/main/resources/mapper/student.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/systemLog.xml b/src/main/resources/mapper/systemLog.xml new file mode 100644 index 0000000000000000000000000000000000000000..7457d8917f3a1c646be99f649acae480224aee88 --- /dev/null +++ b/src/main/resources/mapper/systemLog.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/teacher.xml b/src/main/resources/mapper/teacher.xml new file mode 100644 index 0000000000000000000000000000000000000000..daea8afbb5eff49be1d294bc684f0eca4148a924 --- /dev/null +++ b/src/main/resources/mapper/teacher.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/user.xml b/src/main/resources/mapper/user.xml new file mode 100644 index 0000000000000000000000000000000000000000..4dc12e91d0c57d654acd3d414c68898a3bf9c918 --- /dev/null +++ b/src/main/resources/mapper/user.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/java/com/student/zhang/StudySpringBootApplicationTests.java b/src/test/java/com/student/zhang/StudySpringBootApplicationTests.java new file mode 100644 index 0000000000000000000000000000000000000000..72791dc4cde42503f7730ee86cae124bc642a056 --- /dev/null +++ b/src/test/java/com/student/zhang/StudySpringBootApplicationTests.java @@ -0,0 +1,36 @@ +package com.student.zhang; + +import com.student.zhang.entity.User; +import com.student.zhang.mapper.IUserMapper; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import javax.annotation.Resource; + +@SpringBootTest +@Slf4j +class StudySpringBootApplicationTests { + + @Test + void contextLoads() { + + + } + + @Resource + IUserMapper userMapper; + @Test + public void testLogin(){ + log.info("注册成功!"); + userMapper.insert(new User("测试","123456")); + } + + @Test + public void getUser(){ + User user = userMapper.selectByAccount("root"); + log.info(user.toString()); + } + + +}