From e27b6748c76de4906d346c404ef9cece89b19ed8 Mon Sep 17 00:00:00 2001
From: lan <3440433157@qq.com>
Date: Sun, 31 Oct 2021 22:58:38 +0800
Subject: [PATCH 1/2] =?UTF-8?q?pratice1:=E5=85=B0=E5=86=9B-2019302650?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
jpa-day7/pom.xml | 82 +++++++
.../java/edu/nwpu/JpaDay7Application.java | 24 ++
.../main/java/edu/nwpu/common/Response.java | 35 +++
.../edu/nwpu/config/InterceptorConfig.java | 23 ++
.../edu/nwpu/controller/BookController.java | 97 ++++++++
.../edu/nwpu/controller/LoginController.java | 45 ++++
.../edu/nwpu/controller/UserController.java | 70 ++++++
.../src/main/java/edu/nwpu/dao/BookDao.java | 16 ++
.../src/main/java/edu/nwpu/dao/RecordDao.java | 26 +++
.../src/main/java/edu/nwpu/dao/UserDao.java | 22 ++
.../src/main/java/edu/nwpu/entity/Book.java | 40 ++++
.../src/main/java/edu/nwpu/entity/Record.java | 40 ++++
.../src/main/java/edu/nwpu/entity/User.java | 69 ++++++
.../edu/nwpu/interceptor/AuthInterceptor.java | 40 ++++
.../edu/nwpu/interceptor/LoginInteceptor.java | 59 +++++
.../java/edu/nwpu/service/BookService.java | 38 ++++
.../java/edu/nwpu/service/UserService.java | 27 +++
.../nwpu/service/impl/BookServiceImpl.java | 213 ++++++++++++++++++
.../nwpu/service/impl/UserServiceImpl.java | 126 +++++++++++
.../src/main/java/edu/nwpu/vo/BookVo.java | 18 ++
.../main/java/edu/nwpu/vo/RecordBookVo.java | 29 +++
.../src/main/java/edu/nwpu/vo/RecordVo.java | 29 +++
.../src/main/java/edu/nwpu/vo/ResponseVo.java | 26 +++
.../src/main/java/edu/nwpu/vo/UserVo.java | 18 ++
jpa-day7/src/main/java/edu/util/JwtUtils.java | 42 ++++
jpa-day7/src/main/resources/application.yaml | 15 ++
.../edu/nwpu/JpaDay6ApplicationTests.java | 17 ++
27 files changed, 1286 insertions(+)
create mode 100644 jpa-day7/pom.xml
create mode 100644 jpa-day7/src/main/java/edu/nwpu/JpaDay7Application.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/common/Response.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/config/InterceptorConfig.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/controller/BookController.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/controller/LoginController.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/controller/UserController.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/dao/BookDao.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/dao/RecordDao.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/dao/UserDao.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/entity/Book.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/entity/Record.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/entity/User.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/interceptor/AuthInterceptor.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/interceptor/LoginInteceptor.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/service/BookService.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/service/UserService.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/service/impl/BookServiceImpl.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/service/impl/UserServiceImpl.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/vo/BookVo.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/vo/RecordBookVo.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/vo/RecordVo.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/vo/ResponseVo.java
create mode 100644 jpa-day7/src/main/java/edu/nwpu/vo/UserVo.java
create mode 100644 jpa-day7/src/main/java/edu/util/JwtUtils.java
create mode 100644 jpa-day7/src/main/resources/application.yaml
create mode 100644 jpa-day7/src/test/java/edu/nwpu/JpaDay6ApplicationTests.java
diff --git a/jpa-day7/pom.xml b/jpa-day7/pom.xml
new file mode 100644
index 0000000..6231ab3
--- /dev/null
+++ b/jpa-day7/pom.xml
@@ -0,0 +1,82 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.5.6
+
+
+ edu.nwpu
+ jpa-day7
+ 0.0.1-SNAPSHOT
+
+
+ 1.8
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ mysql
+ mysql-connector-java
+ 8.0.26
+
+
+ com.alibaba
+ druid-spring-boot-starter
+ 1.1.24
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.security
+ spring-security-test
+ test
+
+
+ com.auth0
+ java-jwt
+ 3.4.0
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+
+
+
+
diff --git a/jpa-day7/src/main/java/edu/nwpu/JpaDay7Application.java b/jpa-day7/src/main/java/edu/nwpu/JpaDay7Application.java
new file mode 100644
index 0000000..f07cf9f
--- /dev/null
+++ b/jpa-day7/src/main/java/edu/nwpu/JpaDay7Application.java
@@ -0,0 +1,24 @@
+package edu.nwpu;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+
+
+@SpringBootApplication(exclude = { SecurityAutoConfiguration.class })
+@EnableJpaRepositories("edu.nwpu.dao")
+public class JpaDay7Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(JpaDay7Application.class, args);
+ }
+
+ @Bean
+ public PasswordEncoder encoder(){
+ return new BCryptPasswordEncoder();
+ }
+}
diff --git a/jpa-day7/src/main/java/edu/nwpu/common/Response.java b/jpa-day7/src/main/java/edu/nwpu/common/Response.java
new file mode 100644
index 0000000..a12eec2
--- /dev/null
+++ b/jpa-day7/src/main/java/edu/nwpu/common/Response.java
@@ -0,0 +1,35 @@
+package edu.nwpu.common;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@Getter
+@Setter
+@ToString
+public class Response {
+ //状态码 0-失败 1-成功
+ private int code;
+ //状态信息
+ private String msg;
+ //后端数据
+ private Object data;
+
+ public Response() {
+ }
+
+ public Response(int code, String msg, Object data) {
+ this.code = code;
+ this.msg = msg;
+ this.data = data;
+ }
+
+ public static Response ok(Object data){
+ return new Response(1,"ok",data);
+ }
+
+ public static Response fail(String msg){
+ return new Response(0,msg,null);
+ }
+
+}
diff --git a/jpa-day7/src/main/java/edu/nwpu/config/InterceptorConfig.java b/jpa-day7/src/main/java/edu/nwpu/config/InterceptorConfig.java
new file mode 100644
index 0000000..c97aba1
--- /dev/null
+++ b/jpa-day7/src/main/java/edu/nwpu/config/InterceptorConfig.java
@@ -0,0 +1,23 @@
+package edu.nwpu.config;
+
+import edu.nwpu.interceptor.AuthInterceptor;
+import edu.nwpu.interceptor.LoginInteceptor;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * Created by Chilly Cui on 2020/9/9.
+ */
+@Configuration
+public class InterceptorConfig implements WebMvcConfigurer {
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(new LoginInteceptor())
+ .addPathPatterns("/api/**")
+ .excludePathPatterns("/api/login");
+ registry.addInterceptor(new AuthInterceptor())
+ .addPathPatterns("/api/users","/api/book","/api/user/books","/api/book/record");
+ }
+}
diff --git a/jpa-day7/src/main/java/edu/nwpu/controller/BookController.java b/jpa-day7/src/main/java/edu/nwpu/controller/BookController.java
new file mode 100644
index 0000000..3fcb032
--- /dev/null
+++ b/jpa-day7/src/main/java/edu/nwpu/controller/BookController.java
@@ -0,0 +1,97 @@
+package edu.nwpu.controller;
+
+import edu.nwpu.common.Response;
+import edu.nwpu.service.BookService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api")
+public class BookController {
+ @Autowired
+ BookService bookService;
+
+ @PostMapping("/book")
+ @Transactional
+ public Response addBook(@RequestBody Map map){
+ String name = (String) map.get("name");
+ String place = (String) map.get("place");
+ String introduce = (String) map.get("introduce");
+ String author = (String) map.get("author");
+ String price = (String) map.get("price");
+ return bookService.addBook(name, place, introduce, author, Float.valueOf(price));
+ }
+
+ @DeleteMapping("/book")
+ @Transactional
+ public Response deleteBook(@RequestBody Map map){
+ String bookId = map.get("bookId");
+ return bookService.deleteBook(Long.valueOf(bookId));
+ }
+
+ @PutMapping("/book")
+ @Transactional
+ public Response updateBook(@RequestBody Map map){
+ String name = (String) map.get("name");
+ String place = (String) map.get("place");
+ String introduce = (String) map.get("introduce");
+ String author = (String) map.get("author");
+ String price = (String) map.get("price");
+ String bookId = (String) map.get("bookId");
+ return bookService.updateBook(name,place,introduce,author, Float.valueOf(price), Long.valueOf(bookId));
+ }
+
+ @GetMapping("/books")
+ public Response getAllBooks(){
+ return bookService.getAllBooks();
+ }
+
+ @GetMapping("/book")
+ public Response getBook(@RequestBody Map map){
+ String bookId = map.get("bookId");
+ return bookService.getBook(Long.valueOf(bookId));
+ }
+
+ @PostMapping("/book/borrow")
+ @Transactional
+ public Response borrow(@RequestBody Map map){
+ Long bookId = Long.valueOf(map.get("bookId"));
+ Long userId = Long.valueOf(map.get("userId"));
+ return bookService.borrowBook(bookId,userId);
+ }
+
+ @PostMapping("/book/return")
+ @Transactional
+ public Response returnBook(@RequestBody Map map){
+ Long recordId = Long.valueOf(map.get("recordId"));
+ Long userId = Long.valueOf(map.get("userId"));
+ return bookService.returnBook(recordId,userId);
+ }
+
+ @GetMapping("/book/status")
+ public Response status(@RequestBody Map map){
+ Long bookId = Long.valueOf(map.get("bookId"));
+ return bookService.status(bookId);
+ }
+
+ @GetMapping("/book/records")
+ public Response records(@RequestBody Map map){
+ Long bookId = Long.valueOf(map.get("bookId"));
+ return bookService.records(bookId);
+ }
+
+ @GetMapping("/user/books")
+ public Response getUserBooks(@RequestBody Map map){
+ Long userId = Long.valueOf(map.get("userId"));
+ return bookService.getUserBooks(userId);
+ }
+
+ @GetMapping("/book/record")
+ public Response record(@RequestBody Map map){
+ Long recordId = Long.valueOf(map.get("recordId"));
+ return bookService.getRecordById(recordId);
+ }
+}
diff --git a/jpa-day7/src/main/java/edu/nwpu/controller/LoginController.java b/jpa-day7/src/main/java/edu/nwpu/controller/LoginController.java
new file mode 100644
index 0000000..dabb95b
--- /dev/null
+++ b/jpa-day7/src/main/java/edu/nwpu/controller/LoginController.java
@@ -0,0 +1,45 @@
+package edu.nwpu.controller;
+
+import edu.nwpu.common.Response;
+import edu.nwpu.dao.UserDao;
+import edu.nwpu.entity.User;
+import edu.nwpu.service.UserService;
+import edu.util.JwtUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api")
+public class LoginController {
+ @Autowired
+ UserService userService;
+ @Autowired
+ PasswordEncoder passwordEncoder;
+
+ @PostMapping("/login")
+ public Response login(@RequestBody Map map){
+ String username = map.get("username");
+ String password = map.get("password");
+ User user = userService.findByUsername(username);
+ if (user==null){
+ return Response.fail("用户不存在");
+ }
+ if (!passwordEncoder.matches(password,user.getPassword())){
+ return Response.fail("密码错误");
+ }
+ Map res = new HashMap<>();
+ res.put("userId",user.getId()+"");
+ res.put("role",user.getRole());
+ String token = JwtUtils.getToken(res);
+ res.put("access_token",token);
+ return Response.ok(res);
+ }
+
+}
diff --git a/jpa-day7/src/main/java/edu/nwpu/controller/UserController.java b/jpa-day7/src/main/java/edu/nwpu/controller/UserController.java
new file mode 100644
index 0000000..74b6177
--- /dev/null
+++ b/jpa-day7/src/main/java/edu/nwpu/controller/UserController.java
@@ -0,0 +1,70 @@
+package edu.nwpu.controller;
+
+import edu.nwpu.common.Response;
+import edu.nwpu.entity.User;
+import edu.nwpu.service.UserService;
+import edu.nwpu.vo.ResponseVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api")
+public class UserController {
+ @Autowired
+ UserService userService;
+
+ @GetMapping("/hello")
+ public String hello(){
+ return "hello jpa";
+ }
+
+ @PostMapping("/hello")
+ public String hello2(String name){
+ return "hello "+name;
+ }
+
+ @PostMapping("/user")
+ public Response registry(@RequestBody Map map){
+ String username = map.get("username");
+ String password = map.get("password");
+ String email = map.get("email");
+ String nickname = map.get("nickname");
+ Response response = userService.addUser(username, password, email, nickname,"user");
+ System.out.println("添加成功:"+response);
+ return response;
+ }
+
+ @PutMapping("/user")
+ @Transactional//更新、删除等操作需要事务支持
+ public ResponseVo updateUser(@RequestBody Map map){
+ Long userId = Long.valueOf((String) map.get("userId"));
+ String email = (String) map.get("email");
+ String nickname = (String) map.get("nickname");
+ return userService.updateUser(userId,email,nickname);
+ }
+
+ @PostMapping("/user/password")
+ @Transactional
+ public ResponseVo updatePassword(@RequestBody Map map){
+ Long userId = Long.valueOf((String) map.get("userId"));
+ String oldPassword = (String) map.get("oldPassword");
+ String newPassword = (String) map.get("newPassword");
+ return userService.updatePassword(Long.valueOf(userId),oldPassword,newPassword);
+ }
+
+ @GetMapping("/user")
+ public Response findUser(@RequestBody Map map){
+ return userService.findByUserId(map.get("userId"));
+ }
+
+ @GetMapping("users")
+ public Response findAllUsers(){
+ return userService.findUsers();
+ }
+
+
+}
diff --git a/jpa-day7/src/main/java/edu/nwpu/dao/BookDao.java b/jpa-day7/src/main/java/edu/nwpu/dao/BookDao.java
new file mode 100644
index 0000000..e51de94
--- /dev/null
+++ b/jpa-day7/src/main/java/edu/nwpu/dao/BookDao.java
@@ -0,0 +1,16 @@
+package edu.nwpu.dao;
+
+import edu.nwpu.entity.Book;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+public interface BookDao extends JpaRepository, JpaSpecificationExecutor {
+ //更新书目信息
+ @Query("update Book set name=?1,place=?2,introduce=?3,author=?4,price=?5 where id=?6")
+ @Modifying
+ void updateBook(String name, String place, String introduce, String author, float price, Long bookId);
+
+ //
+}
diff --git a/jpa-day7/src/main/java/edu/nwpu/dao/RecordDao.java b/jpa-day7/src/main/java/edu/nwpu/dao/RecordDao.java
new file mode 100644
index 0000000..c70c31b
--- /dev/null
+++ b/jpa-day7/src/main/java/edu/nwpu/dao/RecordDao.java
@@ -0,0 +1,26 @@
+package edu.nwpu.dao;
+
+import edu.nwpu.entity.Record;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.Date;
+import java.util.List;
+
+public interface RecordDao extends JpaRepository, JpaSpecificationExecutor {
+ //查找书目是否借出
+ List findByBookId(Long bookId);
+
+ //还书
+ @Query("update Record set returnDate=?2 where id=?1")
+ @Modifying
+ void returnBook(Long recordId, Date returnDate);
+
+ //指定用户的借书记录
+ List findByUserId(Long userId);
+
+ //根据book_id外键查询
+ List findByBook_Id(Long bookId);
+}
diff --git a/jpa-day7/src/main/java/edu/nwpu/dao/UserDao.java b/jpa-day7/src/main/java/edu/nwpu/dao/UserDao.java
new file mode 100644
index 0000000..10fd8cd
--- /dev/null
+++ b/jpa-day7/src/main/java/edu/nwpu/dao/UserDao.java
@@ -0,0 +1,22 @@
+package edu.nwpu.dao;
+
+import edu.nwpu.entity.User;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+public interface UserDao extends JpaRepository, JpaSpecificationExecutor {
+ //修改个人信息
+ @Query("update User set email = ?1,nickname = ?2 where id = ?3")
+ @Modifying
+ void updateUser(String email,String nickname,Long userId);
+
+ //修改密码
+ @Query("update User set password = ?1 where id = ?2")
+ @Modifying
+ void updatePassword(String newPassword,Long userId);
+
+ //根据用户名
+ User findByUsername(String username);
+}
diff --git a/jpa-day7/src/main/java/edu/nwpu/entity/Book.java b/jpa-day7/src/main/java/edu/nwpu/entity/Book.java
new file mode 100644
index 0000000..dc0808c
--- /dev/null
+++ b/jpa-day7/src/main/java/edu/nwpu/entity/Book.java
@@ -0,0 +1,40 @@
+package edu.nwpu.entity;
+
+import lombok.*;
+
+import javax.persistence.*;
+import java.util.HashSet;
+import java.util.Set;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+@Entity
+@Table(name = "book")
+public class Book {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "id")
+ private Long id;
+
+ @Column(name = "name")
+ private String name;
+
+ @Column(name = "place")
+ private String place;
+
+ @Column(name = "introduce")
+ private String introduce;
+
+ @Column(name = "author")
+ private String author;
+
+ @Column(name = "price")
+ private float price;
+
+ @OneToMany(mappedBy = "book",cascade = CascadeType.ALL)
+ private Set records = new HashSet<>();
+
+}
diff --git a/jpa-day7/src/main/java/edu/nwpu/entity/Record.java b/jpa-day7/src/main/java/edu/nwpu/entity/Record.java
new file mode 100644
index 0000000..9e69fcb
--- /dev/null
+++ b/jpa-day7/src/main/java/edu/nwpu/entity/Record.java
@@ -0,0 +1,40 @@
+package edu.nwpu.entity;
+
+import lombok.*;
+
+import javax.persistence.*;
+import java.util.Date;
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+@Entity
+@Table(name = "record")
+public class Record {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "id")
+ private Long id;
+
+// @Column(name = "book_id")
+// private Long bookId;
+
+// @Column(name = "user_id")
+// private Long userId;
+
+ @Column(name = "borrow_date")
+ private Date borrowDate;
+
+ @Column(name = "return_date")
+ private Date returnDate;
+
+ @ManyToOne(targetEntity = User.class)
+ @JoinColumn(name = "user_id",referencedColumnName = "id")
+ private User user;
+
+ @ManyToOne(targetEntity = Book.class)
+ @JoinColumn(name = "book_id",referencedColumnName = "id")
+ private Book book;
+
+}
diff --git a/jpa-day7/src/main/java/edu/nwpu/entity/User.java b/jpa-day7/src/main/java/edu/nwpu/entity/User.java
new file mode 100644
index 0000000..87ffec8
--- /dev/null
+++ b/jpa-day7/src/main/java/edu/nwpu/entity/User.java
@@ -0,0 +1,69 @@
+package edu.nwpu.entity;
+
+import lombok.*;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import javax.persistence.*;
+import java.util.*;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+@Entity
+@Table(name = "user")
+public class User{
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "id")
+ private Long id;
+
+ @Column(name = "username")
+ private String username;
+
+ @Column(name = "password")
+ private String password;
+
+ @Column(name = "email")
+ private String email;
+
+ @Column(name = "nickname")
+ private String nickname;
+
+ @Column(name = "role")
+ private String role;
+
+ @OneToMany(mappedBy = "user",cascade = CascadeType.ALL)
+ private Set records = new HashSet<>();
+
+
+// @Override
+// public Collection extends GrantedAuthority> getAuthorities() {
+// List authorities = new ArrayList<>();
+// authorities.add(new SimpleGrantedAuthority(getRole()));
+// return authorities;
+// }
+//
+// @Override
+// public boolean isAccountNonExpired() {
+// return true;
+// }
+//
+// @Override
+// public boolean isAccountNonLocked() {
+// return true;
+// }
+//
+// @Override
+// public boolean isCredentialsNonExpired() {
+// return true;
+// }
+//
+// @Override
+// public boolean isEnabled() {
+// return true;
+// }
+}
diff --git a/jpa-day7/src/main/java/edu/nwpu/interceptor/AuthInterceptor.java b/jpa-day7/src/main/java/edu/nwpu/interceptor/AuthInterceptor.java
new file mode 100644
index 0000000..f51329f
--- /dev/null
+++ b/jpa-day7/src/main/java/edu/nwpu/interceptor/AuthInterceptor.java
@@ -0,0 +1,40 @@
+package edu.nwpu.interceptor;
+
+import com.auth0.jwt.interfaces.DecodedJWT;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import edu.util.JwtUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+public class AuthInterceptor implements HandlerInterceptor {
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+ System.out.println("进入权限认证拦截....");
+ if ((request.getMethod().equals("GET")&&request.getRequestURI().equals("/api/book"))||
+ (request.getMethod().equals("POST")&&request.getRequestURI().equals("/api/user"))){
+ //不拦截GET请求的"/api/book"
+ //不拦截POST请求的"/api/user"
+ return true;
+ }
+ String token = request.getHeader("access_token");
+ DecodedJWT verify = JwtUtils.verify(token);
+ String role = verify.getClaim("role").asString();
+ log.info("当前用户为:"+role);
+ if (!role.equals("admin")){
+ Map map = new HashMap<>();
+ map.put("code","0");
+ map.put("msg","权限不足");
+ String json = new ObjectMapper().writeValueAsString(map);
+ response.setContentType("application/json;charset=UTF-8");
+ response.getWriter().println(json);
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/jpa-day7/src/main/java/edu/nwpu/interceptor/LoginInteceptor.java b/jpa-day7/src/main/java/edu/nwpu/interceptor/LoginInteceptor.java
new file mode 100644
index 0000000..4d95e3a
--- /dev/null
+++ b/jpa-day7/src/main/java/edu/nwpu/interceptor/LoginInteceptor.java
@@ -0,0 +1,59 @@
+package edu.nwpu.interceptor;
+
+import com.auth0.jwt.exceptions.AlgorithmMismatchException;
+import com.auth0.jwt.exceptions.InvalidClaimException;
+import com.auth0.jwt.exceptions.SignatureVerificationException;
+import com.auth0.jwt.exceptions.TokenExpiredException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import edu.util.JwtUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+public class LoginInteceptor implements HandlerInterceptor {
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+ if (request.getMethod().equals("POST")&&request.getRequestURI().equals("/api/user")){
+ //注册接口放行
+ return true;
+ }
+ //获取请求头中的令牌
+ String token = request.getHeader("access_token");
+ log.info("当前token为:{}", token);
+
+ Map map = new HashMap<>();
+ try {
+ JwtUtils.verify(token);
+ return true;
+ } catch (SignatureVerificationException e) {
+ e.printStackTrace();
+ map.put("code", 0);
+ map.put("msg", "签名不一致");
+ } catch (TokenExpiredException e) {
+ e.printStackTrace();
+ map.put("code", 0);
+ map.put("msg", "令牌过期");
+ } catch (AlgorithmMismatchException e) {
+ e.printStackTrace();
+ map.put("code", 0);
+ map.put("msg", "算法不匹配");
+ } catch (InvalidClaimException e) {
+ e.printStackTrace();
+ map.put("code", 0);
+ map.put("msg", "失效的payload");
+ } catch (Exception e) {
+ map.put("code", 0);
+ map.put("msg", "token无效");
+ }
+ //响应到前台: 将map转为json
+ String json = new ObjectMapper().writeValueAsString(map);
+ response.setContentType("application/json;charset=UTF-8");
+ response.getWriter().println(json);
+ return false;
+ }
+}
diff --git a/jpa-day7/src/main/java/edu/nwpu/service/BookService.java b/jpa-day7/src/main/java/edu/nwpu/service/BookService.java
new file mode 100644
index 0000000..8b360bd
--- /dev/null
+++ b/jpa-day7/src/main/java/edu/nwpu/service/BookService.java
@@ -0,0 +1,38 @@
+package edu.nwpu.service;
+
+import edu.nwpu.common.Response;
+
+public interface BookService {
+ //创建书目
+ Response addBook(String name,String place,String introduce,String author,float price);
+
+ //删除书目
+ Response deleteBook(Long bookId);
+
+ //更新数目
+ Response updateBook(String name,String place,String introduce,String author,float price,Long bookId);
+
+ //获取书目列表
+ Response getAllBooks();
+
+ //获取书目信息
+ Response getBook(Long bookId);
+
+ //借书
+ Response borrowBook(Long bookId,Long userId);
+
+ //还书
+ Response returnBook(Long recordId,Long userId);
+
+ //查询指定书目的借还状态
+ Response status(Long bookId);
+
+ //获取指定书目的所有借还记录
+ Response records(Long bookId);
+
+ //获取指定用户的所有借书记录
+ Response getUserBooks(Long userId);
+
+ //通过记录查询书目借还状态
+ Response getRecordById(Long recordId);
+}
diff --git a/jpa-day7/src/main/java/edu/nwpu/service/UserService.java b/jpa-day7/src/main/java/edu/nwpu/service/UserService.java
new file mode 100644
index 0000000..a116874
--- /dev/null
+++ b/jpa-day7/src/main/java/edu/nwpu/service/UserService.java
@@ -0,0 +1,27 @@
+package edu.nwpu.service;
+
+import edu.nwpu.common.Response;
+import edu.nwpu.entity.User;
+import edu.nwpu.vo.ResponseVo;
+
+public interface UserService {
+ //用户添加
+ Response addUser(String username,String password,String email,String nickname,String role);
+
+ //获取用户信息
+ Response findByUserId(Long userId);
+
+ //获取用户列表
+ Response findUsers();
+
+ //修改用户信息
+ ResponseVo updateUser(Long userId,String email,String nickname);
+
+ //修改用户密码
+ ResponseVo updatePassword(Long userId, String oldPassword, String newPassword);
+
+ //根据用户名查找用户
+ User findByUsername(String username);
+
+
+}
diff --git a/jpa-day7/src/main/java/edu/nwpu/service/impl/BookServiceImpl.java b/jpa-day7/src/main/java/edu/nwpu/service/impl/BookServiceImpl.java
new file mode 100644
index 0000000..fd513d6
--- /dev/null
+++ b/jpa-day7/src/main/java/edu/nwpu/service/impl/BookServiceImpl.java
@@ -0,0 +1,213 @@
+package edu.nwpu.service.impl;
+
+import edu.nwpu.common.Response;
+import edu.nwpu.dao.BookDao;
+import edu.nwpu.dao.RecordDao;
+import edu.nwpu.dao.UserDao;
+import edu.nwpu.entity.Book;
+import edu.nwpu.entity.Record;
+import edu.nwpu.entity.User;
+import edu.nwpu.service.BookService;
+import edu.nwpu.vo.BookVo;
+import edu.nwpu.vo.RecordBookVo;
+import edu.nwpu.vo.RecordVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.criteria.*;
+import java.util.*;
+
+@Service
+public class BookServiceImpl implements BookService {
+ @Autowired
+ UserDao userDao;
+ @Autowired
+ BookDao bookDao;
+ @Autowired
+ RecordDao recordDao;
+ @Override
+ public Response addBook(String name, String place, String introduce, String author, float price) {
+ Book book = new Book();
+ book.setName(name);
+ book.setPlace(place);
+ book.setIntroduce(introduce);
+ book.setAuthor(author);
+ book.setPrice(price);
+ Book saveBook = bookDao.save(book);
+ return Response.ok(saveBook.getId());
+ }
+
+ @Override
+ public Response deleteBook(Long bookId) {
+ if (isExistBook(bookId)){
+ Book book = bookDao.findById(bookId).orElse(null);
+ bookDao.deleteById(bookId);
+ Map map = new HashMap<>();
+ map.put("name",book.getName());
+ map.put("place",book.getPlace());
+ map.put("introduce",book.getIntroduce());
+ map.put("author",book.getAuthor());
+ map.put("price",book.getPrice());
+ return Response.ok(map);
+ }
+ return Response.fail("书目不存在");
+ }
+
+ public boolean isExistBook(Long bookId){
+ Book book = bookDao.findById(bookId).orElse(null);
+ return book!=null;
+ }
+
+ @Override
+ public Response updateBook(String name, String place, String introduce, String author, float price, Long bookId) {
+ if (isExistBook(bookId)){
+ bookDao.updateBook(name,place,introduce,author,price,bookId);
+ Map map = new HashMap<>();
+ map.put("name",name);
+ map.put("place",place);
+ map.put("introduce",introduce);
+ map.put("author",author);
+ map.put("price",price);
+ return Response.ok(map);
+ }
+ return Response.fail("书目不存在");
+ }
+
+ @Override
+ public Response getAllBooks() {
+ List all = bookDao.findAll();
+ List bookVoList = new ArrayList<>();
+ for (Book book : all) {
+ bookVoList.add(new BookVo(book.getId(),book.getName()));
+ }
+ return Response.ok(bookVoList);
+ }
+
+ @Override
+ public Response getBook(Long bookId) {
+ if (isExistBook(bookId)){
+ Book book = bookDao.findById(bookId).orElse(null);
+ Map map = new HashMap<>();
+ map.put("name",book.getName());
+ map.put("place",book.getPlace());
+ map.put("introduce",book.getIntroduce());
+ map.put("author",book.getAuthor());
+ map.put("price",book.getPrice());
+ return Response.ok(map);
+ }
+ return Response.fail("书目不存在");
+ }
+
+ @Override
+ public Response borrowBook(Long bookId, Long userId) {
+ Book book = bookDao.findById(bookId).orElse(null);
+ if (book==null){
+ return Response.fail("书目不存在");
+ }
+ User user = userDao.findById(userId).orElse(null);
+ if (user==null){
+ return Response.fail("用户不存在");
+ }
+ if (isBorrowed(bookId)){
+ return Response.fail("书目已借出");
+ }
+ Record record = new Record();
+ Date borrowDate = new Date();
+ record.setBorrowDate(borrowDate);
+ record.setBook(book);
+ record.setUser(user);
+ Record save = recordDao.save(record);
+ Map map = new HashMap<>();
+ map.put("recordId",save.getId());
+ map.put("borrowDate",borrowDate);
+ return Response.ok(map);
+ }
+
+ public boolean isBorrowed(Long bookId){
+ List records = recordDao.findByBookId(bookId);
+ for (Record record : records) {
+ if (record.getReturnDate()==null){
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ @Override
+ public Response returnBook(Long recordId, Long userId) {
+ User user = userDao.findById(userId).orElse(null);
+ if (user==null){
+ return Response.fail("用户不存在");
+ }
+ Record record = recordDao.findById(recordId).orElse(null);
+ if (record==null){
+ return Response.fail("借书记录不存在");
+ }
+ Date returnDate = new Date();
+ recordDao.returnBook(recordId,returnDate);
+ Map map = new HashMap<>();
+ map.put("borrowDate",record.getBorrowDate());
+ map.put("returnDate",returnDate);
+ return Response.ok(map);
+ }
+
+ @Override
+ public Response status(Long bookId) {
+ if (!isExistBook(bookId)){
+ return Response.fail("书目不存在");
+ }
+ List records = recordDao.findByBook_Id(bookId);
+ Record record = records.get(records.size()-1);
+ Map map = new HashMap<>();
+ map.put("userId",record.getUser().getId());
+ map.put("borrowDate",record.getBorrowDate());
+ map.put("returnDate",record.getReturnDate());
+ return Response.ok(map);
+ }
+
+ @Override
+ public Response records(Long bookId) {
+ if (!isExistBook(bookId)){
+ return Response.fail("书目不存在");
+ }
+ List records = recordDao.findByBookId(bookId);
+ List recordVoList = new ArrayList<>();
+ for (Record record : records) {
+ RecordVo recordVo = new RecordVo(record.getId(), record.getUser().getId(), record.getUser().getUsername(),
+ record.getBorrowDate(), record.getReturnDate());
+ recordVoList.add(recordVo);
+ }
+ return Response.ok(recordVoList);
+ }
+
+ @Override
+ public Response getUserBooks(Long userId) {
+ User user = userDao.findById(userId).orElse(null);
+ if (user==null){
+ return Response.fail("用户不存在");
+ }
+ List records = recordDao.findByUserId(userId);
+ List recordBookVoList = new ArrayList<>();
+ for (Record record : records) {
+ recordBookVoList.add(new RecordBookVo(record.getId(), record.getBook().getId(), record.getBook().getName(),
+ record.getBorrowDate(), record.getReturnDate()));
+ }
+ return Response.ok(recordBookVoList);
+ }
+
+ @Override
+ public Response getRecordById(Long recordId) {
+ Record record = recordDao.findById(recordId).orElse(null);
+ if (record==null){
+ return Response.fail("记录不存在");
+ }
+ Map map = new HashMap<>();
+ map.put("bookId",record.getBook().getId());
+ map.put("userId",record.getUser().getId());
+ map.put("borrowDate",record.getBorrowDate());
+ map.put("returnDate",record.getReturnDate());
+ return Response.ok(map);
+ }
+}
diff --git a/jpa-day7/src/main/java/edu/nwpu/service/impl/UserServiceImpl.java b/jpa-day7/src/main/java/edu/nwpu/service/impl/UserServiceImpl.java
new file mode 100644
index 0000000..e3650f4
--- /dev/null
+++ b/jpa-day7/src/main/java/edu/nwpu/service/impl/UserServiceImpl.java
@@ -0,0 +1,126 @@
+package edu.nwpu.service.impl;
+
+import edu.nwpu.common.Response;
+import edu.nwpu.dao.UserDao;
+import edu.nwpu.entity.User;
+import edu.nwpu.service.UserService;
+import edu.nwpu.vo.ResponseVo;
+import edu.nwpu.vo.UserVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.persistence.criteria.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+@Service
+public class UserServiceImpl implements UserService {
+ @Resource
+ UserDao userDao;
+ @Autowired
+ PasswordEncoder passwordEncoder;
+ @Override
+ public Response addUser(String username, String password, String email, String nickname,String role) {
+ User user = findByName(username);
+ User em = findByEmail(email);
+ if (user!=null){
+ return Response.fail("用户名已占用");
+ }
+ if (em!=null){
+ return Response.fail("邮箱已注册");
+ }
+ User myUser = new User();
+ myUser.setUsername(username);
+ myUser.setPassword(passwordEncoder.encode(password));
+ myUser.setEmail(email);
+ myUser.setNickname(nickname);
+ myUser.setRole(role);
+ Long id = userDao.save(myUser).getId();
+ Map map = new HashMap<>();
+ map.put("user_id",id);
+ return Response.ok(map);
+ }
+
+ public User findByName(String username){
+ Specification spec = new Specification() {
+ @Override
+ public Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder criteriaBuilder) {
+ Path