SpringBoot博客开发

第一章 首页开发

1.1 创建项目和文件目录

创建项目

使用webstrom,创建项目,选择empty project,输入项目名称blog

创建文件目录

  • static
    • css
    • js
    • images

1.2 前端框架 Semantic UI

引入:

1
2
3
4
<link rel="stylesheet" href="https://cdn.jsdelivr.net/semantic-ui/2.2.10/semantic.min.css">

<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.10/semantic.min.js"></script>

免费的CDN:https://www.jsdelivr.com/

1.3 首页开发

导航

导航的实现方式:segment + container + menu(item + right item)

中间内容

整体布局方式:container + grid网格布局11:5

博客文章布局:三个 attatched segment

博客文章头部:使用 two column grid进行左右布局,其中的子项使用了right aligned进行右对齐

博客文章列表item:每篇文章使用的segment布局,下面使用了grid(11:5)进行左右布局

  • 文章标题:h3+header
  • 文章:p标签
  • 底部:grid(11:5)布局 + 水平列表布局(horizontal list)

首页手机端适配

  • stackable 针对导航的menu,grid布局
  • mobile reversed:在手机上可以将grid布局上下翻转,本博客的效果是:手机端,图片在上,文字在下

jquery小知识

  • 可以使用$(“xxx”)来获取元素,xxx可以是id,也可以是class值
  • toggleClass 可以实现切换效果:判断是否有该属性,没有则添加该属性,有则移除该属性
1
2
3
4
5
<script>
$(".sidebar").click(function () {
$(".m-item").toggleClass("m-mobile-hide");
})
</script>

第二章:页面插件集成

2.1 Markdown插件

第一步:下载并集成到 项目中

下载markdown插件,地址:https://github.com/pandao/editor.md

解压,并复制到项目中

第二步:引入css和js

1
2
3
4
//css
<link rel="stylesheet" href="../static/lib/editor/css/editormd.min.css">
//js
<script src="../static/lib/editor/editormd.min.js"></script>

第三步:必要设置

1
2
3
4
5
<div class="field">
<div id="md-content" style="z-index: 1 !important;">
<textarea placeholder="博客内容" name="content" style="display: none"></textarea>
</div>
</div>

style=”z-index: 1 !important;” 主要是解决编辑器全屏显示问题

2.2 内容排版

https://github.com/sofish/typo.css

引入css

1
<link rel="stylesheet" href="../static/css/typo.css">

2.3 动画

https://github.com/animate-css/animate.css

引入css

1
<link rel="stylesheet" href="./static/css/animate.css">

引入动画属性

1
2
animated xxx  xxx即使需要的动画 如 fadeIn
<div class="m-container-small m-padding-tb-big animated fadeIn">

2.4 代码高亮

prism

引入css和Js

1
2
<link rel="stylesheet" href="./static/lib/prism/prism.css">
<script src="./static/lib/prism/prism.js"></script>
1
2
3
4
5
6
7
8
<pre>
<code class="language-css">
var a = 10;
.m-inline-block{
display: inline-block !important;
}
</code>
</pre>

2.4 目录生成

https://github.com/tscanlin/tocbot

tocbot使用方式

第一步添加css和Js,并引入

1
2
<link rel="stylesheet" href="./static/lib/tocbot/tocbot.css">
<script src="./static/lib/tocbot/tocbot.min.js"></script>

第二步:在指定位置弹出目录

1
2
3
4
5
$(".toc").popup({
popup:$(".toc-container.popup"),
on:"click",
position:"left center"
});

其实也可不弹出,直接显示目录,toc-container就是要生成的目录

1
2
3
4
<div class="ui toc-container flowing popup top left transition hidden" style="width: 250px !important;">
<!-- 生成的目录-->
<ol class="js-toc"></ol>
</div>

第三步:初始化

1
2
3
4
5
6
7
8
9
10
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',
// For headings inside relative or absolute positioned containers within content.
hasInnerContainers: true,
});
  • js-toc 生成目录的ol位置
  • js-toc-content 哪些地方需要生成目录,一般文章正文
  • headingSelector 哪些标签需要生成目录 一般都是h标签

注意:所有的h标签,必须有ID属性

2.5 平滑滚动

第一步:添加JS

1
<script src="//cdn.jsdelivr.net/npm/jquery.scrollto@2.1.2/jquery.scrollTo.min.js"></script>

第二步:按钮点击

1
2
3
$('#toTopBtn').click(function () {
$(window).scrollTo(0,500);
});

scrollTo参数说明:第一个参数0 表示滚动的位置,0表示滚动到最顶端,第二个参数500表示时间

2.6滚动监测

第一步:添加CSS和JS

1
<script src="./static/lib/waypoints/jquery.waypoints.min.js"></script>

第二步:添加滚动监测

1
2
3
4
5
6
7
8
9
10
11
12
//滚动检测
var waypoint = new Waypoint({
element: document.getElementById('waypoint'),
handler: function(direction) {
if (direction == 'down') {
$('#toolbar').show(500);
} else {
$('#toolbar').hide(500);
}
console.log('Scrolled to waypoint! ' + direction);
}
})

说明:这里的element就是我们要监测的滚动标签,然后判断滚动方向,如果是向下滚动,就显示我们右下角的工具条,如果向上滚动,就隐藏

第三章 Semantic UI

Semantic UI 基本上都是以ui开头

2.1 grid

网格布局,在semantic-ui中提供了16个网格,使用class="column",当然也可以通过数字来表示当前网格大小

案例一:4-8-4网格

1
2
3
4
5
<div class="ui grid">
<div class="ui four wide column" style="background-color: darkred"></div>
<div class="ui eight wide column" style="background-color: green"></div>
<div class="ui four wide column" style="background-color: blue"></div>
</div>

2.2 segment

片段

  • ui segment
  • ui segments
1
2
3
<div class="ui segment">
<p>Top</p>
</div>
1
2
3
4
5
6
7
8
<div class="ui segments">
<div class="ui segment">
<p>Top</p>
</div>
<div class="ui segment">
<p>Middle</p>
</div>
</div>

2.3 container

container:容器,使用container,两边会有边距

1
2
3
4
5
<div style="background-color: green">
<div class="ui inverted container" style="background-color: blue">
<p style="color: red">你好</p>
</div>
</div>

2.4 menu

菜单menu,每一个子项为item

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div class="ui inverted secondary stackable menu">
<div class="ui teal header item">Blog</div>
<div class="ui m-item item m-mobile-hide">首页</div>
<div class="ui m-item item m-mobile-hide">分类</div>
<div class="ui m-item item m-mobile-hide">标签</div>
<div class="ui m-item item m-mobile-hide">归档</div>

<div class="right m-item item m-mobile-hide">
<div class="ui icon inverted input">
<input type="text" placeholder="Search...">
<i class="search link icon"></i>
</div>
</div>
</div>

2.5 icon

图标库
Font Awesome 5.0.8

使用举例:

1
2
<i class="add user icon"></i>
<i class="phone volume icon"></i>

2.6 button

在Semantic-UI中定义了很多的按钮样式,可以通过class="ui button"来指定,也可以在class中指定颜色。

1
2
3
4
<button class="ui button">基础样式按钮</button>
<button class="ui red button">红色按钮</button>
<button class="ui red basic button">红色按钮</button>
<button class="ui red inverted button">红色反转按钮</button>

图标按钮

1
2
3
<button class="ui black button">
<i class="unlock green icon"></i>
</button>

图标按钮组

1
2
3
4
5
<div class="ui buttons">
<button class="ui button"><i class="save icon"></i></button>
<button class="ui button"><i class="edit icon"></i></button>
<button class="ui button"><i class="remove icon"></i></button>
</div>

垂直图标按钮

1
2
3
4
5
<div class="ui vertical buttons">
<button class="ui button"><i class="save icon"></i></button>
<button class="ui button"><i class="edit icon"></i></button>
<button class="ui button"><i class="remove icon"></i></button>
</div>

圆形/椭圆图标按钮

1
2
3
4
//圆形图标
<div class="ui circular icon button"><i class="settings icon"></i></div>
//椭圆图标
<div class="ui circular button"><i class="settings icon"></i></div>

按钮状态

  • 激活 active
  • 不可用 disabled
1
2
3
4
5
6
<div class="ui active button">
<i class="settings icon"></i>
</div>
<div class="ui disabled button">
<i class="settings icon"></i>
</div>

条件按钮

1
2
3
4
5
<div class="ui buttons">
<button class="ui green button">yes</button>
<i class="or"></i>
<button class="ui red button">no</button>
</div>

按钮大小

1
2
3
4
5
6
7
8
<button class="ui mini button">mini</button>
<button class="ui tiny button">tiny</button>
<button class="ui small button">small</button>
<button class="ui medium button">medium</button>
<button class="ui large button">large</button>
<button class="ui big button">big</button>
<button class="ui huge button">huge</button>
<button class="ui massive button">massive</button>

2.7 header

基础标题

1
2
3
4
5
<h1 class="ui header">一级标题</h1>
<h2 class="ui header">二级标题</h2>
<h3 class="ui header">三级标题</h3>
<h4 class="ui header">四级标题</h4>
<h5 class="ui header">五级标题</h5>

标题大小

1
2
3
4
<h3 class="ui tiny header">tiny</h3>
<h3 class="ui small header">small</h3>
<h3 class="ui large header">large</h3>
<h3 class="ui huge header">huge</h3>

2.8 image

边框图片 bordered

1
<img src="https://picsum.photos/id/1/200/200" alt="" class="ui bordered image">

圆角图片 rounded

1
<img src="https://picsum.photos/id/1/200/200" alt="" class="ui rounded image">

椭圆图片 circular

1
<img src="https://picsum.photos/id/1/200/200" alt="" class="ui circular image">

图片状态【激活,禁用】 active disabled

1
2
3
<p>图片状态【激活,禁用】</p>
<img src="https://picsum.photos/id/1/200/200" alt="" class="ui active image">
<img src="https://picsum.photos/id/1/200/200" alt="" class="ui disabled image">

图片大小 tiny,small…

1
2
<img src="https://picsum.photos/id/1/200/200" alt="" class="ui tiny image">
<img src="https://picsum.photos/id/1/200/200" alt="" class="ui small image">

图片浮动

注意:会有溢出问题,暂未解决

1
2
3
4
5
6
7
8
<p>图片浮动float</p>
<div class="ui segment">
<img src="https://picsum.photos/id/1/200/200" alt="" class="ui left floated image">
<p>
Semantic UI中文官方网站, 当前版本:Semantic UI 2.2.4... Semantic 集成了 React、Angular、Meteor 以及很多其他框架以帮助你组织 UI 层和你的应用逻辑层。
Semantic UI中文官方网站, 当前版本:Semantic UI 2.2.4... Semantic 集成了 React、Angular、Meteor 以及很多其他框架以帮助你组织 UI 层和你的应用逻辑层。
</p>
</div>

图片组

1
2
3
4
5
<div class="ui small images">
<img src="https://picsum.photos/id/1/200/200" alt="" class="ui image">
<img src="https://picsum.photos/id/1/200/200" alt="" class="ui image">
<img src="https://picsum.photos/id/1/200/200" alt="" class="ui image">
</div>

2.9 input

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<p>基础输入框</p>
<div class="ui input">
<input type="text" id="name" name="name" placeholder="请输入用户名">
</div>

<p>禁用输入框</p>
<div class="ui disabled input">
<input type="text" id="name2" name="name2" placeholder="请输入用户名">
</div>

<p>图标与输入框结合</p>
<div class="ui left icon loading input">
<input type="text" placeholder="加载中...">
<i class="search icon"></i>
</div>

<p>输入框与标签结合</p>
<div class="ui labeled input">
<div class="ui label">
http://
</div>
<input type="text" placeholder="请输入url...">
</div>

<p>输入框的颜色反转</p>
<div class="ui inverted labeled input">
<div class="ui label">
http://
</div>
<input type="text" placeholder="请输入url...">
</div>

2.10 分割线

1
2
3
4
5
6
7
8
<p>分割线</p>
<div class="ui divider"></div>

<p>水平分割线并加入文字</p>
<div class="ui horizontal divider">扫码关注我</div>

<p>竖线并加入or</p>
<div class="ui vertical divider">or</div>

2.11 表格

基础样式表格:celled

1
2
3
4
5
6
7
8
<p style="text-align: center">基础样式表格celled</p>
<div class="ui container">
<table class="ui celled table">
<tr><td>昵称</td><td>年龄</td></tr>
<tr><td>赵丽颖</td><td>20</td></tr>
<tr><td>杨幂</td><td>18</td></tr>
</table>
</div>

2.12 表单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<p>表单</p>
<div class="ui container">
<form action="#" method="post" class="ui form">
<div class="four wide field">
<label for="name">姓名</label>
<input type="text" name="name" id="name" placeholder="请输入你的姓名...">
</div>

<div class="four wide field">
<label for="age">年龄</label>
<input type="text" name="age" id="age" placeholder="请输入你的年龄...">
</div>

<div class="field">
<div class="ui checkbox">
<input type="checkbox">
<label>同意注册协议1</label>
</div>
</div>

<div class="inline field">
<div class="ui slider checkbox">
<input type="checkbox">
<label>同意注册协议1</label>
</div>
</div>

<div class="inline field">
<div class="ui toggle checkbox">
<input type="checkbox">
<label>同意注册协议1</label>
</div>
</div>

<button class="ui green button">注册</button>
<button class="ui red button">重置</button>
</form>
</div>
  • form 定义表格
  • Field 定义表格的每一行
  • four wide 定义输入框的宽度
  • 三种样式的复选框:默认样式,slider,toggle

单选框

1
2
3
4
5
6
7
8
9
10
11
12
13
<div class="inline fields">
<label for="sex">性别</label>
<div class="field">
<div class="ui ratio checkbox">
<input type="radio" name="sex" id="sex"><label>男</label>
</div>
</div>
<div class="field">
<div class="ui ratio checkbox">
<input type="radio" name="sex" id="sex"><label>女</label>
</div>
</div>
</div>

下拉列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/semantic-ui/2.2.10/semantic.min.css">
<title>下拉列表</title>

<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.10/semantic.min.js"></script>

<script>
$(function () {
$(".ui.dropdown").dropdown();
})
</script>
</head>
<body>
<div class="ui container">
<form action="#" class="ui form">
<div class="field">
<label>性别:</label>
<div class="ui selection dropdown">
<i class="dropdown icon"></i>
<div class="default text">性别</div>
<div class="menu">
<div class="item">男</div>
<div class="item">女</div>
</div>
</div>
</div>
</form>
</div>
</body>
</html>

2.13 文本域

第四章 框架搭建-实体类

4.1 实体类

实体类-博客

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* 博客实体类
*/
@Entity
@Table(name = "t_blog")
data class Blog(
@Id @GeneratedValue(strategy = GenerationType.AUTO)
val id:Long? = null,
val title:String,//标题
val content:String,//内容
val firstPicture:String,//首图
val flag:String,
val views:Int,//浏览次数
val appreciation:Boolean,//赞赏
val shareStatement:Boolean,//
val commentabled:Boolean,//是否开启评论
val published:Boolean,
val recommend:Boolean,//是否推荐
val createTime:Date,//创建时间
val updateTime:Date//更新时间
)

实体类-评论

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 评论
*/
@Entity
@Table(name = "t_comment")
class Comment(
@Id @GeneratedValue(strategy = GenerationType.AUTO)
val id:Long,
val nickname:String,
val email:String,
val content:String,
val avatar:String,
@Temporal(value = TemporalType.TIMESTAMP)
val createTime:Date
)

实体类-tag

1
2
3
4
5
6
7
8
9
10
11
/**
* 标签
*/

@Entity
@Table(name = "t_tag")
class Tag(
@Id @GeneratedValue(strategy = GenerationType.AUTO)
val id:Long,
val name:String
)

实体类-分类

1
2
3
4
5
6
7
8
9
10
11
/**
* 博客分类
*/
@Entity
@Table(name = "t_type")
data class Type(
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
val id:Long? = null,
val name:String
)

4.2 注解

常用注解如下:

注解

注意

时间需要使用@Temporal注解

1
2
@Temporal(value = TemporalType.TIMESTAMP)
val createTime:Date,//创建时间

实体类之间的对应关系:

​ 博客与分类:多对一的关系(多篇博客对应一个分类,一个分类对应多篇博客)

博客是多的一端

1
2
@ManyToOne
val type: Type,

在分类实体类中:

1
2
@OneToMany(mappedBy = "type")
val blogs:List<Blog>

关于mappedBy:https://www.cnblogs.com/powerwu/articles/3964970.html