diff --git a/src/demo/backend/.gitignore b/src/demo/backend/.gitignore
new file mode 100644
index 00000000..549e00a2
--- /dev/null
+++ b/src/demo/backend/.gitignore
@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
diff --git a/src/demo/backend/.mvn/wrapper/MavenWrapperDownloader.java b/src/demo/backend/.mvn/wrapper/MavenWrapperDownloader.java
new file mode 100644
index 00000000..a45eb6ba
--- /dev/null
+++ b/src/demo/backend/.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/src/demo/backend/.mvn/wrapper/maven-wrapper.jar b/src/demo/backend/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 00000000..2cc7d4a5
Binary files /dev/null and b/src/demo/backend/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/src/demo/backend/.mvn/wrapper/maven-wrapper.properties b/src/demo/backend/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 00000000..ffdc10e5
--- /dev/null
+++ b/src/demo/backend/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.1/apache-maven-3.8.1-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/src/demo/backend/mvnw b/src/demo/backend/mvnw
new file mode 100644
index 00000000..3c8a5537
--- /dev/null
+++ b/src/demo/backend/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/src/demo/backend/mvnw.cmd b/src/demo/backend/mvnw.cmd
new file mode 100644
index 00000000..c8d43372
--- /dev/null
+++ b/src/demo/backend/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/src/demo/backend/pom.xml b/src/demo/backend/pom.xml
new file mode 100644
index 00000000..db43e84e
--- /dev/null
+++ b/src/demo/backend/pom.xml
@@ -0,0 +1,126 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.5.0
+
+
+ com.example
+ demo
+ 0.0.1-SNAPSHOT
+ demo
+ recommend project for Spring Boot
+
+ 1.8
+
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ 3.3.1.tmp
+
+
+ mysql
+ mysql-connector-java
+ 8.0.18
+
+
+ org.projectlombok
+ lombok
+ 1.18.10
+
+
+
+ org.apache.velocity
+ velocity-engine-core
+ 2.2
+
+
+
+ com.baomidou
+ mybatis-plus-generator
+ 3.3.1.tmp
+
+
+
+ com.spring4all
+ swagger-spring-boot-starter
+ 1.7.1.RELEASE
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-logging
+
+
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
+
+
+ org.apache.shiro
+ shiro-spring
+ 1.4.0
+
+
+
+ com.alibaba
+ fastjson
+ 1.2.76
+
+
+
+ redis.clients
+ jedis
+ 3.6.3
+
+
+ org.springframework.data
+ spring-data-redis
+ 2.5.3
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+ 1.4.1.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+ src/main/resources
+
+
+
+
diff --git a/src/demo/backend/src/main/java/com/example/demo/DemoApplication.java b/src/demo/backend/src/main/java/com/example/demo/DemoApplication.java
new file mode 100644
index 00000000..d19a89d2
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/DemoApplication.java
@@ -0,0 +1,15 @@
+package com.example.demo;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cache.annotation.EnableCaching;
+
+@SpringBootApplication
+@MapperScan("com.example.demo.mapper")
+@EnableCaching
+public class DemoApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(DemoApplication.class, args);
+ }
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/config/CORSAuthenticationFilter.java b/src/demo/backend/src/main/java/com/example/demo/config/CORSAuthenticationFilter.java
new file mode 100644
index 00000000..b85a75d1
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/config/CORSAuthenticationFilter.java
@@ -0,0 +1,50 @@
+package com.example.demo.config;
+
+import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
+import org.springframework.http.HttpStatus;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+// 过滤OPTIONS请求,继承shiro的form表单过滤器,对OPTIONS请求进行过滤,复杂请求中OPTIONS请求不带token信息,不能通过shiro认证
+public class CORSAuthenticationFilter extends FormAuthenticationFilter {
+
+ private static final String REQUEST_TYPE = "OPTIONS";
+
+ public CORSAuthenticationFilter(){
+ super();
+ }
+
+ @Override
+ public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue){
+ if (((HttpServletRequest) request).getMethod().toUpperCase().equals(REQUEST_TYPE)) {
+ return true;
+ }
+ return super.isAccessAllowed(request, response, mappedValue);
+ }
+
+ @Override
+ protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception{
+ HttpServletResponse res = (HttpServletResponse)response;
+ HttpServletRequest req = (HttpServletRequest)request;
+ res.addHeader("Access-Control-Allow-Origin", req.getHeader("origin"));
+ setHeader(req,res);
+ res.setStatus(HttpServletResponse.SC_OK);
+ res.setCharacterEncoding("UTF-8");
+ return false;
+ }
+ // 为response设置header,实现跨域
+ private void setHeader(HttpServletRequest request,HttpServletResponse response){
+ // 跨域的header设置
+ response.setHeader("Access-control-Allow-Origin", request.getHeader("Origin"));
+ response.setHeader("Access-Control-Allow-Methods", request.getMethod());
+ response.setHeader("Access-Control-Allow-Credentials", "true");
+ response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));
+ // 防止乱码,适用于传输JSON数据
+ // Content-Type, Content-Length, Authorization, Accept, X-Requested-With, yourHeaderField
+ response.setHeader("Content-Type","application/json;charset=UTF-8");
+ response.setStatus(HttpStatus.OK.value());
+ }
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/config/CorsConfig.java b/src/demo/backend/src/main/java/com/example/demo/config/CorsConfig.java
new file mode 100644
index 00000000..96be83f7
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/config/CorsConfig.java
@@ -0,0 +1,32 @@
+package com.example.demo.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+
+// 跨域访问控制
+@Configuration
+public class CorsConfig {
+ private CorsConfiguration buildConfig(){
+ CorsConfiguration corsConfiguration=new CorsConfiguration();
+ // 允许任何域名使用
+ corsConfiguration.addAllowedOriginPattern("*");
+ // 允许任何请求头使用
+ corsConfiguration.addAllowedHeader("*");
+ // 允许任何方法
+ corsConfiguration.addAllowedMethod("*");
+ // 允许携带信息
+ corsConfiguration.setAllowCredentials(true);
+ return corsConfiguration;
+ }
+
+ @Bean
+ public CorsFilter corsFilter(){
+ UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+ // 对接口配置跨域设置
+ source.registerCorsConfiguration("/**", buildConfig());
+ return new CorsFilter(source);
+ }
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/config/EnceladusShiroRealm.java b/src/demo/backend/src/main/java/com/example/demo/config/EnceladusShiroRealm.java
new file mode 100644
index 00000000..cd2b398c
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/config/EnceladusShiroRealm.java
@@ -0,0 +1,66 @@
+package com.example.demo.config;
+
+import com.example.demo.entity.Permission;
+import com.example.demo.entity.Role;
+import com.example.demo.entity.User;
+import com.example.demo.service.UserService;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.authc.SimpleAuthenticationInfo;
+import org.apache.shiro.authz.AuthorizationInfo;
+import org.apache.shiro.authz.SimpleAuthorizationInfo;
+import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.subject.PrincipalCollection;
+import org.apache.shiro.util.ByteSource;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class EnceladusShiroRealm extends AuthorizingRealm {
+
+ @Autowired
+ private UserService userService;
+
+ // 进行权限校验时调用
+ @Override
+ protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection){
+ SimpleAuthorizationInfo simpleAuthorizationInfo=new SimpleAuthorizationInfo();
+ String userName=(String) principalCollection.getPrimaryPrincipal();
+ User user=userService.findAllUserInfoByUsername(userName);
+ List stringRoleList=new ArrayList<>();
+ List stringPermissionList=new ArrayList<>();
+ List roleList=user.getRoleList();
+
+ for(Role role:roleList){
+ stringRoleList.add(role.getName());
+ List permissionList=role.getPermissionList();
+ for(Permission p:permissionList){
+ if (null != p) {
+ stringPermissionList.add(p.getName());
+ }
+ }
+ }
+ simpleAuthorizationInfo.addRoles(stringRoleList);
+ simpleAuthorizationInfo.addStringPermissions(stringPermissionList);
+ SecurityUtils.getSubject().getSession().setAttribute("roleList", stringRoleList);
+ return simpleAuthorizationInfo;
+ }
+
+ // 登录校验调用
+ @Override
+ protected SimpleAuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
+
+ String username=(String) token.getPrincipal();
+ System.out.println("principal:"+username);
+ User user=userService.findAllUserInfoByUsername(username);
+ System.out.println("principal password:"+user.getPassWord());
+
+ String passWord=user.getPassWord();
+ if(null==passWord|| "".equals(passWord)){
+ return null;
+ }
+ return new SimpleAuthenticationInfo(user.getUserName(), user.getPassWord(), ByteSource.Util.bytes(user.getSalt()), getName());
+ }
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/config/ShiroConfig.java b/src/demo/backend/src/main/java/com/example/demo/config/ShiroConfig.java
new file mode 100644
index 00000000..3294a5f0
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/config/ShiroConfig.java
@@ -0,0 +1,86 @@
+package com.example.demo.config;
+
+import com.example.demo.util.PasswordHelper;
+import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
+import org.apache.shiro.mgt.SecurityManager;
+import org.apache.shiro.session.mgt.SessionManager;
+import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
+import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
+import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.servlet.Filter;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+@Configuration
+public class ShiroConfig {
+
+ @Bean
+ public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager){
+ ShiroFilterFactoryBean shiroFilterFactoryBean=new ShiroFilterFactoryBean();
+ shiroFilterFactoryBean.setSecurityManager(securityManager);
+
+ Map customFilterMap = new LinkedHashMap<>();
+ customFilterMap.put("corsAuthenticationFilter",new CORSAuthenticationFilter());
+ shiroFilterFactoryBean.setFilters(customFilterMap);
+
+ Map filterChainDefinitionMap=new LinkedHashMap<>();
+
+ //author url定义必须通过认证才可以访问
+ //anon url可以匿名访问
+ shiroFilterFactoryBean.setLoginUrl("/login");
+ shiroFilterFactoryBean.setUnauthorizedUrl("/unauthor");
+ shiroFilterFactoryBean.setSuccessUrl("/home/index");
+
+ // 过滤器 按照顺序进行拦截
+ // author 所有已登陆用户可访问
+ // roles 有指定角色的用户可访问,通过[ ]指定具体角色,这里的角色名称与数据库中配置一致
+ // perms 有指定权限的用户可访问,通过[ ]指定具体权限,这里的权限名称与数据库中配置一致
+ // anon 所有用户可访问,通常作为指定页面的静态资源时使用
+ filterChainDefinitionMap.put("/*", "anon");
+ filterChainDefinitionMap.put("/logout","logout");
+ filterChainDefinitionMap.put("/login","anon");
+ filterChainDefinitionMap.put("/cart","roles[member]");
+ filterChainDefinitionMap.put("/myOrder","roles[member]");
+ shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
+ return shiroFilterFactoryBean;
+ }
+
+ @Bean
+ public HashedCredentialsMatcher hashedCredentialsMatcher(){
+ HashedCredentialsMatcher hashedCredentialsMatcher=new HashedCredentialsMatcher();
+ hashedCredentialsMatcher.setHashAlgorithmName(PasswordHelper.ALGORITHM_NAME);
+ hashedCredentialsMatcher.setHashIterations(PasswordHelper.HASH_ITERATIONS);
+ return hashedCredentialsMatcher;
+ }
+
+ @Bean
+ public EnceladusShiroRealm shiroRealm(){
+ EnceladusShiroRealm enceladusShiroRealm=new EnceladusShiroRealm();
+ enceladusShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());
+ return enceladusShiroRealm;
+ }
+
+ @Bean
+ public SecurityManager securityManager(){
+ DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
+ securityManager.setRealm(shiroRealm());
+ securityManager.setSessionManager(sessionManager());
+ return securityManager;
+ }
+
+ @Bean
+ public PasswordHelper passwordHelper(){
+ return new PasswordHelper();
+ }
+
+ // 将重写的shiro session注册
+ @Bean
+ public SessionManager sessionManager(){
+ ShiroSession shiroSession=new ShiroSession();
+ shiroSession.setSessionDAO(new EnterpriseCacheSessionDAO());
+ return shiroSession;
+ }
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/config/ShiroSession.java b/src/demo/backend/src/main/java/com/example/demo/config/ShiroSession.java
new file mode 100644
index 00000000..ec1f75ad
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/config/ShiroSession.java
@@ -0,0 +1,39 @@
+package com.example.demo.config;
+
+import org.apache.shiro.web.servlet.ShiroHttpServletRequest;
+import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
+import org.apache.shiro.web.util.WebUtils;
+import org.springframework.util.StringUtils;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import java.io.Serializable;
+
+public class ShiroSession extends DefaultWebSessionManager {
+ // 定义的请求头中使用的标记key,用来传递token
+ private static final String AUTH_TOKEN = "authToken";
+
+ private static final String REFERENCED_SESSION_ID_SOURCE = "Stateless request";
+
+ public ShiroSession(){
+ super();
+ }
+
+ @Override
+ protected Serializable getSessionId(ServletRequest request, ServletResponse response){
+ // 获取请求头中对token,值即为sessionId
+ String sessionId = WebUtils.toHttp(request).getHeader(AUTH_TOKEN);
+ System.out.println("请求头中的token:"+sessionId);
+ if(StringUtils.isEmpty(sessionId)){
+ // 没有携带token,根据父类方法获取sessionId
+ return super.getSessionId(request,response);
+ }else {
+ // 请求头中如果有authToken,则其值为sessionId
+ request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, REFERENCED_SESSION_ID_SOURCE);
+ // sessionId
+ request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, sessionId);
+ request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);
+ return sessionId;
+ }
+ }
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/config/WebMvcConfig.java b/src/demo/backend/src/main/java/com/example/demo/config/WebMvcConfig.java
new file mode 100644
index 00000000..5cf02b68
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/config/WebMvcConfig.java
@@ -0,0 +1,15 @@
+package com.example.demo.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+ // 配置图片路径
+ @Override
+ public void addResourceHandlers(ResourceHandlerRegistry registry) {
+ // 和页面有关的图片放在项目的img目录下
+ registry.addResourceHandler("/img/**").addResourceLocations("classpath:/img/");
+ }
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/controller/CartItemController.java b/src/demo/backend/src/main/java/com/example/demo/controller/CartItemController.java
new file mode 100644
index 00000000..87ca0b86
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/controller/CartItemController.java
@@ -0,0 +1,115 @@
+package com.example.demo.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.example.demo.entity.CartItem;
+import com.example.demo.entity.Goods;
+import com.example.demo.entity.User;
+import com.example.demo.service.CartItemService;
+import com.example.demo.service.GoodsService;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/cart")
+public class CartItemController {
+
+ @Autowired
+ private CartItemService cartItemService;
+
+ @Autowired
+ private GoodsService goodsService;
+
+ // 添加租赁物品到购物车
+ @RequestMapping("/add")
+ @Transactional(rollbackFor = {RuntimeException.class, Error.class})
+ public String add(@RequestBody Map map){
+ User user = (User) SecurityUtils.getSubject().getSession().getAttribute("user");
+ if(null!=user){
+ Integer goodsId= (Integer) map.get("goodsId");
+ QueryWrapper goodsQueryWrapper=new QueryWrapper<>();
+ goodsQueryWrapper.eq("goods_id",goodsId);
+ Goods goods=goodsService.getOne(goodsQueryWrapper);
+ System.out.println(goods);
+ CartItem cartItem=new CartItem();
+ cartItem.setUserId(user.getUserId());
+ cartItem.setGoodsId(goods.getGoodsId());
+ cartItem.setGoodsCount(1);
+ cartItem.setIsDeleted(0);
+ cartItem.setPrice(goods.getGoodsPrice());
+ cartItem.setGoodsCoverImg(goods.getGoodsCoverImg());
+ cartItem.setGoodsName(goods.getGoodsName());
+ System.out.println(cartItem);
+ cartItemService.save(cartItem);
+ return cartItem.getCartItemId().toString();
+ }else {
+ return "fail";
+ }
+ }
+
+ // 读取购物车
+ @RequestMapping("/list")
+ public String list(){
+ User user = (User) SecurityUtils.getSubject().getSession().getAttribute("user");
+ if(null!=user){
+ Integer id=user.getUserId();
+ System.out.println("id:"+id);
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("user_id",id);
+ List cartItemList=cartItemService.list(wrapper);
+ System.out.println(cartItemList.toString());
+ return JSON.toJSONString(cartItemList);
+ }else {
+ return "fail";
+ }
+ }
+
+ // 删除购物车租赁物品
+ @RequestMapping("/delete")
+ public String delete(@RequestBody Map map){
+ Integer itemId= (Integer) map.get("cartItemId");
+ User user = (User) SecurityUtils.getSubject().getSession().getAttribute("user");
+ if(null!=user){
+ Integer id=user.getUserId();
+ System.out.println("id:"+id);
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.and(i->i.eq("user_id",id).eq("cart_item_id",itemId));
+ boolean isDelete=cartItemService.remove(wrapper);
+ if(isDelete){
+ return "success";
+ }else {
+ return "fail";
+ }
+ }else {
+ return "fail";
+ }
+ }
+
+ // 修改购物车项目
+ @RequestMapping("/update")
+ public String update(@RequestBody CartItem cartItem){
+ User user = (User) SecurityUtils.getSubject().getSession().getAttribute("user");
+ if(null!=user){
+ Integer id=user.getUserId();
+ Integer carItemId=cartItem.getCartItemId();
+ System.out.println("id:"+id);
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.and(i->i.eq("user_id",id).eq("cart_item_id", carItemId));
+ boolean isUpdate=cartItemService.update(cartItem,wrapper);
+ if(isUpdate){
+ return "success";
+ }else {
+ return "fail";
+ }
+ }else {
+ return "fail";
+ }
+ }
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/controller/CategoryController.java b/src/demo/backend/src/main/java/com/example/demo/controller/CategoryController.java
new file mode 100644
index 00000000..2bb6e63c
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/controller/CategoryController.java
@@ -0,0 +1,45 @@
+package com.example.demo.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.example.demo.entity.Category;
+import com.example.demo.service.CategoryService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/category")
+public class CategoryController {
+
+ @Autowired
+ private CategoryService categoryService;
+
+ // 列出所有分类
+ @RequestMapping("/list")
+ public String list(){
+ QueryWrapper wrapper = new QueryWrapper<>();
+ QueryWrapper childrenWrapper = new QueryWrapper<>();
+ Map result=new HashMap<>();
+ wrapper.eq("parent_id", 0);
+ List categoryParentList=categoryService.list(wrapper);
+ childrenWrapper.ne("parent_id", 0);
+ List categoryChildrenList=categoryService.list(childrenWrapper);
+ result.put("categoryParentList",categoryParentList);
+ result.put("categoryChildrenList",categoryChildrenList);
+ return JSON.toJSONString(result);
+ }
+
+ // 列出所有子分类
+ @RequestMapping("/listChildrenCategory")
+ public String listChildrenCategory(){
+ QueryWrapper childrenWrapper = new QueryWrapper<>();
+ childrenWrapper.eq("category_level", 2);
+ List categoryChildrenList=categoryService.list(childrenWrapper);
+ return JSON.toJSONString(categoryChildrenList);
+ }
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/controller/EntrustController.java b/src/demo/backend/src/main/java/com/example/demo/controller/EntrustController.java
new file mode 100644
index 00000000..18c980b8
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/controller/EntrustController.java
@@ -0,0 +1,83 @@
+package com.example.demo.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.example.demo.entity.Entrust;
+import com.example.demo.entity.User;
+import com.example.demo.service.EntrustService;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/entrust")
+public class EntrustController {
+
+ @Autowired
+ private EntrustService entrustService;
+
+ // 用户发布一个委托
+ @RequestMapping("/add")
+ public String add(@RequestBody Map entrustMap){
+ User user = (User) SecurityUtils.getSubject().getSession().getAttribute("user");
+ if(null!=user){
+ Entrust entrust=new Entrust();
+ entrust.setEGoodsName((String) entrustMap.get("eGoodsName"));
+ entrust.setEGoodsIntro((String) entrustMap.get("eGoodsIntro"));
+ entrust.setEGoodsCategory((Integer) entrustMap.get("eGoodsCategory"));
+ entrust.setEGoodsCoverImg((String) entrustMap.get("eGoodsCoverImg"));
+ entrust.setEGoodsCarousel((String) entrustMap.get("eGoodsCarousel"));
+ entrust.setEGoodsDetailContent((String) entrustMap.get("eGoodsDetailContent"));
+ entrust.setEGoodsPrice(Double.parseDouble((String) entrustMap.get("eGoodsPrice")));
+ entrust.setEStockNum((Integer) entrustMap.get("eStockNum"));
+ System.out.println(entrust);
+ entrustService.save(entrust);
+ return entrust.getEntrustId().toString();
+ }else {
+ return "fail";
+ }
+ }
+
+ // 列出所有委托
+ @RequestMapping("/list")
+ public String list(){
+ User user = (User) SecurityUtils.getSubject().getSession().getAttribute("user");
+ boolean isAdmin=SecurityUtils.getSubject().hasRole("admin");
+ if(null!=user){
+ if(isAdmin){
+ List entrustList=entrustService.list();
+ return JSON.toJSONString(entrustList);
+ }else {
+ return "fail";
+ }
+ }else {
+ return "fail";
+ }
+ }
+
+ // 根据用户id列出委托
+ @RequestMapping("/listById")
+ public String listById(@RequestBody Map map){
+ Integer id= (Integer) map.get("entrustId");
+ User user = (User) SecurityUtils.getSubject().getSession().getAttribute("user");
+ System.out.println("编辑委托:"+id);
+ boolean isAdmin=SecurityUtils.getSubject().hasRole("admin");
+ if(null!=user){
+ if(isAdmin){
+ QueryWrapper entrustQueryWrapper = new QueryWrapper<>();
+ entrustQueryWrapper.eq("entrust_id",id);
+ Entrust entrust=entrustService.getOne(entrustQueryWrapper);
+ return JSON.toJSONString(entrust);
+ }else {
+ return "fail";
+ }
+ }else {
+ return "fail";
+ }
+ }
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/controller/FileController.java b/src/demo/backend/src/main/java/com/example/demo/controller/FileController.java
new file mode 100644
index 00000000..0740ec28
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/controller/FileController.java
@@ -0,0 +1,55 @@
+package com.example.demo.controller;
+
+import com.example.demo.entity.User;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.UUID;
+
+@RestController
+@RequestMapping("/file")
+public class FileController {
+
+ @RequestMapping("/upload")
+ public String fileUpload(@RequestParam(value = "img") MultipartFile file){
+ System.out.println("进入上传");
+ User user = (User) SecurityUtils.getSubject().getSession().getAttribute("user");
+ System.out.println(user);
+ if(null!=user){
+ if(file.isEmpty()){
+ System.out.println("文件是空的");
+ return "fail";
+ }
+ System.out.println("有文件");
+ // 文件名
+ String fileName = file.getOriginalFilename();
+ System.out.println(fileName);
+ // 后缀名
+ // String suffixName = fileName.substring(fileName.lastIndexOf("."));
+ // 上传后的路径
+ String filePath = "/project/gitProject_recommend/src/demo/backend/target/classes/img/";
+ // 新文件名
+ UUID uuid=UUID.randomUUID();
+ fileName = uuid + ".jpg";
+ System.out.println(fileName);
+ File dest = new File(filePath + fileName);
+ if (!dest.getParentFile().exists()) {
+ dest.getParentFile().mkdirs();
+ }
+ try {
+ file.transferTo(dest);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return uuid.toString();
+ }else {
+ System.out.println("没有用户");
+ }
+ return null;
+ }
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/controller/GoodsController.java b/src/demo/backend/src/main/java/com/example/demo/controller/GoodsController.java
new file mode 100644
index 00000000..0359fd11
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/controller/GoodsController.java
@@ -0,0 +1,93 @@
+package com.example.demo.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.example.demo.entity.Goods;
+import com.example.demo.entity.User;
+import com.example.demo.service.EntrustService;
+import com.example.demo.service.GoodsService;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/goods")
+public class GoodsController {
+
+ @Autowired
+ private GoodsService goodsService;
+
+ @Autowired
+ private EntrustService entrustService;
+
+ // 根据关键字搜索租赁物品
+ @RequestMapping("/search")
+ @Cacheable(value = "platRedis",key = "#map")
+ public String search(@RequestBody Map map){
+ String key= (String) map.get("key");
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.like("goods_name",key);
+ System.out.println(key);
+ List goodsList=goodsService.list(wrapper);
+ return JSON.toJSONString(goodsList);
+ }
+
+ // 获取物品详情
+ @RequestMapping("/detail")
+ public String detail(@RequestBody Map map){
+ Integer key= (Integer) map.get("key");
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("goods_id",key);
+ System.out.println(key);
+ Goods goods=goodsService.getOne(wrapper);
+ return JSON.toJSONString(goods);
+ }
+
+ // 从委托添加租赁物品
+ @RequestMapping("/add")
+ @Transactional(rollbackFor = {RuntimeException.class, Error.class})
+ public String add(@RequestBody Map map){
+ Goods goods=JSON.parseObject(JSON.toJSONString(map.get("entrust")),Goods.class);
+ Double price=Double.valueOf((Integer)map.get("itPrice"));
+ Integer entrustId=(Integer)map.get("entrustId");
+ goods.setGoodsPrice(price);
+ System.out.println(price);
+ User user = (User) SecurityUtils.getSubject().getSession().getAttribute("user");
+ boolean isAdmin=SecurityUtils.getSubject().hasRole("admin");
+ if(null!=user){
+ if(isAdmin){
+ System.out.println(goods);
+ goods.setGoodsStatus(1);
+ goodsService.save(goods);
+ entrustService.removeById(entrustId);
+ return goods.getGoodsId().toString();
+ }else {
+ return "not admin";
+ }
+ }else {
+ return "fail";
+ }
+
+ }
+
+ @RequestMapping("/searchByOrder")
+ public String searchByOrder(@RequestBody Map map){
+ String key= (String) map.get("key");
+ String order= (String) map.get("order");
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.like("goods_name",key);
+ wrapper.orderByAsc(order);
+ System.out.println(key);
+ List goodsList=goodsService.list(wrapper);
+ return JSON.toJSONString(goodsList);
+ }
+}
+
diff --git a/src/demo/backend/src/main/java/com/example/demo/controller/HomeController.java b/src/demo/backend/src/main/java/com/example/demo/controller/HomeController.java
new file mode 100644
index 00000000..a12efa67
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/controller/HomeController.java
@@ -0,0 +1,91 @@
+package com.example.demo.controller;
+
+import com.example.demo.entity.User;
+import com.example.demo.entity.UserRole;
+import com.example.demo.service.UserRoleService;
+import com.example.demo.service.UserService;
+import com.example.demo.util.PasswordHelper;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.IncorrectCredentialsException;
+import org.apache.shiro.authc.UnknownAccountException;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.subject.Subject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/home")
+public class HomeController {
+
+ @Autowired
+ private UserService userService;
+
+ @Autowired
+ private UserRoleService userRoleService;
+
+ @Autowired
+ public PasswordHelper passwordHelper;
+
+ // 登录
+ @RequestMapping("/login")
+ public String login(@RequestBody Map map){
+ String userName= (String) map.get("userName");
+ String passWord= (String) map.get("passWord");
+ UsernamePasswordToken usernamePasswordToken=new UsernamePasswordToken(userName,passWord);
+ Subject subject= SecurityUtils.getSubject();
+ try{
+ System.out.println("执行login前:");
+ subject.login(usernamePasswordToken);
+ }catch (IncorrectCredentialsException ice){
+ return "password error!";
+ }catch (UnknownAccountException uae){
+ return "username error!";
+ }
+
+ User user=userService.findAllUserInfoByUsername(userName);
+ subject.getSession().setAttribute("user",user);
+ Serializable tokenId = subject.getSession().getId();
+ boolean isAdmin=SecurityUtils.getSubject().hasRole("admin");
+ System.out.println(isAdmin);
+ System.out.println(SecurityUtils.getSubject().getSession().getAttribute("roleList"));
+ return String.valueOf(tokenId);
+ }
+
+ // 注册
+ @RequestMapping("/register")
+ @Transactional(rollbackFor = {RuntimeException.class, Error.class})
+ public String register(@RequestBody User user){
+
+ System.out.println(user);
+ Date d = new Date();
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ user.setCreateTime(sdf.format(d));
+ passwordHelper.encryptPassword(user);
+
+ userService.register(user);
+ UserRole userRole=new UserRole();
+ userRole.setUserId(user.getUserId());
+ userRole.setRoleId(1);
+ userRoleService.save(userRole);
+ if(null!=user.getUserId()){
+ return "success";
+ }
+ return "fail";
+ }
+
+ // 登出
+ @RequestMapping("/logout")
+ public String register(){
+ Subject subject = SecurityUtils.getSubject();
+ subject.logout();
+ return "logout success";
+ }
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/controller/IndexConfigController.java b/src/demo/backend/src/main/java/com/example/demo/controller/IndexConfigController.java
new file mode 100644
index 00000000..6333afe9
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/controller/IndexConfigController.java
@@ -0,0 +1,35 @@
+package com.example.demo.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.example.demo.entity.IndexConfig;
+import com.example.demo.service.IndexConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+@RestController
+@RequestMapping("/index-config")
+public class IndexConfigController {
+
+ @Autowired
+ private IndexConfigService indexConfigService;
+
+ // 获取推荐列表
+ @RequestMapping("/list")
+ public String list(@RequestBody Map map){
+ Integer indexType= (Integer) map.get("indexType");
+ QueryWrapper indexConfigQueryWrapper=new QueryWrapper<>();
+ indexConfigQueryWrapper.eq("config_type",indexType);
+ List indexConfigList= indexConfigService.list(indexConfigQueryWrapper);
+ if(null!=indexConfigList){
+ return JSON.toJSONString(indexConfigList);
+ }else {
+ return "fail";
+ }
+ }
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/controller/OrderController.java b/src/demo/backend/src/main/java/com/example/demo/controller/OrderController.java
new file mode 100644
index 00000000..3d808e47
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/controller/OrderController.java
@@ -0,0 +1,151 @@
+package com.example.demo.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.example.demo.entity.CartItem;
+import com.example.demo.entity.Order;
+import com.example.demo.entity.OrderItem;
+import com.example.demo.entity.User;
+import com.example.demo.service.CartItemService;
+import com.example.demo.service.OrderItemService;
+import com.example.demo.service.OrderService;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+@RestController
+@RequestMapping("/order")
+public class OrderController {
+
+ @Autowired
+ private OrderService orderService;
+
+ @Autowired
+ private OrderItemService orderItemService;
+
+ @Autowired
+ private CartItemService cartItemService;
+
+ // 添加订单
+ @RequestMapping("/add")
+ public String add(@RequestBody Order order){
+ User user = (User) SecurityUtils.getSubject().getSession().getAttribute("user");
+ if(null!=user){
+ System.out.println(order);
+ order.setUserId(user.getUserId());
+ order.setUserAddress(user.getAddress());
+ order.setUserName(user.getUserName());
+ order.setUserPhone(user.getPhone());
+ order.setOrderNum(createNum());
+ orderService.save(order);
+ return order.getOrderId().toString();
+ }else {
+ return "fail";
+ }
+ }
+
+ // 根据用户列出订单列表
+ @RequestMapping("/listByUser")
+ public String listByUser(){
+ User user = (User) SecurityUtils.getSubject().getSession().getAttribute("user");
+ if(null!=user){
+ System.out.println(user.getUserId());
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("user_id",user.getUserId());
+ List orderList=orderService.list(wrapper);
+ for(Order order : orderList){
+ if(null!=order.getOrderId()){
+ QueryWrapper orderItemWrapper = new QueryWrapper<>();
+ orderItemWrapper.eq("order_id",order.getOrderId());
+ List orderItemList=orderItemService.list(orderItemWrapper);
+ order.setOrderItemList(orderItemList);
+ }
+ }
+ return JSON.toJSONString(orderList);
+ }else {
+ return "fail";
+ }
+ }
+
+ // 随机生成订单号
+ private String createNum(){
+ // 获取当前时间
+ SimpleDateFormat dmDate = new SimpleDateFormat("yyyyMMddHHmmss");
+
+ // 定义随机数
+ Random random = new Random();
+ // 随机数长度位数
+ int ran = random.nextInt(1000000);
+
+ Date date = new Date();
+ String dateran = dmDate.format(date);
+ String randomMath = dateran+ran;
+ return randomMath;
+ }
+
+ // 从购物车直接下单
+ @RequestMapping("/addOrderByCart")
+ @Transactional(rollbackFor = {RuntimeException.class, Error.class})
+ public String addOrderByCart(@RequestBody Map map) throws ParseException {
+ List cartItemList=JSON.parseArray(JSON.toJSONString(map.get("cartItemList")), CartItem.class);
+ Double totalPrice= Double.parseDouble((String) map.get("totalPrice"));
+ User user = (User) SecurityUtils.getSubject().getSession().getAttribute("user");
+ if(null!=user){
+ System.out.println(cartItemList);
+ System.out.println(totalPrice);
+ Order order=new Order();
+ order.setOrderNum(createNum());
+ order.setUserId(user.getUserId());
+ order.setTotalPrice(totalPrice);
+ order.setPayStatus(1);
+ Date dNow = new Date( );
+ SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
+ order.setPayTime(ft.format(dNow));
+ order.setOrderStatus(1);
+ order.setUserName(user.getUserName());
+ order.setUserPhone(user.getPhone());
+ order.setUserAddress(user.getAddress());
+ order.setCreateTime(ft.format(dNow));
+ boolean isSaveOrder=orderService.save(order);
+ if(isSaveOrder){
+ Integer orderId=order.getOrderId();
+ for(CartItem item:cartItemList){
+ OrderItem tmp=new OrderItem();
+ tmp.setOrderId(orderId);
+ tmp.setGoodsId(item.getGoodsId());
+ tmp.setGoodsName(item.getGoodsName());
+ tmp.setGoodsCoverImg(item.getGoodsCoverImg());
+ tmp.setPrice(item.getSingleTotalPrice());
+ tmp.setGoodsCount(item.getGoodsCount());
+ String format = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
+ SimpleDateFormat sdf = new SimpleDateFormat(format);
+ tmp.setCreateTime(item.getCreateTime().split("T")[0]);
+ tmp.setEndTime(item.getEndTime().split("T")[0]);
+ tmp.setUserId(user.getUserId());
+ boolean isSaveOrderItem=orderItemService.save(tmp);
+ if(isSaveOrderItem){
+ QueryWrapper cartItemQueryWrapper=new QueryWrapper<>();
+ cartItemQueryWrapper.eq("cart_item_id",item.getCartItemId());
+ cartItemService.remove(cartItemQueryWrapper);
+ }else {
+ return "fail";
+ }
+ }
+
+ }
+ return "success";
+ }else {
+ return "fail";
+ }
+ }
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/controller/OrderItemController.java b/src/demo/backend/src/main/java/com/example/demo/controller/OrderItemController.java
new file mode 100644
index 00000000..f211624b
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/controller/OrderItemController.java
@@ -0,0 +1,68 @@
+package com.example.demo.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.example.demo.entity.OrderItem;
+import com.example.demo.entity.User;
+import com.example.demo.service.OrderItemService;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/orderItem")
+public class OrderItemController {
+
+ @Autowired
+ private OrderItemService orderItemService;
+
+ // 增加物品项
+ @RequestMapping("/add")
+ public String add(@RequestBody OrderItem orderItem){
+ User user = (User) SecurityUtils.getSubject().getSession().getAttribute("user");
+ if(null!=user){
+ System.out.println(orderItem);
+ orderItem.setUserId(user.getUserId());
+ orderItemService.save(orderItem);
+ return orderItem.getOrderItemId().toString();
+ }else {
+ return "fail";
+ }
+ }
+
+ // 根据订单列出订单项
+ @RequestMapping("/listByOrder")
+ public String listByOrder(@RequestBody Map map){
+ Integer orderId= (Integer) map.get("orderId");
+ User user = (User) SecurityUtils.getSubject().getSession().getAttribute("user");
+ if(null!=user){
+ System.out.println(orderId);
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("order_id",orderId);
+ List orderItemList=orderItemService.list(wrapper);
+ return JSON.toJSONString(orderItemList);
+ }else {
+ return "fail";
+ }
+ }
+
+ // 根据用户列出订单项
+ @RequestMapping("/listByUser")
+ public List listByUser(){
+ User user = (User) SecurityUtils.getSubject().getSession().getAttribute("user");
+ if(null!=user){
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("user_id",user.getUserId());
+ List orderItemList=orderItemService.list(wrapper);
+ return orderItemList;
+ }else {
+ return null;
+ }
+ }
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/controller/PermissionController.java b/src/demo/backend/src/main/java/com/example/demo/controller/PermissionController.java
new file mode 100644
index 00000000..ebe78dd2
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/controller/PermissionController.java
@@ -0,0 +1,11 @@
+package com.example.demo.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/demo/permission")
+public class PermissionController {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/controller/RoleController.java b/src/demo/backend/src/main/java/com/example/demo/controller/RoleController.java
new file mode 100644
index 00000000..29084396
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/controller/RoleController.java
@@ -0,0 +1,11 @@
+package com.example.demo.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/demo/role")
+public class RoleController {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/controller/RolePermissionController.java b/src/demo/backend/src/main/java/com/example/demo/controller/RolePermissionController.java
new file mode 100644
index 00000000..9a85176a
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/controller/RolePermissionController.java
@@ -0,0 +1,11 @@
+package com.example.demo.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/demo/role-permission")
+public class RolePermissionController {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/controller/UserController.java b/src/demo/backend/src/main/java/com/example/demo/controller/UserController.java
new file mode 100644
index 00000000..ce79d04e
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/controller/UserController.java
@@ -0,0 +1,66 @@
+package com.example.demo.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.example.demo.entity.User;
+import com.example.demo.service.UserService;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/user")
+public class UserController {
+
+ @Autowired
+ private UserService userService;
+
+ // 获取用户信息
+ @RequestMapping("/userInfo")
+ public String userInfo(){
+ User user = (User) SecurityUtils.getSubject().getSession().getAttribute("user");
+ String result;
+ if(null!=user){
+ User tmp=new User();
+ tmp.setName(user.getName());
+ tmp.setPhone(user.getPhone());
+ tmp.setAddress(user.getAddress());
+ tmp.setSex(user.getSex());
+ tmp.setUserId(user.getUserId());
+ result=JSON.toJSONString(tmp);
+ return result;
+ }
+ return "not login";
+ }
+
+ // 判断是否为管理员
+ @RequestMapping("/isAdmin")
+ public boolean isAdmin(){
+ User user = (User) SecurityUtils.getSubject().getSession().getAttribute("user");
+ boolean isAdmin=SecurityUtils.getSubject().hasRole("admin");
+ return isAdmin;
+ }
+
+ @RequestMapping("/editUserInfo")
+ public String editUserInfo(@RequestBody User user){
+ User tmp = (User) SecurityUtils.getSubject().getSession().getAttribute("user");
+ String result;
+ System.out.println(user);
+ if(null!=user){
+ Integer id=tmp.getUserId();
+ QueryWrapper userQueryWrapper=new QueryWrapper<>();
+ userQueryWrapper.eq("user_id",id);
+ boolean isEdit=userService.update(user,userQueryWrapper);
+ if(isEdit){
+ return "success";
+ }else {
+ return "fail";
+ }
+ }else {
+ return "fail";
+ }
+ }
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/controller/UserRoleController.java b/src/demo/backend/src/main/java/com/example/demo/controller/UserRoleController.java
new file mode 100644
index 00000000..6bfd9266
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/controller/UserRoleController.java
@@ -0,0 +1,11 @@
+package com.example.demo.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/demo/user-role")
+public class UserRoleController {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/entity/CartItem.java b/src/demo/backend/src/main/java/com/example/demo/entity/CartItem.java
new file mode 100644
index 00000000..44b290d2
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/entity/CartItem.java
@@ -0,0 +1,61 @@
+package com.example.demo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="CartItem对象", description="")
+public class CartItem implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ @ApiModelProperty(value = "购物项id")
+ @TableId(value = "cart_item_id", type = IdType.AUTO)
+ private Integer cartItemId;
+
+ @ApiModelProperty(value = "用户id")
+ private Integer userId;
+
+ @ApiModelProperty(value = "物品id")
+ private Integer goodsId;
+
+ @ApiModelProperty(value = "物品数量")
+ private Integer goodsCount;
+
+ @ApiModelProperty(value = "删除标识字段(0-未删除 1-已删除)")
+ private Integer isDeleted;
+
+ @ApiModelProperty(value = "开始时间")
+ private String createTime;
+
+ @ApiModelProperty(value = "结束时间")
+ private String endTime;
+
+ @ApiModelProperty(value = "单项价")
+ private double price;
+
+ @ApiModelProperty(value = "物品图片")
+ private String goodsCoverImg;
+
+ @ApiModelProperty(value = "物品名称")
+ private String goodsName;
+
+ @ApiModelProperty(value = "总租赁天数")
+ @TableField(exist = false)
+ private Integer totalDay;
+
+ @ApiModelProperty(value = "单项总价")
+ @TableField(exist = false)
+ private double singleTotalPrice;
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/entity/Category.java b/src/demo/backend/src/main/java/com/example/demo/entity/Category.java
new file mode 100644
index 00000000..83a4e764
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/entity/Category.java
@@ -0,0 +1,40 @@
+package com.example.demo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="Category对象", description="")
+public class Category implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ @ApiModelProperty(value = "分类id")
+ @TableId(value = "category_id", type = IdType.AUTO)
+ private Integer categoryId;
+
+ @ApiModelProperty(value = "分类级别")
+ private String categoryLevel;
+
+ @ApiModelProperty(value = "父分类ID")
+ private Integer parentId;
+
+ @ApiModelProperty(value = "分类名称")
+ private String categoryName;
+
+ @ApiModelProperty(value = "删除标识(0-未删除,1-已删除)")
+ private Integer isDeleted;
+
+ @ApiModelProperty(value = "图片id")
+ private String categoryImg;
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/entity/Entrust.java b/src/demo/backend/src/main/java/com/example/demo/entity/Entrust.java
new file mode 100644
index 00000000..377f14dc
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/entity/Entrust.java
@@ -0,0 +1,49 @@
+package com.example.demo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="Entrust对象", description="")
+public class Entrust implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ @ApiModelProperty(value = "委托id")
+ @TableId(value = "entrust_id", type = IdType.AUTO)
+ private Integer entrustId;
+
+ @ApiModelProperty(value = "委托物品名称")
+ private String eGoodsName;
+
+ @ApiModelProperty(value = "物品简介")
+ private String eGoodsIntro;
+
+ @ApiModelProperty(value = "物品分类id")
+ private Integer eGoodsCategory;
+
+ @ApiModelProperty(value = "物品主图片")
+ private String eGoodsCoverImg;
+
+ @ApiModelProperty(value = "物品轮播图片")
+ private String eGoodsCarousel;
+
+ @ApiModelProperty(value = "物品详情")
+ private String eGoodsDetailContent;
+
+ @ApiModelProperty(value = "委托租赁单价 元/天")
+ private Double eGoodsPrice;
+
+ @ApiModelProperty(value = "委托数量")
+ private Integer eStockNum;
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/entity/Goods.java b/src/demo/backend/src/main/java/com/example/demo/entity/Goods.java
new file mode 100644
index 00000000..8d478aad
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/entity/Goods.java
@@ -0,0 +1,55 @@
+package com.example.demo.entity;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="Goods对象", description="")
+public class Goods implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ @ApiModelProperty(value = "物品ID")
+ @TableId(value = "goods_id", type = IdType.AUTO)
+ private Integer goodsId;
+
+ @ApiModelProperty(value = "物品名称")
+ private String goodsName;
+
+ @ApiModelProperty(value = "物品简介")
+ private String goodsIntro;
+
+ @ApiModelProperty(value = "物品分类id")
+ private Integer goodsCategoryId;
+
+ @ApiModelProperty(value = "物品主图片")
+ private String goodsCoverImg;
+
+ @ApiModelProperty(value = "物品轮播图片")
+ private String goodsCarousel;
+
+ @ApiModelProperty(value = "物品详情")
+ private String goodsDetailContent;
+
+ @ApiModelProperty(value = "物品价格")
+ private double goodsPrice;
+
+ @ApiModelProperty(value = "物品数量")
+ private Integer stockNum;
+
+ @ApiModelProperty(value = "物品上架状态(0下架,1上架)")
+ private Integer goodsStatus;
+
+ @ApiModelProperty(value = "物品评价分数(满分5)")
+ private double goodsScore;
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/entity/IndexConfig.java b/src/demo/backend/src/main/java/com/example/demo/entity/IndexConfig.java
new file mode 100644
index 00000000..4dc34f53
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/entity/IndexConfig.java
@@ -0,0 +1,40 @@
+package com.example.demo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="IndexConfig对象", description="")
+public class IndexConfig implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ @ApiModelProperty(value = "首页配置项id")
+ @TableId(value = "config_id", type = IdType.AUTO)
+ private Integer configId;
+
+ @ApiModelProperty(value = "显示名称")
+ private String configName;
+
+ @ApiModelProperty(value = "1-今日推进 2-今日优惠 3-为您推荐")
+ private Integer configType;
+
+ @ApiModelProperty(value = "物品id")
+ private Integer goodsId;
+
+ @ApiModelProperty(value = "删除标识字段(0-未删除 1-已删除)")
+ private Integer isDeleted;
+
+ @ApiModelProperty(value = "物品图片")
+ private String goodsCoverImg;
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/entity/Order.java b/src/demo/backend/src/main/java/com/example/demo/entity/Order.java
new file mode 100644
index 00000000..c946b144
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/entity/Order.java
@@ -0,0 +1,72 @@
+package com.example.demo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="Order对象", description="")
+@TableName(value = "orderKK")
+public class Order implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ @ApiModelProperty(value = "订单表id")
+ @TableId(value = "order_id", type = IdType.AUTO)
+ private Integer orderId;
+
+ @ApiModelProperty(value = "订单号")
+ private String orderNum;
+
+ @ApiModelProperty(value = "用户id")
+ private Integer userId;
+
+ @ApiModelProperty(value = "订单总价")
+ private Double totalPrice;
+
+ @ApiModelProperty(value = "支付状态:0.未支付,1.支付成功,-1:支付失败")
+ private Integer payStatus;
+
+ @ApiModelProperty(value = "支付时间")
+ private String payTime;
+
+ @ApiModelProperty(value = "订单状态:0.待支付 1.已支付 2.配货完成 3:出库成功 4.交易成功 -1.手动关闭 -2.超时关闭 -3.商家关闭")
+ private Integer orderStatus;
+
+ @ApiModelProperty(value = "订单内容描述")
+ private String extraInfo;
+
+ @ApiModelProperty(value = "收货人姓名")
+ private String userName;
+
+ @ApiModelProperty(value = "收货人手机号")
+ private String userPhone;
+
+ @ApiModelProperty(value = "收货人地址")
+ private String userAddress;
+
+ @ApiModelProperty(value = "删除标识字段(0-未删除 1-已删除)")
+ private Integer isDeleted;
+
+ @ApiModelProperty(value = "创建时间")
+ private String createTime;
+
+ @ApiModelProperty(value = "结束租赁时间")
+ private String endTime;
+
+ @ApiModelProperty(value = "订单项列表")
+ @TableField(exist = false) //非数据库字段
+ private List orderItemList;
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/entity/OrderItem.java b/src/demo/backend/src/main/java/com/example/demo/entity/OrderItem.java
new file mode 100644
index 00000000..24d9e43b
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/entity/OrderItem.java
@@ -0,0 +1,52 @@
+package com.example.demo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="OrderItem对象", description="")
+public class OrderItem implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ @ApiModelProperty(value = "订单项id")
+ @TableId(value = "order_item_id", type = IdType.AUTO)
+ private Integer orderItemId;
+
+ @ApiModelProperty(value = "关联订单id")
+ private Integer orderId;
+
+ @ApiModelProperty(value = "关联物品id")
+ private Integer goodsId;
+
+ @ApiModelProperty(value = "物品名称")
+ private String goodsName;
+
+ @ApiModelProperty(value = "物品主图")
+ private String goodsCoverImg;
+
+ @ApiModelProperty(value = "物品价格")
+ private Double price;
+
+ @ApiModelProperty(value = "物品数量")
+ private Integer goodsCount;
+
+ @ApiModelProperty(value = "创建时间")
+ private String createTime;
+
+ @ApiModelProperty(value = "结束租赁时间")
+ private String endTime;
+
+ @ApiModelProperty(value = "用户id")
+ private Integer userId;
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/entity/Permission.java b/src/demo/backend/src/main/java/com/example/demo/entity/Permission.java
new file mode 100644
index 00000000..eafd7e4d
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/entity/Permission.java
@@ -0,0 +1,30 @@
+package com.example.demo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="Permission对象", description="")
+public class Permission implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty(value = "权限名称")
+ private String name;
+
+ @ApiModelProperty(value = "接口路径")
+ private String url;
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/entity/Role.java b/src/demo/backend/src/main/java/com/example/demo/entity/Role.java
new file mode 100644
index 00000000..173af1c5
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/entity/Role.java
@@ -0,0 +1,38 @@
+package com.example.demo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="Role对象", description="")
+public class Role implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty(value = "角色名称")
+ private String name;
+
+ @ApiModelProperty(value = "描述")
+ private String description;
+
+ // 权限集合
+ @ApiModelProperty(value = "权限集合")
+ @TableField(exist = false) //非数据库字段
+ private List permissionList = new ArrayList<>();
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/entity/RolePermission.java b/src/demo/backend/src/main/java/com/example/demo/entity/RolePermission.java
new file mode 100644
index 00000000..13b7b7ff
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/entity/RolePermission.java
@@ -0,0 +1,30 @@
+package com.example.demo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="RolePermission对象", description="")
+public class RolePermission implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty(value = "角色id")
+ private Integer roleId;
+
+ @ApiModelProperty(value = "权限id")
+ private Integer permissionId;
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/entity/User.java b/src/demo/backend/src/main/java/com/example/demo/entity/User.java
new file mode 100644
index 00000000..ec8b3e68
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/entity/User.java
@@ -0,0 +1,60 @@
+package com.example.demo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="User对象", description="")
+public class User implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ @ApiModelProperty(value = "用户主键id")
+ @TableId(value = "user_id", type = IdType.AUTO)
+ private Integer userId;
+
+ @ApiModelProperty(value = "用户昵称")
+ private String name;
+
+ @ApiModelProperty(value = "性别")
+ private String sex;
+
+ @ApiModelProperty(value = "电话号码")
+ private String phone;
+
+ @ApiModelProperty(value = "登录用户名")
+ @TableField("userName")
+ private String userName;
+
+ @ApiModelProperty(value = "MD5加密后的密码")
+ @TableField("passWord")
+ private String passWord;
+
+ @ApiModelProperty(value = "收货地址")
+ private String address;
+
+ @ApiModelProperty(value = "注册时间")
+ @TableField("createTime")
+ private String createTime;
+
+ @ApiModelProperty(value = "加密盐")
+ @TableField("createTime")
+ private String salt;
+ // 角色集合
+ @ApiModelProperty(value = "角色集合")
+ @TableField(exist = false) //非数据库字段
+ private List roleList = new ArrayList<>();
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/entity/UserRole.java b/src/demo/backend/src/main/java/com/example/demo/entity/UserRole.java
new file mode 100644
index 00000000..15d4c2ba
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/entity/UserRole.java
@@ -0,0 +1,32 @@
+package com.example.demo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="UserRole对象", description="")
+public class UserRole implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty(value = "角色id")
+ private Integer roleId;
+
+ @ApiModelProperty(value = "用户id")
+ private Integer userId;
+
+ private String remarks;
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/CartItemMapper.java b/src/demo/backend/src/main/java/com/example/demo/mapper/CartItemMapper.java
new file mode 100644
index 00000000..f163f374
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/CartItemMapper.java
@@ -0,0 +1,8 @@
+package com.example.demo.mapper;
+
+import com.example.demo.entity.CartItem;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface CartItemMapper extends BaseMapper {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/CategoryMapper.java b/src/demo/backend/src/main/java/com/example/demo/mapper/CategoryMapper.java
new file mode 100644
index 00000000..00b039f6
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/CategoryMapper.java
@@ -0,0 +1,8 @@
+package com.example.demo.mapper;
+
+import com.example.demo.entity.Category;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface CategoryMapper extends BaseMapper {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/EntrustMapper.java b/src/demo/backend/src/main/java/com/example/demo/mapper/EntrustMapper.java
new file mode 100644
index 00000000..5426b0f4
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/EntrustMapper.java
@@ -0,0 +1,8 @@
+package com.example.demo.mapper;
+
+import com.example.demo.entity.Entrust;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface EntrustMapper extends BaseMapper {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/GoodsMapper.java b/src/demo/backend/src/main/java/com/example/demo/mapper/GoodsMapper.java
new file mode 100644
index 00000000..508ef0ed
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/GoodsMapper.java
@@ -0,0 +1,8 @@
+package com.example.demo.mapper;
+
+import com.example.demo.entity.Goods;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface GoodsMapper extends BaseMapper {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/IndexConfigMapper.java b/src/demo/backend/src/main/java/com/example/demo/mapper/IndexConfigMapper.java
new file mode 100644
index 00000000..4b3ddbc5
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/IndexConfigMapper.java
@@ -0,0 +1,8 @@
+package com.example.demo.mapper;
+
+import com.example.demo.entity.IndexConfig;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface IndexConfigMapper extends BaseMapper {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/OrderItemMapper.java b/src/demo/backend/src/main/java/com/example/demo/mapper/OrderItemMapper.java
new file mode 100644
index 00000000..b1d182df
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/OrderItemMapper.java
@@ -0,0 +1,8 @@
+package com.example.demo.mapper;
+
+import com.example.demo.entity.OrderItem;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface OrderItemMapper extends BaseMapper {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/OrderMapper.java b/src/demo/backend/src/main/java/com/example/demo/mapper/OrderMapper.java
new file mode 100644
index 00000000..5b473502
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/OrderMapper.java
@@ -0,0 +1,8 @@
+package com.example.demo.mapper;
+
+import com.example.demo.entity.Order;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface OrderMapper extends BaseMapper {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/PermissionMapper.java b/src/demo/backend/src/main/java/com/example/demo/mapper/PermissionMapper.java
new file mode 100644
index 00000000..ddc09e8c
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/PermissionMapper.java
@@ -0,0 +1,10 @@
+package com.example.demo.mapper;
+
+import com.example.demo.entity.Permission;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface PermissionMapper extends BaseMapper {
+
+ public Permission listPermissionCascadeByRole(Integer roleId);
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/RoleMapper.java b/src/demo/backend/src/main/java/com/example/demo/mapper/RoleMapper.java
new file mode 100644
index 00000000..cafc83d9
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/RoleMapper.java
@@ -0,0 +1,10 @@
+package com.example.demo.mapper;
+
+import com.example.demo.entity.Role;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+
+public interface RoleMapper extends BaseMapper {
+ public List listRoleCascadeByUser(Integer userId);
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/RolePermissionMapper.java b/src/demo/backend/src/main/java/com/example/demo/mapper/RolePermissionMapper.java
new file mode 100644
index 00000000..564caec6
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/RolePermissionMapper.java
@@ -0,0 +1,8 @@
+package com.example.demo.mapper;
+
+import com.example.demo.entity.RolePermission;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface RolePermissionMapper extends BaseMapper {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/UserMapper.java b/src/demo/backend/src/main/java/com/example/demo/mapper/UserMapper.java
new file mode 100644
index 00000000..07719b1e
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/UserMapper.java
@@ -0,0 +1,10 @@
+package com.example.demo.mapper;
+
+import com.example.demo.entity.User;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+public interface UserMapper extends BaseMapper {
+
+ public User findAllUserInfoByUsername(String userName);
+
+ public void register(User user);
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/UserRoleMapper.java b/src/demo/backend/src/main/java/com/example/demo/mapper/UserRoleMapper.java
new file mode 100644
index 00000000..ea3dbc9f
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/UserRoleMapper.java
@@ -0,0 +1,8 @@
+package com.example.demo.mapper;
+
+import com.example.demo.entity.UserRole;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface UserRoleMapper extends BaseMapper {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/xml/CartItemMapper.xml b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/CartItemMapper.xml
new file mode 100644
index 00000000..f936c116
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/CartItemMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/xml/CategoryMapper.xml b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/CategoryMapper.xml
new file mode 100644
index 00000000..5562c13a
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/CategoryMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/xml/EntrustMapper.xml b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/EntrustMapper.xml
new file mode 100644
index 00000000..6ca4de8f
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/EntrustMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/xml/GoodsMapper.xml b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/GoodsMapper.xml
new file mode 100644
index 00000000..1c460ce6
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/GoodsMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/xml/IndexConfigMapper.xml b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/IndexConfigMapper.xml
new file mode 100644
index 00000000..7bad22f0
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/IndexConfigMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/xml/OrderItemMapper.xml b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/OrderItemMapper.xml
new file mode 100644
index 00000000..83c9036b
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/OrderItemMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/xml/OrderMapper.xml b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/OrderMapper.xml
new file mode 100644
index 00000000..81ebd399
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/OrderMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/xml/PermissionMapper.xml b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/PermissionMapper.xml
new file mode 100644
index 00000000..410ce6c4
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/PermissionMapper.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/xml/RoleMapper.xml b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/RoleMapper.xml
new file mode 100644
index 00000000..04193d55
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/RoleMapper.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/xml/RolePermissionMapper.xml b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/RolePermissionMapper.xml
new file mode 100644
index 00000000..c30f8f1b
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/RolePermissionMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/xml/UserMapper.xml b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/UserMapper.xml
new file mode 100644
index 00000000..21543baa
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/UserMapper.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ INSERT into user(`name`,`sex`,`phone`,userName,`passWord`,`address`,`createTime`,salt) VALUES(#{name},#{sex},#{phone},#{userName},#{passWord},#{address},#{createTime},#{salt});
+
+
diff --git a/src/demo/backend/src/main/java/com/example/demo/mapper/xml/UserRoleMapper.xml b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/UserRoleMapper.xml
new file mode 100644
index 00000000..9146e281
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/mapper/xml/UserRoleMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/CartItemService.java b/src/demo/backend/src/main/java/com/example/demo/service/CartItemService.java
new file mode 100644
index 00000000..4b7dd7d8
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/CartItemService.java
@@ -0,0 +1,8 @@
+package com.example.demo.service;
+
+import com.example.demo.entity.CartItem;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface CartItemService extends IService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/CategoryService.java b/src/demo/backend/src/main/java/com/example/demo/service/CategoryService.java
new file mode 100644
index 00000000..ab384bda
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/CategoryService.java
@@ -0,0 +1,8 @@
+package com.example.demo.service;
+
+import com.example.demo.entity.Category;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface CategoryService extends IService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/EntrustService.java b/src/demo/backend/src/main/java/com/example/demo/service/EntrustService.java
new file mode 100644
index 00000000..02869a8a
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/EntrustService.java
@@ -0,0 +1,8 @@
+package com.example.demo.service;
+
+import com.example.demo.entity.Entrust;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface EntrustService extends IService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/GoodsService.java b/src/demo/backend/src/main/java/com/example/demo/service/GoodsService.java
new file mode 100644
index 00000000..212d438e
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/GoodsService.java
@@ -0,0 +1,8 @@
+package com.example.demo.service;
+
+import com.example.demo.entity.Goods;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface GoodsService extends IService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/IndexConfigService.java b/src/demo/backend/src/main/java/com/example/demo/service/IndexConfigService.java
new file mode 100644
index 00000000..9c666508
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/IndexConfigService.java
@@ -0,0 +1,8 @@
+package com.example.demo.service;
+
+import com.example.demo.entity.IndexConfig;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface IndexConfigService extends IService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/OrderItemService.java b/src/demo/backend/src/main/java/com/example/demo/service/OrderItemService.java
new file mode 100644
index 00000000..933a55da
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/OrderItemService.java
@@ -0,0 +1,8 @@
+package com.example.demo.service;
+
+import com.example.demo.entity.OrderItem;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface OrderItemService extends IService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/OrderService.java b/src/demo/backend/src/main/java/com/example/demo/service/OrderService.java
new file mode 100644
index 00000000..31bdc2ab
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/OrderService.java
@@ -0,0 +1,8 @@
+package com.example.demo.service;
+
+import com.example.demo.entity.Order;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface OrderService extends IService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/PermissionService.java b/src/demo/backend/src/main/java/com/example/demo/service/PermissionService.java
new file mode 100644
index 00000000..7bce24ce
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/PermissionService.java
@@ -0,0 +1,8 @@
+package com.example.demo.service;
+
+import com.example.demo.entity.Permission;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface PermissionService extends IService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/RolePermissionService.java b/src/demo/backend/src/main/java/com/example/demo/service/RolePermissionService.java
new file mode 100644
index 00000000..d08b11ac
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/RolePermissionService.java
@@ -0,0 +1,8 @@
+package com.example.demo.service;
+
+import com.example.demo.entity.RolePermission;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface RolePermissionService extends IService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/RoleService.java b/src/demo/backend/src/main/java/com/example/demo/service/RoleService.java
new file mode 100644
index 00000000..36c2ba0e
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/RoleService.java
@@ -0,0 +1,8 @@
+package com.example.demo.service;
+
+import com.example.demo.entity.Role;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface RoleService extends IService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/UserRoleService.java b/src/demo/backend/src/main/java/com/example/demo/service/UserRoleService.java
new file mode 100644
index 00000000..e8bcf7de
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/UserRoleService.java
@@ -0,0 +1,8 @@
+package com.example.demo.service;
+
+import com.example.demo.entity.UserRole;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface UserRoleService extends IService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/UserService.java b/src/demo/backend/src/main/java/com/example/demo/service/UserService.java
new file mode 100644
index 00000000..daf3300b
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/UserService.java
@@ -0,0 +1,11 @@
+package com.example.demo.service;
+
+import com.example.demo.entity.User;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface UserService extends IService {
+
+ public User findAllUserInfoByUsername(String username);
+
+ public void register(User user);
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/impl/CartItemServiceImpl.java b/src/demo/backend/src/main/java/com/example/demo/service/impl/CartItemServiceImpl.java
new file mode 100644
index 00000000..fefff144
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/impl/CartItemServiceImpl.java
@@ -0,0 +1,12 @@
+package com.example.demo.service.impl;
+
+import com.example.demo.entity.CartItem;
+import com.example.demo.mapper.CartItemMapper;
+import com.example.demo.service.CartItemService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service
+public class CartItemServiceImpl extends ServiceImpl implements CartItemService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/impl/CategoryServiceImpl.java b/src/demo/backend/src/main/java/com/example/demo/service/impl/CategoryServiceImpl.java
new file mode 100644
index 00000000..48d8a0d8
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/impl/CategoryServiceImpl.java
@@ -0,0 +1,12 @@
+package com.example.demo.service.impl;
+
+import com.example.demo.entity.Category;
+import com.example.demo.mapper.CategoryMapper;
+import com.example.demo.service.CategoryService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service
+public class CategoryServiceImpl extends ServiceImpl implements CategoryService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/impl/EntrustServiceImpl.java b/src/demo/backend/src/main/java/com/example/demo/service/impl/EntrustServiceImpl.java
new file mode 100644
index 00000000..5919b240
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/impl/EntrustServiceImpl.java
@@ -0,0 +1,12 @@
+package com.example.demo.service.impl;
+
+import com.example.demo.entity.Entrust;
+import com.example.demo.mapper.EntrustMapper;
+import com.example.demo.service.EntrustService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service
+public class EntrustServiceImpl extends ServiceImpl implements EntrustService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/impl/GoodsServiceImpl.java b/src/demo/backend/src/main/java/com/example/demo/service/impl/GoodsServiceImpl.java
new file mode 100644
index 00000000..bc4eb2ca
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/impl/GoodsServiceImpl.java
@@ -0,0 +1,12 @@
+package com.example.demo.service.impl;
+
+import com.example.demo.entity.Goods;
+import com.example.demo.mapper.GoodsMapper;
+import com.example.demo.service.GoodsService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service
+public class GoodsServiceImpl extends ServiceImpl implements GoodsService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/impl/IndexConfigServiceImpl.java b/src/demo/backend/src/main/java/com/example/demo/service/impl/IndexConfigServiceImpl.java
new file mode 100644
index 00000000..f8887f04
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/impl/IndexConfigServiceImpl.java
@@ -0,0 +1,12 @@
+package com.example.demo.service.impl;
+
+import com.example.demo.entity.IndexConfig;
+import com.example.demo.mapper.IndexConfigMapper;
+import com.example.demo.service.IndexConfigService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service
+public class IndexConfigServiceImpl extends ServiceImpl implements IndexConfigService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/impl/OrderItemServiceImpl.java b/src/demo/backend/src/main/java/com/example/demo/service/impl/OrderItemServiceImpl.java
new file mode 100644
index 00000000..4512fa69
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/impl/OrderItemServiceImpl.java
@@ -0,0 +1,12 @@
+package com.example.demo.service.impl;
+
+import com.example.demo.entity.OrderItem;
+import com.example.demo.mapper.OrderItemMapper;
+import com.example.demo.service.OrderItemService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service
+public class OrderItemServiceImpl extends ServiceImpl implements OrderItemService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/impl/OrderServiceImpl.java b/src/demo/backend/src/main/java/com/example/demo/service/impl/OrderServiceImpl.java
new file mode 100644
index 00000000..c5ad2d76
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/impl/OrderServiceImpl.java
@@ -0,0 +1,12 @@
+package com.example.demo.service.impl;
+
+import com.example.demo.entity.Order;
+import com.example.demo.mapper.OrderMapper;
+import com.example.demo.service.OrderService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service
+public class OrderServiceImpl extends ServiceImpl implements OrderService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/impl/PermissionServiceImpl.java b/src/demo/backend/src/main/java/com/example/demo/service/impl/PermissionServiceImpl.java
new file mode 100644
index 00000000..5f1024d2
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/impl/PermissionServiceImpl.java
@@ -0,0 +1,12 @@
+package com.example.demo.service.impl;
+
+import com.example.demo.entity.Permission;
+import com.example.demo.mapper.PermissionMapper;
+import com.example.demo.service.PermissionService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service
+public class PermissionServiceImpl extends ServiceImpl implements PermissionService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/impl/RolePermissionServiceImpl.java b/src/demo/backend/src/main/java/com/example/demo/service/impl/RolePermissionServiceImpl.java
new file mode 100644
index 00000000..34f5c994
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/impl/RolePermissionServiceImpl.java
@@ -0,0 +1,12 @@
+package com.example.demo.service.impl;
+
+import com.example.demo.entity.RolePermission;
+import com.example.demo.mapper.RolePermissionMapper;
+import com.example.demo.service.RolePermissionService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RolePermissionServiceImpl extends ServiceImpl implements RolePermissionService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/impl/RoleServiceImpl.java b/src/demo/backend/src/main/java/com/example/demo/service/impl/RoleServiceImpl.java
new file mode 100644
index 00000000..958d8b13
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/impl/RoleServiceImpl.java
@@ -0,0 +1,12 @@
+package com.example.demo.service.impl;
+
+import com.example.demo.entity.Role;
+import com.example.demo.mapper.RoleMapper;
+import com.example.demo.service.RoleService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RoleServiceImpl extends ServiceImpl implements RoleService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/impl/UserRoleServiceImpl.java b/src/demo/backend/src/main/java/com/example/demo/service/impl/UserRoleServiceImpl.java
new file mode 100644
index 00000000..5d71a7ac
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/impl/UserRoleServiceImpl.java
@@ -0,0 +1,12 @@
+package com.example.demo.service.impl;
+
+import com.example.demo.entity.UserRole;
+import com.example.demo.mapper.UserRoleMapper;
+import com.example.demo.service.UserRoleService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserRoleServiceImpl extends ServiceImpl implements UserRoleService {
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/service/impl/UserServiceImpl.java b/src/demo/backend/src/main/java/com/example/demo/service/impl/UserServiceImpl.java
new file mode 100644
index 00000000..9f5b3bfb
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/service/impl/UserServiceImpl.java
@@ -0,0 +1,26 @@
+package com.example.demo.service.impl;
+
+import com.example.demo.entity.User;
+import com.example.demo.mapper.UserMapper;
+import com.example.demo.service.UserService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserServiceImpl extends ServiceImpl implements UserService {
+
+ @Autowired
+ private UserMapper userMapper;
+
+ @Override
+ public User findAllUserInfoByUsername(String username){
+ return userMapper.findAllUserInfoByUsername(username);
+ }
+
+ @Override
+ public void register(User user) {
+ userMapper.register(user);
+ }
+
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/util/LogAspect.java b/src/demo/backend/src/main/java/com/example/demo/util/LogAspect.java
new file mode 100644
index 00000000..447227e5
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/util/LogAspect.java
@@ -0,0 +1,39 @@
+package com.example.demo.util;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+
+// 日志切面
+@Component
+@Aspect
+public class LogAspect {
+ private final Logger logger= LoggerFactory.getLogger(LogAspect.class);
+
+ // controller包,所有类方法切入点
+ @Pointcut("execution(public * com.example.demo.controller..*.*(..))")
+ public void controllerLog(){};
+
+ // controller前置通知,输出基本请求信息到日志
+ @Before("controllerLog()")
+ public void log(JoinPoint joinPoint){
+ RequestAttributes requestAttributes= RequestContextHolder.getRequestAttributes();
+ HttpServletRequest request=((ServletRequestAttributes)requestAttributes).getRequest();
+ logger.info("+++++++++请求地址:"+request.getRequestURL().toString()+"+++++++++");
+ logger.info("+++++++++方法:"+request.getMethod()+"+++++++++");
+ logger.info("+++++++++源ip地址:"+request.getRemoteAddr()+"+++++++++");
+ logger.info("+++++++++源端口:"+request.getRemotePort()+"+++++++++");
+ logger.info("+++++++++类与方法名 : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()+"+++++++++");
+ logger.info("+++++++++请求参数:"+ Arrays.toString(joinPoint.getArgs())+"+++++++++");
+ }
+}
diff --git a/src/demo/backend/src/main/java/com/example/demo/util/PasswordHelper.java b/src/demo/backend/src/main/java/com/example/demo/util/PasswordHelper.java
new file mode 100644
index 00000000..3719f354
--- /dev/null
+++ b/src/demo/backend/src/main/java/com/example/demo/util/PasswordHelper.java
@@ -0,0 +1,21 @@
+package com.example.demo.util;
+
+import com.example.demo.entity.User;
+import org.apache.shiro.crypto.RandomNumberGenerator;
+import org.apache.shiro.crypto.SecureRandomNumberGenerator;
+import org.apache.shiro.crypto.hash.SimpleHash;
+import org.apache.shiro.util.ByteSource;
+
+// 密码加密
+public class PasswordHelper {
+ private RandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator();
+ public static final String ALGORITHM_NAME = "md5"; // 基础散列算法
+ public static final int HASH_ITERATIONS = 2; // 自定义散列次数
+
+ public void encryptPassword(User user) {
+ user.setSalt(randomNumberGenerator.nextBytes().toHex());
+ String newPassword = new SimpleHash(ALGORITHM_NAME, user.getPassWord(),
+ ByteSource.Util.bytes(user.getSalt()), HASH_ITERATIONS).toHex();
+ user.setPassWord(newPassword);
+ }
+}
diff --git a/src/demo/backend/src/main/resources/application.yml b/src/demo/backend/src/main/resources/application.yml
new file mode 100644
index 00000000..82bbbd3b
--- /dev/null
+++ b/src/demo/backend/src/main/resources/application.yml
@@ -0,0 +1,27 @@
+spring:
+ datasource:
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ username: root
+ password: 123456
+ url: jdbc:mysql://localhost:3306/recommend?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
+ redis:
+ database: 0
+ host: 127.0.0.1
+ port: 6379
+ jedis:
+ pool:
+ max-active: 8
+ max-wait: -1
+ max-idle: 8
+ min-idle: 0
+ timeout: 0
+
+mybatis-plus:
+ mapperLocations: classpath*:com/example/**/xml/*Mapper.xml
+ typeAliasesPackage: com.example.demo.entity
+server:
+ #端口号
+ port: 8088
+logging:
+ file:
+ path: "./logs"
\ No newline at end of file
diff --git a/src/demo/backend/src/main/resources/img/00475900-05cb-4c39-b968-27106a169b66.jpg b/src/demo/backend/src/main/resources/img/00475900-05cb-4c39-b968-27106a169b66.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/00475900-05cb-4c39-b968-27106a169b66.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/0fc2d397-f78f-4c28-9391-039cf0cf1789.jpg b/src/demo/backend/src/main/resources/img/0fc2d397-f78f-4c28-9391-039cf0cf1789.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/0fc2d397-f78f-4c28-9391-039cf0cf1789.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/1.jpg b/src/demo/backend/src/main/resources/img/1.jpg
new file mode 100644
index 00000000..265d0642
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/1.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/12.jpg b/src/demo/backend/src/main/resources/img/12.jpg
new file mode 100644
index 00000000..97e9ff5c
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/12.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/13.jpg b/src/demo/backend/src/main/resources/img/13.jpg
new file mode 100644
index 00000000..c821f252
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/13.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/173f2300-83a2-45ea-b613-09a894ab3be0.jpg b/src/demo/backend/src/main/resources/img/173f2300-83a2-45ea-b613-09a894ab3be0.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/173f2300-83a2-45ea-b613-09a894ab3be0.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/19.jpg b/src/demo/backend/src/main/resources/img/19.jpg
new file mode 100644
index 00000000..e48dff01
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/19.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/1b0df365-5e28-42d5-a5e2-79eaef6c9735.jpg b/src/demo/backend/src/main/resources/img/1b0df365-5e28-42d5-a5e2-79eaef6c9735.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/1b0df365-5e28-42d5-a5e2-79eaef6c9735.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/2.jpg b/src/demo/backend/src/main/resources/img/2.jpg
new file mode 100644
index 00000000..435d198f
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/2.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/21.jpg b/src/demo/backend/src/main/resources/img/21.jpg
new file mode 100644
index 00000000..24a36c4b
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/21.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/3.jpg b/src/demo/backend/src/main/resources/img/3.jpg
new file mode 100644
index 00000000..1354cd9d
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/3.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/3f41b68f-60d4-48fd-a079-ed9354111bea.jpg b/src/demo/backend/src/main/resources/img/3f41b68f-60d4-48fd-a079-ed9354111bea.jpg
new file mode 100644
index 00000000..cc51a336
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/3f41b68f-60d4-48fd-a079-ed9354111bea.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/4.jpg b/src/demo/backend/src/main/resources/img/4.jpg
new file mode 100644
index 00000000..60ba2f12
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/4.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/4b5f392f-43e1-473e-807e-24c46321d00f.jpg b/src/demo/backend/src/main/resources/img/4b5f392f-43e1-473e-807e-24c46321d00f.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/4b5f392f-43e1-473e-807e-24c46321d00f.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/4e8b8334-cfb7-451a-a673-91ba66c88411.jpg b/src/demo/backend/src/main/resources/img/4e8b8334-cfb7-451a-a673-91ba66c88411.jpg
new file mode 100644
index 00000000..07f55c54
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/4e8b8334-cfb7-451a-a673-91ba66c88411.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/5.jpg b/src/demo/backend/src/main/resources/img/5.jpg
new file mode 100644
index 00000000..309b12da
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/5.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/562e46cb-80c6-4691-b7f2-17c3fec80774.jpg b/src/demo/backend/src/main/resources/img/562e46cb-80c6-4691-b7f2-17c3fec80774.jpg
new file mode 100644
index 00000000..a898b4f0
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/562e46cb-80c6-4691-b7f2-17c3fec80774.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/5a586e79-eb60-484c-b0cd-d003c2efad8e.jpg b/src/demo/backend/src/main/resources/img/5a586e79-eb60-484c-b0cd-d003c2efad8e.jpg
new file mode 100644
index 00000000..a898b4f0
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/5a586e79-eb60-484c-b0cd-d003c2efad8e.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/6.jpg b/src/demo/backend/src/main/resources/img/6.jpg
new file mode 100644
index 00000000..1985a65f
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/6.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/61495a21-f50d-496d-aebc-cd5f9744f969.jpg b/src/demo/backend/src/main/resources/img/61495a21-f50d-496d-aebc-cd5f9744f969.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/61495a21-f50d-496d-aebc-cd5f9744f969.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/67953a38-7c19-44d2-958d-3d89c903e3ac.jpg b/src/demo/backend/src/main/resources/img/67953a38-7c19-44d2-958d-3d89c903e3ac.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/67953a38-7c19-44d2-958d-3d89c903e3ac.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/6bf848e2-2855-4fa3-9ec4-c7ed06189e78.jpeg b/src/demo/backend/src/main/resources/img/6bf848e2-2855-4fa3-9ec4-c7ed06189e78.jpeg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/6bf848e2-2855-4fa3-9ec4-c7ed06189e78.jpeg differ
diff --git a/src/demo/backend/src/main/resources/img/6d2007ce-16c9-4f0e-850e-d651dabe3687.jpg b/src/demo/backend/src/main/resources/img/6d2007ce-16c9-4f0e-850e-d651dabe3687.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/6d2007ce-16c9-4f0e-850e-d651dabe3687.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/6f8d7b70-0e70-414e-9be9-9fd2e2d081cf.jpg b/src/demo/backend/src/main/resources/img/6f8d7b70-0e70-414e-9be9-9fd2e2d081cf.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/6f8d7b70-0e70-414e-9be9-9fd2e2d081cf.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/7.jpg b/src/demo/backend/src/main/resources/img/7.jpg
new file mode 100644
index 00000000..02bff5d9
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/7.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/76a2fced-121d-4bbd-9094-1723eaa50707.jpg b/src/demo/backend/src/main/resources/img/76a2fced-121d-4bbd-9094-1723eaa50707.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/76a2fced-121d-4bbd-9094-1723eaa50707.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/7b21af5a-e73c-4059-aecf-848f95470186.jpg b/src/demo/backend/src/main/resources/img/7b21af5a-e73c-4059-aecf-848f95470186.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/7b21af5a-e73c-4059-aecf-848f95470186.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/8.jpg b/src/demo/backend/src/main/resources/img/8.jpg
new file mode 100644
index 00000000..485b4cba
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/8.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/803f3dda-823f-4ac1-82dc-85bcf043f522.jpg b/src/demo/backend/src/main/resources/img/803f3dda-823f-4ac1-82dc-85bcf043f522.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/803f3dda-823f-4ac1-82dc-85bcf043f522.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/8378118b-2727-46eb-82a9-c537b3d0fc7c.jpg b/src/demo/backend/src/main/resources/img/8378118b-2727-46eb-82a9-c537b3d0fc7c.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/8378118b-2727-46eb-82a9-c537b3d0fc7c.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/87a85406-1b3b-4062-834a-6f30e3ed7977.jpg b/src/demo/backend/src/main/resources/img/87a85406-1b3b-4062-834a-6f30e3ed7977.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/87a85406-1b3b-4062-834a-6f30e3ed7977.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/88077d30-22a3-433f-a0de-f9ad085e7e53.jpg b/src/demo/backend/src/main/resources/img/88077d30-22a3-433f-a0de-f9ad085e7e53.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/88077d30-22a3-433f-a0de-f9ad085e7e53.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/8c5d5f5f-14e9-43b5-9d41-b69b31f2859a.jpg b/src/demo/backend/src/main/resources/img/8c5d5f5f-14e9-43b5-9d41-b69b31f2859a.jpg
new file mode 100644
index 00000000..07f55c54
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/8c5d5f5f-14e9-43b5-9d41-b69b31f2859a.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/8f44ddef-4ddc-4860-a873-77d87e29f199.jpeg b/src/demo/backend/src/main/resources/img/8f44ddef-4ddc-4860-a873-77d87e29f199.jpeg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/8f44ddef-4ddc-4860-a873-77d87e29f199.jpeg differ
diff --git a/src/demo/backend/src/main/resources/img/91f9af12-45a9-4286-8eaf-c35e07c89ef7.jpg b/src/demo/backend/src/main/resources/img/91f9af12-45a9-4286-8eaf-c35e07c89ef7.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/91f9af12-45a9-4286-8eaf-c35e07c89ef7.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/9316db6d-1f0d-412c-90a5-31fda3d754b5.jpg b/src/demo/backend/src/main/resources/img/9316db6d-1f0d-412c-90a5-31fda3d754b5.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/9316db6d-1f0d-412c-90a5-31fda3d754b5.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/984fb033-eea8-4174-ae17-025012ed3a4e.jpg b/src/demo/backend/src/main/resources/img/984fb033-eea8-4174-ae17-025012ed3a4e.jpg
new file mode 100644
index 00000000..d22f7de1
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/984fb033-eea8-4174-ae17-025012ed3a4e.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/99d1eed4-8475-4c2b-9296-44d98744a1c3.jpg b/src/demo/backend/src/main/resources/img/99d1eed4-8475-4c2b-9296-44d98744a1c3.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/99d1eed4-8475-4c2b-9296-44d98744a1c3.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/9ab74473-df00-45e5-a894-0432289d84ac.jpg b/src/demo/backend/src/main/resources/img/9ab74473-df00-45e5-a894-0432289d84ac.jpg
new file mode 100644
index 00000000..a898b4f0
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/9ab74473-df00-45e5-a894-0432289d84ac.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/9b9101f0-bc5c-4c4a-bbf5-d7cfd72e8264.jpg b/src/demo/backend/src/main/resources/img/9b9101f0-bc5c-4c4a-bbf5-d7cfd72e8264.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/9b9101f0-bc5c-4c4a-bbf5-d7cfd72e8264.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/9d29ec5b-5c5c-4792-ba56-b790d0cf8b16.jpg b/src/demo/backend/src/main/resources/img/9d29ec5b-5c5c-4792-ba56-b790d0cf8b16.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/9d29ec5b-5c5c-4792-ba56-b790d0cf8b16.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/9d782103-eb93-4bcb-b3a0-e943f11b1fe2.jpg b/src/demo/backend/src/main/resources/img/9d782103-eb93-4bcb-b3a0-e943f11b1fe2.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/9d782103-eb93-4bcb-b3a0-e943f11b1fe2.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/afd21638-200f-4986-88f5-32ea1a24fb09.jpg b/src/demo/backend/src/main/resources/img/afd21638-200f-4986-88f5-32ea1a24fb09.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/afd21638-200f-4986-88f5-32ea1a24fb09.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/bd71b488-f6bd-498d-92f6-2eae00554cc4.jpeg b/src/demo/backend/src/main/resources/img/bd71b488-f6bd-498d-92f6-2eae00554cc4.jpeg
new file mode 100644
index 00000000..e48dff01
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/bd71b488-f6bd-498d-92f6-2eae00554cc4.jpeg differ
diff --git a/src/demo/backend/src/main/resources/img/ca2cde9b-f643-4e05-90e9-477597fd681c.jpg b/src/demo/backend/src/main/resources/img/ca2cde9b-f643-4e05-90e9-477597fd681c.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/ca2cde9b-f643-4e05-90e9-477597fd681c.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/d6949492-8051-49e2-9863-366bfc850d2a.jpg b/src/demo/backend/src/main/resources/img/d6949492-8051-49e2-9863-366bfc850d2a.jpg
new file mode 100644
index 00000000..309b12da
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/d6949492-8051-49e2-9863-366bfc850d2a.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/e06676f9-3b34-426c-979e-c916f1d85c03.jpg b/src/demo/backend/src/main/resources/img/e06676f9-3b34-426c-979e-c916f1d85c03.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/e06676f9-3b34-426c-979e-c916f1d85c03.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/e6d78f17-267a-4173-88e6-93c330a9bfc4.jpg b/src/demo/backend/src/main/resources/img/e6d78f17-267a-4173-88e6-93c330a9bfc4.jpg
new file mode 100644
index 00000000..a898b4f0
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/e6d78f17-267a-4173-88e6-93c330a9bfc4.jpg differ
diff --git a/src/demo/backend/src/main/resources/img/ecba6487-5cb0-44dc-be4d-2bef71dab6d1.jpg b/src/demo/backend/src/main/resources/img/ecba6487-5cb0-44dc-be4d-2bef71dab6d1.jpg
new file mode 100644
index 00000000..e8e2372a
Binary files /dev/null and b/src/demo/backend/src/main/resources/img/ecba6487-5cb0-44dc-be4d-2bef71dab6d1.jpg differ
diff --git a/src/demo/backend/src/main/resources/img6899c1fa-167c-4aff-8564-8cec675016de.jpeg b/src/demo/backend/src/main/resources/img6899c1fa-167c-4aff-8564-8cec675016de.jpeg
new file mode 100644
index 00000000..e48dff01
Binary files /dev/null and b/src/demo/backend/src/main/resources/img6899c1fa-167c-4aff-8564-8cec675016de.jpeg differ
diff --git a/src/demo/backend/src/main/resources/imga96ec535-f329-4c5c-b3f9-6e1d41f74d76.jpeg b/src/demo/backend/src/main/resources/imga96ec535-f329-4c5c-b3f9-6e1d41f74d76.jpeg
new file mode 100644
index 00000000..e48dff01
Binary files /dev/null and b/src/demo/backend/src/main/resources/imga96ec535-f329-4c5c-b3f9-6e1d41f74d76.jpeg differ
diff --git a/src/demo/backend/src/main/resources/imgcfd85891-7cf1-4fbf-b1bd-3c296f10692e.jpeg b/src/demo/backend/src/main/resources/imgcfd85891-7cf1-4fbf-b1bd-3c296f10692e.jpeg
new file mode 100644
index 00000000..e48dff01
Binary files /dev/null and b/src/demo/backend/src/main/resources/imgcfd85891-7cf1-4fbf-b1bd-3c296f10692e.jpeg differ
diff --git a/src/demo/backend/src/test/java/com/example/demo/DemoApplicationTests.java b/src/demo/backend/src/test/java/com/example/demo/DemoApplicationTests.java
new file mode 100644
index 00000000..eaa99696
--- /dev/null
+++ b/src/demo/backend/src/test/java/com/example/demo/DemoApplicationTests.java
@@ -0,0 +1,13 @@
+package com.example.demo;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class DemoApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
diff --git a/src/demo/backend/src/test/java/com/example/demo/TestAutoGenerate.java b/src/demo/backend/src/test/java/com/example/demo/TestAutoGenerate.java
new file mode 100644
index 00000000..cc16dccb
--- /dev/null
+++ b/src/demo/backend/src/test/java/com/example/demo/TestAutoGenerate.java
@@ -0,0 +1,65 @@
+package com.example.demo;
+
+public class TestAutoGenerate {
+// @Test
+// public void autoGenerate(){
+// 1、创建代码生成器
+// AutoGenerator mpg = new AutoGenerator();
+//
+// // 2、全局配置
+// GlobalConfig gc = new GlobalConfig();
+// String projectPath = System.getProperty("user.dir");
+// // 此处写项目/src/main/java源代码的绝对路径
+// gc.setOutputDir("project/gitProject_recommend/src/demo/backend" + "/src/main/java");
+// // 生成注释时的作者
+// gc.setAuthor("zjh");
+// //生成后是否打开资源管理器
+// gc.setOpen(false);
+// gc.setFileOverride(false); //重新生成时文件是否覆盖
+// gc.setServiceName("%sService"); //去掉Service接口的首字母I
+// gc.setIdType(IdType.ID_WORKER_STR); //主键策略
+// gc.setDateType(DateType.ONLY_DATE); //定义生成的实体类中日期类型
+// // 如果开启Swagger,要引入相应的包
+// gc.setSwagger2(true); //开启Swagger2模式
+//
+// mpg.setGlobalConfig(gc);
+//
+// // 3、数据源配置
+// DataSourceConfig dsc = new DataSourceConfig();
+// dsc.setUrl("jdbc:mysql://localhost:3306/recommend?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT");
+// dsc.setDriverName("com.mysql.cj.jdbc.Driver");
+// dsc.setUsername("root");
+// dsc.setPassword("123456");
+// dsc.setDbType(DbType.MYSQL);
+// mpg.setDataSource(dsc);
+//
+// // 4、包配置
+// PackageConfig pc = new PackageConfig();
+// // 此处要注意:parent + moduleName 为包的名字,在这个包下,创建对应的controller...
+// pc.setParent("com.demo");
+// pc.setModuleName("demo"); //模块名
+// pc.setController("controller");
+// pc.setEntity("entity");
+// pc.setService("service");
+// pc.setMapper("mapper");
+// mpg.setPackageInfo(pc);
+//
+// // 5、策略配置
+// StrategyConfig strategy = new StrategyConfig();
+// // 数据库中表的名字,表示要对哪些表进行自动生成controller service、mapper...
+// strategy.setInclude("entrust");
+// // 数据库表映射到实体的命名策略,驼峰命名法
+// strategy.setNaming(NamingStrategy.underline_to_camel);
+// //数据库表字段映射到实体的命名策略
+// strategy.setColumnNaming(NamingStrategy.underline_to_camel);
+// strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作
+//
+//// strategy.setRestControllerStyle(true); //restful api风格控制器
+// strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符
+//
+// mpg.setStrategy(strategy);
+//
+// // 6、执行
+// mpg.execute();
+// }
+}