From df51dac024ebbee06c5bb321585edd30ca507db4 Mon Sep 17 00:00:00 2001 From: heshunme Date: Wed, 3 Jul 2024 01:43:37 +0800 Subject: [PATCH 01/28] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E4=BA=86news=E5=AE=9E?= =?UTF-8?q?=E4=BD=93=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/NewsManagement/model/News.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/org/cmh/backend/NewsManagement/model/News.java diff --git a/src/main/java/org/cmh/backend/NewsManagement/model/News.java b/src/main/java/org/cmh/backend/NewsManagement/model/News.java new file mode 100644 index 0000000..407b1df --- /dev/null +++ b/src/main/java/org/cmh/backend/NewsManagement/model/News.java @@ -0,0 +1,22 @@ +package org.cmh.backend.NewsManagement.model; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +@Entity +public class News { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String title; + private String summary; + private String content; + private String imagePath; + private String author; +} From 97d2ba60f587b90d8b1a7b272bc3d189aec80a5b Mon Sep 17 00:00:00 2001 From: heshunme Date: Wed, 3 Jul 2024 01:58:41 +0800 Subject: [PATCH 02/28] =?UTF-8?q?chat=E8=AE=BE=E8=AE=A1=E4=BA=86newsContro?= =?UTF-8?q?ller=EF=BC=8C=E5=BE=85=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/NewsController.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java diff --git a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java new file mode 100644 index 0000000..d0a2ff0 --- /dev/null +++ b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java @@ -0,0 +1,43 @@ +package org.cmh.backend.NewsManagement.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("/api/news") +public class NewsController { + // @PostMapping("/example") +// public ResponseEntity example(@RequestBody ExampleRequest request) { +// return new ResponseEntity<>(new ExampleResponse("Hello World!"), HttpStatus.OK); +// } + @GetMapping + public ResponseEntity> getNewsList( + @RequestParam(required = false) String title, + @RequestParam(required = false) String summary, + @RequestParam(required = false) String author) { + // TODO: 实现获取资讯列表的逻辑 + return new ResponseEntity<>(new ArrayList<>(), HttpStatus.OK); + } + + @PostMapping + public ResponseEntity createNews(@RequestBody NewsRequest request) { + // TODO: 实现创建资讯的逻辑 + return new ResponseEntity<>("创建成功", HttpStatus.OK); + } + + @PutMapping("/{id}") + public ResponseEntity updateNews(@PathVariable Long id, @RequestBody NewsRequest request) { + // TODO: 实现修改资讯的逻辑 + return new ResponseEntity<>("修改成功", HttpStatus.OK); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteNews(@PathVariable Long id) { + // TODO: 实现删除资讯的逻辑 + return new ResponseEntity<>("删除成功", HttpStatus.OK); + } +} From f9a6a3c4810df454ad45d4e24bd3013525e3eb4e Mon Sep 17 00:00:00 2001 From: heshunme Date: Wed, 3 Jul 2024 11:06:54 +0800 Subject: [PATCH 03/28] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=BB=BA=E7=AB=8B?= =?UTF-8?q?=E4=BA=86NewsRepository?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/NewsRepository.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java diff --git a/src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java b/src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java new file mode 100644 index 0000000..3fb4c1a --- /dev/null +++ b/src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java @@ -0,0 +1,19 @@ +package org.cmh.backend.NewsManagement.repository; + +import org.cmh.backend.NewsManagement.model.News; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface NewsRepository extends JpaRepository { + News findByTitle(String title); + + News findBySummary(String summary); + + News findByAuthor(String author); + + News findByImagePath(String imagePath); + + News findByContent(String content); + + News findByTitleAndSummaryAndAuthorAndImagePath(String title, String summary, String author, String imagePath); + +} \ No newline at end of file From 3579f93c0d46376efa362702ef3f80a94f0fb7e9 Mon Sep 17 00:00:00 2001 From: heshunme Date: Wed, 3 Jul 2024 12:36:27 +0800 Subject: [PATCH 04/28] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BA=86/news/getNewsL?= =?UTF-8?q?ist=E5=85=A8=E6=95=B0=E6=8D=AE=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/NewsController.java | 70 ++++++++++--------- .../dto/GetNewsByPageRequest.java | 13 ++++ .../repository/NewsRepository.java | 6 ++ .../NewsManagement/service/NewsService.java | 29 ++++++++ 4 files changed, 84 insertions(+), 34 deletions(-) create mode 100644 src/main/java/org/cmh/backend/NewsManagement/dto/GetNewsByPageRequest.java create mode 100644 src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java diff --git a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java index d0a2ff0..30d0f45 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java +++ b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java @@ -1,43 +1,45 @@ package org.cmh.backend.NewsManagement.controller; +import org.cmh.backend.NewsManagement.dto.GetNewsByPageRequest; +import org.cmh.backend.NewsManagement.model.News; +import org.cmh.backend.NewsManagement.service.NewsService; +import org.cmh.backend.Utils.JwtVerify; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.ArrayList; -import java.util.List; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("/api/news") +@RequestMapping("/news") public class NewsController { - // @PostMapping("/example") -// public ResponseEntity example(@RequestBody ExampleRequest request) { -// return new ResponseEntity<>(new ExampleResponse("Hello World!"), HttpStatus.OK); + @Autowired + private NewsService newsService; + + @GetMapping("/getNewsPage") + @JwtVerify + public ResponseEntity> getNewsPage(@RequestBody GetNewsByPageRequest request) { + return new ResponseEntity<>(newsService.getNewsByPage(request), HttpStatus.OK); + } + +// @PostMapping +// public ResponseEntity createNews(@RequestBody NewsRequest request) { +// // TODO: 实现创建资讯的逻辑 +// return new ResponseEntity<>("创建成功", HttpStatus.OK); +// } +// +// @PutMapping("/{id}") +// public ResponseEntity updateNews(@PathVariable Long id, @RequestBody NewsRequest request) { +// // TODO: 实现修改资讯的逻辑 +// return new ResponseEntity<>("修改成功", HttpStatus.OK); +// } +// +// @DeleteMapping("/{id}") +// public ResponseEntity deleteNews(@PathVariable Long id) { +// // TODO: 实现删除资讯的逻辑 +// return new ResponseEntity<>("删除成功", HttpStatus.OK); // } - @GetMapping - public ResponseEntity> getNewsList( - @RequestParam(required = false) String title, - @RequestParam(required = false) String summary, - @RequestParam(required = false) String author) { - // TODO: 实现获取资讯列表的逻辑 - return new ResponseEntity<>(new ArrayList<>(), HttpStatus.OK); - } - - @PostMapping - public ResponseEntity createNews(@RequestBody NewsRequest request) { - // TODO: 实现创建资讯的逻辑 - return new ResponseEntity<>("创建成功", HttpStatus.OK); - } - - @PutMapping("/{id}") - public ResponseEntity updateNews(@PathVariable Long id, @RequestBody NewsRequest request) { - // TODO: 实现修改资讯的逻辑 - return new ResponseEntity<>("修改成功", HttpStatus.OK); - } - - @DeleteMapping("/{id}") - public ResponseEntity deleteNews(@PathVariable Long id) { - // TODO: 实现删除资讯的逻辑 - return new ResponseEntity<>("删除成功", HttpStatus.OK); - } } diff --git a/src/main/java/org/cmh/backend/NewsManagement/dto/GetNewsByPageRequest.java b/src/main/java/org/cmh/backend/NewsManagement/dto/GetNewsByPageRequest.java new file mode 100644 index 0000000..1ad7ffc --- /dev/null +++ b/src/main/java/org/cmh/backend/NewsManagement/dto/GetNewsByPageRequest.java @@ -0,0 +1,13 @@ +package org.cmh.backend.NewsManagement.dto; + +import lombok.Getter; +import lombok.Setter; +import org.cmh.backend.Utils.JwtRequest; + + +@Getter +@Setter +public class GetNewsByPageRequest extends JwtRequest { + private Integer pageNo; + private Integer pageSize; +} diff --git a/src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java b/src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java index 3fb4c1a..7faad95 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java +++ b/src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java @@ -1,8 +1,13 @@ package org.cmh.backend.NewsManagement.repository; import org.cmh.backend.NewsManagement.model.News; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.ArrayList; +import java.util.List; + public interface NewsRepository extends JpaRepository { News findByTitle(String title); @@ -16,4 +21,5 @@ public interface NewsRepository extends JpaRepository { News findByTitleAndSummaryAndAuthorAndImagePath(String title, String summary, String author, String imagePath); + Page findAllByOrderByIdDesc(Pageable pageable); } \ No newline at end of file diff --git a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java new file mode 100644 index 0000000..3f42e2c --- /dev/null +++ b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java @@ -0,0 +1,29 @@ +package org.cmh.backend.NewsManagement.service; + +import org.cmh.backend.NewsManagement.dto.GetNewsByPageRequest; +import org.cmh.backend.NewsManagement.model.News; +import org.cmh.backend.NewsManagement.repository.NewsRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +@Service +public class NewsService { + @Autowired + private NewsRepository newsRepository; + + public Page getNewsByPage(GetNewsByPageRequest request) { + int pageNo = request.getPageNo(); + int pageSize = request.getPageSize(); + if (pageNo < 1) { + pageNo = 1; + } + if (pageSize < 1) { + pageSize = 10; + } + Pageable pageable = PageRequest.of(pageNo - 1, pageSize); + return newsRepository.findAllByOrderByIdDesc(pageable); + } +} From 64d7ae8c593f60e3a923ddae99389abc0a532257 Mon Sep 17 00:00:00 2001 From: heshunme Date: Wed, 3 Jul 2024 13:02:32 +0800 Subject: [PATCH 05/28] =?UTF-8?q?=E6=A0=B9=E6=8D=AEwarning=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=B8=BApagedModel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/NewsController.java | 4 ++-- .../NewsManagement/service/NewsService.java | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java index 30d0f45..969d774 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java +++ b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java @@ -5,7 +5,7 @@ import org.cmh.backend.NewsManagement.model.News; import org.cmh.backend.NewsManagement.service.NewsService; import org.cmh.backend.Utils.JwtVerify; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; +import org.springframework.hateoas.PagedModel; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -21,7 +21,7 @@ public class NewsController { @GetMapping("/getNewsPage") @JwtVerify - public ResponseEntity> getNewsPage(@RequestBody GetNewsByPageRequest request) { + public ResponseEntity> getNewsPage(@RequestBody GetNewsByPageRequest request) { return new ResponseEntity<>(newsService.getNewsByPage(request), HttpStatus.OK); } diff --git a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java index 3f42e2c..2b7aa03 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java +++ b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java @@ -7,6 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.hateoas.PagedModel; import org.springframework.stereotype.Service; @Service @@ -14,7 +15,7 @@ public class NewsService { @Autowired private NewsRepository newsRepository; - public Page getNewsByPage(GetNewsByPageRequest request) { + public PagedModel getNewsByPage(GetNewsByPageRequest request) { int pageNo = request.getPageNo(); int pageSize = request.getPageSize(); if (pageNo < 1) { @@ -24,6 +25,17 @@ public class NewsService { pageSize = 10; } Pageable pageable = PageRequest.of(pageNo - 1, pageSize); - return newsRepository.findAllByOrderByIdDesc(pageable); + Page newsPage = newsRepository.findAllByOrderByIdDesc(pageable); + return toPagedModel(newsPage); + } + + private PagedModel toPagedModel(Page page) { + PagedModel.PageMetadata pageMetadata = new PagedModel.PageMetadata( + page.getSize(), + page.getNumber(), + page.getTotalElements(), + page.getTotalPages() + ); + return PagedModel.of(page.getContent(), pageMetadata); } } From e56db8a92e7f6480d116a13ed93b7bda68c3bf8b Mon Sep 17 00:00:00 2001 From: heshunme Date: Wed, 3 Jul 2024 13:02:40 +0800 Subject: [PATCH 06/28] =?UTF-8?q?Revert=20"=E6=A0=B9=E6=8D=AEwarning?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=BApagedModel"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 64d7ae8c593f60e3a923ddae99389abc0a532257. --- .../controller/NewsController.java | 4 ++-- .../NewsManagement/service/NewsService.java | 16 ++-------------- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java index 969d774..30d0f45 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java +++ b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java @@ -5,7 +5,7 @@ import org.cmh.backend.NewsManagement.model.News; import org.cmh.backend.NewsManagement.service.NewsService; import org.cmh.backend.Utils.JwtVerify; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.hateoas.PagedModel; +import org.springframework.data.domain.Page; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -21,7 +21,7 @@ public class NewsController { @GetMapping("/getNewsPage") @JwtVerify - public ResponseEntity> getNewsPage(@RequestBody GetNewsByPageRequest request) { + public ResponseEntity> getNewsPage(@RequestBody GetNewsByPageRequest request) { return new ResponseEntity<>(newsService.getNewsByPage(request), HttpStatus.OK); } diff --git a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java index 2b7aa03..3f42e2c 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java +++ b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java @@ -7,7 +7,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; -import org.springframework.hateoas.PagedModel; import org.springframework.stereotype.Service; @Service @@ -15,7 +14,7 @@ public class NewsService { @Autowired private NewsRepository newsRepository; - public PagedModel getNewsByPage(GetNewsByPageRequest request) { + public Page getNewsByPage(GetNewsByPageRequest request) { int pageNo = request.getPageNo(); int pageSize = request.getPageSize(); if (pageNo < 1) { @@ -25,17 +24,6 @@ public class NewsService { pageSize = 10; } Pageable pageable = PageRequest.of(pageNo - 1, pageSize); - Page newsPage = newsRepository.findAllByOrderByIdDesc(pageable); - return toPagedModel(newsPage); - } - - private PagedModel toPagedModel(Page page) { - PagedModel.PageMetadata pageMetadata = new PagedModel.PageMetadata( - page.getSize(), - page.getNumber(), - page.getTotalElements(), - page.getTotalPages() - ); - return PagedModel.of(page.getContent(), pageMetadata); + return newsRepository.findAllByOrderByIdDesc(pageable); } } From 961a17efefb7d0d82ee9133399422118cdb9fa53 Mon Sep 17 00:00:00 2001 From: heshunme Date: Wed, 3 Jul 2024 13:08:31 +0800 Subject: [PATCH 07/28] =?UTF-8?q?=E7=BB=99news=E5=AE=9E=E4=BD=93=E7=B1=BB?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BA=A6=E6=9D=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/cmh/backend/NewsManagement/model/News.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/cmh/backend/NewsManagement/model/News.java b/src/main/java/org/cmh/backend/NewsManagement/model/News.java index 407b1df..1336d62 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/model/News.java +++ b/src/main/java/org/cmh/backend/NewsManagement/model/News.java @@ -1,9 +1,6 @@ package org.cmh.backend.NewsManagement.model; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @@ -14,9 +11,18 @@ public class News { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + + @Column(nullable = false, unique = true) private String title; + + @Column(nullable = false) private String summary; + + @Column(nullable = false) private String content; + private String imagePath; + + @Column(nullable = false) private String author; } From b4bdd2fc8352a9922258ecc2aac6827c1cde74e5 Mon Sep 17 00:00:00 2001 From: heshunme Date: Wed, 3 Jul 2024 13:17:41 +0800 Subject: [PATCH 08/28] =?UTF-8?q?=E7=BB=99news=E5=AE=9E=E4=BD=93=E7=B1=BB?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=87=AA=E5=8A=A8=E7=94=9F=E6=88=90=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=88=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/cmh/backend/NewsManagement/model/News.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/org/cmh/backend/NewsManagement/model/News.java b/src/main/java/org/cmh/backend/NewsManagement/model/News.java index 1336d62..607ff3e 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/model/News.java +++ b/src/main/java/org/cmh/backend/NewsManagement/model/News.java @@ -3,6 +3,9 @@ package org.cmh.backend.NewsManagement.model; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; +import org.hibernate.annotations.CreationTimestamp; + +import java.time.LocalDateTime; @Setter @Getter @@ -25,4 +28,7 @@ public class News { @Column(nullable = false) private String author; + + @CreationTimestamp + private LocalDateTime createdAt; } From 65f15eb9a974dd9e7d3f7e187a73380b219c1808 Mon Sep 17 00:00:00 2001 From: heshunme Date: Wed, 3 Jul 2024 13:41:01 +0800 Subject: [PATCH 09/28] =?UTF-8?q?createNews=E5=B7=B2=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/NewsController.java | 27 ++++++++++++------- .../NewsManagement/dto/MessageResponse.java | 12 +++++++++ .../NewsManagement/dto/NewsRequest.java | 15 +++++++++++ .../NewsManagement/service/NewsService.java | 11 ++++++++ 4 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 src/main/java/org/cmh/backend/NewsManagement/dto/MessageResponse.java create mode 100644 src/main/java/org/cmh/backend/NewsManagement/dto/NewsRequest.java diff --git a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java index 30d0f45..aa48f13 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java +++ b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java @@ -1,17 +1,17 @@ package org.cmh.backend.NewsManagement.controller; import org.cmh.backend.NewsManagement.dto.GetNewsByPageRequest; +import org.cmh.backend.NewsManagement.dto.MessageResponse; +import org.cmh.backend.NewsManagement.dto.NewsRequest; import org.cmh.backend.NewsManagement.model.News; import org.cmh.backend.NewsManagement.service.NewsService; import org.cmh.backend.Utils.JwtVerify; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.data.domain.Page; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/news") @@ -25,12 +25,19 @@ public class NewsController { return new ResponseEntity<>(newsService.getNewsByPage(request), HttpStatus.OK); } -// @PostMapping -// public ResponseEntity createNews(@RequestBody NewsRequest request) { -// // TODO: 实现创建资讯的逻辑 -// return new ResponseEntity<>("创建成功", HttpStatus.OK); -// } -// + @PostMapping + @JwtVerify + public ResponseEntity createNews(@RequestBody NewsRequest request) { + try { + newsService.createNews(request); + } catch (DataIntegrityViolationException e) { + return new ResponseEntity<>(new MessageResponse("创建失败,文章已存在或缺少字段"), HttpStatus.BAD_REQUEST); + } catch (Exception e) { + return new ResponseEntity<>(new MessageResponse("创建失败:" + e.getMessage()), HttpStatus.BAD_REQUEST); + } + return new ResponseEntity<>(new MessageResponse("创建成功"), HttpStatus.OK); + } + // @PutMapping("/{id}") // public ResponseEntity updateNews(@PathVariable Long id, @RequestBody NewsRequest request) { // // TODO: 实现修改资讯的逻辑 diff --git a/src/main/java/org/cmh/backend/NewsManagement/dto/MessageResponse.java b/src/main/java/org/cmh/backend/NewsManagement/dto/MessageResponse.java new file mode 100644 index 0000000..b777601 --- /dev/null +++ b/src/main/java/org/cmh/backend/NewsManagement/dto/MessageResponse.java @@ -0,0 +1,12 @@ +package org.cmh.backend.NewsManagement.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class MessageResponse { + String message; +} diff --git a/src/main/java/org/cmh/backend/NewsManagement/dto/NewsRequest.java b/src/main/java/org/cmh/backend/NewsManagement/dto/NewsRequest.java new file mode 100644 index 0000000..3aa8228 --- /dev/null +++ b/src/main/java/org/cmh/backend/NewsManagement/dto/NewsRequest.java @@ -0,0 +1,15 @@ +package org.cmh.backend.NewsManagement.dto; + +import lombok.Getter; +import lombok.Setter; +import org.cmh.backend.Utils.JwtRequest; + +@Getter +@Setter +public class NewsRequest extends JwtRequest { + private String title; + private String summary; + private String content; + private String imagePath; + private String author; +} diff --git a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java index 3f42e2c..8606776 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java +++ b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java @@ -1,6 +1,7 @@ package org.cmh.backend.NewsManagement.service; import org.cmh.backend.NewsManagement.dto.GetNewsByPageRequest; +import org.cmh.backend.NewsManagement.dto.NewsRequest; import org.cmh.backend.NewsManagement.model.News; import org.cmh.backend.NewsManagement.repository.NewsRepository; import org.springframework.beans.factory.annotation.Autowired; @@ -26,4 +27,14 @@ public class NewsService { Pageable pageable = PageRequest.of(pageNo - 1, pageSize); return newsRepository.findAllByOrderByIdDesc(pageable); } + + public void createNews(NewsRequest request) { + News news = new News(); + news.setTitle(request.getTitle()); + news.setSummary(request.getSummary()); + news.setContent(request.getContent()); + news.setAuthor(request.getAuthor()); + news.setImagePath(request.getImagePath()); + newsRepository.save(news); + } } From e6ba8c9a1234660dbdc2491e4a76cdad240f7c48 Mon Sep 17 00:00:00 2001 From: heshunme Date: Wed, 3 Jul 2024 13:48:10 +0800 Subject: [PATCH 10/28] =?UTF-8?q?updateNews=E5=B7=B2=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/NewsController.java | 17 ++++++++++++----- .../NewsManagement/service/NewsService.java | 12 ++++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java index aa48f13..cec332d 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java +++ b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java @@ -38,11 +38,18 @@ public class NewsController { return new ResponseEntity<>(new MessageResponse("创建成功"), HttpStatus.OK); } -// @PutMapping("/{id}") -// public ResponseEntity updateNews(@PathVariable Long id, @RequestBody NewsRequest request) { -// // TODO: 实现修改资讯的逻辑 -// return new ResponseEntity<>("修改成功", HttpStatus.OK); -// } + @PutMapping("/{id}") + @JwtVerify + public ResponseEntity updateNews(@RequestBody NewsRequest request, @PathVariable Long id) { + try { + newsService.updateNews(id, request); + } catch (DataIntegrityViolationException e) { + return new ResponseEntity<>(new MessageResponse("修改失败,新标题已存在或缺少字段"), HttpStatus.BAD_REQUEST); + } catch (Exception e) { + return new ResponseEntity<>(new MessageResponse("创建失败:" + e.getMessage()), HttpStatus.BAD_REQUEST); + } + return new ResponseEntity<>(new MessageResponse("修改成功"), HttpStatus.OK); + } // // @DeleteMapping("/{id}") // public ResponseEntity deleteNews(@PathVariable Long id) { diff --git a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java index 8606776..759ded8 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java +++ b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java @@ -37,4 +37,16 @@ public class NewsService { news.setImagePath(request.getImagePath()); newsRepository.save(news); } + + public void updateNews(Long id, NewsRequest request) { + News news = newsRepository.findById(id).orElse(null); + if (news != null) { + news.setTitle(request.getTitle()); + news.setSummary(request.getSummary()); + news.setContent(request.getContent()); + news.setAuthor(request.getAuthor()); + news.setImagePath(request.getImagePath()); + newsRepository.save(news); + } + } } From 6c36552c2f142b01532d7d9499d0f7fae0bff22f Mon Sep 17 00:00:00 2001 From: heshunme Date: Wed, 3 Jul 2024 13:53:16 +0800 Subject: [PATCH 11/28] =?UTF-8?q?=E9=87=8D=E5=86=99=E4=BA=86getNewsPage?= =?UTF-8?q?=E6=96=B9=E6=B3=95=EF=BC=8C=E5=8F=96=E6=B6=88=E4=BA=86DTO?= =?UTF-8?q?=EF=BC=8C=E6=94=B9=E7=94=A8url=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NewsManagement/controller/NewsController.java | 8 +++----- .../NewsManagement/dto/GetNewsByPageRequest.java | 13 ------------- .../backend/NewsManagement/service/NewsService.java | 5 +---- 3 files changed, 4 insertions(+), 22 deletions(-) delete mode 100644 src/main/java/org/cmh/backend/NewsManagement/dto/GetNewsByPageRequest.java diff --git a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java index cec332d..c0f032c 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java +++ b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java @@ -1,6 +1,5 @@ package org.cmh.backend.NewsManagement.controller; -import org.cmh.backend.NewsManagement.dto.GetNewsByPageRequest; import org.cmh.backend.NewsManagement.dto.MessageResponse; import org.cmh.backend.NewsManagement.dto.NewsRequest; import org.cmh.backend.NewsManagement.model.News; @@ -19,10 +18,9 @@ public class NewsController { @Autowired private NewsService newsService; - @GetMapping("/getNewsPage") - @JwtVerify - public ResponseEntity> getNewsPage(@RequestBody GetNewsByPageRequest request) { - return new ResponseEntity<>(newsService.getNewsByPage(request), HttpStatus.OK); + @GetMapping + public ResponseEntity> getNewsPage(@RequestParam Integer pageNo, @RequestParam Integer pageSize) { + return new ResponseEntity<>(newsService.getNewsByPage(pageNo, pageSize), HttpStatus.OK); } @PostMapping diff --git a/src/main/java/org/cmh/backend/NewsManagement/dto/GetNewsByPageRequest.java b/src/main/java/org/cmh/backend/NewsManagement/dto/GetNewsByPageRequest.java deleted file mode 100644 index 1ad7ffc..0000000 --- a/src/main/java/org/cmh/backend/NewsManagement/dto/GetNewsByPageRequest.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.cmh.backend.NewsManagement.dto; - -import lombok.Getter; -import lombok.Setter; -import org.cmh.backend.Utils.JwtRequest; - - -@Getter -@Setter -public class GetNewsByPageRequest extends JwtRequest { - private Integer pageNo; - private Integer pageSize; -} diff --git a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java index 759ded8..91a6f78 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java +++ b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java @@ -1,6 +1,5 @@ package org.cmh.backend.NewsManagement.service; -import org.cmh.backend.NewsManagement.dto.GetNewsByPageRequest; import org.cmh.backend.NewsManagement.dto.NewsRequest; import org.cmh.backend.NewsManagement.model.News; import org.cmh.backend.NewsManagement.repository.NewsRepository; @@ -15,9 +14,7 @@ public class NewsService { @Autowired private NewsRepository newsRepository; - public Page getNewsByPage(GetNewsByPageRequest request) { - int pageNo = request.getPageNo(); - int pageSize = request.getPageSize(); + public Page getNewsByPage(int pageNo, int pageSize) { if (pageNo < 1) { pageNo = 1; } From a5aac1199d9c963269efbfc7b8116bf42da0d0e5 Mon Sep 17 00:00:00 2001 From: heshunme Date: Wed, 3 Jul 2024 13:58:09 +0800 Subject: [PATCH 12/28] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E4=BA=86@JwtVerify?= =?UTF-8?q?=E7=9A=84=E8=83=BD=E5=8A=9B=EF=BC=8C=E7=8E=B0=E5=9C=A8=E8=A2=AB?= =?UTF-8?q?=E4=BF=AE=E9=A5=B0=E7=9A=84=E6=96=B9=E6=B3=95=E7=9A=84=E4=BB=BB?= =?UTF-8?q?=E6=84=8F=E4=B8=80=E4=B8=AA=E5=8F=82=E6=95=B0=E6=98=AF=E7=BB=A7?= =?UTF-8?q?=E6=89=BF=E4=BA=8EJwtRequest=E7=9A=84=E5=AF=B9=E8=B1=A1?= =?UTF-8?q?=E5=8D=B3=E5=8F=AF=EF=BC=8C=E4=B8=8D=E5=86=8D=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E4=B8=BA=E7=AC=AC=E4=B8=80=E4=B8=AA=E5=8F=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/cmh/backend/Utils/JwtVerifyAspect.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/cmh/backend/Utils/JwtVerifyAspect.java b/src/main/java/org/cmh/backend/Utils/JwtVerifyAspect.java index 42408c9..26cee34 100644 --- a/src/main/java/org/cmh/backend/Utils/JwtVerifyAspect.java +++ b/src/main/java/org/cmh/backend/Utils/JwtVerifyAspect.java @@ -1,5 +1,6 @@ package org.cmh.backend.Utils; +import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @@ -7,13 +8,17 @@ import org.springframework.stereotype.Component; @Aspect @Component public class JwtVerifyAspect { - @Before("@annotation(JwtVerify) && args(request,..)") - public void verifyJwtToken(Object request) throws JwtValidationException { - if (request instanceof JwtRequest) { - String token = ((JwtRequest) request).getToken(); - if (!JwtUtil.isTokenValid(token)) { - throw new JwtValidationException("JWT token is invalid"); + @Before("@annotation(JwtVerify)") + public void verifyJwtToken(JoinPoint joinPoint) throws JwtValidationException { + Object[] args = joinPoint.getArgs(); + for (Object arg : args) { + if (arg instanceof JwtRequest jwtRequest) { + String token = jwtRequest.getToken(); + if (!JwtUtil.isTokenValid(token)) { + throw new JwtValidationException("JWT token is invalid"); + } } + break; } } } From c4f0b2348f2e73df551cd0f4b5a893674bb933fe Mon Sep 17 00:00:00 2001 From: heshunme Date: Wed, 3 Jul 2024 14:12:42 +0800 Subject: [PATCH 13/28] bugfix@JwtVerify --- src/main/java/org/cmh/backend/Utils/JwtVerifyAspect.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/cmh/backend/Utils/JwtVerifyAspect.java b/src/main/java/org/cmh/backend/Utils/JwtVerifyAspect.java index 26cee34..5104981 100644 --- a/src/main/java/org/cmh/backend/Utils/JwtVerifyAspect.java +++ b/src/main/java/org/cmh/backend/Utils/JwtVerifyAspect.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Component; @Aspect @Component public class JwtVerifyAspect { - @Before("@annotation(JwtVerify)") + @Before("@annotation(JwtVerify)&&args(..)") public void verifyJwtToken(JoinPoint joinPoint) throws JwtValidationException { Object[] args = joinPoint.getArgs(); for (Object arg : args) { @@ -17,8 +17,8 @@ public class JwtVerifyAspect { if (!JwtUtil.isTokenValid(token)) { throw new JwtValidationException("JWT token is invalid"); } + break; } - break; } } } From a532eaa89c99f3141a1876416d4d1d1441ba624f Mon Sep 17 00:00:00 2001 From: heshunme Date: Wed, 3 Jul 2024 14:13:05 +0800 Subject: [PATCH 14/28] =?UTF-8?q?=E5=B0=9D=E8=AF=95@JwtVerify=E7=9A=84?= =?UTF-8?q?=E6=96=B0=E7=94=A8=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmh/backend/NewsManagement/controller/NewsController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java index c0f032c..f11e916 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java +++ b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java @@ -38,7 +38,7 @@ public class NewsController { @PutMapping("/{id}") @JwtVerify - public ResponseEntity updateNews(@RequestBody NewsRequest request, @PathVariable Long id) { + public ResponseEntity updateNews(@PathVariable Long id, @RequestBody NewsRequest request) { try { newsService.updateNews(id, request); } catch (DataIntegrityViolationException e) { From a4713648a21c1c94025c04a1dc35ad6e1d1cda66 Mon Sep 17 00:00:00 2001 From: heshunme Date: Wed, 3 Jul 2024 14:39:05 +0800 Subject: [PATCH 15/28] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BA=86delete?= =?UTF-8?q?=EF=BC=8C=E5=B0=9D=E8=AF=95@JwtVerify=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E5=8F=82=E6=95=B0=E7=9A=84=E7=94=A8?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/NewsController.java | 18 ++++++++++++------ .../repository/NewsRepository.java | 15 --------------- .../NewsManagement/service/NewsService.java | 8 ++++++++ 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java index f11e916..e677ca0 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java +++ b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java @@ -1,5 +1,6 @@ package org.cmh.backend.NewsManagement.controller; +import jakarta.persistence.EntityNotFoundException; import org.cmh.backend.NewsManagement.dto.MessageResponse; import org.cmh.backend.NewsManagement.dto.NewsRequest; import org.cmh.backend.NewsManagement.model.News; @@ -48,10 +49,15 @@ public class NewsController { } return new ResponseEntity<>(new MessageResponse("修改成功"), HttpStatus.OK); } -// -// @DeleteMapping("/{id}") -// public ResponseEntity deleteNews(@PathVariable Long id) { -// // TODO: 实现删除资讯的逻辑 -// return new ResponseEntity<>("删除成功", HttpStatus.OK); -// } + + @DeleteMapping("/{id}") + @JwtVerify + public ResponseEntity deleteNews(@PathVariable Long id, @RequestParam String token) { + try { + newsService.deleteNews(id); + } catch (EntityNotFoundException e) { + return new ResponseEntity<>(new MessageResponse("删除失败,文章不存在"), HttpStatus.BAD_REQUEST); + } + return new ResponseEntity<>(new MessageResponse("删除成功"), HttpStatus.OK); + } } diff --git a/src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java b/src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java index 7faad95..5997b39 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java +++ b/src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java @@ -5,21 +5,6 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; -import java.util.ArrayList; -import java.util.List; - public interface NewsRepository extends JpaRepository { - News findByTitle(String title); - - News findBySummary(String summary); - - News findByAuthor(String author); - - News findByImagePath(String imagePath); - - News findByContent(String content); - - News findByTitleAndSummaryAndAuthorAndImagePath(String title, String summary, String author, String imagePath); - Page findAllByOrderByIdDesc(Pageable pageable); } \ No newline at end of file diff --git a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java index 91a6f78..bb7f9b6 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java +++ b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java @@ -1,5 +1,6 @@ package org.cmh.backend.NewsManagement.service; +import jakarta.persistence.EntityNotFoundException; import org.cmh.backend.NewsManagement.dto.NewsRequest; import org.cmh.backend.NewsManagement.model.News; import org.cmh.backend.NewsManagement.repository.NewsRepository; @@ -46,4 +47,11 @@ public class NewsService { newsRepository.save(news); } } + + public void deleteNews(Long id) { + if (!newsRepository.existsById(id)) { + throw new EntityNotFoundException("News with id " + id + " not found."); + } + newsRepository.deleteById(id); + } } From df34d7cb2834bf11ad45313d0edb32e3c5574ecc Mon Sep 17 00:00:00 2001 From: heshunme Date: Wed, 3 Jul 2024 14:40:25 +0800 Subject: [PATCH 16/28] =?UTF-8?q?=E7=BB=99@JwtVerify=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BA=86=E6=A0=A1=E9=AA=8C=E5=AD=97=E7=AC=A6=E4=B8=B2=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E7=9A=84=E7=94=A8=E6=B3=95=EF=BC=8C=E7=8E=B0=E5=9C=A8?= =?UTF-8?q?=E5=8F=AA=E8=A6=81=E6=9C=89=E4=BB=BB=E6=84=8F=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E5=8F=82=E6=95=B0=E7=9A=84=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E6=98=AFJWT=E5=B0=B1=E4=B9=9F=E8=83=BD=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E4=BA=86=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/cmh/backend/Utils/JwtVerifyAspect.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/cmh/backend/Utils/JwtVerifyAspect.java b/src/main/java/org/cmh/backend/Utils/JwtVerifyAspect.java index 5104981..1e341ea 100644 --- a/src/main/java/org/cmh/backend/Utils/JwtVerifyAspect.java +++ b/src/main/java/org/cmh/backend/Utils/JwtVerifyAspect.java @@ -15,11 +15,19 @@ public class JwtVerifyAspect { if (arg instanceof JwtRequest jwtRequest) { String token = jwtRequest.getToken(); if (!JwtUtil.isTokenValid(token)) { - throw new JwtValidationException("JWT token is invalid"); + throw new JwtValidationException("请求未正确携带身份令牌"); + } + return; // 只接受第一个 JwtRequest 对象,收到后不再校验其他参数 + } + // JWTRequest对象优先,否则再检查其他字符串参数 + if (arg instanceof String token){ + if (JwtUtil.isTokenValid(token)){ + // 验证成功就直接退出。 + return; } - break; } } + throw new JwtValidationException("请求未正确携带身份令牌"); } } From a38fd92801be17d5ddebe550334fe348a16200a5 Mon Sep 17 00:00:00 2001 From: heshunme Date: Wed, 3 Jul 2024 14:49:17 +0800 Subject: [PATCH 17/28] =?UTF-8?q?=E7=BB=99HttpMessageNotReadableException?= =?UTF-8?q?=E5=92=8CMissingServletRequestParameterException=E6=8C=87?= =?UTF-8?q?=E5=AE=9A=E4=BA=86=E5=85=A8=E5=B1=80=E9=94=99=E8=AF=AF=E5=A4=84?= =?UTF-8?q?=E7=90=86=E5=99=A8=EF=BC=8C=E7=8E=B0=E5=9C=A8=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E5=8F=91=E9=80=81=E7=BB=99=E5=90=8E=E7=AB=AF=E7=9A=84?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E4=B8=8D=E5=AF=B9=E7=9A=84=E6=97=B6=E5=80=99?= =?UTF-8?q?=E4=B9=9F=E8=83=BD=E6=AD=A3=E7=A1=AE=E8=BF=94=E5=9B=9E401?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/Utils/GlobalExceptionHandler.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/org/cmh/backend/Utils/GlobalExceptionHandler.java b/src/main/java/org/cmh/backend/Utils/GlobalExceptionHandler.java index b513f14..e9d8af5 100644 --- a/src/main/java/org/cmh/backend/Utils/GlobalExceptionHandler.java +++ b/src/main/java/org/cmh/backend/Utils/GlobalExceptionHandler.java @@ -2,9 +2,15 @@ package org.cmh.backend.Utils; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + @ControllerAdvice public class GlobalExceptionHandler { @@ -12,4 +18,17 @@ public class GlobalExceptionHandler { public ResponseEntity handleJwtInvalidException(JwtValidationException ex) { return new ResponseEntity<>(HttpStatus.UNAUTHORIZED); } + + @ExceptionHandler(MissingServletRequestParameterException.class) + public ResponseEntity> handleMissingServletRequestParameterException(MissingServletRequestParameterException ex) { + HashMap response = new HashMap<>(); + response.put("error", ex.getMessage()); + response.put("stackTrace", Arrays.toString(ex.getStackTrace())); + return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(HttpMessageNotReadableException.class) + public ResponseEntity handleHttpMessageNotReadableException(HttpMessageNotReadableException ex) { + return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST); + } } \ No newline at end of file From 173b50736156738b0f05906942a7ea32d2e22f9e Mon Sep 17 00:00:00 2001 From: heshunme Date: Wed, 3 Jul 2024 14:52:48 +0800 Subject: [PATCH 18/28] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=BA=86service?= =?UTF-8?q?=E4=B8=ADdelete=20throw=20exception=E7=9A=84message?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/cmh/backend/NewsManagement/service/NewsService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java index bb7f9b6..a802298 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java +++ b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java @@ -50,7 +50,7 @@ public class NewsService { public void deleteNews(Long id) { if (!newsRepository.existsById(id)) { - throw new EntityNotFoundException("News with id " + id + " not found."); + throw new EntityNotFoundException(); } newsRepository.deleteById(id); } From a15f407c13937805244a361761f98e76b21b729a Mon Sep 17 00:00:00 2001 From: heshunme Date: Thu, 4 Jul 2024 00:31:58 +0800 Subject: [PATCH 19/28] =?UTF-8?q?=E5=85=A8=E5=B1=80=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E5=A4=A7=E5=B0=8F=E4=B8=8A?= =?UTF-8?q?=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6637da6..2a38a12 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -22,5 +22,8 @@ server.servlet.encoding.force=true server.servlet.encoding.charset=utf-8 # verificationCode verification.code.images.path=src/main/resources/static/verificationCodeImages - +# set the max size of a single file +spring.servlet.multipart.max-file-size=50MB +# set the max size of the total request +spring.servlet.multipart.max-request-size=50MB From 9056250574b2c36f8caa28a3e5ffc0c9672fb6f9 Mon Sep 17 00:00:00 2001 From: heshunme Date: Thu, 4 Jul 2024 00:32:39 +0800 Subject: [PATCH 20/28] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=A7=9F=E6=88=B7?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=EF=BC=8C=E5=9C=A8=E8=81=94=E7=B3=BB=E4=B8=8A?= =?UTF-8?q?=E5=A4=96=E9=94=AE=E4=B9=8B=E5=89=8D=E6=9A=82=E4=B8=94=E8=AE=BE?= =?UTF-8?q?=E4=B8=BA=E5=AD=97=E7=AC=A6=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/cmh/backend/NewsManagement/dto/NewsRequest.java | 1 + src/main/java/org/cmh/backend/NewsManagement/model/News.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/main/java/org/cmh/backend/NewsManagement/dto/NewsRequest.java b/src/main/java/org/cmh/backend/NewsManagement/dto/NewsRequest.java index 3aa8228..9852ff5 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/dto/NewsRequest.java +++ b/src/main/java/org/cmh/backend/NewsManagement/dto/NewsRequest.java @@ -12,4 +12,5 @@ public class NewsRequest extends JwtRequest { private String content; private String imagePath; private String author; + private String tenant; } diff --git a/src/main/java/org/cmh/backend/NewsManagement/model/News.java b/src/main/java/org/cmh/backend/NewsManagement/model/News.java index 607ff3e..519dfa6 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/model/News.java +++ b/src/main/java/org/cmh/backend/NewsManagement/model/News.java @@ -31,4 +31,6 @@ public class News { @CreationTimestamp private LocalDateTime createdAt; + + private String tenant; } From 431ef62c12903b69daf181419554a76f6d25653b Mon Sep 17 00:00:00 2001 From: heshunme Date: Thu, 4 Jul 2024 00:33:32 +0800 Subject: [PATCH 21/28] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86getById?= =?UTF-8?q?=E7=9A=84=E8=AF=B7=E6=B1=82=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NewsManagement/controller/NewsController.java | 11 ++++++++++- .../backend/NewsManagement/service/NewsService.java | 7 +++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java index e677ca0..7b63102 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java +++ b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java @@ -24,6 +24,15 @@ public class NewsController { return new ResponseEntity<>(newsService.getNewsByPage(pageNo, pageSize), HttpStatus.OK); } + @GetMapping("/{id}") + public ResponseEntity getNewsPage(@PathVariable Long id) { + try { + return new ResponseEntity<>(newsService.getNewsById(id), HttpStatus.OK); + } catch (EntityNotFoundException e) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + } + @PostMapping @JwtVerify public ResponseEntity createNews(@RequestBody NewsRequest request) { @@ -34,7 +43,7 @@ public class NewsController { } catch (Exception e) { return new ResponseEntity<>(new MessageResponse("创建失败:" + e.getMessage()), HttpStatus.BAD_REQUEST); } - return new ResponseEntity<>(new MessageResponse("创建成功"), HttpStatus.OK); + return new ResponseEntity<>(new MessageResponse("创建成功"), HttpStatus.CREATED); } @PutMapping("/{id}") diff --git a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java index a802298..0396114 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java +++ b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java @@ -54,4 +54,11 @@ public class NewsService { } newsRepository.deleteById(id); } + + public News getNewsById(Long id) { + if (!newsRepository.existsById(id)) { + throw new EntityNotFoundException(); + } + return newsRepository.findById(id).orElse(null); + } } From 30344b2162127ad60546eba4379d8f6bccf1a5a4 Mon Sep 17 00:00:00 2001 From: heshunme Date: Thu, 4 Jul 2024 00:33:49 +0800 Subject: [PATCH 22/28] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E4=B8=8A=E4=BC=A0=E7=9A=84=E5=90=8E=E7=AB=AF=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FileController.java | 65 +++++++++++++++++++ .../dto/UploadFileResponse.java | 16 +++++ 2 files changed, 81 insertions(+) create mode 100644 src/main/java/org/cmh/backend/NewsManagement/controller/FileController.java create mode 100644 src/main/java/org/cmh/backend/NewsManagement/dto/UploadFileResponse.java diff --git a/src/main/java/org/cmh/backend/NewsManagement/controller/FileController.java b/src/main/java/org/cmh/backend/NewsManagement/controller/FileController.java new file mode 100644 index 0000000..b48660a --- /dev/null +++ b/src/main/java/org/cmh/backend/NewsManagement/controller/FileController.java @@ -0,0 +1,65 @@ +package org.cmh.backend.NewsManagement.controller; + +import org.cmh.backend.NewsManagement.dto.UploadFileResponse; +import org.springframework.core.io.Resource; +import org.springframework.core.io.UrlResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +@RestController +@CrossOrigin // 如果前端和后端不在同一个域名或端口下,需要启用跨域 +public class FileController { + + private static final String UPLOAD_DIR = "uploads/"; + + @PostMapping("/news/uploadPic") + public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file) { + if (file.isEmpty()) { + return new ResponseEntity<>(new UploadFileResponse("文件不能为空", null), HttpStatus.BAD_REQUEST); + } + + try { + // 确保上传目录存在 + Path uploadDirPath = Paths.get(UPLOAD_DIR); + if (!Files.exists(uploadDirPath)) { + Files.createDirectories(uploadDirPath); + } + + // 生成文件路径 + byte[] bytes = file.getBytes(); + Path path = Paths.get(UPLOAD_DIR + file.getOriginalFilename()); + Files.write(path, bytes); + + // 返回成功信息 + return new ResponseEntity<>(new UploadFileResponse("文件上传成功", "/api/news/files/" + file.getOriginalFilename()), HttpStatus.OK); + } catch (IOException e) { + return new ResponseEntity<>(new UploadFileResponse("文件上传失败", null), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @GetMapping("/news/files/{filename}") + public ResponseEntity getFile(@PathVariable String filename) { + try { + Path filePath = Paths.get(UPLOAD_DIR).resolve(filename).normalize(); + Resource resource = new UrlResource(filePath.toUri()); + + if (resource.exists() && resource.isReadable()) { + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"") + .body(resource); + } else { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + } catch (Exception e) { + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } +} diff --git a/src/main/java/org/cmh/backend/NewsManagement/dto/UploadFileResponse.java b/src/main/java/org/cmh/backend/NewsManagement/dto/UploadFileResponse.java new file mode 100644 index 0000000..b2eba96 --- /dev/null +++ b/src/main/java/org/cmh/backend/NewsManagement/dto/UploadFileResponse.java @@ -0,0 +1,16 @@ +package org.cmh.backend.NewsManagement.dto; + + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UploadFileResponse extends MessageResponse { + private String url; + + public UploadFileResponse(String message, String url) { + super(message); + this.url = url; + } +} From e66695cbff365dc87f1064f3287670ef638c24f7 Mon Sep 17 00:00:00 2001 From: heshunme Date: Thu, 4 Jul 2024 12:20:04 +0800 Subject: [PATCH 23/28] =?UTF-8?q?=E4=B8=BA=E4=BA=86=E9=80=82=E5=BA=94?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E7=9A=84=E5=88=97=E8=A1=A8=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=EF=BC=8C=E6=B7=BB=E5=8A=A0=E4=BA=86getNewsBy?= =?UTF-8?q?Range=E5=8F=8A=E5=85=B6=E7=9B=B8=E5=85=B3=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/NewsController.java | 11 +++-- .../dto/GetNewsListResponse.java | 17 ++++++++ .../NewsManagement/service/NewsService.java | 43 ++++++++++++++++--- 3 files changed, 61 insertions(+), 10 deletions(-) create mode 100644 src/main/java/org/cmh/backend/NewsManagement/dto/GetNewsListResponse.java diff --git a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java index 7b63102..afea9c3 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java +++ b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java @@ -1,6 +1,7 @@ package org.cmh.backend.NewsManagement.controller; import jakarta.persistence.EntityNotFoundException; +import org.cmh.backend.NewsManagement.dto.GetNewsListResponse; import org.cmh.backend.NewsManagement.dto.MessageResponse; import org.cmh.backend.NewsManagement.dto.NewsRequest; import org.cmh.backend.NewsManagement.model.News; @@ -8,7 +9,6 @@ import org.cmh.backend.NewsManagement.service.NewsService; import org.cmh.backend.Utils.JwtVerify; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.data.domain.Page; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -20,8 +20,13 @@ public class NewsController { private NewsService newsService; @GetMapping - public ResponseEntity> getNewsPage(@RequestParam Integer pageNo, @RequestParam Integer pageSize) { - return new ResponseEntity<>(newsService.getNewsByPage(pageNo, pageSize), HttpStatus.OK); + @JwtVerify + public ResponseEntity getNewsByRange(@RequestParam Integer start, @RequestParam Integer end, @RequestParam String token) { + if (start >= end) { + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } + long newsCount = newsService.getNewsCount(); + return new ResponseEntity<>(new GetNewsListResponse(newsCount, newsService.getNewsByRange(start, end)), HttpStatus.OK); } @GetMapping("/{id}") diff --git a/src/main/java/org/cmh/backend/NewsManagement/dto/GetNewsListResponse.java b/src/main/java/org/cmh/backend/NewsManagement/dto/GetNewsListResponse.java new file mode 100644 index 0000000..4c1f6c3 --- /dev/null +++ b/src/main/java/org/cmh/backend/NewsManagement/dto/GetNewsListResponse.java @@ -0,0 +1,17 @@ +package org.cmh.backend.NewsManagement.dto; + + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.cmh.backend.NewsManagement.model.News; + +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +public class GetNewsListResponse { + Long newsCount; + List newsList; +} diff --git a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java index 0396114..cf4eb85 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java +++ b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java @@ -10,22 +10,47 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; + @Service public class NewsService { @Autowired private NewsRepository newsRepository; - public Page getNewsByPage(int pageNo, int pageSize) { - if (pageNo < 1) { - pageNo = 1; + public List getNewsByRange(int start, int end) { + if (start < 0 || end <= start) { + throw new IllegalArgumentException("Invalid start or end range"); } - if (pageSize < 1) { - pageSize = 10; + + int pageSize = end - start; // 计算每页的大小 + int startPageNumber = start / pageSize; // 计算起始页码 + int endPageNumber = (end - 1) / pageSize; // 计算结束页码 + + List result = new ArrayList<>(); + + for (int pageNumber = startPageNumber; pageNumber <= endPageNumber; pageNumber++) { + Pageable pageable = PageRequest.of(pageNumber, pageSize); + Page newsPage = newsRepository.findAllByOrderByIdDesc(pageable); + + if (newsPage.hasContent()) { + result.addAll(newsPage.getContent()); + } else { + break; // 如果没有更多内容,提前退出 + } } - Pageable pageable = PageRequest.of(pageNo - 1, pageSize); - return newsRepository.findAllByOrderByIdDesc(pageable); + + int startIndex = start % pageSize; + int endIndex = startIndex + (end - start); + + if (endIndex > result.size()) { + endIndex = result.size(); + } + + return result.subList(startIndex, endIndex); } + public void createNews(NewsRequest request) { News news = new News(); news.setTitle(request.getTitle()); @@ -61,4 +86,8 @@ public class NewsService { } return newsRepository.findById(id).orElse(null); } + + public long getNewsCount() { + return newsRepository.count(); + } } From ed0cde69689729d06e4d4061a33c13de34f9714c Mon Sep 17 00:00:00 2001 From: heshunme Date: Thu, 4 Jul 2024 16:41:36 +0800 Subject: [PATCH 24/28] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E6=BC=8F?= =?UTF-8?q?=E5=8A=A0=E7=9A=84service=E4=B8=AD=E4=BF=9D=E5=AD=98=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/cmh/backend/NewsManagement/service/NewsService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java index cf4eb85..2060a53 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java +++ b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java @@ -58,6 +58,7 @@ public class NewsService { news.setContent(request.getContent()); news.setAuthor(request.getAuthor()); news.setImagePath(request.getImagePath()); + news.setTenant(request.getTenant()); newsRepository.save(news); } @@ -69,6 +70,7 @@ public class NewsService { news.setContent(request.getContent()); news.setAuthor(request.getAuthor()); news.setImagePath(request.getImagePath()); + news.setTenant(request.getTenant()); newsRepository.save(news); } } From 2c12fc075f75862170006685e1d7be13698a5076 Mon Sep 17 00:00:00 2001 From: heshunme Date: Thu, 4 Jul 2024 16:42:06 +0800 Subject: [PATCH 25/28] =?UTF-8?q?getNewsPage=E5=8A=A0=E4=BA=86jwtVerify?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmh/backend/NewsManagement/controller/NewsController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java index afea9c3..29c9d43 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java +++ b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java @@ -30,7 +30,8 @@ public class NewsController { } @GetMapping("/{id}") - public ResponseEntity getNewsPage(@PathVariable Long id) { + @JwtVerify + public ResponseEntity getNewsPage(@PathVariable Long id, @RequestParam String token) { try { return new ResponseEntity<>(newsService.getNewsById(id), HttpStatus.OK); } catch (EntityNotFoundException e) { From f104c89d08f92006a2e07f28a267b83bae5114a0 Mon Sep 17 00:00:00 2001 From: heshunme Date: Fri, 5 Jul 2024 02:21:59 +0800 Subject: [PATCH 26/28] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BA=86=E7=94=A8=E6=88=B7=E6=9D=83=E9=99=90=E5=8C=BA=E5=88=AB?= =?UTF-8?q?=E5=AF=B9=E5=BE=85=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/NewsController.java | 17 ++++++++++++++++- .../cmh/backend/NewsManagement/model/News.java | 2 +- .../repository/NewsRepository.java | 3 +++ .../NewsManagement/service/NewsService.java | 10 ++++++++-- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java index 29c9d43..fd53a21 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java +++ b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java @@ -6,7 +6,10 @@ import org.cmh.backend.NewsManagement.dto.MessageResponse; import org.cmh.backend.NewsManagement.dto.NewsRequest; import org.cmh.backend.NewsManagement.model.News; import org.cmh.backend.NewsManagement.service.NewsService; +import org.cmh.backend.Utils.JwtUtil; import org.cmh.backend.Utils.JwtVerify; +import org.cmh.backend.authentication.model.UserHS; +import org.cmh.backend.authentication.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.http.HttpStatus; @@ -19,14 +22,26 @@ public class NewsController { @Autowired private NewsService newsService; + @Autowired + private UserService userService; + @GetMapping @JwtVerify public ResponseEntity getNewsByRange(@RequestParam Integer start, @RequestParam Integer end, @RequestParam String token) { + String username = JwtUtil.extractUsername(token); + UserHS user = userService.getUserByUsername(username); + // TODO:完善用户权限 + if (user.getSuperAdmin()) { + + } else { + + } + if (start >= end) { return new ResponseEntity<>(HttpStatus.BAD_REQUEST); } long newsCount = newsService.getNewsCount(); - return new ResponseEntity<>(new GetNewsListResponse(newsCount, newsService.getNewsByRange(start, end)), HttpStatus.OK); + return new ResponseEntity<>(new GetNewsListResponse(newsCount, newsService.getNewsByRange(start, end, user)), HttpStatus.OK); } @GetMapping("/{id}") diff --git a/src/main/java/org/cmh/backend/NewsManagement/model/News.java b/src/main/java/org/cmh/backend/NewsManagement/model/News.java index 519dfa6..64edf3f 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/model/News.java +++ b/src/main/java/org/cmh/backend/NewsManagement/model/News.java @@ -31,6 +31,6 @@ public class News { @CreationTimestamp private LocalDateTime createdAt; - + // TODO:添加外键绑定 private String tenant; } diff --git a/src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java b/src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java index 5997b39..eeb9a87 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java +++ b/src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java @@ -7,4 +7,7 @@ import org.springframework.data.jpa.repository.JpaRepository; public interface NewsRepository extends JpaRepository { Page findAllByOrderByIdDesc(Pageable pageable); + Page findByTenantOrderByIdDesc(String tenant, Pageable pageable); + + } \ No newline at end of file diff --git a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java index 2060a53..48d19b9 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java +++ b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java @@ -4,6 +4,7 @@ import jakarta.persistence.EntityNotFoundException; import org.cmh.backend.NewsManagement.dto.NewsRequest; import org.cmh.backend.NewsManagement.model.News; import org.cmh.backend.NewsManagement.repository.NewsRepository; +import org.cmh.backend.authentication.model.UserHS; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -18,7 +19,7 @@ public class NewsService { @Autowired private NewsRepository newsRepository; - public List getNewsByRange(int start, int end) { + public List getNewsByRange(int start, int end, UserHS user) { if (start < 0 || end <= start) { throw new IllegalArgumentException("Invalid start or end range"); } @@ -31,7 +32,12 @@ public class NewsService { for (int pageNumber = startPageNumber; pageNumber <= endPageNumber; pageNumber++) { Pageable pageable = PageRequest.of(pageNumber, pageSize); - Page newsPage = newsRepository.findAllByOrderByIdDesc(pageable); + Page newsPage = null; + if (user.getSuperAdmin()) { + newsPage = newsRepository.findAllByOrderByIdDesc(pageable); + } else { + newsPage = newsRepository.findByTenantOrderByIdDesc(user.getUsername(), pageable); + } if (newsPage.hasContent()) { result.addAll(newsPage.getContent()); From 9e03bb3873bfbc229241a6742e5b6a2039cabbc3 Mon Sep 17 00:00:00 2001 From: heshunme Date: Fri, 5 Jul 2024 06:11:11 +0800 Subject: [PATCH 27/28] =?UTF-8?q?=E8=83=BD=E6=90=9C=E4=BA=86=EF=BC=8C?= =?UTF-8?q?=E5=B0=B1=E6=98=AF=E6=9C=89=E7=82=B9=E9=97=AE=E9=A2=98=EF=BC=8C?= =?UTF-8?q?=E8=8C=83=E5=9B=B4=E5=A4=AA=E5=B9=BF=EF=BC=8C=E5=95=A5=E9=83=BD?= =?UTF-8?q?=E6=90=9C=E5=88=B0=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/NewsController.java | 11 ++++++++ .../NewsManagement/dto/SearchNewsRequest.java | 15 +++++++++++ .../repository/NewsRepository.java | 10 +++++++ .../NewsManagement/service/NewsService.java | 26 +++++++++++++++++++ 4 files changed, 62 insertions(+) create mode 100644 src/main/java/org/cmh/backend/NewsManagement/dto/SearchNewsRequest.java diff --git a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java index fd53a21..c149c4b 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java +++ b/src/main/java/org/cmh/backend/NewsManagement/controller/NewsController.java @@ -4,6 +4,7 @@ import jakarta.persistence.EntityNotFoundException; import org.cmh.backend.NewsManagement.dto.GetNewsListResponse; import org.cmh.backend.NewsManagement.dto.MessageResponse; import org.cmh.backend.NewsManagement.dto.NewsRequest; +import org.cmh.backend.NewsManagement.dto.SearchNewsRequest; import org.cmh.backend.NewsManagement.model.News; import org.cmh.backend.NewsManagement.service.NewsService; import org.cmh.backend.Utils.JwtUtil; @@ -16,6 +17,8 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @RequestMapping("/news") public class NewsController { @@ -44,6 +47,14 @@ public class NewsController { return new ResponseEntity<>(new GetNewsListResponse(newsCount, newsService.getNewsByRange(start, end, user)), HttpStatus.OK); } + @PostMapping("/search") + @JwtVerify + public ResponseEntity searchNews(@RequestBody SearchNewsRequest request) { + List newsList = newsService.searchNews(request); + long newsCount = newsList.size(); + return new ResponseEntity<>(new GetNewsListResponse(newsCount, newsList), HttpStatus.OK); + } + @GetMapping("/{id}") @JwtVerify public ResponseEntity getNewsPage(@PathVariable Long id, @RequestParam String token) { diff --git a/src/main/java/org/cmh/backend/NewsManagement/dto/SearchNewsRequest.java b/src/main/java/org/cmh/backend/NewsManagement/dto/SearchNewsRequest.java new file mode 100644 index 0000000..7d632fd --- /dev/null +++ b/src/main/java/org/cmh/backend/NewsManagement/dto/SearchNewsRequest.java @@ -0,0 +1,15 @@ +package org.cmh.backend.NewsManagement.dto; + +import lombok.Getter; +import lombok.Setter; +import org.cmh.backend.Utils.JwtRequest; + +@Getter +@Setter +public class SearchNewsRequest extends JwtRequest { + private String author; + private String title; + private String imagePath; + private String summary; + private String sortBy; +} diff --git a/src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java b/src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java index eeb9a87..d5e7884 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java +++ b/src/main/java/org/cmh/backend/NewsManagement/repository/NewsRepository.java @@ -5,9 +5,19 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface NewsRepository extends JpaRepository { Page findAllByOrderByIdDesc(Pageable pageable); + Page findByTenantOrderByIdDesc(String tenant, Pageable pageable); + List findByTitleContainingOrSummaryContainingOrAuthorContainingOrImagePathContainingAndTenantEquals( + String title, + String summary, + String author, + String imagePath, + String tenant); + List findByTitleContainingOrSummaryContainingOrAuthorContainingOrImagePathContaining(String title, String summary, String author, String imagePath); } \ No newline at end of file diff --git a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java index 48d19b9..701cb09 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java +++ b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java @@ -2,9 +2,12 @@ package org.cmh.backend.NewsManagement.service; import jakarta.persistence.EntityNotFoundException; import org.cmh.backend.NewsManagement.dto.NewsRequest; +import org.cmh.backend.NewsManagement.dto.SearchNewsRequest; import org.cmh.backend.NewsManagement.model.News; import org.cmh.backend.NewsManagement.repository.NewsRepository; +import org.cmh.backend.Utils.JwtUtil; import org.cmh.backend.authentication.model.UserHS; +import org.cmh.backend.authentication.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -19,6 +22,9 @@ public class NewsService { @Autowired private NewsRepository newsRepository; + @Autowired + private UserService userService; + public List getNewsByRange(int start, int end, UserHS user) { if (start < 0 || end <= start) { throw new IllegalArgumentException("Invalid start or end range"); @@ -98,4 +104,24 @@ public class NewsService { public long getNewsCount() { return newsRepository.count(); } + // TODO:完善用户权限 + public List searchNews(SearchNewsRequest request) { + String username = JwtUtil.extractUsername(request.getToken()); + UserHS user = userService.getUserByUsername(username); + if (user.getSuperAdmin()) { + return newsRepository.findByTitleContainingOrSummaryContainingOrAuthorContainingOrImagePathContaining( + request.getTitle(), + request.getSummary(), + request.getAuthor(), + request.getImagePath() + ); + } + return newsRepository.findByTitleContainingOrSummaryContainingOrAuthorContainingOrImagePathContainingAndTenantEquals( + request.getTitle(), + request.getSummary(), + request.getAuthor(), + request.getImagePath(), + user.getUsername() + ); + } } From 33f811e6b71a44853b165827dcd6576136244a13 Mon Sep 17 00:00:00 2001 From: heshunme Date: Fri, 5 Jul 2024 06:20:30 +0800 Subject: [PATCH 28/28] =?UTF-8?q?GPT=E7=89=9B=E9=80=BC=EF=BC=8C=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E6=90=9E=E6=88=90=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NewsManagement/service/NewsService.java | 76 +++++++++++++++---- 1 file changed, 62 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java index 701cb09..43d7c99 100644 --- a/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java +++ b/src/main/java/org/cmh/backend/NewsManagement/service/NewsService.java @@ -1,6 +1,12 @@ package org.cmh.backend.NewsManagement.service; +import jakarta.persistence.EntityManager; import jakarta.persistence.EntityNotFoundException; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; import org.cmh.backend.NewsManagement.dto.NewsRequest; import org.cmh.backend.NewsManagement.dto.SearchNewsRequest; import org.cmh.backend.NewsManagement.model.News; @@ -25,6 +31,9 @@ public class NewsService { @Autowired private UserService userService; + @PersistenceContext + private EntityManager entityManager; + public List getNewsByRange(int start, int end, UserHS user) { if (start < 0 || end <= start) { throw new IllegalArgumentException("Invalid start or end range"); @@ -104,24 +113,63 @@ public class NewsService { public long getNewsCount() { return newsRepository.count(); } + // TODO:完善用户权限 +// public List searchNews(SearchNewsRequest request) { +// String username = JwtUtil.extractUsername(request.getToken()); +// UserHS user = userService.getUserByUsername(username); +// if (user.getSuperAdmin()) { +// return newsRepository.findByTitleContainingOrSummaryContainingOrAuthorContainingOrImagePathContaining( +// request.getTitle(), +// request.getSummary(), +// request.getAuthor(), +// request.getImagePath() +// ); +// } +// return newsRepository.findByTitleContainingOrSummaryContainingOrAuthorContainingOrImagePathContainingAndTenantEquals( +// request.getTitle(), +// request.getSummary(), +// request.getAuthor(), +// request.getImagePath(), +// user.getUsername() +// ); +// } public List searchNews(SearchNewsRequest request) { String username = JwtUtil.extractUsername(request.getToken()); UserHS user = userService.getUserByUsername(username); - if (user.getSuperAdmin()) { - return newsRepository.findByTitleContainingOrSummaryContainingOrAuthorContainingOrImagePathContaining( - request.getTitle(), - request.getSummary(), - request.getAuthor(), - request.getImagePath() - ); + + // Create a list to hold predicates + List predicates = new ArrayList<>(); + // Create the query + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(News.class); + Root root = criteriaQuery.from(News.class); + + // Build the query conditionally based on non-empty fields + if (!request.getTitle().isEmpty()) { + predicates.add(criteriaBuilder.like(root.get("title"), "%" + request.getTitle() + "%")); } - return newsRepository.findByTitleContainingOrSummaryContainingOrAuthorContainingOrImagePathContainingAndTenantEquals( - request.getTitle(), - request.getSummary(), - request.getAuthor(), - request.getImagePath(), - user.getUsername() - ); + if (!request.getSummary().isEmpty()) { + predicates.add(criteriaBuilder.like(root.get("summary"), "%" + request.getSummary() + "%")); + } + if (!request.getAuthor().isEmpty()) { + predicates.add(criteriaBuilder.like(root.get("author"), "%" + request.getAuthor() + "%")); + } + if (!request.getImagePath().isEmpty()) { + predicates.add(criteriaBuilder.like(root.get("imagePath"), "%" + request.getImagePath() + "%")); + } + + if (user.getSuperAdmin()) { + // Combine predicates with OR + criteriaQuery.where(criteriaBuilder.or(predicates.toArray(new Predicate[0]))); + } else { + // Combine predicates with OR and add tenant condition + Predicate tenantPredicate = criteriaBuilder.equal(root.get("tenant"), user.getUsername()); + predicates.add(tenantPredicate); + criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[0]))); + } + + // Execute the query + return entityManager.createQuery(criteriaQuery).getResultList(); } }