SpringBoot+Vue3博客系统实战:从零搭建到部署的完整指南

发布时间:2026/9/30 7:28:20

SpringBoot+Vue3博客系统实战:从零搭建到部署的完整指南 上周帮一个学弟改毕设他拿来的项目跑起来一堆问题前端接口调不通、后端跨域没配、数据库连不上、打包部署报错。他问我“不是说前后端分离项目现在都有成熟方案了吗为什么我照着教程一步步做还是跑不起来”这其实是一个很典型的误区。很多人以为拿到一个“SpringBoot Vue3”的博客系统源码解压、导入、运行就能看到一个完美的管理系统。但现实是从“源码能跑”到“项目能用”中间隔着一道需要自己填平的沟。这道沟里藏着环境配置、版本对齐、跨域处理、接口联调、部署适配等一系列具体而微的工程问题。今天我们就以这个经典的“SpringBoot Vue3 博客管理系统”为例彻底走一遍从零到一的搭建、配置、运行和理解的完整路径。我的目标不是让你“半小时”就得到一个能运行的界面——那往往只是第一步。我的目标是让你在搭建过程中真正理解一个前后端分离项目的骨架是如何搭建的每个配置项背后的意图是什么以及当它跑不起来时你该从哪里开始排查。1. 先别急着运行理解“前后端分离”到底分离了什么很多人对“前后端分离”的理解停留在“前端一个项目后端一个项目”的层面。这没错但太浅了。真正的分离是职责的分离、开发的分离、部署的分离以及通信协议的标准化。1.1 职责分离谁该做什么后端 (SpringBoot)提供纯净的、无状态的API 接口。它的核心职责是业务逻辑处理、数据持久化操作MySQL、身份认证与授权如JWT、数据校验和安全性保障。它不关心数据最终以何种样式呈现在哪个页面上。前端 (Vue3)负责用户交互与数据呈现。它通过HTTP请求通常是Axios调用后端API获取JSON格式的数据然后根据业务逻辑将数据渲染成HTML视图。它不关心数据是如何从数据库查出来的。这种分离带来的直接好处是并行开发。后端可以先用Swagger或Postman定义好API文档前端就可以基于这份文档Mock数据独立进行页面开发无需等待后端接口完全实现。1.2 通信桥梁RESTful API与跨域CORS前后端分属不同项目甚至可能运行在不同端口如前端localhost:5173后端localhost:8080。浏览器基于同源策略默认会阻止这种跨域请求。因此跨域处理是前后端分离项目遇到的第一个、也是最高频的“拦路虎”。解决方案必须在后端进行配置告诉浏览器“来自某个前端地址的请求我允许。” 在SpringBoot中通常通过一个WebMvcConfig配置类来实现import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) // 对所有接口路径生效 .allowedOriginPatterns(*) // 允许所有来源生产环境应替换为具体前端地址 .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) // 允许的HTTP方法 .allowCredentials(true) // 允许携带Cookie等凭证 .maxAge(3600); // 预检请求缓存时间 } }注意在开发环境为了方便我们常使用allowedOriginPatterns(*)。但在生产环境务必将其替换为确切的前端域名或IP如https://yourdomain.com这是重要的安全实践。1.3 项目结构认知两个独立的工程当你拿到源码时应该看到类似如下的目录结构blog-project/ ├── blog-backend/ # SpringBoot后端工程 │ ├── src/ │ ├── pom.xml │ └── application.yml └── blog-frontend/ # Vue3前端工程 ├── src/ ├── package.json ├── vite.config.js # 或 vue.config.js └── .env.development # 环境变量关键点它们是两个完全独立的项目需要分别配置、分别启动。它们的联系仅通过HTTP API。因此你的IDE如IDEA可能需要打开两个窗口或者配置为一个项目的两个模块。2. 后端搭建让SpringBoot“活”起来后端是系统的基石。搭建后端不仅仅是启动一个服务更是确保数据层、业务层、接口层都能正确连通。2.1 环境准备与项目导入基础环境确保本地已安装JDK 8、Maven 3.6、MySQL 5.7。使用java -version、mvn -v、mysql --version验证。数据库初始化在MySQL中创建一个新的数据库例如blog_db。然后在源码中找到SQL脚本文件通常位于backend/src/main/resources目录下或项目根目录的sql文件夹中将其在blog_db数据库中执行。这一步是很多项目启动失败的原因——数据库表不存在。导入项目使用IntelliJ IDEA打开blog-backend文件夹。IDEA会自动识别为Maven项目并开始下载依赖观察右下角进度条。确保网络通畅首次导入依赖下载可能需要一些时间。2.2 核心配置文件解读配置文件通常是application.yml或application.properties是项目的“控制中心”。你必须根据本地环境修改它。# application.yml 示例 server: port: 8080 # 后端服务启动端口 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/blog_db?useUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/Shanghai username: root # 改成你的MySQL用户名 password: yourpassword # 改成你的MySQL密码 servlet: multipart: max-file-size: 10MB # 文件上传大小限制 # MyBatis-Plus 配置如果项目使用了的话 mybatis-plus: mapper-locations: classpath*:/mapper/**/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志调试用 global-config: db-config: logic-delete-field: deleted # 逻辑删除字段名 logic-delete-value: 1 logic-not-delete-value: 0 # JWT 密钥配置如果项目涉及登录 jwt: secret: yourJwtSecretKeyHere # 应改为一个复杂的随机字符串 expire: 604800 # token过期时间秒必须修改项spring.datasource.url中的数据库名、端口。spring.datasource.username和password。jwt.secret如果存在务必修改不要使用默认值。2.3 启动与验证找到主启动类通常命名为XxxApplication包含SpringBootApplication注解。右键点击选择Run ‘XxxApplication‘。观察控制台日志。成功的标志是看到Tomcat started on port(s): 8080以及Spring Boot的图标并且没有大量的ERROR日志。验证API打开浏览器访问http://localhost:8080/doc.html如果集成了Knife4j或http://localhost:8080/swagger-ui.html如果集成了Swagger。你能看到API文档页面说明后端服务已正常启动且接口基本就绪。常见启动失败排查端口占用如果8080端口被占用在application.yml中修改server.port。数据库连接失败检查MySQL服务是否启动用户名密码是否正确数据库名是否存在。依赖下载失败检查Maven配置的仓库地址或尝试在IDEA中右键点击项目 - Maven - Reload project。JAR包冲突观察是否有ClassNotFoundException或NoSuchMethodError可能是依赖版本冲突需要检查pom.xml。3. 前端搭建让Vue3“动”起来前端负责提供用户界面。Vue3项目通常使用Vite作为构建工具速度更快。3.1 环境准备与依赖安装基础环境确保已安装Node.js建议16或18 LTS版本。使用node -v和npm -v验证。安装依赖在终端中进入blog-frontend目录运行npm install # 或使用淘宝镜像加速 # npm install --registryhttps://registry.npmmirror.com此命令会根据package.json文件下载所有项目依赖的第三方库如Vue Router, Pinia, Element Plus, Axios等。3.2 关键配置连接后端API前端需要知道后端服务在哪里。这个配置通常在环境变量文件或Axios的全局配置中。方式一环境变量配置查看项目根目录下是否有.env.development开发环境文件。# .env.development VITE_API_BASE_URL http://localhost:8080在Vue组件或请求工具中可以通过import.meta.env.VITE_API_BASE_URL获取这个值。方式二Axios全局配置在src/utils/request.js或类似文件中通常会创建Axios实例并设置基础URL。import axios from axios; const service axios.create({ baseURL: process.env.VITE_API_BASE_URL || http://localhost:8080, // 读取环境变量或默认值 timeout: 10000, // 请求超时时间 }); // 请求拦截器常用于添加token service.interceptors.request.use(...); // 响应拦截器常用于处理通用错误 service.interceptors.response.use(...); export default service;务必检查这里的baseURL是否与你的后端运行地址和端口一致。3.3 启动与访问在blog-frontend目录下运行启动命令npm run dev控制台会输出本地访问地址通常是http://localhost:5173。用浏览器打开这个地址。此时你可能会遇到第一个问题页面空白或控制台报跨域错误。如果页面能加载但数据为空按F12打开浏览器开发者工具切换到“网络(Network)”标签刷新页面。查看对后端接口的请求是否成功状态码200。如果请求失败状态码404、500或CORS错误说明前端请求的地址不对或者后端跨域配置未生效。回到第1.2和3.2步检查。如果控制台有红色错误仔细阅读错误信息。常见的有“Cannot find module”可能是依赖未安装完全尝试删除node_modules文件夹和package-lock.json重新执行npm install。4. 核心功能联调与理解以“增删改查”为例项目能跑起来只是开始。理解其核心功能的实现逻辑才能应对未来的修改和扩展需求。我们以博客管理系统最常见的“文章管理”模块为例。4.1 数据流向全景图一次完整的“查询文章列表”操作数据流如下前端页面触发 - Vue组件调用方法 - Axios发起GET请求 - 网络 - 后端Controller接收 - Service处理业务 - Mapper查询数据库 - 数据库返回数据 - Mapper封装 - Service返回 - Controller封装成统一响应体 - 网络 - Axios响应拦截器处理 - Vue组件接收数据 - 更新响应式变量 - 页面渲染4.2 后端代码层解析Controller层 (ArticleController.java)接收HTTP请求调用Service返回结果。这是API的入口。RestController RequestMapping(/article) public class ArticleController { Autowired private ArticleService articleService; GetMapping(/list) public Result listArticles(RequestParam MapString, Object params) { PageUtils page articleService.queryPage(params); return Result.ok().put(page, page); } }RestController表明这是一个返回JSON数据的控制器。RequestMapping(“/article”)定义模块的基础路径。GetMapping(“/list”)处理GET请求路径为/article/list。Result通常是自定义的统一响应封装类包含code、msg、data等字段。Service层 (ArticleService.java)实现核心业务逻辑。它介于Controller和Mapper之间。Mapper层 (ArticleMapper.java)直接与数据库交互的接口。如果使用了MyBatis-Plus它会继承BaseMapper获得大量现成的单表操作方法。实体类 (Article.java)与数据库表结构对应的Java对象。4.3 前端代码层解析API请求封装 (src/api/article.js)集中管理对文章模块的所有请求。import request from /utils/request; // 导入配置好的Axios实例 export function getArticleList(params) { return request({ url: /article/list, method: get, params: params // 对应后端的 RequestParam }); }页面组件 (src/views/article/List.vue)在Vue组件中调用API处理数据。script setup import { ref, onMounted } from vue; import { getArticleList } from /api/article; const tableData ref([]); // 响应式数据存储文章列表 const loading ref(false); // 加载状态 const fetchData async () { loading.value true; try { const res await getArticleList({ page: 1, limit: 10 }); tableData.value res.data.page.list; // 根据后端返回结构解析数据 } catch (error) { console.error(获取文章列表失败:, error); } finally { loading.value false; } }; onMounted(() { fetchData(); // 页面加载时获取数据 }); /script路由配置 (src/router/index.js)定义页面访问路径与组件的映射关系。4.4 联调实战添加一篇文章前端在表单组件中用户填写标题、内容后点击提交。前端通过Axios发送一个POST请求到/article/save请求体Body中携带JSON格式的表单数据。后端ArticleController中有一个PostMapping(“/save”)的方法接收请求。它调用articleService.save(article)将数据存入数据库。验证操作完成后刷新文章列表查看新文章是否出现。同时在数据库的article表中也应能看到这条新记录。在这个过程中前后端开发者需要紧密协作的点是接口文档URL路径、请求方法GET/POST/PUT/DELETE、请求参数格式Query Param / Path Variable / Request Body、响应体格式。数据格式尤其是日期时间格式前后端需要统一如使用时间戳或yyyy-MM-dd HH:mm:ss字符串。5. 从“能运行”到“能使用”部署与进阶考量让项目在本地运行起来完成了学习的第一步。但如果想用于毕设演示、简历展示或小型生产环境还需要考虑更多。5.1 项目打包后端打包在blog-backend目录下使用Maven命令打包。mvn clean package -DskipTests成功后会在target目录下生成一个可执行的JAR包如blog-0.0.1-SNAPSHOT.jar。这个JAR包内嵌了Tomcat服务器可以直接用java -jar命令运行。前端打包在blog-frontend目录下运行构建命令。npm run build默认会在项目根目录下生成一个dist文件夹里面是优化、压缩后的静态资源HTML, JS, CSS。5.2 部署方式选择前后端分离部署推荐后端将JAR包上传到云服务器使用nohup java -jar blog.jar 或配置为系统服务如systemd在后台运行。需要确保服务器已安装对应版本的JRE。前端将dist文件夹内的所有文件上传到Nginx或Apache等Web服务器的静态资源目录。然后配置Nginx将API请求反向代理到后端服务。# Nginx 配置示例片段 server { listen 80; server_name yourdomain.com; # 你的域名或IP # 前端静态资源 location / { root /path/to/your/dist; index index.html; try_files $uri $uri/ /index.html; # 支持Vue Router的history模式 } # 反向代理后端API location /api/ { proxy_pass http://localhost:8080/; # 转发到后端服务 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }这种方式最清晰也最符合现代Web应用架构。前后端合并部署将前端dist文件夹的内容复制到SpringBoot项目的src/main/resources/static目录下然后一起打包。这样访问http://ip:port就能看到前端页面。这种方式更简单但耦合度高不适合大型项目。5.3 为毕设/简历增色的进阶思考一个能跑的系统是基础一个有思考的系统才能体现你的能力。在理解上述流程后你可以尝试安全性为登录接口添加验证码如Google Kaptcha防止暴力破解。对用户输入进行更严格的校验如使用Hibernate Validator。性能对热点查询如首页文章列表引入缓存如Redis减少数据库压力。可维护性编写清晰的API文档使用Swagger/Knife4j并补充描述。在代码中添加有意义的注释特别是复杂的业务逻辑处。健壮性完善后端的全局异常处理ControllerAdvice给前端返回更友好的错误信息而不是一堆Java异常栈。用户体验在前端添加加载状态、操作成功/失败提示、表单校验等。搭建一个SpringBootVue3的博客系统技术本身并不复杂。真正的价值不在于“半小时跑通”的速度而在于你能否通过这个过程把“前后端分离”、“RESTful API”、“跨域”、“数据流”、“打包部署”这些概念从书本上的名词变成你手中可运行、可调试、可修改的活代码。当你下次再遇到一个“跑不起来”的项目时你脑子里浮现的不再是慌乱而是一个清晰的排查路径先看环境再看配置接着查日志最后分析代码逻辑。这套从搭建到理解的完整路径才是你从这次实践中应该带走的核心能力。
延伸阅读

更多相关文章

2026/9/29 12:38:29

数学公理体系大全:第十八章 基于希尔伯特公理的经典定理证明

第十八章 基于希尔伯特公理的经典定理证明 引言:从公理到定理的严格演绎 第十七章完整陈述了希尔伯特的五组二十条平面几何公理。这些公理构筑了一架精密的逻辑机器——它不依赖任何图形直觉,只等待我们将具体的几何问题输入,便能输出无可争议…

2026/9/30 7:27:24

大麦抢票终极指南:Python自动化抢票完整教程

大麦抢票终极指南:Python自动化抢票完整教程 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票而烦恼吗&#…

2026/9/30 7:26:45

西南科技大学OJ代码合集:刷题存档与本地对拍验证指南

简介:这份资源是西南科技大学OJ的代码合集,面向计算机专业学生、算法竞赛入门者以及需要刷题巩固基础的编程爱好者,帮助解决在线评测题目无从下手、缺少参考解法的问题。压缩包共117个文件,以110个cpp源码为主体,另含r…

2026/9/30 7:26:45

光学超材料逆向设计:INN与SNN联合建模实战指南

简介:这份资源聚焦光学超材料的逆向设计,结合INN与SNN两类神经网络模型,面向具备一定机器学习基础、希望将深度学习应用于电磁器件设计的研究生与科研人员。内容围绕全连接网络架构展开,涵盖四层与十层隐含层的对比实验&#xff0…

2026/9/30 7:26:45

Android Studio 2048 小游戏源码解析:安卓大作业开发实战

简介:这是一份基于 Android Studio 开发的 2048 小游戏完整源代码,面向高校学生与安卓初学者,可用于课程设计、期末大作业或自学练手,帮助解决从零搭建安卓项目、理解游戏逻辑与界面布局的实际问题。压缩包共 141 个文件&#xff…

2026/9/30 7:26:45

基于WEB的仓库管理系统源码解析:从部署到库存扣减实战

简介:这是一套面向高校计算机相关专业学生与Java Web初学者设计的仓库管理系统毕业设计完整资料,围绕出入库业务场景,帮助读者完成从需求分析到系统落地的全流程实践。系统功能结构清晰,涵盖入库模块(新商品入库与已有…

2026/9/30 7:26:45

智慧医疗挂号App源码实战:Android+服务器端毕设项目避坑指南

简介:这份资源是面向高校计算机相关专业毕业设计的完整安卓项目案例,基于AndroidStudio与SQLite数据库开发,包含安卓客户端与服务器端源码及项目文档,适合正在准备毕业设计、需要智慧医疗或健康医疗方向选题的学生参考与二次开发。…

2026/9/29 11:07:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/29 21:48:03

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 0:01:22

MATLAB+Yalmip+CPLEX实战:综合能源系统优化调度全流程解析

做综合能源系统优化调度这活儿,最痛苦的不是建模本身,而是模型写完之后不知道该怎么求解。看论文里轻飘飘一句“采用Yalmip调用CPLEX求解”,自己上手时却往往卡在环境配置、变量声明、约束写法和求解状态判读上,一耗就是两三天。这…

2026/9/30 0:01:22

I3C比I2C快10倍?RK3576实战:速率、DTS配置与混合总线避坑指南

I3C 比 I2C 快 10 倍?这句话在嵌入式群里传了很久,每次都能吵出一堆截图。前段时间我正好在 RK3576 上调板级 I3C 接口,从控制器寄存器一路摸到 Linux DTS 配置,踩了不少坑,也把这笔速度账彻底算明白了。本文就用 RK35…

2026/9/30 0:01:22

字符串转对象:JSON.parse、new Function与URLSearchParams

“字符串转对象”这几个字,我在技术群里见过的问法至少有十几种:有人拿着一串{a:1,b:2}说 JSON.parse 直接报错,有人要从 URL 里抠出参数,还有人只是想把abc变成能挂属性的东西。js 这门语言里,字符串和对象之间的转换…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/29 9:46:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/29 6:36:14

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑