前言
新闻系统的一个重要功能是新闻的浏览,在主页的界面中需要罗列新闻,并在侧栏罗列最热的类型,还要支持新闻的跳转。还上线一个新功能:搜索跳转。
实现过程
新闻展示
这部分无疑需要提取数据库中的全部新闻信息,在展示的时候加上实现分页
@Override
public Page<News> listNew(Pageable pageable) {
return newRepository.findAll(pageable);
}
@Controller
public class indexController {
@Autowired
private NewService newService;
@GetMapping("/")
public String index(@PageableDefault(size = 3,sort = {"updateTime"},direction = Sort.Direction.DESC)
Pageable pageable, Model model){
model.addAttribute("page",newService.listNew(pageable));
return "index";
}
}
分类展示
根据新闻的分类显示相应的新闻,这是常见的功能。首先在typeRepository文件中声明一个查询类型方法,接着将它实现即可。
@Override
public List<Type> listTypeTop(Integer size) {
Sort sort = Sort.by(Sort.Direction.DESC,"news.size");
Pageable pageable = PageRequest.of(0,size,sort);
return typeRepository.findTop(pageable);
}
@Controller
public class indexController {
@Autowired
private NewService newService;
@Autowired
private TypeService typeService;
@GetMapping("/")
public String index(@PageableDefault(size = 3,sort = {"updateTime"},direction = Sort.Direction.DESC)
Pageable pageable, Model model){
model.addAttribute("page",newService.listNew(pageable));
model.addAttribute("types",typeService.listTypeTop(3));
return "index";
}
}
标签展示
标签显示要先在TagRepository下声明一个连接数据库相关数据的方法,再在Service层中声明接口和实现接口方法,添加到controller中,同样按照标签下新闻数量进行排序。这和分类展示是差不多的设计方法
@Override
public List<Tag> listTagTop(Integer size) {
Sort sort = Sort.by(Sort.Direction.DESC,"newsList.size");
Pageable pageable = PageRequest.of(0,size,sort);
return tagRepository.findTop(pageable);
}
@Controller
public class indexController {
@Autowired
private TypeService typeService;
@Autowired
private TagService tagService;
@Autowired
private NewService newService;
@GetMapping("/")
public String index(@PageableDefault(size = 3,sort = {"updateTime"},direction = Sort.Direction.DESC)
Pageable pageable, Model model){
model.addAttribute("page",newService.listNew(pageable));
model.addAttribute("types",typeService.listTypeTop(3));
model.addAttribute("tags",tagService.listTagTop(3));
return "index";
}
}
搜索新闻展示
在主页的顶部搜索栏中,可以输入标题关键字或者相关内容进行模糊搜索,进而展示相关的内容。
模糊查询的SQL语句如下:
//根据内容或者标题模糊查询
@Query("select n from News n where n.title like ?1 or n.content like ?1")
Page<News> findByQuery(String query, Pageable pageable);
@PostMapping("/search")
public String search(@PageableDefault(size = 3,sort = {"updateTime"},direction = Sort.Direction.DESC)Pageable pageable,
@RequestParam String query,Model model){
model.addAttribute("page",newService.listNew("%"+query+"%",pageable));
model.addAttribute("query",query);
return "search";
}
新闻跳转
根据新闻的ID进行显示新闻,然后跳转到显示的界面进行展示。
@Override
public News getAndConvert(Long id) {
News news = newRepository.findById(id).orElse(null);
if(news==null){
System.out.println("该新闻不存在");
}
News news1 = new News();
BeanUtils.copyProperties(news,news1);
String content = news1.getContent();
news1.setContent(MarkdownUtils.markdownToHtmlExtensions(content));
return news1;
}
@RequestMapping("/news/{id}")
public String news(@PathVariable Long id,Model model){
News news = newService.getAndConvert(id);
model.addAttribute("news",news);
return "new";
}
展示新闻详情的界面主要是要与前端进行同一,具体的内容会根据新闻的不一样而产生不一样的效果,布局方面的问题应该是在设计时进行统一,在页面接收到各种参数时进行现实。
总结
这一部分的内容难在参数的传递,在选择新闻的时候,不需要对参数进行过多的操作,需要的是将各种的信息进行配置,同时,模糊查询、标签的罗列以及分类的统计这些也要对数据库进行操作。