您的位置:首页 > 编程语言 > Java开发

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

2020-07-31 15:33 465 查看

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

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

    //查询推荐新闻
    @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. 项目运行测试

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: