├── .mvn └── wrapper │ ├── maven-wrapper.jar │ ├── maven-wrapper.properties │ └── MavenWrapperDownloader.java ├── src ├── main │ ├── resources │ │ ├── favicon.ico │ │ ├── static │ │ │ ├── favicon.ico │ │ │ ├── img │ │ │ │ ├── sdau.png │ │ │ │ ├── register.png │ │ │ │ └── touxiang.jpg │ │ │ ├── assets │ │ │ │ └── video.mp4 │ │ │ ├── plugins │ │ │ │ ├── elementui │ │ │ │ │ └── fonts │ │ │ │ │ │ └── element-icons.woff │ │ │ │ └── font-awesome │ │ │ │ │ └── fonts │ │ │ │ │ ├── FontAwesome.otf │ │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ │ ├── fontawesome-webfont.woff2 │ │ │ │ │ └── fontawesome-webfont(1).eot │ │ │ ├── error │ │ │ │ └── 404.html │ │ │ ├── pages │ │ │ │ ├── upload.html │ │ │ │ ├── echarts_user.html │ │ │ │ ├── map.html │ │ │ │ ├── Echars.html │ │ │ │ ├── classinfo.html │ │ │ │ ├── collect_admin.html │ │ │ │ └── lend_user_beifen.html │ │ │ └── css │ │ │ │ ├── login(1).css │ │ │ │ ├── verify.css │ │ │ │ └── orderset.css │ │ ├── mapper │ │ │ ├── ClassMapper.xml │ │ │ ├── UserMapper.xml │ │ │ ├── LendMapper.xml │ │ │ ├── CollectMapper.xml │ │ │ └── BookMapper.xml │ │ ├── log4j.properties │ │ ├── banner.txt │ │ └── application.properties │ └── java │ │ └── com │ │ └── ding │ │ └── books │ │ ├── model │ │ ├── dto │ │ │ ├── LoginRequest.java │ │ │ ├── Updatepwd.java │ │ │ ├── ClassBook.java │ │ │ ├── AddUserRequest.java │ │ │ ├── RegisterRequest.java │ │ │ ├── AddBook.java │ │ │ ├── QueryPageBeanUsername.java │ │ │ ├── EditUserRequest.java │ │ │ ├── EditBook.java │ │ │ ├── CollectBook.java │ │ │ └── LendBook.java │ │ ├── entity │ │ │ ├── UserInfo.java │ │ │ ├── Echars.java │ │ │ ├── ClassInfo.java │ │ │ ├── Book.java │ │ │ ├── Admin.java │ │ │ ├── LendRecord.java │ │ │ ├── CollectRecord.java │ │ │ └── User.java │ │ └── vo │ │ │ ├── User1.java │ │ │ ├── ExcelUser.java │ │ │ ├── ExcelClass.java │ │ │ ├── ExcelBook.java │ │ │ ├── ExcelCollect.java │ │ │ └── ExcelLend.java │ │ ├── utils │ │ ├── PageResult.java │ │ ├── JSONUtils.java │ │ ├── QueryPageBean.java │ │ ├── CommonUtils.java │ │ ├── Result.java │ │ ├── JWTUtils.java │ │ ├── MessageConstant.java │ │ ├── QqHttpClient.java │ │ └── ExcelUtils.java │ │ ├── exception │ │ ├── MyException.java │ │ └── CustomExtHandler.java │ │ ├── service │ │ ├── ClassService.java │ │ ├── CollectService.java │ │ ├── LendService.java │ │ ├── UserService.java │ │ ├── BookService.java │ │ ├── impl │ │ │ ├── ClassServiceImpl.java │ │ │ ├── BookServiceImpl.java │ │ │ ├── CollectServiceImpl.java │ │ │ ├── UserServiceImpl.java │ │ │ └── LendServiceImpl.java │ │ └── CustomUserDetailsService.java.bak │ │ ├── BooksApplication.java │ │ ├── mapper │ │ ├── ClassMapper.java │ │ ├── UserMapper.java │ │ ├── BookMapper.java │ │ ├── LendMapper.java │ │ └── CollectMapper.java │ │ ├── config │ │ ├── InterceptorConfig.java │ │ └── WebSecurityConfig.java.bak │ │ ├── controller │ │ ├── UploadController.java │ │ ├── ClassController.java │ │ ├── CollectController.java │ │ ├── TestController.java │ │ ├── LendController.java │ │ ├── LoginController.java │ │ ├── BookController.java │ │ └── UserController.java │ │ └── interceptor │ │ └── LoginInterceptor.java └── test │ └── java │ └── com │ └── ding │ └── books │ └── BooksApplicationTests.java ├── 系统说明.assets ├── image-20211225203928736.png ├── image-20211225204042263.png ├── image-20211225205030977.png ├── image-20211225205228978.png ├── image-20211225215952758.png ├── image-20211225220310001.png ├── image-20211225220541968.png ├── image-20211225221402963.png ├── image-20211225221513647.png ├── image-20211225221543773.png ├── image-20211225221644131.png ├── image-20211225221749201.png ├── image-20211225221821391.png ├── image-20211225222014890.png ├── image-20211225222113198.png ├── image-20211225222322669.png ├── image-20211225222420033.png ├── image-20211225222601594.png ├── image-20211225222703411.png ├── image-20211225222735878.png ├── image-20211225222802178.png ├── image-20211225232231713.png ├── image-20211225232449604.png ├── image-20211225232647729.png ├── image-20211225232744619.png ├── image-20211225232830362.png ├── image-20211225233007676.png ├── image-20211225233033811.png ├── image-20211225233244396.png ├── image-20211225233347318.png ├── image-20211225233645710.png ├── image-20211225233841756.png └── image-20211225234229246.png ├── .gitignore ├── pom.xml ├── README.md └── mvnw.cmd /.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /src/main/resources/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/src/main/resources/favicon.ico -------------------------------------------------------------------------------- /src/main/resources/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/src/main/resources/static/favicon.ico -------------------------------------------------------------------------------- /src/main/resources/static/img/sdau.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/src/main/resources/static/img/sdau.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225203928736.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225203928736.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225204042263.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225204042263.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225205030977.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225205030977.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225205228978.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225205228978.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225215952758.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225215952758.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225220310001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225220310001.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225220541968.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225220541968.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225221402963.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225221402963.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225221513647.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225221513647.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225221543773.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225221543773.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225221644131.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225221644131.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225221749201.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225221749201.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225221821391.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225221821391.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225222014890.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225222014890.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225222113198.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225222113198.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225222322669.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225222322669.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225222420033.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225222420033.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225222601594.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225222601594.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225222703411.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225222703411.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225222735878.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225222735878.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225222802178.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225222802178.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225232231713.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225232231713.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225232449604.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225232449604.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225232647729.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225232647729.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225232744619.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225232744619.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225232830362.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225232830362.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225233007676.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225233007676.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225233033811.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225233033811.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225233244396.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225233244396.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225233347318.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225233347318.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225233645710.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225233645710.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225233841756.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225233841756.png -------------------------------------------------------------------------------- /系统说明.assets/image-20211225234229246.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/系统说明.assets/image-20211225234229246.png -------------------------------------------------------------------------------- /src/main/resources/static/assets/video.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/src/main/resources/static/assets/video.mp4 -------------------------------------------------------------------------------- /src/main/resources/static/img/register.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/src/main/resources/static/img/register.png -------------------------------------------------------------------------------- /src/main/resources/static/img/touxiang.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/src/main/resources/static/img/touxiang.jpg -------------------------------------------------------------------------------- /src/main/resources/static/plugins/elementui/fonts/element-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/src/main/resources/static/plugins/elementui/fonts/element-icons.woff -------------------------------------------------------------------------------- /src/main/resources/static/plugins/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/src/main/resources/static/plugins/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /src/main/resources/static/plugins/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/src/main/resources/static/plugins/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/main/resources/static/plugins/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/src/main/resources/static/plugins/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/main/resources/static/plugins/font-awesome/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/src/main/resources/static/plugins/font-awesome/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/plugins/font-awesome/fonts/fontawesome-webfont(1).eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffDing99/books/HEAD/src/main/resources/static/plugins/font-awesome/fonts/fontawesome-webfont(1).eot -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/dto/LoginRequest.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.dto; 2 | 3 | 4 | import lombok.Data; 5 | 6 | @Data 7 | public class LoginRequest { 8 | 9 | private String username; 10 | private String password; 11 | } 12 | -------------------------------------------------------------------------------- /src/main/resources/static/error/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 错误 7 | 8 | 9 |

访问页面不存在 10 | 联系管理员

11 | 12 | 13 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/entity/UserInfo.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.entity; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @Description TODO 7 | * @Author 丁帅帅 8 | * @Date 21/12/14 17:01 9 | * @Version 1.0 10 | */ 11 | @Data 12 | public class UserInfo { 13 | private int id; 14 | private String username; 15 | private String password; 16 | private String role; 17 | } 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/entity/Echars.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.entity; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @Description TODO 9 | * @Author 丁帅帅 10 | * @Date 21/12/25 00:15 11 | * @Version 1.0 12 | */ 13 | @Data 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class Echars { 17 | 18 | private String name; 19 | private Integer num; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/vo/User1.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.vo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @Description TODO 9 | * @Author 丁帅帅 10 | * @Date 21/12/19 00:27 11 | * @Version 1.0 12 | */ 13 | 14 | @Data 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | public class User1 { 18 | private String name; 19 | private String name1; 20 | private String name2; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/utils/PageResult.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.utils; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.io.Serializable; 8 | import java.util.List; 9 | 10 | /** 11 | * 分页结果封装对象 12 | */ 13 | 14 | @Data 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | public class PageResult implements Serializable{ 18 | private Long total;//总记录数 19 | private List rows;//当前页结果 20 | 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/dto/Updatepwd.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @Description TODO 9 | * @Author 丁帅帅 10 | * @Date 21/12/24 08:28 11 | * @Version 1.0 12 | */ 13 | @Data 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class Updatepwd { 17 | 18 | private String username; 19 | private String oldpwd; 20 | private String newpwd; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/dto/ClassBook.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @Description TODO 9 | * @Author 丁帅帅 10 | * @Date 21/12/23 09:30 11 | * @Version 1.0 12 | */ 13 | @Data 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class ClassBook { 17 | 18 | private Integer id; 19 | private Integer classid; 20 | private String classname; 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/exception/MyException.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.exception; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @Description 自定义异常类 9 | * @Author 丁帅帅 10 | * @Date 21/12/24 08:15 11 | * @Version 1.0 12 | */ 13 | @Data 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class MyException extends RuntimeException{ 17 | 18 | private boolean flag;//执行结果,true为执行成功 false为执行失败 19 | private String message;//返回结果信息 20 | 21 | 22 | } 23 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/vo/ExcelUser.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.vo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @Description TODO 9 | * @Author 丁帅帅 10 | * @Date 21/12/19 10:25 11 | * @Version 1.0 12 | */ 13 | @Data 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class ExcelUser { 17 | 18 | private Integer id; 19 | private String username; 20 | private String sex; 21 | private String phone; 22 | private String city; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/vo/ExcelClass.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.vo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.io.Serializable; 8 | 9 | /** 10 | * @Description TODO 11 | * @Author 丁帅帅 12 | * @Date 21/12/21 20:42 13 | * @Version 1.0 14 | */ 15 | @Data 16 | @NoArgsConstructor 17 | @AllArgsConstructor 18 | public class ExcelClass implements Serializable { 19 | 20 | private Integer id; 21 | private Integer classid; 22 | private String classname; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/dto/AddUserRequest.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @Description TODO 9 | * @Author 丁帅帅 10 | * @Date 21/12/11 18:48 11 | * @Version 1.0 12 | */ 13 | @Data 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class AddUserRequest { 17 | 18 | private String username; 19 | private String password; 20 | private String sex; 21 | private String phone; 22 | private String city; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/dto/RegisterRequest.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @Description TODO 9 | * @Author 丁帅帅 10 | * @Date 21/12/18 00:01 11 | * @Version 1.0 12 | */ 13 | @Data 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class RegisterRequest { 17 | 18 | private String username; 19 | private String password; 20 | private String sex; 21 | private String phone; 22 | private String city; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/service/ClassService.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.service; 2 | 3 | import com.ding.books.model.entity.ClassInfo; 4 | import com.ding.books.utils.PageResult; 5 | import com.ding.books.utils.QueryPageBean; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * @Description TODO 12 | * @Author 丁帅帅 13 | * @Date 21/12/23 09:22 14 | * @Version 1.0 15 | */ 16 | @Service 17 | public interface ClassService { 18 | PageResult pageQuery(QueryPageBean queryPageBean); 19 | 20 | List findAll(); 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/dto/AddBook.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @Description TODO 9 | * @Author 丁帅帅 10 | * @Date 21/12/17 11:21 11 | * @Version 1.0 12 | */ 13 | @Data 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class AddBook { 17 | private String bookname; 18 | private String author; 19 | private String publish; 20 | private String introduction; 21 | private Integer classid; 22 | private Integer number; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/dto/QueryPageBeanUsername.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.io.Serializable; 8 | 9 | /** 10 | * 封装查询条件 11 | */ 12 | @Data 13 | @NoArgsConstructor 14 | @AllArgsConstructor 15 | public class QueryPageBeanUsername implements Serializable{ 16 | private Integer currentPage;//页码 17 | private Integer pageSize;//每页记录数 18 | //private String queryString;//查询条件 19 | private String bookname; 20 | private String username; 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/dto/EditUserRequest.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @Description TODO 9 | * @Author 丁帅帅 10 | * @Date 21/12/18 23:37 11 | * @Version 1.0 12 | */ 13 | @Data 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class EditUserRequest { 17 | 18 | private Integer id; 19 | private String username; 20 | private String password; 21 | private String sex; 22 | private String phone; 23 | private String city; 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/utils/JSONUtils.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.utils; 2 | 3 | import com.alibaba.fastjson.JSONObject; 4 | 5 | /** 6 | * @Description TODO 7 | * @Author 丁帅帅 8 | * @Date 21/11/21 09:58 9 | * @Version 1.0 10 | */ 11 | public class JSONUtils { 12 | /** 13 | * 转换json对象 14 | */ 15 | public static JSONObject parseJSONP(String jsonp) { 16 | int startIndex = jsonp.indexOf("("); 17 | int endIndex = jsonp.lastIndexOf(")"); 18 | String json = jsonp.substring(startIndex + 1, endIndex); 19 | return JSONObject.parseObject(json); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/BooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.ding.books; 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 | @MapperScan("com.ding.books.mapper") 9 | 10 | @SpringBootApplication 11 | @EnableTransactionManagement 12 | public class BooksApplication { 13 | 14 | public static void main(String[] args) { 15 | SpringApplication.run(BooksApplication.class, args); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/dto/EditBook.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @Description TODO 9 | * @Author 丁帅帅 10 | * @Date 21/12/17 15:19 11 | * @Version 1.0 12 | */ 13 | @Data 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class EditBook { 17 | private Integer bookid; 18 | private String bookname; 19 | private String author; 20 | private String publish; 21 | private String introduction; 22 | private Integer classid; 23 | private Integer number; 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/vo/ExcelBook.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.vo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @Description TODO 9 | * @Author 丁帅帅 10 | * @Date 21/12/19 15:54 11 | * @Version 1.0 12 | */ 13 | @Data 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class ExcelBook { 17 | private Integer bookid; 18 | private String bookname; 19 | private String author; 20 | private String publish; 21 | private String introduction; 22 | private Integer classid; 23 | private Integer number; 24 | } 25 | -------------------------------------------------------------------------------- /src/main/resources/mapper/ClassMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/mapper/ClassMapper.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.ding.books.model.dto.ClassBook; 5 | import com.ding.books.model.entity.ClassInfo; 6 | import com.github.pagehelper.Page; 7 | import org.apache.ibatis.annotations.Mapper; 8 | import org.springframework.stereotype.Repository; 9 | 10 | /** 11 | * @Description TODO 12 | * @Author 丁帅帅 13 | * @Date 21/12/23 09:24 14 | * @Version 1.0 15 | */ 16 | @Mapper 17 | @Repository 18 | public interface ClassMapper extends BaseMapper { 19 | Page selectByCondition(String queryString); 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/dto/CollectBook.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.io.Serializable; 8 | import java.util.Date; 9 | 10 | /** 11 | * @Description TODO 12 | * @Author 丁帅帅 13 | * @Date 21/12/22 16:50 14 | * @Version 1.0 15 | */ 16 | 17 | @Data 18 | @NoArgsConstructor 19 | @AllArgsConstructor 20 | public class CollectBook implements Serializable { 21 | 22 | private Integer collectid; 23 | private Integer bookid; 24 | private String bookname; 25 | private String username; 26 | private Date lenddate; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/entity/ClassInfo.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Data; 8 | import lombok.NoArgsConstructor; 9 | 10 | /** 11 | * @Description 图书类别号 12 | * @Author 丁帅帅 13 | * @Date 21/12/23 09:13 14 | * @Version 1.0 15 | */ 16 | @Data 17 | @NoArgsConstructor 18 | @AllArgsConstructor 19 | @TableName("ClassInfo") 20 | public class ClassInfo { 21 | 22 | @TableId(type = IdType.AUTO) 23 | private Integer id; 24 | private Integer classid; 25 | private String classname; 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/entity/Book.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.io.Serializable; 10 | 11 | 12 | @Data 13 | @NoArgsConstructor 14 | @AllArgsConstructor 15 | public class Book implements Serializable { 16 | @TableId(type = IdType.AUTO) 17 | private Integer bookid; 18 | private String bookname; 19 | private String author; 20 | private String publish; 21 | private String introduction; 22 | private Integer classid; 23 | private Integer number; 24 | private String bookimg; 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/vo/ExcelCollect.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.vo; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.io.Serializable; 9 | import java.util.Date; 10 | 11 | /** 12 | * @Description TODO 13 | * @Author 丁帅帅 14 | * @Date 21/12/21 20:42 15 | * @Version 1.0 16 | */ 17 | @Data 18 | @NoArgsConstructor 19 | @AllArgsConstructor 20 | public class ExcelCollect implements Serializable { 21 | 22 | private Integer collectid; 23 | private Integer bookid; 24 | private Integer userid; 25 | @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") 26 | private Date lenddate; 27 | 28 | 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/mapper/UserMapper.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.mapper; 2 | 3 | 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import com.ding.books.model.entity.User; 6 | import com.github.pagehelper.Page; 7 | import org.apache.ibatis.annotations.Mapper; 8 | import org.apache.ibatis.annotations.Param; 9 | import org.springframework.stereotype.Repository; 10 | 11 | @Repository 12 | @Mapper 13 | public interface UserMapper extends BaseMapper { 14 | 15 | Page selectByCondition(String queryString); 16 | 17 | User findByPhoneAndPwd(String username, String password); 18 | 19 | int findByUsername(String username); 20 | 21 | User queryAllByUsername(String username); 22 | 23 | User findByOpenid(@Param("openid") String openid); 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/entity/Admin.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.entity; 2 | 3 | public class Admin { 4 | 5 | private long admin_id; 6 | private String username; 7 | private String password; 8 | 9 | 10 | public long getAdminId() { 11 | return admin_id; 12 | } 13 | 14 | public void setAdminId(long admin_id) { 15 | this.admin_id = admin_id; 16 | } 17 | 18 | public String getPassword() { 19 | return password; 20 | } 21 | 22 | public void setPassword(String password) { 23 | this.password = password; 24 | } 25 | 26 | public String getUsername() { 27 | return username; 28 | } 29 | 30 | public void setUsername(String username) { 31 | this.username = username; 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/mapper/BookMapper.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.ding.books.model.entity.Book; 5 | import com.github.pagehelper.Page; 6 | import org.apache.ibatis.annotations.Mapper; 7 | import org.springframework.stereotype.Repository; 8 | 9 | import java.util.List; 10 | 11 | 12 | @Mapper 13 | @Repository 14 | public interface BookMapper extends BaseMapper { 15 | 16 | 17 | Page selectByCondition( String queryString); 18 | //int addBook(AddBook addBook); 19 | 20 | //long findCountByBook(Integer id); 21 | 22 | void deleteById(Integer id); 23 | 24 | 25 | //void edit(Book book); 26 | 27 | //Book findById(Integer id); 28 | 29 | List findAllLimit(); 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/entity/LendRecord.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Data; 8 | import lombok.NoArgsConstructor; 9 | 10 | import java.io.Serializable; 11 | import java.util.Date; 12 | @Data 13 | @NoArgsConstructor 14 | @AllArgsConstructor 15 | @TableName("lendrecord") 16 | public class LendRecord implements Serializable { 17 | 18 | @TableId(type = IdType.AUTO) 19 | private Integer lendid; 20 | private Integer bookid; 21 | private Integer userid; 22 | private Date lenddate; 23 | private Date backdate; 24 | private Integer number; 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/vo/ExcelLend.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.vo; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.io.Serializable; 9 | import java.util.Date; 10 | 11 | /** 12 | * @Description TODO 13 | * @Author 丁帅帅 14 | * @Date 21/12/21 20:42 15 | * @Version 1.0 16 | */ 17 | @Data 18 | @NoArgsConstructor 19 | @AllArgsConstructor 20 | public class ExcelLend implements Serializable { 21 | 22 | private Integer lendid; 23 | private Integer bookid; 24 | private Integer userid; 25 | @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") 26 | private Date lenddate; 27 | @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") 28 | private Date backdate; 29 | private Integer number; 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/entity/CollectRecord.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Data; 8 | import lombok.NoArgsConstructor; 9 | 10 | import java.io.Serializable; 11 | import java.util.Date; 12 | 13 | /** 14 | * @Description 收藏表 15 | * @Author 丁帅帅 16 | * @Date 21/12/22 16:38 17 | * @Version 1.0 18 | */ 19 | @Data 20 | @NoArgsConstructor 21 | @AllArgsConstructor 22 | @TableName("collectrecord") 23 | public class CollectRecord implements Serializable { 24 | 25 | @TableId(type = IdType.AUTO) 26 | private Integer collectid; 27 | private Integer bookid; 28 | private Integer userid; 29 | private Date lenddate; 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/mapper/LendMapper.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.ding.books.model.dto.LendBook; 5 | import com.ding.books.model.entity.LendRecord; 6 | import com.github.pagehelper.Page; 7 | import org.apache.ibatis.annotations.Mapper; 8 | import org.apache.ibatis.annotations.Param; 9 | import org.springframework.stereotype.Repository; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | * @Description TODO 15 | * @Author 丁帅帅 16 | * @Date 21/12/19 17:44 17 | * @Version 1.0 18 | */ 19 | 20 | @Mapper 21 | @Repository 22 | public interface LendMapper extends BaseMapper { 23 | 24 | Page selectByCondition(String queryString); 25 | 26 | Page selectByConditionUser(@Param("id") Integer id,@Param("bookname") String bookname); 27 | 28 | List findLendByBookid(@Param("bookid") Integer bookid); 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/utils/QueryPageBean.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.utils; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * 封装查询条件 7 | */ 8 | public class QueryPageBean implements Serializable{ 9 | private Integer currentPage;//页码 10 | private Integer pageSize;//每页记录数 11 | private String queryString;//查询条件 12 | 13 | public Integer getCurrentPage() { 14 | return currentPage; 15 | } 16 | 17 | public void setCurrentPage(Integer currentPage) { 18 | this.currentPage = currentPage; 19 | } 20 | 21 | public Integer getPageSize() { 22 | return pageSize; 23 | } 24 | 25 | public void setPageSize(Integer pageSize) { 26 | this.pageSize = pageSize; 27 | } 28 | 29 | public String getQueryString() { 30 | return queryString; 31 | } 32 | 33 | public void setQueryString(String queryString) { 34 | this.queryString = queryString; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/service/CollectService.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.service; 2 | 3 | import com.ding.books.model.dto.QueryPageBeanUsername; 4 | import com.ding.books.model.entity.CollectRecord; 5 | import com.ding.books.utils.PageResult; 6 | import com.ding.books.utils.QueryPageBean; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * @Description TODO 13 | * @Author 丁帅帅 14 | * @Date 21/12/22 17:07 15 | * @Version 1.0 16 | */ 17 | 18 | @Service 19 | public interface CollectService { 20 | PageResult pageQueryUser(QueryPageBeanUsername queryPageBean); 21 | 22 | PageResult pageQuery(QueryPageBean queryPageBean); 23 | 24 | void deleteCollect(Integer collectid); 25 | 26 | 27 | 28 | List findAll(); 29 | 30 | void addCollectBook(Integer bookid, Integer id); 31 | 32 | List findCollectBookByBookidandUsrid(Integer bookid, Integer id); 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/service/LendService.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.service; 2 | 3 | import com.ding.books.model.dto.QueryPageBeanUsername; 4 | import com.ding.books.model.entity.LendRecord; 5 | import com.ding.books.utils.PageResult; 6 | import com.ding.books.utils.QueryPageBean; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * @Description TODO 13 | * @Author 丁帅帅 14 | * @Date 21/12/19 17:48 15 | * @Version 1.0 16 | */ 17 | @Service 18 | public interface LendService { 19 | PageResult pageQuery(QueryPageBean queryPageBean); 20 | 21 | void deleteLend(Integer lendid); 22 | 23 | LendRecord findLendById(Integer lendid); 24 | 25 | void back(Integer lendid); 26 | 27 | List findAll(); 28 | 29 | PageResult pageQueryUser(QueryPageBeanUsername queryPageBean); 30 | 31 | int addLendRecord(Integer bookid,Integer userid); 32 | 33 | List findLendByBookid(Integer bookid); 34 | } 35 | -------------------------------------------------------------------------------- /src/test/java/com/ding/books/BooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.ding.books; 2 | 3 | import cn.hutool.core.date.DateTime; 4 | import cn.hutool.core.date.DateUtil; 5 | import org.junit.jupiter.api.Test; 6 | import org.springframework.boot.test.context.SpringBootTest; 7 | 8 | import java.util.Date; 9 | 10 | @SpringBootTest 11 | class BooksApplicationTests { 12 | 13 | @Test 14 | void contextLoads() { 15 | } 16 | 17 | @Test 18 | void testdate(){ 19 | Date date = new Date(); 20 | String format = DateUtil.format(date, "yyyy/MM/dd"); 21 | System.out.println(format); 22 | 23 | String formatDate = DateUtil.formatDate(date); 24 | 25 | String formatDateTime = DateUtil.formatDateTime(date); 26 | 27 | DateTime newDate3 = DateUtil.offsetHour(date, -3); 28 | 29 | System.out.println(newDate3); 30 | 31 | DateTime dateTime = DateUtil.offsetMonth(date, 1); 32 | System.out.println(dateTime); 33 | } 34 | 35 | 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/mapper/CollectMapper.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.ding.books.model.dto.CollectBook; 5 | import com.ding.books.model.entity.CollectRecord; 6 | import com.github.pagehelper.Page; 7 | import org.apache.ibatis.annotations.Mapper; 8 | import org.apache.ibatis.annotations.Param; 9 | import org.springframework.stereotype.Repository; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | * @Description TODO 15 | * @Author 丁帅帅 16 | * @Date 21/12/22 16:40 17 | * @Version 1.0 18 | */ 19 | 20 | @Mapper 21 | @Repository 22 | public interface CollectMapper extends BaseMapper { 23 | 24 | Page selectByCondition(String queryString); 25 | 26 | Page selectByConditionUser(@Param("id") Integer id, @Param("bookname") String bookname); 27 | 28 | 29 | List findCollectBookByBookidandUsrid(@Param("bookid") Integer bookid,@Param("userid") Integer userid); 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/utils/CommonUtils.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.utils; 2 | 3 | import cn.hutool.crypto.SecureUtil; 4 | import sun.misc.BASE64Decoder; 5 | 6 | import java.io.IOException; 7 | import java.security.MessageDigest; 8 | import java.security.Security; 9 | 10 | /** 11 | * 工具类 12 | */ 13 | public class CommonUtils { 14 | 15 | 16 | /** 17 | * MD5加密工具类 18 | * @param data 19 | * @return 20 | */ 21 | public static String MD5(String data) { 22 | try { 23 | MessageDigest md = MessageDigest.getInstance("MD5"); 24 | byte[] array = md.digest(data.getBytes("UTF-8")); 25 | StringBuilder sb = new StringBuilder(); 26 | for (byte item : array) { 27 | sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3)); 28 | } 29 | 30 | return sb.toString().toUpperCase(); 31 | } catch (Exception exception) { 32 | } 33 | return null; 34 | 35 | } 36 | 37 | 38 | 39 | 40 | 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.service; 2 | 3 | import com.ding.books.model.dto.AddUserRequest; 4 | import com.ding.books.model.dto.EditUserRequest; 5 | import com.ding.books.model.entity.User; 6 | import com.ding.books.utils.PageResult; 7 | import com.ding.books.utils.QueryPageBean; 8 | import org.springframework.stereotype.Service; 9 | 10 | import java.util.List; 11 | 12 | /** 13 | * @Description TODO 14 | * @Author 丁帅帅 15 | * @Date 21/12/11 16:23 16 | * @Version 1.0 17 | */ 18 | @Service 19 | public interface UserService { 20 | int addUser(AddUserRequest user); 21 | 22 | int deleteUser(Integer id); 23 | 24 | int UpdateUser(EditUserRequest user); 25 | 26 | User findOneUser(Integer id); 27 | 28 | PageResult pageQuery(QueryPageBean queryPageBean); 29 | 30 | List findAll(); 31 | 32 | String findByPhoneAndPwd(String username, String password); 33 | 34 | Integer findByUsername(String username); 35 | 36 | User queryAllByUsername(String username); 37 | 38 | int addQQUser(User user); 39 | 40 | User findByOpenid(String openId); 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/service/BookService.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.service; 2 | 3 | import com.ding.books.model.dto.AddBook; 4 | import com.ding.books.model.dto.EditBook; 5 | import com.ding.books.model.entity.Book; 6 | import com.ding.books.utils.PageResult; 7 | import com.ding.books.utils.QueryPageBean; 8 | import org.springframework.stereotype.Service; 9 | import org.springframework.transaction.annotation.Transactional; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | * @Description TODO 15 | * @Author 丁帅帅 16 | * @Date 21/12/09 23:25 17 | * @Version 1.0 18 | */ 19 | //@Transactional(readOnly = true) 20 | @Transactional 21 | @Service 22 | public interface BookService { 23 | 24 | PageResult pageQuery(QueryPageBean queryPageBean); 25 | 26 | void deleteById(Integer id); 27 | 28 | 29 | // Book findById(Integer id); 30 | 31 | 32 | // @Transactional(readOnly = false) 33 | int addBook(AddBook addBook); 34 | 35 | Book findBookById(Integer bookid); 36 | 37 | void lendBook(Integer bookid); 38 | 39 | void edit(EditBook editBook); 40 | 41 | List findAll(); 42 | 43 | List findAllLimit(); 44 | 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/utils/Result.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.utils; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * 封装返回结果 7 | */ 8 | public class Result implements Serializable{ 9 | private boolean flag;//执行结果,true为执行成功 false为执行失败 10 | private String message;//返回结果信息 11 | private Object data;//返回数据 12 | public Result(boolean flag, String message) { 13 | super(); 14 | this.flag = flag; 15 | this.message = message; 16 | } 17 | 18 | public Result(boolean flag, String message, Object data) { 19 | this.flag = flag; 20 | this.message = message; 21 | this.data = data; 22 | } 23 | 24 | public boolean isFlag() { 25 | return flag; 26 | } 27 | public void setFlag(boolean flag) { 28 | this.flag = flag; 29 | } 30 | public String getMessage() { 31 | return message; 32 | } 33 | public void setMessage(String message) { 34 | this.message = message; 35 | } 36 | 37 | public Object getData() { 38 | return data; 39 | } 40 | 41 | public void setData(Object data) { 42 | this.data = data; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/config/InterceptorConfig.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.config; 2 | 3 | import com.ding.books.interceptor.LoginInterceptor; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 7 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 8 | 9 | /** 10 | * 拦截器配置 11 | */ 12 | 13 | @Configuration 14 | public class InterceptorConfig implements WebMvcConfigurer { 15 | 16 | @Bean 17 | LoginInterceptor loginInterceptor(){ 18 | return new LoginInterceptor(); 19 | } 20 | 21 | @Override 22 | public void addInterceptors(InterceptorRegistry registry) { 23 | 24 | 25 | 26 | registry.addInterceptor(loginInterceptor()).addPathPatterns("/pages/**","/user/**","/book/**","/lend/**","/collect/**","/class/**","/test/**").excludePathPatterns("/user/login","/user/register", 27 | "/js/**", "/css/**","/img/**","/assets/**", 28 | "/**/index.html", "/**/register.html", "/**/fonts/*", "/**/*.svg","/**/upload.html","LoginByQQ"); 29 | 30 | WebMvcConfigurer.super.addInterceptors(registry); 31 | 32 | 33 | 34 | } 35 | 36 | 37 | 38 | } 39 | 40 | -------------------------------------------------------------------------------- /src/main/resources/static/pages/upload.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 | 9 | 10 |
11 | 18 | 点击上传 19 |
只能上传jpg/png文件,且不超过500kb
20 |
21 |
22 | 23 | 24 | 25 | 26 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/entity/User.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.io.Serializable; 10 | 11 | 12 | @Data 13 | @NoArgsConstructor 14 | @AllArgsConstructor 15 | public class User implements Serializable { 16 | 17 | @TableId(type = IdType.AUTO) 18 | private Integer id; 19 | private String openid; 20 | private String username; 21 | private String password; 22 | private String sex; 23 | private String head_img; 24 | private String phone; 25 | private String city; 26 | private String role; 27 | /*public User(String username, String password, String sex, String phone, String city) { 28 | 29 | this.username = username; 30 | this.password = password; 31 | this.sex = sex; 32 | this.phone = phone; 33 | this.city = city; 34 | }*/ 35 | 36 | public User(String openId, Object nickname, Object gender, Object city, Object figureurl_1) { 37 | this.openid=openId; 38 | this.username = (String) nickname; 39 | this.sex = (String) gender; 40 | this.city = (String) city; 41 | this.head_img= (String) figureurl_1; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/exception/CustomExtHandler.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.exception; 2 | 3 | import com.ding.books.utils.Result; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.springframework.web.bind.annotation.ExceptionHandler; 6 | import org.springframework.web.bind.annotation.RestControllerAdvice; 7 | 8 | import javax.servlet.http.HttpServletRequest; 9 | 10 | /** 11 | * @Description 全局异常 12 | * @Author 丁帅帅 13 | * @Date 21/12/24 00:39 14 | * @Version 1.0 15 | */ 16 | @RestControllerAdvice 17 | @Slf4j 18 | public class CustomExtHandler { 19 | 20 | 21 | 22 | //捕获全局异常,处理所有不可知的异常 23 | @ExceptionHandler(value=Exception.class) 24 | Object handleException(Exception e, HttpServletRequest request){ 25 | log.error("url {}, msg {}",request.getRequestURL(), e.getMessage()); 26 | //log.error("错误:{}",request.getRequestURL(), e.getMessage()); 27 | /* Map map = new HashMap<>(); 28 | map.put("code", 100); 29 | map.put("msg", e.getMessage()); 30 | map.put("url", request.getRequestURL());*/ 31 | // return new Result(false,"有异常"); 32 | if(e instanceof MyException){ 33 | MyException myException = (MyException)e; 34 | return new Result(myException.isFlag(),myException.getMessage()); 35 | }else{ 36 | return new Result(false,"全局异常"); 37 | } 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/main/resources/mapper/UserMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 16 | 20 | 23 | 26 | 29 | 30 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/model/dto/LendBook.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.model.dto; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.io.Serializable; 9 | import java.util.Date; 10 | 11 | /** 12 | * @Description value = {"hibernateLazyInitializer", "handler"} 13 | * @Author 丁帅帅 14 | * @Date 21/12/19 17:12 15 | * @Version 1.0 16 | */ 17 | //@JsonIgnoreProperties(value = {"lisi", "wang"}) 18 | 19 | 20 | @Data 21 | @NoArgsConstructor 22 | @AllArgsConstructor 23 | public class LendBook implements Serializable { 24 | 25 | private Integer lendid; 26 | private Integer bookid; 27 | private String bookname; 28 | private String username; 29 | //@JsonFormat(pattern = "yyyy/MM/dd", timezone = "GMT+8") 30 | @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") 31 | private Date lenddate; 32 | @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") 33 | private Date backdate; 34 | private Integer number; 35 | //private Integer lisi; 36 | //private Integer wang; 37 | 38 | @Override 39 | public String toString() { 40 | return "LendBook{" + 41 | "bookid=" + bookid + 42 | ", bookname='" + bookname + '\'' + 43 | ", username='" + username + '\'' + 44 | ", number=" + number + 45 | '}'; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | log4j.rootCategory=INFO, stdout, file, errorfile 2 | log4j.category.com.example.boot=INFO, myFile 3 | log4j.logger.error=errorfile 4 | 5 | # 控制台输出 6 | log4j.appender.stdout=org.apache.log4j.ConsoleAppender 7 | log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 8 | log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n 9 | 10 | # root日志输出 11 | log4j.appender.file=org.apache.log4j.DailyRollingFileAppender 12 | log4j.appender.file.file=logs/all.log 13 | log4j.appender.file.DatePattern='.'yyyy-MM-dd 14 | log4j.appender.file.layout=org.apache.log4j.PatternLayout 15 | log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n 16 | 17 | # error日志输出 18 | log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender 19 | log4j.appender.errorfile.file=logs/error.log 20 | log4j.appender.errorfile.DatePattern='.'yyyy-MM-dd 21 | log4j.appender.errorfile.Threshold = ERROR 22 | log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout 23 | log4j.appender.errorfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n 24 | 25 | # com.example.boot下的日志输出 26 | log4j.appender.myFile=org.apache.log4j.DailyRollingFileAppender 27 | log4j.appender.myFile.file=logs/my.log 28 | log4j.appender.myFile.DatePattern='.'yyyy-MM-dd 29 | log4j.appender.myFile.layout=org.apache.log4j.PatternLayout 30 | log4j.appender.myFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L ---- %m%n 31 | -------------------------------------------------------------------------------- /src/main/resources/mapper/LendMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 15 | 24 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/main/resources/mapper/CollectMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 15 | 24 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | ${AnsiColor.BRIGHT_YELLOW} 2 | //////////////////////////////////////////////////////////////////// 3 | // _ooOoo_ // 4 | // o8888888o // 5 | // 88" . "88 // 6 | // (| ^_^ |) // 7 | // O\ = /O // 8 | // ____/`---'\____ // 9 | // .' \\| |// `. // 10 | // / \\||| : |||// \ // 11 | // / _||||| -:- |||||- \ // 12 | // | | \\\ - /// | | // 13 | // | \_| ''\---/'' | | // 14 | // \ .-\__ `-` ___/-. / // 15 | // ___`. .' /--.--\ `. . ___ // 16 | // ."" '< `.___\_<|>_/___.' >'"". // 17 | // | | : `- \`.;`\ _ /`;.`/ - ` : | | // 18 | // \ \ `-. \_ __\ /__ _/ .-` / / // 19 | // ========`-.____`-.___\_____/___.-`____.-'======== // 20 | // `=---=' // 21 | // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // 22 | // 佛祖保佑 永不宕机 永无BUG   // 23 | //////////////////////////////////////////////////////////////////// -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port=9999 2 | #上传文件 3 | spring.servlet.multipart.max-file-size=100MB 4 | spring.mvc.servlet.load-on-startup=1 5 | #数据库相关配置 6 | spring.datasource.driver-class-name =com.mysql.cj.jdbc.Driver 7 | spring.datasource.url=jdbc:mysql://127.0.0.1:3306/db2019216584?useUnicode=true&characterEncoding=utf-8&useSSL=false 8 | spring.datasource.username=root 9 | spring.datasource.password= 10 | 11 | #使用阿里巴巴druid数据源,默认使用自带的 12 | spring.datasource.type =com.alibaba.druid.pool.DruidDataSource 13 | #开启控制台打印sql 14 | mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl 15 | # 显示SQL语句 16 | mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl 17 | # mybatis 下划线转驼峰配置,两者都可以 18 | #mybatis.configuration.mapUnderscoreToCamelCase=true 19 | mybatis.configuration.map-underscore-to-camel-case=true 20 | #配置扫描 21 | mybatis.mapper-locations=classpath:mapper/*.xml 22 | 23 | #配置xml的结果别名 24 | mybatis.type-aliases-package=com.ding.books.entity 25 | 26 | #server.servlet.context-path=/ 27 | 28 | #格式化日期 29 | #jackson相关配置 30 | spring.jackson.date-format = yyyy-MM-dd 31 | #时区必须要设置HH:mm:ss 32 | spring.jackson.time-zone= GMT+8 33 | #ALWAYS的意思是即时属性为null,仍然也会输出这个key,对应yml里面的注释里面的类型 34 | spring.jackson.default-property-inclusion=ALWAYS 35 | #设置前后缀 36 | spring.mvc.view.prefix=classpath:/static/pages/ 37 | spring.mvc.view.suffix=.html 38 | #设置favicon 39 | spring.mvc.favicon.enabled=false 40 | 41 | #配置thymeleaf缓存开发期间先关闭,否则影响测试 42 | spring.thymeleaf.cache=false 43 | spring.thymeleaf.prefix=classpath:/static/pages/ 44 | spring.thymeleaf.suffix=.html 45 | #qq登录 46 | qq.oauth.appid = 47 | qq.oauth.appkey = 48 | qq.oauth.url = http://ding99.top/qq/callback 49 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/controller/UploadController.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.controller; 2 | 3 | 4 | import org.springframework.web.bind.annotation.PostMapping; 5 | import org.springframework.web.bind.annotation.RestController; 6 | import org.springframework.web.multipart.MultipartFile; 7 | 8 | import javax.servlet.http.HttpServletRequest; 9 | import java.io.File; 10 | import java.io.IOException; 11 | import java.text.SimpleDateFormat; 12 | import java.util.Date; 13 | import java.util.HashMap; 14 | import java.util.Map; 15 | import java.util.UUID; 16 | 17 | /** 18 | * @Description TODO 19 | * @Author 丁帅帅 20 | * @Date 21/12/24 22:33 21 | * @Version 1.0 22 | */ 23 | 24 | @RestController 25 | public class UploadController { 26 | SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/MM/dd/"); 27 | @PostMapping("/upload") 28 | public Map fileupload(MultipartFile file, HttpServletRequest req) { 29 | Map result = new HashMap<>(); 30 | String format = sdf.format(new Date()); 31 | String realPath = req.getServletContext().getRealPath("/") + format; 32 | File folder = new File(realPath); 33 | if (!folder.exists()) { 34 | folder.mkdirs(); 35 | } 36 | String oldName = file.getOriginalFilename(); 37 | String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf(".")); 38 | try { 39 | file.transferTo(new File(folder, newName)); 40 | String url = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + format + newName; 41 | result.put("status", "OK"); 42 | result.put("name", oldName); 43 | result.put("url", url); 44 | } catch (IOException e) { 45 | result.put("status", "ERROR"); 46 | result.put("msg", e.getMessage()); 47 | } 48 | return result; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/service/impl/ClassServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.service.impl; 2 | 3 | import com.ding.books.mapper.ClassMapper; 4 | import com.ding.books.model.dto.ClassBook; 5 | import com.ding.books.model.entity.ClassInfo; 6 | import com.ding.books.service.ClassService; 7 | import com.ding.books.utils.PageResult; 8 | import com.ding.books.utils.QueryPageBean; 9 | import com.github.pagehelper.Page; 10 | import com.github.pagehelper.PageHelper; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.stereotype.Service; 13 | import org.springframework.transaction.annotation.Transactional; 14 | 15 | import java.util.List; 16 | 17 | /** 18 | * @Description TODO 19 | * @Author 丁帅帅 20 | * @Date 21/12/23 09:22 21 | * @Version 1.0 22 | */ 23 | @Transactional 24 | @Service 25 | public class ClassServiceImpl implements ClassService { 26 | 27 | @Autowired 28 | private ClassMapper classMapper; 29 | 30 | @Override 31 | public PageResult pageQuery(QueryPageBean queryPageBean) { 32 | Integer currentPage = queryPageBean.getCurrentPage(); 33 | Integer pageSize = queryPageBean.getPageSize(); 34 | String queryString = queryPageBean.getQueryString();//查询条件 35 | //完成分页查询,基于mybatis框架提供的分页助手插件完成 36 | PageHelper.startPage(currentPage,pageSize); 37 | //select * from books limit 0,10 38 | Page page = classMapper.selectByCondition(queryString); 39 | long total = page.getTotal(); 40 | List rows = page.getResult(); 41 | return new PageResult(total,rows); 42 | } 43 | 44 | @Override 45 | public List findAll() { 46 | 47 | List classInfos = classMapper.selectList(null); 48 | /* for (ClassInfo classInfo : classInfos) { 49 | System.out.println(classInfo.toString()); 50 | }*/ 51 | return classInfos; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/resources/mapper/BookMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 11 | 12 | delete from book where bookid = #{bookid} 13 | 14 | 15 | 20 | 21 | 22 | 33 | 37 | 38 | 39 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/utils/JWTUtils.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.utils; 2 | 3 | import com.ding.books.model.entity.User; 4 | import io.jsonwebtoken.Claims; 5 | import io.jsonwebtoken.Jwts; 6 | import io.jsonwebtoken.SignatureAlgorithm; 7 | 8 | import java.util.Date; 9 | 10 | /** 11 | * Jwt工具类 12 | * 注意点: 13 | * 1、生成的token, 是可以通过base64进行解密出明文信息 14 | * 2、base64进行解密出明文信息,修改再进行编码,则会解密失败 15 | * 3、无法作废已颁布的token,除非改秘钥 16 | */ 17 | public class JWTUtils { 18 | 19 | 20 | /** 21 | * 过期时间,一周 22 | */ 23 | private static final long EXPIRE = 60000 * 60 * 24 * 7; 24 | //private static final long EXPIRE = 1; 25 | 26 | 27 | /** 28 | * 加密秘钥 29 | */ 30 | private static final String SECRET = "dingss"; 31 | 32 | 33 | /** 34 | * 令牌前缀 35 | */ 36 | private static final String TOKEN_PREFIX = "dingss"; 37 | 38 | 39 | /** 40 | * subject 41 | */ 42 | private static final String SUBJECT = "dingss"; 43 | 44 | 45 | /** 46 | * 根据用户信息,生成令牌 47 | * @param user 48 | * @return 49 | */ 50 | public static String geneJsonWebToken(User user){ 51 | 52 | String token = Jwts.builder().setSubject(SUBJECT) 53 | .claim("id",user.getId()) 54 | .claim("name",user.getUsername()) 55 | .setIssuedAt(new Date()) 56 | .setExpiration(new Date(System.currentTimeMillis() + EXPIRE)) 57 | .signWith(SignatureAlgorithm.HS256,SECRET).compact(); 58 | 59 | token = TOKEN_PREFIX + token; 60 | 61 | 62 | return token; 63 | } 64 | 65 | 66 | /** 67 | * 校验token的方法 68 | * @param token 69 | * @return 70 | */ 71 | public static Claims checkJWT(String token){ 72 | 73 | try{ 74 | 75 | final Claims claims = Jwts.parser().setSigningKey(SECRET) 76 | .parseClaimsJws(token.replace(TOKEN_PREFIX,"")).getBody(); 77 | 78 | return claims; 79 | 80 | }catch (Exception e){ 81 | return null; 82 | } 83 | 84 | } 85 | 86 | 87 | 88 | } 89 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/controller/ClassController.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.controller; 2 | 3 | import com.ding.books.model.entity.ClassInfo; 4 | import com.ding.books.model.vo.ExcelClass; 5 | import com.ding.books.service.ClassService; 6 | import com.ding.books.utils.ExcelUtils; 7 | import com.ding.books.utils.PageResult; 8 | import com.ding.books.utils.QueryPageBean; 9 | import org.springframework.beans.BeanUtils; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.web.bind.annotation.RequestBody; 12 | import org.springframework.web.bind.annotation.RequestMapping; 13 | import org.springframework.web.bind.annotation.RestController; 14 | 15 | import javax.servlet.http.HttpServletResponse; 16 | import java.util.ArrayList; 17 | import java.util.List; 18 | 19 | /** 20 | * @Description TODO 21 | * @Author 丁帅帅 22 | * @Date 21/12/23 09:20 23 | * @Version 1.0 24 | */ 25 | 26 | @RestController 27 | @RequestMapping("/class") 28 | public class ClassController { 29 | 30 | 31 | @Autowired 32 | private ClassService classService; 33 | 34 | 35 | 36 | /** 37 | * 分页查询 38 | * @param queryPageBean 39 | * @return 40 | */ 41 | @RequestMapping("/findPage") 42 | public PageResult findPage(@RequestBody QueryPageBean queryPageBean){ 43 | PageResult pageResult =classService.pageQuery(queryPageBean); 44 | 45 | return pageResult; 46 | } 47 | 48 | 49 | 50 | @RequestMapping("/export") 51 | public void export( HttpServletResponse response){ 52 | try{ 53 | 54 | List list =classService.findAll(); 55 | //System.out.println(list.toString()); 56 | String[] columnNames=new String[]{"id","classid","classname"}; 57 | String[] keys=new String[]{"id","类别号","类别名"}; 58 | List excelClasses =new ArrayList<>(); 59 | for (ClassInfo classInfo : list) { 60 | ExcelClass excelClass = new ExcelClass(); 61 | BeanUtils.copyProperties(classInfo,excelClass); 62 | excelClasses.add(excelClass); 63 | } 64 | 65 | ExcelUtils.export(response,"分类信息表",list,columnNames,keys,"图书类别信息"); 66 | //return new Result(true, MessageConstant.EXPORT_SUCCESS); 67 | }catch (Exception e){ 68 | e.printStackTrace(); 69 | //服务调用失败 70 | //return new Result(false, MessageConstant.EXPORT_FAIL); 71 | } 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/service/CustomUserDetailsService.java.bak: -------------------------------------------------------------------------------- 1 | package com.ding.books.service; 2 | 3 | 4 | import com.ding.books.model.entity.UserInfo; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.security.core.GrantedAuthority; 7 | import org.springframework.security.core.authority.SimpleGrantedAuthority; 8 | import org.springframework.security.core.userdetails.User; 9 | import org.springframework.security.core.userdetails.UserDetails; 10 | import org.springframework.security.core.userdetails.UserDetailsService; 11 | import org.springframework.security.core.userdetails.UsernameNotFoundException; 12 | import org.springframework.security.crypto.password.PasswordEncoder; 13 | import org.springframework.stereotype.Component; 14 | 15 | import java.util.ArrayList; 16 | import java.util.List; 17 | 18 | /** 19 | * @Description TODO 20 | * @Author 丁帅帅 21 | * @Date 21/12/14 17:30 22 | * @Version 1.0 23 | */ 24 | @Component 25 | public class CustomUserDetailsService implements UserDetailsService { 26 | @Autowired 27 | private UserInfoService userInfoService; 28 | 29 | @Autowired 30 | private UserService userService; 31 | /** 32 | * 需新建配置类注册一个指定的加密方式Bean,或在下一步Security配置类中注册指定 33 | */ 34 | @Autowired 35 | private PasswordEncoder passwordEncoder; 36 | 37 | @Override 38 | public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 39 | // 通过用户名从数据库获取用户信息 40 | UserInfo userInfo = userInfoService.getUserInfo(username); 41 | //com.ding.books.model.entity.User userInfo = userService.queryAllByUsername(username); 42 | if (userInfo == null) { 43 | throw new UsernameNotFoundException("用户不存在"); 44 | } 45 | 46 | // 得到用户角色 47 | String role = userInfo.getRole(); 48 | 49 | // 角色集合 50 | List authorities = new ArrayList<>(); 51 | // 角色必须以`ROLE_`开头,数据库中没有,则在这里加 52 | authorities.add(new SimpleGrantedAuthority("ROLE_" + role)); 53 | 54 | /* return new User( 55 | userInfo.getUsername(), 56 | // 因为数据库是明文,所以这里需加密密码 57 | passwordEncoder.encode(userInfo.getPassword()), 58 | authorities 59 | );*/ 60 | 61 | return new User( 62 | userInfo.getUsername(), 63 | // 数据库密码已加密,不用再加密 64 | userInfo.getPassword(), 65 | authorities 66 | ); 67 | } 68 | } 69 | 70 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/utils/MessageConstant.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.utils; 2 | 3 | /** 4 | * @Description TODO 5 | * @Author 丁帅帅 6 | * @Date 21/12/09 23:39 7 | * @Version 1.0 8 | */ 9 | public class MessageConstant { 10 | 11 | public static final String LEND_BOOK_SUCCESS = "借阅成功"; 12 | public static final String LEND_BOOK_FAIL = "借阅失败,"; 13 | public static final String ADD_Book_SUCCESS = "新增图书成功"; 14 | public static final String ADD_Book_FAIL = "新增图书失败"; 15 | 16 | public static final String DELETE_Book_FAIL = "删除图书失败"; 17 | public static final String DELETE_Book_SUCCESS = "删除图书成功"; 18 | 19 | public static final String EDIT_Book_FAIL = "编辑图书失败"; 20 | public static final String EDIT_Book_SUCCESS = "编辑图书成功"; 21 | 22 | public static final String QUERY_Book_SUCCESS = "查询图书成功"; 23 | public static final String QUERY_Book_FAIL = "查询图书失败"; 24 | 25 | 26 | public static final String ADD_User_SUCCESS = "新增用户成功"; 27 | public static final String ADD_User_FAIL = "新增用户失败"; 28 | 29 | public static final String DELETE_User_FAIL = "删除用户失败"; 30 | public static final String DELETE_User_SUCCESS = "删除用户成功"; 31 | 32 | public static final String EDIT_User_FAIL = "编辑用户失败"; 33 | public static final String EDIT_User_SUCCESS = "编辑用户成功"; 34 | 35 | public static final String QUERY_User_SUCCESS = "查询用户成功"; 36 | public static final String QUERY_User_FAIL = "查询用户失败"; 37 | 38 | public static final String Register_User_FAIL = "注册用户失败"; 39 | public static final String Register_User_SUCCESS = "注册用户成功"; 40 | 41 | public static final String Login_User_FAIL = "登录失败,请检查账号或密码!!!"; 42 | public static final String Login_User_SUCCESS = "登录成功"; 43 | 44 | public static final String Logout_User_SUCCESS = "退出成功"; 45 | public static final String Logout_User_FAIL = "退出失败"; 46 | 47 | public static final String EXPORT_SUCCESS = "导出成功"; 48 | public static final String EXPORT_FAIL = "导出失败"; 49 | 50 | public static final String UPLOAD_SUCCESS = "上传成功"; 51 | 52 | 53 | 54 | public static final String DELETE_Collect_FAIL="删除收藏失败"; 55 | public static final String DELETE_Collect_SUCCESS="取消收藏成功"; 56 | 57 | public static final String DELETE_Lend_FAIL="删除记录失败"; 58 | public static final String DELETE_Lend_SUCCESS="删除借阅记录成功"; 59 | 60 | public static final String QUERY_Lend_SUCCESS="查询成功"; 61 | public static final String QUERY_Lend_FAIL="查询失败"; 62 | 63 | public static final String Back_Lend_SUCCESS="归还图书成功"; 64 | public static final String Back_Lend_FAIL="归还图书失败"; 65 | 66 | public static final String Collect_BOOK_SUCCESS="收藏成功"; 67 | public static final String Collect_BOOK_FAIL="收藏失败"; 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/interceptor/LoginInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.interceptor; 2 | 3 | import com.ding.books.utils.JWTUtils; 4 | import io.jsonwebtoken.Claims; 5 | import org.springframework.web.servlet.HandlerInterceptor; 6 | import org.springframework.web.servlet.ModelAndView; 7 | 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.PrintWriter; 11 | 12 | /** 13 | * @Description TODO 14 | * @Author 丁帅帅 15 | * @Date 21/12/09 22:11 16 | * @Version 1.0 17 | */ 18 | public class LoginInterceptor implements HandlerInterceptor { 19 | 20 | @Override 21 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 22 | 23 | String token = (String) request.getSession().getAttribute("token"); 24 | if(token != null ) { 25 | Claims claims = JWTUtils.checkJWT(token); 26 | if(claims !=null){ 27 | Integer userId = (Integer)claims.get("id"); 28 | String name = (String) claims.get("name"); 29 | 30 | request.setAttribute("user_id",userId); 31 | request.setAttribute("name",name); 32 | 33 | return true; 34 | } 35 | } 36 | 37 | // sendJsonMessage(response,new Result(false,"请先登录!!!")); 38 | response.setContentType("text/html; charset=utf-8"); 39 | response.setContentType("text/html;charset=UTF-8"); 40 | PrintWriter pw = response.getWriter(); 41 | pw.print(""); 42 | response.sendRedirect("index.html"); 43 | return false; 44 | } 45 | 46 | 47 | 48 | 49 | /** 50 | * 响应json数据给前端 51 | * @param response 52 | * @param obj 53 | */ 54 | /* public static void sendJsonMessage(HttpServletResponse response, Object obj){ 55 | 56 | try{ 57 | ObjectMapper objectMapper = new ObjectMapper(); 58 | response.setContentType("application/json; charset=utf-8"); 59 | PrintWriter writer = response.getWriter(); 60 | writer.print(objectMapper.writeValueAsString(obj)); 61 | writer.close(); 62 | response.flushBuffer(); 63 | }catch (Exception e){ 64 | e.printStackTrace(); 65 | } 66 | 67 | 68 | }*/ 69 | 70 | 71 | 72 | 73 | @Override 74 | public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 75 | 76 | } 77 | 78 | @Override 79 | public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 80 | 81 | } 82 | } 83 | 84 | -------------------------------------------------------------------------------- /src/main/resources/static/pages/echarts_user.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 图书管理 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 |

统计分析分布占比

21 | 22 | 首页 23 | 统计分析 24 | 地区占比 25 | 26 |
27 |
28 |
29 | 30 |
31 |
32 |
33 |
34 | 35 | 36 | 37 | 38 | 80 | 81 | -------------------------------------------------------------------------------- /src/main/resources/static/pages/map.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 传智健康 8 | 9 | 10 | 11 | 12 | 13 | 14 | 16 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 77 | 78 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/utils/QqHttpClient.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.utils; 2 | 3 | 4 | import com.alibaba.fastjson.JSONObject; 5 | import org.apache.http.HttpEntity; 6 | import org.apache.http.HttpResponse; 7 | import org.apache.http.client.methods.HttpGet; 8 | import org.apache.http.impl.client.CloseableHttpClient; 9 | import org.apache.http.impl.client.HttpClients; 10 | import org.apache.http.util.EntityUtils; 11 | 12 | import java.io.IOException; 13 | 14 | /** 15 | * @Description TODO 16 | * @Author 丁帅帅 17 | * @Date 21/11/21 09:38 18 | * @Version 1.0 19 | */ 20 | public class QqHttpClient { 21 | 22 | 23 | /** 24 | * 获取Access Token 25 | */ 26 | public static String getAccessToken(String url) throws IOException { 27 | CloseableHttpClient client = HttpClients.createDefault(); 28 | String token = null; 29 | 30 | HttpGet httpGet = new HttpGet(url); 31 | HttpResponse response = client.execute(httpGet); 32 | HttpEntity entity = response.getEntity(); 33 | 34 | if (entity != null) { 35 | String result = EntityUtils.toString(entity, "UTF-8"); 36 | if (result.indexOf("access_token") >= 0) { 37 | String[] array = result.split("&"); 38 | for (String str : array) { 39 | if (str.indexOf("access_token") >= 0) { 40 | token = str.substring(str.indexOf("=") + 1); 41 | break; 42 | } 43 | } 44 | } 45 | } 46 | 47 | httpGet.releaseConnection(); 48 | return token; 49 | } 50 | 51 | /** 52 | * 获取openID 53 | */ 54 | public static String getOpenID(String url) throws IOException { 55 | JSONObject jsonObject = null; 56 | CloseableHttpClient client = HttpClients.createDefault(); 57 | 58 | HttpGet httpGet = new HttpGet(url); 59 | HttpResponse response = client.execute(httpGet); 60 | HttpEntity entity = response.getEntity(); 61 | 62 | if (entity != null) { 63 | String result = EntityUtils.toString(entity, "UTF-8"); 64 | jsonObject = JSONUtils.parseJSONP(result); 65 | } 66 | 67 | httpGet.releaseConnection(); 68 | 69 | if (jsonObject != null) { 70 | return jsonObject.getString("openid"); 71 | } else { 72 | return null; 73 | } 74 | } 75 | 76 | /** 77 | * 获取QQ用户信息 78 | */ 79 | public static JSONObject getUserInfo(String url) throws IOException { 80 | JSONObject jsonObject = null; 81 | CloseableHttpClient client = HttpClients.createDefault(); 82 | 83 | HttpGet httpGet = new HttpGet(url); 84 | HttpResponse response = client.execute(httpGet); 85 | HttpEntity entity = response.getEntity(); 86 | 87 | if (entity != null) { 88 | String result = EntityUtils.toString(entity, "UTF-8"); 89 | jsonObject = JSONObject.parseObject(result); 90 | } 91 | 92 | httpGet.releaseConnection(); 93 | 94 | return jsonObject; 95 | } 96 | 97 | 98 | } 99 | -------------------------------------------------------------------------------- /src/main/resources/static/pages/Echars.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 图表 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 |

统计分析数量排行

19 | 20 | 首页 21 | 统计分析 22 | 数量排行 23 | 24 |
25 |
26 |
27 | 28 |
29 |
30 |
31 |
32 | 33 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/config/WebSecurityConfig.java.bak: -------------------------------------------------------------------------------- 1 | package com.ding.books.config; 2 | 3 | import com.ding.books.service.CustomUserDetailsService; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 7 | import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; 8 | import org.springframework.security.config.annotation.web.builders.HttpSecurity; 9 | import org.springframework.security.config.annotation.web.builders.WebSecurity; 10 | import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 11 | import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 12 | import org.springframework.security.crypto.password.NoOpPasswordEncoder; 13 | import org.springframework.security.crypto.password.PasswordEncoder; 14 | 15 | /** 16 | * @Description TODO 17 | * @Author 丁帅帅 18 | * @Date 21/12/14 17:35 19 | * @Version 1.0 20 | */ 21 | @EnableWebSecurity 22 | @EnableGlobalMethodSecurity(prePostEnabled = true) // 开启方法级安全验证 23 | public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 24 | @Autowired 25 | private CustomUserDetailsService userDatailService; 26 | 27 | /** 28 | * 指定加密方式 29 | */ 30 | @Bean 31 | public PasswordEncoder passwordEncoder(){ 32 | // 使用BCrypt加密密码 33 | //return new BCryptPasswordEncoder(); 34 | return NoOpPasswordEncoder.getInstance(); 35 | 36 | } 37 | 38 | @Override 39 | protected void configure(AuthenticationManagerBuilder auth) throws Exception { 40 | auth 41 | // 从数据库读取的用户进行身份认证 42 | .userDetailsService(userDatailService) 43 | .passwordEncoder(passwordEncoder()); 44 | } 45 | 46 | @Override 47 | protected void configure(HttpSecurity http) throws Exception { 48 | http.headers().frameOptions().disable();//开启运行iframe嵌套页面 49 | http 50 | .authorizeRequests() 51 | .antMatchers("/user/**").permitAll() // 允许post请求/add-user,而无需认证 52 | .antMatchers("/book/**").permitAll() // 允许post请求/add-user,而无需认证 53 | .antMatchers("/user/login").permitAll() // 允许post请求/add-user,而无需认证 54 | //.antMatchers("/**").permitAll() // 允许post请求/add-user,而无需认证 55 | .anyRequest().authenticated() // 所有请求都需要验证 56 | .and() 57 | .formLogin() // 使用默认的登录页面 58 | .loginPage("/index.html") 59 | .usernameParameter("username")//设置登录账号参数,与表单参数一致 60 | .passwordParameter("password")//设置登录密码参数,与表单参数一致 61 | //.loginProcessingUrl("/user/login") 62 | //.defaultSuccessUrl("/main.html") 63 | .and() 64 | .logout() 65 | .logoutUrl("/logout") 66 | // .logoutRequestMatcher(new AntPathRequestMatcher("/logout","POST")) 67 | .logoutSuccessUrl("/index.html") 68 | .permitAll() 69 | .and() 70 | .csrf().disable();// post请求要关闭csrf验证,不然访问报错;实际开发中开启,需要前端配合传递其他参数 71 | } 72 | 73 | @Override 74 | public void configure(WebSecurity web) throws Exception { 75 | web.ignoring().antMatchers("/js/**", "/css/**","/img/**","/assets/**","index.html","/plugins/**","user/**","/book/**","pages/**"); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/main/resources/static/css/login(1).css: -------------------------------------------------------------------------------- 1 | html,body { 2 | /* overflow-y: scroll; */ 3 | margin: 0; 4 | } 5 | .login-container .input{ 6 | display: inline-block; 7 | height: 47px; 8 | width: 85%; 9 | 10 | } 11 | .login-container .input input { 12 | background: transparent; 13 | border: 0px; 14 | -webkit-appearance: none; 15 | border-radius: 0px; 16 | padding: 12px 5px 12px 0; 17 | height: 47px; 18 | } 19 | .login-container .el-form-item { 20 | border: 1px solid #DCDFE6; 21 | background: #fff; 22 | border-radius: 5px; 23 | color: #454545; 24 | } 25 | .login-container .el-button--medium{ 26 | height: 50px; 27 | line-height: 20px; 28 | font-size: 22px; 29 | } 30 | .login-container .loginBox{ 31 | height: 100%; 32 | width: 100%; 33 | background: url('./../img/logingBg.png') no-repeat 100% 100%; 34 | position: relative; 35 | } 36 | .login-container .loginBox .el-form-item__content{ 37 | line-height: initial; 38 | } 39 | .login-container form { 40 | position: absolute; 41 | left: 20%; 42 | top: 50%; 43 | width: 520px; 44 | padding: 35px 35px 15px 35px; 45 | margin: -200px 0 0 0; 46 | background:#f5f5f5; 47 | } 48 | .login-container .tips { 49 | font-size: 14px; 50 | /* // color: #fff; */ 51 | margin-bottom: 10px; 52 | /* span { 53 | &:first-of-type { 54 | margin-right: 16px; 55 | } 56 | } */ 57 | } 58 | .login-container .svg-container { 59 | padding: 6px 5px 6px 15px; 60 | color: #889aa4; 61 | vertical-align: middle; 62 | width: 30px; 63 | display: inline-block; 64 | /* &_login { 65 | font-size: 20px; 66 | } */ 67 | } 68 | .login-container .title-container { 69 | position: relative; 70 | 71 | 72 | } 73 | .login-container .title-container .title { 74 | font-size: 26px; 75 | /* // font-weight: 400; */ 76 | color: #333; 77 | margin: 0px auto 40px auto; 78 | text-align: center; 79 | font-weight: bold; 80 | } 81 | .login-container .title-container .set-language { 82 | /* // color: #fff; */ 83 | position: absolute; 84 | top: 5px; 85 | right: 0px; 86 | } 87 | .login-container { 88 | position: fixed; 89 | height: 100%; 90 | width: 100%; 91 | background-color: #2d3a4b; 92 | background: url('./../img/bg.jpg'); 93 | -moz-background-size: 100% 100%; 94 | background-size: 100% 100%; 95 | background-repeat: no-repeat; 96 | } 97 | .login-container .show-pwd { 98 | position: absolute; 99 | right: 10px; 100 | top: 7px; 101 | font-size: 16px; 102 | color: #889aa4; 103 | cursor: pointer; 104 | user-select: none; 105 | } 106 | .login-container .thirdparty-button { 107 | position: absolute; 108 | right: 35px; 109 | bottom: 28px; 110 | } 111 | .logoInfo{ 112 | padding-bottom:35px; 113 | text-align: center; 114 | } 115 | .logoInfo span{ 116 | font-size: 22px; 117 | padding: 0 10px; 118 | display: inline-block; 119 | 120 | } 121 | .logoInfo .logo{ 122 | background: url(../img/loginLogo.png) no-repeat; 123 | display:inline-block; 124 | width: 200px; 125 | height: 30px; 126 | display: inline-block; 127 | vertical-align: middle; 128 | } 129 | .tipInfo{font-size: 12px;} 130 | .tipInfo span{ 131 | color: #66b1ff; 132 | padding: 0 5px; 133 | } 134 | .tipInfo .el-checkbox{ 135 | margin: 0; 136 | } 137 | .svg-container span{ 138 | width: 22px; 139 | height: 22px; 140 | display: inline-block; 141 | } 142 | .svg-container .user{ 143 | background: url(../img/user.png) no-repeat 0 50%; 144 | } 145 | .svg-container .username{ 146 | background: url(../img/pwd.png) no-repeat 0 50%; 147 | } -------------------------------------------------------------------------------- /src/main/java/com/ding/books/controller/CollectController.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.controller; 2 | 3 | import com.ding.books.model.dto.QueryPageBeanUsername; 4 | import com.ding.books.model.entity.CollectRecord; 5 | import com.ding.books.model.entity.LendRecord; 6 | import com.ding.books.model.vo.ExcelCollect; 7 | import com.ding.books.service.CollectService; 8 | import com.ding.books.utils.*; 9 | import org.springframework.beans.BeanUtils; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.web.bind.annotation.RequestBody; 12 | import org.springframework.web.bind.annotation.RequestMapping; 13 | import org.springframework.web.bind.annotation.RestController; 14 | 15 | import javax.servlet.http.HttpServletResponse; 16 | import java.util.ArrayList; 17 | import java.util.List; 18 | 19 | /** 20 | * @Description TODO 21 | * @Author 丁帅帅 22 | * @Date 21/12/22 00:02 23 | * @Version 1.0 24 | */ 25 | @RestController 26 | @RequestMapping("/collect") 27 | public class CollectController { 28 | 29 | @Autowired 30 | private CollectService collectService; 31 | 32 | 33 | 34 | /** 35 | * 用户分页查询 36 | * @param queryPageBean 37 | * @return 38 | */ 39 | @RequestMapping("/findPageUser") 40 | public PageResult findPageUser(@RequestBody QueryPageBeanUsername queryPageBean){ 41 | PageResult pageResult =collectService.pageQueryUser(queryPageBean); 42 | 43 | return pageResult; 44 | } 45 | 46 | /** 47 | * 管理员分页查询 48 | * @param queryPageBean 49 | * @return 50 | */ 51 | @RequestMapping("/findPage") 52 | public PageResult findPage(@RequestBody QueryPageBean queryPageBean){ 53 | PageResult pageResult =collectService.pageQuery(queryPageBean); 54 | 55 | return pageResult; 56 | } 57 | 58 | /** 59 | * 删除 60 | * @param collectid 61 | * @return 62 | */ 63 | @RequestMapping("/delete") 64 | public Result delete(Integer collectid){ 65 | try{ 66 | collectService.deleteCollect(collectid); 67 | }catch (Exception e){ 68 | e.printStackTrace(); 69 | //服务调用失败 70 | return new Result(false, MessageConstant.DELETE_Collect_FAIL); 71 | } 72 | return new Result(true, MessageConstant.DELETE_Collect_SUCCESS); 73 | } 74 | 75 | 76 | 77 | 78 | 79 | 80 | @RequestMapping("/export") 81 | public void export( HttpServletResponse response){ 82 | try{ 83 | 84 | List list =collectService.findAll(); 85 | //System.out.println(list.toString()); 86 | String[] columnNames=new String[]{"collectid","bookid","userid","lenddate"}; 87 | String[] keys=new String[]{"collectid","书的编号","用户id","收藏日期"}; 88 | List excelCollects =new ArrayList<>(); 89 | for (CollectRecord collectRecord : list) { 90 | // ExcelLend excelLend = new ExcelLend(); 91 | ExcelCollect excelCollect = new ExcelCollect(); 92 | BeanUtils.copyProperties(collectRecord,excelCollect); 93 | excelCollects.add(excelCollect); 94 | } 95 | 96 | ExcelUtils.export(response,"收藏信息表",excelCollects,columnNames,keys,"收藏信息"); 97 | //return new Result(true, MessageConstant.EXPORT_SUCCESS); 98 | }catch (Exception e){ 99 | e.printStackTrace(); 100 | //服务调用失败 101 | //return new Result(false, MessageConstant.EXPORT_FAIL); 102 | } 103 | } 104 | 105 | } 106 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/controller/TestController.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.controller; 2 | 3 | import com.ding.books.model.entity.Book; 4 | import com.ding.books.model.entity.Echars; 5 | import com.ding.books.service.BookService; 6 | import com.ding.books.utils.Result; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.ui.Model; 9 | import org.springframework.web.bind.annotation.RequestMapping; 10 | import org.springframework.web.bind.annotation.RestController; 11 | 12 | import java.util.ArrayList; 13 | import java.util.HashMap; 14 | import java.util.List; 15 | import java.util.Map; 16 | 17 | /** 18 | * @Description 测试下Echars 19 | * @Author 丁帅帅 20 | * @Date 21/12/24 07:43 21 | * @Version 1.0 22 | */ 23 | @RestController 24 | @RequestMapping("/test") 25 | public class TestController { 26 | @Autowired 27 | private BookService bookService; 28 | 29 | @RequestMapping(value = "/EcharsShow") 30 | public List findById(Model model) { 31 | 32 | List list = new ArrayList(); 33 | List allLimit = bookService.findAllLimit(); 34 | for (Book book : allLimit) { 35 | list.add(new Echars(book.getBookname(),book.getNumber())); 36 | } 37 | /* list.add(new Echars("人类简史",50)); 38 | list.add(new Echars("追寻生命的意义",26)); 39 | list.add(new Echars("明朝那些事儿",35)); 40 | list.add(new Echars("造彩虹的人",10)); 41 | list.add(new Echars("秘密花园",72)); 42 | list.add(new Echars("方向",12)); 43 | list.add(new Echars("控方证人",12)); 44 | list.add(new Echars("三生三世 十里桃花",12));*/ 45 | 46 | return list; 47 | } 48 | 49 | //人数分布占比饼形图 50 | @RequestMapping("/getSetmealReport") 51 | public Result getSetmealReport(){ 52 | //使用模拟数据测试使用什么样的java对象转为饼形图所需的json数据格式 53 | Map data = new HashMap<>(); 54 | 55 | try{ 56 | // List> setmealCount = setmealService.findSetmealCount(); 57 | List> setmealCount = new ArrayList<>(); 58 | Map map1 = new HashMap<>(); 59 | Map map2 = new HashMap<>(); 60 | Map map3 = new HashMap<>(); 61 | Map map4 = new HashMap<>(); 62 | Map map5 = new HashMap<>(); 63 | 64 | map1.put("name","泰安"); 65 | map1.put("value",10); 66 | 67 | map2.put("name","大阜阳"); 68 | map2.put("value",30); 69 | 70 | map3.put("name","济南"); 71 | map3.put("value",20); 72 | 73 | map4.put("name","北京"); 74 | map4.put("value",15); 75 | 76 | map5.put("name","上海"); 77 | map5.put("value",25); 78 | 79 | 80 | setmealCount.add(map1); 81 | setmealCount.add(map2); 82 | setmealCount.add(map3); 83 | setmealCount.add(map4); 84 | setmealCount.add(map5); 85 | data.put("setmealCount",setmealCount); 86 | 87 | List setmealNames = new ArrayList<>(); 88 | 89 | setmealNames.add("泰安"); 90 | setmealNames.add("大阜阳"); 91 | setmealNames.add("济南"); 92 | setmealNames.add("北京"); 93 | setmealNames.add("上海"); 94 | data.put("setmealNames",setmealNames); 95 | return new Result(true, "获取成功",data); 96 | }catch (Exception e){ 97 | e.printStackTrace(); 98 | return new Result(false,"获取失败"); 99 | } 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/service/impl/BookServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.service.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; 5 | import com.ding.books.mapper.BookMapper; 6 | import com.ding.books.model.dto.AddBook; 7 | import com.ding.books.model.dto.EditBook; 8 | import com.ding.books.model.entity.Book; 9 | import com.ding.books.service.BookService; 10 | import com.ding.books.utils.PageResult; 11 | import com.ding.books.utils.QueryPageBean; 12 | import com.github.pagehelper.Page; 13 | import com.github.pagehelper.PageHelper; 14 | import org.springframework.beans.BeanUtils; 15 | import org.springframework.beans.factory.annotation.Autowired; 16 | import org.springframework.stereotype.Service; 17 | import org.springframework.transaction.annotation.Transactional; 18 | 19 | import java.util.List; 20 | 21 | /** 22 | * @Description TODO 23 | * @Author 丁帅帅 24 | * @Date 21/12/09 23:26 25 | * @Version 1.0 26 | */ 27 | @Transactional 28 | @Service 29 | public class BookServiceImpl implements BookService { 30 | 31 | 32 | @Autowired 33 | private BookMapper bookMapper; 34 | 35 | 36 | @Override 37 | public PageResult pageQuery(QueryPageBean queryPageBean) { 38 | Integer currentPage = queryPageBean.getCurrentPage(); 39 | Integer pageSize = queryPageBean.getPageSize(); 40 | String queryString = queryPageBean.getQueryString();//查询条件 41 | //完成分页查询,基于mybatis框架提供的分页助手插件完成 42 | PageHelper.startPage(currentPage,pageSize); 43 | //select * from books limit 0,10 44 | Page page = bookMapper.selectByCondition(queryString); 45 | long total = page.getTotal(); 46 | List rows = page.getResult(); 47 | return new PageResult(total,rows); 48 | } 49 | 50 | public int addBook(AddBook addBook) { 51 | 52 | // return bookMapper.addBook(books); 53 | 54 | Book book = new Book(); 55 | BeanUtils.copyProperties(addBook,book); 56 | return bookMapper.insert(book); 57 | } 58 | 59 | 60 | 61 | 62 | //根据ID删除图书 63 | public void deleteById(Integer id) { 64 | 65 | bookMapper.deleteById(id); 66 | } 67 | 68 | public void edit(EditBook editBook) { 69 | Book book = new Book(); 70 | // BeanUtils.copyProperties(editBook,book); 71 | book.setNumber(editBook.getNumber()); 72 | book.setBookname(editBook.getBookname()); 73 | book.setAuthor(editBook.getAuthor()); 74 | book.setClassid(editBook.getClassid()); 75 | book.setIntroduction(editBook.getIntroduction()); 76 | book.setPublish(editBook.getPublish()); 77 | bookMapper.update(book,new UpdateWrapper().eq("bookid",editBook.getBookid())); 78 | } 79 | 80 | @Override 81 | public List findAll() { 82 | return bookMapper.selectList(null); 83 | } 84 | 85 | @Override 86 | public List findAllLimit() { 87 | List allLimit = bookMapper.findAllLimit(); 88 | return allLimit; 89 | } 90 | 91 | 92 | @Override 93 | public Book findBookById(Integer bookid) { 94 | Book book = bookMapper.selectOne(new QueryWrapper().eq("bookid",bookid)); 95 | return book; 96 | } 97 | 98 | @Override 99 | public void lendBook(Integer bookid) { 100 | 101 | 102 | Book book = findBookById(bookid); 103 | book.setNumber(book.getNumber()-1); 104 | bookMapper.update(book, new UpdateWrapper().eq("bookid", bookid)); 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/service/impl/CollectServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.service.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.ding.books.mapper.CollectMapper; 5 | import com.ding.books.mapper.UserMapper; 6 | import com.ding.books.model.dto.CollectBook; 7 | import com.ding.books.model.dto.QueryPageBeanUsername; 8 | import com.ding.books.model.entity.CollectRecord; 9 | import com.ding.books.model.entity.User; 10 | import com.ding.books.service.CollectService; 11 | import com.ding.books.utils.PageResult; 12 | import com.ding.books.utils.QueryPageBean; 13 | import com.github.pagehelper.Page; 14 | import com.github.pagehelper.PageHelper; 15 | import org.springframework.beans.factory.annotation.Autowired; 16 | import org.springframework.stereotype.Service; 17 | import org.springframework.transaction.annotation.Transactional; 18 | 19 | import java.util.Date; 20 | import java.util.List; 21 | 22 | /** 23 | * @Description TODO 24 | * @Author 丁帅帅 25 | * @Date 21/12/22 17:07 26 | * @Version 1.0 27 | */ 28 | @Transactional 29 | @Service 30 | public class CollectServiceImpl implements CollectService { 31 | 32 | @Autowired 33 | private CollectMapper collectMapper; 34 | @Autowired 35 | private UserMapper userMapper; 36 | 37 | @Override 38 | public PageResult pageQueryUser(QueryPageBeanUsername queryPageBean) { 39 | Integer currentPage = queryPageBean.getCurrentPage(); 40 | Integer pageSize = queryPageBean.getPageSize(); 41 | String queryString = queryPageBean.getBookname();//查询条件 42 | String username = queryPageBean.getUsername(); 43 | User user = userMapper.selectOne(new QueryWrapper().eq("username", username)); 44 | //System.out.println(username); 45 | //System.out.println("------->"+user.getId()); 46 | //System.out.println("------->"+queryString); 47 | //完成分页查询,基于mybatis框架提供的分页助手插件完成 48 | PageHelper.startPage(currentPage,pageSize); 49 | //select * from books limit 0,10 50 | Page page = collectMapper.selectByConditionUser(user.getId(),queryString); 51 | long total = page.getTotal(); 52 | List rows = page.getResult(); 53 | 54 | return new PageResult(total,rows); 55 | } 56 | 57 | @Override 58 | public PageResult pageQuery(QueryPageBean queryPageBean) { 59 | Integer currentPage = queryPageBean.getCurrentPage(); 60 | Integer pageSize = queryPageBean.getPageSize(); 61 | String queryString = queryPageBean.getQueryString();//查询条件 62 | 63 | //完成分页查询,基于mybatis框架提供的分页助手插件完成 64 | PageHelper.startPage(currentPage,pageSize); 65 | //select * from books limit 0,10 66 | Page page = collectMapper.selectByCondition(queryString); 67 | long total = page.getTotal(); 68 | List rows = page.getResult(); 69 | 70 | return new PageResult(total,rows); 71 | } 72 | 73 | @Override 74 | public void deleteCollect(Integer collectid) { 75 | collectMapper.deleteById(collectid); 76 | } 77 | 78 | 79 | 80 | @Override 81 | public List findAll() { 82 | List collectRecords = collectMapper.selectList(null); 83 | return collectRecords; 84 | } 85 | 86 | @Override 87 | public void addCollectBook(Integer bookid, Integer id) { 88 | // LendRecord lendRecord = new LendRecord(); 89 | CollectRecord collectRecord = new CollectRecord(); 90 | Date date = new Date(); 91 | collectRecord.setLenddate(date); 92 | collectRecord.setBookid(bookid); 93 | collectRecord.setUserid(id); 94 | collectMapper.insert(collectRecord); 95 | } 96 | 97 | @Override 98 | public List findCollectBookByBookidandUsrid(Integer bookid, Integer id) { 99 | List collectRecords= collectMapper.findCollectBookByBookidandUsrid(bookid,id); 100 | return collectRecords; 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/controller/LendController.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.controller; 2 | 3 | import com.ding.books.model.dto.QueryPageBeanUsername; 4 | import com.ding.books.model.entity.LendRecord; 5 | import com.ding.books.model.vo.ExcelLend; 6 | import com.ding.books.service.LendService; 7 | import com.ding.books.utils.*; 8 | import org.springframework.beans.BeanUtils; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.web.bind.annotation.RequestBody; 11 | import org.springframework.web.bind.annotation.RequestMapping; 12 | import org.springframework.web.bind.annotation.RestController; 13 | 14 | import javax.servlet.http.HttpServletResponse; 15 | import java.util.ArrayList; 16 | import java.util.List; 17 | 18 | /** 19 | * @Description TODO 20 | * @Author 丁帅帅 21 | * @Date 21/12/19 17:05 22 | * @Version 1.0 23 | */ 24 | @RestController 25 | @RequestMapping("/lend") 26 | public class LendController { 27 | 28 | @Autowired 29 | private LendService lendService; 30 | 31 | 32 | 33 | /** 34 | * 分页查询 35 | * @param queryPageBean 36 | * @return 37 | */ 38 | @RequestMapping("/findPageUser") 39 | public PageResult findPageUser(@RequestBody QueryPageBeanUsername queryPageBean){ 40 | PageResult pageResult =lendService.pageQueryUser(queryPageBean); 41 | 42 | return pageResult; 43 | } 44 | 45 | @RequestMapping("/findPage") 46 | public PageResult findPage(@RequestBody QueryPageBean queryPageBean){ 47 | PageResult pageResult =lendService.pageQuery(queryPageBean); 48 | 49 | return pageResult; 50 | } 51 | 52 | /** 53 | * 删除 54 | * @param lendid 55 | * @return 56 | */ 57 | @RequestMapping("/delete") 58 | public Result delete(Integer lendid){ 59 | try{ 60 | lendService.deleteLend(lendid); 61 | }catch (Exception e){ 62 | e.printStackTrace(); 63 | //服务调用失败 64 | return new Result(false, MessageConstant.DELETE_Lend_FAIL); 65 | } 66 | return new Result(true, MessageConstant.DELETE_Lend_SUCCESS); 67 | } 68 | 69 | 70 | @RequestMapping("/findLendById") 71 | public Result findLendById(Integer lendid){ 72 | try{ 73 | LendRecord lendRecord =lendService.findLendById(lendid); 74 | return new Result(true, MessageConstant.QUERY_Lend_SUCCESS); 75 | }catch (Exception e){ 76 | e.printStackTrace(); 77 | //服务调用失败 78 | return new Result(false, MessageConstant.QUERY_Lend_FAIL); 79 | } 80 | } 81 | 82 | /** 83 | * 归还图书 84 | * @param lendid 85 | * @return 86 | */ 87 | @RequestMapping("/back") 88 | public Result back(Integer lendid){ 89 | //int i=1/0; 90 | //全局异常不补获try catch中的异常 91 | try{ 92 | 93 | lendService.back(lendid); 94 | 95 | //throw new RuntimeException(); 96 | 97 | 98 | return new Result(true, MessageConstant.Back_Lend_SUCCESS); 99 | }catch (Exception e){ 100 | e.printStackTrace(); 101 | //服务调用失败 102 | return new Result(false, MessageConstant.Back_Lend_FAIL); 103 | } 104 | } 105 | 106 | @RequestMapping("/export") 107 | public void export( HttpServletResponse response){ 108 | try{ 109 | 110 | List list =lendService.findAll(); 111 | //System.out.println(list.toString()); 112 | String[] columnNames=new String[]{"lendid","bookid","userid","lenddate","backdate","number"}; 113 | String[] keys=new String[]{"lendid","书的编号","用户id","借书日期","应还日期","数量"}; 114 | List excelLends =new ArrayList<>(); 115 | for (LendRecord lendRecord : list) { 116 | ExcelLend excelLend = new ExcelLend(); 117 | BeanUtils.copyProperties(lendRecord,excelLend); 118 | excelLends.add(excelLend); 119 | } 120 | 121 | ExcelUtils.export(response,"借阅信息表",excelLends,columnNames,keys,"借阅信息"); 122 | //return new Result(true, MessageConstant.EXPORT_SUCCESS); 123 | }catch (Exception e){ 124 | e.printStackTrace(); 125 | //服务调用失败 126 | //return new Result(false, MessageConstant.EXPORT_FAIL); 127 | } 128 | } 129 | 130 | 131 | 132 | } 133 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/utils/ExcelUtils.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.utils; 2 | 3 | import cn.hutool.core.io.IoUtil; 4 | import cn.hutool.poi.excel.ExcelUtil; 5 | import cn.hutool.poi.excel.ExcelWriter; 6 | import org.apache.log4j.Logger; 7 | 8 | import javax.servlet.ServletOutputStream; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | 14 | /** 15 | * @Description TODO 16 | * @Author 丁帅帅 17 | * @Date 21/12/19 01:13 18 | * @Version 1.0 19 | */ 20 | public class ExcelUtils { 21 | 22 | private static Logger logger = Logger.getLogger(ExcelUtils.class); 23 | 24 | private static List> lineList = new ArrayList<>(); 25 | 26 | /** 27 | * excel 导出工具类 28 | * 29 | * @param response 30 | * @param fileName 文件名 31 | * @param projects 对象集合 32 | * @param columnNames 导出的excel中的列名 33 | * @param keys 对应的是对象中的字段名字 34 | * @throws IOException 35 | */ 36 | public static void export(HttpServletResponse response, String fileName, List projects, String[] columnNames, String[] keys,String title) throws IOException { 37 | 38 | ExcelWriter bigWriter = ExcelUtil.getWriter(true); 39 | 40 | 41 | for (int i = 0; i < columnNames.length; i++) { 42 | 43 | logger.info("数据库列名"+columnNames[i]+"列名"+keys[i]+"\n"); 44 | bigWriter.addHeaderAlias(columnNames[i], keys[i]); 45 | //bigWriter.setColumnWidth(i, 20); 46 | bigWriter.autoSizeColumnAll(); 47 | } 48 | 49 | // 合并单元格后的标题行,使用默认标题样式 50 | bigWriter.merge(keys.length-1, title); 51 | logger.info("表+====>"+projects.size()); 52 | // 一次性写出内容,使用默认样式,强制输出标题 53 | bigWriter.write(projects, true); 54 | 55 | //response为HttpServletResponse对象 56 | //response.setContentType("application/vnd.ms-excel;charset=utf-8"); 57 | response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); 58 | //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码 59 | response.setHeader("Content-Disposition", "attachment;filename=" + new String((fileName + ".xlsx").getBytes(), "iso-8859-1")); 60 | ServletOutputStream out = null; 61 | try { 62 | out = response.getOutputStream(); 63 | bigWriter.flush(out, true); 64 | } catch (IOException e) { 65 | e.printStackTrace(); 66 | } finally { 67 | bigWriter.close(); 68 | } 69 | IoUtil.close(out); 70 | 71 | } 72 | 73 | 74 | /** 75 | * excel导入工具类 76 | * 77 | * @param file 文件 78 | * @param columNames 列对应的字段名 79 | * @return 返回数据集合 80 | * @throws OperationException 81 | * @throws IOException 82 | 83 | public static List> leading(MultipartFile file, String[] columNames) throws OperationException, IOException { 84 | String fileName = file.getOriginalFilename(); 85 | // 上传文件为空 86 | if (StringUtils.isEmpty(fileName)) { 87 | //throw new OperationException(ReturnCodeEnum.OPERATION_EXCEL_ERROR, "没有导入文件"); 88 | } 89 | //上传文件大小为1000条数据 90 | if (file.getSize() > 1024 * 1024 * 10) { 91 | logger.error("upload | 上传失败: 文件大小超过10M,文件大小为:{}", file.getSize()); 92 | //throw new OperationException(ReturnCodeEnum.OPERATION_EXCEL_ERROR, "上传失败: 文件大小不能超过10M!"); 93 | } 94 | // 上传文件名格式不正确 95 | if (fileName.lastIndexOf(".") != -1 && !".xlsx".equals(fileName.substring(fileName.lastIndexOf(".")))) { 96 | //throw new OperationException(ReturnCodeEnum.OPERATION_EXCEL_ERROR, "文件名格式不正确, 请使用后缀名为.XLSX的文件"); 97 | } 98 | 99 | //读取数据 100 | // ExcelUtil.read07BySax(file.getInputStream(), 0, createRowHandler()); 101 | //去除excel中的第一行数据 102 | lineList.remove(0); 103 | 104 | //将数据封装到list中 105 | List> dataList = new ArrayList<>(); 106 | for (int i = 0; i < lineList.size(); i++) { 107 | if (null != lineList.get(i)) { 108 | Map hashMap = new HashMap<>(); 109 | for (int j = 0; j < columNames.length; j++) { 110 | Object property = lineList.get(i).get(j); 111 | hashMap.put(columNames[j], property); 112 | } 113 | dataList.add(hashMap); 114 | } else { 115 | break; 116 | } 117 | } 118 | return dataList; 119 | } 120 | */ 121 | 122 | } 123 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/service/impl/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.service.impl; 2 | 3 | import com.ding.books.mapper.UserMapper; 4 | import com.ding.books.model.dto.AddUserRequest; 5 | import com.ding.books.model.dto.EditUserRequest; 6 | import com.ding.books.model.entity.User; 7 | import com.ding.books.service.UserService; 8 | import com.ding.books.utils.CommonUtils; 9 | import com.ding.books.utils.JWTUtils; 10 | import com.ding.books.utils.PageResult; 11 | import com.ding.books.utils.QueryPageBean; 12 | import com.github.pagehelper.Page; 13 | import com.github.pagehelper.PageHelper; 14 | import org.apache.log4j.Logger; 15 | import org.springframework.beans.BeanUtils; 16 | import org.springframework.beans.factory.annotation.Autowired; 17 | import org.springframework.stereotype.Service; 18 | import org.springframework.transaction.annotation.Transactional; 19 | 20 | import java.util.List; 21 | 22 | /** 23 | * @Description TODO 24 | * @Author 丁帅帅 25 | * @Date 21/12/11 16:23 26 | * @Version 1.0 27 | */ 28 | @Transactional 29 | @Service 30 | 31 | public class UserServiceImpl implements UserService { 32 | 33 | @Autowired 34 | private UserMapper userMapper; 35 | 36 | private static Logger logger = Logger.getLogger(UserServiceImpl.class); 37 | 38 | @Override 39 | public int addUser(AddUserRequest addUserRequest) { 40 | 41 | 42 | //User user = new User(addUserRequest.getUsername(),CommonUtils.MD5(addUserRequest.getPassword()),addUserRequest.getSex(),addUserRequest.getPhone(),addUserRequest.getCity()); 43 | User user = new User(); 44 | addUserRequest.setPassword(CommonUtils.MD5(addUserRequest.getPassword())); 45 | BeanUtils.copyProperties(addUserRequest,user); 46 | return userMapper.insert(user); 47 | } 48 | 49 | @Override 50 | public int deleteUser(Integer id) { 51 | return userMapper.deleteById(id); 52 | } 53 | 54 | @Override 55 | public int UpdateUser(EditUserRequest editUserRequest) { 56 | 57 | //User user = new User(editUserRequest.getId(),editUserRequest.getUsername(),,editUserRequest.getSex(),editUserRequest.getPhone(),editUserRequest.getCity()); 58 | User user = new User(); 59 | BeanUtils.copyProperties(editUserRequest,user); 60 | return userMapper.updateById(user); 61 | } 62 | 63 | @Override 64 | public User findOneUser(Integer id) { 65 | return userMapper.selectById(id); 66 | } 67 | 68 | @Override 69 | public PageResult pageQuery(QueryPageBean queryPageBean) { 70 | Integer currentPage = queryPageBean.getCurrentPage(); 71 | Integer pageSize = queryPageBean.getPageSize(); 72 | String queryString = queryPageBean.getQueryString();//查询条件 73 | //完成分页查询,基于mybatis框架提供的分页助手插件完成 74 | PageHelper.startPage(currentPage,pageSize); 75 | //select * from books limit 0,10 76 | Page page = userMapper.selectByCondition(queryString); 77 | long total = page.getTotal(); 78 | List rows = page.getResult(); 79 | return new PageResult(total,rows); 80 | } 81 | 82 | @Override 83 | public List findAll() { 84 | 85 | return userMapper.selectList(null); 86 | } 87 | 88 | @Override 89 | public String findByPhoneAndPwd(String username, String password) { 90 | 91 | User user = userMapper.findByPhoneAndPwd(username, CommonUtils.MD5(password)); 92 | if(user == null){ 93 | return null; 94 | 95 | }else { 96 | String token = JWTUtils.geneJsonWebToken(user); 97 | return token; 98 | } 99 | 100 | } 101 | 102 | 103 | @Override 104 | public Integer findByUsername(String username) { 105 | /* if (userMapper.findByUsername(username)==0 || (Integer)userMapper.findByUsername(username)==null) { 106 | return 0; 107 | }*/ 108 | logger.info("userMapper.findByUsername(username)---->"+userMapper.findByUsername(username)); 109 | //System.out.println("111111+>>>>>>>>"+userMapper.findByUsername(username)); 110 | return userMapper.findByUsername(username); 111 | 112 | } 113 | 114 | @Override 115 | public User queryAllByUsername(String username) { 116 | return userMapper.queryAllByUsername(username); 117 | } 118 | 119 | @Override 120 | public int addQQUser(User user) { 121 | 122 | 123 | // addUserRequest.setPassword(CommonUtils.MD5(addUserRequest.getPassword())); 124 | // BeanUtils.copyProperties(addUserRequest,user); 125 | return userMapper.insert(user); 126 | } 127 | 128 | @Override 129 | public User findByOpenid(String openId) { 130 | return userMapper.findByOpenid(openId); 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/service/impl/LendServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.service.impl; 2 | 3 | import cn.hutool.core.date.DateUtil; 4 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 5 | import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; 6 | import com.ding.books.mapper.BookMapper; 7 | import com.ding.books.mapper.LendMapper; 8 | import com.ding.books.mapper.UserMapper; 9 | import com.ding.books.model.dto.LendBook; 10 | import com.ding.books.model.dto.QueryPageBeanUsername; 11 | import com.ding.books.model.entity.Book; 12 | import com.ding.books.model.entity.LendRecord; 13 | import com.ding.books.model.entity.User; 14 | import com.ding.books.service.BookService; 15 | import com.ding.books.service.LendService; 16 | import com.ding.books.utils.PageResult; 17 | import com.ding.books.utils.QueryPageBean; 18 | import com.github.pagehelper.Page; 19 | import com.github.pagehelper.PageHelper; 20 | import lombok.extern.slf4j.Slf4j; 21 | import org.springframework.beans.factory.annotation.Autowired; 22 | import org.springframework.stereotype.Service; 23 | import org.springframework.transaction.annotation.Transactional; 24 | 25 | import java.util.Date; 26 | import java.util.List; 27 | 28 | /** 29 | * @Description TODO 30 | * @Author 丁帅帅 31 | * @Date 21/12/19 17:48 32 | * @Version 1.0 33 | */ 34 | @Transactional 35 | @Service 36 | @Slf4j 37 | public class LendServiceImpl implements LendService { 38 | 39 | @Autowired 40 | private LendMapper lendMapper; 41 | @Autowired 42 | private BookMapper bookMapper; 43 | @Autowired 44 | private BookService bookService; 45 | 46 | @Autowired 47 | private UserMapper userMapper; 48 | 49 | 50 | 51 | @Override 52 | public PageResult pageQuery(QueryPageBean queryPageBean) { 53 | Integer currentPage = queryPageBean.getCurrentPage(); 54 | Integer pageSize = queryPageBean.getPageSize(); 55 | String queryString = queryPageBean.getQueryString();//查询条件 56 | 57 | //完成分页查询,基于mybatis框架提供的分页助手插件完成 58 | PageHelper.startPage(currentPage,pageSize); 59 | //select * from books limit 0,10 60 | Page page = lendMapper.selectByCondition(queryString); 61 | long total = page.getTotal(); 62 | List rows = page.getResult(); 63 | 64 | return new PageResult(total,rows); 65 | } 66 | 67 | @Override 68 | public void deleteLend(Integer lendid) { 69 | int i = lendMapper.deleteById(lendid); 70 | } 71 | 72 | @Override 73 | public LendRecord findLendById(Integer lendid) { 74 | 75 | LendRecord lendRecord = lendMapper.selectById(lendid); 76 | return lendRecord; 77 | } 78 | 79 | @Override 80 | public void back(Integer lendid) { 81 | 82 | LendRecord lendRecord = findLendById(lendid); 83 | 84 | Book book = bookService.findBookById(lendRecord.getBookid()); 85 | book.setNumber(book.getNumber()+1); 86 | bookMapper.update(book, new UpdateWrapper().eq("bookid", lendRecord.getBookid())); 87 | //int i=1/0; 88 | 89 | int q = lendMapper.deleteById(lendid); 90 | } 91 | 92 | @Override 93 | public List findAll() { 94 | List lendRecords = lendMapper.selectList(null); 95 | 96 | return lendRecords; 97 | } 98 | 99 | @Override 100 | public PageResult pageQueryUser(QueryPageBeanUsername queryPageBean) { 101 | Integer currentPage = queryPageBean.getCurrentPage(); 102 | Integer pageSize = queryPageBean.getPageSize(); 103 | String queryString = queryPageBean.getBookname();//查询条件 104 | String username = queryPageBean.getUsername(); 105 | User user = userMapper.selectOne(new QueryWrapper().eq("username", username)); 106 | //System.out.println(username); 107 | //System.out.println("------->"+user.getId()); 108 | //System.out.println("------->"+queryString); 109 | //完成分页查询,基于mybatis框架提供的分页助手插件完成 110 | PageHelper.startPage(currentPage,pageSize); 111 | //select * from books limit 0,10 112 | Page page = lendMapper.selectByConditionUser(user.getId(),queryString); 113 | long total = page.getTotal(); 114 | List rows = page.getResult(); 115 | /* System.out.println("========="+total); 116 | System.out.println("+++++++++"+rows.size()); 117 | for (LendBook row : rows) { 118 | System.out.println(row.toString()); 119 | }*/ 120 | return new PageResult(total,rows); 121 | } 122 | 123 | @Override 124 | public int addLendRecord(Integer bookid, Integer userid) { 125 | LendRecord lendRecord = new LendRecord(); 126 | Date date = new Date(); 127 | lendRecord.setLenddate(date); 128 | lendRecord.setNumber(1); 129 | lendRecord.setBookid(bookid); 130 | lendRecord.setUserid(userid); 131 | lendRecord.setBackdate(DateUtil.offsetMonth(date,1)); 132 | int insert = lendMapper.insert(lendRecord); 133 | 134 | return insert; 135 | } 136 | 137 | @Override 138 | public List findLendByBookid(Integer bookid) { 139 | 140 | List lendByBookid = lendMapper.findLendByBookid(bookid); 141 | return lendByBookid; 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/controller/LoginController.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.controller; 2 | 3 | 4 | import com.alibaba.fastjson.JSON; 5 | import com.alibaba.fastjson.JSONObject; 6 | import com.ding.books.model.entity.User; 7 | import com.ding.books.service.UserService; 8 | import com.ding.books.utils.JWTUtils; 9 | import com.ding.books.utils.QqHttpClient; 10 | import lombok.extern.slf4j.Slf4j; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.beans.factory.annotation.Value; 13 | import org.springframework.stereotype.Controller; 14 | import org.springframework.ui.Model; 15 | import org.springframework.web.bind.annotation.GetMapping; 16 | 17 | import javax.servlet.http.HttpServletRequest; 18 | import javax.servlet.http.HttpServletResponse; 19 | import javax.servlet.http.HttpSession; 20 | import java.net.URLEncoder; 21 | import java.util.HashMap; 22 | import java.util.Map; 23 | import java.util.UUID; 24 | @Slf4j 25 | @Controller 26 | public class LoginController { 27 | 28 | 29 | @Autowired 30 | private UserService userService; 31 | 32 | /** 33 | * QQ互联中提供的 appid 和 appkey 34 | */ 35 | @Value("${qq.oauth.appid}") 36 | public String APPID; 37 | @Value("${qq.oauth.appkey}") 38 | public String APPKEY; 39 | @Value("${qq.oauth.url}") 40 | public String URL; 41 | 42 | 43 | 44 | 45 | /** 46 | * 请求授权页面 47 | */ 48 | @GetMapping(value = "/LoginByQQ") 49 | public String qqAuth(HttpSession session) { 50 | // 用于第三方应用防止CSRF攻击 51 | String uuid = UUID.randomUUID().toString().replaceAll("-", ""); 52 | session.setAttribute("state", uuid); 53 | 54 | // Step1:获取Authorization Code 55 | String url = "https://graph.qq.com/oauth2.0/authorize?response_type=code" + 56 | "&client_id=" + APPID + 57 | "&redirect_uri=" + URLEncoder.encode(URL) + 58 | "&state=" + uuid; 59 | 60 | return "redirect:"+url; 61 | } 62 | 63 | 64 | /** 65 | * 授权回调 66 | */ 67 | @GetMapping(value = "/qq/callback") 68 | public String qqCallback(HttpServletRequest request, HashMap map, Model model, HttpServletResponse response) throws Exception { 69 | HttpSession session = request.getSession(); 70 | // 得到Authorization Code 71 | String code = request.getParameter("code"); 72 | // 我们放在地址中的状态码 73 | String state = request.getParameter("state"); 74 | // 验证信息 75 | String uuid = (String) session.getAttribute("state"); 76 | 77 | // 验证信息我们发送的状态码 78 | if (null != uuid) { 79 | // 状态码不正确,直接返回登录页面 80 | if (!uuid.equals(state)) { 81 | return "index"; 82 | } 83 | } 84 | 85 | // Step2:通过Authorization Code获取Access Token 86 | String url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code" + 87 | "&client_id=" + APPID + 88 | "&client_secret=" + APPKEY + 89 | "&code=" + code + 90 | "&redirect_uri=" + URL; 91 | String access_token = QqHttpClient.getAccessToken(url); 92 | 93 | // Step3: 获取回调后的openID 94 | url = "https://graph.qq.com/oauth2.0/me?access_token=" + access_token; 95 | String openId = QqHttpClient.getOpenID(url); 96 | 97 | // Step4:获取QQ用户信息 98 | url = "https://graph.qq.com/user/get_user_info?access_token=" + access_token + 99 | "&oauth_consumer_key=" + APPID + 100 | "&openid=" + openId; 101 | 102 | // 得到用户信息 103 | JSONObject object = null; 104 | object = QqHttpClient.getUserInfo(url); 105 | /** 106 | * 获取到用户信息之后,就该写你自己的业务逻辑了 107 | */ 108 | Map map1 = JSON.parseObject(String.valueOf(object)); 109 | //System.out.println("这个是用JSON类的parseObject来解析JSON字符/串!!!"); 110 | /* for (Object obj : map1.keySet()){ 111 | System.out.println("key为:"+obj+"值为:"+map1.get(obj)); 112 | 113 | }*/ 114 | //map.put("nickname",map1.get("nickname")); 115 | User user = null; 116 | log.info("openid{}"+openId); 117 | if (openId!=null){ 118 | User dbUser = userService.findByOpenid(openId); 119 | if (dbUser != null) { 120 | user = new User(openId,map1.get("nickname"), map1.get("gender"), map1.get("city"), map1.get("figureurl_1")); 121 | //userService.UpdateQQUser(user);\ 122 | String token = JWTUtils.geneJsonWebToken(user); 123 | session.setAttribute("token",token); 124 | response.sendRedirect("http://ding99.top/pages/main_user.html?username="+URLEncoder.encode(user.getUsername(),"UTF-8")+"&head_img="+user.getHead_img()); 125 | 126 | }else { 127 | user = new User(openId,map1.get("nickname"), map1.get("gender"), map1.get("city"), map1.get("figureurl_1")); 128 | String token = JWTUtils.geneJsonWebToken(user); 129 | session.setAttribute("token",token); 130 | userService.addQQUser(user); 131 | response.sendRedirect("http://ding99.top/pages/main_user.html?username="+URLEncoder.encode(user.getUsername(),"UTF-8")+"&head_img="+user.getHead_img()); 132 | 133 | } 134 | } /*else { 135 | user = new User(openId,map1.get("nickname"), map1.get("gender"), map1.get("city"), map1.get("figureurl_qq_1")); 136 | userService.addQQUser(user); 137 | response.sendRedirect("http://ding99.top/pages/main_user.html?username="+URLEncoder.encode(user.getUsername(),"UTF-8")+"&head_img="+user.getHead_img()); 138 | 139 | }*/ 140 | 141 | 142 | 143 | // response.sendRedirect("AfterLogin.html"); 144 | //response.sendRedirect("http://ding99.top/AfterLogin.html"); 145 | 146 | // return "AfterLogin"; 147 | return null; 148 | } 149 | 150 | 151 | 152 | } 153 | -------------------------------------------------------------------------------- /src/main/resources/static/css/verify.css: -------------------------------------------------------------------------------- 1 | /*常规验证码*/ 2 | .verify-code { 3 | font-size: 20px; 4 | text-align: center; 5 | cursor: pointer; 6 | margin-bottom: 5px; 7 | border: 1px solid #ddd; 8 | } 9 | 10 | .cerify-code-panel { 11 | height:100%; 12 | overflow:hidden; 13 | } 14 | 15 | .verify-code-area { 16 | float:left; 17 | } 18 | 19 | .verify-input-area { 20 | float: left; 21 | width: 60%; 22 | padding-right: 10px; 23 | 24 | } 25 | 26 | .verify-change-area { 27 | line-height: 30px; 28 | float: left; 29 | } 30 | 31 | .varify-input-code { 32 | display:inline-block; 33 | width: 100%; 34 | height: 25px; 35 | } 36 | 37 | .verify-change-code { 38 | color: #337AB7; 39 | cursor: pointer; 40 | } 41 | 42 | .verify-btn { 43 | width: 200px; 44 | height: 30px; 45 | background-color: #337AB7; 46 | color:#FFFFFF; 47 | border:none; 48 | margin-top: 10px; 49 | } 50 | 51 | 52 | 53 | 54 | 55 | 56 | /*滑动验证码*/ 57 | .verify-bar-area { 58 | position: relative; 59 | background: #FFFFFF; 60 | text-align: center; 61 | -webkit-box-sizing: content-box; 62 | -moz-box-sizing: content-box; 63 | box-sizing: content-box; 64 | border: 1px solid #ddd; 65 | -webkit-border-radius: 4px; 66 | } 67 | 68 | .verify-bar-area .verify-move-block { 69 | position: absolute; 70 | top: 0px; 71 | left: 0; 72 | background: #fff; 73 | cursor: pointer; 74 | -webkit-box-sizing: content-box; 75 | -moz-box-sizing: content-box; 76 | box-sizing: content-box; 77 | box-shadow: 0 0 2px #888888; 78 | -webkit-border-radius: 1px; 79 | } 80 | 81 | .verify-bar-area .verify-move-block:hover { 82 | background-color: #337ab7; 83 | color: #FFFFFF; 84 | } 85 | 86 | .verify-bar-area .verify-left-bar { 87 | position: absolute; 88 | top: -1px; 89 | left: -1px; 90 | background: #f0fff0; 91 | cursor: pointer; 92 | -webkit-box-sizing: content-box; 93 | -moz-box-sizing: content-box; 94 | box-sizing: content-box; 95 | border: 1px solid #ddd; 96 | } 97 | 98 | .verify-img-panel { 99 | margin:0; 100 | -webkit-box-sizing: content-box; 101 | -moz-box-sizing: content-box; 102 | box-sizing: content-box; 103 | border: 1px solid #ddd; 104 | border-radius: 3px; 105 | position: relative; 106 | } 107 | 108 | .verify-img-panel .verify-refresh { 109 | width: 25px; 110 | height: 25px; 111 | text-align:center; 112 | padding: 5px; 113 | cursor: pointer; 114 | position: absolute; 115 | top: 0; 116 | right: 0; 117 | z-index: 2; 118 | } 119 | 120 | .verify-img-panel .icon-refresh { 121 | font-size: 20px; 122 | color: #fff; 123 | } 124 | 125 | .verify-img-panel .verify-gap { 126 | background-color: #fff; 127 | position: relative; 128 | z-index: 2; 129 | border:1px solid #fff; 130 | } 131 | 132 | .verify-bar-area .verify-move-block .verify-sub-block { 133 | position: absolute; 134 | text-align: center; 135 | z-index: 3; 136 | border: 1px solid #fff; 137 | } 138 | 139 | .verify-bar-area .verify-move-block .verify-icon { 140 | font-size: 18px; 141 | } 142 | 143 | .verify-bar-area .verify-msg { 144 | z-index : 3; 145 | } 146 | 147 | /*字体图标的css*/ 148 | @font-face {font-family: "iconfont"; 149 | src: url('../fonts/iconfont.eot?t=1508229193188'); /* IE9*/ 150 | src: url('../fonts/iconfont.eot?t=1508229193188#iefix') format('embedded-opentype'), /* IE6-IE8 */ 151 | url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAaAAAsAAAAACUwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFZW7kiSY21hcAAAAYAAAAB3AAABuM+qBlRnbHlmAAAB+AAAAnQAAALYnrUwT2hlYWQAAARsAAAALwAAADYPNwajaGhlYQAABJwAAAAcAAAAJAfeA4dobXR4AAAEuAAAABMAAAAYF+kAAGxvY2EAAATMAAAADgAAAA4CvAGsbWF4cAAABNwAAAAfAAAAIAEVAF1uYW1lAAAE/AAAAUUAAAJtPlT+fXBvc3QAAAZEAAAAPAAAAE3oPPXPeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2Bk/sM4gYGVgYOpk+kMAwNDP4RmfM1gxMjBwMDEwMrMgBUEpLmmMDgwVDxbwtzwv4EhhrmBoQEozAiSAwAw1A0UeJzFkcENgCAMRX8RjCGO4gTe9eQcnhzAfXC2rqG/hYsT8MmD9gdS0gJIAAaykAjIBYHppCvuD8juR6zMJ67A89Zdn/f1aNPikUn8RvYo8G20CjKim6Rf6b9m34+WWd/vBr+oW8V6q3vF5qKlYrPRp4L0Ad5nGL8AeJxFUc9rE0EYnTezu8lMsrvtbrqb3TRt0rS7bdOmdI0JbWmCtiItIv5oi14qevCk9SQVLFiQgqAF8Q9QLKIHLx48FkHo3ZNnFUXwD5C2B6dO6sFhmI83w7z3fe8RnZCjb2yX5YlLhskkmScXCIFRxYBFiyjH9Rqtoqes9/g5i8WVuJyqDNTYLPwBI+cljXrkGynDhoU+nCgnjbhGY5yst+gMEq8IBIXwsjPU67CnEPm4b0su0h309Fd67da4XBhr55KSm17POk7gOE/Shq6nKdVsC7d9j+tcGPKVboc9u/0jtB/ZIA7PXTVLBef6o/paccjnwOYm3ELJetPuDrvV3gg91wlSXWY6H5qVwRzWf2TybrYYfSdqoXOwh/Qa8RWIjBTiSI3h614/vKSNRhONOrsnQi6Xf4nQFQDTmJE1NKbhI6crHEJO/+S5QPxhYJRRyvBFBP+5T9EPpEAIVzzRQIrjmJ6jY1WTo+NXTMchuBsKuS8PRZATSMl9oTA4uNLkeIA0V1UeqOoGQh7IAxGo+7T83fn3T+voqCNPPAUazUYUI7LgKSV1Jk2oUeghYGhZ+cKOe2FjVu5ZKEY2VkE13AK1+jI4r1KLbPlZfrKiPhOXKPRj7q9sj9XJ7LFHNmrKJS3VCdhXGSdKrtmoQaWeMjQVt0KD6sGPOx0oH2fgtzoNROxtNq8F3tzYM/n+TjKSX5qf2jx941276TIr9FjXxKr8eX/6bK4yuopwo9py1sw8F9kdw4AmurRpLUM3tYx5ZnKpfHPi8dzz19vJ6MjyxYUrpqeb1uLs3eGV6vr21pSqpeWkqonAN9oUyIiXpv8XvlN5e3icY2BkYGAA4n0vN4fG89t8ZeBmYQCBa9wPPRH0/wcsDMwmQC4HAxNIFABAfAqaAHicY2BkYGBu+N/AEMPCAAJAkpEBFbABAEcMAm94nGNhYGBgfsnAwMKAigESnwEBAAAAAAAAdgCkANoBCAFsAAB4nGNgZGBgYGMIZGBlAAEmIOYCQgaG/2A+AwARSAFzAHicZY9NTsMwEIVf+gekEqqoYIfkBWIBKP0Rq25YVGr3XXTfpk6bKokjx63UA3AejsAJOALcgDvwSCebNpbH37x5Y08A3OAHHo7fLfeRPVwyO3INF7gXrlN/EG6QX4SbaONVuEX9TdjHM6bCbXRheYPXuGL2hHdhDx18CNdwjU/hOvUv4Qb5W7iJO/wKt9Dx6sI+5l5XuI1HL/bHVi+cXqnlQcWhySKTOb+CmV7vkoWt0uqca1vEJlODoF9JU51pW91T7NdD5yIVWZOqCas6SYzKrdnq0AUb5/JRrxeJHoQm5Vhj/rbGAo5xBYUlDowxQhhkiMro6DtVZvSvsUPCXntWPc3ndFsU1P9zhQEC9M9cU7qy0nk6T4E9XxtSdXQrbsuelDSRXs1JErJCXta2VELqATZlV44RelzRiT8oZ0j/AAlabsgAAAB4nGNgYoAALgbsgI2RiZGZkYWRlZGNkZ2BsYI1OSM1OZs1OSe/OJW1KDM9o4S9KDWtKLU4g4EBAJ79CeQ=') format('woff'), 152 | url('../fonts/iconfont.ttf?t=1508229193188') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ 153 | url('../fonts/iconfont.svg?t=1508229193188#iconfont') format('svg'); /* iOS 4.1- */ 154 | } 155 | 156 | .iconfont { 157 | font-family:"iconfont" !important; 158 | font-size:16px; 159 | font-style:normal; 160 | -webkit-font-smoothing: antialiased; 161 | -moz-osx-font-smoothing: grayscale; 162 | } 163 | 164 | .icon-check:before { content: "\e645"; } 165 | 166 | .icon-close:before { content: "\e646"; } 167 | 168 | .icon-right:before { content: "\e6a3"; } 169 | 170 | .icon-refresh:before { content: "\e6a4"; } 171 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 2.5.2 9 | 10 | 11 | com.ding 12 | books 13 | 0.0.1-SNAPSHOT 14 | books 15 | Demo project for Spring Boot 16 | 17 | 1.8 18 | 19 | 20 | 21 | org.springframework.boot 22 | spring-boot-starter-web 23 | 24 | 25 | org.mybatis.spring.boot 26 | mybatis-spring-boot-starter 27 | 2.2.0 28 | 29 | 30 | 31 | mysql 32 | mysql-connector-java 33 | 34 | runtime 35 | 36 | 37 | org.projectlombok 38 | lombok 39 | true 40 | 41 | 42 | org.springframework.boot 43 | spring-boot-starter-test 44 | test 45 | 46 | 47 | 48 | com.alibaba 49 | druid 50 | 1.1.16 51 | 52 | 53 | 54 | org.springframework.boot 55 | spring-boot-starter-thymeleaf 56 | 57 | 58 | 59 | 60 | com.github.pagehelper 61 | pagehelper-spring-boot-starter 62 | 1.4.1 63 | 64 | 65 | 66 | 67 | org.springframework.boot 68 | spring-boot-starter 69 | 70 | 71 | org.springframework.boot 72 | spring-boot-starter-logging 73 | 74 | 75 | 76 | 77 | org.springframework.boot 78 | spring-boot-starter-log4j 79 | 1.3.8.RELEASE 80 | 81 | 82 | 83 | 84 | 85 | io.jsonwebtoken 86 | jjwt 87 | 0.7.0 88 | 89 | 90 | 91 | 92 | com.baomidou 93 | mybatis-plus-boot-starter 94 | 3.4.3.1 95 | 96 | 97 | 98 | 99 | 100 | 101 | cn.hutool 102 | hutool-all 103 | 5.7.16 104 | 105 | 106 | 110 | 111 | 112 | org.apache.poi 113 | poi-ooxml 114 | 4.1.2 115 | 116 | 117 | org.apache.poi 118 | poi-ooxml-schemas 119 | 4.1.2 120 | 121 | 122 | 123 | 124 | org.springframework.boot 125 | spring-boot-devtools 126 | true 127 | 128 | 129 | 130 | 131 | org.apache.httpcomponents 132 | httpclient 133 | 4.5.3 134 | 135 | 136 | org.apache.httpcomponents 137 | httpcore 138 | 4.4.6 139 | 140 | 141 | 142 | com.alibaba 143 | fastjson 144 | 1.2.58 145 | 146 | 147 | 148 | net.gplatform 149 | Sdk4J 150 | 2.0 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | org.springframework.boot 159 | spring-boot-maven-plugin 160 | 161 | true 162 | true 163 | 164 | 165 | 166 | org.projectlombok 167 | lombok 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 图书管理系统 2 | 3 | 4 | 5 | ## 1. 开发目的 6 | 7 | 实现图书的智能化、信息化和简单化;实现图书信息的增加、删除、修改、查找、借阅、还书、收藏的显示操作及实时数据库的提交和更改和对普通用户的增、删、改、查;提高图书管理员工作信息报送及反馈的工作效率,减轻管理员的劳动负担;提高信息的及时性和汇总统计信息的准确性。 8 | 9 | ## 2. 主要技术 10 | 11 | | 后端技术 | 说明 | 12 | | ------------ | ------------------------ | 13 | | SpringBoot | 容器+MVC框架 | 14 | | MyBatis | ORM框架 | 15 | | MyBatis-Plus | ORM框架,增强对单表的操作 | 16 | | PageHelper | MyBatis物理分页插件 | 17 | | Druid | 数据库连接池 | 18 | | Lombok | 简化对象封装工具 | 19 | | Hutool | Java工具类库 | 20 | | JWT | JWT登录支持 | 21 | 22 | | 前端技术 | 说明 | 23 | | -------- | ------------ | 24 | | Vue | 前端框架 | 25 | | Element | 前端UI框架 | 26 | | Axios | 前端HTTP框架 | 27 | | Echarts | 图表框架 | 28 | 29 | 30 | 31 | ## 3. 功能介绍 32 | 33 | 1. **运行** `java -jar books-0.0.1-SNAPSHOT.jar` 34 | 2. **访问**[http://localhost:9999](http://localhost:9999/) 35 | 3. **默认管理员账号/密码** admin/admin (其他用户可自行注册) 36 | 4. **项目已部署**[点击访问(ding99.top)](http://baidu.com/) 37 | 38 | 主要功能:验证码,模糊查询,分页查询,多表联合查询,文件上传,Excel文件导出,管理员对图书,用户进行增删改查,普通用户进行收藏,借阅及取消收藏,借阅,拦截器,日志集成,密码均采用了MD5加密,图形报表. 39 | 40 | ### 3.1 登录界面 41 | 42 | > 实现了验证码和前端初步判定用户名和密码是否合法 43 | 44 | ![image-20211225204042263](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225204042263.png) 45 | 46 | 47 | 48 | ### 3.2 注册页面 49 | 50 | > 实现了对用户信息,手机号,密码的初步检验 51 | 52 | ![image-20211225205030977](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225205030977.png) 53 | 54 | 55 | 56 | ![image-20211225205228978](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225205228978.png) 57 | 58 | 59 | 60 | ### 3.3 普通用户操作界面 61 | 62 | > 普通用户可进行图书管理,借还管理,收藏管理和密码修改,默认首页是图书的借阅排行 63 | 64 | ![image-20211225215952758](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225215952758.png) 65 | 66 | 67 | 68 | ### 3.4 图书管理 69 | 70 | #### 3.4.1 图书列表 71 | 72 | > 普通用户可模糊查询图书,新建图书,导出图书,对图书进行借阅,收藏 73 | 74 | ![image-20211225220310001](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225220310001.png) 75 | 76 | 1. 模糊查询图书 77 | 78 | ![image-20211225220541968](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225220541968.png) 79 | 80 | 2. 新建图书 81 | 82 | ![image-20211225221402963](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225221402963.png) 83 | 84 | 85 | 86 | 3. 导出 87 | 88 | ![image-20211225221513647](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225221513647.png) 89 | 90 | 91 | 92 | ![image-20211225221543773](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225221543773.png) 93 | 94 | 95 | 96 | ![image-20211225221644131](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225221644131.png) 97 | 98 | 4. 借阅 99 | 100 | ![image-20211225221749201](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225221749201.png) 101 | 102 | 5. 收藏 103 | 104 | > 被收藏后的图书,会收藏失败 105 | 106 | ![image-20211225221821391](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225221821391.png) 107 | 108 | #### 3.4.2 分类信息 109 | 110 | > 支持分类信息模糊查询,导出和分页查询 111 | 112 | ![image-20211225222014890](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225222014890.png) 113 | 114 | #### 3.4.3 借阅数量 115 | 116 | > 实现数据可视化 117 | 118 | ![image-20211225222113198](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225222113198.png) 119 | 120 | ### 3.5 借还管理 121 | 122 | > 支持图书模糊查询,导出借还记录,图书归还,分页查询,用户只能看见自己的借还记录 123 | 124 | ![image-20211225222322669](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225222322669.png) 125 | 126 | ### 3.6 收藏管理 127 | 128 | > 支持图书模糊查询,导出收藏记录,图书取消收藏,分页查询,用户只能看见自己的收藏记录 129 | 130 | ![image-20211225222420033](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225222420033.png) 131 | 132 | ### 3.7 其他 133 | 134 | #### 3.7.1 地图 135 | 136 | > 引用百度地图api 137 | 138 | ![image-20211225222601594](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225222601594.png) 139 | 140 | #### 3.4.2 读者分布 141 | 142 | > 实现可数据可视化 143 | 144 | ![image-20211225222703411](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225222703411.png) 145 | 146 | ### 3.7 修改密码 147 | 148 | ![image-20211225222735878](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225222735878.png) 149 | 150 | > 实现密码加密存储,前端初步验证 151 | 152 | ![image-20211225222802178](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225222802178.png) 153 | 154 | 155 | 156 | ### 3.8 管理员界面 157 | 158 | > 读者分布 159 | 160 | ![image-20211225232231713](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225232231713.png) 161 | 162 | ### 3.9 读者档案 163 | 164 | > 支持读者名称模糊查询,分页查询,导出读者列表,增加,编辑和删除读者 165 | 166 | ![image-20211225232449604](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225232449604.png) 167 | 168 | 1. 增加读者 169 | 170 | ![image-20211225232647729](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225232647729.png) 171 | 172 | 2. 编辑读者 173 | 174 | > 支持数据回显 175 | 176 | ![image-20211225232744619](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225232744619.png) 177 | 178 | 3. 删除读者 179 | 180 | ![image-20211225232830362](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225232830362.png) 181 | 182 | ### 3.10 图书管理 183 | 184 | > 相对普通用户来说,管理员页面增加了对图书的编辑和删除 185 | 186 | 1. 编辑图书 187 | 188 | > 支持数据回显 189 | 190 | ![image-20211225233033811](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225233033811.png) 191 | 192 | ### 3.11 借还管理 193 | 194 | > 实现了对不同用户借书情况的查询,删除和归还,支持借还记录导出,分页查询 195 | 196 | ![image-20211225233244396](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225233244396.png) 197 | 198 | ### 3.12 收藏管理 199 | 200 | > 支持查看不同用户的图书收藏情况,支持收藏记录导出 201 | 202 | ![image-20211225233347318](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225233347318.png) 203 | 204 | ### 3.13 拦截器功能 205 | 206 | > 用户未登录就访问页面时,会进行拦截并跳转到登录页面 207 | 208 | ![image-20211225233645710](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225233645710.png) 209 | 210 | ## 4. 项目结构 211 | 212 | ### 4.1 数据库结构 213 | 214 | ![image-20211225233841756](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225233841756.png) 215 | 216 | | 表名 | 作用 | 217 | | ------------- | -------- | 218 | | book | 图书 | 219 | | user | 用户 | 220 | | lendrecord | 借阅记录 | 221 | | classinfo | 分类信息 | 222 | | collectrecord | 收藏信息 | 223 | 224 | ### 4.2 项目结构 225 | 226 | ![image-20211225234229246](%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E.assets/image-20211225234229246.png) 227 | 228 | > 前后端交互全部采用JSON数据交互 229 | 230 | -------------------------------------------------------------------------------- /src/main/resources/static/css/orderset.css: -------------------------------------------------------------------------------- 1 | .ordersetting .el-input__inner { 2 | height: 36px; 3 | line-height: 36px; 4 | } 5 | .ordersetting { 6 | background: #f5f5f5; 7 | box-shadow: none; 8 | border-top: none; 9 | } 10 | .gotoday { 11 | border: 1px solid #d5d9df 12 | } 13 | .calendar p { 14 | margin: 0; 15 | } 16 | .filebtn { 17 | padding: 9px 20px; 18 | border: none; 19 | font-size: 18px; 20 | background: #0ebffc; 21 | } 22 | .month { 23 | width: 100%; 24 | line-height: 3; 25 | /* background: #00B8EC; */ 26 | } 27 | 28 | .month ul { 29 | margin: 0; 30 | padding: 0; 31 | display: flex; 32 | } 33 | 34 | .year-month { 35 | display: flex; 36 | flex-direction: column; 37 | align-items: center; 38 | justify-content: space-around; 39 | } 40 | 41 | .year-month:hover { 42 | background: rgba(150, 2, 12, 0.1); 43 | } 44 | 45 | .choose-year { 46 | padding-left: 20px; 47 | font-size: 1.2rem; 48 | } 49 | 50 | .choose-month { 51 | text-align: center; 52 | font-size: 1.2rem; 53 | } 54 | 55 | .arrow { 56 | padding: 30px; 57 | } 58 | 59 | .arrow:hover { 60 | background: rgba(100, 2, 12, 0.1); 61 | } 62 | 63 | .month ul li { 64 | color: white; 65 | font-size: 20px; 66 | text-transform: uppercase; 67 | letter-spacing: 3px; 68 | } 69 | .caldate { 70 | box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.1), 0 1px 5px 0 rgba(0, 0, 0, 0.12); 71 | } 72 | .weekdays { 73 | margin: 0; 74 | padding: 0; 75 | background-color: #fff; 76 | display: flex; 77 | flex-wrap: wrap; 78 | color: #333; 79 | justify-content: space-around; 80 | border-bottom: 1px solid #ededed; 81 | border-top: 2px solid #0ebffc; 82 | } 83 | 84 | .weekdays li { 85 | display: inline-block; 86 | width: 14%; 87 | text-align: center; 88 | padding: 10px 0; 89 | border-right: 1px solid #f1efef; 90 | color: #000; 91 | font-size: 20px; 92 | 93 | } 94 | 95 | .days { 96 | padding: 0; 97 | margin: 0; 98 | display: flex; 99 | flex-wrap: wrap; 100 | justify-content: space-around; 101 | 102 | } 103 | 104 | .days li { 105 | height: 160px; 106 | list-style-type: none; 107 | display: inline-block; 108 | width: 14%; 109 | text-align: right; 110 | font-size: 1rem; 111 | color: #000; 112 | list-style-type: none; 113 | display: inline-block; 114 | width: 14.2%; 115 | font-size: 1rem; 116 | color: #000; 117 | border-bottom: 1px solid #fff; 118 | } 119 | .everyday { 120 | height: 160px; 121 | border-bottom: 1px solid #f1efefef; 122 | position: relative; 123 | background: #fff; 124 | } 125 | .everyday .datenumber { 126 | position: absolute; 127 | right: 10px; 128 | top: 10px; 129 | } 130 | .everyday .usual { 131 | height: 100%; 132 | background: #1ed7fc; 133 | text-align: center; 134 | color: #fff; 135 | display: flex; 136 | flex-direction: column; 137 | justify-content: center; 138 | font-size: 20px; 139 | line-height: 1.5; 140 | } 141 | .everyday .fulled { 142 | height: 100%; 143 | background: #ff9c9d; 144 | text-align: center; 145 | color: #fff; 146 | display: flex; 147 | flex-direction: column; 148 | justify-content: center; 149 | font-size: 20px; 150 | } 151 | .everyday .nochoose { 152 | height: 100%; 153 | background: #effbff; 154 | } 155 | .everyday .orderbtn { 156 | position: absolute; 157 | right: 10px; 158 | bottom: 10px; 159 | cursor: pointer; 160 | border: none; 161 | background: #d6ffff; 162 | padding: 3px 10px; 163 | color: #0ebffc; 164 | border-radius: 4px; 165 | font-size: 16px; 166 | } 167 | .days li .active { 168 | padding: 6px 10px; 169 | border-radius: 50%; 170 | background: #00B8EC; 171 | color: #fff; 172 | } 173 | 174 | .days li .other-month { 175 | padding: 10px; 176 | height: 140px; 177 | color: gainsboro; 178 | background: #f9f9f9; 179 | } 180 | 181 | /* .singlebtn { 182 | font-size: 18px; 183 | } 184 | .mutiplebtn { 185 | font-size: 18px; 186 | } */ 187 | 188 | 189 | 190 | .filebox { 191 | position: relative; 192 | } 193 | .el-card__body { 194 | position: relative; 195 | } 196 | .el-upload--text { 197 | position: absolute; 198 | left: 22%; 199 | top: 14px; 200 | } 201 | .el-upload--text .el-button { 202 | background: #0ebffc; 203 | border: none 204 | } 205 | 206 | .el-upload-list { 207 | width: 20%; 208 | } 209 | .filebtns { 210 | position: relative 211 | } 212 | .multifile { 213 | width: 100%; 214 | } 215 | .mutibtn { 216 | position: absolute; 217 | left: 12%; 218 | top: 0; 219 | } 220 | .uploadfile{ 221 | padding: 4px 10px; 222 | height: 20px; 223 | line-height: 20px; 224 | position: relative; 225 | border: 1px solid #999; 226 | text-decoration: none; 227 | color: #666; 228 | } 229 | .change{ 230 | position: absolute; 231 | overflow: hidden; 232 | right: 0; 233 | top: 0; 234 | opacity: 0; 235 | } 236 | .singleuploaded { 237 | 238 | } 239 | .mutiuploaded { 240 | left: 31.5%; 241 | } 242 | .outputloaded { 243 | left: 43%; 244 | } 245 | .inputfile-text { 246 | height: 33px; 247 | width: 233px; 248 | display: inline-block; 249 | border: 1px solid #ccc; 250 | line-height: 36px; 251 | border-radius: 7px; 252 | cursor: pointer; 253 | } 254 | .inputfile-text span { 255 | padding-left: 11px; 256 | color: #aba7a7; 257 | } 258 | 259 | .days li .current-month .full { 260 | background: #ff8a8a; 261 | text-align: center; 262 | line-height: 100px; 263 | color: #fff; 264 | 265 | } 266 | 267 | .days li .current-month .full .full-text { 268 | font-size: 26px; 269 | } 270 | 271 | .clearfix {clear: both} 272 | .month .currentdate { float: left} 273 | .month .choose { 274 | float: right; 275 | line-height: 57px; 276 | padding-right: 30px; 277 | color: #676767 278 | } 279 | .month .choose span { 280 | background: #fff; 281 | padding: 5px 10px; 282 | cursor: pointer; 283 | } 284 | 285 | /* upload */ 286 | .file { 287 | display: flex; 288 | width: 60px; 289 | height: 33px; 290 | overflow: hidden; 291 | border: 1px solid #ccc; 292 | width: 20%; 293 | margin-top: -4px; 294 | border-radius: 7px; 295 | position: relative; 296 | } 297 | .file .defaulttext { 298 | position: absolute; 299 | top: 5px; 300 | left: 10px; 301 | color: #bdbdbd; 302 | } 303 | .file input { 304 | width: 100%; 305 | height: 40px; 306 | position: relative; 307 | top: -10px; 308 | font-size: 0; 309 | opacity: 0; 310 | cursor: pointer; 311 | } 312 | .el-card__body #span { 313 | font-size: 14px; 314 | padding-left: 20px; 315 | color: #555; 316 | margin-top: 10px; 317 | display: block; 318 | width: 20%; 319 | } -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/controller/BookController.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.controller; 2 | 3 | import com.ding.books.model.dto.AddBook; 4 | import com.ding.books.model.dto.EditBook; 5 | import com.ding.books.model.entity.Book; 6 | import com.ding.books.model.entity.CollectRecord; 7 | import com.ding.books.model.entity.LendRecord; 8 | import com.ding.books.model.entity.User; 9 | import com.ding.books.model.vo.ExcelBook; 10 | import com.ding.books.service.BookService; 11 | import com.ding.books.service.CollectService; 12 | import com.ding.books.service.LendService; 13 | import com.ding.books.service.UserService; 14 | import com.ding.books.utils.*; 15 | import lombok.extern.slf4j.Slf4j; 16 | import org.springframework.beans.BeanUtils; 17 | import org.springframework.beans.factory.annotation.Autowired; 18 | import org.springframework.web.bind.annotation.*; 19 | 20 | import javax.servlet.http.HttpServletRequest; 21 | import javax.servlet.http.HttpServletResponse; 22 | import java.util.ArrayList; 23 | import java.util.List; 24 | 25 | 26 | /** 27 | * @Description 图书 28 | * @Author 丁帅帅 29 | * @Date 21/12/09 23:21 30 | * @Version 1.0 31 | */ 32 | @Slf4j 33 | @RestController 34 | //@RolesAllowed({"admin"}) 35 | @RequestMapping("/book") 36 | public class BookController { 37 | 38 | //controller 调 service 层 39 | @Autowired 40 | private BookService bookService; 41 | 42 | @Autowired 43 | private UserService userService; 44 | 45 | @Autowired 46 | private LendService lendService; 47 | 48 | @Autowired 49 | private CollectService collectService; 50 | 51 | /** 52 | * 借书 53 | * @param bookid 54 | * @return 55 | */ 56 | //@PutMapping("/lend") 57 | @RequestMapping("/lend") 58 | public Result lendBook(@RequestParam("bookid") Integer bookid,@RequestParam("username") String username){ 59 | //System.out.println("------>"+username); 60 | try{ 61 | Book book = bookService.findBookById(bookid); 62 | if (book.getNumber() > 0) { 63 | bookService.lendBook(bookid); 64 | User user = userService.queryAllByUsername(username); 65 | lendService.addLendRecord(bookid,user.getId()); 66 | } else { 67 | return new Result(false, MessageConstant.LEND_BOOK_FAIL); 68 | } 69 | }catch (Exception e){ 70 | e.printStackTrace(); 71 | //服务调用失败 72 | return new Result(false, MessageConstant.LEND_BOOK_FAIL); 73 | } 74 | return new Result(true, MessageConstant.LEND_BOOK_SUCCESS); 75 | } 76 | 77 | @RequestMapping("/collect") 78 | public Result collectBook(@RequestParam("bookid") Integer bookid,@RequestParam("username") String username){ 79 | //System.out.println("------>"+username); 80 | try{ 81 | User user = userService.queryAllByUsername(username); 82 | List collectRecords= collectService.findCollectBookByBookidandUsrid(bookid,user.getId()); 83 | if ( collectRecords.size()>0) { 84 | return new Result(false, "收藏失败,此书已被收藏"); 85 | }else { 86 | collectService.addCollectBook(bookid,user.getId()); 87 | } 88 | 89 | }catch (Exception e){ 90 | e.printStackTrace(); 91 | //服务调用失败 92 | return new Result(false, MessageConstant.Collect_BOOK_FAIL); 93 | } 94 | return new Result(true, MessageConstant.Collect_BOOK_SUCCESS); 95 | } 96 | /** 97 | * 新增图书 98 | * @param addBook 99 | * @return 100 | */ 101 | //@PreAuthorize("hasAnyRole('user')") // 只能user角色才能访问该方法 102 | //@RequestMapping("/add") 103 | @PostMapping("/add") 104 | public Result add(@RequestBody AddBook addBook){ 105 | try{ 106 | bookService.addBook(addBook); 107 | }catch (Exception e){ 108 | e.printStackTrace(); 109 | //服务调用失败 110 | return new Result(false, MessageConstant.ADD_Book_FAIL); 111 | } 112 | return new Result(true, MessageConstant.ADD_Book_SUCCESS); 113 | } 114 | 115 | 116 | /** 117 | * 图书分页查询 118 | * @param queryPageBean 119 | * @return 120 | */ 121 | // @PreAuthorize("hasAnyRole('admin')") // 只能user角色才能访问该方法 122 | //@PostMapping("/findPage") 123 | @RequestMapping("/findPage") 124 | public PageResult findPage(@RequestBody QueryPageBean queryPageBean, HttpServletRequest request,HttpServletResponse response){ 125 | 126 | PageResult pageResult = bookService.pageQuery(queryPageBean); 127 | return pageResult; 128 | } 129 | 130 | /** 131 | * 删除图书 132 | * @param bookid 133 | * @return 134 | */ 135 | // @PreAuthorize("hasAnyRole('admin')") // 只能user角色才能访问该方法 136 | //@RequestMapping("/delete") 137 | @DeleteMapping("/delete") 138 | public Result delete(Integer bookid){ 139 | try{ 140 | List lendRecord = lendService.findLendByBookid(bookid); 141 | if (lendRecord != null) { 142 | return new Result(false, "此书还有被借图书,删除失败!!!"); 143 | } 144 | bookService.deleteById(bookid); 145 | }catch (Exception e){ 146 | e.printStackTrace(); 147 | //服务调用失败 148 | return new Result(false, MessageConstant.DELETE_Book_FAIL); 149 | } 150 | return new Result(true, MessageConstant.DELETE_Book_SUCCESS); 151 | } 152 | 153 | /** 154 | * 编辑图书 155 | * @param editBook 156 | * @return 157 | */ 158 | // @RequestMapping("/edit") 159 | @PutMapping("/edit") 160 | public Result edit(@RequestBody EditBook editBook){ 161 | try{ 162 | bookService.edit(editBook); 163 | }catch (Exception e){ 164 | e.printStackTrace(); 165 | //服务调用失败 166 | return new Result(false, MessageConstant.EDIT_Book_FAIL); 167 | } 168 | return new Result(true, MessageConstant.EDIT_Book_SUCCESS); 169 | } 170 | 171 | @GetMapping("/findBookById") 172 | public Result findBookById(Integer bookid){ 173 | try{ 174 | Book book = bookService.findBookById(bookid); 175 | return new Result(true, MessageConstant.QUERY_Book_SUCCESS,book); 176 | }catch (Exception e){ 177 | e.printStackTrace(); 178 | //服务调用失败 179 | return new Result(false, MessageConstant.QUERY_Book_FAIL); 180 | } 181 | } 182 | /* 183 | @RequestMapping("/findAll") 184 | public Result findAll(){ 185 | try{ 186 | List list = bookService.findAll(); 187 | return new Result(true, MessageConstant.ADD_CHECKITEM_SUCCESS,list); 188 | }catch (Exception e){ 189 | e.printStackTrace(); 190 | //服务调用失败 191 | return new Result(false, MessageConstant.ADD_CHECKITEM_SUCCESS); 192 | } 193 | }*/ 194 | 195 | 196 | 197 | @RequestMapping("/export") 198 | public void export(HttpServletResponse response) { 199 | try{ 200 | 201 | List list =bookService.findAll(); 202 | //System.out.println(list.toString()); 203 | String[] columnNames=new String[]{"bookid","bookname","author","publish","introduction","classid","number"}; 204 | String[] keys=new String[]{"图书号","图书名","作者","出版社","简介","类别号","数量"}; 205 | List excelBooks =new ArrayList<>(); 206 | for (Book book : list) { 207 | ExcelBook excelBook = new ExcelBook(); 208 | BeanUtils.copyProperties(book,excelBook); 209 | excelBooks.add(excelBook); 210 | } 211 | 212 | ExcelUtils.export(response,"图书信息表",excelBooks ,columnNames,keys,"图书信息"); 213 | //return new Result(true, MessageConstant.EXPORT_SUCCESS); 214 | }catch (Exception e){ 215 | e.printStackTrace(); 216 | //服务调用失败 217 | //return new Result(false, MessageConstant.EXPORT_FAIL); 218 | } 219 | } 220 | } 221 | -------------------------------------------------------------------------------- /src/main/java/com/ding/books/controller/UserController.java: -------------------------------------------------------------------------------- 1 | package com.ding.books.controller; 2 | 3 | 4 | import com.ding.books.exception.MyException; 5 | import com.ding.books.model.dto.AddUserRequest; 6 | import com.ding.books.model.dto.EditUserRequest; 7 | import com.ding.books.model.dto.LoginRequest; 8 | import com.ding.books.model.dto.Updatepwd; 9 | import com.ding.books.model.entity.User; 10 | import com.ding.books.model.vo.ExcelUser; 11 | import com.ding.books.service.UserService; 12 | import com.ding.books.utils.*; 13 | import lombok.extern.slf4j.Slf4j; 14 | import org.apache.log4j.Logger; 15 | import org.springframework.beans.BeanUtils; 16 | import org.springframework.beans.factory.annotation.Autowired; 17 | import org.springframework.web.bind.annotation.RequestBody; 18 | import org.springframework.web.bind.annotation.RequestMapping; 19 | import org.springframework.web.bind.annotation.RestController; 20 | 21 | import javax.servlet.http.HttpServletRequest; 22 | import javax.servlet.http.HttpServletResponse; 23 | import javax.servlet.http.HttpSession; 24 | import java.util.ArrayList; 25 | import java.util.List; 26 | 27 | 28 | @Slf4j 29 | @RestController 30 | @RequestMapping("/user") 31 | public class UserController { 32 | 33 | private static Logger logger = Logger.getLogger(UserController.class); 34 | @Autowired 35 | private UserService userService; 36 | 37 | /** 38 | * 修改密码 39 | * @param updatepwd 40 | * @return 41 | */ 42 | @RequestMapping("/updatepwd") 43 | public Result updatepwd(@RequestBody Updatepwd updatepwd) { 44 | String oldpwd = CommonUtils.MD5(updatepwd.getOldpwd()); 45 | User user = userService.queryAllByUsername(updatepwd.getUsername()); 46 | if (oldpwd.equals(user.getPassword())){ 47 | user.setPassword(CommonUtils.MD5(updatepwd.getNewpwd())); 48 | EditUserRequest userRequest = new EditUserRequest(); 49 | BeanUtils.copyProperties(user,userRequest); 50 | edit(userRequest); 51 | throw new MyException(true,"修改成功"); 52 | // return new Result(true,"修改成功"); 53 | } 54 | 55 | return new Result(false,"修改失败,请检查原密码是否正确"); 56 | } 57 | @RequestMapping("/register") 58 | public Result register(@RequestBody AddUserRequest user){ 59 | try{ 60 | Integer i =userService.findByUsername(user.getUsername()); 61 | logger.info("i的值"+i); 62 | if(i!=0){ 63 | return new Result(false, "该用户已存在,注册失败"); 64 | }else { 65 | userService.addUser(user); 66 | } 67 | }catch (Exception e){ 68 | e.printStackTrace(); 69 | //服务调用失败 70 | return new Result(false, MessageConstant.Register_User_FAIL); 71 | } 72 | return new Result(true, MessageConstant.Register_User_SUCCESS); 73 | } 74 | 75 | 76 | // @PreAuthorize("hasAnyRole('admin')") 77 | @RequestMapping("/login") 78 | public Result login(@RequestBody LoginRequest loginRequest, HttpSession session){ 79 | 80 | String token = userService.findByPhoneAndPwd(loginRequest.getUsername(), loginRequest.getPassword()); 81 | session.setAttribute("token",token); 82 | //System.out.println(" request.setAttribute(\"token\",token);"+token); 83 | if (token == null) { 84 | logger.info("登录"+MessageConstant.Login_User_FAIL); 85 | return new Result(false, MessageConstant.Login_User_FAIL,token); 86 | 87 | } else { 88 | logger.info("登录"+MessageConstant.Login_User_SUCCESS); 89 | return new Result(true, MessageConstant.Login_User_SUCCESS,token); 90 | } 91 | 92 | } 93 | 94 | /** 95 | * 退出 96 | * @return 97 | */ 98 | @RequestMapping("/logout") 99 | public Result logout(HttpServletRequest request){ 100 | 101 | if (true) { 102 | // Object token = request.getSession().getAttribute("token"); 103 | // log.info("token1{}"+token); 104 | request.getSession().removeAttribute("token"); 105 | // Object token1 = request.getSession().getAttribute("token"); 106 | // log.info("token{}"+token1); 107 | return new Result(true, MessageConstant.Logout_User_SUCCESS); 108 | } else { 109 | return new Result(false, MessageConstant.Logout_User_FAIL); 110 | } 111 | 112 | } 113 | /** 114 | * 新增用户 115 | * @param user 116 | * @return 117 | */ 118 | @RequestMapping("/add") 119 | public Result add(@RequestBody AddUserRequest user){ 120 | try{ 121 | userService.addUser(user); 122 | }catch (Exception e){ 123 | e.printStackTrace(); 124 | //服务调用失败 125 | return new Result(false, MessageConstant.ADD_User_FAIL); 126 | } 127 | return new Result(true, MessageConstant.ADD_User_SUCCESS); 128 | } 129 | 130 | /** 131 | * 分页查询 132 | * @param queryPageBean 133 | * @return 134 | */ 135 | @RequestMapping("/findPage") 136 | public PageResult findPage(@RequestBody QueryPageBean queryPageBean){ 137 | PageResult pageResult =userService.pageQuery(queryPageBean); 138 | return pageResult; 139 | } 140 | 141 | /** 142 | * 删除 143 | * @param id 144 | * @return 145 | */ 146 | @RequestMapping("/delete") 147 | public Result delete(Integer id){ 148 | try{ 149 | userService.deleteUser(id); 150 | }catch (Exception e){ 151 | e.printStackTrace(); 152 | //服务调用失败 153 | return new Result(false, MessageConstant.DELETE_User_FAIL); 154 | } 155 | return new Result(true, MessageConstant.DELETE_User_SUCCESS); 156 | } 157 | 158 | /** 159 | * 修改用户 160 | * @param user 161 | * @return 162 | */ 163 | @RequestMapping("/edit") 164 | public Result edit(@RequestBody EditUserRequest user){ 165 | try{ 166 | userService.UpdateUser(user); 167 | }catch (Exception e){ 168 | e.printStackTrace(); 169 | //服务调用失败 170 | return new Result(false, MessageConstant.EDIT_User_FAIL); 171 | } 172 | return new Result(true, MessageConstant.EDIT_User_SUCCESS); 173 | } 174 | 175 | @RequestMapping("/findById") 176 | public Result findById(Integer id){ 177 | try{ 178 | User user =userService.findOneUser(id); 179 | return new Result(true, MessageConstant.QUERY_User_SUCCESS,user); 180 | }catch (Exception e){ 181 | e.printStackTrace(); 182 | //服务调用失败 183 | return new Result(false, MessageConstant.QUERY_User_FAIL); 184 | } 185 | } 186 | 187 | @RequestMapping("/export") 188 | public void export( HttpServletResponse response){ 189 | try{ 190 | 191 | List list =userService.findAll(); 192 | //System.out.println(list.toString()); 193 | String[] columnNames=new String[]{"id","username","sex","phone","city"}; 194 | String[] keys=new String[]{"id","姓名","性别","手机","城市"}; 195 | List excelUsers =new ArrayList<>(); 196 | for (User user : list) { 197 | ExcelUser excelUser = new ExcelUser(); 198 | BeanUtils.copyProperties(user,excelUser); 199 | excelUsers.add(excelUser); 200 | } 201 | 202 | ExcelUtils.export(response,"用户信息表",excelUsers,columnNames,keys,"用户信息"); 203 | //return new Result(true, MessageConstant.EXPORT_SUCCESS); 204 | }catch (Exception e){ 205 | e.printStackTrace(); 206 | //服务调用失败 207 | //return new Result(false, MessageConstant.EXPORT_FAIL); 208 | } 209 | } 210 | 211 | @RequestMapping("/findAll") 212 | public Result findAll(HttpServletResponse response){ 213 | try{ 214 | List list =userService.findAll(); 215 | return new Result(true, MessageConstant.QUERY_User_SUCCESS,list); 216 | }catch (Exception e){ 217 | e.printStackTrace(); 218 | //服务调用失败 219 | return new Result(false, MessageConstant.QUERY_User_FAIL); 220 | } 221 | } 222 | 223 | } 224 | -------------------------------------------------------------------------------- /src/main/resources/static/pages/classinfo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 图书管理 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 |
19 |

图书管理分类信息

20 | 21 | 首页 22 | 图书管理 23 | 分类信息 24 | 25 |
26 |
27 |
28 |
29 | 30 | 查询 31 | 导出 32 |
33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 45 | 46 |
47 | 54 | 55 |
56 | 57 |
58 |
59 |
60 | 61 | 62 | 63 | 64 | 65 | 66 | 192 | 193 | -------------------------------------------------------------------------------- /src/main/resources/static/pages/collect_admin.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 图书管理 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 |
19 |

图书管理收藏记录

20 | 21 | 首页 22 | 图书管理 23 | 收藏记录 24 | 25 |
26 |
27 |
28 |
29 | 30 | 查询 31 | 导出 32 |
33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 45 | 46 | 47 |
48 | 59 | 60 |
61 | 62 |
63 |
64 |
65 | 66 | 67 | 68 | 69 | 70 | 71 | 203 | 204 | -------------------------------------------------------------------------------- /src/main/resources/static/pages/lend_user_beifen.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 图书管理 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 |
19 |

图书管理借阅记录

20 | 21 | 首页 22 | 图书管理 23 | 借阅记录 24 | 25 |
26 |
27 |
28 |
29 | 30 | 查询 31 | 导出 32 |
33 | 34 | 35 | 36 | 37 | 38 | 39 | 41 | 42 | 43 | 47 | 48 | 49 |
50 | 57 | 58 |
59 | 60 |
61 |
62 |
63 | 64 | 65 | 66 | 67 | 68 | 69 | 220 | 221 | --------------------------------------------------------------------------------