diff --git "a/practice1:2019302650-\345\205\260\345\206\233/pom.xml" "b/practice1:2019302650-\345\205\260\345\206\233/pom.xml" new file mode 100644 index 0000000000000000000000000000000000000000..6231ab3b8e7c1cb05e9b3cf2287983fd3cb4c64b --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/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/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/JpaDay7Application.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/JpaDay7Application.java" new file mode 100644 index 0000000000000000000000000000000000000000..f07cf9f4030d668aff298056d3c2e626d4f3cb60 --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/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/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/common/Response.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/common/Response.java" new file mode 100644 index 0000000000000000000000000000000000000000..a12eec2dcf0ea86f182a8a1dfe5f957fcc9dde10 --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/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/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/config/InterceptorConfig.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/config/InterceptorConfig.java" new file mode 100644 index 0000000000000000000000000000000000000000..c97aba1ef34edc9d2576c799acf57f8e09bbfe60 --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/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/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/controller/BookController.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/controller/BookController.java" new file mode 100644 index 0000000000000000000000000000000000000000..3fcb03288436394fc504c7e11b4af94aa7f38758 --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/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/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/controller/LoginController.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/controller/LoginController.java" new file mode 100644 index 0000000000000000000000000000000000000000..dabb95b9c91910bde9b9e1a23859aa91f03f7e58 --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/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/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/controller/UserController.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/controller/UserController.java" new file mode 100644 index 0000000000000000000000000000000000000000..74b6177898a39caf91a4d1085371d9fafcb1af26 --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/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/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/dao/BookDao.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/dao/BookDao.java" new file mode 100644 index 0000000000000000000000000000000000000000..e51de94b4d89036f814a9ef2e97a2f0ca01af1b7 --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/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/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/dao/RecordDao.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/dao/RecordDao.java" new file mode 100644 index 0000000000000000000000000000000000000000..c70c31baf3d4d7715cb331f78e74196e60d780de --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/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/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/dao/UserDao.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/dao/UserDao.java" new file mode 100644 index 0000000000000000000000000000000000000000..10fd8cdbbeba00eff999a787be241fb3a6f012fd --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/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/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/entity/Book.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/entity/Book.java" new file mode 100644 index 0000000000000000000000000000000000000000..dc0808c03efd678685b70f4c0dce20db9fe7e875 --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/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/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/entity/Record.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/entity/Record.java" new file mode 100644 index 0000000000000000000000000000000000000000..9e69fcb52331d6bdc29251110883f664f077b1fb --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/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/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/entity/User.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/entity/User.java" new file mode 100644 index 0000000000000000000000000000000000000000..87ffec8ac04ecb317ce40216c3b7978900bded9b --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/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 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/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/interceptor/AuthInterceptor.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/interceptor/AuthInterceptor.java" new file mode 100644 index 0000000000000000000000000000000000000000..f51329f072949a2ab472e81cbc4b4307345bdd6d --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/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/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/interceptor/LoginInteceptor.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/interceptor/LoginInteceptor.java" new file mode 100644 index 0000000000000000000000000000000000000000..4d95e3ac4b03ecde85c755b65ca881b136933177 --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/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/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/service/BookService.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/service/BookService.java" new file mode 100644 index 0000000000000000000000000000000000000000..8b360bd13d6df0360622f43a661252f164070610 --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/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/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/service/UserService.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/service/UserService.java" new file mode 100644 index 0000000000000000000000000000000000000000..a1168742797f4fe4f3306a7a8705ee8dbee121db --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/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/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/service/impl/BookServiceImpl.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/service/impl/BookServiceImpl.java" new file mode 100644 index 0000000000000000000000000000000000000000..fd513d61d2a7b6732e801d572740da93a62cb1df --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/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/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/service/impl/UserServiceImpl.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/service/impl/UserServiceImpl.java" new file mode 100644 index 0000000000000000000000000000000000000000..e3650f4ec1374d4ad451f4359266425a601aaee6 --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/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 name = root.get("username"); + Predicate p = criteriaBuilder.equal(name, username); + return p; + } + }; + User user = userDao.findOne(spec).orElse(null); + return user; + } + + public User findByEmail(String email){ + Specification spec = new Specification() { + @Override + public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder criteriaBuilder) { + Path e = root.get("email"); + Predicate p = criteriaBuilder.equal(e, email); + return p; + } + }; + User user = userDao.findOne(spec).orElse(null); + return user; + } + + @Override + public Response findByUserId(Long userId) { + User user = userDao.findById(userId).orElse(null); + if (user==null){ + return Response.fail("用户不存在"); + } + Map map = new HashMap<>(); + map.put("username",user.getUsername()); + map.put("nickname",user.getNickname()); + map.put("email",user.getEmail()); + return Response.ok(map); + } + + @Override + public Response findUsers() { + List all = userDao.findAll(); + List userVoList = new ArrayList<>(); + for (User user : all) { + UserVo userVo = new UserVo(user.getId(), user.getUsername()); + userVoList.add(userVo); + } + return Response.ok(userVoList); + } + + @Override + public ResponseVo updateUser(Long userId, String email, String nickname) { + User em = findByEmail(email); + if (em!=null){ + return ResponseVo.fail("邮箱已占有"); + } + userDao.updateUser(email,nickname,userId); + return ResponseVo.ok(); + } + + @Override + public ResponseVo updatePassword(Long userId, String oldPassword, String newPassword) { + User user = userDao.findById(userId).orElse(null); + if (user==null){ + return ResponseVo.fail("用户不存在"); + } + //注意采用BCryptPasswordEncoder来加密,两次相同输入加密后结果也会不同,因此不能使用equals方法,采用内置的方法 + if (!passwordEncoder.matches(oldPassword,user.getPassword())){ + return ResponseVo.fail("密码错误哦"); + } + userDao.updatePassword(passwordEncoder.encode(newPassword),userId); + return ResponseVo.ok(); + } + + @Override + public User findByUsername(String username) { + return userDao.findByUsername(username); + } +} diff --git "a/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/vo/BookVo.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/vo/BookVo.java" new file mode 100644 index 0000000000000000000000000000000000000000..cb6845c0e3ce6541a57055f5b2e45ec22379a80d --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/vo/BookVo.java" @@ -0,0 +1,18 @@ +package edu.nwpu.vo; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +public class BookVo { + private Long bookId; + private String name; + + public BookVo(Long bookId, String name) { + this.bookId = bookId; + this.name = name; + } +} diff --git "a/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/vo/RecordBookVo.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/vo/RecordBookVo.java" new file mode 100644 index 0000000000000000000000000000000000000000..501669fa13539521fffc8b1ec1a6cc400ca2524b --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/vo/RecordBookVo.java" @@ -0,0 +1,29 @@ +package edu.nwpu.vo; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.util.Date; +@Getter +@Setter +@ToString +public class RecordBookVo { + private Long recordId; + private Long bookId; + private String name; + private Date borrowDate; + private Date returnDate; + + public RecordBookVo() { + + } + + public RecordBookVo(Long recordId, Long bookId, String name, Date borrowDate, Date returnDate) { + this.recordId = recordId; + this.bookId = bookId; + this.name = name; + this.borrowDate = borrowDate; + this.returnDate = returnDate; + } +} diff --git "a/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/vo/RecordVo.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/vo/RecordVo.java" new file mode 100644 index 0000000000000000000000000000000000000000..f881955e1ac3c7718e470d072b2c261d6c718d9e --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/vo/RecordVo.java" @@ -0,0 +1,29 @@ +package edu.nwpu.vo; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.util.Date; +@Getter +@Setter +@ToString +public class RecordVo { + private Long recordId; + private Long userId; + private String username; + private Date borrowDate; + private Date returnDate; + + public RecordVo() { + + } + + public RecordVo(Long recordId, Long userId, String username, Date borrowDate, Date returnDate) { + this.recordId = recordId; + this.userId = userId; + this.username = username; + this.borrowDate = borrowDate; + this.returnDate = returnDate; + } +} diff --git "a/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/vo/ResponseVo.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/vo/ResponseVo.java" new file mode 100644 index 0000000000000000000000000000000000000000..009b3242683719cbc9024b22c9a8cdc0f1faf147 --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/vo/ResponseVo.java" @@ -0,0 +1,26 @@ +package edu.nwpu.vo; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +public class ResponseVo { + private int code; + private String msg; + + public ResponseVo(int code, String msg) { + this.code = code; + this.msg = msg; + } + + public static ResponseVo ok(){ + return new ResponseVo(1,"ok"); + } + + public static ResponseVo fail(String msg){ + return new ResponseVo(0,msg); + } +} diff --git "a/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/vo/UserVo.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/vo/UserVo.java" new file mode 100644 index 0000000000000000000000000000000000000000..2e53c27f825f8c424fba8dfc4a16c4ce108d3252 --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/nwpu/vo/UserVo.java" @@ -0,0 +1,18 @@ +package edu.nwpu.vo; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +public class UserVo { + private Long userId; + private String username; + + public UserVo(Long userId, String username) { + this.userId = userId; + this.username = username; + } +} diff --git "a/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/util/JwtUtils.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/util/JwtUtils.java" new file mode 100644 index 0000000000000000000000000000000000000000..d4454e58b119afee43308356f9aaad00964050e4 --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/src/main/java/edu/util/JwtUtils.java" @@ -0,0 +1,42 @@ +package edu.util; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTCreator; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.interfaces.DecodedJWT; + +import java.util.Calendar; +import java.util.Map; + +public class JwtUtils { + private static String SECRET = "jpa+token+sejhfncj^%$^%*^&"; + + /** + * 生产token + */ + public static String getToken(Map map) { + JWTCreator.Builder builder = JWT.create(); + //payload + map.forEach((k, v) -> { + builder.withClaim(k, v); + }); + //默认7天过期 + Calendar instance = Calendar.getInstance(); + instance.add(Calendar.DATE, 7); + //指定令牌的过期时间 + builder.withExpiresAt(instance.getTime()); + //签名 + String token = builder.sign(Algorithm.HMAC256(SECRET)); + return token; + } + + /** + * 验证token + */ + public static DecodedJWT verify(String token) { + //如果有任何验证异常,此处都会抛出异常 + DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token); + return decodedJWT; + } + +} diff --git "a/practice1:2019302650-\345\205\260\345\206\233/src/main/resources/application.yaml" "b/practice1:2019302650-\345\205\260\345\206\233/src/main/resources/application.yaml" new file mode 100644 index 0000000000000000000000000000000000000000..399cc24a103ab081b11d38d091e4afd157fa5916 --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/src/main/resources/application.yaml" @@ -0,0 +1,15 @@ +spring: + datasource: + username: root + password: root + url: jdbc:mysql://localhost:3306/jpademo?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.alibaba.druid.pool.DruidDataSource + + jpa: + hibernate: + ddl-auto: create + show-sql: true + +server: + port: 8081 \ No newline at end of file diff --git "a/practice1:2019302650-\345\205\260\345\206\233/src/test/java/edu/nwpu/JpaDay6ApplicationTests.java" "b/practice1:2019302650-\345\205\260\345\206\233/src/test/java/edu/nwpu/JpaDay6ApplicationTests.java" new file mode 100644 index 0000000000000000000000000000000000000000..3568d1461da867efc5606b84e9a23b5626ee0682 --- /dev/null +++ "b/practice1:2019302650-\345\205\260\345\206\233/src/test/java/edu/nwpu/JpaDay6ApplicationTests.java" @@ -0,0 +1,17 @@ +package edu.nwpu; + +import edu.nwpu.service.UserService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class JpaDay7ApplicationTests { + @Autowired + UserService userService; + @Test + void contextLoads() { + userService.addUser("admin","123","344@163.com","admin","admin"); + } + +}