ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SpringBoot+Vue3前后端分离项目实战:从零搭建美食网站

SpringBoot+Vue3前后端分离项目实战:从零搭建美食网站 1. 这个项目到底能帮你解决什么问题如果你正在找一份能跑起来、代码结构清晰、前后端分离的 SpringBoot Vue3 项目用来学习、做毕业设计或者丰富简历那这个“美食网站”项目就是一个非常典型的起点。它不是什么高深莫测的架构核心就是围绕“增删改查”这个基础但至关重要的能力把前后端分离的开发流程走一遍。很多人学框架时看官方文档和零散教程知识点是割裂的。这个项目的价值在于它把这些知识点串成了一个可运行、可观察的系统。你拿到源码后两小时内能搭建起来看到页面操作数据感受从浏览器点击到数据库更新再回到页面的完整链路。这对于理解“前后端分离”到底是怎么工作的比看十篇概念文章都管用。项目本身是“美食网站”但它的骨架——用户管理、菜品信息管理、分类管理、订单管理——换套皮肤和业务逻辑就能变成博客、商城、OA系统。所以别只盯着“美食”要关注它如何组织代码、如何定义接口、前端如何调用、后端如何处理数据、权限怎么控制。这些才是你简历上和面试中能讲出来的“实战经验”。2. 动手之前先理清环境和思路在下载代码和打开 IDE 之前先花五分钟确认你的“作战地图”。盲目开跑大概率会卡在环境配置上。2.1 你需要准备什么硬件要求不高但软件版本是关键。版本不匹配是新手踩坑的重灾区。后端 (SpringBoot) 环境JDK:版本 8 或 11。推荐 JDK 11兼容性和社区支持都更好。用java -version命令确认。构建工具:Maven 3.6 或 Gradle。项目大概率是 Maven确保mvn -v能运行并且配置了国内镜像源如阿里云镜像以加速依赖下载。IDE:IntelliJ IDEA (社区版或旗舰版) 或 Eclipse (需安装 Spring Tools)。IDEA 对 SpringBoot 支持更友好。数据库:MySQL 5.7 或 8.0。确保已安装并启动服务记住 root 密码或你有权限的账号密码。其他:可能需要 Redis用于缓存或会话管理根据项目pom.xml或application.yml判断。前端 (Vue3) 环境Node.js:版本 16.x 或 18.x。不要用太老或太新的版本。用node -v和npm -v确认。包管理器:npm 或 yarn。通常 npm 随 Node.js 安装。IDE:Visual Studio Code 是主流选择轻量且插件丰富。核心思路前后端分离项目后端提供 API 接口前端通过 HTTP 请求调用。所以你的搭建顺序应该是配数据库 - 启动后端 - 启动前端。后端启动成功接口能访问前端才能正常工作。2.2 源码结构预览拿到源码压缩包后先解压看目录结构。一个典型的结构可能如下food-project/ ├── backend/ # SpringBoot 后端项目 │ ├── src/ │ ├── pom.xml # Maven 依赖管理 │ └── application.yml # 核心配置文件数据库连接在这里改 ├── frontend/ # Vue3 前端项目 │ ├── src/ │ ├── package.json # 前端依赖管理 │ └── vue.config.js # 前端配置文件如代理设置 └── sql/ # 数据库初始化脚本 └── food_db.sql关键文件解读backend/application.yml这是后端的“大脑”。你需要修改spring.datasource下的url、username、password让它指向你的本地 MySQL。sql/food_db.sql在启动后端前先在 MySQL 中执行这个 SQL 文件创建数据库和表结构并插入初始数据如管理员账号。frontend/package.json查看scripts部分通常npm run serve或npm run dev用于启动开发服务器。frontend/vue.config.js如果前端需要调用后端接口这里可能会配置devServer.proxy来解决开发时的跨域问题。3. 从零到一让项目在你的机器上跑起来现在我们按照标准流程一步步启动项目。我建议你严格按这个顺序操作并观察每个步骤的日志输出。3.1 第一步初始化数据库这是最基础也最容易出错的一步。打开你的 MySQL 客户端命令行、Navicat、Workbench 等。创建一个新的数据库名字根据application.yml里的配置来比如food_db。CREATE DATABASE IF NOT EXISTS food_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;使用这个数据库USE food_db;执行sql/food_db.sql文件中的所有 SQL 语句。这会创建表并插入初始数据。执行完后查看一下是否有user、dish菜品、category分类等表生成并确认user表里有一条初始的管理员账号记录用于登录。注意如果执行 SQL 报错常见原因是 SQL 语法与你的 MySQL 版本不兼容如反引号、关键字或者字符集设置问题。可以尝试用文本编辑器打开 SQL 文件检查并简单修改。3.2 第二步配置并启动 SpringBoot 后端后端是服务的核心先确保它能独立运行。用 IDEA 打开backend文件夹。IDEA 会自动识别为 Maven 项目并开始下载依赖观察右下角进度条。打开src/main/resources/application.yml。找到数据库配置部分修改成你的本地信息spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/food_db?useUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/Shanghai username: root # 你的数据库用户名 password: your_password # 你的数据库密码检查其他配置如server.port后端服务端口默认可能是 8080redis配置如果用到。找到主启动类通常叫FoodApplication或Application带有SpringBootApplication注解。右键点击这个类选择Run ‘FoodApplication‘。观察控制台日志这是最重要的环节。成功的日志会显示Tomcat started on port(s): 8080Started FoodApplication in X.XXX seconds没有持续的、导致进程停止的 ERROR 日志。验证打开浏览器访问http://localhost:8080或你配置的端口。如果看到 Whitelabel Error Page 或简单的 JSON 错误这是正常的说明后端服务已经启动只是没有定义根路径的接口。更专业的验证是访问其内置的接口文档如果集成了 Swagger比如http://localhost:8080/swagger-ui.html或http://localhost:8080/doc.html。常见启动失败原因数据库连接失败检查application.yml配置、MySQL 服务是否启动、用户名密码是否正确、数据库名是否存在。端口被占用修改server.port为其他端口如 8081。依赖下载失败检查 Maven 镜像源或尝试在 IDEA 中右键pom.xml-Maven-Reload project。JDK 版本不匹配在 IDEA 的Project Structure中确认项目使用的 JDK 版本。3.3 第三步配置并启动 Vue3 前端后端 API 服务就绪后前端才能正常获取数据。用 VS Code 打开frontend文件夹。打开终端Terminal确保路径在前端项目根目录下。安装依赖npm install或cnpm install如果你用了淘宝镜像。这个过程会下载node_modules耐心等待。检查vue.config.js文件。关键看devServer.proxy配置它定义了前端开发服务器将 API 请求代理到哪个后端地址。通常配置如下module.exports { devServer: { port: 80, // 前端开发服务器端口如 80 proxy: { /api: { // 以 /api 开头的请求会被代理 target: http://localhost:8080, // 你的后端地址 changeOrigin: true, pathRewrite: { ^/api: // 重写路径去掉 /api 前缀根据后端接口实际情况调整 } } } } }这意味着前端代码里请求/api/user/login实际上会被转发到http://localhost:8080/user/login。启动前端开发服务器npm run serve或npm run dev。终端会输出访问地址通常是http://localhost:80或http://localhost:8081。用浏览器打开这个地址。如果页面成功加载出现登录页或主页恭喜你项目基本跑通了。前端启动常见问题npm install报错网络问题或 Node.js 版本问题。尝试使用npm cache clean --force后重试或切换 npm 源 (npm config set registry https://registry.npmmirror.com)。页面能打开但接口报 404检查vue.config.js中的proxy配置确保target指向正确的、正在运行的后端地址和端口。可以在浏览器开发者工具的Network面板查看请求详情。页面空白或控制台有 JS 错误可能是依赖版本冲突。尝试删除node_modules和package-lock.json重新npm install。4. 深入核心理解并操作“增删改查”项目跑起来只是第一步理解其代码实现才能转化为你的能力。我们以最经典的“菜品管理”模块为例拆解前后端如何协作完成 CRUD。4.1 后端 API 层剖析在后端项目中找到菜品相关的 Controller、Service、Mapper 和实体类。实体类 (Entity/Domain):如Dish.java。它定义了菜品的属性id, name, price, categoryId, status 等并与数据库表字段映射通常使用 JPA 注解或 MyBatis 的映射。数据访问层 (Mapper/Repository):如DishMapper.java。这里定义了数据库操作方法。如果使用 MyBatis你会看到Mapper注解和对应的 XML 文件在resources/mapper下里面是具体的 SQL 语句。如果使用 JPA 或 MyBatis-Plus方法定义会更简洁。业务逻辑层 (Service):如DishService.java和DishServiceImpl.java。这里包含业务规则比如新增菜品前检查名称是否重复删除菜品前检查是否被订单关联。Service 调用 Mapper 来操作数据。控制层 (Controller):如DishController.java。这是对外的 HTTP 接口。你会看到类似下面的代码RestController RequestMapping(/dish) public class DishController { Autowired private DishService dishService; GetMapping(/list) public Result list(DishQuery query) { // 查询列表可能带分页和条件 PageInfoDishVO pageInfo dishService.list(query); return Result.success(pageInfo); } PostMapping public Result add(RequestBody Dish dish) { // 新增 dishService.save(dish); return Result.success(); } PutMapping public Result update(RequestBody Dish dish) { // 更新 dishService.updateById(dish); return Result.success(); } DeleteMapping(/{id}) public Result delete(PathVariable Long id) { // 删除 dishService.removeById(id); return Result.success(); } }GetMapping、PostMapping、PutMapping、DeleteMapping对应 HTTP 方法的 GET, POST, PUT, DELETE。RequestBody表示接收 JSON 格式的请求体。PathVariable表示从 URL 路径中获取参数。返回的Result对象是一个包装类通常包含code、msg、data字段用于统一接口响应格式。4.2 前端请求层与页面交互在前端项目中找到菜品管理的页面组件如src/views/dish/index.vue和对应的 API 请求文件如src/api/dish.js。API 请求封装在dish.js中你会看到使用axios封装的函数。import request from /utils/request // 通常是一个配置了拦截器的 axios 实例 export function getDishList(params) { return request({ url: /dish/list, method: get, params // GET 请求参数 }) } export function addDish(data) { return request({ url: /dish, method: post, data // POST 请求体 }) }页面组件调用在 Vue 组件中引入这些 API 函数并在生命周期钩子如onMounted或事件处理函数中调用。script setup import { ref, onMounted } from vue import { getDishList, deleteDish } from /api/dish const tableData ref([]) // 加载列表 const loadData async () { const res await getDishList({ page: 1, size: 10 }) tableData.value res.data.list } // 删除操作 const handleDelete async (id) { // 先弹窗确认 await deleteDish(id) // 删除成功后重新加载列表或提示 loadData() } onMounted(() { loadData() }) /script页面渲染与事件绑定模板部分会使用tableData渲染表格并将删除按钮的点击事件绑定到handleDelete方法。前后端数据流闭环用户点击前端删除按钮 - 前端调用deleteDish(id)- 发送DELETE /dish/{id}请求到后端通过代理- 后端DishController.delete()接收请求 - 调用DishService.removeById(id)- 调用DishMapper.deleteById(id)执行 SQL - 数据库记录被删除 - 后端返回成功结果 - 前端接收到成功响应刷新列表或给出提示。走通这个闭环你就真正理解了前后端分离开发的基本模式。5. 从“能跑”到“能用”项目改造与深度探索把默认项目跑起来只是完成了 30%。剩下的 70% 在于你如何基于它进行探索和改造让它变成你自己的经验。5.1 如何进行二次开发修改现有功能增加字段在Dish实体类中加一个description描述字段。然后需要修改数据库表结构执行 ALTER TABLE 语句。修改后端实体类、Mapper或 XML、Service、Controller、DTO/VO。修改前端表单模型、表格列、API 请求和接收的数据结构。改变业务逻辑比如删除菜品时如果该菜品已有销量则不允许删除改为下架。这需要修改DishService.delete方法加入业务判断。增加新模块模仿现有“菜品管理”模块的代码结构创建一个“评论管理”模块。步骤设计数据库表 - 创建实体类 - 创建 Mapper - 创建 Service - 创建 Controller - 定义前端 API - 创建前端页面组件 - 配置路由。这个过程能强制你理解整个项目的架构和文件组织方式。集成第三方功能文件上传学习如何在 SpringBoot 中处理MultipartFile并集成 OSS对象存储如阿里云 OSS 或 MinIO。权限控制项目可能使用了简单的拦截器或基础的权限注解。你可以尝试集成更完整的权限框架如 Spring Security JWT理解认证和授权的流程。接口文档如果项目没有 Swagger可以自己集成knife4j为 API 生成漂亮的文档。5.2 项目亮点提炼与面试准备当你对这个项目足够熟悉后需要提炼出能写在简历上和面试中讲出来的点技术栈SpringBoot 2.x, Vue 3 Composition API, Element Plus, Axios, MyBatis/MyBatis-Plus, MySQL。核心实现实现了前后端完全分离通过 RESTful API 进行数据交互。前端使用 Vue Router 管理路由Pinia/Vuex 进行状态管理如果用了。后端采用 MVC 分层架构全局统一异常处理和响应封装。使用 MyBatis 动态 SQL 构建灵活的条件查询。实现了基于 Token 或 Session 的用户认证与权限拦截。遇到的问题与解决跨域问题通过配置后端CrossOrigin注解或前端vue.config.js的proxy解决。前后端数据格式对接明确了日期时间等字段使用字符串传输如yyyy-MM-dd HH:mm:ss还是时间戳。分页查询性能在数据量大时深入理解了数据库分页LIMIT的优化以及 MyBatis-Plus 分页插件的使用。重复提交问题在前端按钮添加 loading 状态或后端接口做幂等性处理。6. 避坑指南与进阶思考最后分享几个我多次搭建此类项目后总结的经验能帮你节省大量排查时间。环境问题永远是第一嫌疑犯项目跑不起来90% 的问题出在环境。JDK版本、MySQL版本、Node版本、Maven镜像、npm 源。严格按照项目推荐的版本号来能避免绝大多数玄学问题。先单点测试再整体联调不要一上来就前后端一起跑。先用 Postman 或浏览器直接调用后端接口如GET http://localhost:8080/dish/list确保后端 API 本身是通的、返回数据格式是正确的。然后再去调试前端。善用开发者工具前端调试浏览器 F12 的Network面板是你的眼睛。看请求是否发出、URL 是否正确、请求参数和响应数据是什么。Console面板看 JS 错误。关注日志后端控制台日志、前端终端日志、MySQL 的 general log如果需要。错误信息通常就藏在里面。理解“约定大于配置”SpringBoot 和 Vue CLI 帮你省了很多配置但你也需要知道它们的默认约定是什么。比如 SpringBoot 默认从application.yml读取配置Vue 的别名指向src目录。关于“若依”RuoYi等框架搜索热词里出现了“若依框架前后端分离”。若依是一个功能非常丰富的开源权限管理系统。你现在搭建的这个“美食网站”可以看作是一个简化版、教学版的若依核心部分。如果你把这个项目吃透了再去学习若依会更容易理解其复杂的模块设计和权限模型。反之如果直接上手若依可能会被其庞大的代码量吓到。这个“美食网站”项目本质上是一个“教学模具”。它的价值不在于功能多强大而在于结构清晰、技术栈主流、流程完整。把它当作你进入 SpringBoot Vue3 全栈开发世界的第一块跳板亲手敲一遍改一改踩几个坑再爬出来你的收获会比单纯下载十套源码大得多。
返回列表