基于SpringBoot与Vue的前后端分离博客系统设计与实现
项目概述
本系统是一个采用前后端分离架构的个人博客平台,后端基于SpringBoot框架整合MyBatis-Plus实现数据持久化操作,前端使用Vue.js构建用户界面,并通过Uniapp支持多端适配。系统具备用户认证、文章管理、评论交互等核心功能,整体结构清晰,易于扩展和维护。
技术选型说明
后端:SpringBoot + MyBatis-Plus
SpringBoot作为主流Java开发框架,提供了自动配置机制和内嵌Web服务器(如Tomcat),显著简化了项目初始化流程。结合MyBatis-Plus,实现了无需编写SQL即可完成常见CRUD操作的能力,同时支持分页查询、条件构造器等高级特性,极大提升了DAO层开发效率。
前端:Vue3 + Uniapp
前端采用Vue3的组合式API进行组件开发,利用其响应式系统实现视图自动更新。通过Uniapp框架将同一套代码编译为H5、小程序及App客户端,实现"一次开发,多端运行"的目标,降低跨平台开发成本。
核心功能模块设计
- 用户登录鉴权:基于Token的身份验证机制,避免频繁数据库查询,提升接口访问性能。
- 文章发布与管理:支持富文本编辑、分类标签设置、封面图上传等功能。
- 评论互动系统:实现层级评论展示、点赞功能及敏感词过滤逻辑。
- 权限控制:不同角色(如管理员、普通用户)拥有差异化操作权限。
安全认证实现
系统通过拦截器(Interceptor)对请求进行统一权限校验。所有需要认证的接口必须在Header中携带有效Token,否则返回401未授权状态码。对于公开接口(如文章列表、详情页),可通过注解忽略权限检查。
@Component
public class AuthInterceptor implements HandlerInterceptor {
public static final String HEADER_TOKEN = "Authorization";
@Autowired
private TokenManager tokenManager;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 预检请求放行
if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
response.setStatus(HttpStatus.NO_CONTENT.value());
return false;
}
// 忽略无需认证的方法
if (handler instanceof HandlerMethod) {
IgnoreAuth ignore = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
if (ignore != null) return true;
}
String token = request.getHeader(HEADER_TOKEN);
LoginUser user = tokenManager.parse(token);
if (user == null) {
ResponseUtil.fail(response, 401, "请先登录");
return false;
}
// 将用户信息存入请求上下文
RequestContextHolder.set(user);
return true;
}
}
Token管理服务
Token采用随机字符串生成,有效期设定为1小时。每次成功登录或刷新时更新过期时间,防止重复生成。相关记录存储于auth_token表中,便于集中管理与强制下线。
@Service
public class TokenManager {
public LoginUser parse(String token) {
if (StrUtil.isBlank(token)) return null;
AuthToken record = tokenMapper.findByToken(token);
if (record == null || record.getExpiredAt().before(new Date())) {
return null;
}
return new LoginUser(record.getUserId(), record.getUsername(), record.getRole());
}
public String issue(Long uid, String username, String role) {
String token = SecureUtil.randomString(32);
Date expire = DateUtil.offsetHour(new Date(), 1);
AuthToken record = tokenMapper.findByUserIdAndRole(uid, role);
if (record != null) {
record.setToken(token);
record.setExpiredAt(expire);
tokenMapper.update(record);
} else {
tokenMapper.insert(new AuthToken(uid, username, role, token, expire));
}
return token;
}
}
数据库设计示例
-- 用户凭证表
CREATE TABLE `auth_token` (
`id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`user_id` BIGINT NOT NULL COMMENT '用户ID',
`username` VARCHAR(64) NOT NULL,
`role` VARCHAR(32) NOT NULL COMMENT '角色类型',
`token` VARCHAR(128) NOT NULL UNIQUE,
`expired_at` DATETIME NOT NULL,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_token (token),
INDEX idx_user_role (user_id, role)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='登录令牌表';
-- 示例数据
INSERT INTO `auth_token` (`user_id`, `username`, `role`, `token`, `expired_at`) VALUES
(1, 'admin', 'ADMIN', 'x7m9k2p5q8r1t4w6v3n7b9c2z5a8s1d3', '2025-04-05 10:30:00'),
(2, 'user01', 'USER', 'f4h7j1k9l2n5m8q6p3o9i2u7y4t6r8e1', '2025-04-05 11:15:00');
测试策略
系统采用黑盒测试方法,围绕业务场景设计用例:
- 登录模块:验证正确凭据可登录,错误密码/验证码提示明确,空字段有前端校验。
- 用户管理:新增用户时检测用户名唯一性;修改信息后页面即时反映变更;删除前弹窗确认。
| 测试项 | 输入数据 | 预期结果 | 实际结果 |
|---|---|---|---|
| 正常登录 | 账号: admin, 密码: 123456, 正确验证码 | 跳转至后台首页 | 通过 |
| 密码错误 | 账号: admin, 密码: 654321 | 提示"密码不正确" | 通过 |
| 添加重复用户 | 已存在的用户名 | 提示"该用户名已被占用" | 通过 |
总结
本系统通过现代化技术栈构建了一个稳定、高效且易扩展的博客平台。SpringBoot简化了后端开发复杂度,Vue+Uniapp增强了前端表现力与兼容性,整套方案适合用于毕业设计或中小型项目实践。