package com.rongyichuang.news.service; import com.rongyichuang.news.dto.NewsInput; import com.rongyichuang.news.dto.NewsResponse; import com.rongyichuang.news.entity.News; import com.rongyichuang.news.repository.NewsRepository; import com.rongyichuang.common.dto.PageRequest; import com.rongyichuang.common.dto.PageResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @Service @Transactional public class NewsService { @Autowired private NewsRepository newsRepository; /** * 分页查询新闻列表 */ public PageResponse findNews(PageRequest pageRequest, String title, Integer state) { Pageable pageable = pageRequest.toPageable(); Page page; boolean hasTitle = StringUtils.hasText(title); if (state != null) { if (hasTitle) { page = newsRepository.findByStateAndTitleContainingOrderByCreateTimeDesc(state, title, pageable); } else { page = newsRepository.findByStateOrderByCreateTimeDesc(state, pageable); } } else if (hasTitle) { page = newsRepository.findByTitleContainingOrderByCreateTimeDesc(title, pageable); } else { page = newsRepository.findAll(pageable); } List content = page.getContent().stream() .map(NewsResponse::new) .collect(Collectors.toList()); return new PageResponse<>(content, page.getTotalElements(), page.getNumber(), page.getSize()); } /** * 获取新闻详情 */ public NewsResponse findById(Long id) { Optional newsOpt = newsRepository.findById(id); return newsOpt.map(NewsResponse::new).orElse(null); } /** * 获取已发布的新闻详情(用于前端展示) */ public NewsResponse findPublishedNewsById(Long id) { News news = newsRepository.findPublishedNewsById(id); return news != null ? new NewsResponse(news) : null; } /** * 保存新闻(新增或编辑) */ public NewsResponse saveNews(NewsInput input) { News news; if (input.isNew()) { // 新增新闻 news = new News(); } else { // 编辑新闻 Optional existingOpt = newsRepository.findById(input.getId()); if (!existingOpt.isPresent()) { throw new RuntimeException("新闻不存在"); } news = existingOpt.get(); } // 设置基本信息 news.setTitle(input.getTitle()); news.setContent(input.getContent()); news.setSummary(input.getSummary()); news.setCoverImage(input.getCoverImage()); news.setAuthor(input.getAuthor()); news.setState(input.getState()); // 保存新闻 news = newsRepository.save(news); return new NewsResponse(news); } /** * 删除新闻(软删除) */ public boolean deleteNews(Long id) { Optional newsOpt = newsRepository.findById(id); if (newsOpt.isPresent()) { News news = newsOpt.get(); news.setState(2); // 设置为关闭状态 newsRepository.save(news); return true; } return false; } /** * 更新新闻状态 */ public boolean updateNewsState(Long id, Integer state) { Optional newsOpt = newsRepository.findById(id); if (newsOpt.isPresent()) { News news = newsOpt.get(); news.setState(state); newsRepository.save(news); return true; } return false; } /** * 获取已发布的新闻列表(用于前端展示) */ public List findPublishedNews() { List newsList = newsRepository.findPublishedNews(); return newsList.stream() .map(NewsResponse::new) .collect(Collectors.toList()); } /** * 获取已发布的新闻列表(分页,用于前端展示) */ public PageResponse findPublishedNews(PageRequest pageRequest) { Pageable pageable = pageRequest.toPageable(); Page page = newsRepository.findPublishedNews(pageable); List content = page.getContent().stream() .map(NewsResponse::new) .collect(Collectors.toList()); return new PageResponse<>(content, page.getTotalElements(), page.getNumber(), page.getSize()); } }