SpringBoot后台开发新闻主页管理+新闻页查看

主页管理

新闻列表

NewService.java接口中添加一个listView函数:

//主页显示列表
Page<News> listNew(Pageable pageable);

NewServiceImpl.java中实现该函数:

@Override
public Page<News> listNew(Pageable pageable) {
    return newRepository.findAll(pageable);
}

IndexController.java中对应页面添加这个list:

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

标签排行榜

TagRepository.java中添加findTop函数

//TagRepository.java
public interface TagRepository extends JpaRepository<Tag,Long> {
    Tag findByName(String name);

    @Query("select t from Tag t")
    List<Tag> findTop(Pageable pageable);

}

TagService.java中添加返回标签排行最多的函数:

//标签排行榜
List<Tag> listTagTop(Integer size);

然后在TagServiceImpl.java中使用TagRepository中的函数实现该函数:

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

IndexController.java中加入获取到的List:

	@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("tags",tagService.listTagTop(3));
        
        return "index";
    }

分类排行榜

分类排行榜实现和标签类似。
TypeRepository.java:

//TypeRepository.java
public interface TypeRepository extends JpaRepository<Type,Long> {
    Type findByName(String name);

    @Query("select t from Type t")
    List<Type> findTop(Pageable pageable);

}

TypeService.java中添加函数:

List<Type> listTypeTop(Integer size);

TypeServiceImpl.java中实现该函数:

	//显示前几条的分类
    @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中添加该list:

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

推荐新闻

推荐新闻即从推荐状态为true的新闻中选出最新的几篇返回一个list
NewRepository.java中添加选择推荐状态为true新闻的函数:

//NewRepository.java
public interface NewRepository extends JpaRepository<News,Long>, JpaSpecificationExecutor<News> {
	//推荐新闻
    @Query("select n from News n where n.recommend=true")
    List<News> findTop(Pageable pageable);
}

NewService.java:

//主页推荐新闻
List<News> listRecommendNewsTop(Integer size);

NewServiceImpl.java中具体实现该函数:

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

IndexController.java中添加该具体list:

@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.listRecommendNewsTop(3));
        return "index";
    }

全局搜索

搜索功能通过搜索新闻的标题和内容来返回结果。//全局搜索 Page<News> listNew(String query,Pageable pageable);
NewRepository.java:

//NewRepository.java
public interface NewRepository extends JpaRepository<News,Long>, JpaSpecificationExecutor<News> {
    //推荐
    @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);
    
}

NewService.java:

//全局搜索
Page<News> listNew(String query,Pageable pageable);

NewServiceImpl.java:

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

IndexController.java:

	@PostMapping("/search")
    public String search(@PageableDefault(size = 3,sort = {"updateTime"},direction = Sort.Direction.DESC)
                                 Pageable pageable, Model model,@RequestParam String query) {
        model.addAttribute("page",newService.listNew("%"+query+"%",pageable));
        model.addAttribute("query",query);
        return "search";
    }

新闻页显示

新闻页显示需要把新闻的content从内容转化为用MarkDown解析后的内容。
需要先新建一个Util包,然后新建一个MarkDownUtil.java:

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

}

NewService.java中添加如下函数:

//显示新闻
News getAndConvert(Long id);

NewServiceImpl.java通过MarkdownUtil具体实现该方法:

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

IndexController.java:

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

界面展示

在这里插入图片描述
点击新闻页具体显示:
在这里插入图片描述
全局搜索:
在这里插入图片描述

总结

本次内容新闻主页的显示主要就是给每一个部分的内容都返回一个对应的list,通过在Repository中检索到整个列表,然后在ServiceImpl中把所有值按照要求进行一个排序,然后返回整理后的结果即可。搜索的话主要是需要在Repository中要写完搜索部分的Sql语句。最后显示具体新闻内容主要传对应News参数,并且将内容转化成MarkDown解析的形式即可。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页