SpringBoot+Vue3前后端分离项目实战:两小时部署美食网站
2026/8/15 10:54:33 网站建设 项目流程

这次我们来看一个基于 SpringBoot 和 Vue3 的美食网站项目。对于正在寻找毕业设计、课程设计或者想快速搭建一个完整前后端分离项目的同学来说,这类“开箱即用”的实战项目价值很高。它不只是一个简单的增删改查(CRUD)演示,而是一个具备完整业务逻辑、前后端分离架构、可直接部署运行的实战系统。

这个项目的核心价值在于“快速验证”和“学习复用”。你不需要从零开始搭建脚手架,项目已经集成了 SpringBoot 后端、Vue3 前端、数据库设计以及基础的增删改查功能。本文将带你从零开始,在两小时内完成这个美食网站的部署、运行和功能验证。我们会重点关注项目的环境要求、启动方式、核心功能模块、前后端接口联调,以及如何将其改造为你自己的毕设或简历项目。

1. 核心能力速览

能力项说明
项目类型前后端分离的 Web 应用(美食信息管理网站)
技术栈后端:SpringBoot + MyBatis-Plus + MySQL
前端:Vue3 + Element Plus + Axios
核心功能美食信息管理(增删改查)、分类管理、用户管理、图片上传等
硬件门槛普通开发电脑即可,无特殊 GPU 要求。主要依赖 JDK、Node.js、MySQL。
启动方式后端:通过 IDE(如 IDEA)启动或mvn spring-boot:run
前端:npm run dev启动开发服务器
接口能力提供标准的 RESTful API,支持前端调用,便于二次开发和接口测试。
批量任务不涉及复杂的 AI 批量任务,但数据导入导出、批量删除等属于常规业务功能。
适合场景毕业设计/课程设计个人学习/练手项目简历项目经验快速原型验证

2. 适用场景与使用边界

这个项目非常适合以下几类开发者:

  1. 在校学生(毕设/课设):需要一个结构完整、技术栈主流、有源码可参考的项目作为基础。你可以在此基础上修改主题(如改为图书管理、旅游景点等),快速完成自己的设计。
  2. 求职者(丰富简历):需要一个真实的项目来展示你对 SpringBoot、Vue3、前后端分离、RESTful API 等技术的理解和应用能力。
  3. 全栈入门学习者:想通过一个完整项目,理解前后端如何分工协作、接口如何定义和调用、数据如何流动。
  4. 快速原型验证:需要快速搭建一个带后台管理功能的信息展示网站原型。

使用边界与注意事项:

  • 非生产级:该项目主要面向学习和演示,在安全性(如 SQL 注入防护、XSS 攻击)、性能优化(如缓存、数据库连接池调优)、高并发处理等方面可能未做深度优化,不建议直接用于生产环境
  • 版权与合规:如果项目中使用了示例图片或数据,在你自己部署和展示时,请确保替换为拥有合法版权的素材,避免侵权风险。
  • 功能边界:项目聚焦于经典的“增删改查”及管理后台,不包含在线支付、即时通讯、复杂推荐算法等高级功能。但它的架构清晰,非常适合作为添加这些功能的起点。

3. 环境准备与前置条件

在开始之前,请确保你的开发环境满足以下要求。这是项目能够成功运行的基础。

操作系统:Windows 10/11, macOS, Linux (如 Ubuntu) 均可。内存:建议 8GB 及以上。磁盘空间:至少预留 2GB 空间用于安装环境和项目文件。

软件环境清单:

  1. Java 开发环境

    • JDK:版本 8 或 11(推荐 JDK 11,与 SpringBoot 2.x/3.x 兼容性更好)。安装后配置JAVA_HOME环境变量。
    • Maven:用于管理项目依赖和构建。安装后配置MAVEN_HOME并将bin目录加入PATH
    • IDE(可选但推荐):IntelliJ IDEA(社区版或旗舰版)或 Eclipse。IDEA 对 SpringBoot 和 Maven 的支持更友好。
  2. 前端开发环境

    • Node.js:版本 16.x 或 18.x(推荐 LTS 版本)。安装包自带npm
    • 包管理工具:使用npmyarn。本文以npm为例。
  3. 数据库

    • MySQL:版本 5.7 或 8.0。需要提前安装并启动 MySQL 服务。
    • 数据库管理工具(可选):Navicat、DBeaver 或 MySQL Workbench,用于执行 SQL 脚本和查看数据。

环境验证命令:打开终端(Windows 下为 CMD 或 PowerShell),依次执行以下命令,确认版本信息正常输出。

# 检查 Java 版本 java -version # 检查 Maven 版本 mvn -v # 检查 Node.js 和 npm 版本 node -v npm -v # 检查 MySQL 是否可连接 (假设用户为 root,按提示输入密码) mysql -u root -p -e "SELECT VERSION();"

4. 安装部署与启动方式

假设你已经从提供的源码链接下载了项目压缩包并解压。项目目录结构通常如下:

food-website/ ├── backend/ # SpringBoot 后端项目 │ ├── src/ │ ├── pom.xml │ └── ... ├── frontend/ # Vue3 前端项目 │ ├── src/ │ ├── package.json │ └── ... └── database/ # 数据库 SQL 脚本 └── food_db.sql

4.1 数据库初始化

  1. 登录 MySQL,创建一个新的数据库,例如food_db
    CREATE DATABASE IF NOT EXISTS `food_db` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE `food_db`;
  2. 执行database/food_db.sql脚本文件。你可以使用命令行或图形化工具导入。
    # 命令行方式 (在包含sql文件的目录下执行) mysql -u root -p food_db < food_db.sql
    执行成功后,数据库中将创建所需的表(如foodcategoryuser等)并可能插入一些示例数据。

4.2 后端项目配置与启动

  1. 导入项目:使用 IDEA 打开backend文件夹。IDEA 会自动识别为 Maven 项目并开始下载依赖。
  2. 修改配置文件:找到后端项目的配置文件,通常是src/main/resources/application.ymlapplication.properties关键修改项是数据库连接信息
    # application.yml 示例 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/food_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root # 你的数据库用户名 password: your_password # 你的数据库密码 servlet: multipart: max-file-size: 10MB # 文件上传大小限制 max-request-size: 10MB
  3. 启动后端服务
    • 方式一(IDEA):找到包含@SpringBootApplication注解的主类(如FoodApplication),右键点击Run
    • 方式二(命令行):在backend目录下执行mvn spring-boot:run。 启动成功后,控制台会输出类似Tomcat started on port(s): 8080的信息。此时,SpringBoot 后端服务已在http://localhost:8080运行。

4.3 前端项目配置与启动

  1. 安装依赖:打开终端,进入frontend目录,执行npm install。这会根据package.json安装所有前端依赖包(如 Vue3, Element Plus, Axios 等)。网络状况会影响安装速度。
  2. 配置接口代理(关键步骤):前端开发服务器需要能访问后端 API。修改frontend/vite.config.js(或vue.config.js,取决于项目构建工具)中的代理配置。
    // vite.config.js 示例 import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' export default defineConfig({ plugins: [vue()], server: { port: 3000, // 前端开发服务器端口 proxy: { '/api': { // 将所有以 /api 开头的请求转发到后端 target: 'http://localhost:8080', // 后端服务地址 changeOrigin: true, // rewrite: (path) => path.replace(/^\/api/, '') // 根据后端实际接口路径决定是否需要重写 } } } })
  3. 启动前端服务:在frontend目录下执行npm run dev。启动成功后,终端会提示访问地址,通常是http://localhost:3000

访问系统:打开浏览器,访问http://localhost:3000。如果一切顺利,你将看到美食网站的前端界面。后端接口服务在http://localhost:8080运行,前端通过代理访问它。

5. 功能测试与效果验证

项目启动后,我们需要系统性地验证其核心功能是否正常工作。以下是按模块进行的测试流程。

5.1 用户登录与权限验证

  1. 测试目的:验证系统基础访问控制是否正常。
  2. 操作步骤
    • 访问http://localhost:3000,应跳转到登录页。
    • 使用database/food_db.sql中提供的默认账号(如admin/admin123)进行登录。
  3. 预期结果:登录成功,跳转到系统主页面(如仪表盘或美食列表页)。
  4. 判断成功:页面成功跳转,且浏览器开发者工具(F12 -> Network)中,登录请求(如/api/user/login)返回成功状态码(如 200)和 token 信息。
  5. 常见失败原因
    • 数据库连接失败:检查后端配置文件中的数据库信息。
    • 用户不存在或密码错误:检查 SQL 脚本中的初始数据。
    • 前端代理配置错误:检查vite.config.js中的target地址是否正确指向后端服务。

5.2 美食信息管理(增删改查 - CRUD)

这是项目的核心功能模块。

  1. 查询列表

    • 操作:进入“美食管理”或类似菜单页面。
    • 预期:页面应展示美食列表,包含名称、分类、价格、图片等字段。列表应能正常分页。
    • 验证:查看浏览器 Network,应有类似GET /api/food/list?page=1&size=10的请求,并成功返回数据。
  2. 新增美食

    • 操作:点击“新增”按钮,填写表单(名称、分类、价格、描述、上传图片),提交。
    • 预期:提交后,列表刷新,新数据出现在列表中。上传的图片应能正确显示。
    • 验证:Network 中应有POST /api/food请求,状态码为 200 或 201。检查数据库food表,确认数据已插入。
  3. 编辑美食

    • 操作:在列表点击某条数据的“编辑”按钮,修改信息后保存。
    • 预期:列表对应数据更新为修改后的内容。
    • 验证:Network 中应有PUT /api/food/{id}请求。检查数据库对应记录是否更新。
  4. 删除美食

    • 操作:点击某条数据的“删除”按钮,确认删除。
    • 预期:该条数据从列表中消失。
    • 验证:Network 中应有DELETE /api/food/{id}请求。检查数据库对应记录是否被删除(可能是逻辑删除,设置deleted标志位)。

5.3 分类管理功能

  1. 测试目的:验证与美食关联的“分类”数据的管理功能。
  2. 操作:进入“分类管理”页面,尝试对分类进行增删改查操作。
  3. 预期:分类的增删改查功能正常。在新增或编辑美食时,下拉框中能正确加载出已创建的分类列表。
  4. 关联性验证:删除一个已被美食使用的分类时,系统应有合理的处理(如禁止删除、提示存在关联数据)。

5.4 图片上传功能

  1. 测试目的:验证文件上传功能是否正常,图片是否可正确存储和访问。
  2. 操作:在新增或编辑美食时,点击上传组件,选择一张本地图片(JPG/PNG)。
  3. 预期
    • 前端显示上传进度和预览图。
    • 提交后,美食列表或详情中能通过http://localhost:8080/uploads/xxx.jpg这样的 URL 访问到图片。
  4. 验证
    • 检查后端控制台,确认图片已保存到配置的目录(如D:/upload./uploads)。
    • 检查返回的数据中,图片字段存储的是相对路径或可访问的 URL。
  5. 常见问题
    • 上传失败:检查后端application.ymlspring.servlet.multipart配置的文件大小限制。检查上传目录的读写权限。
    • 图片无法访问:检查后端是否配置了静态资源映射。例如,在 SpringBoot 中可能需要WebMvcConfigurer/uploads/**路径映射到本地文件目录。

6. 接口 API 与二次开发

理解并能够调用项目的 API,是进行二次开发的基础。

6.1 接口文档与测试

  1. 查找接口文档:许多 SpringBoot 项目会集成 Swagger 或 Knife4j 来自动生成 API 文档。启动后端服务后,尝试访问以下地址:
    • http://localhost:8080/swagger-ui.html
    • http://localhost:8080/doc.html如果成功,你将看到一个可视化的接口测试页面,可以查看所有接口的详细参数并在线调试。
  2. 使用 Postman 测试:如果没有集成文档,可以通过浏览器 Network 面板查看请求格式,然后使用 Postman 等工具独立测试 API。
    • 获取美食列表:GET http://localhost:8080/api/food/list?page=1&size=10
    • 新增美食:POST http://localhost:8080/api/food(Body: JSON, Headers:Content-Type: application/json)

6.2 二次开发示例:添加一个“搜索”功能

假设你想在美食列表上增加按名称关键字搜索的功能。

  1. 后端修改(Java)

    • FoodController中新增一个方法。
    // FoodController.java @GetMapping("/list") public Result list(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer size, @RequestParam(required = false) String name) { // 新增参数 QueryWrapper<Food> queryWrapper = new QueryWrapper<>(); if (StringUtils.isNotBlank(name)) { queryWrapper.like("food_name", name); // 假设数据库字段是 food_name } Page<Food> pageInfo = new Page<>(page, size); IPage<Food> pageResult = foodService.page(pageInfo, queryWrapper); return Result.success(pageResult); }
    • 修改对应的 Service 层和 Mapper 层(如果使用 MyBatis-Plus,通常只需修改 Controller 和 QueryWrapper)。
  2. 前端修改(Vue3)

    • 在美食列表页的 Vue 组件中,添加一个输入框和搜索按钮。
    <!-- FoodList.vue 模板部分 --> <el-input v-model="searchName" placeholder="请输入美食名称" style="width: 200px;" /> <el-button type="primary" @click="handleSearch">搜索</el-button>
    // FoodList.vue 脚本部分 import { ref } from 'vue'; import { getFoodList } from '@/api/food'; // 假设有封装好的API const searchName = ref(''); const tableData = ref([]); const pageInfo = ref({current: 1, size: 10, total: 0}); const loadData = async () => { const params = { page: pageInfo.value.current, size: pageInfo.value.size, name: searchName.value // 传递搜索参数 }; const res = await getFoodList(params); tableData.value = res.data.records; pageInfo.value.total = res.data.total; }; const handleSearch = () => { pageInfo.value.current = 1; // 搜索时回到第一页 loadData(); }; // 初始化加载 onMounted(() => { loadData(); });
    • 修改@/api/food.js中的getFoodList函数,使其接受params对象。

通过这个简单的例子,你可以了解如何在现有项目基础上进行功能扩展。

7. 资源占用与性能观察

对于此类业务管理系统,性能瓶颈通常出现在数据库和前端资源加载上。

  1. 内存与 CPU 占用
    • 后端(SpringBoot):启动后,在任务管理器或系统监视器中,Java 进程通常占用 300MB - 800MB 内存,具体取决于堆内存设置(-Xmx)和项目复杂度。在低并发下 CPU 占用很低。
    • 前端(Node Dev Server):开发服务器npm run dev进程内存占用约 100MB - 200MB。生产构建后,静态资源由 Nginx 等服务器提供,不占用 Node 运行时内存。
  2. 数据库连接:观察 MySQL 连接数。在简单的增删改查操作下,连接数很少。如果遇到“连接池耗尽”错误,需要检查后端配置(如spring.datasource.hikari.maximum-pool-size)。
  3. 前端资源加载性能
    • 打开浏览器开发者工具的Network标签页,禁用缓存(Disable cache),刷新页面。
    • 观察.js,.css, 图片等资源的加载时间和大小。如果vendor.js文件过大(>1MB),可能需要考虑前端路由懒加载或组件库按需引入优化。
  4. API 响应时间
    • 在开发者工具 Network 中,查看关键 API 请求(如/api/food/list)的Time列。在本地开发环境,响应时间应在几十到几百毫秒内。如果过慢,可能是数据库查询未加索引或逻辑复杂。

8. 常见问题与排查方法

在部署和运行过程中,你可能会遇到以下问题。这里提供系统的排查思路。

问题现象可能原因排查方式解决方案
后端启动失败,端口冲突8080 端口被其他程序(如另一个SpringBoot应用、Tomcat)占用。1. 查看后端启动日志中的错误信息。
2. 命令行执行netstat -ano | findstr :8080(Win) 或lsof -i:8080(Mac/Linux)。
1. 终止占用端口的进程。
2. 修改application.yml中的server.port为其他端口(如 8081)。
前端npm install失败1. 网络问题,无法连接 npm 仓库。
2. Node.js 版本不兼容。
3. 项目依赖包冲突。
1. 检查网络,尝试ping registry.npmjs.org
2. 检查package.json中的engines字段。
3. 查看报错信息,通常是某个包安装失败。
1. 配置 npm 国内镜像源:npm config set registry https://registry.npmmirror.com
2. 使用与项目要求匹配的 Node.js 版本。
3. 删除node_modulespackage-lock.json,重新npm install
前端访问localhost:3000报错(连接失败)前端开发服务器未成功启动。查看运行npm run dev的终端窗口,是否有错误输出。根据终端错误信息解决,常见于端口被占用或依赖缺失。可尝试修改vite.config.js中的server.port
前端页面能打开,但数据加载失败(Network 中 API 请求报错)1. 后端服务未运行。
2. 前端代理配置错误。
3. 后端接口路径与前端请求路径不匹配。
4. 跨域问题(CORS)。
1. 确认http://localhost:8080是否可以访问。
2. 检查vite.config.js中的proxy配置。
3. 对比前端请求的 URL 和后端 Controller 定义的@RequestMapping路径。
4. 查看浏览器 Console 是否有 CORS 错误。
1. 启动后端服务。
2. 修正代理配置的target
3. 统一前后端接口路径前缀,或使用代理的rewrite规则。
4. 在后端添加 CORS 配置(@CrossOrigin或全局配置)。
图片上传成功但无法显示1. 图片保存路径不正确。
2. 静态资源未映射。
3. 返回给前端的图片路径是本地绝对路径。
1. 检查后端代码中文件保存的目录是否存在、是否有写入权限。
2. 检查后端是否配置了WebMvcConfigurer将 URL 路径映射到磁盘目录。
3. 查看返回的图片字段值。
1. 确保保存目录正确且可写。
2. 添加静态资源映射配置。
3. 确保返回的是可通过 Web 访问的相对路径或完整 URL(如/uploads/filename.jpg)。
数据库连接失败1. MySQL 服务未启动。
2.application.yml中的数据库配置(url, username, password)错误。
3. 数据库驱动版本不匹配。
查看后端启动日志,会有明确的数据库连接错误信息。1. 启动 MySQL 服务。
2. 仔细核对配置文件,特别是密码中的特殊字符。
3. 检查pom.xml中的mysql-connector-java版本是否与 MySQL 版本兼容。

9. 最佳实践与使用建议

为了让这个项目更好地服务于你的学习和开发,这里有一些建议:

  1. 代码阅读与理解:在运行起来之后,不要止步于功能。花时间阅读后端 Controller、Service、Mapper 层的代码,以及前端的 Vue 组件、路由、状态管理(如 Pinia)和 API 封装。理解数据是如何从数据库到前端页面渲染出来的。
  2. 数据库设计学习:打开food_db.sql文件,研究表结构设计。思考字段类型、索引、外键关联的设计原因。这是学习数据库设计的好样本。
  3. 修改为你的项目
    • 改主题:将“美食”实体改为“图书”、“电影”、“商品”、“旅游景点”等。这需要修改表名、字段名、Java 实体类、前端页面文本和图片。
    • 加功能:在现有 CRUD 基础上,尝试添加“收藏”、“评论”、“点赞”、“购物车”等常见业务模块。
    • 换 UI:尝试使用不同的 Vue UI 组件库,如 Ant Design Vue、Naive UI,来重构前端界面。
  4. 版本管理:立即将项目导入到 Git(如 GitHub、Gitee),并做出你的第一次修改提交。这是良好的开发习惯。
  5. 部署尝试:学习如何将该项目部署到云服务器。后端可以打包成 Jar 文件用java -jar运行,前端使用npm run build生成静态文件,然后用 Nginx 托管。这能让你了解应用从开发到上线的完整流程。
  6. 安全与合规:如果项目用于展示或作为毕设,务必替换所有示例数据(尤其是图片),使用自己拥有版权或符合 CC0 协议的素材,避免侵权风险。

10. 总结与下一步

这个 SpringBoot + Vue3 美食网站项目是一个典型且实用的前后端分离实战案例。它的最大价值在于提供了一个立即可运行、结构清晰、技术栈主流的代码框架,让你能跳过繁琐的脚手架搭建,直接聚焦于业务功能的理解和扩展。

最值得尝试的点

  • 快速获得成就感:按照本文步骤,你可以在两小时内看到一个功能完整的网站跑起来。
  • 学习完整链路:从数据库设计、后端 API 开发到前端页面交互,你能看到全栈开发的每一个环节。
  • 极佳的二次开发基础:代码结构规范,非常适合在其基础上修改、添加功能,变成你自己的项目。

最先应该验证的功能:务必按顺序完成数据库初始化 -> 后端启动 -> 前端启动 -> 登录系统 -> 美食增删改查这条主线。这是项目最核心的流程,打通了它,就证明基础环境完全没问题。

最容易踩的坑

  1. 环境变量和配置:JDK版本、Node版本、MySQL密码、配置文件中的数据库连接字符串,任何一个出错都会导致启动失败。务必仔细核对。
  2. 前后端联调:80% 的问题出在代理配置或 CORS 上。善用浏览器开发者工具的 Network 和 Console 面板进行调试。
  3. 图片上传路径:理解文件是如何从前端表单传到后端,并最终通过 HTTP 服务被访问的。

后续扩展方向

  • 引入状态管理:如果项目未使用,可以尝试集成 Pinia 来管理全局状态(如用户信息)。
  • 添加权限控制:实现更细粒度的角色权限管理(RBAC),例如管理员和普通用户的不同菜单和操作权限。
  • 优化性能:为频繁查询的数据库字段添加索引,引入 Redis 缓存热点数据,前端组件和路由做懒加载。
  • 容器化部署:学习使用 Docker 和 Docker Compose 将后端、前端、数据库打包成容器,实现一键部署。

建议将本文和项目源码一起收藏,作为你未来开发类似管理系统的一个快速参考模板。当你需要搭建一个新项目时,这个经过验证的框架能为你节省大量初期搭建的时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询