ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

SpringBoot+Vue3美食网站管理系统:1小时搭建完整前后端分离项目

2026/9/2 9:34:46 拓冰建站 浏览量
SpringBoot+Vue3美食网站管理系统:1小时搭建完整前后端分离项目 1. 这个项目解决什么问题以及它适合谁如果你正在找一个能快速跑起来、代码结构清晰、并且能直接写到简历里的前后端分离项目这个 SpringBoot Vue3 的美食网站管理系统就是一个非常典型的选择。它核心解决的就是一个“从零到一”的完整 Web 应用搭建问题。对于学生来说这是一个绝佳的毕业设计或课程设计模板涵盖了用户管理、菜品管理、订单管理等常见业务模块直接演示了增删改查CRUD的核心操作。对于刚入行的开发者这是一个理解前后端分离架构、接口联调、项目部署的实战案例比只看文档和零散教程要直观得多。最关键的价值在于“可运行”。很多教学项目要么前端过时要么后端配置复杂环境都搭不起来。这个项目标榜“1小时搭建”、“完美运行”重点就在于它提供了一个经过整合、依赖清晰、配置相对完整的起点。你不用再花几天时间去解决各种版本冲突和环境问题可以直接聚焦在业务逻辑和代码理解上。下面我会按照实际落地的顺序带你从环境准备、项目启动、功能验证到关键代码解析走一遍并补充那些教程里通常不会细说但实际开发中一定会遇到的“坑点”。2. 环境准备别在第一步就卡住在下载源码之前先把环境理顺。很多“跑不起来”的问题根源都在环境。2.1 后端环境 (Java/SpringBoot 侧)JDK这是必须的。建议使用 JDK 8 或 JDK 11这是 SpringBoot 2.x 系列最兼容的版本。即使项目可能支持更高版本从稳定角度出发先用这两个版本之一。验证打开命令行输入java -version和javac -version确保版本号显示正确且两个命令显示的版本一致。MavenSpringBoot 项目通常用 Maven 管理依赖。你需要安装并配置 Maven并设置好本地仓库路径和国内镜像源如阿里云镜像这能极大加快依赖下载速度。验证命令行输入mvn -v显示版本信息即表示安装成功。IDEIntelliJ IDEA社区版或旗舰版是首选。它对 SpringBoot 和 Maven 的支持最好。Eclipse 配合 STS 插件也可以但 IDEA 在自动提示和项目结构解析上更省心。数据库通常是 MySQL。你需要本地安装一个 MySQL5.7或8.0版本并创建一个空的数据库例如food_website。记住数据库的连接信息地址localhost、端口3306、用户名、密码。注意项目源码里会有一个SQL脚本文件通常是sql/目录下的.sql文件在启动项目前需要先在 MySQL 中执行这个脚本来创建表和初始化数据。2.2 前端环境 (Vue3 侧)Node.jsVue3 项目运行和构建的基础。建议安装LTS长期支持版本比如 Node.js 18.x 或 20.x。避免使用太新或太旧的版本。验证命令行输入node -v和npm -v显示版本号。包管理器npm 会随 Node.js 一起安装。但更推荐使用yarn或pnpm它们在依赖安装速度和磁盘空间利用上更有优势。你可以通过npm install -g yarn来安装 yarn。IDEVisual Studio Code 是前端开发的事实标准轻量且插件生态丰富。必备插件VolarVue3官方推荐语言支持、ESLint、Prettier、Auto Close Tag 等。2.3 项目源码准备拿到源码压缩包后不要急着打开。先解压到一个没有中文和空格的路径下例如D:\Projects\food-website。路径中的中文或空格可能导致各种意想不到的构建或运行错误。解压后观察目录结构通常会是这样的food-website/ ├── backend/ # SpringBoot 后端项目 │ ├── src/ │ ├── pom.xml # Maven 配置文件 │ └── ... ├── frontend/ # Vue3 前端项目 │ ├── src/ │ ├── package.json # 前端依赖配置文件 │ └── ... └── sql/ # 数据库初始化脚本 └── food_website.sql如果结构不同请根据实际情况调整后续步骤。3. 后端启动与配置先让服务跑起来后端是数据核心先确保它能独立运行。3.1 导入与依赖下载用 IntelliJ IDEA 打开backend文件夹。IDEA 会自动识别为 Maven 项目并开始下载pom.xml中声明的依赖。这个过程取决于你的网速和镜像配置可能需要几分钟。观察 IDEA 右下角的进度条。常见坑点如果依赖下载失败或卡住大概率是 Maven 仓库镜像问题。检查你的 Maven 配置文件~/.m2/settings.xml确保配置了国内镜像。没有这个文件网上搜索“Maven 阿里云镜像配置”按教程创建一个。3.2 数据库配置这是最关键的一步配置错了后端连不上数据库一切白搭。找到后端项目的配置文件通常是src/main/resources/application.yml或application.properties。找到关于数据库的配置部分它大概长这样YAML格式示例spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/food_website?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai username: root password: 123456将url中的数据库名food_website、username和password修改为你本地 MySQL 实际的信息。特别注意如果使用 MySQL 8.0驱动类名com.mysql.cj.jdbc.Driver和连接参数serverTimezone通常是必须的。如果是 MySQL 5.7驱动可能是com.mysql.jdbc.Driver且不需要时区参数。以你实际安装的 MySQL 版本为准。3.3 执行SQL脚本与启动用 MySQL 客户端如命令行、Navicat、MySQL Workbench连接你的数据库。执行项目附带的sql/food_website.sql文件。这会创建所有必要的表如user,dish,order等并可能插入一些测试数据。回到 IDEA找到主启动类。它通常被SpringBootApplication注解修饰名字类似FoodWebsiteApplication或Application。右键点击这个类选择Run ‘FoodWebsiteApplication‘。观察控制台日志。如果启动成功你会看到类似Tomcat started on port(s): 8080和Started FoodWebsiteApplication in 5.123 seconds的信息。启动失败排查“Cannot determine embedded database driver class for database type NONE”数据库配置错误或没连上。双重检查application.yml和数据库服务是否启动。“Table ‘xxx’ doesn‘t exist”忘记执行 SQL 初始化脚本。端口8080被占用可以在application.yml中修改server.port为其他端口如8090。依赖冲突观察错误日志看是否有明显的类找不到ClassNotFoundException或方法不兼容。可以尝试在 IDEA 中执行mvn clean compile命令。后端成功启动后你可以打开浏览器访问http://localhost:8080或你指定的端口。如果返回一个空白页或简单的错误页如 Whitelabel Error Page这是正常的因为后端默认没有提供前端页面它只提供 API 接口。我们可以通过下一步的前端来验证接口。4. 前端启动与联调让页面动起来前端负责展示和交互它通过调用后端 API 来获取和操作数据。4.1 安装依赖与配置代理用 VS Code 打开frontend文件夹。打开终端Terminal确保路径在前端项目根目录下。安装依赖运行npm install或yarn install或pnpm install取决于你使用的包管理器。这个过程也会下载大量包请耐心等待。依赖安装慢或失败同样配置国内镜像。对于 npm可以运行npm config set registry https://registry.npmmirror.com。对于 yarn可以修改~/.yarnrc文件。配置开发服务器代理前端在开发时npm run dev运行在独立的端口如:5173为了能访问到后端 API:8080且避免跨域问题需要配置代理。找到vite.config.jsVue3项目大概率使用 Vite或vue.config.js在里面配置proxy// vite.config.js 示例 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/, ) // 如果需要重写路径 } } } })这样前端代码中请求/api/user/list开发服务器就会将其代理到http://localhost:8080/api/user/list。4.2 启动前端并验证在终端运行启动命令通常是npm run dev或yarn dev。控制台会输出本地访问地址通常是http://localhost:5173。用浏览器打开这个地址。如果页面成功加载出现登录页或管理后台界面说明前端本身运行正常。验证前后端联通这是关键一步。打开浏览器的开发者工具F12切换到Network网络标签页。在登录页面输入账号密码通常是SQL脚本中初始化的如 admin/123456点击登录。观察网络请求列表应该能看到一个向/api/login或类似地址发起的POST请求。点击这个请求查看详情。成功标志该请求的Status状态为200并且Response响应里返回了登录成功的信息如 token、用户信息。同时页面应该跳转到后台主页。失败标志状态码为404接口地址不对、500后端服务器内部错误或403权限问题。此时需要根据错误信息检查代理配置是否正确、后端接口是否真的存在、以及登录逻辑。4.3 功能模块测试增删改查登录成功后你应该能看到菜单包含“用户管理”、“菜品管理”、“订单管理”等模块。请逐一测试查Retrieve进入“菜品管理”页面列表数据应该能正常加载出来。检查网络请求看调用的是哪个 GET 接口如/api/dish/list。增Create点击“新增”按钮填写表单提交。观察网络请求应该是一个 POST 请求到类似/api/dish的接口。成功后列表应刷新或出现新增的数据。改Update点击某条数据的“编辑”按钮修改信息后提交。网络请求应该是一个 PUT 或 POST 请求到/api/dish/{id}。提交后查看数据是否更新。删Delete点击“删除”按钮通常会弹出确认框。确认后网络请求应该是一个 DELETE 请求到/api/dish/{id}。数据应从列表中消失。在这一步你的目标不是理解所有代码而是确保整个应用流程是通的。如果增删改查都能正常完成恭喜你这个项目的基本骨架已经成功运行在你的机器上了。5. 代码结构解析理解如何组织项目能跑通之后我们才进入代码学习阶段。盲目看代码效率很低先理解目录结构。5.1 后端代码结构 (SpringBoot)典型的基于 Controller-Service-Mapper 的分层结构src/main/java/com/example/food/ ├── config/ # 配置类如跨域配置、安全配置 ├── controller/ # 控制层接收HTTP请求调用Service返回结果 │ └── DishController.java # 菜品相关的接口如 /dish/list, /dish/{id} ├── entity/ # 实体类与数据库表一一对应 │ └── Dish.java # 菜品实体定义id、name、price等属性 ├── mapper/ # 数据访问层MyBatis接口或JPA Repository │ └── DishMapper.java # 定义操作dish表的SQL方法 ├── service/ # 业务逻辑层 │ ├── DishService.java # 业务接口 │ └── impl/ │ └── DishServiceImpl.java # 业务实现调用Mapper完成CRUD └── dto/ # 数据传输对象用于接口入参和出参 └── DishDTO.java # 可能比Entity包含更多或更少的字段数据流浏览器请求 - Controller - Service - Mapper - 数据库 - 返回数据逆向返回给浏览器。5.2 前端代码结构 (Vue3 Vite Element Plus)典型的基于路由和组件的 SPA 结构src/ ├── api/ # 封装所有对后端API的请求函数 │ └── dish.js # 例如包含getDishList, addDish, updateDish等方法 ├── router/ # 路由配置定义路径和组件的映射关系 │ └── index.js ├── store/ # 状态管理如Pinia管理用户登录状态等全局数据 │ └── user.js ├── views/ # 页面级组件 │ ├── Login.vue # 登录页 │ └── dish/ │ ├── DishList.vue # 菜品列表页 │ └── DishForm.vue # 菜品新增/编辑表单组件 ├── components/ # 可复用的公共组件如搜索框、分页器 └── utils/ # 工具函数如请求封装、日期格式化交互流用户点击 - Vue组件方法被调用 - 调用 api/ 下的函数 - 发送HTTP请求到后端 - 接收响应 - 更新组件数据或状态 - 视图重新渲染。6. 核心功能点与自定义修改理解结构后你可以针对性地学习或修改核心功能这才是把项目变成“你自己的”关键。6.1 如何添加一个新的管理模块例如“优惠券管理”这是一个经典的练习能串联起前后端所有知识点。后端步骤设计数据库表在 MySQL 中创建coupon表定义字段id, name, type, value, ...。创建实体类在entity包下创建Coupon.java使用注解如TableName,Data映射到coupon表。创建Mapper在mapper包下创建CouponMapper.java接口继承 MyBatis-Plus 的BaseMapperCoupon基础的CRUD方法就自动拥有了。创建Service在service包下创建CouponService接口和CouponServiceImpl实现类注入CouponMapper编写业务逻辑。创建Controller在controller包下创建CouponController.java使用RestController和RequestMapping(“/api/coupon”)注解注入CouponService编写GetMapping,PostMapping,PutMapping,DeleteMapping等方法。重启后端使用 API 测试工具如 Postman测试/api/coupon/list等接口是否正常。前端步骤创建API文件在src/api/下创建coupon.js使用封装好的请求工具通常是axios定义getCouponList,addCoupon等方法。创建路由在router/index.js中添加新路由指向即将创建的优惠券列表页面。创建页面组件在src/views/下创建coupon/目录里面创建CouponList.vue列表页和CouponForm.vue表单页。在列表页中使用onMounted生命周期钩子在页面加载时调用getCouponListAPI 获取数据。使用ref或reactive定义响应式数据如tableData来存储列表。使用 Element Plus 的el-table组件渲染表格。绑定“新增”、“编辑”、“删除”按钮的事件调用对应的 API 方法。在表单页中使用el-form创建表单处理表单提交和回显逻辑。将新菜单添加到侧边栏通常需要修改src/layout/components/Sidebar.vue或相关的菜单配置文件添加新的路由项。完成以上步骤一个新的、完整的增删改查模块就添加成功了。这个过程能让你深刻理解前后端分离的数据流转。6.2 如何理解并修改“增删改查”的底层逻辑以“删除菜品”为例我们跟踪一下代码前端点击删除按钮在DishList.vue中点击事件触发一个方法例如handleDelete(row)。调用API该方法内部调用api/dish.js中定义的deleteDish(id)函数。发送请求deleteDish函数使用axios发送一个DELETE请求到http://localhost:5173/api/dish/{id}注意这里被开发服务器代理到了后端:8080。后端Controller接收DishController中的deleteDish(PathVariable Long id)方法被调用。调用ServiceController 调用dishService.deleteDish(id)。执行数据库操作在DishServiceImpl中deleteDish方法内部调用dishMapper.deleteById(id)这个方法是 MyBatis-Plus 提供的。返回结果操作成功后Service 返回 true 或操作成功的消息Controller 将其包装成统一的响应格式如Result.success()返回给前端。前端处理响应前端deleteDishAPI 调用收到成功响应后在.then()中提示用户“删除成功”并重新调用getDishList()刷新表格。如果你想加入逻辑删除将状态标记为删除而非物理删除在dish表中添加一个status或deleted字段。在Dish实体类中添加对应属性。修改DishServiceImpl.deleteDish方法将mapper.deleteById(id)改为mapper.updateById(dish)将dish的status字段更新为“已删除”状态。同时在所有查询列表的地方如list方法需要加上条件where status ‘正常‘。7. 项目打包与部署准备本地开发没问题后你可能需要打包部署到服务器或用于演示。7.1 后端打包 (JAR)在 IDEA 的 Maven 工具窗口右侧边栏找到backend项目下的Lifecycle。依次执行clean清理和package打包。打包成功后在backend/target/目录下会生成一个xxx.jar文件如food-website-0.0.1-SNAPSHOT.jar。这个 JAR 包是可执行的。你可以在命令行确保在 jar 包所在目录用java -jar xxx.jar来运行它。它会内嵌 Tomcat 服务器。生产环境部署将 JAR 包上传到 Linux 服务器使用nohup java -jar xxx.jar app.log 21 命令在后台运行。更专业的做法是使用systemd或 Docker 容器来管理。7.2 前端打包 (静态文件)在前端项目根目录下运行npm run build。这个过程会编译、压缩代码。打包完成后会生成一个dist目录里面是所有静态资源HTML, JS, CSS, 图片。部署方式一分离部署将dist目录下的所有文件放到一个 HTTP 服务器如 Nginx, Apache的网站根目录下。同时Nginx 需要配置反向代理将/api等请求转发到运行后端 JAR 包的真实服务器地址例如http://127.0.0.1:8080。这是最标准的前后端分离部署。部署方式二合并部署SpringBoot 也可以直接提供静态资源。将dist目录下的所有文件复制到后端项目的src/main/resources/static/目录下然后重新打包后端。这样一个 JAR 包就同时包含了前端和后端。访问http://服务器IP:8080就能看到完整应用。这种方式适合小型项目或演示。7.3 数据库迁移本地开发用的是你本机的 MySQL。部署到服务器时需要在服务器上安装 MySQL。将本地的food_website数据库导出为 SQL 文件使用mysqldump命令或客户端工具。在服务器 MySQL 中创建同名数据库并导入 SQL 文件。修改服务器上后端 JAR 包的配置文件或通过启动参数将数据库连接地址、用户名、密码改为服务器的信息。8. 常见问题排查清单当你运行项目不顺利时按这个顺序检查能解决90%的问题后端启动失败现象控制台报错无法启动。检查JDK 版本是否匹配用java -version确认。Maven 依赖是否下载完整尝试mvn clean compile。application.yml中的数据库配置是否正确数据库服务是否启动端口8080是否被其他程序占用可修改server.port。是否执行了初始化的 SQL 脚本前端启动失败或依赖安装慢现象npm install卡住或报错npm run dev失败。检查Node.js 版本是否为 LTS建议 18.x。是否配置了 npm/yarn 国内镜像项目路径是否包含中文或空格终端是否在前端项目根目录下前后端联调失败页面能打开但数据不显示或操作失败现象前端页面空白、列表无数据、登录失败、操作报错。检查打开浏览器开发者工具F12的 Network 标签这是最重要的调试手段。查看 API 请求是否发出状态码是什么404接口地址错误。检查前端请求的 URL 和后端 Controller 的RequestMapping路径是否匹配检查代理配置target是否正确。500后端服务器内部错误。查看后端控制台日志会有详细的错误堆栈信息根据提示修改代码或配置。403权限不足。检查是否已经登录Token 是否有效或者接口是否需要特定角色权限。请求参数格式是否正确查看请求的Payload或Params。后端接收参数用的是RequestBodyJSON还是RequestParamURL参数前后端要一致。响应数据格式是否正确查看响应的Preview或Response。后端返回的是否是前端期望的 JSON 结构打包后运行异常现象开发环境正常打包后运行出错。检查前端打包后静态资源路径是否正确如果部署到非根路径如http://domain.com/myapp/需要在 Vue 项目中配置publicPath。后端打包后配置文件中的数据库连接信息是否还是本地环境生产环境配置应该通过外部配置文件application-prod.yml或启动参数--spring.datasource.url...传入。服务器防火墙是否开放了应用端口如 8080, 80, 443这个项目作为一个学习模板和简历项目是完全合格的。我建议你不要止步于“跑起来”而是按照第6部分的方法亲手添加一个功能模块。这个过程里遇到的每一个错误和解决过程才是你真正的收获。在面试中你能清晰地说出如何从数据库设计到前端展示完成一个功能远比简单说“我做过一个美食网站项目”要有力得多。