From 33f811e6b71a44853b165827dcd6576136244a13 Mon Sep 17 00:00:00 2001 From: heshunme Date: Fri, 5 Jul 2024 06:20:30 +0800 Subject: [PATCH] =?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(); } }