# zyk
用spring boot开发的web博客系统
# 概述
- 首先要感谢几位大神,该项目的想法来源自[tale](https://github.com/otale/tale)、[MyBlog](https://github.com/JayTange/My-Blog)、[Jantent](https://github.com/JayTange/Jantent),本项目的想法。
- 做了一些改造,增加了一些功能和一些代码的重构,并且更换了博客主题。
- 关于项目,对于开发的练手项目,能够工程化,严谨一些。
- 关于文档,本文主要中从项目需求,项目设计的方式来阐述.
- **如何从零开始**,使用springboot开发项目。
- 记录一些在开发过程中遇到的一些问题,总结开发技巧
**接下来,会以需求和设计方式来阐述**
# 效果图
- 首页展示
![alt](http://www.janti.cn/upload/2018/05/q2v7ug8ml6isgp93lhij8pvqlt.png)
- 文章编辑
![alt](http://www.janti.cn/upload/2018/05/pj08ddivuehtto8vnna7ot1rf3.png)
- 文章管理
![alt](http://www.janti.cn/upload/2018/05/2roqtej4umhclo0rta76cs8eed.png)
# 项目需求
## 项目背景
对于刚学习springboot的同学,最好的就是拿一个项目练练手。在编码过程中遇到的问题并解决,这都是宝贵的经验。
用springboot开发的博客系统,简单而且实用,适合做练手项目。
## 功能需求
### 界面需求
#### 主页
- 博客汇总,以列表加图片的形式展示
- 能够以分类的方式查看文章
- 能够以时间列表的方式归档文章
- 个人介绍,github地址
- 搜索框,能够搜索文章
#### 后台管理
- 管理主页,记录最新文章,最新留言,最近日志等
- 最近日志记录登录IP,地址,操作等
- 记录一天的访问量
- 发布文章
- 使用markdown编辑器,支持插入代码,插入图片等功能
- 能够给文章添加缩略图。
- 可将文章存为草稿或者发布
- 文章可选择分类和标签,自定义url
- 文章可控制是否允许评论
- 文章管理
- 以列表形式展示文章信息
- 在可选操作中增加删除,预览,编辑功能
- 支持分页显示
- 增加搜索功能,可根据文章名文章信息
- 分类管理
- 可以新增、删除、修改分类
- 文件管理
- 支持文件上传
- 支持删除已上传的文件
- 友情联机
- 支持增加友情链接
- 支持删除友情链接
- 系统设置
- 支持修改密码
- 支持备份数据库
- 支持黑名单配置
### 非界面需求
- 日志记录,记录来访IP名单
- 每天定时备份数据库
### 安装部署需求
- 可以使用docker方式部署,也可支持-jar方式
- 使用springboot自带方式打包
## 非功能性需求
### 性能需求
- 首页响应的时间不超过1秒钟
- 文章页响应时间不超过1秒钟
# 项目设计
## 总体设计
- 本项目用到的技术和框架
- 项目构建: maven
- web框架:spring boot
- 数据库ORM:mybatis
- 数据库连接池:Druid
- 分页插件:PageHelper
- 数据库:mysql
- 缓存NOSQL:redis
- 前段模板:thymeleaf
- 文章展示:使用commonmark,将markdown转成html页面
- 本项目的关键点
- 采用springboot开发,数据库使用连接池加orm框架的模式,对于系统的关键业务使用redis缓存,加快响应速度
- 整体系统采用门户网站+后台管理的方式搭建,门户主要展示博客内容,后台管理主要用于编辑文章,上传附件,控制黑名单登录等。
- 环境
工具 | 名称 |
------- | -------|
开发工具 | IDEA
语言 | JDK1.8, JS, HTML
数据库 | mysql5.6
缓存NOSQL | redis
项目构建|Maven
运行环境|阿里云Centos7
## 结构设计
![alt](http://www.janti.cn/upload/2018/05/ungedgq714gpoqi707016alr7g.png)
熟悉spring开发的同学,相信对此结构图也并不陌生。平时的开发过程中,结构设计是重要的缓解,特别是协作开发的时候,明细的分包,模块化,可减少在git提交时的冲突。
## 业务设计
本模块主要介绍一些关键的业务流程。
- 发布文章流程:
![alt](http://www.janti.cn/upload/2018/05/36qmnl6sa6h3irsjo03o7arf1e.png)
- **修改文章的流程大致上和发布是相似的,这里不再赘述了**
- 登录流程
![alt](http://www.janti.cn/upload/2018/05/ptrqrhl9kuhj9p29kejv5i8tj8.png)
- 文件上传
- 在写文章的时候,通常会使用到图片,可以引用一些网络上的图片,更好的是本系统支持上传文件和图片
- 将文件区别为图片和其他,图片支持预览模式
- 文件路径设计成绝对路径,在web系统中可直接引用
- 文件按月份归类,文件名以uuid的重新命名存储
- 其他文件支持下载
- **文件上传流程图**
![alt](http://www.janti.cn/upload/2018/05/6biht8rofqivnp3jm1dv5h1he9.png)
- 首页展示
- 首页也文章列表+图片的形式展示内容,默认最大显示12篇文章,包括发布时间和分类
- 上部展示菜单栏,支持搜索,归档页等功能
- 右侧显示菜单栏,展示个人github地址,个人信息,标签云等
- 使用redis缓存首页的html页面,加速访问。
## 打包、部署和运行
- 本项目采用springboot的maven插件进行打包,打成jar形式
- 部署方式:使用**nohub java -jar xxx.jar &**的方式,启动项目
## 数据设计
用户表:t_users
名称 | 类型 | 长度 | 主键 | 非空 | 描述
------- | ------- | ------- | ------- | ------- | -------
uid| int | 10| true | true |主键,自增
username | varchar | 32 |false | false | 用户名
password | varchar | 64 |false | false | 密码
email| varchar | 200 |false | false | 邮件地址
creted | int | 10 |false | false | 创建时间
用户表主要管理后台管理用户。
文章表:t_contents
名称 | 类型 | 长度 | 主键 | 非空 | 描述
------- | ------- | ------- | ------- | ------- | -------
cid| int | 10| true | true |主键,自增
title| varchar | 200 |false | false | 文章标题
slug | varchar | 200 |false | false | url地址
creted | int | 10 |false | false | 创建时间
modified| int | 10 |false | false | 修改时间
content | text |无限制| false | false| 文章内容
author_id| int | 10 |false | false | 作者ID
type| varchar| 16 |false | false | 文章类型
status | varchar | 16 |false | false | 文章状态
categories| varchar| 200|false | false | 分类
thumbImg| varchar| 512|false | false | 缩略图地址
hits| int | 10 |false | false | 文章点击量
comments_num|int|10 |false | false |评论数量
allow_comment|int| 1 |false | false |允许评论
主要管理文章内容,外键为cid
标签表:t_metas
名称 | 类型 | 长度 | 主键 | 非空 | 描述
------- | ------- | ------- | ------- | ------- | -------
mid| int | 10| true | true |主键,自增
name | varchar | 200 |false | false | 名称
slug| varchar | 200 |false | false | 说明
type| varchar | 200 |false | false | 类型
description|varchar| 200|false|false|描述
sort|int| 10|false|false|排序
parent|int| 10|false|false|父标签
管理标签信息,外键为mid
文章标签关系表:t_relationships
名称 | 类型 | 长度 | 主键 | 非空 | 描述
------- | ------- | ------- | ------- | ------- | -------
cid| int | 10| false| false |组合主键,用户ID
uid | int| 10 |false| false |组合主键,标签ID
记录文章和分类的关系,多对多表
## 性能与可靠性
### 性能设计
- 将文章内容写入redis中,加快访问速度
### 可靠性设计
- 后台管理,可以系统日志,查看系统运行状态
- 定时发送邮件,发送服务端的可用内存,cpu,最新日志,硬盘情况进行监控
- 对于恶意的IP,支持黑名单设置,禁止访问
# 开发流程
## 数据库的curd
- 首先,编写sql语句,创建数据库。
- 本项目的crud操作采用mybatis的逆向功能,对于特殊操作,需要自己手写sql语句
- springboot如何使用mybatis,以及mybatis的