1.md转html

1.1.pom文件中加入如下依赖

 <!--md转html--><dependency><groupId>com.atlassian.commonmark</groupId><artifactId>commonmark</artifactId><version>0.10.0</version></dependency><dependency><groupId>com.atlassian.commonmark</groupId><artifactId>commonmark-ext-heading-anchor</artifactId><version>0.10.0</version></dependency><dependency><groupId>com.atlassian.commonmark</groupId><artifactId>commonmark-ext-gfm-tables</artifactId><version>0.10.0</version></dependency>

1.2.转换工具类MarkdownUtils

package com.tedu.blog.util;import org.commonmark.Extension;
import org.commonmark.ext.gfm.tables.TableBlock;
import org.commonmark.ext.gfm.tables.TablesExtension;
import org.commonmark.ext.heading.anchor.HeadingAnchorExtension;
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.AttributeProviderContext;
import org.commonmark.renderer.html.AttributeProviderFactory;
import org.commonmark.renderer.html.HtmlRenderer;import java.util.*;/*** @description: markdown格式转换工具类* @author: zfh* @email: hst1406959716@163.com* @date: Created in 2021/8/27 8:44* @modified By:* @version: 1.0*/
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标题生成idSet<Extension> headingAnchorExtensions = Collections.singleton(HeadingAnchorExtension.create());//转换table的HTMLList<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 {@Overridepublic void setAttributes(Node node, String tagName, Map<String, String> attributes) {//改变a标签的target属性为_blankif (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.tmooc.cn)";System.out.println(markdownToHtmlExtensions(a));}
}

2.编辑blog.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head th:replace="_fragments :: head(~{::title})"><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>博客详情</title><link rel="stylesheet" href="https://cdn.jsdelivr.net/semantic-ui/2.2.4/semantic.min.css"><link rel="stylesheet" href="../static/css/typo.css"><link rel="stylesheet" href="../static/css/animate.css"><link rel="stylesheet" href="../static/lib/prism/prism.css"><link rel="stylesheet" href="../static/lib/tocbot/tocbot.css"><link rel="stylesheet" href="../static/css/me.css">
</head>
<body><!--导航--><nav th:replace="_fragments :: menu(1)"  class="ui inverted attached segment m-padded-tb-mini m-shadow-small" ><div class="ui container"><div class="ui inverted secondary stackable menu"><h2 class="ui teal header item">Blog</h2><a href="#" class="active m-item item m-mobile-hide"><i class="home icon"></i>首页</a><a href="#" class="m-item item m-mobile-hide"><i class="idea icon"></i>分类</a><a href="#" class="m-item item m-mobile-hide"><i class="tags icon"></i>标签</a><a href="#" class="m-item item m-mobile-hide"><i class="clone icon"></i>归档</a><a href="#" class="m-item item m-mobile-hide"><i class="info icon"></i>关于我</a><div class="right m-item item m-mobile-hide"><div class="ui icon inverted transparent input m-margin-tb-tiny"><input type="text" placeholder="Search...."><i class="search link icon"></i></div></div></div></div><a href="#" class="ui menu toggle black icon button m-right-top m-mobile-show"><i class="sidebar icon"></i></a></nav><!--中间内容--><div id="waypoint" class="m-container-small m-padded-tb-big animated fadeIn"><div class="ui container"><div class="ui top attached segment"><div class="ui horizontal link list"><div class="item"><img src="https://unsplash.it/100/100?image=1005" th:src="@{${blog.user.avatar}}"  alt="" class="ui avatar image"><div class="content"><a href="#" class="header" th:text="${blog.user.nickname}">java小生不才</a></div></div><div class="item"><i class="calendar icon"></i> <span th:text="${#dates.format(blog.updateTime,'yyyy-MM-dd')}">2017-10-01</span></div><div class="item"><i class="eye icon"></i> <span th:text="${blog.views}">2342</span></div></div></div><div class="ui attached segment"><!--图片区域--><img src="https://unsplash.it/800/450?image=1005" th:src="@{${blog.firstPicture}}" alt="" class="ui fluid rounded image"></div><div class="ui  attached padded segment"><!--内容--><div class="ui right aligned basic segment"><div class="ui orange basic label" th:text="${blog.flag}">原创</div></div><h2 class="ui center aligned header" th:text="${blog.title}">关于刻意练习的清单</h2><br><!--中间主要内容部分--><div id="content" class="typo  typo-selection js-toc-content m-padded-lr-responsive m-padded-tb-large" th:utext="${blog.content}"><h2 id="section1">一、关于 <i class="serif">Typo.css</i></h2><pre><code class="language-css">p { color: red }</code></pre><pre><code class="language-css">p { color: red }</code></pre><p><i class="serif">Typo.css</i> 的目的是,在一致化浏览器排版效果的同时,构建最适合中文阅读的网页排版。</p><h4 >现状和如何去做:</h4><p class="typo-first">排版是一个麻烦的问题 <sup><a href="#appendix1"># 附录一</a></sup>,需要精心设计,而这个设计却是常被视觉设计师所忽略的。前端工程师更常看到这样的问题,但不便变更。因为在多个 OS 中的不同浏览器渲染不同,改动需要多的时间做回归测试,所以改变变得更困难。而像我们一般使用的Yahoo、Eric Meyer 和 Alice base.css 中采用的 Reset 都没有很好地考虑中文排版。<i class="serif">Typo.css</i> 要做的就是解决中文排版的问题。</p><p><strong><i class="serif">Typo.css</i> 测试于如下平台:</strong></p><table class="ui table" summary="Typo.css 的测试平台列表"><thead><tr><th>OS/浏览器</th><th>Firefox</th><th>Chrome</th><th>Safari</th><th>Opera</th><th>IE9</th><th>IE8</th><th>IE7</th><th>IE6</th></tr></thead><tbody><tr><td>OS X</td><td>✔</td><td>✔</td><td>✔</td><td>✔</td><td>-</td><td>-</td><td>-</td><td>-</td></tr><tr><td>Win 7</td><td>✔</td><td>✔</td><td>✔</td><td>✔</td><td>✔</td><td>✔</td><td>✔</td><td>-</td></tr><tr><td>Win XP</td><td>✔</td><td>✔</td><td>✔</td><td>✔</td><td>-</td><td>✔</td><td>✔</td><td>✔</td></tr><tr><td>Ubuntu</td><td>✔</td><td>✔</td><td>-</td><td>✔</td><td>-</td><td>-</td><td>-</td><td>-</td></tr></tbody></table><h4>中文排版的重点和难点</h4><p>在中文排版中,HTML4 的很多标准在语义在都有照顾到。但从视觉效果上,却很难利用单独的 CSS 来实现,像<abbr title="在文字下多加一个点">着重号</abbr>(例:这里<em class="typo-em">强调一下</em>)。在 HTML4 中,专名号标签(<code>&lt;u&gt;</code>)已经被放弃,而HTML5 被<a href="http://html5doctor.com/u-element/">重新提起</a>。<i class="serif">Typo.css</i> 也根据实际情况提供相应的方案。我们重要要注意的两点是:</p><ol><li>语义:语义对应的用法和样式是否与中文排版一致</li><li>表现:在各浏览器中的字体、大小和缩放是否如排版预期</li></ol><p>对于这些,<i class="serif">Typo.css</i> 排版项目的中文偏重注意点,都添加在附录中,详见:</p><blockquote><b>附录一</b>:<a href="#appendix1"><i class="serif">Typo.css</i> 排版偏重点</a></blockquote><p>目前已有像百姓网等全面使用 <i class="serif">Typo.css</i> 的项目,测试平台的覆盖,特别是在<abbr title="手机、平板电脑等移动平台">移动端</abbr>上还没有覆盖完主流平台,希望有能力的同学能加入测试行列,或者加入到 <i class="serif">Typo.css</i>的开发。加入方法:<a href="https://github.com/sofish/Typo.css">参与 <i class="serif">Typo.css</i> 开发</a>。如有批评、建议和意见,也随时欢迎给在 Github 直接提 <ahref="https://github.com/sofish/Typo.css/issues">issues</a>,或给<abbr title="Sofish Lin, author of Typo.css"role="author">我</abbr>发<ahref="mailto:sofish@icloud.com">邮件</a>。</p><h2 id="section2">二、排版实例:</h2><p>提供2个排版实例,第一个中文实例来自于来自于<cite class="typo-unique">张燕婴</cite>的《论语》,由于古文排版涉及到的元素比较多,所以采用《论语》中《学而》的第一篇作为排版实例介绍;第2个来自到经典的Lorem Ipsum,并加入了一些代码和列表等比较具有代表性的排版元素。</p><h3 id="section2-1">例1:论语学而篇第一</h3><p><small><b>作者:</b><abbr title="名丘,字仲尼">孔子</abbr>(<time>前551年9月28日-前479年4月11日</time>)</small></p><h4>本篇引语</h4><p>《学而》是《论语》第一篇的篇名。《论语》中各篇一般都是以第一章的前二三个字作为该篇的篇名。《学而》一篇包括16章,内容涉及诸多方面。其中重点是「吾日三省吾身」;「节用而爱人,使民以时」;「礼之用,和为贵」以及仁、孝、信等道德范畴。 </p><h4>原文</h4><p>子曰:「学而时习之,不亦说乎?有朋自远方来,不亦乐乎?人不知,而不愠,不亦君子乎?」 </p><h4>译文</h4><p>孔子说:「学了又时常温习和练习,不是很愉快吗?有志同道合的人从远方来,不是很令人高兴的吗?人家不了解我,我也不怨恨、恼怒,不也是一个有德的君子吗?」 </p><h4>评析</h4><p>宋代著名学者<u class="typo-u">朱熹</u>对此章评价极高,说它是「入道之门,积德之基」。本章这三句话是人们非常熟悉的。历来的解释都是:学了以后,又时常温习和练习,不也高兴吗等等。三句话,一句一个意思,前后句子也没有什么连贯性。但也有人认为这样解释不符合原义,指出这里的「学」不是指学习,而是指学说或主张;「时」不能解为时常,而是时代或社会的意思,「习」不是温习,而是使用,引申为采用。而且,这三句话不是孤立的,而是前后相互连贯的。这三句的意思是:自己的学说,要是被社会采用了,那就太高兴了;退一步说,要是没有被社会所采用,可是很多朋友赞同<abbrtitle="张燕婴">我</abbr>的学说,纷纷到我这里来讨论问题,我也感到快乐;再退一步说,即使社会不采用,人们也不理解我,我也不怨恨,这样做,不也就是君子吗?(见《齐鲁学刊》1986年第6期文)这种解释可以自圆其说,而且也有一定的道理,供读者在理解本章内容时参考。</p><p>此外,在对「人不知,而不愠」一句的解释中,也有人认为,「人不知」的后面没有宾语,人家不知道什么呢?当时因为孔子有说话的特定环境,他不需要说出知道什么,别人就可以理解了,却给后人留下一个谜。有人说,这一句是接上一句说的,从远方来的朋友向我求教,我告诉他,他还不懂,我却不怨恨。这样,「人不知」就是「人家不知道我所讲述的」了。这样的解释似乎有些牵强。</p><p>总之,本章提出以学习为乐事,做到人不知而不愠,反映出孔子学而不厌、诲人不倦、注重修养、严格要求自己的主张。这些思想主张在《论语》书中多处可见,有助于对第一章内容的深入了解。</p><h3 id="section2-2">例2:英文排版</h3><p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry'sstandard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make atype specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remainingessentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsumpassages, and more recently with desktop publishing software like Aldus PageMaker including versions of LoremIpsum.</p><blockquote>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magnaaliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</blockquote><h4>The standard Lorem Ipsum passage, used since the 1500s</h4><p>"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magnaaliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sintoccaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."</p><h4>Section 1.10.32 of "de Finibus Bonorum et Malorum", written by Cicero in 45 BC</h4><p>"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam,eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsamvoluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui rationevoluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipiscivelit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enimad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodiconsequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur,vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?"</p><h4>List style in action</h4><ul><li>If you wish to succeed, you should use persistence as your good friend, experience as your reference, prudence asyour brother and hope as your sentry.<p>如果你希望成功,当以恒心为良友,以经验为参谋,以谨慎为兄弟,以希望为哨兵。</p></li><li>Sometimes one pays most for the things one gets for nothing.<p>有时候一个人为不花钱得到的东西付出的代价最高。</p></li><li>Only those who have the patience to do simple things perfectly ever acquire the skill to do difficult thingseasily.<p>只有有耐心圆满完成简单工作的人,才能够轻而易举的完成困难的事。</p></li></ul><h4>You may want to create a perfect <code>&lt;hr /&gt;</code> line, despite the fact that there will never have one</h4><hr/><p><abbr title="法国作家罗切福考尔德">La Racheforcauld</abbr> said:<mark>"Few things are impossible in themselves; and it is often for want of will, rather than of means, that man failsto succeed".</mark>You just need to follow the browser's behavior, and set a right <code>margin</code> to it。it will works nice as thedemo you're watching now. The following code is the best way to render typo in Chinese:</p><pre ><code class="language-css">
/* 标题应该更贴紧内容,并与其他块区分,margin 值要相应做优化 */
h1,h2,h3,h4,h5,h6 {line-height:1;font-family:Arial,sans-serif;margin:1.4em 0 0.8em;
}
h1{font-size:1.8em;}
h2{font-size:1.6em;}
h3{font-size:1.4em;}
h4{font-size:1.2em;}
h5,h6{font-size:1em;}/* 现代排版:保证块/段落之间的空白隔行 */
.typo p, .typo pre, .typo ul, .typo ol, .typo dl, .typo form, .typo hr {margin:1em 0 0.6em;
}
</code></pre><h3 id="section3">三、附录</h3><h5 id="appendix1">1、<i class="serif">Typo.css</i> 排版偏重点</h5><table class="ui table" summary="Typo.css 排版偏重点"><thead><tr><th>类型</th><th>语义</th><th>标签</th><th>注意点</th></tr></thead><tbody><tr><th rowspan="15">基础标签</th><td>标题</td><td><code>h1</code> ~ <code>h6</code></td><td>全局不强制大小,<code>.typo</code> 中标题与其对应的内容应紧贴,并且有相应的大小设置</td></tr><tr><td>上、下标</td><td><code>sup</code>/<code>sub</code></td><td>保持与 MicroSoft Office Word 等程序的日常排版一致</td></tr><tr><td>引用</td><td><code>blockquote</code></td><td>显示/嵌套样式</td></tr><tr><td>缩写</td><td><code>abbr</code></td><td>是否都有下划线,鼠标 <code>hover</code> 是否为帮助手势</td></tr><tr><td>分割线</td><td><code>hr</code></td><td>显示的 <code>padding</code> 和 <code>margin</code>正确</td></tr><tr><td>列表</td><td><code>ul</code>/<code>ol</code>/<code>dl</code></td><td>在全局没有 <code>list-style</code>,在 .<code>typo</code> 中对齐正确</td></tr><tr><td>定义列表</td><td><code>dl</code></td><td>全局 <code>padding</code> 和 <code>margin</code>为0, .<code>typo</code> 中对齐正确</td></tr><tr><td>选项</td><td><code>input[type=radio[, checkbox]]</code></td><td>与其他 <code>form</code> 元素排版时是否居中</td></tr><tr><td>斜体</td><td><code>i</code></td><td>只设置一种斜体,让 <code>em</code> 和 <code>cite</code> 显示为正体</td></tr><tr><td>强调</td><td><code>em</code></td><td>在全局显示正体,在 <code>.typo</code> 中显示与 <code>b</code> 和 <code>strong</code> 的样式一致,为粗体</td></tr><tr><td>加强</td><td><code>strong/b</code></td><td>显示为粗体</td></tr><tr><td>标记</td><td><code>mark</code></td><td>类似荧光笔</td></tr><tr><td>印刷</td><td><code>small</code></td><td>保持为正确字体的 80% 大小,颜色设置为浅灰色</td></tr><tr><td>表格</td><td><code>table</code></td><td>全局不显示线条,在 <code>table</code> 中显示表格外框,并且表头有浅灰背景</td></tr><tr><td>代码</td><td><code>pre</code>/<code>code</code></td><td>字体使用 <code>courier</code> 系字体,保持与 <code>serif</code> 有比较一致的显示效果</td></tr><tr><th rowspan="5">特殊符号</th><td>着重号</td><td><em class="typo-em">在文字下加点</em></td><td>在支持 <code>:after</code> 和 <code>:before</code> 的浏览器可以做渐进增强实现</td></tr><tr><td>专名号</td><td><u>林建锋</u></td><td>专名号,有下划线,使用 <code>u</code> 或都 <code>.typo-u</code> 类</td></tr><tr><td>破折号</td><td>——</td><td>保持一划,而非两划</td></tr><tr><td>人民币</td><td>&yen;</td><td>使用两平等线的符号,或者 HTML 实体符号 <code>&amp;yen;</code></td></tr><tr><td>删除符</td><td><del>已删除(deleted)</del></td><td>一致化各浏览器显示,中英混排正确</td></tr><tr><th rowspan="3">加强类</th><td>专名号</td><td><code>.typo-u</code></td><td>由于 <code>u</code> 被 HTML4 放弃,在向后兼容上推荐使用 <code>.typo-u</code></td></tr><tr><td>着重符</td><td><code>.typo-em</code></td><td>利用 <code>:after</code> 和 <code>:before</code> 实现着重符</td></tr><tr><td>清除浮动</td><td><code>.clearfix</code></td><td>与一般 CSS Reset 保持一对致 API</td></tr><tr><th rowspan="5">注意点</th><td colspan="3">(1)中英文混排行高/行距</td></tr><tr><td colspan="3">(2)上下标在 IE 中显示效果</td></tr><tr><td colspan="3">(3)块/段落分割空白是否符合设计原则</td></tr><tr><td colspan="3">(4)input 多余空间问题</td></tr><tr><td colspan="3">(5)默认字体色彩,目前采用 <code>#333</code> 在各种浏览显示比较好</td></tr></tbody></table><h5 id="appendix2">2、开源许可</h5></div><!--标签--><div class="m-padded-lr-responsive"><div class="ui basic teal left pointing label" th:each="tag : ${blog.tags}" th:text="${tag.name}">方法论</div></div><!--赞赏--><div class="ui center aligned basic segment"><button id="payButton" class="ui orange basic circular button">赞赏</button></div><div class="ui payQR flowing popup transition hidden"><div class="ui orange basic label"><div class="ui images" style="font-size: inherit !important;"><div class="image"><img src="../static/images/wechat.jpg" th:src="@{/images/wechat.jpg}" alt="" class="ui rounded bordered image" style="width: 120px"><div>支付宝</div></div><div class="image"><img src="../static/images/wechat.jpg" th:src="@{/images/wechat.jpg}" alt="" class="ui rounded bordered image" style="width: 120px"><div>微信</div></div></div></div></div></div><div class="ui attached positive message"><!--博客信息--><div class="ui middle aligned grid"><div class="eleven wide column"><ui class="list"><li>作者:<span th:text="${blog.user.nickname}">java小生不才</span><a href="#" th:href="@{/about}" target="_blank">(联系作者)</a></li><li>发表时间:<span th:text="${#dates.format(blog.updateTime,'yyyy-MM-dd HH:mm')}">2017-10-02 09:08</span></li><li>版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)</li><li>公众号转载:请在文末添加作者公众号二维码</li></ui></div><div class="five wide column"><img src="../static/images/wechat.jpg" th:src="@{/images/wechat.jpg}" alt="" class="ui right floated rounded bordered image" style="width: 110px"></div></div></div><div id="comment-container" class="ui bottom attached segment"><!--留言区域列表--><div class="ui teal segment"><div class="ui threaded comments"><h3 class="ui dividing header">Comments</h3><div class="comment"><a class="avatar"><img src="https://unsplash.it/100/100?image=1005"></a><div class="content"><a class="author">Matt</a><div class="metadata"><span class="date">Today at 5:42PM</span></div><div class="text">How artistic!</div><div class="actions"><a class="reply">回复</a></div></div></div><div class="comment"><a class="avatar"><img src="https://unsplash.it/100/100?image=1005"></a><div class="content"><a class="author">Elliot Fu</a><div class="metadata"><span class="date">Yesterday at 12:30AM</span></div><div class="text"><p>This has been very useful for my research. Thanks as well!</p></div><div class="actions"><a class="reply">回复</a></div></div><div class="comments"><div class="comment"><a class="avatar"><img src="https://unsplash.it/100/100?image=1005"></a><div class="content"><a class="author">Jenny Hess</a><div class="metadata"><span class="date">Just now</span></div><div class="text">Elliot you are always so right :)</div><div class="actions"><a class="reply">回复</a></div></div></div></div></div><div class="comment"><a class="avatar"><img src="https://unsplash.it/100/100?image=1005"></a><div class="content"><a class="author">Joe Henderson</a><div class="metadata"><span class="date">5 days ago</span></div><div class="text">Dude, this is awesome. Thanks so much</div><div class="actions"><a class="reply">回复</a></div></div></div></div></div><div class="ui form"><div class="field"><textarea name="content" placeholder="请输入评论信息..."></textarea></div><div class="fields"><div class="field m-mobile-wide m-margin-bottom-small"><div class="ui left icon input"><i class="user icon"></i><input type="text" name="nickname" placeholder="姓名"></div></div><div class="field m-mobile-wide m-margin-bottom-small"><div class="ui left icon input"><i class="mail icon"></i><input type="text" name="email" placeholder="邮箱"></div></div><div class="field  m-margin-bottom-small m-mobile-wide"><button class="ui teal button m-mobile-wide"><i class="edit icon"></i>发布</button></div></div></div></div></div></div><div id="toolbar" class="m-padded m-fixed m-right-bottom" style="display: none"><div class="ui vertical icon buttons "><button type="button" class="ui toc teal button" >目录</button><a href="#comment-container" class="ui teal button" >留言</a><button class="ui wechat icon button"><i class="weixin icon"></i></button><div id="toTop-button" class="ui icon button" ><i class="chevron up icon"></i></div></div></div><div class="ui toc-container flowing popup transition hidden" style="width: 250px!important;"><ol class="js-toc"></ol></div><div id="qrcode" class="ui wechat-qr flowing popup transition hidden "style="width: 130px !important;"><!--<img src="./static/images/wechat.jpg" alt="" class="ui rounded image" style="width: 120px !important;">--></div><br><br><!--底部footer--><footer th:replace="_fragments :: footer" class="ui inverted vertical segment m-padded-tb-massive"><div class="ui center aligned container"><div class="ui inverted divided stackable grid"><div class="three wide column"><div class="ui inverted link list"><div class="item"><img src="../static/images/wechat.jpg" class="ui rounded image" alt="" style="width: 110px"></div></div></div><div class="three wide column"><h4 class="ui inverted header m-text-thin m-text-spaced " >最新博客</h4><div class="ui inverted link list"><a href="#" class="item m-text-thin">用户故事1(User Story)</a><a href="#" class="item m-text-thin">用户故事2(User Story)</a><a href="#" class="item m-text-thin">用户故事3(User Story)</a></div></div><div class="three wide column"><h4 class="ui inverted header m-text-thin m-text-spaced ">联系我</h4><div class="ui inverted link list"><a href="#" class="item m-text-thin">Email: hst1406959716@163.com</a><a href="#" class="item m-text-thin">QQ: 383568194</a></div></div><div class="seven wide column"><h4 class="ui inverted header m-text-thin m-text-spaced ">Blog</h4><p class="m-text-thin m-text-spaced m-opacity-mini">这是我的个人博客、会分享关于编程、写作、思考相关的任何内容,希望可以给来到这儿的人有所帮助...</p></div></div><div class="ui inverted section divider"></div><p class="m-text-thin m-text-spaced m-opacity-tiny">Copyright © 2016 - 2017 java小生不才 Designed by java小生不才</p></div></footer><!--/*/<th:block th:replace="_fragments :: script">/*/-->
<script src="https://cdn.jsdelivr.net/npm/jquery@3.2/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/semantic-ui/2.2.4/semantic.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/jquery.scrollto@2.1.2/jquery.scrollTo.min.js"></script><script src="../static/lib/prism/prism.js"></script>
<script src="../static/lib/tocbot/tocbot.min.js"></script>
<script src="../static/lib/qrcode/qrcode.min.js"></script>
<script src="../static/lib/waypoints/jquery.waypoints.min.js"></script><!--/*/</th:block>/*/--><script th:inline="javascript">$('.menu.toggle').click(function () {$('.m-item').toggleClass('m-mobile-hide');});$('#payButton').popup({popup : $('.payQR.popup'),on : 'click',position: 'bottom center'});tocbot.init({// Where to render the table of contents.tocSelector: '.js-toc',// Where to grab the headings to build the table of contents.contentSelector: '.js-toc-content',// Which headings to grab inside of the contentSelector element.headingSelector: 'h1, h2, h3',});$('.toc.button').popup({popup : $('.toc-container.popup'),on : 'click',position: 'left center'});$('.wechat').popup({popup : $('.wechat-qr'),position: 'left center'});var serurl = "127.0.0.1:8080";var url = /*[[@{/blog/{id}(id=${blog.id})}]]*/"";var qrcode = new QRCode("qrcode", {text: serurl+url,width: 110,height: 110,colorDark : "#000000",colorLight : "#ffffff",correctLevel : QRCode.CorrectLevel.H});$('#toTop-button').click(function () {$(window).scrollTo(0,500);});var waypoint = new Waypoint({element: document.getElementById('waypoint'),handler: function(direction) {if (direction == 'down') {$('#toolbar').show(100);} else {$('#toolbar').hide(500);}console.log('Scrolled to waypoint!  ' + direction);}})</script>
</body>
</html>

3.BlogService中添加getAndConvert

/*** 获取并转化(md转html)* @param id* @return*/Blog getAndConvert(Long id);

4.BlogServiceImpl中添加getAndConvert实现

@Override
public Blog getAndConvert(Long id) {Blog blog = blogRepository.getOne(id);if (blog == null) {throw new NotFoundException("该博客不存在");}Blog b = new Blog();BeanUtils.copyProperties(blog,b);String content = b.getContent();b.setContent(MarkdownUtils.markdownToHtmlExtensions(content));return b;}

5.编辑IndexController

 /*** 博客详情* @param id* @param model* @return*/@GetMapping("/blog/{id}")public String blog(@PathVariable Long id, Model model) {model.addAttribute("blog", blogService.getAndConvert(id));return "blog";}

6.页面访问

7.博客展现量的更新

7.1.BlogRepository中新增updateViews

 @Transactional@Modifying@Query("update Blog b set b.views = b.views+1 where b.id = ?1")int updateViews(Long id);

7.2.BlogServiceImpl的getAndConvert

 @Overridepublic Blog getAndConvert(Long id) {Blog blog = blogRepository.getOne(id);if (blog == null) {throw new NotFoundException("该博客不存在");}Blog b = new Blog();BeanUtils.copyProperties(blog,b);String content = b.getContent();b.setContent(MarkdownUtils.markdownToHtmlExtensions(content));//更新展现量blogRepository.updateViews(id);return b;}

7.3.博客页面展示量测试


个人博客系统前台博客详情相关推荐

  1. 基于博客系统的访客日志记录

    当我们做的一些应用需要记录一些接口被访问时用户的信息时,我们就需要用到一些记录请求的技术,并记录日志到数据库.本文章使用的方法:注解+AOP 原理:事先在数据库中建立一个记录访客日志的一张表.先自定义 ...

  2. Boostnote 笔记搭配 WordPress 博客系统发布博客

    Boostnote 笔记搭配 WordPress 博客系统发布博客 简介 如果需要图片或者视屏插入怎么办? 搭配 WordPress 发布博客 简介 boostnote 是一款跨平台,极客风的笔记软件 ...

  3. 抖音获客源码,短视频获客系统,获客SaaS有标准答案吗?

    抖音获客源码,短视频获客系统,获客,这一SaaS行业的垂直细分领域,有没有可能,存在一种标准答案? 带着疑问打开浏览器,在某度中,我们尝试输入"抖音获客源码"."短视频获 ...

  4. 私人定制外贸精准获客产品 外贸智能获客系统 好选客

    当下疫情奥密克戎全球施虐,严重影响外贸企业正常的全球采购商的开发,传统的外贸开发客户方式全球国际展会已经静止三年有余,目前疫情情况下还有很远的路要走.B2B国际网站模式过于传统导致同行竞品竞争激烈已毫 ...

  5. 如何通过大数据获客系统实现“获客自由”?

    随着移动互联网的推进,大数据时代成为下一个流量的风口,企业为了降低获客成本,从传统粗矿式经营模式逐渐转变为精细化经营,那么如何通过大数据获客系统实现"获客自由"吗?下面一起来看看吧 ...

  6. java基于ssm的个人博客系统个人博客网站个人博客项目源码

    简介 Java ssm开发的个人博客系统,可以发布博客,照片,站长留言. 演示视频 https://www.bilibili.com/video/BV1sf4y1y7Ne/?share_source= ...

  7. THinkphp5.0开源个人博客系统-优优博客系统 v2.3

    介绍: 优优博客系统是一款开源的THinkphp5.0 的 Blog系统,其衍生于优秀的内容管理系统 易优cms. 优优 Blog系统秉承了易优CMS的先进设计理念,并且专注于个人博客系统. 易优 B ...

  8. 好用的php博客系统,个人博客系统推荐 PHP开源好用的BLOG程序大全

    blog博客程序是现在很多站长和个人博客爱好者使用的程序,很多朋友问我博客系统哪个好,下面介绍一下好用的博客系统.排名不分先后. WordPress WordPress是一种使用 PHP语言和 MyS ...

  9. WhatsApp客服系统,为什么使用SendWS拓客系统实现WhatsApp客服系统多账号管理?

    为什么需要WhatsApp客服系统?有什么好处? 利用好WhatsApp做海外推广宣传有个重要的点就是客服效率,如果客户有问题肯定第一时间找客服,一个好的客服能帮助客户解决问题,有利于品牌提高成交率和 ...

最新文章

  1. html及js试题,HTML+css+js试题..docx
  2. JVM:StringTable
  3. python怎么安装pandas模块-如何在Python 3中安装pandas包和使用数据结构
  4. 【模板】 全排列 有重复元素的全排列
  5. 三篇论文之Google MapReduce中文版
  6. sonar工具使用常见问题解决
  7. 【Flink】No key set. This method should not be called outside of a keyed context.
  8. 图像 存储csv_matplotlib基于数据文件绘制其图像
  9. Upload LABS Pass-5
  10. 理解UIScrollView
  11. Pytorch-OpCounter: Pytorch平台计算模型#Parameters和FLOPS的工具包
  12. 文件上传------c#
  13. 【优化求解】基于matlab粒子群算法求解仓库成本控制优化问题【含Matlab源码 1577期】
  14. 真值表-Python实现
  15. 天正电气T20 V6完全使用指南
  16. ecplise插入图片太大_PPT文件太大?100M的PPT一秒变18M,这个压缩方法实在绝了
  17. python中match方法_Python3.9.1中如何使用match方法?
  18. ubuntu虚拟机上外网设置
  19. shell脚本中 EOF的意思
  20. Linux根目录简介

热门文章

  1. 为什么直接使用IP地址无法访问网站
  2. 从Kaggle赛题: Quora Question Pairs 看文本相似性/相关性
  3. 交通堵塞?打个直升机赶时间吧!| 一周科技热闻回顾
  4. 360全景拼接 opencv_【OpenCV】全景拼接
  5. 四种经典的拉格朗日函数(Augmented Lagrangian Function)
  6. 石排科目二考场最新攻略
  7. MEMS加速度计核心简介
  8. Android 优化 透明Activity展示loading关闭时闪烁
  9. Web前端开发 table标签相关用法和属性
  10. Jsoup简单例子——爬取网页内的邮箱