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<NewsResponse> findNews(PageRequest pageRequest, String title, Integer state) {
|
Pageable pageable = pageRequest.toPageable();
|
Page<News> 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<NewsResponse> 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<News> 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<News> 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<News> 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<News> newsOpt = newsRepository.findById(id);
|
if (newsOpt.isPresent()) {
|
News news = newsOpt.get();
|
news.setState(state);
|
newsRepository.save(news);
|
return true;
|
}
|
return false;
|
}
|
|
/**
|
* 获取已发布的新闻列表(用于前端展示)
|
*/
|
public List<NewsResponse> findPublishedNews() {
|
List<News> newsList = newsRepository.findPublishedNews();
|
return newsList.stream()
|
.map(NewsResponse::new)
|
.collect(Collectors.toList());
|
}
|
|
/**
|
* 获取已发布的新闻列表(分页,用于前端展示)
|
*/
|
public PageResponse<NewsResponse> findPublishedNews(PageRequest pageRequest) {
|
Pageable pageable = pageRequest.toPageable();
|
Page<News> page = newsRepository.findPublishedNews(pageable);
|
|
List<NewsResponse> content = page.getContent().stream()
|
.map(NewsResponse::new)
|
.collect(Collectors.toList());
|
|
return new PageResponse<>(content, page.getTotalElements(), page.getNumber(), page.getSize());
|
}
|
}
|