1小时搭建SpringBoot+Vue2超市管理系统:课程设计实战指南
30款热门AI模型一站整合DeepSeek/GLM/Claude 随心用限时 5 折。 点击领海量免费额度期末大作业、课程设计、毕业设计这些词对计算机专业的学生来说往往意味着连续数周的熬夜、无尽的Bug和令人焦虑的Deadline。尤其是当任务要求是“开发一个完整的管理系统”时很多同学会陷入一个误区试图从零开始一行行代码去构建结果在环境配置、框架整合、前后端联调这些前期环节就耗费了大量时间真正核心的业务逻辑反而没时间深入。如果你正面临这样的困境这篇文章就是为你准备的。我们不谈空洞的理论不搞复杂的架构直接聚焦一个最实际的目标如何在最短时间内搭建一个能跑起来、功能完整、代码清晰、可直接作为期末大作业或课程设计的SpringBootVue2超市管理系统。本文提供的方案其核心价值不在于技术有多新颖而在于“可复现性”和“教学性”。你将在1小时左右取决于你的网络和熟练度完成从环境准备到系统运行的完整流程。更重要的是你会理解一个典型前后端分离项目的骨架是如何搭建的数据是如何流动的这远比单纯复制代码更有价值。我们将基于最主流的技术栈SpringBoot 2.x Vue2 Element UI MySQL采用前后端分离架构。完成后你将得到一个包含商品管理、员工管理、会员管理、进货/销售统计等核心功能的超市管理系统。文章将附上完整的源码、数据库脚本和项目文档。1. 这篇文章真正要解决的问题效率与理解并重很多同学在接到“开发管理系统”的任务时第一反应是恐惧和茫然。恐惧来自于对完整项目流程的不熟悉茫然则是因为不知道从哪里下手。常见的困境包括环境地狱Node.js、Maven、MySQL版本冲突一个下午都卡在“Hello World”跑不通。前后端割裂后端API写好了前端不知道怎么调用前端页面画好了后端数据对不上。代码堆砌从网上四处搜刮代码片段拼凑出一个能运行的怪物但自己完全看不懂答辩时一问就倒。时间黑洞在非核心的页面样式、基础配置上花费了过多时间导致核心业务逻辑草草了事。本文旨在一次性解决这些问题。我们的目标不是创造一个生产级的复杂系统而是构建一个“教学级”的完整范例。通过这个项目你将清晰地掌握前后端分离的工程结构前后端项目如何独立开发、又如何协同工作。SpringBoot的核心用法如何快速创建RESTful API、连接数据库、进行增删改查。Vue2 Element UI的基础开发模式如何构建页面、发送请求、处理响应。贯穿始终的数据流从前端表单到后端控制器再到数据库最后返回前端的完整链路。如果你需要的是应付期末作业、课程设计或者需要一个入门项目来巩固Java全栈技能那么这就是为你量身定做的指南。2. 核心概念与项目架构解读在动手之前我们先花几分钟理解几个关键概念和本项目的整体架构这能让你在后续操作中“知其然更知其所以然”。2.1 什么是前后端分离在传统的Java Web项目如JSP、Servlet中前端页面HTML和后端逻辑Java是耦合在一起的服务器负责渲染页面。而在前后端分离架构中后端Backend专注于业务逻辑和数据处理提供标准的API接口通常是RESTful API返回JSON或XML格式的数据。它不关心页面长什么样。前端Frontend专注于用户界面和交互通过Ajax如axios库调用后端提供的API获取数据然后动态渲染到页面上。这样做的好处前后端可以并行开发通过API契约进行协作技术选型更灵活后端可以用Java/Go/Python前端可以用Vue/React/Angular更利于后续维护和扩展。2.2 本项目技术栈与职责划分组件技术选型主要职责项目中的位置后端SpringBoot 2.x, MyBatis-Plus, MySQL提供REST API处理商品、员工、订单等业务的增删改查逻辑操作数据库。一个独立的Java工程前端Vue2, Element UI, Axios, Vue Router构建用户界面通过组件化方式开发页面调用后端API实现数据展示和交互。一个独立的Node.js工程数据库MySQL 5.7 / 8.0持久化存储所有业务数据如商品信息、员工信息、销售记录等。独立服务构建工具Maven (后端), npm (前端)管理项目依赖、编译、打包。集成在各自工程中2.3 项目核心模块与功能预览我们将要构建的超市管理系统主要包含以下模块这也是大多数管理系统的通用模板登录模块用户身份验证。仪表盘显示关键数据概览如今日销售额、商品总数等。商品管理对商品信息进行增删改查。员工管理管理系统操作员信息。会员管理管理超市会员信息。进货管理记录商品采购入库信息。销售管理记录商品销售出库信息模拟收银。统计报表基于进货和销售数据生成简单的统计图表。3. 环境准备与前置条件请确保你的开发电脑上已经安装了以下软件这是项目能够运行起来的基石。3.1 基础环境清单Java开发环境JDK版本 1.8 或 11推荐8或11与SpringBoot 2.x兼容性好。安装后配置JAVA_HOME环境变量。验证命令打开命令行输入java -version和javac -version应显示对应版本信息。Node.js环境Node.js版本 12.x 或 14.xVue2对版本要求不苛刻稳定即可。安装时会自带包管理工具npm。验证命令命令行输入node -v和npm -v应显示版本号。数据库环境MySQL版本 5.7 或 8.0。你需要知道root用户的密码或者有权限创建一个新的数据库。可视化工具可选但推荐Navicat、MySQL Workbench或DBeaver用于直观地执行SQL脚本和查看数据。开发工具IDE后端IntelliJ IDEA社区版或旗舰版或 Eclipse。IDEA对SpringBoot支持更好。前端Visual Studio CodeVSCode或 WebStorm。VSCode轻量且插件丰富是前端开发首选。项目管理MavenIDEA已内置无需单独安装。3.2 获取项目资源你需要准备项目的源码、数据库脚本和文档。为了模拟真实场景我们假设你已经从一个可靠的来源如课程老师、开源仓库获得了以下压缩包supermarket-management-system.zip。解压后目录结构应类似于supermarket-management-system/ ├── backend/ # SpringBoot后端项目 ├── frontend/ # Vue2前端项目 ├── database/ # 数据库SQL脚本 │ └── supermarket.sql └── docs/ # 项目说明文档 └── README.md注意在实际操作中请用你实际获得的项目文件替换上述假设。本文的后续步骤将基于这个通用的结构进行讲解。4. 后端项目SpringBoot配置与启动后端是整个系统的大脑我们先让它运行起来。4.1 导入与依赖检查使用 IntelliJ IDEA 打开backend文件夹。等待 IDEA 自动识别为 Maven 项目并下载依赖右下角有进度条。这个过程可能需要几分钟取决于网络速度。打开pom.xml文件确认核心依赖。一个典型的依赖列表如下!-- pom.xml 关键依赖节选 -- dependencies !-- SpringBoot Web 支持提供REST API能力 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- MyBatis-Plus 简化数据库操作 -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.4.x/version !-- 请使用项目实际版本 -- /dependency !-- MySQL 驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency !-- Lombok 简化实体类代码 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency !-- 其他可能存在的依赖如jwt、hutool等 -- /dependencies4.2 数据库初始化打开你的MySQL客户端如命令行、Navicat。创建一个新的数据库用于本项目。例如CREATE DATABASE IF NOT EXISTS supermarket_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;执行database/supermarket.sql脚本。这个脚本通常会做两件事创建所有需要的表如product,employee,member,purchase,sale等。插入一些初始测试数据如默认管理员账号。执行成功后查看supermarket_db数据库应该能看到创建好的表。4.3 修改后端配置文件后端需要知道如何连接你刚创建的数据库。配置文件通常位于src/main/resources/application.yml或application.properties。找到并修改数据库连接信息# application.yml 示例 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver # 请将以下参数替换为你自己的数据库信息 url: jdbc:mysql://localhost:3306/supermarket_db?useUnicodetruecharacterEncodingutf-8useSSLfalseserverTimezoneAsia/Shanghai username: root # 你的数据库用户名 password: 123456 # 你的数据库密码 # MyBatis-Plus 配置 mybatis-plus: 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关键点url中的localhost、3306、supermarket_db以及username、password必须与你本地环境完全匹配。4.4 启动后端服务在 IDEA 中找到主启动类通常命名为XxxApplication.java例如SupermarketApplication.java其位置在src/main/java/com/你的包名/下。右键点击这个类选择Run ‘XxxApplication’。观察控制台日志。如果看到类似以下的输出说明启动成功. ____ _ __ _ _ /\\ / ___‘_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | ‘_ | ‘_| | ‘_ \/ _ | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ‘ |____| .__|_| |_|_| |_\__, | / / / / |_||___//_/_/_/ :: Spring Boot :: (v2.7.18) ... (更多日志) Started SupermarketApplication in 5.123 seconds (JVM running for 6.456)为了验证API是否正常打开浏览器或使用Postman访问http://localhost:8080/api/product/list具体路径请参考项目文档或代码中的RequestMapping注解。如果返回JSON格式的数据或提示信息则证明后端服务运行正常。5. 前端项目Vue2配置与启动后端API就绪后我们来让前端页面跑起来。5.1 安装依赖使用 VSCode 打开frontend文件夹。打开终端Terminal。在VSCode中快捷键是Ctrl。由于npm源在国外可能较慢建议先切换为国内镜像源如淘宝源npm config set registry https://registry.npmmirror.com在终端中进入frontend目录执行安装命令npm install这个命令会根据package.json文件下载所有项目依赖的第三方库如vue, element-ui, axios等。同样需要等待几分钟。5.2 配置API请求地址前端需要知道后端服务的地址在哪里。配置文件通常是src/utils/request.js或vue.config.js也可能在.env.development文件中。常见配置位置一Axios全局配置// src/utils/request.js import axios from ‘axios‘ // 创建一个axios实例 const service axios.create({ baseURL: process.env.VUE_APP_BASE_API, // 从环境变量读取或直接写死 // baseURL: ‘http://localhost:8080‘, // 直接写死后端地址 timeout: 5000 // 请求超时时间 }) // ... 其他拦截器配置 export default service常见配置位置二环境变量文件# .env.development VUE_APP_BASE_API ‘http://localhost:8080‘然后在vue.config.js或上述request.js中通过process.env.VUE_APP_BASE_API引用。关键点确保这里配置的localhost:8080与后端实际运行的地址和端口一致。如果后端修改了端口比如8081这里也必须同步修改。5.3 启动前端开发服务器在终端中确保仍在frontend目录下运行启动命令npm run serve成功启动后终端会显示类似信息App running at: - Local: http://localhost:8081/ - Network: http://192.168.1.100:8081/这表示前端开发服务器已经启动默认端口可能是8080或8081如果8080被后端占用。5.4 访问系统打开浏览器访问终端提示的本地地址如http://localhost:8081。你应该能看到系统的登录界面。使用项目文档或数据库脚本中提供的默认账号通常是admin/123456进行登录。登录成功后将进入系统主界面可以开始体验商品管理、员工管理等各个功能模块。6. 核心功能代码走读与理解项目跑起来了但为了答辩和真正掌握我们需要深入关键代码。这里以最经典的“商品管理”模块为例剖析前后端是如何协作的。6.1 后端商品API接口实现实体类 (Entity)定义商品在Java中的数据结构。// src/main/java/com/supermarket/entity/Product.java package com.supermarket.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.math.BigDecimal; import java.util.Date; Data TableName(product) // 对应数据库表名 public class Product { TableId(type IdType.AUTO) // 主键自增 private Integer id; private String productCode; // 商品编码 private String productName; // 商品名称 private String category; // 商品分类 private BigDecimal price; // 单价 private Integer stock; // 库存 private String unit; // 单位 private String description; // 描述 TableField(fill FieldFill.INSERT) // 自动填充创建时间 private Date createTime; TableField(fill FieldFill.INSERT_UPDATE) // 自动填充更新时间 private Date updateTime; }Mapper接口MyBatis-Plus会为其自动生成基本的CRUD方法。// src/main/java/com/supermarket/mapper/ProductMapper.java package com.supermarket.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.supermarket.entity.Product; import org.apache.ibatis.annotations.Mapper; Mapper public interface ProductMapper extends BaseMapperProduct { // 无需编写XMLBaseMapper已提供insert, deleteById, updateById, selectById, selectList等方法 }服务层 (Service)封装业务逻辑。// src/main/java/com/supermarket/service/ProductService.java package com.supermarket.service; import com.baomidou.mybatisplus.extension.service.IService; import com.supermarket.entity.Product; public interface ProductService extends IServiceProduct { // 可以在此定义复杂的业务方法如扣减库存 boolean reduceStock(Integer productId, Integer quantity); }// src/main/java/com/supermarket/service/impl/ProductServiceImpl.java package com.supermarket.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.supermarket.entity.Product; import com.supermarket.mapper.ProductMapper; import com.supermarket.service.ProductService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; Service public class ProductServiceImpl extends ServiceImplProductMapper, Product implements ProductService { Override Transactional(rollbackFor Exception.class) // 添加事务管理 public boolean reduceStock(Integer productId, Integer quantity) { Product product this.getById(productId); if (product null || product.getStock() quantity) { return false; // 商品不存在或库存不足 } product.setStock(product.getStock() - quantity); return this.updateById(product); } }控制器层 (Controller)接收前端请求调用服务返回JSON。// src/main/java/com/supermarket/controller/ProductController.java package com.supermarket.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.supermarket.common.Result; import com.supermarket.entity.Product; import com.supermarket.service.ProductService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; RestController RequestMapping(/api/product) // 统一API路径前缀 public class ProductController { Autowired private ProductService productService; // 1. 分页查询商品列表 GetMapping(/list) public Result findPage(RequestParam(defaultValue 1) Integer pageNum, RequestParam(defaultValue 10) Integer pageSize, RequestParam(defaultValue ) String productName) { // 支持按名称搜索 QueryWrapperProduct queryWrapper new QueryWrapper(); if (!productName.isEmpty()) { queryWrapper.like(product_name, productName); } PageProduct page productService.page(new Page(pageNum, pageSize), queryWrapper); return Result.success(page); } // 2. 新增商品 PostMapping(/save) public Result save(RequestBody Product product) { // RequestBody 接收JSON格式的请求体 boolean saved productService.save(product); return saved ? Result.success() : Result.error(保存失败); } // 3. 修改商品 PutMapping(/update) public Result update(RequestBody Product product) { boolean updated productService.updateById(product); return updated ? Result.success() : Result.error(更新失败); } // 4. 删除商品 DeleteMapping(/delete/{id}) public Result delete(PathVariable Integer id) { // PathVariable 获取URL路径中的参数 boolean removed productService.removeById(id); return removed ? Result.success() : Result.error(删除失败); } }统一返回结果封装// src/main/java/com/supermarket/common/Result.java package com.supermarket.common; import lombok.Data; import java.io.Serializable; Data public class Result implements Serializable { private Integer code; // 状态码如200成功500失败 private String msg; // 提示信息 private Object data; // 返回的数据 public static Result success() { Result result new Result(); result.setCode(200); result.setMsg(操作成功); return result; } public static Result success(Object data) { Result result success(); result.setData(data); return result; } public static Result error(String msg) { Result result new Result(); result.setCode(500); result.setMsg(msg); return result; } }6.2 前端商品管理页面与API调用API请求封装在src/api/product.js中定义所有与商品相关的请求。// src/api/product.js import request from ‘/utils/request‘ // 导入配置好的axios实例 // 分页查询商品列表 export function getProductList(params) { return request({ url: ‘/api/product/list‘, method: ‘get‘, params: params // { pageNum: 1, pageSize: 10, productName: ‘‘ } }) } // 新增商品 export function addProduct(data) { return request({ url: ‘/api/product/save‘, method: ‘post‘, data: data // { productName: ‘可乐‘, price: 3.0, ... } }) } // 更新商品 export function updateProduct(data) { return request({ url: ‘/api/product/update‘, method: ‘put‘, data: data }) } // 删除商品 export function deleteProduct(id) { return request({ url: /api/product/delete/${id}, method: ‘delete‘ }) }Vue组件商品列表页面src/views/product/ProductList.vue。template div classproduct-container !-- 搜索和新增按钮区域 -- el-form :inlinetrue :modelqueryParams el-form-item label商品名称 el-input v-modelqueryParams.productName placeholder请输入 clearable / /el-form-item el-form-item el-button typeprimary clickhandleSearch搜索/el-button el-button typesuccess clickhandleAdd新增商品/el-button /el-form-item /el-form !-- 商品表格 -- el-table :datatableData border stylewidth: 100% el-table-column propproductCode label商品编码 / el-table-column propproductName label商品名称 / el-table-column propcategory label分类 / el-table-column propprice label单价 / el-table-column propstock label库存 / el-table-column propunit label单位 / el-table-column label操作 width200 template slot-scopescope el-button sizemini clickhandleEdit(scope.row)编辑/el-button el-button sizemini typedanger clickhandleDelete(scope.row.id)删除/el-button /template /el-table-column /el-table !-- 分页组件 -- el-pagination size-changehandleSizeChange current-changehandleCurrentChange :current-pagequeryParams.pageNum :page-sizes[10, 20, 50] :page-sizequeryParams.pageSize layouttotal, sizes, prev, pager, next, jumper :totaltotal /el-pagination !-- 新增/编辑对话框 -- el-dialog :titledialogTitle :visible.syncdialogVisible width40% el-form :modelform :rulesrules refproductForm label-width80px el-form-item label商品名称 propproductName el-input v-modelform.productName / /el-form-item !-- 其他表单项... -- /el-form span slotfooter el-button clickdialogVisible false取消/el-button el-button typeprimary clicksubmitForm确定/el-button /span /el-dialog /div /template script import { getProductList, addProduct, updateProduct, deleteProduct } from ‘/api/product‘ export default { name: ‘ProductList‘, data() { return { tableData: [], // 表格数据 total: 0, // 总条数 queryParams: { // 查询参数 pageNum: 1, pageSize: 10, productName: ‘‘ }, dialogVisible: false, dialogTitle: ‘‘, form: { // 表单数据 id: null, productName: ‘‘, price: 0, stock: 0, // ... }, rules: { // 表单验证规则 productName: [{ required: true, message: ‘请输入商品名称‘, trigger: ‘blur‘ }] } } }, created() { this.fetchData() // 组件创建时加载数据 }, methods: { // 获取表格数据 async fetchData() { try { const res await getProductList(this.queryParams) if (res.code 200) { this.tableData res.data.records this.total res.data.total } } catch (error) { this.$message.error(‘获取数据失败‘) } }, // 搜索 handleSearch() { this.queryParams.pageNum 1 // 搜索时回到第一页 this.fetchData() }, // 新增 handleAdd() { this.dialogTitle ‘新增商品‘ this.form {} // 清空表单 this.dialogVisible true }, // 编辑 handleEdit(row) { this.dialogTitle ‘编辑商品‘ this.form { ...row } // 浅拷贝避免直接修改原数据 this.dialogVisible true }, // 提交表单新增或更新 async submitForm() { this.$refs[‘productForm‘].validate(async (valid) { if (valid) { let res if (this.form.id) { // 更新 res await updateProduct(this.form) } else { // 新增 res await addProduct(this.form) } if (res.code 200) { this.$message.success(‘操作成功‘) this.dialogVisible false this.fetchData() // 刷新列表 } else { this.$message.error(res.msg || ‘操作失败‘) } } }) }, // 删除 async handleDelete(id) { try { await this.$confirm(‘确认删除该商品‘, ‘提示‘, { type: ‘warning‘ }) const res await deleteProduct(id) if (res.code 200) { this.$message.success(‘删除成功‘) this.fetchData() } } catch (error) { // 用户点击了取消 } }, // 分页相关方法 handleSizeChange(val) { this.queryParams.pageSize val this.fetchData() }, handleCurrentChange(val) { this.queryParams.pageNum val this.fetchData() } } } /script通过以上代码你可以清晰地看到前端触发用户点击“搜索”或“新增”按钮。API调用前端通过axios调用定义好的API函数如getProductList。后端接收SpringBoot Controller 的对应方法如findPage接收到HTTP请求。业务处理Controller 调用 ServiceService 通过 MyBatis-Plus 操作数据库。返回结果后端将处理结果封装成Result对象以JSON格式返回。前端响应前端接收到JSON响应根据code判断成功与否更新页面数据或给出提示。7. 项目打包与部署简易版本地开发完成后你可能需要将项目打包部署到一台服务器上或者交给老师验收。这里介绍最简单的打包方式。7.1 后端打包生成Jar包在IDEA中打开右侧Maven工具栏。找到你的项目 -Lifecycle- 双击package。等待打包完成在控制台看到BUILD SUCCESS。打包生成的Jar包位于backend/target/目录下名称通常为你的项目名-0.0.1-SNAPSHOT.jar。运行Jar包 在命令行中进入Jar包所在目录执行java -jar your-project-name-0.0.1-SNAPSHOT.jar后端服务就会以独立进程的方式运行。你可以通过application.yml中的server.port配置来修改运行端口。7.2 前端打包生成静态资源在VSCode终端中确保位于frontend目录。执行构建命令npm run build构建完成后会生成一个dist文件夹里面是压缩优化后的HTML、CSS、JS文件。7.3 部署方式选择前后端分离部署推荐将后端Jar包上传到服务器用java -jar命令或nohup后台启动。将前端dist文件夹内的所有文件放到一个HTTP服务器如Nginx、Apache的网站根目录下。修改前端请求的baseURL通常在request.js或环境变量中指向后端服务器的公网IP和端口。配置Nginx将API请求代理到后端服务。前后端合并部署简易将前端dist文件夹内的所有文件复制到后端SpringBoot项目的src/main/resources/static/目录下。重新打包后端Jar包。运行这个新的Jar包SpringBoot会同时提供API服务和静态页面。此时访问http://localhost:8080就能看到前端页面。注意这种方式只适用于小型演示项目生产环境不推荐。8. 常见问题与排查思路FAQ在搭建和运行过程中你几乎一定会遇到下面这些问题。请按顺序排查。问题现象可能原因排查方式解决方案后端启动失败端口被占用8080端口已被其他程序如另一个SpringBoot应用、Tomcat使用。查看启动日志通常会有Port 8080 was already in use错误。1. 关闭占用端口的程序。2. 修改application.yml中的server.port为其他端口如8081。后端启动失败数据库连接错误1. 数据库地址/端口/库名错误。2. 用户名密码错误。3. MySQL服务未启动。4. 驱动版本与MySQL版本不匹配。查看启动日志会有详细的SQL异常信息。1. 检查application.yml中的数据库配置。2. 确认MySQL服务已启动 (net start mysql)。3. 确认数据库和用户存在且有权限。4. 检查pom.xml中MySQL驱动版本。前端npm install失败或极慢1. 网络问题连接npm官方源超时。2. 本地Node.js版本与项目不兼容。观察错误信息常见有ETIMEDOUT,ECONNREFUSED或版本警告。1.切换npm源npm config set registry https://registry.npmmirror.com。2. 使用cnpm或yarn。3. 检查Node.js版本尝试使用LTS版本。前端npm run serve启动失败1. 依赖未正确安装。2. 端口被占用通常是8080。查看终端报错信息。1. 删除node_modules文件夹和package-lock.json重新npm install。2. 修改前端开发服务器端口在vue.config.js中配置devServer: { port: 3000 }。前端页面能打开但列表为空/接口报4041. 前端请求的后端地址 (baseURL) 配置错误。2. 后端服务未启动或端口不对。3. 后端API路径与前端请求路径不匹配。1. 打开浏览器开发者工具F12查看Network标签页看API请求是否发送以及响应状态码。2. 核对请求的URL是否与后端RequestMapping路径一致。1. 检查并修正前端request.js或环境变量中的baseURL。2. 确保后端服务正在运行。3. 核对前后端接口路径确保完全一致包括大小写。前端页面能打开登录后跳转回登录页1. 前端路由守卫router.beforeEach未正确配置或token验证失败。2. 后端登录接口返回异常。1. 查看浏览器控制台Console有无JS错误。2. 查看Network中登录请求的响应。1. 检查前端路由配置和登录状态管理逻辑通常是Vuex。2. 检查后端登录接口逻辑确保成功时返回了正确的token或用户信息。新增/修改数据后页面不刷新前端在操作成功后没有重新调用获取列表数据的函数。操作成功后查看Network是否有新的列表请求发出。在新增、编辑、删除操作的成功回调函数中手动调用一次fetchData()或刷新列表的方法。打包后前端页面空白或资源加载4041. 前端静态资源路径配置错误。2. 部署的服务器路径不对。查看浏览器控制台看具体是哪个JS/CSS文件加载失败。1. 在vue.config.js中配置publicPath: ‘./‘相对路径。2. 如果使用Nginx检查root或alias配置是否正确指向dist目录。9. 最佳实践与项目扩展建议当你成功运行项目后如果想把它变得更好、更像个“自己的作品”或者为答辩加分可以考虑以下方向代码规范与注释为后端的Controller、Service方法添加清晰的JavaDoc注释。为前端的复杂组件和方法添加注释。统一代码格式IDEA和VSCode都有格式化插件。功能增强权限控制实现基于角色的访问控制RBAC。不同角色如管理员、普通员工看到不同的菜单和操作按钮。可以使用Spring Security或Shiro框架。数据校验在后端实体类中使用NotNull,Size等注解进行数据校验在前端使用Element UI表单的rules属性进行双重校验。文件上传增加商品图片上传功能。后端使用SpringBoot处理MultipartFile前端使用Element UI的Upload组件。报表导出将统计报表导出为Excel或PDF。后端可以使用EasyPoi或Apache POI前端可以配合接口下载。性能与体验优化数据库索引为经常查询的字段如product_name,create_time添加索引提升查询速度。前端防抖/节流对搜索框的输入事件进行防抖处理避免频繁请求接口。接口缓存对一些不常变动的数据如商品分类字典的查询接口加入缓存如Redis减轻数据库压力。部署与运维使用Docker将后端、前端、MySQL分别容器化使用docker-compose.yml一键启动整个项目。这会是简历上的一个亮点。编写部署文档在项目README.md中清晰写下环境要求、配置步骤、启动命令。这体现了你的工程能力。理解与阐述画出系统架构图用Visio或ProcessOn画一张简单的架构图展示用户、浏览器、Nginx、SpringBoot、MySQL之间的关系。准备答辩说辞能清晰说出为什么选择SpringBoot和Vue前后端分离的优势项目中遇到的1-2个典型问题及如何解决的。通过以上步骤你不仅得到了一个可以交差的项目更获得了一个可深入学习和扩展的模板。这个项目麻雀虽小五脏俱全涵盖了CRUD、分页、搜索、表单验证、文件上传可扩展、权限管理可扩展等Web开发核心技能。理解它改造它你就能应对大多数类似的课程设计或毕业设计需求。 30款热门AI模型一站整合DeepSeek/GLM/Claude 随心用限时 5 折。 点击领海量免费额度