这次我们来看一个基于 Spring Boot 和 Vue3 的博客管理项目。对于 Java 开发者,尤其是正在准备毕业设计或丰富简历的同学来说,一个功能完整、技术栈主流的个人博客系统是极具价值的实战项目。它不仅能帮你串联起前后端分离开发的核心流程,更能作为你技术能力的直接展示。
这个项目的核心是让你快速拥有一个属于自己的、可部署的博客网站。它采用了当前企业级开发中非常流行的技术组合:后端使用 Spring Boot 提供 RESTful API,前端使用 Vue3 构建现代化的用户界面。文章将带你从零开始,完成环境搭建、项目启动、功能测试到部署上线的完整流程。你会了解到如何配置数据库、如何启动前后端服务、如何进行基本的文章管理操作,以及如何将这个项目转化为你简历上的一个亮点。
无论你是想深入学习 Spring Boot 和 Vue3 的整合,还是急需一个高质量的毕设项目,这篇文章提供的“手把手”指南都能让你在一小时内看到成果,并理解其背后的技术脉络。
1. 核心能力速览
在深入代码之前,我们先快速了解这个博客项目的核心特性和技术栈,判断它是否适合你的需求。
| 能力项 | 说明 |
|---|---|
| 项目类型 | 前后端分离的个人博客管理系统 |
| 技术栈 | 后端:Spring Boot, MyBatis/MyBatis-Plus, MySQL 前端:Vue3, Element Plus, Axios |
| 主要功能 | 用户登录、文章分类管理、文章发布/编辑/删除、文章列表展示、标签管理、评论功能(通常具备) |
| 部署方式 | 后端可打包为 Jar 独立运行;前端打包后由 Nginx 等静态服务器托管 |
| 启动门槛 | 需本地安装 JDK 8+、Node.js 16+、MySQL 5.7+ 或 Docker 环境 |
| 是否提供API | 是,标准的 RESTful API,便于二次开发或对接其他客户端 |
| 是否支持一键启动 | 通常提供详细的启动脚本或 Docker Compose 配置,但需先完成环境配置 |
| 适合场景 | Java/Vue 初学者练手、毕业设计、个人博客搭建、全栈项目经验积累 |
2. 适用场景与使用边界
这个博客项目主要面向以下几类开发者:
- Java 后端与 Vue 前端学习者:希望通过一个完整项目理解前后端如何通过 API 交互。
- 计算机相关专业毕业生:需要一个结构清晰、技术栈不过时、文档齐全的毕业设计项目。
- 求职者:需要能体现自身 Spring Boot 和 Vue3 开发能力的实战项目填充简历。
- 技术博客爱好者:希望拥有一个代码可控、可自定义功能的个人博客平台。
它能解决的问题:
- 技术整合实践:将 Spring Boot、MyBatis、Vue3、Vue Router、Pinia/Vuex、Element Plus 等流行技术栈串联应用。
- CRUD业务理解:通过文章、分类、标签、用户等实体的增删改查,深入理解后台管理系统的典型业务逻辑。
- 前后端协作流程:掌握从接口设计、后端实现、前端调用到页面渲染的完整开发链路。
- 项目部署经验:获得将 Spring Boot 应用和 Vue 前端打包并部署到服务器的基础经验。
使用边界与注意事项:
- 非生产级:作为学习或毕设项目,其在安全性(如更细粒度的权限控制、SQL注入深度防护)、高并发、数据备份等方面的考虑可能不如成熟开源项目(如 WordPress、Halo)。
- 版权与内容合规:部署后发布的内容需遵守相关法律法规,尊重原创,避免侵权。
- 自定义需求:项目提供了基础框架,但深度的UI美化、附加功能(如SEO优化、第三方登录、图床集成)需要自行开发。
3. 环境准备与前置条件
开始之前,请确保你的开发环境满足以下要求。这是项目能成功运行的基础。
1. 后端开发环境:
- JDK:版本 1.8 或更高(推荐 JDK 8, 11, 17)。在终端输入
java -version验证。 - Maven:用于管理项目依赖和构建。版本 3.6+。输入
mvn -v验证。 - IDE:IntelliJ IDEA(推荐)或 Eclipse。
- MySQL:版本 5.7 或 8.0。你需要准备一个空的数据库,例如
my_blog。
2. 前端开发环境:
- Node.js:版本 16.x 或更高(推荐 18.x LTS)。这是运行 Vue 和包管理工具 npm/pnpm/yarn 的前提。输入
node -v和npm -v验证。 - 包管理器:npm(随 Node.js 安装)或更快的 pnpm/yarn。本文以 npm 为例。
- IDE/编辑器:Visual Studio Code(推荐)或 WebStorm。
3. 可选工具:
- Git:用于克隆项目源码。
- Docker & Docker Compose:如果你希望通过容器化方式一键启动所有服务(MySQL + 后端)。
- Postman 或 Apifox:用于测试后端 API 接口。
- 浏览器开发者工具:用于前端调试。
4. 资源准备:
- 从提供的源码地址获取项目。通常项目结构包含
backend(Spring Boot)和frontend(Vue3)两个独立目录。 - 准备好你的 MySQL 连接信息:主机(通常是
localhost)、端口(通常是3306)、数据库名、用户名和密码。
4. 安装部署与启动方式
我们将分步启动后端和前端服务。请严格按照顺序操作。
4.1 后端服务启动
步骤一:导入项目并配置数据库
- 使用 IDEA 打开
backend目录。 - 找到配置文件,通常是
src/main/resources/application.yml或application.properties。 - 修改数据库连接配置,填入你在环境准备阶段创建的数据库信息。
# application.yml 示例配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/my_blog?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root # 你的数据库用户名 password: yourpassword # 你的数据库密码步骤二:初始化数据库表项目通常会提供数据库初始化脚本(sql文件),你需要在 MySQL 中执行它来创建表结构和初始数据。如果项目使用了 Flyway 或 MyBatis-Plus 的自动建表功能,则可能在首次启动时自动完成。
步骤三:启动 Spring Boot 应用在 IDEA 中找到主启动类(通常带有@SpringBootApplication注解,类名如BlogApplication),右键运行Run。 或者使用 Maven 命令启动:
cd backend mvn spring-boot:run看到控制台输出类似Tomcat started on port(s): 8080的信息,说明后端服务启动成功。默认端口通常是8080。
4.2 前端服务启动
步骤一:安装依赖在frontend目录下打开终端,执行以下命令安装项目所需的所有 npm 包。
cd frontend npm install # 如果网络较慢,可以使用淘宝镜像:npm install --registry=https://registry.npmmirror.com这个过程会创建node_modules文件夹,下载所有依赖。
步骤二:配置后端 API 地址前端需要知道后端服务的地址以发起请求。找到前端项目的配置文件,通常是src/config/index.js、.env.development或vite.config.js中关于代理的配置。 你需要将代理目标指向正在运行的后端地址(例如http://localhost:8080)。
// vite.config.js 示例 (Vite项目) import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' export default defineConfig({ plugins: [vue()], server: { proxy: { '/api': { // 假设你的后端接口都以 /api 开头 target: 'http://localhost:8080', changeOrigin: true, // rewrite: (path) => path.replace(/^\/api/, '') // 根据实际情况决定是否需要重写路径 } } } })步骤三:启动开发服务器在frontend目录下执行:
npm run dev # 或 npm run serve # 取决于项目是用 Vite 还是 Vue CLI 创建的控制台会输出本地访问地址,通常是http://localhost:5173(Vite) 或http://localhost:8081。用浏览器打开此地址。
5. 功能测试与效果验证
服务启动后,我们通过实际操作来验证核心功能是否正常。这是判断项目是否成功运行的关键。
5.1 用户登录测试
- 目的:验证前后端连通性及用户认证模块。
- 操作:访问前端首页,找到登录入口。输入默认的管理员账号密码(常见如 admin/123456,具体查看项目文档或数据库初始脚本)。
- 预期:点击登录后,页面跳转到后台管理首页或文章列表页,浏览器开发者工具 Network 标签中能看到登录接口(如
/api/login)返回成功的状态码(如 200)和 token 信息。 - 成功标志:登录后页面显示用户信息或出现登出按钮,并且可以访问需要权限的页面(如文章管理)。
5.2 文章管理功能测试
这是博客的核心。
- 新增文章
- 操作:在管理后台找到“写文章”或“新增”按钮,进入文章编辑页面。填写标题、选择分类、添加标签、编写内容(支持Markdown编辑器是加分项),点击“发布”或“保存”。
- 预期:页面提示“发布成功”,并在文章列表页能看到刚创建的文章。
- 验证:同时检查数据库
article表,应有一条对应的新记录。
- 编辑文章
- 操作:在文章列表页,找到刚创建的文章,点击“编辑”。
- 预期:跳转到编辑页面,内容与发布时一致。修改部分内容后保存。
- 验证:刷新列表或查看详情,确认修改已生效。
- 删除文章
- 操作:点击文章列表的“删除”按钮,并确认。
- 预期:该文章从列表消失,页面有删除成功提示。
- 验证:数据库
article表中对应记录的deleted字段可能被标记为1(逻辑删除)或记录被物理删除。
- 文章列表与详情查看
- 操作:退出后台,访问博客前台首页(可能是一个不同的端口或路由,如
/index)。 - 预期:首页能正常展示文章列表(标题、摘要、发布时间等)。点击任意文章标题,能进入文章详情页,完整显示内容和格式。
- 操作:退出后台,访问博客前台首页(可能是一个不同的端口或路由,如
5.3 分类与标签管理测试
- 操作:在后台管理页面,尝试新增、编辑、删除文章分类和标签。
- 预期:操作后,在文章编辑页面能正确关联到新创建的分类和标签。
- 验证:发布一篇带有新分类和标签的文章,然后在前台查看,确认分类和标签显示正确。
5.4 接口直接测试(可选但推荐)
使用 Postman 或 Apifox 直接调用后端 API,绕过前端界面,更纯粹地测试后端逻辑。
- 获取文章列表:
GET http://localhost:8080/api/articles - 发布新文章:
POST http://localhost:8080/api/article,在 Body 中传入 JSON 格式的文章数据。 - 验证响应:检查返回的状态码、数据格式是否符合预期。
6. 接口 API 与批量任务
理解项目的 API 设计是进行二次开发和集成的基础。虽然本项目主要面向 Web 界面,但其后端本质是一个 API 服务器。
6.1 核心 API 概览
一个典型的博客系统会提供以下 RESTful 接口:
| 功能模块 | 请求方法 | 接口路径示例 | 说明 |
|---|---|---|---|
| 用户认证 | POST | /api/login | 用户登录,返回 token |
| POST | /api/logout | 用户登出 | |
| 文章管理 | GET | /api/articles | 分页获取文章列表 |
| GET | /api/article/{id} | 根据ID获取文章详情 | |
| POST | /api/article | 新增文章 | |
| PUT | /api/article | 修改文章 | |
| DELETE | /api/article/{id} | 删除文章 | |
| 分类管理 | GET | /api/categories | 获取所有分类 |
| POST | /api/category | 新增分类 | |
| DELETE | /api/category/{id} | 删除分类 | |
| 标签管理 | GET | /api/tags | 获取所有标签 |
| POST | /api/tag | 新增标签 |
6.2 API 调用示例
以下是一个使用 Pythonrequests库调用登录和发布文章接口的示例。你可以用任何你熟悉的语言进行测试。
import requests import json # 1. 登录获取 token login_url = "http://localhost:8080/api/login" login_data = { "username": "admin", "password": "123456" } login_resp = requests.post(login_url, json=login_data) if login_resp.status_code == 200: token = login_resp.json().get('data').get('token') # 根据实际返回结构调整 print(f"登录成功,token: {token}") else: print("登录失败") exit() # 2. 使用 token 发布文章 headers = { 'Authorization': f'Bearer {token}', # 或可能是 'X-Token: {token}',根据项目实际 'Content-Type': 'application/json' } article_url = "http://localhost:8080/api/article" article_data = { "title": "通过API发布的测试文章", "content": "这是通过Python脚本调用API发布的文章内容。", "categoryId": 1, "tagIds": [1, 2], "status": 1 # 1表示发布,0可能表示草稿 } article_resp = requests.post(article_url, headers=headers, json=article_data) print(f"发布文章状态码: {article_resp.status_code}") print(f"响应内容: {article_resp.text}")6.3 关于“批量任务”
对于博客系统,典型的“批量任务”可能包括:
- 批量导入文章:编写脚本,读取本地 Markdown 文件或从其他平台导出的数据,循环调用
POST /api/article接口。 - 批量更新分类/标签:遍历文章列表,调用更新接口。
- 数据备份与导出:定期调用查询接口,将数据保存为 JSON 或 SQL 文件。
这些都需要你根据业务需求,基于现有的 API 进行脚本开发。项目本身通常不提供图形化的批量操作界面。
7. 资源占用与性能观察
作为一个 Spring Boot + Vue 的轻量级应用,在开发和学习阶段,其资源占用通常不是问题,但了解如何观察和优化是有益的。
1. 后端服务资源占用:
- 内存:一个刚启动的 Spring Boot 博客应用,JVM 堆内存占用通常在 200MB - 500MB 之间,具体取决于依赖和启动参数。你可以使用
jconsole、jvisualvm(JDK 自带)或arthas等工具监控。 - CPU:在无并发请求时,CPU 占用率极低。在发布文章、处理 Markdown 渲染时会有短暂峰值。
- 数据库连接:观察 MySQL 的连接数,确保连接池(如 HikariCP)配置合理,没有泄漏。
2. 前端开发服务器资源占用:
- 内存:Node.js 开发服务器(如 Vite)内存占用通常在 100MB - 300MB。
- 热更新性能:Vite 的热更新速度远快于传统的 Webpack。如果感觉慢,检查是否安装了过多大型依赖或配置了低效的插件。
3. 生产环境部署考虑:
- 后端:使用
java -jar启动时,可通过-Xms和-Xmx参数设置 JVM 堆内存初始大小和最大大小。例如-Xms256m -Xmx512m。 - 前端:运行
npm run build后,生成的dist文件夹是纯静态文件,由 Nginx 托管,几乎不消耗服务器动态资源。 - 数据库:随着文章数量增加,需关注
article表的大小,并为经常查询的字段(如category_id,status,create_time)建立索引以优化查询速度。
4. 简单监控命令:
- 在 Linux/Mac 上,可以使用
top或htop查看 Java 和 Node 进程的 CPU 和内存占用。 - 在 Windows 上,可以通过任务管理器查看。
8. 常见问题与排查方法
在部署和运行过程中,你可能会遇到以下问题。这里提供通用的排查思路。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 后端启动失败,端口冲突 | 8080 端口被其他程序占用 | 控制台报错Port 8080 was already in use | 1. 终止占用端口的进程。 2. 在 application.yml中修改server.port为其他端口,如8081。 |
| 前端启动失败,依赖安装报错 | Node.js 版本不兼容或网络问题 | 查看npm install的错误信息 | 1. 确保 Node.js 版本符合要求。 2. 使用 npm cache clean --force清除缓存后重试。3. 切换 npm 镜像源: npm config set registry https://registry.npmmirror.com |
| 前端页面能打开,但列表为空或登录失败 | 前端代理配置错误,无法连接到后端 API | 1. 打开浏览器开发者工具,查看 Network 标签中 API 请求的状态码是否为 404 或 500。 2. 检查请求的 URL 是否正确指向后端服务。 | 1. 确认后端服务是否在运行 (localhost:8080)。2. 核对前端项目中的代理配置(如 vite.config.js),确保 target 地址正确。 |
| 登录成功但无法进行增删改操作 | 1. 前端未正确携带 token。 2. 后端接口权限验证失败。 | 1. 查看请求头中是否有Authorization或X-Token。2. 查看后端控制台是否有权限相关的日志。 | 1. 检查前端请求拦截器,确保登录后 token 被正确存储和设置到后续请求头中。 2. 检查后端 Spring Security 或拦截器的配置。 |
| 数据库连接失败 | 1. 数据库服务未启动。 2. 配置文件中用户名、密码、数据库名错误。 3. 数据库驱动版本不匹配。 | 后端启动时控制台会打印详细的数据库连接错误信息。 | 1. 启动 MySQL 服务。 2. 仔细检查 application.yml中的数据库连接配置。3. 确认 pom.xml中的 MySQL 驱动版本与安装的 MySQL 版本兼容。 |
| 前端打包后,访问页面空白或资源404 | 1. 静态资源路径错误。 2. Nginx 配置未指向正确的 dist目录。 | 查看浏览器控制台报错,确认是哪个 JS/CSS 文件加载失败。 | 1. 在vite.config.js中配置正确的base路径(如果部署在子路径下)。2. 检查 Nginx 配置, root或alias指向前端dist目录的绝对路径。 |
9. 最佳实践与使用建议
为了让这个项目更好地为你服务,无论是用于学习、毕设还是作为个人博客的起点,遵循以下建议可以事半功倍。
- 代码阅读与理解优先:在急于添加功能之前,先花时间通读一遍前后端的主要代码结构。理解控制器(Controller)、服务(Service)、数据访问层(Mapper/DAO)的分层,以及前端的路由、组件和状态管理。
- 版本控制:立即将项目初始化为你的 Git 仓库(如果源码本身不是 Git 仓库)。在修改任何核心代码前进行提交,便于回溯。
- 数据库管理:为你的开发、测试环境使用不同的数据库或至少不同的表前缀。考虑使用 Flyway 或 Liquibase 来管理数据库版本变更,而不是手动执行 SQL 脚本。
- 配置外部化:不要将数据库密码等敏感信息硬编码在
application.yml中。使用 Spring Boot 的@ConfigurationProperties或环境变量来管理配置。对于前端,不同环境的 API 地址可以通过.env.development和.env.production文件区分。 - 安全性增强(针对毕设或生产):
- 密码加密:确保用户密码在数据库中是加密存储的(如使用 BCrypt)。
- API 防护:除了登录接口,其他增删改查接口都应进行身份认证和权限校验。
- 输入验证:在后端对用户输入(如文章标题、内容)进行有效性验证和过滤,防止 XSS 攻击。
- SQL 注入:坚持使用 MyBatis 的参数绑定(
#{}),避免字符串拼接。
- 功能扩展方向:
- SEO 优化:为文章详情页生成静态的、对搜索引擎友好的 URL(如
/article/123.html)。 - 评论系统:集成第三方评论服务(如 Gitalk, Waline)或自行实现。
- 全文搜索:集成 Elasticsearch 或使用 MySQL 全文索引,实现文章内容搜索。
- 文件上传:实现将本地图片上传到服务器或第三方图床(如 OSS、七牛云),并在文章中引用。
- 后台仪表盘:增加数据统计面板,显示文章数、访问量等。
- SEO 优化:为文章详情页生成静态的、对搜索引擎友好的 URL(如
- 部署实践:
- 学习使用 Docker 将后端应用和 MySQL 容器化,编写
Dockerfile和docker-compose.yml。 - 学习使用 GitHub Actions 或 Jenkins 设置简单的 CI/CD 流程,实现代码推送后自动构建和部署。
- 购买一个最基础的云服务器(如 1核2G),尝试将你的博客部署到公网,体验完整的运维流程。
- 学习使用 Docker 将后端应用和 MySQL 容器化,编写
10. 总结与下一步
这个 Spring Boot + Vue3 的博客项目为你提供了一个绝佳的、贴近企业开发流程的实战沙盒。它的价值不在于功能有多么惊艳,而在于提供了一个清晰、完整、可运行的全栈应用骨架。通过完成环境搭建、功能测试和问题排查,你已经走完了一个小型软件项目的核心生命周期。
最值得尝试的点:不是简单地运行起来,而是尝试修改它。比如,给文章增加一个“浏览量”字段,并在前台展示;或者增加一个“友情链接”管理模块。这个过程会强迫你去阅读前后端代码,理解数据如何从数据库流动到前端页面,这是提升工程能力的关键。
最先应该验证的功能:确保“登录 -> 发布文章 -> 前台查看”这条主链路完全畅通。这是博客系统的核心价值所在。
最容易踩的坑:环境配置(尤其是 Node.js 和 Java 版本)、前后端联调时的跨域或代理问题、数据库连接配置。按照本文的步骤和排查清单,大部分问题都能解决。
下一步可以做什么:
- 代码重构:尝试用更优雅的方式实现某个功能,比如用 MyBatis-Plus 的 Service 层封装替换手写的通用 Mapper 方法。
- 技术栈升级:将 Vue3 的选项式 API 改为组合式 API;尝试用 Pinia 替换 Vuex 进行状态管理。
- 项目文档化:为你修改后的项目编写清晰的 README.md,说明项目特点、部署步骤和配置方法。这既是良好的习惯,也是面试时的加分项。
- 接入云服务:尝试将图片存储改为阿里云 OSS,或接入第三方登录(如 GitHub OAuth)。
把这个项目吃透,你收获的不仅仅是一个可以运行的博客,更是一套应对未来更复杂项目的思维方式和实践能力。建议收藏本文,在实践过程中遇到具体问题时,再回来对照相关章节进行排查。