SpringBoot+Vue+MySQL花店销售系统:毕设项目完整设计与实现解析

发布时间:2026/9/1 6:22:48
SpringBoot+Vue+MySQL花店销售系统:毕设项目完整设计与实现解析 简介这是一套面向计算机专业本科生的高分毕业设计实战资源聚焦花店电商场景完整实现从前端展示到后台管理的全链路销售系统可直接用于毕设答辩、课程设计或期末大作业。资源包共1405个文件涵盖164个Java后端业务类、242个Vue组件页面、318个SVG图标资源、154张JPG商品图及126个JS交互脚本辅以MySQL建库脚本sql、Spring Boot配置文件yml、构建部署脚本bat等总大小52.69MB结构清晰、模块分明开箱即用。已有100人学习下载所有代码经导师指导与多轮调试确保在IDEAMavenMySQL 5.7Navicat环境下稳定运行。读者可获得完整可执行源码、配套数据库、前后端分离架构实践范例以及包含用户购物、订单处理、库存预警、后台统计等核心业务的闭环解决方案具备扎实的教学参考价值与工程落地能力。 每年到了毕业季总有学弟学妹问我“我只会一点Java和网页毕设做什么题目比较稳”我一般会回答别碰那些伪人工智能、图像识别大系统做一个业务完整、界面清爽、能跑通前后端分离的项目就是高分。今天拆解的这个项目——基于SpringBootVueMySQL的花店销售系统就是典型的稳妥型高分毕业设计。它不是花里胡哨的玩具而是把电商最核心的购物车、下单、库存、订单管理完整走了一遍而且有现成的论文、源码、数据库适合Java方向的同学参考、复现、二次扩展。这篇内容我会按实际做毕设的流程来写从选题思路、数据库设计、后端接口、前端页面到论文结构和答辩问题尽量把每个环节的“为什么这么做”和“踩过哪些坑”讲清楚。无论你是零基础还是已经写过几个JavaWeb小项目这套拆解都能帮你少走很多弯路。1. 项目选题与整体设计思路1.1 为什么选“花店销售系统”这个题目很多同学选毕设题目的时候特别容易走两个极端。一种是选太简单的比如学生管理系统、图书馆管理系统做完发现页面上只有一堆表格没有业务递进答辩老师问你“你这个项目的核心业务是什么”你只能说“增删改查”。另一种是选太复杂的比如基于深度学习的什么识别系统结果自己既不懂算法也跑不起来模型最后只能靠买代码蒙混过关。花店销售系统这个题目最妙的地方在于“业务线完整但实现难度可控”。它本质上是一个轻量级电商系统有商品浏览、分类筛选、购物车、下单、库存扣减、订单状态流转、销售统计这些环节。每一个环节都可以往深了做但每一个环节又都是Java后端和Vue前端的基础操作能覆盖的。换句话说它既有电商项目的完整骨架又不会像淘宝那样复杂到让你崩溃。从答辩角度来看这个题目特别好讲。你只需要准备一条业务主线用户注册登录、浏览鲜花、加入购物车、提交订单、管理员发货、用户确认收货整个过程环环相扣。老师问任何一个节点你都能顺藤摸瓜讲清楚数据怎么传、状态怎么变、库存怎么扣。这种“能自圆其说”的能力恰恰是毕业设计评分里最看重的。1.2 技术选型为什么是SpringBoot Vue MySQL技术选型是论文第一章必须交代的部分也是答辩时老师必问的方向。花店销售系统选SpringBoot Vue MySQL不是因为这些技术最新最潮而是它们配合起来最“抗打”。SpringBoot最大的优势是简化了Spring的配置。你不需要写一堆XML不需要手动配置Tomcat一个SpringBootApplication注解就能启动应用。对于毕设来说这意味着你可以把更多时间花在写业务逻辑上而不是耗在环境配置里。而且SpringBoot的生态非常成熟MyBatis-Plus、JWT、Swagger等常用组件都能很顺畅地集成论文里“基于SpringBoot框架”这句话本身就是加分项。Vue负责前端页面核心思路是“组件化”。比如商品卡片可以做成一个组件购物车表格是一个组件后台管理里的弹窗表单又是一个组件。组件写好之后页面就是堆组件的过程开发效率非常高。更重要的是Vue支持前后端分离开发你可以在本地用npm run serve起一个端口8000的前端服务用SpringBoot起一个端口8080的后端服务两者通过HTTP接口通信。答辩现场演示的时候页面不卡顿、局部刷新、加载状态清晰体验比传统的JSP页面好太多。MySQL作为关系型数据库存放用户、商品、订单这些结构化数据再合适不过。电商场景里的订单和订单明细天然是“一对多”的关系用外键和联合查询就能清晰表达。MySQL还支持事务和行级锁在下单扣库存这种需要保证一致性的场景里它是非常稳定的底座。如果用更老旧的SSM JSP方案也不是不行但答辩老师大概率会问“你为什么不采用前后端分离架构”。同样是完成一个项目采用更符合企业主流开发方式的技术栈评分上肯定更占优势。1.3 拿到“论文源码数据库”后应该先做什么很多同学下载了这种毕设压缩包之后第一反应是改包名、改标题、急着看代码。我建议你先别急按下面这个顺序操作通常半小时就能把系统跑起来解压后先看根目录有没有README或者环境说明文档里面一般写了数据库账号密码、后端端口、前端启动命令。用Navicat或MySQL Command Line执行flower_shop.sql脚本把数据库导入本地MySQL。用IDEA打开后端代码修改application.yml或application.properties里的数据库用户名和密码然后启动SpringBoot项目。用VS Code或WebStorm打开前端目录执行npm install安装依赖再执行npm run serve启动前端项目。浏览器访问前端地址确认首页图片、商品列表是否正常展示然后用测试账号登录试试。这一步的意义是让你先摸清系统的“正常状态”。如果一开始就乱改出了问题你都不知道是原来代码有问题还是自己改坏的。跑通之后再读代码带着问题看逻辑效率会高很多。2. 系统规划与数据库设计2.1 用户端和管理端功能拆解花店销售系统从角色上分为两类普通用户和系统管理员。两者看到的功能完全不一样所以需要在后端接口和前端路由上都做权限区分。普通用户端的功能包括注册和登录、浏览首页轮播图、查看鲜花列表、按分类筛选、搜索商品、查看商品详情、加入购物车、修改购物车数量、删除购物车商品、提交订单、模拟支付、查看订单列表、取消未支付订单、确认收货、修改个人资料。这里面最核心的链路就是“加购—下单—支付—收货”。管理端的功能包括管理员登录、商品管理新增鲜花、编辑、上下架、删除、分类管理、订单管理查看订单明细、发货、完成订单、用户管理查看用户列表、禁用启用用户、销售统计查看销量排行、近七天销售额图表。管理端设计得好不好直接决定了项目在“系统实现”章节里有没有截图可放。只要你把管理端页面做得规整论文里的系统功能截图质量就有保障。功能模块用表格规划清楚不仅方便自己写代码也方便直接复制到论文第二章需求分析里。功能模块子功能服务角色用户认证注册、登录、退出、密码加密用户、管理员商品模块商品列表、分类查询、关键词搜索、商品详情用户、管理员购物车模块加入购物车、修改数量、删除、勾选结算用户订单模块提交订单、订单列表、取消订单、发货、确认收货用户、管理员用户管理用户列表、启用/禁用管理员统计模块商品销量排行、近7天销售额管理员2.2 核心数据库表结构设计数据库是整个系统的地基表结构设计得好后面写接口会非常顺畅。一套高分毕设数据库脚本至少要包含这几张表user用户表、category商品分类表、flower鲜花商品表、cart购物车表、orders订单表、order_item订单明细表。用户表比较简单但需要注意密码字段不要明文存储。字段建议这样设计CREATE TABLE user ( id int NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL COMMENT 用户名, password varchar(255) NOT NULL COMMENT 密码, nickname varchar(50) DEFAULT COMMENT 昵称, phone varchar(20) DEFAULT COMMENT 手机号, avatar varchar(255) DEFAULT COMMENT 头像地址, role tinyint NOT NULL DEFAULT 0 COMMENT 角色 0普通用户 1管理员, status tinyint NOT NULL DEFAULT 1 COMMENT 状态 1正常 0禁用, create_time datetime NOT NULL COMMENT 注册时间, PRIMARY KEY (id), UNIQUE KEY username (username) ) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8mb4 COMMENT用户表;商品表是重头戏字段里除了基本名称、描述、价格一定要有库存stock、封面图image和销量sales。价格用decimal(10,2)类型不要用float因为浮点数在电商金额计算里会有精度问题。库存用int商品上下架用status字段控制。购物车表建议不要存“选中状态”之外的冗余商品快照因为购物车里的商品价格如果需要跟随商品表实时变动就不应该把价格单独存一份。只需要存用户id、商品id、数量三个核心字段再加一个唯一索引防止重复加购。我提供个参考SQLCREATE TABLE cart ( id int NOT NULL AUTO_INCREMENT, user_id int NOT NULL COMMENT 用户ID, flower_id int NOT NULL COMMENT 鲜花ID, quantity int NOT NULL DEFAULT 1 COMMENT 数量, checked tinyint NOT NULL DEFAULT 1 COMMENT 是否勾选 1是 0否, PRIMARY KEY (id), UNIQUE KEY uk_user_flower (user_id, flower_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT购物车表;订单表和订单明细表要分开设计。订单表存一次下单的概要信息订单编号、用户ID、总金额、状态、创建时间、支付时间、发货时间、完成时间。订单明细表存订单里每个商品的快照商品ID、商品名称、购买时单价、数量。哪怕商品以后改了名称和价格已下单的记录也不会受影响这在电商行业里叫“商品快照”。2.3 表关联与外键策略很多课程设计里喜欢用物理外键但在实际项目中物理外键往往会造成删改数据不方便。比如你要在后台删除一个分类如果分类下还有商品物理外键会直接阻止删除或产生连锁问题。更合理的做法是“逻辑外键”也就是在Java代码层面控制关联关系表之间不声明FOREIGN KEY只保留关联字段作为普通索引。具体关联关系是这样的分类表和商品表是一对多flower.category_id对应category.id用户表和购物车表是一对多cart.user_id对应user.id用户表和订单表是一对多orders.user_id对应user.id订单表和订单明细表是一对多order_item.order_id对应orders.id。这种设计的好处是灵活删除效率高也方便后期扩展。比如以后你想加“花材供应商表”只需要在商品表增加一个supplier_id字段不需要改动已有表结构。数据库脚本里还要预置一些初始化数据。管理员账号必须有一个建议用户名admin密码用MD5或BCrypt加密后的字符串测试用户准备两个测试商品准备8-10个覆盖玫瑰、百合、向日葵、多肉这些常见分类测试订单准备三五条分别处于待支付、待发货、已完成等不同状态。这样系统一跑起来前端页面不会空荡荡论文里的截图也好看。3. 后端核心实现与代码细节3.1 SpringBoot项目结构与分层拿到源码后先看后端项目的整体包结构。一个规范的项目一定不是所有代码堆在一个类里而是按职责分层。常见包结构如下com.flower.shop ├── config // 配置类比如拦截器、跨域配置 ├── controller // 控制层接收前端请求 ├── service // 业务接口 ├── service.impl // 业务实现 ├── mapper // MyBatis-Plus的Mapper接口 ├── entity // 数据库实体类 ├── dto // 前端传输对象比如登录参数、下单参数 ├── vo // 返回给前端的视图对象 ├── utils // 工具类JWT工具、结果封装 ├── common // 统一返回结果、异常处理 └── FlowerShopApplication.java控制层只做参数接收和结果返回业务逻辑全部放到ServiceImpl里Mapper层负责数据库操作。这样做的最大好处是答辩老师问你“某段逻辑写在哪里”你能非常自信地告诉他“在service层”。如果你把SQL和业务逻辑都写在Controller里代码虽然能跑但一旦被老师细看代码结构印象分会大打折扣。pom.xml里的核心依赖大概是这些spring-boot-starter-web、mybatis-plus-boot-starter、mysql-connector-java、lombok、jjwt或java-jwt、hutool-all。有一些项目还会加knife4j或springfox生成Swagger接口文档这也是给项目加分的地方。3.2 JWT登录认证与拦截器实现这个系统的登录认证我强烈建议用JWT而不是传统Session。JWT的核心思路是用户登录成功后后端生成一个签名字符串返回给前端前端把它存在本地存储里之后每次请求都在请求头带token。后端用拦截器校验token校验通过就能拿到用户信息无需在服务端保存会话状态。实现分为三步。第一步写JWT工具类提供生成token和解析token的方法public class JwtUtils { private static final String SECRET flower-shop-secret; public static String generateToken(Integer userId, String username, Integer role) { return Jwts.builder() .claim(userId, userId) .claim(username, username) .claim(role, role) .setExpiration(new Date(System.currentTimeMillis() 86400000)) .signWith(SignatureAlgorithm.HS256, SECRET) .compact(); } public static Claims parseToken(String token) { return Jwts.parser() .setSigningKey(SECRET) .parseClaimsJws(token) .getBody(); } }第二步写一个LoginInterceptor拦截器实现HandlerInterceptor接口。在preHandle方法里从请求头拿到token如果解析成功就放行解析失败就返回401。同时要把解析出来的用户ID和角色放到request的Attribute里方便后续接口直接获取当前登录用户。第三步在WebConfig里注册拦截器并设置放行路径。登录、注册、商品浏览、商品详情这类接口不需要登录就能访问而购物车、订单、后台管理接口必须登录。管理端接口还需要判断role是否为1否则返回“无权限”。这里有一个很容易踩的坑拦截器只拦截了后端请求但前端页面还是允许用户手动输入管理后台地址。解决办法是在后端的Controller上加一层角色校验或者在管理接口的请求里都带一个管理员标识拦截器里统一判断。我之前见过项目只在后端返回“不允许访问”但前端菜单还是能跳转这就是前后端权限没有对齐。3.3 商品接口与分页查询商品列表是用户端访问量最大的接口必须支持分页、按分类筛选、按关键词搜索和价格排序。使用MyBatis-Plus的Page插件代码可以写得很简洁public PageFlower getFlowerPage(Integer pageNum, Integer pageSize, Long categoryId, String keyword) { QueryWrapperFlower wrapper new QueryWrapper(); wrapper.eq(status, 1); if (categoryId ! null) { wrapper.eq(category_id, categoryId); } if (StringUtils.hasText(keyword)) { wrapper.like(name, keyword); } wrapper.orderByDesc(sales); return flowerMapper.selectPage(new Page(pageNum, pageSize), wrapper); }商品详情接口就简单很多根据ID查出一条商品数据返回即可。但要注意浏览量、销量这类字段的更新频率。如果只是一个毕设不需要做复杂的浏览量统计但可以考虑在详情页显示商品的已售数量营造真实感。接口返回值建议统一封装成一个对象比如Result.success(data)和Result.error(code, msg)。这样前端只需要解析固定的数据结构不用每个接口都单独处理异常情况。统一返回结构在论文的“接口设计”章节里也是很好的展示素材。3.4 购物车接口与下单流程购物车的增删改查是最经典的CRUD但“加购”这个动作有一点细节值得写清楚。用户点击“加入购物车”后后端应该先根据userId和flowerId查一下购物车表里有没有这条记录。如果没有就新增一条如果已经存在就在原数量上增加而不是再插入一条重复记录。这个逻辑配合数据库表的唯一索引能有效防止重复数据。下单流程是整个项目的代码重点也是答辩老师最容易追问的部分。一个标准的下单操作应该包含这些步骤接收前端传递的购物车记录ID数组或者用户ID。查出购物车中勾选状态为1的商品列表。校验商品是否都处于上架状态。校验每个商品的库存是否足够。计算订单总金额生成唯一订单号。插入订单主表记录得到订单ID。批量插入订单明细表。扣减商品库存。删除已下单的购物车记录。整个过程必须放在一个事务里任何一个步骤失败前面所有操作都要回滚。用Spring的Transactional注解就能实现。扣库存的SQL尤其要写对不能先查询库存再在Java代码里判断这样并发情况下容易超卖。最稳妥的做法是使用条件更新语句UPDATE flower SET stock stock - #{num} WHERE id #{id} AND stock #{num}这条语句执行后如果受影响行数为0说明库存不足直接抛出异常回滚事务。这种方式利用数据库的行锁和原子更新比在Java代码里加锁更简单可靠。我在帮学生排查项目时发现很多毕设代码都是“先查库存再update stock newStock”这种写法在模拟并发场景下一定会出问题。如果你论文里能写明白这一点绝对是技术亮点。订单状态是另一个值得展开讲的地方。建议用tinyint类型配合状态常量类来管理状态值含义说明0待支付下单成功未支付可取消1待发货已支付等待管理员发货2已发货管理员已发货等待用户确认3已完成用户确认收货4已取消用户取消关闭订单3.5 销售统计接口的设计为了让系统看起来有分量管理端最好加一个简单的销售统计模块。统计维度不用多两个就够近7天销售额、商品销量排行榜。近7天销售额可以用分组聚合查询实现。MySQL里用DATE_FORMAT(create_time, %Y-%m-%d)把时间按天分组然后SUM(total_price)计算金额SELECT DATE_FORMAT(create_time, %Y-%m-%d) AS day, SUM(total_price) AS amount FROM orders WHERE status IN (1,2,3) AND create_time DATE_SUB(CURDATE(), INTERVAL 7 DAY) GROUP BY day ORDER BY day商品销量排行榜需要对order_item表按flower_id分组SUM(quantity)算出总销量再关联flower表查出商品名称和图片。前端用ECharts画柱状图和折线图效果非常直观。这里有个细节统计销售额时只统计已支付或已发货的订单不能把待支付的订单也算进去否则数据会失真。论文的测试截图里如果出现完整、有业务含义的统计图表是一个很大的加分项。4. 前端Vue实现与联调4.1 Vue项目搭建与跨域配置前端项目一般使用Vue CLI脚手架创建如果源码是基于Vue3的则使用Vite或vue/cli创建Vue3项目。拿到源码后第一步是看package.json里依赖的Vue和Element组件库版本。Vue2对应Element UIVue3对应Element Plus两者语法区别比较大不要混用。开发环境最大的坑是跨域。前端跑在http://localhost:8000后端跑在http://localhost:8080从8080访问8000肯定会遇到跨域问题。解决方案是在前端vue.config.js中配置代理module.exports { devServer: { port: 8000, proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } } }这样前端代码里请求/api/flowers本地开发服务器会自动转发到http://localhost:8080/api/flowers从浏览器视角看是同源请求不会跨域。后端的CorsFilter也可以开放跨域但前端代理才是开发环境最优雅的做法。4.2 Vue路由与状态管理前端页面建议使用Vue Router管理路由。用户端和管理端分别设置布局组件这样可以保证页面结构统一。常用路由划分为路由路径页面说明/首页轮播图、热销商品/list商品列表分类筛选、搜索/detail/:id商品详情商品大图、价格、加购/cart购物车勾选、改数量、合计/orders订单列表待支付、待收货/admin管理后台商品管理、订单管理、统计状态管理推荐用Vuex或Pinia把用户token、用户信息、购物车数量等全局状态管理起来。刷新页面后从localStorage读取token并重新拉取用户信息这样用户就不会因为刷新被踢出登录状态。路由守卫一定要写。在router.beforeEach中判断目标路由是否需要登录需要登录但本地没有token时重定向到登录页管理后台路由还要求用户角色为管理员否则提示无权限并跳回首页。4.3 Axios封装与接口对接前端不能每个页面都写一遍Axios请求最好是做一个统一的请求模块。实践中我建议把axios.create封装成request.js并配置两个拦截器。请求拦截器的主要任务是从Vuex或localStorage里取出token添加到请求头service.interceptors.request.use(config { const token localStorage.getItem(token) if (token) { config.headers[Authorization] token } return config })响应拦截器需要统一处理后端返回的code。比如code为200直接返回datacode为401清除本地token并跳转登录页其他code弹出错误提示。还有一个容易被忽略的点后端返回的时间字段有时是时间戳有时是2025-06-01 12:00:00前端最好统一处理格式避免页面直接显示一长串数字。4.4 页面实现细节用户端商品列表页是我觉得最值得花心思的地方。用el-card做成商品卡片网格卡片上展示商品图片、名称、价格、销量点击卡片跳详情。列表顶部用el-radio-group或el-tabs做分类切换配合el-input做搜索框。注意图片地址要判断是相对路径还是完整URL如果是相对路径需要拼接后端访问地址。购物车页面建议用el-table实现开启多选列每行有数量加减器el-input-number底部显示合计金额。下单按钮点击后把勾选的购物车行ID传后端后端下单成功后再重新拉取购物车数量更新全局状态。管理端页面用el-container布局左侧菜单右侧内容区。商品管理使用el-table展示数据顶部有“新增商品”按钮编辑和删除放在操作列。新增和编辑共用一个el-dialog弹窗表单提交时判断有id是编辑、无id是新增。订单管理页要支持按状态筛选并针对不同状态显示不同操作按钮比如待发货订单显示“发货”已发货订单显示“查看物流”或“完成”。4.5 前后端联调踩过的坑联调阶段最容易出现三类问题。第一类是字段名不一致。后端实体类字段叫flowerName前端页面写的却是name接口数据绑定不上。解决办法是约定接口文档或者直接用Swagger在线调试不要各写各的。第二类是BigDecimal精度问题。后端返回金额给前端时如果直接返回数字前端可能展示出12.300000000001。建议在VO对象里把金额字段格式化为字符串或者转成String返回。第三类是token过期。用户长时间停留在前端页面突然操作会报401。响应拦截器捕捉到401后要跳转登录页并提示“登录已过期请重新登录”。很多同学不做这个处理答辩演示时容易出现点击没反应的尴尬场面。5. 论文撰写与答辩准备5.1 论文结构怎么定这套毕设的压缩包里已经有一份论文但我不建议直接原封不动交上去。你需要先仔细读一遍把里面的系统截图换成自己实际运行时的截图把默认的感谢语改成自己的信息同时必须保证论文里的功能描述和你的系统实际操作一致。如果论文写了一个功能系统里找不到答辩时就属于硬伤。一篇标准的高分毕业论文结构大概是这样摘要和关键词简要说明系统开发背景、技术栈和主要功能。第一章 绪论写课题背景、研究意义、国内外现状、论文组织结构。第二章 需求分析画用户用例图、管理员用例图整理功能需求和非功能需求。第三章 系统设计画系统总体架构图、功能结构图、E-R图、数据库表设计。第四章 系统实现按功能模块逐个展示页面截图和核心代码结合文字说明。第五章 系统测试写测试环境、功能测试用例表、测试结果分析。总结与展望总结系统完成的功能和不足展望后续优化方向。这里我要单独提醒一下“画图”的问题。论文里不要只贴截图一定要有自己画的用例图、E-R图和架构图。这类图的画法用ProcessOn、Visio、draw.io都可以答辩老师看的是逻辑不是画图工具。5.2 测试章节怎么写才算有说服力很多同学的测试章节只有三句话“系统测试通过运行正常。”这种写法基本等于没写。真正有说服力的测试章节应该用测试用例表来支撑。比如下单功能可以列出这样的用例用例编号测试步骤预期结果实际结果是否通过TC-001用户选择商品加入购物车购物车数量增加商品信息正确与预期一致通过TC-002购物车商品数量改为10点击结算后端校验库存不足弹出提示提示“库存不足”通过TC-003未登录用户直接访问购物车接口返回401跳转登录页面与预期一致通过TC-004管理员登录后台将订单状态置为待发货订单状态更新成功用户端可见与预期一致通过写测试用例的目的不是真的要做完整测试而是证明你关心过系统的边界情况。你只要把“库存不足下单失败”“未登录不能访问个人中心”这两个用例写进去论文质量立刻不一样。5.3 答辩老师爱问什么问题我根据带毕设的经验总结了几个高频问题提前准备好就不用怕为什么选择前后端分离架构答前端由Vue构建后端提供无状态API开发职责清晰部署灵活前端可独立部署到Nginx。JWT和Session有什么区别答Session服务端存储、占用内存、跨域麻烦JWT无状态、客户端存储、适合前后端分离。但JWT也有缺点服务端不能主动踢人所以可以设置较短的过期时间。如何防止库存超卖答使用条件更新UPDATE flower SET stock stock - N WHERE id ? AND stock N通过受影响行数判断是否成功配合事务保证一致性。数据库表为什么这么设计答遵循第三范式拆分订单主表和订单明细表避免数据冗余购物车表用唯一索引防止重复记录。你项目的亮点是什么答完整实现了电商核心交易链路包含购物车、下单、库存联动、订单状态机管理端还有销售统计图表。这些都是送分题平时自己模拟一遍答辩时就不会露怯。6. 常见问题排查与部署经验6.1 后端启动失败怎么办后端启动失败90%集中在三个原因。第一个是端口被占用。SpringBoot默认8080如果本地有其他服务占用启动就会报Port 8080 was already in use。解决办法是改application.yml里的server.port或者在命令行用netstat -ano | findstr 8080找到占用进程并结束。第二个是连接不上数据库。报错一般是Communications link failure或者Access denied for user。检查MySQL服务是否启动账号密码是否正确数据库是否已经导入以及连接串里serverTimezone和characterEncoding有没有配置对。完整的JDBC连接串建议这样写spring: datasource: url: jdbc:mysql://localhost:3306/flower_shop?useUnicodetruecharacterEncodingutf8mb4useSSLfalseserverTimezoneAsia/Shanghai username: root password: 你的密码 driver-class-name: com.mysql.cj.jdbc.Driver第三个是依赖没下载完。IDEA里如果pom.xml一堆红色报错先看看Maven仓库路径是否配置了阿里云镜像。在settings.xml里加阿里云镜像能解决绝大多数下载失败问题。6.2 前端启动报错怎么办前端npm install装不上依赖绝大多数是Node版本和依赖版本冲突。尤其是老项目里用node-sass时Node高版本很难编译成功。最简单的办法是删除node_modules和package-lock.json把node-sass替换成sass再重新npm install。如果还是不行就用项目自带.nvmrc或package.json里的engines字段指定的Node版本。前端页面打不开先看控制台有没有报错。如果是“Cannot find module vue”说明依赖没装全如果是“Proxy error”说明后端没启动或代理目标写错。建议按“后端接口是否能用Swagger访问”“前端代理是否正常”这个顺序排查。6.3 MySQL中文乱码和时间问题中文乱码通常是因为数据库或表使用了latin1字符集。导入SQL文件之前先确认SQL文件里的建表语句是CHARSETutf8mb4。如果已经建好但乱码可以执行ALTER DATABASE flower_shop CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ALTER TABLE flower CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;时间字段显示相差8小时通常是因为连接串没加serverTimezoneAsia/Shanghai。注意SpringBoot 2.6的MySQL驱动配置必须把驱动类写成com.mysql.cj.jdbc.Driver。6.4 本地打包部署建议答辩前完全可以把项目打包成可运行的形态这样即使现场网络出问题也不慌。后端打包用Maven命令mvn clean package -DskipTests打包成功后会在target目录生成一个flower-shop.jar在服务器或本机执行java -jar flower-shop.jar前端打包用npm run build生成dist目录里面是纯静态页面。如果你想把项目部署到Nginx就配置一个反向代理server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }这里有个细节try_files $uri $uri/ /index.html;必须写否则刷新非首页路由时会报404。数据库导出备份用命令mysqldump -u root -p flower_shop flower_shop_backup.sql恢复时执行mysql -u root -p flower_shop flower_shop_backup.sql6.5 关于这套源码我最想说的一点带过这么多同学做毕设我发现最容易翻车的不是技术而是“拿来主义”。有些人拿到压缩包之后把首页标题改成“XX鲜花商城”把数据库密码改成自己的就以为大功告成。结果答辩老师一眼看穿问一句“你说一下购物车表为什么设计成三个字段”就答不上来。所以我的建议是把这份资料当成“模板”而不是“答案”。你要跑通它读懂它再改出一点自己的东西。哪怕只是加一个“收货地址管理”功能或者把销售统计从7天改成按月统计答辩时你都能理直气壮地说“这个模块是我自己设计的”。顺着这个思路去做花店销售系统拿高分一点都不难。本文还有配套的精品资源点击获取