1. 项目概述
这个基于Java Spring Boot的博客系统是我最近完成的一个全栈项目,采用了前后端分离架构。后端使用Spring Boot+MyBatisPlus构建,前端则采用Vue.js框架。系统从零开始搭建,历时两个月完成,目前已经稳定运行了半年多时间。
作为一个完整的博客平台,它实现了以下核心功能:
- 用户注册、登录和权限管理
- 文章发布、编辑和分类管理
- 富文本编辑器和多图上传
- 评论互动系统
- 数据统计和分析
提示:系统在设计时特别注重安全性,所有用户密码都经过BCrypt加密存储,并实现了完善的权限控制机制。
2. 技术架构解析
2.1 后端技术栈
后端采用Spring Boot 2.7作为基础框架,主要依赖包括:
- Spring Security:负责认证和授权
- MyBatis-Plus:简化数据库操作
- Quartz:实现定时任务调度
- Lombok:减少样板代码
- Swagger:API文档生成
数据库使用MySQL 8.0,考虑到博客系统的特点,我们做了以下优化:
- 文章表采用垂直分表设计,将内容与元数据分离
- 为常用查询字段添加了合适的索引
- 使用连接池管理数据库连接
java复制// 示例:MyBatis-Plus的实体类定义
@Data
@TableName("article")
public class Article {
@TableId(type = IdType.AUTO)
private Long id;
private String title;
private String summary;
private Long categoryId;
@TableField(exist = false)
private List<Tag> tags;
// 其他字段...
}
2.2 前端技术栈
前端采用Vue 3组合式API开发,主要技术组件包括:
- Element Plus:UI组件库
- Axios:HTTP客户端
- Vue Router:路由管理
- Pinia:状态管理
- Markdown-it:Markdown解析
前端架构特点:
- 采用模块化设计,组件按功能划分
- 实现响应式布局,适配不同设备
- 使用拦截器统一处理API请求和响应
- 按需加载优化首屏性能
3. 核心功能实现
3.1 用户认证系统
认证模块采用JWT(JSON Web Token)方案,关键实现点包括:
- 自定义
AuthorizationInterceptor拦截器校验Token - Token有效期为1小时,支持自动续期
- 密码加密使用BCrypt算法
- 实现基于角色的访问控制(RBAC)
java复制// Token生成逻辑
public String generateToken(Long userId, String username, String role) {
String token = UUID.randomUUID().toString().replace("-", "");
Date expireTime = Date.from(LocalDateTime.now()
.plusHours(1)
.atZone(ZoneId.systemDefault())
.toInstant());
// 保存或更新Token记录
Token tokenEntity = tokenService.getByUserId(userId);
if(tokenEntity == null) {
tokenEntity = new Token();
tokenEntity.setUserId(userId);
tokenEntity.setToken(token);
tokenEntity.setExpireTime(expireTime);
tokenService.save(tokenEntity);
} else {
tokenEntity.setToken(token);
tokenEntity.setExpireTime(expireTime);
tokenService.updateById(tokenEntity);
}
return token;
}
3.2 文章管理系统
文章管理是博客的核心功能,主要特点:
- 支持Markdown和富文本两种编辑模式
- 实现分类和标签的多级管理
- 文章状态控制(草稿、发布、定时发布)
- 图片上传使用阿里云OSS存储
数据库设计关键点:
sql复制CREATE TABLE `article` (
`id` bigint NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL,
`content` longtext NOT NULL,
`summary` varchar(255) DEFAULT NULL,
`cover_image` varchar(255) DEFAULT NULL,
`status` tinyint NOT NULL DEFAULT '0' COMMENT '0-草稿 1-已发布',
`publish_time` datetime DEFAULT NULL,
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_status_publish` (`status`,`publish_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4. 系统测试与优化
4.1 功能测试
我们设计了完整的测试用例,覆盖所有核心功能模块。以下是部分测试用例示例:
| 测试场景 | 测试步骤 | 预期结果 | 实际结果 |
|---|---|---|---|
| 用户登录 | 1. 输入正确用户名和密码 2. 点击登录 |
登录成功,跳转到首页 | 符合预期 |
| 文章发布 | 1. 填写完整文章信息 2. 点击发布 |
文章显示在文章列表 | 符合预期 |
| 评论功能 | 1. 未登录状态下尝试评论 2. 登录后提交评论 |
1. 提示需要登录 2. 评论成功显示 |
符合预期 |
4.2 性能优化
针对博客系统的特点,我们做了以下性能优化:
- 使用Redis缓存热门文章和分类数据
- 实现静态资源CDN加速
- 数据库查询优化:
- 避免N+1查询问题
- 合理使用索引
- 大数据量表采用分页查询
- 前端资源压缩和懒加载
注意:在实现缓存时要注意缓存一致性问题,我们采用"先更新数据库,再删除缓存"的策略。
5. 部署与运维
5.1 生产环境部署
系统采用Docker容器化部署,主要组件包括:
- Nginx:反向代理和静态资源服务
- Spring Boot应用:运行为独立Jar包
- MySQL数据库
- Redis缓存
部署流程:
- 使用Maven打包前端和后端代码
- 构建Docker镜像
- 使用docker-compose编排服务
- 配置Nginx负载均衡和HTTPS
5.2 监控与日志
为了确保系统稳定运行,我们实现了:
- Spring Boot Actuator健康检查
- Prometheus + Grafana监控
- ELK日志收集系统
- 异常告警机制(邮件通知)
6. 开发经验分享
在开发过程中积累了一些有价值的经验:
-
MyBatis-Plus使用技巧:
- 合理使用QueryWrapper构建动态查询
- 注意实体类与数据库字段的映射关系
- 分页查询要配置拦截器
-
Spring Security配置要点:
- 正确配置密码加密方式
- 注意CSRF防护的取舍
- 合理设计权限表达式
-
前后端分离开发注意事项:
- 统一API响应格式
- 处理好跨域问题
- 保持接口文档的及时更新
-
性能调优经验:
- 使用@Transactional注意事务范围
- 避免在循环中执行数据库操作
- 合理使用二级缓存
这个项目从技术选型到最终上线,整个过程让我对全栈开发有了更深入的理解。特别是在系统安全和性能优化方面,积累了不少实战经验。如果你在实现类似系统时遇到问题,欢迎交流讨论。