当前位置:首页 > 技术 > 正文内容

基于SpringBoot与Vue的前后端分离博客系统设计与实现

访客 技术 2026年5月26日 3

项目概述

本系统是一个采用前后端分离架构的个人博客平台,后端基于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增强了前端表现力与兼容性,整套方案适合用于毕业设计或中小型项目实践。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。