这次我们来看一个完整的个人博客管理项目实战,基于 Spring Boot 3 和 Vue 3 实现。这个项目不是一个简单的 Demo,而是一个企业级实战项目,旨在帮助开发者从零到一构建一个功能完备、架构清晰的后台管理系统,并附带了完整的源码和笔记。对于正在学习全栈开发、准备面试或希望深入理解 Spring Boot 3 与 Vue 3 整合的开发者来说,这是一个非常值得动手实践的案例。
项目的核心价值在于“手把手”和“企业级”。它不仅仅提供了代码,更通过笔记和实战流程,拆解了从环境搭建、技术选型、前后端分离开发、接口联调到部署上线的完整链路。本文将带你快速了解这个项目的核心功能、技术栈、部署方式以及如何通过它来巩固你的技术栈,为进入大厂增加实战筹码。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 项目类型 | 个人博客后台管理系统(企业级实战项目) |
| 技术栈 | 后端:Spring Boot 3, Spring Security, JWT, MyBatis-Plus, MySQL 前端:Vue 3, TypeScript, Vite, Element Plus, Pinia |
| 核心功能 | 用户权限管理、文章CRUD、分类标签管理、评论审核、文件上传、数据统计仪表盘 |
| 部署方式 | 前后端分离部署,支持 Docker 容器化(需根据源码自行配置) |
| 学习产出 | 掌握前后端分离项目开发全流程、企业级代码规范、接口设计、权限控制方案 |
| 适合人群 | Java/全栈初学者进阶、应届生丰富简历、面试前项目深度复盘 |
2. 适用场景与使用边界
这个项目主要适用于以下几个场景:
- 学习与进阶:对于已经掌握 Spring Boot 和 Vue 基础语法的开发者,需要通过一个完整的项目来串联知识点,理解控制器、服务、数据访问层如何协作,以及前端路由、状态管理、组件化开发的实际应用。
- 简历项目:项目具备“个人博客后台管理”这一清晰的应用场景,且采用了主流的技术栈(Spring Boot 3 + Vue 3),可以作为简历上的一个亮点项目,在面试中展示自己的工程能力。
- 技术栈整合实践:项目涉及 JWT 无状态认证、Spring Security 权限控制、MyBatis-Plus 高效数据操作、Vue 3 组合式 API、Pinia 状态管理等实用技术,是学习这些技术整合的最佳实践。
- 代码规范参考:企业级项目通常意味着更清晰的分层架构、统一的异常处理、规范的接口返回格式和日志记录,本项目可作为学习良好编码风格的范本。
使用边界与注意:
- 非生产级:虽然标榜“企业级实战”,但作为学习项目,在安全性、高并发、异常恢复等方面可能与真实生产环境有差距,直接上线需进行充分测试和加固。
- 版权与用途:源码和笔记用于个人学习与研究。如需商用,请确保理解每一行代码,并自行承担由此产生的数据安全、版权合规等风险。
- 技术迭代:Spring Boot 和 Vue 生态更新较快,项目依赖的具体版本可能在未来需要升级适配。
3. 环境准备与前置条件
在开始克隆和运行项目之前,请确保你的开发环境满足以下要求。这是项目能否成功启动的第一步。
后端环境 (Spring Boot 3):
- JDK: 版本 17 或更高(Spring Boot 3 必须要求 JDK 17+)。推荐使用 OpenJDK 17。
- Maven: 版本 3.6.3 或更高,用于管理项目依赖和构建。
- MySQL: 版本 5.7 或 8.0。需要提前创建好数据库(如
blog_db)。 - IDE: IntelliJ IDEA(推荐)或 Eclipse with STS 插件。
前端环境 (Vue 3):
- Node.js: 版本 16.x 或更高(推荐 18.x LTS)。可在终端输入
node -v检查。 - 包管理器: npm 或 yarn。本项目通常使用 npm,可通过
npm -v检查。 - IDE: Visual Studio Code(推荐)或 WebStorm。
通用工具:
- Git: 用于克隆项目代码。
- Postman 或 Apifox: 用于测试后端 RESTful API。
- 浏览器: Chrome 或 Edge,用于前端开发和调试。
检查清单:
java -version确认输出 JDK 17+。mvn -v确认 Maven 安装成功。mysql -V确认 MySQL 服务已启动并可连接。node -v和npm -v确认 Node.js 环境就绪。
4. 项目结构与源码获取
一个清晰的项目结构是理解其架构的基础。典型的 Spring Boot 3 + Vue 3 前后端分离项目会分为两个独立的工程。
后端项目结构 (blog-backend):
src/main/java/com/example/blog ├── config/ # 配置类(安全、跨域、Swagger等) ├── controller/ # 控制层,接收请求,调用服务 ├── service/ # 业务逻辑层接口 ├── service/impl/ # 业务逻辑层实现 ├── mapper/ # MyBatis-Plus 的 Mapper 接口 ├── entity/ # 实体类,对应数据库表 ├── dto/ # 数据传输对象(请求/响应封装) ├── vo/ # 视图对象,用于前端展示 ├── utils/ # 工具类(JWT、加密、文件处理等) ├── filter/ # 过滤器(如认证过滤器) ├── aspect/ # 切面(如日志、事务) └── BlogApplication.java # Spring Boot 主启动类 resources/ ├── application.yml # 主配置文件(数据库、服务器端口等) └── mapper/ # MyBatis XML 映射文件(如使用)前端项目结构 (blog-frontend):
src/ ├── api/ # 封装所有后端 API 请求 ├── assets/ # 静态资源(图片、样式) ├── components/ # 可复用 Vue 组件 ├── router/ # Vue Router 路由配置 ├── store/ # Pinia 状态管理 ├── utils/ # 前端工具函数 ├── views/ # 页面视图组件 ├── App.vue # 根组件 └── main.ts # 应用入口文件获取源码:通常这类项目会托管在 Gitee 或 GitHub 上。你可以通过 Git 命令克隆(请将[项目地址]替换为实际地址)。
git clone [项目地址] cd blog-project克隆后,你会看到前后端分离的两个文件夹,或者一个包含子模块的父工程。
5. 后端启动与数据库配置
后端服务是整个应用的核心,必须先确保它正确运行。
步骤 1:导入项目并配置数据库
- 使用 IDEA 打开后端项目文件夹 (
blog-backend)。 - 找到
resources/application.yml(或application.properties) 文件。 - 修改数据库连接配置,包括 URL、用户名和密码。
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/blog_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: your_password- 在你的 MySQL 中,创建名为
blog_db的数据库(字符集建议utf8mb4)。 - 项目可能提供了 SQL 初始化脚本(通常位于
resources/sql目录下)。在 MySQL 中执行该脚本,创建表并初始化必要数据(如管理员账号)。
步骤 2:解决依赖与启动
- IDEA 会自动识别 Maven 项目并下载依赖(查看底部进度条)。如果网络问题导致下载慢,可配置国内镜像源。
- 依赖下载完毕后,找到主启动类
BlogApplication.java,右键点击Run ‘BlogApplication‘。 - 观察控制台日志,如果没有报错,并看到类似
Tomcat started on port(s): 8080的信息,说明后端启动成功。 - 打开浏览器,访问
http://localhost:8080/doc.html(如果集成了knife4j)或http://localhost:8080/swagger-ui.html,你应该能看到 API 文档界面,这证明后端接口服务已就绪。
关键点排查:
- 端口冲突:如果 8080 端口被占用,可以在
application.yml中修改server.port。 - 数据库连接失败:检查 MySQL 服务是否启动,用户名密码是否正确,数据库名是否匹配。
- 依赖下载失败:检查 Maven 配置,或尝试在项目根目录执行
mvn clean install -DskipTests。
6. 前端启动与跨域配置
前端项目负责用户界面,需要独立运行并与后端交互。
步骤 1:安装依赖
- 使用 VS Code 打开前端项目文件夹 (
blog-frontend)。 - 打开终端(Terminal),确保路径在前端项目根目录。
- 执行以下命令安装项目依赖(此过程可能需要一些时间):
npm install # 或使用淘宝镜像加速 # npm install --registry=https://registry.npmmirror.com步骤 2:配置后端 API 地址前端需要知道后端服务的地址来发送请求。通常这个配置在环境变量或axios的全局配置文件中。
- 找到配置文件,常见位置是
src/api/request.ts或.env.development文件。 - 在配置文件中,将后端 API 的基础地址指向你本地运行的后端服务(例如
http://localhost:8080)。
// 示例:在 request.ts 中配置 baseURL import axios from ‘axios‘; const service = axios.create({ baseURL: ‘http://localhost:8080‘, // 后端地址 timeout: 5000 });步骤 3:解决跨域问题(如果后端未配置)前后端分离开发最常见的联调问题就是跨域。如果后端已经通过@CrossOrigin注解或全局配置解决了跨域,此步可略过。如果访问接口出现跨域错误,可以在前端开发服务器配置代理。
- 在项目根目录找到或创建
vite.config.ts(Vite) 或vue.config.js(Vue CLI)。 - 添加代理配置:
// vite.config.ts 示例 import { defineConfig } from ‘vite‘; export default defineConfig({ server: { proxy: { ‘/api‘: { // 将所有以 /api 开头的请求转发到后端 target: ‘http://localhost:8080‘, changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, ‘‘) } } } });- 同时,需要将前端代码中请求的
baseURL改为相对路径/api。
步骤 4:启动前端开发服务器在终端执行启动命令:
npm run dev # 或 npm run serve控制台会输出本地访问地址,通常是http://localhost:5173或http://localhost:3000。用浏览器打开此地址,即可看到博客管理系统的登录界面。
7. 核心功能模块实战演练
项目启动后,我们通过操作主要功能模块来验证项目的完整性和学习其实现逻辑。
7.1 用户登录与权限验证
- 操作:打开前端登录页,使用初始化脚本中的管理员账号(如 admin/123456)登录。
- 验证点:
- 登录成功后,页面跳转到后台首页或仪表盘。
- 浏览器
Application->Storage->Local Storage中应能看到存储的token(JWT令牌)。 - 后续的 API 请求,在
Headers中应自动携带Authorization: Bearer <token>。
- 技术关联:此流程涉及 Spring Security 的认证流程、JWT 的生成与校验、前端路由守卫(拦截未登录访问)和
axios请求拦截器(自动添加 token)。
7.2 文章管理(CRUD)
这是博客系统的核心。
- 创建文章:在文章管理页面点击“新建”,填写标题、分类、标签、内容(富文本编辑器),点击发布。
- 后端观察:在 IDEA 控制台查看 SQL 日志,观察
INSERT语句是否执行。检查数据库article表是否新增记录。 - 查询文章:返回文章列表页,查看刚发布的文章是否显示。尝试使用分页、按分类/标签筛选、按标题搜索等功能。
- 更新与删除:对已有文章进行编辑更新,或执行删除操作(注意是否有逻辑删除标志
deleted字段)。 - 技术关联:MyBatis-Plus 的
ServiceImpl快速 CRUD、Lambda 查询、分页插件(Page)、逻辑删除配置、富文本编辑器(如wangEditor或Quill)的集成与内容存储。
7.3 分类与标签管理
- 操作:在分类/标签管理模块,尝试创建、编辑、删除分类和标签。
- 验证点:创建文章时,下拉选择框中应能出现新创建的分类和标签。这涉及到前端下拉框数据的动态获取与后端接口的联动。
- 技术关联:多对多关系(文章-标签)在数据库中的关联表设计,以及在业务层和前端展示时的处理逻辑。
7.4 文件上传功能
- 操作:在文章编辑器的图片上传或独立的文件上传组件中,选择一张本地图片上传。
- 验证点:
- 上传成功后,前端应显示图片预览或返回可访问的图片 URL。
- 在服务器指定目录(如
uploads/)下应能找到上传的文件。 - 通过返回的 URL 能在浏览器中直接访问该图片。
- 技术关联:Spring Boot 处理
MultipartFile、配置文件上传大小限制、自定义文件存储路径、提供静态资源访问(通过WebMvcConfigurer配置资源映射),以及前端使用FormData进行文件上传。
7.5 数据统计仪表盘
- 操作:登录后进入首页或仪表盘页面。
- 验证点:页面应展示关键数据,如文章总数、分类数、标签数、近期访问趋势(图表)等。
- 技术关联:后端聚合查询(使用
GROUP BY或 MyBatis-Plus 的聚合方法)、数据接口封装、前端图表库(如ECharts或AntV)的集成与数据绑定。
8. 接口 API 设计与调用分析
理解项目的接口设计是深入学习的重点。通过 API 文档(如 Swagger)可以清晰地看到所有端点。
典型 RESTful 接口示例:
POST /api/auth/login- 用户登录GET /api/articles- 分页查询文章列表GET /api/articles/{id}- 获取文章详情POST /api/articles- 创建文章(需要认证)PUT /api/articles/{id}- 更新文章(需要认证)DELETE /api/articles/{id}- 删除文章(需要认证)GET /api/categories- 获取所有分类POST /api/upload- 文件上传
使用 Postman 测试接口:
- 首先调用登录接口,获取
token。 - 在后续需要认证的接口请求头中,添加
Authorization: Bearer <your_token>。 - 测试文章创建接口,发送 JSON 格式的请求体。
{ “title“: “测试文章标题“, “content“: “这里是文章内容...“, “categoryId“: 1, “tagIds“: [1, 2] }- 观察返回的 HTTP 状态码(成功应为 200)和响应体(通常包含
code、msg、data的标准格式)。
接口设计亮点学习:
- 统一响应体:所有接口返回格式统一,便于前端处理。
- 全局异常处理:使用
@ControllerAdvice捕获并处理各类异常,返回友好的错误信息。 - 参数校验:使用
@Validated注解和 JSR-303 校验规则(如@NotBlank)对入参进行验证。
9. 常见问题与排查方法
在运行项目过程中,你可能会遇到以下问题,这里提供排查思路。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
前端npm install失败 | 网络问题、Node.js 版本不兼容、依赖冲突 | 查看终端报错信息,通常是某个包下载失败或版本解析错误 | 1. 使用npm cache clean --force清缓存后重试。2. 切换 npm 镜像源: npm config set registry https://registry.npmmirror.com。3. 删除 node_modules和package-lock.json,重新npm install。 |
| 后端启动时报数据库连接错误 | MySQL 服务未启动、配置错误、驱动类找不到 | 检查application.yml中的数据库连接字符串、用户名密码;检查 MySQL 服务状态;查看依赖中是否有mysql-connector-j | 1. 启动 MySQL 服务。 2. 核对配置文件,确保数据库名已创建。 3. 检查 Maven 依赖,确保数据库驱动包已引入。 |
| 前端访问后端接口 404 | 后端服务未启动、接口路径错误、跨域问题 | 1. 确认后端控制台无报错且已启动。 2. 直接在浏览器访问后端接口完整路径(如 http://localhost:8080/api/articles)。3. 查看浏览器开发者工具 Network 面板,看请求是否发出,响应状态码。 | 1. 重启后端服务。 2. 核对前端请求的 URL 是否与后端 @RequestMapping路径匹配。3. 按第6章节配置跨域。 |
| 登录成功但后续请求 401/403 | Token 失效、未携带 Token、Token 格式错误、权限不足 | 1. 检查前端请求头是否携带Authorization: Bearer <token>。2. 检查后端 Token 校验逻辑和过期时间设置。 3. 查看接口是否需要特定角色权限。 | 1. 确保登录后正确存储和发送 Token。 2. 检查 Spring Security 配置的权限规则。 3. 重新登录获取新 Token。 |
| 文件上传失败或无法访问 | 上传目录不存在、权限不足、静态资源未映射 | 1. 查看后端日志,是否有文件保存的 IO 异常。 2. 检查配置的文件存储路径是否存在。 3. 尝试通过完整服务器路径访问上传的文件。 | 1. 在服务器创建上传目录。 2. 检查 WebMvcConfig中静态资源映射的配置是否正确。3. 确认文件上传大小限制配置。 |
| 页面样式错乱或 JS 错误 | 前端依赖未正确安装、组件引入错误、浏览器缓存 | 查看浏览器控制台 (Console) 报错信息。 | 1. 重新执行npm install。2. 根据控制台错误信息修复代码或引入方式。 3. 尝试浏览器无痕模式或清除缓存。 |
10. 项目扩展与进阶学习建议
完成基础功能的运行和调试后,你可以尝试以下方向进行深度学习和项目改造,使其真正成为你的作品。
- 引入 Redis 缓存:将热点数据(如网站配置、首页文章列表)缓存到 Redis 中,提升访问速度。学习 Spring Cache 与 Redis 的集成。
- 实现搜索功能:集成 Elasticsearch,为文章内容提供全文检索能力,比数据库
LIKE查询更高效。 - 增加评论与邮件通知:完善评论模块,当用户评论被回复时,发送邮件通知。学习 Spring Boot 邮件发送和异步任务(
@Async)。 - 接入第三方登录:实现 GitHub、Gitee 等第三方 OAuth2 登录,学习 Spring Security OAuth2 Client 的配置。
- 容器化部署:为前后端分别编写
Dockerfile,使用docker-compose.yml编排 MySQL、Redis、后端、前端服务,实现一键部署。这是企业级发布的必备技能。 - 编写单元测试:为后端的 Service 层和 Controller 层编写 JUnit 单元测试,保证代码质量。学习
MockMvc测试控制器。 - 前端性能优化:分析前端打包体积,使用路由懒加载、组件异步加载、CDN 引入第三方库等方式优化首屏加载速度。
- 完善权限系统:将现有的角色权限细化到按钮级别(即基于资源的权限控制 RBAC),实现更精细化的管理。
这个 Spring Boot 3 + Vue 3 的个人博客管理项目,提供了一个绝佳的实战沙盒。它的价值不在于代码本身,而在于通过它,你能系统地走完一个现代 Web 应用从开发到部署的完整生命周期,并触及企业开发中的诸多关键技术和设计思想。建议你在通读源码和笔记的基础上,亲手敲一遍关键代码,并尝试至少一项扩展功能。当你能够清晰地解释每一层代码的职责,并成功对其进行改造时,这份经历将成为你技术面试中强有力的谈资。