springboot——新闻列表主页显示和新闻详情页
2020-07-31 15:33
465 查看
本次实现了新闻的主页显示、新闻搜索和新闻详情页。
- 实现新闻列表的展示
- 左侧展示分类、标签和推荐新闻
- 实现全局搜索,可以搜索标题或文章内容
- 点击新闻可以进入新闻详情页,并支持Md
-
在
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);
-
设计
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)); } }
-
在相应的
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); }
-
设计
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"; } }
-
项目运行测试
相关文章推荐
- spring boot新闻管理项目——评论功能和按标签、类型显示新闻
- springboot开发:新闻管理系统的首页及详情页设计
- [个人笔记]基于SpringBoot的新闻管理系统 新闻首页+详情页
- 桂电在线_微信公众平台开发之-运用angularjs显示学校公告新闻列表和详情页面
- spring boot新闻详情页面展示
- SpringBoot博客开发日常记录-搜索功能以及搜索词汇云图显示
- 基于springboot的温湿度NBIOT采集实时显示
- 使用asp.net Ajax控件PopupControlExtender与GridView联合显示详情列表
- spring boot application 配置详情
- Spring Boot (教程六: 注解列表)
- [springboot 开发单体web shop] 8. 商品详情&评价展示
- springboot控制台显示带颜色
- Springboot+ECharts图表显示数据库信息
- <springBoot>(三)(入门篇)Eclipse中yml文件格式化显示
- SpringBoot结合Echarts显示图表
- layui+SpringBoot上传文件,分页列表,下载、搜索一站式
- SpringBoot秒杀系统实战18-页面优化技术-商品详情页面静态化(前后端分离)...
- Spring Cloud Eureka 服务注册列表显示 IP 配置问题
- Spring Boot配置文件中配置项列表
- ssm+springBoot的pom.xml中依赖描写正常却显示错误?