前言
本篇文章主要通过解读开源项目OneBlog的如何搭建、技术栈的介绍及优点与不足,来加深对技术理解,后期为自己搭建个人博客项目积累经验。
简介
OneBlog 一个简洁美观、功能强大并且自适应的Java博客。使用springboot开发,前端使用Bootstrap。支持移动端自适应,配有完备的前台和后台管理功能。
技术栈
- Springboot 2.0.8
- Apache Shiro 1.2.2
- Logback
- Redis
- Lombok
- Websocket
- MySQL、Mybatis、Mapper、Pagehelper
- Freemarker
- Bootstrap 3.3.0
- wangEditor
- jQuery 1.11.1、jQuery Lazyload 1.9.7、fancybox、iCheck
- 阿里云OSS
- kaptcha
- Qiniu
- webMagic
- ...
功能简介
- 多种编辑器:支持wangEditor和Markdown两种富文本编辑器,可以自行选择
- 自动申请友情链接:在线申请友情链接,无需站长手动配置,只需申请方添加完站长的连接后自行申请即可
- 百度推送:支持百度推送功能,加速百度搜索引擎收录博文
- 评论系统:自研的评论系统,支持显示用户地址、浏览器和os信息,后台可审核评论、开启匿名评论、回复和邮件通知评论
- 权限管理:后台配备完善的权限管理
- SEO:自带robots、sitemap等seo模板,实现自动生成robots和sitemap
- 实时通讯:管理员可向在线的用户发送实时消息(需用户授权 - 基于websocket实现,具体参考DBlog建站之Websocket的使用)
- 系统配置支持快速配置:可通过后台手动修改诸如域名信息、SEO优化、赞赏码、七牛云以及更新维护通知等
- 多种文件存储:集成七牛云、阿里云OSS,实现文件云存储,同时支持本地文件存储
- 文件搬运工:集成blog-hunter实现“文章搬运工”功能,支持一键同步imooc、csdn、iteye或者cnblogs上的文章,可抓取列表和单个文章
- 第三方授权登录:集成JustAuth实现第三方授权登录
使用方法
1.使用IDE导入本项目
2.新建数据库 CREATE DATABASE dblog;
3.导入数据库docs/db/dblog.sql
4.初始化数据库docs/db/init_data.sql
5.修改配置文件
(1)数据库链接属性(在[blog-core]/resources/config/application-center-{env}.yml配置文件中搜索datasource或定位到L.5)
(2)redis配置(在[blog-core]/resources/config/application-center-{env}.yml配置文件中搜索redis或定位到L.14)
以上两个必备的配置项修改完成后就能启动项目了。关于其他配置项,请参考后台“系统配置”页面
6.运行项目(三种方式,任选其一)
(1)项目根目录下执行mvn -X clean package -Dmaven.test.skip=true -Ptest编译打包(注:-Ptest中的test为环境标识),然后cd到blog-web目录下执行java -jar target/blog-web.jar
(2)在blog-web项目根目录下执行mvn spring-boot:run(注,如果报依赖错误,可在相关的依赖模块先执行install操作)
(3)直接运行BlogWebApplication.java
7.浏览器访问http://127.0.0.1:8443
8.blog-admin项目的启动方式与blog-web类似,请参考上面的使用说明
项目结构
模块 | 释义 | 备注 |
---|---|---|
blog-core | 核心业务类模块,提供基本的数据操作、工具处理等 | 该模块只是作为核心依赖包存在 |
blog-admin | 后台管理模块 | 该模块作为单独项目打包部署 |
blog-web | 前台模块 | 该模块作为单独项目打包部署 |
blog-file | 文件存储功能模块 | 支持local、七牛云和阿里云OSS |
爬虫相关代码模块 | 已使用blog-hunter插件替代 |
项目功能
模块分析
好了,有了以上说明后,相信大家很容易就能把项目运行起来,接下来,我们就分功能模块去分析。
在项目中,有些比较重要的用户操作我们需要记录下来,特别是涉及到后台的管理员操作记录。
记录内容一般包括下面---
- 操作用户
- 操作ip
- 操作内容
- 操作连接,方法参数
对于不涉及主要业务的边缘服务,我们可以通过AOP来完成,项目中自定义了一个注解 bussinessLog
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface BussinessLog {
/**
* 业务的名称
*/
String value() default "";
/**
* 平台,默认为后台管理
*/
PlatformEnum platform() default PlatformEnum.ADMIN;
/**
* 是否将当前日志记录到数据库中
*/
boolean save() default true;
}
一般来说,每篇文章都会有阅读数量,很多人做的都是每点击一次就数量加一,这个明显有刷阅读的bug。一般来说,我们可以通过ip,用户id来限定单个用户是否重复阅读。
在这个博客项目中,作者也是使用了切面编程,已文章详情页方法作为切入点,记录阅读的ip,不过可惜的是用户并没有做任何防止刷阅读的校验,我们具体来看下代码。