ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

SpringBoot+Vue3前后端分离个人博客系统:从架构设计到部署上线

SpringBoot+Vue3前后端分离个人博客系统:从架构设计到部署上线 我见过不少这样的候选人简历上写着熟练使用 SpringBoot、Vue3也看过大量框架教程但被问到“你自己完整做过一个前后端分离的项目吗”时往往只能回答“写过接口 demo”或“看过视频做过一个后台模板”。个人博客管理系统恰好是这类尴尬场景的破局点。它不是电商、不是那种大而全的管理系统样板间也比“增删改查 Demo”多了一层真实业务逻辑。基于 SpringBoot 和 Vue3 来做前后端分离的个人博客系统已经成为很多毕业生、转行者和初学者的首选实战项目。原因很简单它覆盖了从数据库设计、接口开发、前端页面、权限管理到部署上线的完整链路同时又控制在一个合理的学习周期内。这篇文章不打算给一份“照抄就能跑”的源码而是想把这些项目的设计思路、常见偏差、工程细节和面试表达方式讲清楚。你会发现真正难的不是把代码敲出来而是理解这个项目为什么这么搭以及以后怎么把它讲成自己的项目。1. 先想清楚个人博客管理系统到底在练什么1.1 表面是增删改查内里是完整业务闭环很多初学者看到“个人博客管理系统”第一反应是不就是文章表的增删改查吗确实核心数据模型就是博客文章可能还有分类、标签、评论。但如果只按“增删改查”来写项目做完后你会发现仍然不懂前后端分离只是把字段从表单搬到数据库再用表格展示出来。真正的业务闭环至少包含这样几个环节用户身份管理员登录、注册、角色权限区分。内容生产写文章、编辑草稿、发布、下架。内容组织分类、标签、归档。内容消费浏览文章、文章详情、分页列表、搜索。互动评论的查看和删除或者前端展示。管理后台仪表盘、菜单控制、内容管理界面。这已经不是单一模型能解决的问题了。它强迫你做多表关联、状态流转、权限控制、界面分层。这些才是这个项目的真正训练点。1.2 前后端分离的核心价值不是“分开写”而是“连起来”前后端分离很容易被误解成“前端写一套页面后端写一套接口”。但在真实开发里难点在于两者如何对接数据格式怎么定、错误怎么传、登录状态怎么维护、分页参数怎么传、时间格式如何统一、跨域如何处理。这些内容在纯前端项目或纯接口项目里根本不会遇到只有把两者放在一个完整项目里才会暴露出来。个人博客管理系统正好是这种“小但全”的场景。它的接口数量不多但足以让你把 GET、POST、PUT、DELETE 全走一遍它的页面也不复杂但列表、表单、详情、弹窗、状态切换都能覆盖。如果认真做它可以在两个月内让一个新手真正建立“全栈思维”。1.3 为什么这个项目适合拿来当毕设或简历项目我评价一个项目是否适合写进简历通常看三个标准故事是否完整、技术栈是否主流、问题有没有边界。个人博客管理系统在这三点上有天然优势。故事完整从访客到后台用户能理解这个系统在做什么。技术栈主流SpringBoot Vue3 是目前非常常见的前后端分离组合招聘端接受度高。问题有边界它不会像电商那样要求高并发、分布式但又足够展示一个开发者对业务系统的整体把控。不过这也意味着如果只做一个“普通后台管理页面”然后套上几个表格并不能真的体现出能力。你需要在这套项目里主动增加一些设计感比如文章分类的动态统计、标签云、访问日志、文档导出这些都是可以拿出来聊的增量点。2. 技术选型SpringBoot Vue3 的组合为什么能成为主流2.1 SpringBoot 负责的不只是接口SpringBoot 之所以被广泛使用不只是因为它能写 RestController 返回 JSON。它把 Spring 家族里繁琐的 XML 配置自动化和场景化让开发人员可以更关注业务代码。在个人博客管理系统里SpringBoot 的典型职责包括组织业务代码分层Controller、Service、Mapper/Repository。处理请求参数校验和异常。配置数据库连接和事务。集成 JWT 或 Session 做登录态管理。集成上传文件、发送邮件、定时任务等功能。这些能力并不是项目一开始就要全部用上。但你会发现越往后做SpringBoot 的自动配置和生态集成帮了大忙。尤其是当你需要引入 MyBatis-Plus、Redis、MinIO 或者邮件服务时SpringBoot 的 Starter 机制让集成成本变得很低。2.2 Vue3 相比 Vue2 到底改了什么如果一个项目只是把模板里的 Vue2 改成 Vue3然后沿用 options API 写法那其实没有发挥出 Vue3 的核心价值。Vue3 带来的主要变化是 Composition API、更好的响应式系统基于 Proxy和更灵活的逻辑复用方式。在个人博客项目里Composition API 最有用的场景是把一篇博客文章的状态管理、数据加载、提交逻辑抽到一个组合式函数里而不是全部写在 data 和 methods 中。比如一个 useArticle 函数管理文章列表、加载状态、分页参数、删除操作多个页面可以复用。同时Vue3 的生态也在逐渐变好。Element Plus、Vite、Pinia 这些工具已经成熟用这一套做博客后台管理界面开发体验比 Vue2 时代更顺滑。2.3 框架之外的零件从数据存储到文件处理“SpringBoot Vue3”是骨架但博客系统还需要一些零件数据库MySQL 是最普遍的选择。表可以包括 user、article、category、tag、comment 等。ORM常见选择是 MyBatis-Plus生成 CRUD 很简单但分页插件和条件构造器需要理解原理。权限JWTJSON Web Token适合无状态接口Session 更适合传统 Web。两者各有适用场景教育项目里 JWT 更常见。文件存储博客通常需要上传封面图简单方案是存本地磁盘并配置静态资源映射更工程化的方案是使用 MinIO 或 OSS。选择本地存储作为毕设是完全合理的但要在文档里讲清楚限制。前端构建Vite 是 Vue3 项目的主流构建工具比 Webpack 更快。这些零件不是越新越好而是要能融进整个项目。如果只是为了“用新”而引入 Redis、Elasticsearch反而会模糊项目重点。一个个人博客系统MySQL 加文件存储已经完全够用。3. 项目复杂度拆解从“管理员登录”到“博客发布”需要哪些模块3.1 最小可用模块清单我建议把个人博客管理系统分成两个端来看前台展示端博客首页、文章详情页、分类/标签检索页、关于我、友情链接等。后台管理端登录页、仪表盘、文章管理、分类管理、标签管理、评论管理、个人资料设置。每个端口的页面数量不需要太多但每个模块都要完成完整流程。比如后台文章管理至少要有列表、新增、编辑、删除、发布/下架、搜索、分页。这七个操作对应到前后端就足够牵引出一整套接口和页面的设计。如果一开始就贪多加入用户注册、第三方登录、点赞收藏、评论回复、搜索引擎优化项目周期会被拉得很长而且很多逻辑互相纠缠反而收尾困难。先做最小闭环再逐步扩展是比较稳妥的思路。3.2 数据库设计先做核心表再想扩展个人博客系统的核心表一般有用户表id、用户名、密码哈希、昵称、头像、角色。文章表id、标题、摘要、内容、封面图、状态、分类id、发布时间、编辑时间。分类表id、名称、排序。标签表id、名称。文章标签关联表article_id、tag_id。评论表id、文章id、用户名、邮箱、内容、审核状态、创建时间。这里最容易踩坑的是文章内容。很多人会把内容直接存在 MySQL 的 text 或 longtext 字段里这在小规模项目里没问题但要注意富文本编辑器生成的 HTML 可能很大需要在前端做字符数限制或者使用 markdown 编辑器存纯文本然后在前端做渲染。两者各有取舍。3.3 接口设计不要为了 REST 而 REST在设计接口时常见做法是GET /api/article/list 文章分页列表 GET /api/article/{id} 文章详情 POST /api/article 新增文章 PUT /api/article/{id} 更新文章 DELETE /api/article/{id} 删除文章 POST /api/login 登录这种风格简单清晰符合大多数学过的 REST 规范。但在真实项目中接口设计更需要关注几个实际问题返回值结构是否统一比如 code、message、data。分页参数用什么字段名pageNum/pageSize 还是 current/page。删除是物理删除还是软删除。查询条件如何组合。如果前后端是两个人协作这些约定必须提前写好接口文档否则会浪费大量时间联调。国内很多团队直接用 Apifox 或 Swagger 管理接口毕设项目至少也要有一个清晰的接口文档。3.4 权限设计登录态、JWT 和拦截器的配合博客后台所有管理操作都应该验证登录身份而前台浏览则可以匿名访问。最简单的方式是后端用拦截器或 Spring Security 对/api/manage/路径做校验前端用路由守卫控制页面跳转。具体到 JWT 流程用户输入用户名密码后端校验后生成 token返回给前端。前端把 token 存在本地 localStorage 中。前端在请求拦截器里把 token 加入请求头。后端拦截器从请求头解析 token验证通过后放行失败则返回 401。这类实现是个人博客项目的亮点但也容易写出问题。比如token 过期后前端如何刷新退出登录时要不要让 token 失效如果只是存在 localStorageXSS 会不会导致 token 泄露这些问题在毕设答辩中经常被问到建议提前想清楚。4. 前后端分离项目里最容易被低估的工程细节4.1 统一响应体与异常处理一个很常见的坏味道是后端接口有时直接返回实体对象有时返回 Map出错时返回一段字符串。前端得靠猜来判断接口是不是正常。更稳妥的做法是定义一个统一的响应体比如{ code: 200, message: success, data: {} }后端再用全局异常处理器把业务异常和未知异常统一包装成这个结构。前端拿到 response 后先判断 code 是否为 200再决定展示数据还是提示错误。这个习惯在项目早期可能觉得麻烦但一旦接口数量多起来就会发现它避免了大量重复判断。4.2 分页查询不是把 pageNum 传过去那么简单分页是前后端分离项目最常见的业务场景也是最容易在面试时被问到底的环节。后端需要从请求参数中获取当前页码 pageNum 和每页数量 pageSize然后去数据库查询总数 queryTotal 和当前页数据 queryList最后组装成如下结构{ records: [...], total: 100, pageNum: 1, pageSize: 10, pages: 10 }前端表格展示这些数据时要注意两个陷阱数据删除后总数会变化页码可能越界。pageSize 默认值要和后端对齐不能一个用 10一个用 20。使用 MyBatis-Plus 的分页插件时需要先配置分页拦截器否则分页方法不生效。这个坑每年都有很多人踩。4.3 图片上传和静态资源映射博客系统的封面图、头像上传后前端需要一个 URL 来访问。最简单的方案是后端接收 MultipartFile存储到本地磁盘某个目录比如uploads/。后端把文件访问路径返回给前端比如/files/2026/01/01/cover.png。后端配置静态资源映射把/files/**指向本地上传目录。这个方案在开发环境没问题但部署到云服务器后容易遇到磁盘空间和备份问题。更工程的方案是使用对象存储但对于一个毕设项目来说本地存储加一个备份脚本已经足够。在文档里写清楚为什么这样做比盲目堆对象存储更能体现理解。4.4 跨域问题的根源与常规解决方式开发时前端运行在 5173 端口后端运行在 8080 端口两者端口不同浏览器就会产生跨域问题。解决方式有很多后端配置 CORS。前端使用 Vite 代理把/api代理到后端地址。部署时用 Nginx 把前后端放在同一个域名下此时不存在跨域。我看到很多项目最终把“后端配 CORS”和“前端配代理”同时用上反而容易出现重复配置导致的异常。正确做法是开发阶段用 Vite 代理部署阶段用 Nginx 统一入口后端可以不做跨域处理或者只作为兜底。4.5 前端路由守卫和后端接口鉴权的边界前端路由守卫只能控制“页面能不能进来”不能保证接口安全。比如用户虽然被路由守卫拦住了但直接请求一个DELETE /api/article/1接口后端如果不校验身份数据依然会泄露或被篡改。所以安全边界应该放在后端。前端路由守卫的目的是改善用户体验例如没有登录时跳转到登录页后端拦截器的目的是保护资源。两者缺一不可但职责不同。这个问题如果能在项目文档里解释清楚是非常加分的。5. 从本地跑通到打包部署个人博客系统的上线链路5.1 本地环境版本匹配先统一再启动“SpringBoot 版本太高”是最近经常被提到的问题。很多人的本机已经装了最新版的 JDK、Maven 和 Node但网上找的项目是基于旧版本构建的于是一启动就报错。我的建议是在克隆或下载项目后先确认这些信息JDK 版本Spring Boot 2.x 常用 JDK 8 或 11Spring Boot 3.x 需要 JDK 17 以上。Maven 版本过旧或过新都可能影响依赖解析。Node 版本Vite 4/5 通常要求 Node 14.18 或 16但不是越新越好。npm 或 pnpm 的版本。如果项目本身没有说明你可以在 pom.xml 里看parent的版本号在 package.json 里看 Vite 和 Vue 的版本号。不要凭感觉升级依赖先跑通再说。5.2 后端打包与部署jar 包、Docker 和云服务器后端打包通常用mvn clean package -DskipTests生成target/xxx.jar后可以用 java -jar 启动。生产环境里常见的操作是配合 Docker 来部署FROM openjdk:17-jdk WORKDIR /app COPY target/blog.jar app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar]使用 Docker 的好处是环境一致性。但如果你对 Docker 不熟直接在一台云服务器上安装 JDK 和 MySQL通过 systemd 管理 jar 进程也是一种可行的方案。关键是要把端口、数据库连接、文件上传目录这些配置通过环境变量管理而不是写死在代码里。5.3 前端构建与 Nginx 配置前端部署的第一步是构建npm install npm run build生成dist目录。然后把 dist 目录里的文件拷贝到 Nginx 的 html 目录并配置反向代理。一个常见的配置片段是server { listen 80; server_name your-domain.com; root /var/www/blog; index index.html; location /api/ { proxy_pass http://127.0.0.1:8080; } location /files/ { alias /var/uploads/; } }这个配置里有两个关键点一是前端静态资源由 Nginx 提供二是 /api 开头和 /files 开头的请求被转发到后端或文件目录。这样前端请求和后端接口都在同一个域名下就不存在跨域问题。5.4 部署后的日志、备份和运维很多新手把项目部署完成后就认为结束了其实运维才刚刚开始。至少在个人博客项目长期运行时要关心日志位置Spring Boot 默认输出到控制台生产环境要配置文件日志。数据库备份MySQL 可以写一个定时任务导出 SQL。文件备份上传的封面图和附件也要定时复制到异地或对象存储。进程守护用 systemd 或 docker restart 策略保证后端挂了能自动重启。安全基线修改 MySQL root 默认密码、Nginx 配置中隐藏版本号、更新默认 SSH 端口等。如果你只是做一个毕设或简历项目不一定要全部完成但至少在文档里列出“如果我要上线我会怎么处理”这比写一堆功能列表更有说服力。6. 如何把这个项目变成简历亮点或毕设高分项目6.1 不要只写“实现了增删改查”简历上的项目描述最忌写成功能清单。如果你写“基于SpringBootVue3实现了博客的增删改查”面试官完全看不出你的能力边界。更好的做法是围绕“你解决了什么问题”来写。例如使用 JWT 实现无状态登录解决前后端分离下的身份认证问题。通过自定义异常处理和统一响应体将接口错误信息可读性提升。使用 MyBatis-Plus 分页插件与前端 Element Plus 表格对接完成文章列表的分页展示与条件搜索。设计本地文件存储与静态资源映射解决博客封面图上传与访问问题。使用 Nginx 部署前端资源并反向代理后端接口解决跨域问题并完成项目上线。这样的描述每一句都能展开而且都有明确的技术动作和业务场景。6.2 设计层面的优化个人博客的可扩展点一个只做“文章管理”的博客系统很容易让人审美疲劳。如果时间允许可以在核心闭环之上增加一到两个“有深度的小模块”比如阅读量统计用一个字段累加或者用 Redis 做计数。标签云按文章数量聚合标签生成词云页面。数据仪表盘后台首页展示文章总数、分类数、评论数、最近一周发布趋势。导出文章为 Markdown 或 PDF前端或后端处理。评论审核机制未审核评论不在前台展示。这些扩展点不需要全部做完选一个你最感兴趣的模块深挖并在项目文档里讲清楚它的表设计、接口逻辑和前端交互就能让项目超过平均水平。6.3 文档和演示项目文档、启动文档、README很多开发者只重视代码不重视文档。但毕设或简历项目在展示时文档往往决定了别人能不能快速理解和运行你的项目。一个合格的 README 至少应该包含项目简介和在线演示地址如果有。技术栈说明。功能模块列表。环境准备JDK、Maven、Node、MySQL 版本。启动步骤建库、导 SQL、改配置、起后端、起前端。项目目录结构说明。常见问题端口被占、版本不兼容等。这不只是给别人看也是倒逼自己把整个项目重新梳理一遍。很多时候你写着写着就会发现某个环节自己也是一知半解。6.4 常见误区功能堆砌比问题导向更容易失败毕设答辩和面试时最怕听到的话是“我加了 Redis用了 Docker还有 Elasticsearch”——一问细节却答不上来。技术栈不是越多越好而是越能说明问题越好。一个更好的策略是“问题导向”先描述一个你实际遇到的开发问题再说明你用了什么方案解决最后复盘这个方案带来的收益和局限。例如“vite 开发时代理可以解决跨域但是我发现打包后仍然可能 404于是改用 Nginx 反向代理并理解了两者的区别。”这种表达比“我会用 Nginx”更有说服力。7. 踩坑指南常见问题和排查链路7.1 环境版本过高导致的“玄学问题”“SpringBoot 版本太高”这类关键词能说明一个现象网上很多旧项目的依赖在新版本下会报错或不兼容。常见情况有JDK 17 跑 Spring Boot 2.x 可能遇到反射相关报错需要加--add-opens很难受。Node 过新时某些旧版本 Vite 会报digital envelope routines::unsupported。MySQL 8 和 MySQL 5.7 的驱动配置也有差异driverClassName、URL 参数、时区设置都不同。遇到这类问题不要急着把依赖升到最新。正确做法是反向操作把 JDK 或 Node 切换到项目适配的版本。开发机上装一个版本管理工具比如 jenv、nvm 或 nvm-windows可以快速切换环境是性价比很高的操作。7.2 接口 404/500 的排查顺序当接口无法访问时先别怀疑“跨域”。按这个顺序排查看控制台/日志接口是根本没进来还是进来了抛异常。确认请求路径和后端RequestMapping路径是否完全一致。确认请求方式GET/POST/PUT/DELETE是否匹配。确认参数名和前端传参是否一致尤其是 RequestBody 对应的 JSON 字段名。确认拦截器/过滤器是否拦截了请求比如某些路径需要 token没带就是 401/403。确认是否有全局异常处理器把堆栈吞掉了导致只看到统一错误码没有详情。个人项目最容易出错的是第 4 条。前端传的是createTime后端实体类是createdAt一接就是 null。7.3 前端访问后端接口失败的排查顺序这类问题通常表现为浏览器控制台报“Access to XMLHttpRequest has been blocked by CORS policy”或“Failed to fetch”。排查步骤先在后端控制台确认请求是否到达后端。如果没有到达检查前端代理配置和目标地址是否正确。如果到达了但浏览器还是报跨域检查后端是否对预检请求OPTIONS做了处理。如果用了 Nginx优先检查 location 配置里的 proxy_pass 是否写错。如果接口返回成功但前端拿不到数据检查响应体结构和前端解析逻辑是否匹配。记住跨域是浏览器的安全限制不是后端的链路问题。 curl 请求能通不代表浏览器能通。7.4 可以用一整条排查链路串起来我们可以给个人博客项目提炼一个“五层排查法”第一层现象确认。是 404、500、401、还是白屏、无响应第二层输入确认。请求路径、请求方式、参数、token、Content-Type 是否都对。第三层环境确认。依赖版本、数据库连接、端口占用、静态资源路径。第四层代码确认。Controller、Service、Mapper 是否逻辑正确是否有日志。第五层边界确认。是否真的用对了工具比如分页插件是否注册、拦截器放行了哪些路径。这套方法不仅适用于博客系统几乎适用于所有 SpringBoot Vue3 项目。写在项目文档里会显得你不仅有代码能力还有问题排查意识。8. 回到最核心的判断这个项目真正值得投入的原因8.1 我在推荐这个项目时的三个判断标准如果你问我现在是否值得做一个个人博客管理系统我的判断标准有三个第一它是否能让一个学习者看到完整的全栈路径。答案是肯定的。从数据库表设计到后端接口再到前端页面整个链路清晰可见没有太多隐藏依赖。第二它是否能在有限时间内形成成果。答案是肯定的。只要不盲目堆功能一个最小闭环可以在三到六周内完成而且每个阶段都有可运行的中间版本。第三它是否能成为打开下一阶段学习的跳板。答案是肯定的。做完这个项目后你再去接触微服务、分布式、容器化、低代码平台都会比直接上手大型项目更有底气。它可能不是最酷的项目也不是技术含量最高的项目但它非常适合作为“第一个完整项目”。它的价值不在于“全”而在于“完整”。8.2 下一步行动从跑通到重写如果你已经在做一个个人博客管理系统我的最直接建议是先跑通一个最小闭环管理员登录、文章列表、文章编辑、文章展示。不要一开始就做十个模块。跑通之后主动改一个模块。比如把文章列表从本地查询改成带条件搜索的分页列表或新增一个标签筛选。最后尝试从零开始重写一遍核心流程不依赖已有源码只依赖你画好的表结构和接口文档。这个过程可能比“下载一份完整源码直接运行”慢得多但只有经历过“报错、定位、修复、验证”这个循环你才能真正把项目变成自己的东西。到那时无论答辩、面试还是以后工作你都能条理清晰地讲清楚这个系统的每一层是怎么协同工作的。个人博客管理系统看似平凡但它把零散的知识点变成了一套完整、可运行、可讲解的业务闭环。你通过它学会了如何设计表、如何写接口、如何联调、如何部署也学会了如何把一个项目讲成自己的故事。这才是它最值得投入的地方。
返回列表