1. 项目背景与核心价值
在内容创作日益普及的今天,越来越多的创作者希望拥有一个完全自主的内容发布平台。第三方平台虽然使用便捷,但往往存在审核严格、功能受限、数据归属不明确等问题。这套基于SpringBoot+Vue的博客系统正是为了解决这些痛点而生。
我去年指导过三个类似的毕业设计项目,发现学生们最常遇到的三个问题是:权限控制混乱、富文本编辑器集成困难、前后端数据交互效率低下。这个项目在架构设计上针对性地解决了这些问题:
- 采用RBAC权限模型,通过JWT实现细粒度控制
- 集成WangEditor作为富文本解决方案
- 使用MyBatis-Plus提高数据库操作效率
- 通过Axios拦截器优化前后端通信
2. 技术栈选型解析
2.1 后端技术组合
SpringBoot 2.7 + MyBatis-Plus + Shiro + JWT构成了后端核心框架。这个组合经过了多个项目的验证:
- SpringBoot:简化配置,内置Tomcat,快速启动
- MyBatis-Plus:提供强大的CRUD接口和Wrapper条件构造器
- Shiro:负责认证和授权,比Spring Security更轻量
- JWT:无状态认证,适合RESTful API
数据库选择MySQL 8.0,主要考虑因素:
- 开源免费,社区支持好
- JSON类型支持完善,适合存储富文本内容
- 窗口函数等高级特性有利于数据分析
2.2 前端技术方案
Vue 3 + Element Plus + Axios构成前端技术栈:
javascript复制// 典型API请求示例
export function getArticleList(params) {
return request({
url: '/api/article/list',
method: 'get',
params
})
}
这种组合的优势在于:
- Vue3的Composition API逻辑复用更灵活
- Element Plus提供丰富的UI组件
- Axios拦截器统一处理错误和权限验证
3. 核心功能实现细节
3.1 权限控制系统
采用RBAC(基于角色的访问控制)模型,数据库设计如下:
sql复制CREATE TABLE `sys_role` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(64) NOT NULL COMMENT '角色名称',
`code` varchar(32) NOT NULL COMMENT '角色编码',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
权限验证流程:
- 用户登录获取JWT token
- 后续请求携带token在Header中
- Shiro过滤器验证token有效性
- 查询用户角色和权限信息
- 注解式权限检查(如@RequiresRoles)
3.2 富文本编辑器集成
对比了多个编辑器后选择WangEditor,关键配置:
java复制@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/editor/**")
.addResourceLocations("classpath:/static/editor/");
}
}
上传图片处理要点:
- 限制文件类型为image/*
- 大小不超过5MB
- 存储路径使用日期分目录
- 生成缩略图提高加载速度
4. 数据库设计与优化
4.1 核心表结构
文章表设计考虑到了SEO和分类需求:
sql复制CREATE TABLE `blog_article` (
`id` bigint NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL COMMENT '标题',
`summary` varchar(255) DEFAULT NULL COMMENT '摘要',
`content` longtext COMMENT '内容',
`cover_url` varchar(255) DEFAULT NULL COMMENT '封面图',
`category_id` bigint DEFAULT NULL COMMENT '分类ID',
`tags` varchar(255) DEFAULT NULL COMMENT '标签,逗号分隔',
`view_count` int DEFAULT '0' COMMENT '浏览数',
`status` tinyint DEFAULT '1' COMMENT '状态',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_category` (`category_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4.2 查询优化实践
文章列表查询使用延迟加载策略:
xml复制<select id="selectArticleList" resultMap="ArticleResult">
SELECT
a.id, a.title, a.summary, a.cover_url,
a.view_count, a.create_time,
c.name as category_name
FROM blog_article a
LEFT JOIN blog_category c ON a.category_id = c.id
WHERE a.status = 1
<if test="categoryId != null">
AND a.category_id = #{categoryId}
</if>
ORDER BY a.create_time DESC
</select>
性能优化措施:
- 避免SELECT *
- 合理使用索引
- 大文本字段单独查询
- 分页使用limit优化
5. 部署与运维方案
5.1 开发环境搭建
推荐使用Docker快速构建环境:
dockerfile复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: blog
ports:
- "3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
redis:
image: redis:6
ports:
- "6379:6379"
5.2 生产环境部署
采用Nginx反向代理方案:
code复制server {
listen 80;
server_name yourdomain.com;
location / {
root /var/www/blog/dist;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
安全建议:
- 启用HTTPS
- 定期数据库备份
- 日志轮转配置
- 使用PM2管理Node进程
6. 常见问题解决方案
6.1 跨域问题处理
SpringBoot后端配置:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.maxAge(3600);
}
}
6.2 文件上传大小限制
需要在application.yml中配置:
yaml复制spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 20MB
6.3 性能监控方案
集成Spring Boot Actuator:
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
配置访问端点:
yaml复制management:
endpoints:
web:
exposure:
include: health,info,metrics
7. 项目扩展方向
7.1 内容推荐功能
基于用户行为的简单推荐算法:
java复制public List<Article> recommendArticles(Long userId) {
// 1. 获取用户浏览历史
List<Long> viewedIds = historyService.getViewedArticleIds(userId);
// 2. 获取用户收藏记录
List<Long> favoriteIds = favoriteService.getFavoriteIds(userId);
// 3. 合并兴趣标签
Set<String> tags = new HashSet<>();
articleService.getTagsByIds(viewedIds).forEach(tags::add);
articleService.getTagsByIds(favoriteIds).forEach(tags::add);
// 4. 查询相关文章
return articleService.listByTags(new ArrayList<>(tags));
}
7.2 数据统计模块
使用ECharts实现可视化:
javascript复制// 获取统计数据
fetch('/api/statistics/article').then(res => res.json()).then(data => {
const chart = echarts.init(document.getElementById('chart'));
chart.setOption({
title: { text: '文章发布趋势' },
tooltip: {},
xAxis: { data: data.months },
yAxis: {},
series: [{ name: '数量', type: 'bar', data: data.counts }]
});
});
这个博客系统项目从技术选型到功能实现都体现了现代Web开发的典型模式,既适合作为毕业设计展示全栈能力,也具有实际应用价值。我在实际开发中发现,良好的异常处理和日志记录能大幅降低维护成本,建议在开发早期就建立完善的错误处理机制。