├── .gitignore ├── BookManager-master ├── .gitignore ├── .mvn │ └── wrapper │ │ ├── MavenWrapperDownloader.java │ │ ├── maven-wrapper.jar │ │ └── maven-wrapper.properties ├── GeneratorMapper.xml ├── README.md ├── mvnw ├── mvnw.cmd ├── picture │ ├── picture1.png │ ├── picture10.jpg │ ├── picture2.png │ ├── picture3.png │ ├── picture4.png │ ├── picture5.png │ ├── picture6.png │ ├── picture7.png │ ├── picture8.png │ └── picture9.png ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── wangpeng │ │ └── bms │ │ ├── BookManagerApplication.java │ │ ├── exception │ │ ├── NotEnoughException.java │ │ └── OperationFailureException.java │ │ ├── mapper │ │ ├── BookInfoMapper.java │ │ ├── BookInfoMapper.xml │ │ ├── BookTypeMapper.java │ │ ├── BookTypeMapper.xml │ │ ├── BorrowMapper.java │ │ ├── BorrowMapper.xml │ │ ├── UserMapper.java │ │ └── UserMapper.xml │ │ ├── service │ │ ├── BookInfoService.java │ │ ├── BookTypeService.java │ │ ├── BorrowService.java │ │ ├── UserService.java │ │ └── impl │ │ │ ├── BookInfoServiceImpl.java │ │ │ ├── BookTypeServiceImpl.java │ │ │ ├── BorrowServiceImpl.java │ │ │ └── UserServiceImpl.java │ │ └── web │ │ ├── BookInfoController.java │ │ ├── BookTypeController.java │ │ ├── BorrowController.java │ │ ├── UpdateController.java │ │ └── UserController.java │ └── resources │ ├── META-INF │ └── additional-spring-configuration-metadata.json │ └── application.properties ├── BookManagerVue-permission-control ├── public │ ├── favicon.ico │ └── index.html └── src │ ├── api │ ├── article.js │ ├── bookinfo.js │ ├── booktype.js │ ├── borrow.js │ ├── table.js │ └── user.js │ ├── assets │ └── 404_images │ │ ├── 404.png │ │ └── 404_cloud.png │ ├── components │ ├── Breadcrumb │ │ └── index.vue │ ├── Hamburger │ │ └── index.vue │ ├── Pagination │ │ └── index.vue │ └── SvgIcon │ │ └── index.vue │ ├── directive │ ├── permission │ │ ├── index.js │ │ └── permission.js │ └── waves │ │ ├── index.js │ │ ├── waves.css │ │ └── waves.js │ └── icons │ ├── index.js │ ├── svg │ ├── book.svg │ ├── borrow.svg │ ├── dashboard.svg │ ├── example.svg │ ├── eye-open.svg │ ├── eye.svg │ ├── form.svg │ ├── link.svg │ ├── nested.svg │ ├── other.svg │ ├── password.svg │ ├── table.svg │ ├── tree.svg │ └── user.svg │ └── svgo.yml ├── README.md └── picture ├── picture1.png ├── picture10.jpg ├── picture2.png ├── picture3.png ├── picture4.png ├── picture5.png ├── picture6.png ├── picture7.png ├── picture8.png └── picture9.png /.gitignore: -------------------------------------------------------------------------------- 1 | BookManager2-master.zip 2 | BookManagerVue-permission-control.zip 3 | HELP.md 4 | target/ 5 | !.mvn/wrapper/maven-wrapper.jar 6 | !**/src/main/** 7 | !**/src/test/** 8 | 9 | ### STS ### 10 | .apt_generated 11 | .classpath 12 | .factorypath 13 | .project 14 | .settings 15 | .springBeans 16 | .sts4-cache 17 | 18 | ### IntelliJ IDEA ### 19 | .idea 20 | *.iws 21 | *.iml 22 | *.ipr 23 | 24 | ### NetBeans ### 25 | /nbproject/private/ 26 | /nbbuild/ 27 | /dist/ 28 | /nbdist/ 29 | /.nb-gradle/ 30 | build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | -------------------------------------------------------------------------------- /BookManager-master/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | !**/src/main/**/build/ 30 | !**/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | -------------------------------------------------------------------------------- /BookManager-master/.mvn/wrapper/MavenWrapperDownloader.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2007-present the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | import java.net.*; 18 | import java.io.*; 19 | import java.nio.channels.*; 20 | import java.util.Properties; 21 | 22 | public class MavenWrapperDownloader { 23 | 24 | private static final String WRAPPER_VERSION = "0.5.6"; 25 | /** 26 | * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. 27 | */ 28 | private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" 29 | + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; 30 | 31 | /** 32 | * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to 33 | * use instead of the default one. 34 | */ 35 | private static final String MAVEN_WRAPPER_PROPERTIES_PATH = 36 | ".mvn/wrapper/maven-wrapper.properties"; 37 | 38 | /** 39 | * Path where the maven-wrapper.jar will be saved to. 40 | */ 41 | private static final String MAVEN_WRAPPER_JAR_PATH = 42 | ".mvn/wrapper/maven-wrapper.jar"; 43 | 44 | /** 45 | * Name of the property which should be used to override the default download url for the wrapper. 46 | */ 47 | private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; 48 | 49 | public static void main(String args[]) { 50 | System.out.println("- Downloader started"); 51 | File baseDirectory = new File(args[0]); 52 | System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); 53 | 54 | // If the maven-wrapper.properties exists, read it and check if it contains a custom 55 | // wrapperUrl parameter. 56 | File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); 57 | String url = DEFAULT_DOWNLOAD_URL; 58 | if (mavenWrapperPropertyFile.exists()) { 59 | FileInputStream mavenWrapperPropertyFileInputStream = null; 60 | try { 61 | mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); 62 | Properties mavenWrapperProperties = new Properties(); 63 | mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); 64 | url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); 65 | } catch (IOException e) { 66 | System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); 67 | } finally { 68 | try { 69 | if (mavenWrapperPropertyFileInputStream != null) { 70 | mavenWrapperPropertyFileInputStream.close(); 71 | } 72 | } catch (IOException e) { 73 | // Ignore ... 74 | } 75 | } 76 | } 77 | System.out.println("- Downloading from: " + url); 78 | 79 | File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); 80 | if (!outputFile.getParentFile().exists()) { 81 | if (!outputFile.getParentFile().mkdirs()) { 82 | System.out.println( 83 | "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); 84 | } 85 | } 86 | System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); 87 | try { 88 | downloadFileFromURL(url, outputFile); 89 | System.out.println("Done"); 90 | System.exit(0); 91 | } catch (Throwable e) { 92 | System.out.println("- Error downloading"); 93 | e.printStackTrace(); 94 | System.exit(1); 95 | } 96 | } 97 | 98 | private static void downloadFileFromURL(String urlString, File destination) throws Exception { 99 | if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { 100 | String username = System.getenv("MVNW_USERNAME"); 101 | char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); 102 | Authenticator.setDefault(new Authenticator() { 103 | @Override 104 | protected PasswordAuthentication getPasswordAuthentication() { 105 | return new PasswordAuthentication(username, password); 106 | } 107 | }); 108 | } 109 | URL website = new URL(urlString); 110 | ReadableByteChannel rbc; 111 | rbc = Channels.newChannel(website.openStream()); 112 | FileOutputStream fos = new FileOutputStream(destination); 113 | fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); 114 | fos.close(); 115 | rbc.close(); 116 | } 117 | 118 | } 119 | -------------------------------------------------------------------------------- /BookManager-master/.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/BookManager-master/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /BookManager-master/.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.3/apache-maven-3.8.3-bin.zip 2 | wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar 3 | -------------------------------------------------------------------------------- /BookManager-master/GeneratorMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 19 | 20 | 22 | 24 | 25 | 26 | 27 | 29 | 31 | 32 | 33 | 35 | 37 | 38 | 39 | 40 | 41 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /BookManager-master/README.md: -------------------------------------------------------------------------------- 1 | **需要完整代码可以加qq 931708230 或者加微信 ynwwxid** 2 | 3 | **需要完整代码可以加qq 931708230 或者加微信 ynwwxid** 4 | 5 | #程序员 #java #毕业设计 #图书管理系统 #springboot #课程设计 #编程 #Axios #MyBatis #vue #ElementUI #源代码 #javaWeb #ssm 6 | ## 项目介绍 7 | 8 | springboot的前后端分离的图书管理系统项目。 9 | 10 | 后端使用Java+SpringBoot+MyBatis+MySQL 11 | 12 | 前端使用Vue+Axios+Element UI 13 | 14 | 对应的后端文件夹如下:BookManager 15 | 16 | 对应的前端文件夹如下:BookManagerVue 17 | 18 | 19 | 前台功能:图书查询、图书借阅、图书归还、登录注册、修改密码 20 | 21 | 后台功能-管理员登录:图书管理、借阅信息管理、图书类型管理、用户管理 22 | 23 | ## 项目截图 24 | 25 | ![contents](./picture/picture1.png) 26 | 27 | ![contents](./picture/picture2.png) 28 | 29 | ![contents](./picture/picture3.png) 30 | 31 | ![contents](./picture/picture4.png) 32 | 33 | ![contents](./picture/picture5.png) 34 | 35 | ![contents](./picture/picture6.png) 36 | 37 | ![contents](./picture/picture7.png) 38 | 39 | ![contents](./picture/picture8.png) 40 | 41 | ![contents](./picture/picture9.png) 42 | 43 | ### 数据库结构 44 | 45 | ![Diagram 1](./picture/picture10.jpg) 46 | 47 | ## 演示地址 48 | 49 | 项目演示地址:http://localhost:8092/BookManager/ 50 | 51 | 管理员账号`admin`,密码`admin` 52 | 53 | 读者账号`wangpeng`,密码`123456` 54 | 55 | ## 搭建步骤 56 | 57 | ### 后端程序 58 | 59 | 1、数据库导入,新建数据库student_manager,将`book_manager.sql`文件导入并运行。 60 | 61 | 2、打开项目,打开`src/main/resources/application.properties`,修改数据库和Redis的配置文件。 62 | 63 | 3、运行项目 64 | 65 | ## 环境介绍 66 | 67 | ### 基础环境 :IDEA,maven3.6,JDK 1.8 , Mysql 5.7 68 | 69 | ## 项目描述 70 | 71 | ### 源码+数据库脚本 72 | 73 | 所有项目以及源代码本人均调试运行无问题 可支持远程调试运行(需要加米) 74 | 75 | **需要完整代码可以加qq 931708230 或者加微信 ynwwxid** 76 | 77 | **需要完整代码可以加qq 931708230 或者加微信 ynwwxid** 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /BookManager-master/mvnw: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # ---------------------------------------------------------------------------- 3 | # Licensed to the Apache Software Foundation (ASF) under one 4 | # or more contributor license agreements. See the NOTICE file 5 | # distributed with this work for additional information 6 | # regarding copyright ownership. The ASF licenses this file 7 | # to you under the Apache License, Version 2.0 (the 8 | # "License"); you may not use this file except in compliance 9 | # with the License. You may obtain a copy of the License at 10 | # 11 | # https://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, 14 | # software distributed under the License is distributed on an 15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | # KIND, either express or implied. See the License for the 17 | # specific language governing permissions and limitations 18 | # under the License. 19 | # ---------------------------------------------------------------------------- 20 | 21 | # ---------------------------------------------------------------------------- 22 | # Maven Start Up Batch script 23 | # 24 | # Required ENV vars: 25 | # ------------------ 26 | # JAVA_HOME - location of a JDK home dir 27 | # 28 | # Optional ENV vars 29 | # ----------------- 30 | # M2_HOME - location of maven2's installed home dir 31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven 32 | # e.g. to debug Maven itself, use 33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files 35 | # ---------------------------------------------------------------------------- 36 | 37 | if [ -z "$MAVEN_SKIP_RC" ] ; then 38 | 39 | if [ -f /etc/mavenrc ] ; then 40 | . /etc/mavenrc 41 | fi 42 | 43 | if [ -f "$HOME/.mavenrc" ] ; then 44 | . "$HOME/.mavenrc" 45 | fi 46 | 47 | fi 48 | 49 | # OS specific support. $var _must_ be set to either true or false. 50 | cygwin=false; 51 | darwin=false; 52 | mingw=false 53 | case "`uname`" in 54 | CYGWIN*) cygwin=true ;; 55 | MINGW*) mingw=true;; 56 | Darwin*) darwin=true 57 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home 58 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html 59 | if [ -z "$JAVA_HOME" ]; then 60 | if [ -x "/usr/libexec/java_home" ]; then 61 | export JAVA_HOME="`/usr/libexec/java_home`" 62 | else 63 | export JAVA_HOME="/Library/Java/Home" 64 | fi 65 | fi 66 | ;; 67 | esac 68 | 69 | if [ -z "$JAVA_HOME" ] ; then 70 | if [ -r /etc/gentoo-release ] ; then 71 | JAVA_HOME=`java-config --jre-home` 72 | fi 73 | fi 74 | 75 | if [ -z "$M2_HOME" ] ; then 76 | ## resolve links - $0 may be a link to maven's home 77 | PRG="$0" 78 | 79 | # need this for relative symlinks 80 | while [ -h "$PRG" ] ; do 81 | ls=`ls -ld "$PRG"` 82 | link=`expr "$ls" : '.*-> \(.*\)$'` 83 | if expr "$link" : '/.*' > /dev/null; then 84 | PRG="$link" 85 | else 86 | PRG="`dirname "$PRG"`/$link" 87 | fi 88 | done 89 | 90 | saveddir=`pwd` 91 | 92 | M2_HOME=`dirname "$PRG"`/.. 93 | 94 | # make it fully qualified 95 | M2_HOME=`cd "$M2_HOME" && pwd` 96 | 97 | cd "$saveddir" 98 | # echo Using m2 at $M2_HOME 99 | fi 100 | 101 | # For Cygwin, ensure paths are in UNIX format before anything is touched 102 | if $cygwin ; then 103 | [ -n "$M2_HOME" ] && 104 | M2_HOME=`cygpath --unix "$M2_HOME"` 105 | [ -n "$JAVA_HOME" ] && 106 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 107 | [ -n "$CLASSPATH" ] && 108 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"` 109 | fi 110 | 111 | # For Mingw, ensure paths are in UNIX format before anything is touched 112 | if $mingw ; then 113 | [ -n "$M2_HOME" ] && 114 | M2_HOME="`(cd "$M2_HOME"; pwd)`" 115 | [ -n "$JAVA_HOME" ] && 116 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" 117 | fi 118 | 119 | if [ -z "$JAVA_HOME" ]; then 120 | javaExecutable="`which javac`" 121 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then 122 | # readlink(1) is not available as standard on Solaris 10. 123 | readLink=`which readlink` 124 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then 125 | if $darwin ; then 126 | javaHome="`dirname \"$javaExecutable\"`" 127 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" 128 | else 129 | javaExecutable="`readlink -f \"$javaExecutable\"`" 130 | fi 131 | javaHome="`dirname \"$javaExecutable\"`" 132 | javaHome=`expr "$javaHome" : '\(.*\)/bin'` 133 | JAVA_HOME="$javaHome" 134 | export JAVA_HOME 135 | fi 136 | fi 137 | fi 138 | 139 | if [ -z "$JAVACMD" ] ; then 140 | if [ -n "$JAVA_HOME" ] ; then 141 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 142 | # IBM's JDK on AIX uses strange locations for the executables 143 | JAVACMD="$JAVA_HOME/jre/sh/java" 144 | else 145 | JAVACMD="$JAVA_HOME/bin/java" 146 | fi 147 | else 148 | JAVACMD="`which java`" 149 | fi 150 | fi 151 | 152 | if [ ! -x "$JAVACMD" ] ; then 153 | echo "Error: JAVA_HOME is not defined correctly." >&2 154 | echo " We cannot execute $JAVACMD" >&2 155 | exit 1 156 | fi 157 | 158 | if [ -z "$JAVA_HOME" ] ; then 159 | echo "Warning: JAVA_HOME environment variable is not set." 160 | fi 161 | 162 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher 163 | 164 | # traverses directory structure from process work directory to filesystem root 165 | # first directory with .mvn subdirectory is considered project base directory 166 | find_maven_basedir() { 167 | 168 | if [ -z "$1" ] 169 | then 170 | echo "Path not specified to find_maven_basedir" 171 | return 1 172 | fi 173 | 174 | basedir="$1" 175 | wdir="$1" 176 | while [ "$wdir" != '/' ] ; do 177 | if [ -d "$wdir"/.mvn ] ; then 178 | basedir=$wdir 179 | break 180 | fi 181 | # workaround for JBEAP-8937 (on Solaris 10/Sparc) 182 | if [ -d "${wdir}" ]; then 183 | wdir=`cd "$wdir/.."; pwd` 184 | fi 185 | # end of workaround 186 | done 187 | echo "${basedir}" 188 | } 189 | 190 | # concatenates all lines of a file 191 | concat_lines() { 192 | if [ -f "$1" ]; then 193 | echo "$(tr -s '\n' ' ' < "$1")" 194 | fi 195 | } 196 | 197 | BASE_DIR=`find_maven_basedir "$(pwd)"` 198 | if [ -z "$BASE_DIR" ]; then 199 | exit 1; 200 | fi 201 | 202 | ########################################################################################## 203 | # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 204 | # This allows using the maven wrapper in projects that prohibit checking in binary data. 205 | ########################################################################################## 206 | if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then 207 | if [ "$MVNW_VERBOSE" = true ]; then 208 | echo "Found .mvn/wrapper/maven-wrapper.jar" 209 | fi 210 | else 211 | if [ "$MVNW_VERBOSE" = true ]; then 212 | echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." 213 | fi 214 | if [ -n "$MVNW_REPOURL" ]; then 215 | jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" 216 | else 217 | jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" 218 | fi 219 | while IFS="=" read key value; do 220 | case "$key" in (wrapperUrl) jarUrl="$value"; break ;; 221 | esac 222 | done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" 223 | if [ "$MVNW_VERBOSE" = true ]; then 224 | echo "Downloading from: $jarUrl" 225 | fi 226 | wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" 227 | if $cygwin; then 228 | wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` 229 | fi 230 | 231 | if command -v wget > /dev/null; then 232 | if [ "$MVNW_VERBOSE" = true ]; then 233 | echo "Found wget ... using wget" 234 | fi 235 | if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then 236 | wget "$jarUrl" -O "$wrapperJarPath" 237 | else 238 | wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" 239 | fi 240 | elif command -v curl > /dev/null; then 241 | if [ "$MVNW_VERBOSE" = true ]; then 242 | echo "Found curl ... using curl" 243 | fi 244 | if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then 245 | curl -o "$wrapperJarPath" "$jarUrl" -f 246 | else 247 | curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f 248 | fi 249 | 250 | else 251 | if [ "$MVNW_VERBOSE" = true ]; then 252 | echo "Falling back to using Java to download" 253 | fi 254 | javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" 255 | # For Cygwin, switch paths to Windows format before running javac 256 | if $cygwin; then 257 | javaClass=`cygpath --path --windows "$javaClass"` 258 | fi 259 | if [ -e "$javaClass" ]; then 260 | if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then 261 | if [ "$MVNW_VERBOSE" = true ]; then 262 | echo " - Compiling MavenWrapperDownloader.java ..." 263 | fi 264 | # Compiling the Java class 265 | ("$JAVA_HOME/bin/javac" "$javaClass") 266 | fi 267 | if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then 268 | # Running the downloader 269 | if [ "$MVNW_VERBOSE" = true ]; then 270 | echo " - Running MavenWrapperDownloader.java ..." 271 | fi 272 | ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") 273 | fi 274 | fi 275 | fi 276 | fi 277 | ########################################################################################## 278 | # End of extension 279 | ########################################################################################## 280 | 281 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} 282 | if [ "$MVNW_VERBOSE" = true ]; then 283 | echo $MAVEN_PROJECTBASEDIR 284 | fi 285 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" 286 | 287 | # For Cygwin, switch paths to Windows format before running java 288 | if $cygwin; then 289 | [ -n "$M2_HOME" ] && 290 | M2_HOME=`cygpath --path --windows "$M2_HOME"` 291 | [ -n "$JAVA_HOME" ] && 292 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` 293 | [ -n "$CLASSPATH" ] && 294 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"` 295 | [ -n "$MAVEN_PROJECTBASEDIR" ] && 296 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` 297 | fi 298 | 299 | # Provide a "standardized" way to retrieve the CLI args that will 300 | # work with both Windows and non-Windows executions. 301 | MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" 302 | export MAVEN_CMD_LINE_ARGS 303 | 304 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 305 | 306 | exec "$JAVACMD" \ 307 | $MAVEN_OPTS \ 308 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ 309 | "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ 310 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" 311 | -------------------------------------------------------------------------------- /BookManager-master/mvnw.cmd: -------------------------------------------------------------------------------- 1 | @REM ---------------------------------------------------------------------------- 2 | @REM Licensed to the Apache Software Foundation (ASF) under one 3 | @REM or more contributor license agreements. See the NOTICE file 4 | @REM distributed with this work for additional information 5 | @REM regarding copyright ownership. The ASF licenses this file 6 | @REM to you under the Apache License, Version 2.0 (the 7 | @REM "License"); you may not use this file except in compliance 8 | @REM with the License. You may obtain a copy of the License at 9 | @REM 10 | @REM https://www.apache.org/licenses/LICENSE-2.0 11 | @REM 12 | @REM Unless required by applicable law or agreed to in writing, 13 | @REM software distributed under the License is distributed on an 14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | @REM KIND, either express or implied. See the License for the 16 | @REM specific language governing permissions and limitations 17 | @REM under the License. 18 | @REM ---------------------------------------------------------------------------- 19 | 20 | @REM ---------------------------------------------------------------------------- 21 | @REM Maven Start Up Batch script 22 | @REM 23 | @REM Required ENV vars: 24 | @REM JAVA_HOME - location of a JDK home dir 25 | @REM 26 | @REM Optional ENV vars 27 | @REM M2_HOME - location of maven2's installed home dir 28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands 29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending 30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven 31 | @REM e.g. to debug Maven itself, use 32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files 34 | @REM ---------------------------------------------------------------------------- 35 | 36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' 37 | @echo off 38 | @REM set title of command window 39 | title %0 40 | @REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' 41 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% 42 | 43 | @REM set %HOME% to equivalent of $HOME 44 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") 45 | 46 | @REM Execute a user defined script before this one 47 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre 48 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending 49 | if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" 50 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" 51 | :skipRcPre 52 | 53 | @setlocal 54 | 55 | set ERROR_CODE=0 56 | 57 | @REM To isolate internal variables from possible post scripts, we use another setlocal 58 | @setlocal 59 | 60 | @REM ==== START VALIDATION ==== 61 | if not "%JAVA_HOME%" == "" goto OkJHome 62 | 63 | echo. 64 | echo Error: JAVA_HOME not found in your environment. >&2 65 | echo Please set the JAVA_HOME variable in your environment to match the >&2 66 | echo location of your Java installation. >&2 67 | echo. 68 | goto error 69 | 70 | :OkJHome 71 | if exist "%JAVA_HOME%\bin\java.exe" goto init 72 | 73 | echo. 74 | echo Error: JAVA_HOME is set to an invalid directory. >&2 75 | echo JAVA_HOME = "%JAVA_HOME%" >&2 76 | echo Please set the JAVA_HOME variable in your environment to match the >&2 77 | echo location of your Java installation. >&2 78 | echo. 79 | goto error 80 | 81 | @REM ==== END VALIDATION ==== 82 | 83 | :init 84 | 85 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". 86 | @REM Fallback to current working directory if not found. 87 | 88 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% 89 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir 90 | 91 | set EXEC_DIR=%CD% 92 | set WDIR=%EXEC_DIR% 93 | :findBaseDir 94 | IF EXIST "%WDIR%"\.mvn goto baseDirFound 95 | cd .. 96 | IF "%WDIR%"=="%CD%" goto baseDirNotFound 97 | set WDIR=%CD% 98 | goto findBaseDir 99 | 100 | :baseDirFound 101 | set MAVEN_PROJECTBASEDIR=%WDIR% 102 | cd "%EXEC_DIR%" 103 | goto endDetectBaseDir 104 | 105 | :baseDirNotFound 106 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR% 107 | cd "%EXEC_DIR%" 108 | 109 | :endDetectBaseDir 110 | 111 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig 112 | 113 | @setlocal EnableExtensions EnableDelayedExpansion 114 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a 115 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% 116 | 117 | :endReadAdditionalConfig 118 | 119 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" 120 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" 121 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 122 | 123 | set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" 124 | 125 | FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( 126 | IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B 127 | ) 128 | 129 | @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 130 | @REM This allows using the maven wrapper in projects that prohibit checking in binary data. 131 | if exist %WRAPPER_JAR% ( 132 | if "%MVNW_VERBOSE%" == "true" ( 133 | echo Found %WRAPPER_JAR% 134 | ) 135 | ) else ( 136 | if not "%MVNW_REPOURL%" == "" ( 137 | SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" 138 | ) 139 | if "%MVNW_VERBOSE%" == "true" ( 140 | echo Couldn't find %WRAPPER_JAR%, downloading it ... 141 | echo Downloading from: %DOWNLOAD_URL% 142 | ) 143 | 144 | powershell -Command "&{"^ 145 | "$webclient = new-object System.Net.WebClient;"^ 146 | "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ 147 | "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ 148 | "}"^ 149 | "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ 150 | "}" 151 | if "%MVNW_VERBOSE%" == "true" ( 152 | echo Finished downloading %WRAPPER_JAR% 153 | ) 154 | ) 155 | @REM End of extension 156 | 157 | @REM Provide a "standardized" way to retrieve the CLI args that will 158 | @REM work with both Windows and non-Windows executions. 159 | set MAVEN_CMD_LINE_ARGS=%* 160 | 161 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* 162 | if ERRORLEVEL 1 goto error 163 | goto end 164 | 165 | :error 166 | set ERROR_CODE=1 167 | 168 | :end 169 | @endlocal & set ERROR_CODE=%ERROR_CODE% 170 | 171 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost 172 | @REM check for post script, once with legacy .bat ending and once with .cmd ending 173 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" 174 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" 175 | :skipRcPost 176 | 177 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' 178 | if "%MAVEN_BATCH_PAUSE%" == "on" pause 179 | 180 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% 181 | 182 | exit /B %ERROR_CODE% 183 | -------------------------------------------------------------------------------- /BookManager-master/picture/picture1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/BookManager-master/picture/picture1.png -------------------------------------------------------------------------------- /BookManager-master/picture/picture10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/BookManager-master/picture/picture10.jpg -------------------------------------------------------------------------------- /BookManager-master/picture/picture2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/BookManager-master/picture/picture2.png -------------------------------------------------------------------------------- /BookManager-master/picture/picture3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/BookManager-master/picture/picture3.png -------------------------------------------------------------------------------- /BookManager-master/picture/picture4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/BookManager-master/picture/picture4.png -------------------------------------------------------------------------------- /BookManager-master/picture/picture5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/BookManager-master/picture/picture5.png -------------------------------------------------------------------------------- /BookManager-master/picture/picture6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/BookManager-master/picture/picture6.png -------------------------------------------------------------------------------- /BookManager-master/picture/picture7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/BookManager-master/picture/picture7.png -------------------------------------------------------------------------------- /BookManager-master/picture/picture8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/BookManager-master/picture/picture8.png -------------------------------------------------------------------------------- /BookManager-master/picture/picture9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/BookManager-master/picture/picture9.png -------------------------------------------------------------------------------- /BookManager-master/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | 7 | org.springframework.boot 8 | spring-boot-starter-parent 9 | 2.5.6 10 | 11 | 12 | 13 | com.wangpeng.bms 14 | BookManagerApi 15 | 1.0.5 16 | 17 | 18 | 1.8 19 | 20 | 21 | 22 | 23 | 24 | org.springframework.boot 25 | spring-boot-starter-web 26 | 27 | 28 | 29 | org.mybatis.spring.boot 30 | mybatis-spring-boot-starter 31 | 2.0.0 32 | 33 | 34 | 35 | org.springframework.boot 36 | spring-boot-starter-data-redis 37 | 38 | 39 | 40 | mysql 41 | mysql-connector-java 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | src/main/java 50 | 51 | **/*.xml 52 | 53 | 54 | 55 | src/main/resources 56 | 57 | **/* 58 | 59 | 60 | 61 | 62 | 63 | 64 | org.mybatis.generator 65 | mybatis-generator-maven-plugin 66 | 1.3.6 67 | 68 | 69 | GeneratorMapper.xml 70 | true 71 | true 72 | 73 | 74 | 75 | 76 | org.springframework.boot 77 | spring-boot-maven-plugin 78 | 79 | 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/BookManagerApplication.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms; 2 | 3 | import org.mybatis.spring.annotation.MapperScan; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | import org.springframework.transaction.annotation.EnableTransactionManagement; 7 | 8 | @SpringBootApplication 9 | @EnableTransactionManagement 10 | @MapperScan(value = "com.wangpeng.bms.mapper") 11 | public class BookManagerApplication { 12 | 13 | public static void main(String[] args) { 14 | SpringApplication.run(BookManagerApplication.class, args); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/exception/NotEnoughException.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms.exception; 2 | 3 | /** 4 | * 库存不足异常 5 | * 也就是 图书已经借走 6 | */ 7 | public class NotEnoughException extends RuntimeException{ 8 | public NotEnoughException() { 9 | super(); 10 | } 11 | 12 | public NotEnoughException(String message) { 13 | super(message); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/exception/OperationFailureException.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms.exception; 2 | 3 | public class OperationFailureException extends RuntimeException{ 4 | public OperationFailureException() { 5 | } 6 | 7 | public OperationFailureException(String message) { 8 | super(message); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/mapper/BookInfoMapper.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms.mapper; 2 | 3 | import com.wangpeng.bms.model.BookInfo; 4 | import org.apache.ibatis.annotations.Param; 5 | 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | public interface BookInfoMapper { 10 | int deleteByPrimaryKey(Integer bookid); 11 | 12 | int insert(BookInfo record); 13 | 14 | int insertSelective(BookInfo record); 15 | 16 | BookInfo selectByPrimaryKey(Integer bookid); 17 | 18 | int updateByPrimaryKeySelective(BookInfo record); 19 | 20 | int updateByPrimaryKey(BookInfo record); 21 | 22 | List selectAllByLimit(@Param("begin") Integer begin, @Param("size") Integer size); 23 | 24 | Integer selectCount(); 25 | 26 | int selectCountBySearch(Map searchParam); 27 | 28 | List selectBySearch(Map searchParam); 29 | 30 | List selectAll(); 31 | 32 | int selectCountByType(Map map); 33 | 34 | List selectByType(Map map); 35 | } 36 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/mapper/BookInfoMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | bookId, bookName, bookAuthor, bookPrice, bookTypeId, bookDesc, isBorrowed, bookImg 17 | 18 | 24 | 25 | delete from book_info 26 | where bookId = #{bookid,jdbcType=INTEGER} 27 | 28 | 29 | insert into book_info (bookId, bookName, bookAuthor, 30 | bookPrice, bookTypeId, bookDesc, 31 | isBorrowed, bookImg) 32 | values (#{bookid,jdbcType=INTEGER}, #{bookname,jdbcType=VARCHAR}, #{bookauthor,jdbcType=VARCHAR}, 33 | #{bookprice,jdbcType=DECIMAL}, #{booktypeid,jdbcType=INTEGER}, #{bookdesc,jdbcType=VARCHAR}, 34 | #{isborrowed,jdbcType=TINYINT}, #{bookimg,jdbcType=TINYINT}) 35 | 36 | 37 | insert into book_info 38 | 39 | 40 | bookId, 41 | 42 | 43 | bookName, 44 | 45 | 46 | bookAuthor, 47 | 48 | 49 | bookPrice, 50 | 51 | 52 | bookTypeId, 53 | 54 | 55 | bookDesc, 56 | 57 | 58 | isBorrowed, 59 | 60 | 61 | bookImg, 62 | 63 | 64 | 65 | 66 | #{bookid,jdbcType=INTEGER}, 67 | 68 | 69 | #{bookname,jdbcType=VARCHAR}, 70 | 71 | 72 | #{bookauthor,jdbcType=VARCHAR}, 73 | 74 | 75 | #{bookprice,jdbcType=DECIMAL}, 76 | 77 | 78 | #{booktypeid,jdbcType=INTEGER}, 79 | 80 | 81 | #{bookdesc,jdbcType=VARCHAR}, 82 | 83 | 84 | #{isborrowed,jdbcType=TINYINT}, 85 | 86 | 87 | #{bookimg,jdbcType=TINYINT}, 88 | 89 | 90 | 91 | 92 | update book_info 93 | 94 | 95 | bookName = #{bookname,jdbcType=VARCHAR}, 96 | 97 | 98 | bookAuthor = #{bookauthor,jdbcType=VARCHAR}, 99 | 100 | 101 | bookPrice = #{bookprice,jdbcType=DECIMAL}, 102 | 103 | 104 | bookTypeId = #{booktypeid,jdbcType=INTEGER}, 105 | 106 | 107 | bookDesc = #{bookdesc,jdbcType=VARCHAR}, 108 | 109 | 110 | isBorrowed = #{isborrowed,jdbcType=TINYINT}, 111 | 112 | 113 | bookImg = #{bookimg,jdbcType=TINYINT}, 114 | 115 | 116 | where bookId = #{bookid,jdbcType=INTEGER} 117 | 118 | 119 | update book_info 120 | set bookName = #{bookname,jdbcType=VARCHAR}, 121 | bookAuthor = #{bookauthor,jdbcType=VARCHAR}, 122 | bookPrice = #{bookprice,jdbcType=DECIMAL}, 123 | bookTypeId = #{booktypeid,jdbcType=INTEGER}, 124 | bookDesc = #{bookdesc,jdbcType=VARCHAR}, 125 | isBorrowed = #{isborrowed,jdbcType=TINYINT}, 126 | bookImg = #{bookimg,jdbcType=TINYINT} 127 | where bookId = #{bookid,jdbcType=INTEGER} 128 | 129 | 135 | 138 | 152 | 169 | 174 | 182 | 193 | 194 | 195 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/mapper/BookTypeMapper.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms.mapper; 2 | 3 | import com.wangpeng.bms.model.BookInfo; 4 | import com.wangpeng.bms.model.BookType; 5 | import org.apache.ibatis.annotations.Param; 6 | 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | public interface BookTypeMapper { 11 | int deleteByPrimaryKey(Integer booktypeid); 12 | 13 | int insert(BookType record); 14 | 15 | int insertSelective(BookType record); 16 | 17 | BookType selectByPrimaryKey(Integer booktypeid); 18 | 19 | int updateByPrimaryKeySelective(BookType record); 20 | 21 | int updateByPrimaryKey(BookType record); 22 | 23 | List selectAllByLimit(@Param("begin") Integer begin, @Param("size") Integer size); 24 | 25 | Integer selectCount(); 26 | 27 | List selectAll(); 28 | 29 | int selectCountBySearch(Map searchParam); 30 | 31 | List selectBySearch(Map searchParam); 32 | } 33 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/mapper/BookTypeMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | bookTypeId, bookTypeName, bookTypeDesc 11 | 12 | 18 | 19 | delete from book_type 20 | where bookTypeId = #{booktypeid,jdbcType=INTEGER} 21 | 22 | 23 | insert into book_type (bookTypeId, bookTypeName, bookTypeDesc 24 | ) 25 | values (#{booktypeid,jdbcType=INTEGER}, #{booktypename,jdbcType=VARCHAR}, #{booktypedesc,jdbcType=VARCHAR} 26 | ) 27 | 28 | 29 | insert into book_type 30 | 31 | 32 | bookTypeId, 33 | 34 | 35 | bookTypeName, 36 | 37 | 38 | bookTypeDesc, 39 | 40 | 41 | 42 | 43 | #{booktypeid,jdbcType=INTEGER}, 44 | 45 | 46 | #{booktypename,jdbcType=VARCHAR}, 47 | 48 | 49 | #{booktypedesc,jdbcType=VARCHAR}, 50 | 51 | 52 | 53 | 54 | update book_type 55 | 56 | 57 | bookTypeName = #{booktypename,jdbcType=VARCHAR}, 58 | 59 | 60 | bookTypeDesc = #{booktypedesc,jdbcType=VARCHAR}, 61 | 62 | 63 | where bookTypeId = #{booktypeid,jdbcType=INTEGER} 64 | 65 | 66 | update book_type 67 | set bookTypeName = #{booktypename,jdbcType=VARCHAR}, 68 | bookTypeDesc = #{booktypedesc,jdbcType=VARCHAR} 69 | where bookTypeId = #{booktypeid,jdbcType=INTEGER} 70 | 71 | 76 | 79 | 83 | 91 | 101 | 102 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/mapper/BorrowMapper.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms.mapper; 2 | 3 | import com.wangpeng.bms.model.Borrow; 4 | import org.apache.ibatis.annotations.Param; 5 | 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | public interface BorrowMapper { 10 | int deleteByPrimaryKey(Integer borrowid); 11 | 12 | int insert(Borrow record); 13 | 14 | int insertSelective(Borrow record); 15 | 16 | Borrow selectByPrimaryKey(Integer borrowid); 17 | 18 | int updateByPrimaryKeySelective(Borrow record); 19 | 20 | int updateByPrimaryKey(Borrow record); 21 | 22 | List selectAllByLimit(@Param("begin") Integer begin, @Param("size") Integer size); 23 | 24 | Integer selectCount(); 25 | 26 | int selectCountBySearch(Map searchParam); 27 | 28 | List selectBySearch(Map searchParam); 29 | 30 | Integer selectCountByReader(Integer userid); 31 | 32 | List selectAllByLimitByReader(@Param("begin") Integer begin, @Param("size") Integer size, @Param("userid") Integer userid); 33 | } -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/mapper/BorrowMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | borrowId, userId, bookId, borrowTime, returnTime 15 | 16 | 22 | 23 | delete from borrow 24 | where borrowId = #{borrowid,jdbcType=INTEGER} 25 | 26 | 27 | insert into borrow (borrowId, userId, bookId, 28 | borrowTime, returnTime) 29 | values (#{borrowid,jdbcType=INTEGER}, #{userid,jdbcType=INTEGER}, #{bookid,jdbcType=INTEGER}, 30 | #{borrowtime,jdbcType=TIMESTAMP}, #{returntime,jdbcType=TIMESTAMP}) 31 | 32 | 33 | insert into borrow 34 | 35 | 36 | borrowId, 37 | 38 | 39 | userId, 40 | 41 | 42 | bookId, 43 | 44 | 45 | borrowTime, 46 | 47 | 48 | returnTime, 49 | 50 | 51 | 52 | 53 | #{borrowid,jdbcType=INTEGER}, 54 | 55 | 56 | #{userid,jdbcType=INTEGER}, 57 | 58 | 59 | #{bookid,jdbcType=INTEGER}, 60 | 61 | 62 | #{borrowtime,jdbcType=TIMESTAMP}, 63 | 64 | 65 | #{returntime,jdbcType=TIMESTAMP}, 66 | 67 | 68 | 69 | 70 | update borrow 71 | 72 | 73 | userId = #{userid,jdbcType=INTEGER}, 74 | 75 | 76 | bookId = #{bookid,jdbcType=INTEGER}, 77 | 78 | 79 | borrowTime = #{borrowtime,jdbcType=TIMESTAMP}, 80 | 81 | 82 | returnTime = #{returntime,jdbcType=TIMESTAMP}, 83 | 84 | 85 | where borrowId = #{borrowid,jdbcType=INTEGER} 86 | 87 | 88 | update borrow 89 | set userId = #{userid,jdbcType=INTEGER}, 90 | bookId = #{bookid,jdbcType=INTEGER}, 91 | borrowTime = #{borrowtime,jdbcType=TIMESTAMP}, 92 | returnTime = #{returntime,jdbcType=TIMESTAMP} 93 | where borrowId = #{borrowid,jdbcType=INTEGER} 94 | 95 | 102 | 105 | 119 | 134 | 138 | 146 | 147 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/mapper/UserMapper.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms.mapper; 2 | 3 | import com.wangpeng.bms.model.User; 4 | import org.apache.ibatis.annotations.Param; 5 | 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | public interface UserMapper { 10 | int deleteByPrimaryKey(Integer userid); 11 | 12 | int insert(User record); 13 | 14 | int insertSelective(User record); 15 | 16 | User selectByPrimaryKey(Integer userid); 17 | 18 | int updateByPrimaryKeySelective(User record); 19 | 20 | int updateByPrimaryKey(User record); 21 | 22 | User selectByUsernameAndPasswordAndIsAdmin(@Param("username") String username, 23 | @Param("password") String password, 24 | @Param("isAdmin") Byte isAdmin); 25 | 26 | User selectByUsername(String username); 27 | 28 | List selectAllByLimit(@Param("begin") Integer begin, @Param("size") Integer size); 29 | 30 | Integer selectCount(); 31 | 32 | List selectAll(); 33 | 34 | int selectCountBySearch(Map params); 35 | 36 | List selectBySearch(Map params); 37 | } 38 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/mapper/UserMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | userId, userName, userPassword, isAdmin 12 | 13 | 19 | 20 | delete from user 21 | where userId = #{userid,jdbcType=INTEGER} 22 | 23 | 24 | insert into user (userId, userName, userPassword, 25 | isAdmin) 26 | values (#{userid,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR}, #{userpassword,jdbcType=VARCHAR}, 27 | #{isadmin,jdbcType=TINYINT}) 28 | 29 | 30 | insert into user 31 | 32 | 33 | userId, 34 | 35 | 36 | userName, 37 | 38 | 39 | userPassword, 40 | 41 | 42 | isAdmin, 43 | 44 | 45 | 46 | 47 | #{userid,jdbcType=INTEGER}, 48 | 49 | 50 | #{username,jdbcType=VARCHAR}, 51 | 52 | 53 | #{userpassword,jdbcType=VARCHAR}, 54 | 55 | 56 | #{isadmin,jdbcType=TINYINT}, 57 | 58 | 59 | 60 | 61 | update user 62 | 63 | 64 | userName = #{username,jdbcType=VARCHAR}, 65 | 66 | 67 | userPassword = #{userpassword,jdbcType=VARCHAR}, 68 | 69 | 70 | isAdmin = #{isadmin,jdbcType=TINYINT}, 71 | 72 | 73 | where userId = #{userid,jdbcType=INTEGER} 74 | 75 | 76 | update user 77 | set userName = #{username,jdbcType=VARCHAR}, 78 | userPassword = #{userpassword,jdbcType=VARCHAR}, 79 | isAdmin = #{isadmin,jdbcType=TINYINT} 80 | where userId = #{userid,jdbcType=INTEGER} 81 | 82 | 91 | 98 | 103 | 106 | 110 | 118 | 128 | 129 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/service/BookInfoService.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms.service; 2 | 3 | import com.wangpeng.bms.model.BookInfo; 4 | 5 | import java.util.List; 6 | import java.util.Map; 7 | 8 | public interface BookInfoService { 9 | Integer getCount(); 10 | 11 | List queryBookInfos(); 12 | 13 | BookInfo queryBookInfoById(Integer bookid); 14 | 15 | Integer getSearchCount(Map params); 16 | 17 | List searchBookInfosByPage(Map params); 18 | 19 | Integer addBookInfo(BookInfo bookInfo); 20 | 21 | Integer deleteBookInfo(BookInfo bookInfo); 22 | 23 | Integer deleteBookInfos(List bookInfos); 24 | 25 | Integer updateBookInfo(BookInfo bookInfo); 26 | } 27 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/service/BookTypeService.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms.service; 2 | 3 | import com.wangpeng.bms.model.BookType; 4 | 5 | import java.util.List; 6 | import java.util.Map; 7 | 8 | public interface BookTypeService { 9 | Integer getCount(); 10 | 11 | Integer getSearchCount(Map params); 12 | 13 | List searchBookTypesByPage(Map params); 14 | 15 | Integer addBookType(BookType bookType); 16 | 17 | Integer deleteBookType(BookType bookType); 18 | 19 | Integer deleteBookTypes(List bookTypes); 20 | 21 | Integer updateBookType(BookType bookType); 22 | 23 | List queryBookTypes(); 24 | 25 | } 26 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/service/BorrowService.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms.service; 2 | 3 | import com.wangpeng.bms.model.Borrow; 4 | 5 | import java.util.List; 6 | import java.util.Map; 7 | 8 | public interface BorrowService { 9 | Integer getCount(); 10 | 11 | Integer getSearchCount(Map params); 12 | 13 | List searchBorrowsByPage(Map params); 14 | 15 | Integer addBorrow(Borrow borrow); 16 | 17 | Integer addBorrow2(Borrow borrow); 18 | 19 | Integer deleteBorrow(Borrow borrow); 20 | 21 | Integer deleteBorrows(List borrows); 22 | 23 | Integer updateBorrow(Borrow borrow); 24 | 25 | Integer updateBorrow2(Borrow borrow); 26 | 27 | Borrow queryBorrowsById(Integer borrowid); 28 | } 29 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms.service; 2 | 3 | import com.wangpeng.bms.model.User; 4 | 5 | import java.util.List; 6 | import java.util.Map; 7 | 8 | public interface UserService { 9 | 10 | User login(User user); 11 | 12 | void saveUser(String token, User user); 13 | 14 | User getUser(String token); 15 | 16 | void removeUser(String token); 17 | 18 | Integer register(String username, String password); 19 | 20 | void setPassword(Integer id, String password); 21 | 22 | Integer getCount(); 23 | 24 | List queryUsers(); 25 | 26 | int getSearchCount(Map searchParam); 27 | 28 | List searchUsersByPage(Map params); 29 | 30 | Integer addUser(User user); 31 | 32 | Integer deleteUser(User user); 33 | 34 | Integer deleteUsers(List users); 35 | 36 | Integer updateUser(User user); 37 | } 38 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/service/impl/BookInfoServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms.service.impl; 2 | 3 | import com.wangpeng.bms.mapper.BookInfoMapper; 4 | import com.wangpeng.bms.model.BookInfo; 5 | import com.wangpeng.bms.service.BookInfoService; 6 | import org.springframework.stereotype.Service; 7 | 8 | import javax.annotation.Resource; 9 | import java.util.List; 10 | import java.util.Map; 11 | 12 | @Service 13 | public class BookInfoServiceImpl implements BookInfoService { 14 | 15 | @Resource 16 | private BookInfoMapper bookInfoMapper; 17 | 18 | @Override 19 | public Integer getCount() { 20 | return bookInfoMapper.selectCount(); 21 | } 22 | 23 | @Override 24 | public List queryBookInfos() { 25 | return bookInfoMapper.selectAll(); 26 | } 27 | 28 | @Override 29 | public BookInfo queryBookInfoById(Integer bookid) { 30 | return bookInfoMapper.selectByPrimaryKey(bookid); 31 | } 32 | 33 | @Override 34 | public Integer getSearchCount(Map params) { 35 | return bookInfoMapper.selectCountBySearch(params); 36 | } 37 | 38 | @Override 39 | public List searchBookInfosByPage(Map params) { 40 | return bookInfoMapper.selectBySearch(params); 41 | } 42 | 43 | @Override 44 | public Integer addBookInfo(BookInfo bookInfo) { 45 | return bookInfoMapper.insertSelective(bookInfo); 46 | } 47 | 48 | @Override 49 | public Integer deleteBookInfo(BookInfo bookInfo) { 50 | int count = 0; 51 | try{ 52 | count = bookInfoMapper.deleteByPrimaryKey(bookInfo.getBookid()); 53 | } catch (Exception e) { 54 | e.printStackTrace(); 55 | } 56 | return count; 57 | } 58 | 59 | @Override 60 | public Integer deleteBookInfos(List bookInfos) { 61 | int count = 0; 62 | for(BookInfo bookInfo : bookInfos) { 63 | count += deleteBookInfo(bookInfo); 64 | } 65 | return count; 66 | } 67 | 68 | @Override 69 | public Integer updateBookInfo(BookInfo bookInfo) { 70 | return bookInfoMapper.updateByPrimaryKeySelective(bookInfo); 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/service/impl/BookTypeServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms.service.impl; 2 | 3 | import com.wangpeng.bms.mapper.BookTypeMapper; 4 | import com.wangpeng.bms.model.BookType; 5 | import com.wangpeng.bms.service.BookTypeService; 6 | import org.springframework.stereotype.Service; 7 | 8 | import javax.annotation.Resource; 9 | import java.util.List; 10 | import java.util.Map; 11 | 12 | @Service 13 | public class BookTypeServiceImpl implements BookTypeService { 14 | 15 | @Resource 16 | private BookTypeMapper bookTypeMapper; 17 | 18 | @Override 19 | public Integer getCount() { 20 | return bookTypeMapper.selectCount(); 21 | } 22 | 23 | @Override 24 | public Integer getSearchCount(Map params) { 25 | return bookTypeMapper.selectCountBySearch(params); 26 | } 27 | 28 | @Override 29 | public List searchBookTypesByPage(Map params) { 30 | return bookTypeMapper.selectBySearch(params); 31 | } 32 | 33 | @Override 34 | public Integer addBookType(BookType bookType) { 35 | return bookTypeMapper.insertSelective(bookType); 36 | } 37 | 38 | @Override 39 | public Integer deleteBookType(BookType bookType) { 40 | int count = 0; 41 | try{ 42 | count = bookTypeMapper.deleteByPrimaryKey(bookType.getBooktypeid()); 43 | } catch (Exception e) { 44 | e.printStackTrace(); 45 | } 46 | return count; 47 | } 48 | 49 | @Override 50 | public Integer deleteBookTypes(List bookTypes) { 51 | int count = 0; 52 | for(BookType bookType : bookTypes) { 53 | count += deleteBookType(bookType); 54 | } 55 | return count; 56 | } 57 | 58 | @Override 59 | public Integer updateBookType(BookType bookType) { 60 | return bookTypeMapper.updateByPrimaryKeySelective(bookType); 61 | } 62 | 63 | @Override 64 | public List queryBookTypes() { 65 | return bookTypeMapper.selectAll(); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/service/impl/BorrowServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms.service.impl; 2 | 3 | import com.wangpeng.bms.mapper.BorrowMapper; 4 | import com.wangpeng.bms.model.Borrow; 5 | import com.wangpeng.bms.service.BorrowService; 6 | import org.springframework.stereotype.Service; 7 | 8 | import javax.annotation.Resource; 9 | import java.text.ParseException; 10 | import java.text.SimpleDateFormat; 11 | import java.util.List; 12 | import java.util.Map; 13 | 14 | @Service 15 | public class BorrowServiceImpl implements BorrowService { 16 | 17 | @Resource 18 | private BorrowMapper borrowMapper; 19 | 20 | @Override 21 | public Integer getCount() { 22 | return borrowMapper.selectCount(); 23 | } 24 | 25 | @Override 26 | public Integer getSearchCount(Map params) { 27 | return borrowMapper.selectCountBySearch(params); 28 | } 29 | 30 | @Override 31 | public List searchBorrowsByPage(Map params) { 32 | List borrows = borrowMapper.selectBySearch(params); 33 | // 添加string类型的时间显示 34 | for(Borrow borrow : borrows) { 35 | SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 36 | if(borrow.getBorrowtime() != null) borrow.setBorrowtimestr(simpleDateFormat.format(borrow.getBorrowtime())); 37 | if(borrow.getReturntime() != null) borrow.setReturntimestr(simpleDateFormat.format(borrow.getReturntime())); 38 | } 39 | return borrows; 40 | } 41 | 42 | @Override 43 | public Integer addBorrow(Borrow borrow) { 44 | // 将string类型的时间重新调整 45 | SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 46 | try { 47 | borrow.setBorrowtime(simpleDateFormat.parse(borrow.getBorrowtimestr())); 48 | borrow.setReturntime(simpleDateFormat.parse(borrow.getReturntimestr())); 49 | } catch (ParseException e) { 50 | e.printStackTrace(); 51 | } 52 | return borrowMapper.insertSelective(borrow); 53 | } 54 | 55 | // 不会调整时间格式的add 56 | @Override 57 | public Integer addBorrow2(Borrow borrow) { 58 | return borrowMapper.insertSelective(borrow); 59 | } 60 | 61 | @Override 62 | public Integer deleteBorrow(Borrow borrow) { 63 | // 先查询有没有还书 64 | Borrow borrow1 = borrowMapper.selectByPrimaryKey(borrow.getBorrowid()); 65 | if(borrow1.getReturntime() == null) return 0; 66 | return borrowMapper.deleteByPrimaryKey(borrow.getBorrowid()); 67 | } 68 | 69 | @Override 70 | public Integer deleteBorrows(List borrows) { 71 | int count = 0; 72 | for(Borrow borrow : borrows) { 73 | count += deleteBorrow(borrow); 74 | } 75 | return count; 76 | } 77 | 78 | @Override 79 | public Integer updateBorrow(Borrow borrow) { 80 | // 将string类型的时间重新调整 81 | SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 82 | try { 83 | borrow.setBorrowtime(simpleDateFormat.parse(borrow.getBorrowtimestr())); 84 | borrow.setReturntime(simpleDateFormat.parse(borrow.getReturntimestr())); 85 | } catch (ParseException e) { 86 | e.printStackTrace(); 87 | } 88 | return borrowMapper.updateByPrimaryKeySelective(borrow); 89 | } 90 | 91 | // 不调整时间格式的更新 92 | @Override 93 | public Integer updateBorrow2(Borrow borrow) { 94 | return borrowMapper.updateByPrimaryKeySelective(borrow); 95 | } 96 | 97 | @Override 98 | public Borrow queryBorrowsById(Integer borrowid) { 99 | return borrowMapper.selectByPrimaryKey(borrowid); 100 | } 101 | 102 | } 103 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/service/impl/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms.service.impl; 2 | 3 | import com.mysql.cj.util.TimeUtil; 4 | import com.wangpeng.bms.mapper.UserMapper; 5 | import com.wangpeng.bms.model.User; 6 | import com.wangpeng.bms.service.UserService; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.data.redis.core.RedisTemplate; 9 | import org.springframework.data.redis.serializer.StringRedisSerializer; 10 | import org.springframework.stereotype.Service; 11 | 12 | import javax.annotation.Resource; 13 | import java.util.List; 14 | import java.util.Map; 15 | import java.util.concurrent.TimeUnit; 16 | 17 | @Service 18 | public class UserServiceImpl implements UserService { 19 | 20 | @Resource 21 | private UserMapper userMapper; 22 | 23 | @Resource 24 | private RedisTemplate redisTemplate; 25 | 26 | @Override 27 | public User login(User user) { 28 | return userMapper.selectByUsernameAndPasswordAndIsAdmin(user.getUsername(), user.getUserpassword(), user.getIsadmin()); 29 | } 30 | 31 | @Override 32 | public void saveUser(String token, User user) { 33 | // 设置redisTemplate对象key的序列化方式 34 | redisTemplate.setKeySerializer(new StringRedisSerializer()); 35 | // key是token,value是用户保存到redis中,超时时间1小时 36 | redisTemplate.opsForValue().set(token, user, 1, TimeUnit.HOURS); 37 | } 38 | 39 | @Override 40 | public User getUser(String token) { 41 | // 根据token得到user 42 | return (User) redisTemplate.opsForValue().get(token); 43 | } 44 | 45 | @Override 46 | public void removeUser(String token) { 47 | // 移除token 48 | redisTemplate.delete(token); 49 | } 50 | 51 | @Override 52 | public Integer register(String username, String password) { 53 | User tmp = userMapper.selectByUsername(username); 54 | if(tmp != null) return 0; //账号重复 55 | 56 | User user = new User(); 57 | user.setUsername(username); 58 | user.setUserpassword(password); 59 | user.setIsadmin((byte)0); 60 | return userMapper.insertSelective(user); 61 | } 62 | 63 | @Override 64 | public void setPassword(Integer id, String password) { 65 | User user = new User(); 66 | user.setUserid(id); 67 | user.setUserpassword(password); 68 | userMapper.updateByPrimaryKeySelective(user); 69 | } 70 | 71 | @Override 72 | public Integer getCount() { 73 | return userMapper.selectCount(); 74 | } 75 | 76 | @Override 77 | public List queryUsers() { 78 | return userMapper.selectAll(); 79 | } 80 | 81 | @Override 82 | public int getSearchCount(Map params) { 83 | return userMapper.selectCountBySearch(params); 84 | } 85 | 86 | @Override 87 | public List searchUsersByPage(Map params) { 88 | return userMapper.selectBySearch(params); 89 | } 90 | 91 | @Override 92 | public Integer addUser(User user) { 93 | return userMapper.insertSelective(user); 94 | } 95 | 96 | @Override 97 | public Integer deleteUser(User user) { 98 | if(user.getUserid() == 1) return 0; 99 | return userMapper.deleteByPrimaryKey(user.getUserid()); 100 | } 101 | 102 | @Override 103 | public Integer deleteUsers(List users) { 104 | int count = 0; 105 | for(User user : users) { 106 | count += deleteUser(user); 107 | } 108 | return count; 109 | } 110 | 111 | @Override 112 | public Integer updateUser(User user) { 113 | return userMapper.updateByPrimaryKeySelective(user); 114 | } 115 | 116 | } 117 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/web/BookInfoController.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms.web; 2 | 3 | import com.wangpeng.bms.model.BookInfo; 4 | import com.wangpeng.bms.service.BookInfoService; 5 | import com.wangpeng.bms.utils.MyResult; 6 | import com.wangpeng.bms.utils.MyUtils; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.web.bind.annotation.*; 9 | 10 | import java.util.List; 11 | import java.util.Map; 12 | 13 | @RestController 14 | @RequestMapping(value = "/bookInfo") 15 | public class BookInfoController { 16 | 17 | @Autowired 18 | BookInfoService bookInfoService; 19 | 20 | // 获取图书数量 21 | @GetMapping(value = "/getCount") 22 | public Integer getCount(){ 23 | return bookInfoService.getCount(); 24 | } 25 | 26 | // 查询所有图书信息 27 | @GetMapping(value = "/queryBookInfos") 28 | public List queryBookInfos(){ 29 | return bookInfoService.queryBookInfos(); 30 | } 31 | 32 | // 分页搜索查询图书信息 params: {page, limit, bookname, bookauthor, booktypeid} 33 | @GetMapping(value = "/queryBookInfosByPage") 34 | public Map queryBookInfosByPage(@RequestParam Map params){ 35 | MyUtils.parsePageParams(params); 36 | int count = bookInfoService.getSearchCount(params); // 获得总数 37 | List bookInfos = bookInfoService.searchBookInfosByPage(params); // 分页查询 38 | return MyResult.getListResultMap(0, "success", count, bookInfos); 39 | } 40 | 41 | // 添加图书信息 42 | @PostMapping(value = "/addBookInfo") 43 | public Integer addBookInfo(@RequestBody BookInfo bookInfo){ 44 | return bookInfoService.addBookInfo(bookInfo); 45 | } 46 | 47 | // 删除图书信息 48 | @DeleteMapping(value = "/deleteBookInfo") 49 | public Integer deleteBookInfo(@RequestBody BookInfo bookInfo){ 50 | return bookInfoService.deleteBookInfo(bookInfo); 51 | } 52 | 53 | // 删除一些图书信息 54 | @DeleteMapping(value = "/deleteBookInfos") 55 | public Integer deleteBookInfos(@RequestBody List bookInfos){ 56 | return bookInfoService.deleteBookInfos(bookInfos); 57 | } 58 | 59 | // 更新图书信息 60 | @PutMapping(value = "/updateBookInfo") 61 | public Integer updateBookInfo(@RequestBody BookInfo bookInfo){ 62 | return bookInfoService.updateBookInfo(bookInfo); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/web/BookTypeController.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms.web; 2 | 3 | import com.wangpeng.bms.model.BookType; 4 | import com.wangpeng.bms.service.BookTypeService; 5 | import com.wangpeng.bms.utils.JsonUtil; 6 | import com.wangpeng.bms.utils.MyResult; 7 | import com.wangpeng.bms.utils.MyUtils; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.web.bind.annotation.*; 10 | 11 | import java.util.List; 12 | import java.util.Map; 13 | 14 | @RestController 15 | @RequestMapping(value = "/bookType") 16 | public class BookTypeController { 17 | 18 | @Autowired 19 | BookTypeService bookTypeService; 20 | 21 | // 获得数量 22 | @GetMapping(value = "/getCount") 23 | public Integer getCount(){ 24 | return bookTypeService.getCount(); 25 | } 26 | 27 | // 查询所有类型 28 | @GetMapping(value = {"/queryBookTypes", "/reader/queryBookTypes"}) 29 | public List queryBookTypes(){ 30 | return bookTypeService.queryBookTypes(); 31 | } 32 | 33 | // 分页查询图书类型 params: {page, limit, booktypename} 34 | @GetMapping(value = "/queryBookTypesByPage") 35 | public Map queryBookTypesByPage(@RequestParam Map params){ 36 | MyUtils.parsePageParams(params); 37 | int count = bookTypeService.getSearchCount(params); 38 | List bookTypes = bookTypeService.searchBookTypesByPage(params); 39 | return MyResult.getListResultMap(0, "success", count, bookTypes); 40 | } 41 | 42 | // 添加类型 43 | @PostMapping(value = "/addBookType") 44 | public Integer addBookType(@RequestBody BookType bookType){ 45 | return bookTypeService.addBookType(bookType); 46 | } 47 | 48 | // 删除类型 49 | @DeleteMapping(value = "/deleteBookType") 50 | public Integer deleteBookType(@RequestBody BookType bookType){ 51 | return bookTypeService.deleteBookType(bookType); 52 | } 53 | 54 | // 删除一些类型 55 | @DeleteMapping(value = "/deleteBookTypes") 56 | public Integer deleteBookTypes(@RequestBody List bookTypes){ 57 | return bookTypeService.deleteBookTypes(bookTypes); 58 | } 59 | 60 | // 更新类型 61 | @PutMapping(value = "/updateBookType") 62 | public Integer updateBookType(@RequestBody BookType bookType){ 63 | return bookTypeService.updateBookType(bookType); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/web/BorrowController.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms.web; 2 | 3 | import com.wangpeng.bms.exception.NotEnoughException; 4 | import com.wangpeng.bms.exception.OperationFailureException; 5 | import com.wangpeng.bms.model.BookInfo; 6 | import com.wangpeng.bms.model.Borrow; 7 | import com.wangpeng.bms.service.BookInfoService; 8 | import com.wangpeng.bms.service.BorrowService; 9 | import com.wangpeng.bms.utils.MyResult; 10 | import com.wangpeng.bms.utils.MyUtils; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.transaction.annotation.Transactional; 13 | import org.springframework.transaction.interceptor.TransactionAspectSupport; 14 | import org.springframework.web.bind.annotation.RequestBody; 15 | import org.springframework.web.bind.annotation.RequestMapping; 16 | import org.springframework.web.bind.annotation.RequestParam; 17 | import org.springframework.web.bind.annotation.RestController; 18 | 19 | import java.util.Date; 20 | import java.util.List; 21 | import java.util.Map; 22 | 23 | @RestController 24 | @RequestMapping(value = "/borrow") 25 | public class BorrowController { 26 | 27 | @Autowired 28 | BorrowService borrowService; 29 | @Autowired 30 | BookInfoService bookInfoService; 31 | 32 | // 分页查询借阅 params: {page, limit, userid, bookid} 33 | @RequestMapping(value = "/queryBorrowsByPage") 34 | public Map queryBorrowsByPage(@RequestParam Map params){ 35 | MyUtils.parsePageParams(params); 36 | int count = borrowService.getSearchCount(params); 37 | List borrows = borrowService.searchBorrowsByPage(params); 38 | return MyResult.getListResultMap(0, "success", count, borrows); 39 | } 40 | 41 | // 添加借阅 42 | @RequestMapping(value = "/addBorrow") 43 | public Integer addBorrow(@RequestBody Borrow borrow){ 44 | return borrowService.addBorrow(borrow); 45 | } 46 | 47 | // 获得数量 48 | @RequestMapping(value = "/getCount") 49 | public Integer getCount(){ 50 | return borrowService.getCount(); 51 | } 52 | 53 | // 删除借阅 54 | @RequestMapping(value = "/deleteBorrow") 55 | public Integer deleteBorrow(@RequestBody Borrow borrow){ 56 | return borrowService.deleteBorrow(borrow); 57 | } 58 | 59 | // 删除一些借阅 60 | @RequestMapping(value = "/deleteBorrows") 61 | public Integer deleteBorrows(@RequestBody List borrows){ 62 | return borrowService.deleteBorrows(borrows); 63 | } 64 | 65 | // 更新借阅 66 | @RequestMapping(value = "/updateBorrow") 67 | public Integer updateBorrow(@RequestBody Borrow borrow){ 68 | return borrowService.updateBorrow(borrow); 69 | } 70 | 71 | // 借书 72 | @RequestMapping(value = {"/borrowBook", "/reader/borrowBook"}) 73 | @Transactional 74 | public Integer borrowBook(Integer userid, Integer bookid){ 75 | try{ 76 | // 查询该书的情况 77 | BookInfo theBook = bookInfoService.queryBookInfoById(bookid); 78 | 79 | if(theBook == null) { // 图书不存在 80 | throw new NullPointerException("图书" + bookid + "不存在"); 81 | } else if(theBook.getIsborrowed() == 1) { // 已经被借 82 | throw new NotEnoughException("图书" + bookid + "库存不足(已经被借走)"); 83 | } 84 | 85 | // 更新图书表的isBorrowed 86 | BookInfo bookInfo = new BookInfo(); 87 | bookInfo.setBookid(bookid); 88 | bookInfo.setIsborrowed((byte) 1); 89 | Integer res2 = bookInfoService.updateBookInfo(bookInfo); 90 | if(res2 == 0) throw new OperationFailureException("图书" + bookid + "更新被借信息失败"); 91 | 92 | // 添加一条记录到borrow表 93 | Borrow borrow = new Borrow(); 94 | borrow.setUserid(userid); 95 | borrow.setBookid(bookid); 96 | borrow.setBorrowtime(new Date(System.currentTimeMillis())); 97 | Integer res1 = borrowService.addBorrow2(borrow); 98 | if(res1 == 0) throw new OperationFailureException("图书" + bookid + "添加借阅记录失败"); 99 | 100 | } catch (Exception e) { 101 | System.out.println("发生异常,进行手动回滚"); 102 | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 103 | e.printStackTrace(); 104 | return 0; 105 | } 106 | return 1; 107 | } 108 | 109 | // 还书 110 | @RequestMapping(value = {"/returnBook", "/reader/returnBook"}) 111 | @Transactional 112 | public Integer returnBook(Integer borrowid, Integer bookid){ 113 | try { 114 | // 查询该书的情况 115 | BookInfo theBook = bookInfoService.queryBookInfoById(bookid); 116 | // 查询借书的情况 117 | Borrow theBorrow = borrowService.queryBorrowsById(borrowid); 118 | 119 | if(theBook == null) { // 图书不存在 120 | throw new NullPointerException("图书" + bookid + "不存在"); 121 | } else if(theBorrow == null) { //结束记录不存在 122 | throw new NullPointerException("借书记录" + bookid + "不存在"); 123 | } else if(theBorrow.getReturntime() != null) { // 已经还过书 124 | throw new NotEnoughException("图书" + bookid + "已经还过了"); 125 | } 126 | 127 | // 更新图书表的isBorrowed 128 | BookInfo bookInfo = new BookInfo(); 129 | bookInfo.setBookid(bookid); 130 | bookInfo.setIsborrowed((byte) 0); 131 | Integer res2 = bookInfoService.updateBookInfo(bookInfo); 132 | if(res2 == 0) throw new OperationFailureException("图书" + bookid + "更新被借信息失败"); 133 | 134 | // 更新Borrow表,更新结束时间 135 | Borrow borrow = new Borrow(); 136 | borrow.setBorrowid(borrowid); 137 | borrow.setReturntime(new Date(System.currentTimeMillis())); 138 | Integer res1 = borrowService.updateBorrow2(borrow); 139 | if(res1 == 0) throw new OperationFailureException("图书" + bookid + "更新借阅记录失败"); 140 | 141 | } catch (Exception e) { 142 | System.out.println("发生异常,进行手动回滚"); 143 | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 144 | e.printStackTrace(); 145 | return 0; 146 | } 147 | return 1; 148 | } 149 | 150 | } 151 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/web/UpdateController.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms.web; 2 | 3 | import org.apache.tomcat.util.http.fileupload.FileItem; 4 | import org.apache.tomcat.util.http.fileupload.FileItemFactory; 5 | import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory; 6 | import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload; 7 | import org.apache.tomcat.util.http.fileupload.servlet.ServletRequestContext; 8 | import org.springframework.stereotype.Controller; 9 | import org.springframework.util.ResourceUtils; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | import org.springframework.web.bind.annotation.ResponseBody; 12 | 13 | import javax.servlet.http.HttpServletRequest; 14 | import java.io.File; 15 | import java.util.HashMap; 16 | import java.util.List; 17 | import java.util.Map; 18 | 19 | @Controller 20 | @RequestMapping("/update") 21 | public class UpdateController { 22 | 23 | /** 24 | * 我的上传方法 25 | * @param req 26 | * @param dirName 27 | * @return 28 | */ 29 | private String myUpdate(HttpServletRequest req, String dirName) { 30 | String res = null; // 返回网络路径 31 | try { 32 | String staticDir = ResourceUtils.getURL("classpath:").getPath() + "static"; // 得到classes/static目录 33 | String localDir = staticDir + "/" + dirName; //本地目录 34 | // 如果结果目录不存在,则创建目录 35 | File resDirFile = new File(localDir); 36 | if(!resDirFile.exists()) { 37 | boolean flag = resDirFile.mkdirs(); 38 | if(!flag) throw new RuntimeException("创建结果目录失败"); 39 | } 40 | //先判断上传的数据是否多段数据(只有是多段的数据,才是文件上传的) 41 | if (ServletFileUpload.isMultipartContent(req)) { 42 | // 创建 FileItemFactory 工厂实现类 43 | FileItemFactory fileItemFactory = new DiskFileItemFactory(); 44 | // 创建用于解析上传数据的工具类 ServletFileUpload 类 45 | ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory); 46 | // 解析上传的数据,得到每一个表单项 FileItem 47 | List list = servletFileUpload.parseRequest(new ServletRequestContext(req)); 48 | // 循环判断,每一个表单项,是普通类型,还是上传的文件 49 | for (FileItem fileItem : list) { 50 | if ( !fileItem.isFormField()) { // 是上传的文件 51 | // 上传的文件 52 | System.out.println("表单项的 name 属性值:" + fileItem.getFieldName()); 53 | System.out.println("上传的文件名:" + fileItem.getName()); 54 | // 加个时间戳防止重名 55 | String newFileName = System.currentTimeMillis() + fileItem.getName(); 56 | // 写文件 57 | File file = new File(localDir + "/" + newFileName); 58 | fileItem.write(file); 59 | // 返回值 60 | res = "http://localhost:8092/BookManager/" + dirName + "/" + newFileName; 61 | } 62 | } 63 | } 64 | } 65 | catch (Exception e) { 66 | e.printStackTrace(); 67 | } 68 | return res; 69 | } 70 | 71 | /** 72 | * 上传图片 73 | * @param req 74 | * @return 75 | */ 76 | @RequestMapping("/updateImg") 77 | @ResponseBody 78 | public Map updateImg(HttpServletRequest req){ 79 | String resPath = myUpdate(req, "pictures"); 80 | 81 | Map res = new HashMap<>(); 82 | res.put("code",0); 83 | res.put("data", resPath); 84 | 85 | return res; 86 | } 87 | 88 | } 89 | -------------------------------------------------------------------------------- /BookManager-master/src/main/java/com/wangpeng/bms/web/UserController.java: -------------------------------------------------------------------------------- 1 | package com.wangpeng.bms.web; 2 | 3 | import com.wangpeng.bms.model.User; 4 | import com.wangpeng.bms.service.UserService; 5 | import com.wangpeng.bms.utils.*; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.web.bind.annotation.*; 8 | 9 | import javax.servlet.http.HttpServletRequest; 10 | import java.util.HashMap; 11 | import java.util.List; 12 | import java.util.Map; 13 | 14 | @RestController 15 | @RequestMapping(value = "/user") 16 | public class UserController { 17 | 18 | @Autowired 19 | UserService userService; 20 | 21 | // 登录 22 | @RequestMapping(value = "/login") 23 | public Map login(@RequestBody User user) { 24 | // 登录 25 | User userObj = userService.login(user); 26 | if(userObj == null) { // 账号或密码错误 27 | // 返回结果对象 28 | return MyResult.getResultMap(420, "账号或密码错误"); 29 | } else { // 账号密码正确 30 | // 创建token 31 | String token = TokenProcessor.getInstance().makeToken(); 32 | // 保存到Redis 33 | userService.saveUser(token, userObj); 34 | // 返回结果对象 35 | return MyResult.getResultMap(200, "登录成功", 36 | new HashMap(){{ put("token", token); }}); 37 | } 38 | } 39 | 40 | // 查看用户信息 41 | @RequestMapping(value = "/info") 42 | public Map info(String token) { 43 | // 从redis中取用户 44 | User user = userService.getUser(token); 45 | if(user == null) { // 获取失败 46 | return MyResult.getResultMap(420, "获取用户信息失败"); 47 | } else { // 获取成功 48 | return MyResult.getResultMap(200, "获取用户信息成功", user); 49 | } 50 | } 51 | 52 | // 退出登录 53 | @RequestMapping(value = "/logout") 54 | public Map logout(String token) { 55 | // 从redis中移除用户 56 | userService.removeUser(token); 57 | return MyResult.getResultMap(200, "退出登录成功" ); 58 | } 59 | 60 | // 注册 61 | @RequestMapping(value = "/register") 62 | public Integer register(String username, String password){ 63 | return userService.register(username, password); 64 | } 65 | 66 | // 修改密码 67 | @RequestMapping(value = {"/alterPassword", "reader/alterPassword"}) 68 | public Integer alterPassword(Integer userid, String username, Byte isadmin, String oldPassword, String newPassword){ 69 | //检查旧密码是否正确 70 | User userObj = new User(); 71 | userObj.setUserid(userid); 72 | userObj.setUsername(username); 73 | userObj.setUserpassword(oldPassword); 74 | userObj.setIsadmin(isadmin); 75 | 76 | User user = userService.login(userObj); 77 | if(user == null) { //旧密码不正确 78 | return 0; 79 | } else { //旧密码正确,设置新密码 80 | userService.setPassword(userObj.getUserid(), newPassword); 81 | return 1; 82 | } 83 | } 84 | 85 | // 获得数量 86 | @GetMapping(value = "/getCount") 87 | public Integer getCount(){ 88 | return userService.getCount(); 89 | } 90 | 91 | // 查询所有用户 92 | @GetMapping(value = "/queryUsers") 93 | public List queryUsers(){ 94 | return userService.queryUsers(); 95 | } 96 | 97 | // 分页查询用户 params: {page, limit, username} 98 | @GetMapping(value = "/queryUsersByPage") 99 | public Map queryUsersByPage(@RequestParam Map params){ 100 | MyUtils.parsePageParams(params); 101 | int count = userService.getSearchCount(params); 102 | List users = userService.searchUsersByPage(params); 103 | return MyResult.getListResultMap(0, "success", count, users); 104 | } 105 | 106 | // 添加用户 107 | @PostMapping(value = "/addUser") 108 | public Integer addUser(@RequestBody User user){ 109 | return userService.addUser(user); 110 | } 111 | 112 | // 删除用户 113 | @DeleteMapping(value = "/deleteUser") 114 | public Integer deleteUser(@RequestBody User user){ 115 | return userService.deleteUser(user); 116 | } 117 | 118 | // 删除一些用户 119 | @DeleteMapping(value = "/deleteUsers") 120 | public Integer deleteUsers(@RequestBody List users){ 121 | return userService.deleteUsers(users); 122 | } 123 | 124 | // 更新用户 125 | @RequestMapping(value = "/updateUser") 126 | public Integer updateUser(@RequestBody User user){ 127 | return userService.updateUser(user); 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /BookManager-master/src/main/resources/META-INF/additional-spring-configuration-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "properties": [ 3 | { 4 | "name": "spring.http.multipart.enabled", 5 | "type": "java.lang.String", 6 | "description": "Description for spring.http.multipart.enabled." 7 | } 8 | ] } -------------------------------------------------------------------------------- /BookManager-master/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | # \u7AEF\u53E3\u53F7 2 | server.port=8092 3 | # \u4E0A\u4E0B\u6587\u6839 4 | server.servlet.context-path=/BookManager 5 | 6 | # \u914D\u7F6E\u6570\u636E\u5E93 7 | spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 8 | spring.datasource.url=jdbc:mysql://localhost:3306/bookstore2?useAffectedRows=true 9 | #spring.datasource.username=root 10 | #spring.datasource.password=wangpeng123 11 | spring.datasource.username=root 12 | spring.datasource.password=root 13 | 14 | # \u914D\u7F6ERedis 15 | spring.redis.host=47.101.155.194 16 | spring.redis.port=6379 17 | spring.redis.password=foobared 18 | 19 | # \u4E0A\u4F20\u6587\u4EF6\u5927\u5C0F\u9650\u5236 20 | spring.servlet.multipart.max-file-size=10MB 21 | spring.servlet.multipart.max-request-size=100MB 22 | 23 | # \u5173\u95EDmultipart\uFF0C\u8BE5\u6DFB\u52A0\u4F1A\u5C06springboot\u7684\u9ED8\u8BA4\u7684multipart\u53D6\u6D88\uFF0C\u907F\u514D\u4E0A\u4F20\u6587\u4EF6\u65F6\u62A5\u9519 24 | spring.servlet.multipart.enabled=false 25 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/BookManagerVue-permission-control/public/favicon.ico -------------------------------------------------------------------------------- /BookManagerVue-permission-control/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <%= webpackConfig.name %> 9 | 10 | 11 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/api/article.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function fetchList(query) { 4 | return request({ 5 | url: '/vue-element-admin/article/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function fetchArticle(id) { 12 | return request({ 13 | url: '/vue-element-admin/article/detail', 14 | method: 'get', 15 | params: { id } 16 | }) 17 | } 18 | 19 | export function fetchPv(pv) { 20 | return request({ 21 | url: '/vue-element-admin/article/pv', 22 | method: 'get', 23 | params: { pv } 24 | }) 25 | } 26 | 27 | export function createArticle(data) { 28 | return request({ 29 | url: '/vue-element-admin/article/create', 30 | method: 'post', 31 | data 32 | }) 33 | } 34 | 35 | export function updateArticle(data) { 36 | return request({ 37 | url: '/vue-element-admin/article/update', 38 | method: 'post', 39 | data 40 | }) 41 | } 42 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/api/bookinfo.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 获取图书数量 4 | export function getCount() { 5 | return request({ 6 | url: '/bookInfo/getCount', 7 | method: 'get' 8 | }) 9 | } 10 | 11 | // 查询所有图书信息 12 | export function queryBookInfos() { 13 | return request({ 14 | url: '/bookInfo/queryBookInfos', 15 | method: 'get' 16 | }) 17 | } 18 | 19 | // 分页查询图书信息 20 | export function queryBookInfosByPage(params) { 21 | return request({ 22 | url: '/bookInfo/queryBookInfosByPage', 23 | method: 'get', 24 | params 25 | }) 26 | } 27 | 28 | // 添加图书信息 29 | export function addBookInfo(data) { 30 | return request({ 31 | url: '/bookInfo/addBookInfo', 32 | method: 'post', 33 | data 34 | }) 35 | } 36 | 37 | // 删除图书信息 38 | export function deleteBookInfo(data) { 39 | return request({ 40 | url: '/bookInfo/deleteBookInfo', 41 | method: 'delete', 42 | data 43 | }) 44 | } 45 | 46 | // 删除一些图书信息 47 | export function deleteBookInfos(data) { 48 | return request({ 49 | url: '/bookInfo/deleteBookInfos', 50 | method: 'delete', 51 | data 52 | }) 53 | } 54 | 55 | // 更新图书信息 56 | export function updateBookInfo(data) { 57 | return request({ 58 | url: '/bookInfo/updateBookInfo', 59 | method: 'put', 60 | data 61 | }) 62 | } 63 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/api/booktype.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 获取图书类型数量 4 | export function getCount() { 5 | return request({ 6 | url: '/bookType/getCount', 7 | method: 'get' 8 | }) 9 | } 10 | 11 | // 查询所有图书类型 12 | export function queryBookTypes() { 13 | return request({ 14 | url: '/bookType/queryBookTypes', 15 | method: 'get' 16 | }) 17 | } 18 | 19 | // 分页查询图书类型 20 | export function queryBookTypesByPage(params) { 21 | return request({ 22 | url: '/bookType/queryBookTypesByPage', 23 | method: 'get', 24 | params 25 | }) 26 | } 27 | 28 | // 添加图书类型 29 | export function addBookType(data) { 30 | return request({ 31 | url: '/bookType/addBookType', 32 | method: 'post', 33 | data 34 | }) 35 | } 36 | 37 | // 删除图书类型 38 | export function deleteBookType(data) { 39 | return request({ 40 | url: '/bookType/deleteBookType', 41 | method: 'delete', 42 | data 43 | }) 44 | } 45 | 46 | // 删除一些图书类型 47 | export function deleteBookTypes(data) { 48 | return request({ 49 | url: '/bookType/deleteBookTypes', 50 | method: 'delete', 51 | data 52 | }) 53 | } 54 | 55 | // 更新图书类型 56 | export function updateBookType(data) { 57 | return request({ 58 | url: '/bookType/updateBookType', 59 | method: 'put', 60 | data 61 | }) 62 | } 63 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/api/borrow.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 获取借阅数量 4 | export function getCount() { 5 | return request({ 6 | url: '/borrow/getCount', 7 | method: 'get' 8 | }) 9 | } 10 | 11 | // 查询所有借阅信息 12 | export function queryBorrows() { 13 | return request({ 14 | url: '/borrow/queryBorrows', 15 | method: 'get' 16 | }) 17 | } 18 | 19 | // 分页查询借阅信息 20 | export function queryBorrowsByPage(params) { 21 | return request({ 22 | url: '/borrow/queryBorrowsByPage', 23 | method: 'get', 24 | params 25 | }) 26 | } 27 | 28 | // 添加借阅信息 29 | export function addBorrow(data) { 30 | return request({ 31 | url: '/borrow/addBorrow', 32 | method: 'post', 33 | data 34 | }) 35 | } 36 | 37 | // 删除借阅信息 38 | export function deleteBorrow(data) { 39 | return request({ 40 | url: '/borrow/deleteBorrow', 41 | method: 'delete', 42 | data 43 | }) 44 | } 45 | 46 | // 删除一些借阅信息 47 | export function deleteBorrows(data) { 48 | return request({ 49 | url: '/borrow/deleteBorrows', 50 | method: 'delete', 51 | data 52 | }) 53 | } 54 | 55 | // 更新借阅信息 56 | export function updateBorrow(data) { 57 | return request({ 58 | url: '/borrow/updateBorrow', 59 | method: 'put', 60 | data 61 | }) 62 | } 63 | 64 | // 借书 65 | export function borrowBook(userid, bookid) { 66 | return request({ 67 | url: '/borrow/borrowBook', 68 | method: 'post', 69 | params: { 70 | userid, 71 | bookid 72 | } 73 | }) 74 | } 75 | 76 | // 还书 77 | export function returnBook(borrowid, bookid) { 78 | return request({ 79 | url: '/borrow/returnBook', 80 | method: 'post', 81 | params: { 82 | borrowid, 83 | bookid 84 | } 85 | }) 86 | } 87 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/api/table.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function getList(params) { 4 | return request({ 5 | url: '/vue-admin-template/table/list', 6 | method: 'get', 7 | params 8 | }) 9 | } 10 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/api/user.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 登录 4 | export function login(data) { 5 | return request({ 6 | url: '/user/login', 7 | method: 'post', 8 | data 9 | }) 10 | } 11 | 12 | // 获取用户信息 13 | export function getInfo(token) { 14 | return request({ 15 | url: '/user/info', 16 | method: 'get', 17 | params: { token } 18 | }) 19 | } 20 | 21 | // 登出 22 | export function logout(token) { 23 | return request({ 24 | url: '/user/logout', 25 | method: 'post', 26 | params: { token } 27 | }) 28 | } 29 | 30 | // 注册 31 | export function register(params) { 32 | return request({ 33 | url: '/user/register', 34 | method: 'post', 35 | params 36 | }) 37 | } 38 | 39 | // 修改密码 40 | export function alterPassword(params) { 41 | return request({ 42 | url: '/user/alterPassword', 43 | method: 'post', 44 | params 45 | }) 46 | } 47 | 48 | // 获取用户数量 49 | export function getCount() { 50 | return request({ 51 | url: '/user/getCount', 52 | method: 'get' 53 | }) 54 | } 55 | 56 | // 查询所有用户信息 57 | export function queryUsers() { 58 | return request({ 59 | url: '/user/queryUsers', 60 | method: 'get' 61 | }) 62 | } 63 | 64 | // 分页查询用户信息 65 | export function queryUsersByPage(params) { 66 | return request({ 67 | url: '/user/queryUsersByPage', 68 | method: 'get', 69 | params 70 | }) 71 | } 72 | 73 | // 添加用户信息 74 | export function addUser(data) { 75 | return request({ 76 | url: '/user/addUser', 77 | method: 'post', 78 | data 79 | }) 80 | } 81 | 82 | // 删除用户信息 83 | export function deleteUser(data) { 84 | return request({ 85 | url: '/user/deleteUser', 86 | method: 'delete', 87 | data 88 | }) 89 | } 90 | 91 | // 删除一些用户信息 92 | export function deleteUsers(data) { 93 | return request({ 94 | url: '/user/deleteUsers', 95 | method: 'delete', 96 | data 97 | }) 98 | } 99 | 100 | // 更新用户信息 101 | export function updateUser(data) { 102 | return request({ 103 | url: '/user/updateUser', 104 | method: 'put', 105 | data 106 | }) 107 | } 108 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/assets/404_images/404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/BookManagerVue-permission-control/src/assets/404_images/404.png -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/assets/404_images/404_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/BookManagerVue-permission-control/src/assets/404_images/404_cloud.png -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/components/Breadcrumb/index.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 65 | 66 | 79 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/components/Hamburger/index.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 32 | 33 | 45 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/components/Pagination/index.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 92 | 93 | 102 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/components/SvgIcon/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 47 | 48 | 63 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/directive/permission/index.js: -------------------------------------------------------------------------------- 1 | import permission from './permission' 2 | 3 | const install = function(Vue) { 4 | Vue.directive('permission', permission) 5 | } 6 | 7 | if (window.Vue) { 8 | window['permission'] = permission 9 | Vue.use(install); // eslint-disable-line 10 | } 11 | 12 | permission.install = install 13 | export default permission 14 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/directive/permission/permission.js: -------------------------------------------------------------------------------- 1 | import store from '@/store' 2 | 3 | function checkPermission(el, binding) { 4 | const { value } = binding 5 | const roles = store.getters && store.getters.roles 6 | 7 | if (value && value instanceof Array) { 8 | if (value.length > 0) { 9 | const permissionRoles = value 10 | 11 | const hasPermission = roles.some(role => { 12 | return permissionRoles.includes(role) 13 | }) 14 | 15 | if (!hasPermission) { 16 | el.parentNode && el.parentNode.removeChild(el) 17 | } 18 | } 19 | } else { 20 | throw new Error(`need roles! Like v-permission="['admin','editor']"`) 21 | } 22 | } 23 | 24 | export default { 25 | inserted(el, binding) { 26 | checkPermission(el, binding) 27 | }, 28 | update(el, binding) { 29 | checkPermission(el, binding) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/directive/waves/index.js: -------------------------------------------------------------------------------- 1 | import waves from './waves' 2 | 3 | const install = function(Vue) { 4 | Vue.directive('waves', waves) 5 | } 6 | 7 | if (window.Vue) { 8 | window.waves = waves 9 | Vue.use(install); // eslint-disable-line 10 | } 11 | 12 | waves.install = install 13 | export default waves 14 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/directive/waves/waves.css: -------------------------------------------------------------------------------- 1 | .waves-ripple { 2 | position: absolute; 3 | border-radius: 100%; 4 | background-color: rgba(0, 0, 0, 0.15); 5 | background-clip: padding-box; 6 | pointer-events: none; 7 | -webkit-user-select: none; 8 | -moz-user-select: none; 9 | -ms-user-select: none; 10 | user-select: none; 11 | -webkit-transform: scale(0); 12 | -ms-transform: scale(0); 13 | transform: scale(0); 14 | opacity: 1; 15 | } 16 | 17 | .waves-ripple.z-active { 18 | opacity: 0; 19 | -webkit-transform: scale(2); 20 | -ms-transform: scale(2); 21 | transform: scale(2); 22 | -webkit-transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out; 23 | transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out; 24 | transition: opacity 1.2s ease-out, transform 0.6s ease-out; 25 | transition: opacity 1.2s ease-out, transform 0.6s ease-out, -webkit-transform 0.6s ease-out; 26 | } -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/directive/waves/waves.js: -------------------------------------------------------------------------------- 1 | import './waves.css' 2 | 3 | const context = '@@wavesContext' 4 | 5 | function handleClick(el, binding) { 6 | function handle(e) { 7 | const customOpts = Object.assign({}, binding.value) 8 | const opts = Object.assign({ 9 | ele: el, // 波纹作用元素 10 | type: 'hit', // hit 点击位置扩散 center中心点扩展 11 | color: 'rgba(0, 0, 0, 0.15)' // 波纹颜色 12 | }, 13 | customOpts 14 | ) 15 | const target = opts.ele 16 | if (target) { 17 | target.style.position = 'relative' 18 | target.style.overflow = 'hidden' 19 | const rect = target.getBoundingClientRect() 20 | let ripple = target.querySelector('.waves-ripple') 21 | if (!ripple) { 22 | ripple = document.createElement('span') 23 | ripple.className = 'waves-ripple' 24 | ripple.style.height = ripple.style.width = Math.max(rect.width, rect.height) + 'px' 25 | target.appendChild(ripple) 26 | } else { 27 | ripple.className = 'waves-ripple' 28 | } 29 | switch (opts.type) { 30 | case 'center': 31 | ripple.style.top = rect.height / 2 - ripple.offsetHeight / 2 + 'px' 32 | ripple.style.left = rect.width / 2 - ripple.offsetWidth / 2 + 'px' 33 | break 34 | default: 35 | ripple.style.top = 36 | (e.pageY - rect.top - ripple.offsetHeight / 2 - document.documentElement.scrollTop || 37 | document.body.scrollTop) + 'px' 38 | ripple.style.left = 39 | (e.pageX - rect.left - ripple.offsetWidth / 2 - document.documentElement.scrollLeft || 40 | document.body.scrollLeft) + 'px' 41 | } 42 | ripple.style.backgroundColor = opts.color 43 | ripple.className = 'waves-ripple z-active' 44 | return false 45 | } 46 | } 47 | 48 | if (!el[context]) { 49 | el[context] = { 50 | removeHandle: handle 51 | } 52 | } else { 53 | el[context].removeHandle = handle 54 | } 55 | 56 | return handle 57 | } 58 | 59 | export default { 60 | bind(el, binding) { 61 | el.addEventListener('click', handleClick(el, binding), false) 62 | }, 63 | update(el, binding) { 64 | el.removeEventListener('click', el[context].removeHandle, false) 65 | el.addEventListener('click', handleClick(el, binding), false) 66 | }, 67 | unbind(el) { 68 | el.removeEventListener('click', el[context].removeHandle, false) 69 | el[context] = null 70 | delete el[context] 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/icons/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import SvgIcon from '@/components/SvgIcon'// svg component 3 | 4 | // register globally 5 | Vue.component('svg-icon', SvgIcon) 6 | 7 | const req = require.context('./svg', false, /\.svg$/) 8 | const requireAll = requireContext => requireContext.keys().map(requireContext) 9 | requireAll(req) 10 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/icons/svg/dashboard.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/icons/svg/example.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/icons/svg/eye-open.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/icons/svg/eye.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/icons/svg/form.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/icons/svg/link.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/icons/svg/nested.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/icons/svg/password.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/icons/svg/table.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/icons/svg/tree.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/icons/svg/user.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /BookManagerVue-permission-control/src/icons/svgo.yml: -------------------------------------------------------------------------------- 1 | # replace default config 2 | 3 | # multipass: true 4 | # full: true 5 | 6 | plugins: 7 | 8 | # - name 9 | # 10 | # or: 11 | # - name: false 12 | # - name: true 13 | # 14 | # or: 15 | # - name: 16 | # param1: 1 17 | # param2: 2 18 | 19 | - removeAttrs: 20 | attrs: 21 | - 'fill' 22 | - 'fill-rule' 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | **完整代码收费 加qq 931708230 或者加微信 ynwwxid** 2 | 3 | **接毕业设计和论文** 4 | 5 | **博客地址:[https://blog.csdn.net/2303_76227485/article/details/128651214](https://blog.csdn.net/2303_76227485/article/details/128651214)** 6 | 7 | **视频演示:[https://space.bilibili.com/384537280](https://space.bilibili.com/384537280)** 8 | 9 | **毕业设计所有选题地址:[https://github.com/ynwynw/allProject](https://github.com/ynwynw/allProject)** 10 | 11 | ## springboot+vue的图书管理系统项目(源代码+数据库) 12 | 13 | ## 一、系统介绍 14 | 15 | 本项目前后端分离 16 | 17 | - 前台功能:图书查询、图书借阅、图书归还、登录注册、修改密码 18 | - 后台功能-管理员登录:图书管理、借阅信息管理、图书类型管理、用户管理 19 | 20 | ## 二、所用技术 21 | 22 | - 后端使用Java+SpringBoot+MyBatis+MySQL 23 | 24 | 前端使用Vue+Axios+Element UI 25 | 26 | 27 | ## 三、环境介绍 28 | 29 | 基础环境 :IDEA/eclipse, JDK 1.8, Mysql5.7及以上,Node.js,Maven 30 | 31 | 所有项目以及源代码本人均调试运行无问题 可支持远程调试运行 32 | 33 | ## 四、页面截图 34 | 35 | ![contents](./picture/picture1.png) 36 | 37 | ![contents](./picture/picture2.png) 38 | 39 | ![contents](./picture/picture3.png) 40 | 41 | ![contents](./picture/picture4.png) 42 | 43 | ![contents](./picture/picture5.png) 44 | 45 | ![contents](./picture/picture6.png) 46 | 47 | ![contents](./picture/picture7.png) 48 | 49 | ![contents](./picture/picture8.png) 50 | 51 | ![contents](./picture/picture9.png) 52 | 53 | ### 数据库结构 54 | 55 | ![Diagram 1](./picture/picture10.jpg) 56 | 57 | ## 五、浏览地址 58 | 59 | 项目演示地址:http://localhost:8092/BookManager/ 60 | 61 | 管理员账号`admin`,密码`admin` 62 | 63 | 读者账号`wangpeng`,密码`123456` 64 | 65 | ## 六、安装教程 66 | 67 | 1. 数据库导入,新建数据库BookManager,将BookManager2-master文件夹下的`book_manager.sql`文件运行。 68 | 2. 使用IDEA/Eclipse导入项目,请选择maven;导入成功后请执行maven clean;maven install命令,然后运行; 69 | 3. 打开项目,打开`src/main/resources/application.properties`,修改数据库和Redis的配置文件。 70 | 4. 启动项目后端项目 71 | 5. vscode打开BookManagerVue-permission-control项目。 72 | 6. 打开终端,执行npm install 依赖下载完成后执行 npm run dev,执行成功后会显示访问地址 73 | 74 | 对应的后端文件夹如下:BookManager 75 | 76 | 对应的前端文件夹如下:BookManagerVue-permission-control 77 | 78 | **需要完整代码可以加qq 931708230 或者加微信 ynwwxid** 79 | 80 | **需要完整代码可以加qq 931708230 或者加微信 ynwwxid** 81 | -------------------------------------------------------------------------------- /picture/picture1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/picture/picture1.png -------------------------------------------------------------------------------- /picture/picture10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/picture/picture10.jpg -------------------------------------------------------------------------------- /picture/picture2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/picture/picture2.png -------------------------------------------------------------------------------- /picture/picture3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/picture/picture3.png -------------------------------------------------------------------------------- /picture/picture4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/picture/picture4.png -------------------------------------------------------------------------------- /picture/picture5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/picture/picture5.png -------------------------------------------------------------------------------- /picture/picture6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/picture/picture6.png -------------------------------------------------------------------------------- /picture/picture7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/picture/picture7.png -------------------------------------------------------------------------------- /picture/picture8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/picture/picture8.png -------------------------------------------------------------------------------- /picture/picture9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ynwynw/bookManage-public/31e2cbc981308270e28b62e72742a55a2e0fd1c5/picture/picture9.png --------------------------------------------------------------------------------