基于 Spring Boot 博客系统开发(二)

基于 Spring Boot 博客系统开发(二)

本系统是简易的个人博客系统开发,为了更加熟练地掌握SprIng Boot 框架及相关技术的使用。🌿🌿🌿
基于 Spring Boot 博客系统开发(一)👈👈

首页查询文章列表

后端代码

    @Autowiredprivate IArticleService articleService;@RequestMapping("/")public String home(Model model,@RequestParam(defaultValue = "1") Integer pageNum){PageHelper.startPage(pageNum,5);List<Article> articleList = articleService.list();PageInfo<Article> articlePage = new PageInfo<>(articleList);model.addAttribute("articlePage",articlePage);return "client/index";}

前端代码
文章列表模板

			<!-- 文章遍历并分页展示 --><article th:each="article:${articlePage.list}" class="am-g blog-entry-article"><div class="am-u-lg-6 am-u-md-12 am-u-sm-12 blog-entry-img"><img width="100%" class="am-u-sm-12" th:src="${'./user/img/rand/'+(article.id%25+1)+'.png'}"/></div><div class="am-u-lg-6 am-u-md-12 am-u-sm-12 blog-entry-text"><!-- 文章分类 --><span class="blog-color"style="font-size: 15px;"><a>默认分类</a></span><span>&nbsp;&nbsp;&nbsp;</span><!-- 发布时间 --><span style="font-size: 15px;" >发布于 [[${article.created}]]</span><h2><div><a style="color: #0f9ae0;font-size: 20px;" href="article.html" th:text="${article.title}">函数式接口</a></div></h2><!-- 文章摘要--><div style="font-size: 16px;" >   [[${article.content.substring(0,100)}]]......</div></div></article>

文章分页模板

        <!-- 文章分页信息 --><div class="am-pagination"><ol class="am-pagination"><li th:if="${!articlePage.isFirstPage}"  class="am-pagination-prev"><a  th:href="${'./?pageNum='+articlePage.prePage}">上一页</a></li><li th:class="${num==articlePage.pageNum?'current':''}" th:each="num:${articlePage.navigatepageNums}" ><a th:href="${'./?pageNum='+num}" th:text="${num}">1</a></li><li th:if="${!articlePage.isLastPage}" class="am-pagination-next"><a th:href="${'./?pageNum='+articlePage.nextPage}">下一页</a></li></ol></div>

实现效果

文章列表效果
在这里插入图片描述
文章分页效果
在这里插入图片描述

去除markdown、html标记,文章摘要处理

添加Markdown处理的依赖

 		<!-- Markdown处理html --><dependency><groupId>com.atlassian.commonmark</groupId><artifactId>commonmark</artifactId><version>0.11.0</version></dependency><!-- Markdown处理表格 --><dependency><groupId>com.atlassian.commonmark</groupId><artifactId>commonmark-ext-gfm-tables</artifactId><version>0.11.0</version></dependency><!-- 过滤emoji表情字符 --><dependency><groupId>com.vdurmont</groupId><artifactId>emoji-java</artifactId><version>4.0.0</version></dependency>

添加文本处理的工具类

import com.vdurmont.emoji.EmojiParser;
import org.apache.commons.lang3.StringUtils;
import org.commonmark.Extension;
import org.commonmark.ext.gfm.tables.TablesExtension;
import org.commonmark.node.Link;
import org.commonmark.node.Node;
import org.commonmark.parser.Parser;
import org.commonmark.renderer.html.AttributeProvider;
import org.commonmark.renderer.html.HtmlRenderer;
import org.springframework.stereotype.Component;import java.util.Arrays;
import java.util.List;
import java.util.Map;@Component
public class TextUtils {public static String intro(String markdown,int len) {String text = html2Text(md2Html(markdown));if (text.length() > len) {return text.substring(0, len)+"......";}return text;}/*** 去除md标记*/public static String md2Text(String markdown) {return html2Text(md2Html(markdown));}/*** 提取html中的文字*/public static String html2Text(String html) {if (StringUtils.isNotBlank(html)) {return html.replaceAll("(?s)<[^>]*>(\\s*<[^>]*>)*", "");}return "";}/*** Markdown转换为Html*/public static String md2Html(String markdown) {if (StringUtils.isBlank(markdown)) {return "";}List<Extension> extensions = Arrays.asList(TablesExtension.create());Parser parser = Parser.builder().extensions(extensions).build();Node document = parser.parse(markdown);HtmlRenderer renderer = HtmlRenderer.builder().attributeProviderFactory(context -> new LinkAttributeProvider()).extensions(extensions).build();String content = renderer.render(document);content = emoji(content);return content;}/*** :hugging 这种格式的字符转换为emoji表情*/public static String emoji(String value) {return EmojiParser.parseToUnicode(value);}private static class LinkAttributeProvider implements AttributeProvider {@Overridepublic void setAttributes(Node node, String tagName, Map<String, String> attributes) {if (node instanceof Link) {attributes.put("target", "_blank");}}}}

修改文章摘要模板,thymeleaf调用后台工具类方法使用@bean

 <!-- 文章摘要--><div style="font-size: 16px;"  >[[${@textUtils.intro(article.content,100)}]]</div>

最终实现效果

去除了markdown、html标记符号
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/641083.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis入门到通关之Redis数据结构-List篇

文章目录 ☃️概述☃️数据结构☃️源码☃️其他 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端…

html--奔腾的骏马

<!DOCTYPE html> <html lang"en" > <head> <meta charset"UTF-8"> <title>奔腾的骏马</title><link rel"stylesheet" href"css/style.css"></head> <body><input type"…

Java Web 网页设计(2)

​2.在网页上做表格&#xff1a; 输入标记及内容 点击运行 中华人民共和国​ <h1>中华人民共和国</h1> <!--一级标题的标记--><a href"add_user.jsp">点击我</a><a href"add_user1.jsp">点击我</a> (1)标题的标…

实测14us,Linux-RT实时性能及开发案例分享—基于全志T507-H国产平台

本文带来的是基于全志T507-H&#xff08;硬件平台&#xff1a;创龙科技TLT507-EVM评估板&#xff09;&#xff0c;Linux-RT内核的硬件GPIO输入和输出实时性测试及应用开发案例的分享。本次演示的开发环境如下&#xff1a; Windows开发环境&#xff1a;Windows 7 64bit、Window…

【正点原子STM32探索者】体验RT-Thread最新5.x版本

【正点原子STM32探索者】体验RT-Thread最新5.x版本 一、准备RT-Thread Env工具二、创建RT-Thread项目2.1 下载RT-Thread源码2.2 生成RT-Thread项目 三、编译和运行RT-Thread项目3.1 编译RT-Thread项目3.2 下载程序到开发板3.3 运行RT-Thread项目 四、体验RT-Thread的交互式shel…

DevOps(十)Jenkins实战之发布Django开发Web应用

面学习了Jenkins&#xff0c;Gitlab&#xff0c;Git&#xff0c;Selenium等等DevOps有关的工具。今天我们使用一个完整的Web应用发布流程来讲解怎么样将这些工具怎么配合使用。下面是这个流程的简单介绍&#xff1a;首先我们用Django开发一个简单的Web应用&#xff0c;然后发布…

KingbaseES数据库匿名块的基本用法

数据库版本&#xff1a;KingbaseES V008R006C008B0014 简介 匿名块是一种特殊的代码块&#xff0c;用于在数据库中执行一系列的SQL语句或PLSQL语句。它们通常用于执行一些简单的逻辑或者在数据库中执行一些事务性操作&#xff08;在匿名块中定义的一系列语句可以被视为1个事务&…

德思特车载天线方案:打造智能互联的公共安全交通网络

作者介绍 一、方案介绍 随着自动驾驶与智慧汽车概念的逐步推进&#xff0c;人们对汽车的交互性、智能性、互联性有了更高的要求。今天&#xff0c;大多数汽车制造商和供应商普遍将GNSS定位功能与其他信号如广播、电视、蓝牙、Wifi一起集成到汽车中&#xff0c;包括博世、大陆、…

vi, vim,data,wc,系统常用命令-读书笔记(十)

vi 文本编辑器 基本上 vi 共分为三种模式&#xff0c;分别是“一般指令模式”、“编辑模式”与“命令行命令模式”。这三种模式的作用分别是&#xff1a; 一般指令模式&#xff08;command mode&#xff09;以 vi 打开一个文件就直接进入一般指令模式了&#xff08;这是默认的…

【STL概念】

STL STL&#xff08;Standard Template Library),即标准模板库从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件&#xff0…

[MySQL]运算符

1. 算术运算符 (1). 算术运算符 : , -, *, / 或 DIV, % 或MOD. (2). 例 : (3). 注 : DUAL是伪表.可以看到4/2结果为小数&#xff0c;并不会截断小数部分.(可能与其他语言不同&#xff0c;比如java中&#xff0c;两个操作数如果是整数&#xff0c;则计算得到的也是整数&…

模块化以及生成

导入对象 >> pip install mock >> pip install pytest-mock 下面对coverage命令参数进行简单介绍。 coverage命令共有10种参数形式&#xff0c;分别是&#xff1a; run&#xff1a;运行一个Python程序并收集运行数据&#xff1b;report&#xff1a;生成报告&#x…