spring boot下实现新闻首页详情页的展示

功能需求分析

一般的新闻展示界面会根据新闻发布的时间或者热度种类等等进行排序,同时提供新闻的搜索功能,从此考虑,项目需实现新闻的展示,排序方式的选择以及搜索功能的实现。

层次设计

1.在service层设计接口,并且在impl内实现,这里设计好页面以及排序的方式是updateTime

//主页显示新闻列表
    Page<News> listNew(Pageable pageable);
    //主页推荐最新新闻列表
    List<News> ListRecommendNewTop(Integer size);
    //全局搜索
    Page<News> listNew(String query,Pageable pageable);
    //
    News getAndConvert(Long id);
    //标签页面
    Page<News>listNew(Long tagId,Pageable pageable);
@Override
    public Page<News> listNew(Pageable pageable) {
     
        return newRepository.findAll(pageable);
    }

    @Override
    public List<News> ListRecommendNewTop(Integer size) {
     
        Sort sort =Sort.by(Sort.Direction.DESC,"updateTime");
        Pageable pageable= PageRequest.of(0,size,sort);
        return newRepository.findTop(pageable);
    }

    @Override
    public Page<News> listNew(String query,Pageable pageable){
     
        return newRepository.findByQuery(query,pageable);
    }

    @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;
    }

    @Override
    public Page<News> listNew(Long tagId, Pageable pageable) {
     
        return newRepository.findAll(new Specification<News>() {
     
            @Override
            public Predicate toPredicate(Root<News> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
     
                Join join=root.join("tags");
                return cb.equal(join.get("id"),tagId);
            }
        },pageable);
    }

2.在controller层设计与界面的对接,有种类,标签,是否推荐三种筛选方式,搜索结果通过updateTime排序

 @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));
        model.addAttribute("recommendNews",newService.ListRecommendNewTop(3));
        return "index";
    }

    @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";
    }

    @RequestMapping("/news/{id}")
    public String news(@PathVariable Long id,Model model){
     
        model.addAttribute("news",newService.getAndConvert(id));
        return "new";
    }

3.在dao层添加查询的语句

@Query("select n from News n where n.title like ?1 or n.content like ?1")
    Page<News> findByQuery(String query,Pageable pageable);

    @Query("select n from News n where n.recommend=true")
    List<News> findTop(Pageable pageable);

小结:实现功能时可以参考市场上其他同类产品的设计,分析好用户的需求。另外可以充分利用已有属性,可以实现功能的多样化,增加项目的实用性。

你可能感兴趣的:(实习笔记)