springboot——新闻列表主页显示和新闻详情页

本次实现了新闻的主页显示、新闻搜索和新闻详情页。

  • 实现新闻列表的展示
  • 左侧展示分类、标签和推荐新闻
  • 实现全局搜索,可以搜索标题或文章内容
  • 点击新闻可以进入新闻详情页,并支持Md
  1. NewsRepositoryTagRespositoryTypeRespository接口中添加需要进行的数据库操作方法

    //查询推荐新闻
    @Query("select n from News n where n.recommend = true ")
    List<News> findTop(Pageable pageable);
    
    //进行全局搜索的数据库操作
    @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 t from Tag t")
    List<Tag> findTop(Pageable pageable);
    
    @Query("select t from Type t")
    List<Type> findTop(Pageable pageable);
    
  2. 设计util.MarkdownUtils类,对md格式新闻进行支持

    public class MarkdownUtils {
    
    
        /**
         * markdown格式转换成HTML格式
         * @param markdown
         * @return
         */
        public static String markdownToHtml(String markdown) {
            Parser parser = Parser.builder().build();
            Node document = parser.parse(markdown);
            HtmlRenderer renderer = HtmlRenderer.builder().build();
            return renderer.render(document);
        }
    
        /**
         * 增加扩展[标题锚点,表格生成]
         * Markdown转换成HTML
         * @param markdown
         * @return
         */
        public static String markdownToHtmlExtensions(String markdown) {
            //h标题生成id
            Set<Extension> headingAnchorExtensions = Collections.singleton(HeadingAnchorExtension.create());
            //转换table的HTML
            List<Extension> tableExtension = Arrays.asList(TablesExtension.create());
            Parser parser = Parser.builder()
                    .extensions(tableExtension)
                    .build();
            Node document = parser.parse(markdown);
            HtmlRenderer renderer = HtmlRenderer.builder()
                    .extensions(headingAnchorExtensions)
                    .extensions(tableExtension)
                    .attributeProviderFactory(new AttributeProviderFactory() {
                        public AttributeProvider create(AttributeProviderContext context) {
                            return new CustomAttributeProvider();
                        }
                    })
                    .build();
            return renderer.render(document);
        }
    
        /**
         * 处理标签的属性
         */
        static class CustomAttributeProvider implements AttributeProvider {
            @Override
            public void setAttributes(Node node, String tagName, Map<String, String> attributes) {
                //改变a标签的target属性为_blank
                if (node instanceof Link) {
                    attributes.put("target", "_blank");
                }
                if (node instanceof TableBlock) {
                    attributes.put("class", "ui celled table");
                }
            }
        }
    
    
        public static void main(String[] args) {
            String table = "| hello | hi   | 哈哈哈   |\n" +
                    "| ----- | ---- | ----- |\n" +
                    "| 斯维尔多  | 士大夫  | f啊    |\n" +
                    "| 阿什顿发  | 非固定杆 | 撒阿什顿发 |\n" +
                    "\n";
            String a = "[imCoding 爱编程](http://www.lirenmi.cn)";
            System.out.println(markdownToHtmlExtensions(a));
        }
    
    }
    
  3. 在相应的xxxServiceImpl中实现全局搜索、markdown语法支持、展示新闻详情页、新闻主页、左侧类型、标签和推荐新闻的方法

    //返回新闻列表
    @Override
    public Page<News> listNews(Pageable pageable) {
        return newsRepository.findAll(pageable);
    }
    
    //进行全局搜索
     @Override
     public Page<News> listNews(String query, Pageable pageable) {
    	return newsRepository.findByQuery(query, pageable);
    }
    
    //返回推荐新闻列表
    @Override
    public List<News> listRecommendNewsTop(Integer size) {
        Sort sort = Sort.by(Sort.Direction.DESC, "updateTime");
        Pageable pageable = PageRequest.of(0, size, sort);
        return newsRepository.findTop(pageable);
    }
    
    //转换md格式新闻
    @Override
    public News getAndConvert(Long id) {
        News news = newsRepository.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 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);
    }
    
    //返回标签列表
    @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);
    }
    
  4. 设计web.IndexController类,相应web页面的请求,进行新闻主页的展示、搜索和点击进入详情页

    @Controller
    public class IndexController {
    
        @Autowired
        private TypeService typeService;
    
        @Autowired
        private TagService tagService;
    
        @Autowired
        private NewsService newsService;
    
        @GetMapping("/")
        public String index(@PageableDefault(size = 3, sort = {"updateTime"}, direction = Sort.Direction.DESC) Pageable pageable, Model model) {
            model.addAttribute("page", newsService.listNews(pageable));
            model.addAttribute("types", typeService.listTypeTop(3));
            model.addAttribute("tags", tagService.listTagTop(3));
            model.addAttribute("recommendNews", newsService.listRecommendNewsTop(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", newsService.listNews("%"+query+"%", pageable));
            model.addAttribute("query", query);
            return "search";
        }
    
        @RequestMapping("/news/{id}")
        public String news(@PathVariable Long id, Model model) {
            model.addAttribute("news", newsService.getAndConvert(id));
            return "new";
        }
    
    }
    
  5. 项目运行测试

    springboot——新闻列表主页显示和新闻详情页_第1张图片

    springboot——新闻列表主页显示和新闻详情页_第2张图片

    springboot——新闻列表主页显示和新闻详情页_第3张图片

你可能感兴趣的:(springboot——新闻列表主页显示和新闻详情页)