2026/9/9 14:36:02

SpringBoot+Vue实战:私厨服务平台毕设全流程解析

SpringBoot+Vue实战:私厨服务平台毕设全流程解析 做毕设最怕什么不是代码写不完而是题目选完才发现根本不知道要做什么、做到什么程度才算完。我见过太多人选了个“智能图书管理系统”做到第三周就想换题也见过有人把项目做得很大、实际交付却全是半成品。今天这篇就聊一个很适合Java后端方向、又不容易卡壳的题目——基于SpringBoot Vue的私房菜定制上门服务系统也叫私厨服务平台。这个题目看上去像个小电商但真正动手你会发现它的核心难点不在CRUD而在业务状态的流转、角色的权限划分以及前后端联调时那些说不清道不白的边界问题。这篇文章按一套完整的毕设推进路线来讲需求怎么拆、表怎么设计、后端哪些功能最容易写歪、前端Vue怎么配合、部署联调有哪些坑、最后论文和答辩怎么准备。内容偏实战所有细节都是按我自己做项目时踩过的坑总结出来的适合拿来直接参考而不是看个热闹。1. 这个系统到底在做什么需求拆解与功能边界很多人拿到这种题目第一反应是打开Visio画用例图画完就扔到一边了。需求分析最忌讳的就是“流程图画得很漂亮功能清单一塌糊涂”。你先别管管理员有哪些权限、别管那些花里胡哨的营销功能先想清楚一个最核心的问题在这个平台上谁来接单、谁下单、谁审核整个业务闭环是怎么跑起来的。1.1 核心角色与业务闭环私房菜定制上门服务系统本质上是把“在线上买菜做饭”拆成了三步用户选厨师与菜品、私厨接单并上门制作、平台对双方做管理与结算约束。所以角色就三类普通用户C端搜厨师、看菜品、下单、改地址、评价、看订单进度。私厨师傅B端维护自己的菜品、设置可接单时段、接单/拒单、更新订单状态。平台管理员后台审核私厨入驻、审核菜品上下架、处理投诉、看整体订单数据。这三角色的权限边界必须从一开始就划清楚。很多毕设做崩就是因为后台管理页面和用户页面揉在一起用户能访问管理员的接口私厨能下用户的单。哪怕你所有的功能都点得通答辩老师随便问一句“用户请求怎么保证只能操作自己的数据”你答不上来就扣分了。1.2 功能清单的优先级排序需求要分优先级不然你会一直陷在“加功能”的泥潭里。以私厨服务平台为例我建议的顺序是用户端注册登录、菜品浏览、下单流程、订单列表、订单详情私厨端入驻申请、菜品管理、接单/拒单、更新订单状态开始制作、已完成管理端用户管理、私厨审核、菜品分类管理、订单全览加分项时间够再做评价系统、收藏、优惠券、数据统计图表为什么评价是加分项而不是核心因为评价涉及评分聚合、敏感词过滤、超时不能评等一堆细节对毕设展示的“完成度”贡献不大但对工作量的消耗是真大。答辩时能把核心闭环讲清楚、把权限控制说明白已经比大多数人强了。1.3 非功能性需求也得提前想除了功能你要在需求分析里说明性能与安全的要求这在论文里占一小节也是答辩常问点。务实一点不需要说“支持万人并发”这种空话说清楚这些就够了用户密码用BCrypt加密存储不能明文用户只能查看和修改自己的订单私厨只能操作分配给自己的订单下单过程要有基本的事务控制不能出现同一时段被多个用户锁定接口统一返回格式前端能根据code区分成功、失败、未登录。这些听起来像套话但每一项都会在后面的代码里体现。2. 技术选型不是堆砌为什么是SpringBoot Vue以及数据库怎么设计这个系统用SpringBoot Vue是标准的前后端分离玩法也是目前想找工作的毕业生最该熟悉的一套组合。SpringBoot负责提供RESTful接口和业务逻辑处理Vue负责页面渲染和用户交互两者通过JSON格式的数据通信。2.1 技术栈里每一环都解决什么问题很多人配置环境半天装不完是因为只知道“要用SpringBoot”却不明白为什么要用。SpringBoot解决的是后端“配置地狱”问题。以前用SSH或者裸Spring光是XML配置文件就要写好几百行。SpringBoot通过自动装配帮你完成了大部分配置你只需要关注业务代码。如果你环境有问题十有八九是Maven仓库下载依赖卡住了建议直接配阿里云镜像。MyBatis Plus解决的是数据库操作重复劳动问题。单表CRUD不需要写SQLBaseMapper直接给你封装好了多表查询再自己写XML。选MP而不是JPA是因为国内公司用MP的比例极高毕设用这款工具在面试时也有话聊。Vue 2 Element UI或Vue 3 Element Plus解决的是后台管理页面快速成型问题。表格、表单、分页、弹窗这些组件全是现成的你只需要把数据填进去。不建议自己手写一堆CSS组件毕设时间不该耗在这里。MySQL是数据存储的绝对主力。如果你想让系统“看起来更专业”可以再配一个Redis做验证码存储和首页菜品缓存但这不是必须的详情我在后面单独说。2.2 数据库表结构从业务反推表设计表设计是所有后续开发的地基表建错了后面改起来会怀疑人生。私厨平台建议按模块分表一共8张核心表再加2张辅助表就够sys_user用户表。字段要有id、username、password、phone、avatar、role区分用户/私厨/管理员、status状态正常/禁用、create_time。chef_info私厨信息表。这个表是挂在sys_user下面的存认证信息字段包括user_id、real_name、id_card、introduction、service_area、status待审核/通过/拒绝。为什么要单独建表而不是直接在user表里加字段因为私厨信息只有在用户申请入驻时才存在且不同角色需要的字段差异很大用一张用户表塞所有字段会导致大量字段为空另外权限校验也容易乱。dish_category菜品分类表。id、name、sort、status。dish菜品表。id、chef_id关联私厨、category_id、name、description、price、image、status上架/下架、monthly_sales。注意这里的chef_id存的是sys_user的主键还是跟chef_info的主键建议存sys_user的id后续订单流程里直接拿userId就能关联少一次表连接。cart购物车表。用户加购功能按需做如果时间不够可以砍掉下单时直接在前端勾选菜品就行。但如果要做字段就是id、user_id、dish_id、quantity、add_time。orders订单主表。这是全系统最复杂的一张表字段包括id、order_no订单编号、user_id、chef_id、total_amount、status待接单/已接单/制作中/已完成/已取消、appointment_time预约上门时间、address_detail、remark、create_time、pay_time、finish_time。order_item订单明细表。id、order_id、dish_id、dish_name快照、price快照、quantity。注意菜品名称和价格为什么要冗余进来因为私厨可能之后修改菜品名称或价格订单历史不能被带偏。evaluation评价表。id、order_id、user_id、chef_id、rating、content、create_time。comment或complaint投诉表看时间再加。2.3 表关系中的“为什么”建表过程中有几个设计点是答辩老师喜欢追问的你得提前理清楚第一订单主表和订单明细表为什么要分开因为一个订单可能包含多个菜品如果不拆明细表orders表里的字段就变成了冗余数组没法做统计也没法应对“订单修改菜品数量”这种操作。拆开后主表只关心状态和金额明细表关心具体买的是什么。第二下单时菜品价格要冗余到order_item做快照不能下单后再去dish表查实时价格。私厨改价是常态如果订单明细跟着变就产生了严重的数据一致性问题。这也是“业务正确性”和“展示正确性”的典型冲突业务日志必须不可变。第三订单状态只存一个state字段不建状态流转表。有同学想体现自己“懂设计”加一张workflow表来做状态机……这在毕设里是画蛇添足还容易把自己绕晕。SpringBoot项目里每个状态流转在代码里用判断或策略模式控制就够了Flowable、Activiti这种重量级工作流引擎跟私厨平台根本不匹配除非导师点名要求否则别碰。数据库设计这块建议先用PowerDesigner或者draw.io画一张ER图放论文里再在Navicat里把表建出来。表和表之间的外键我建议不要物理外键只保留逻辑关联字段。物理外键影响插入删除效率而且在你做数据清理时特别容易报错学生项目用逻辑外键更灵活这在论文里也可以作为设计说明写进去。3. 后端核心从下单到接单订单状态流转里的那些坑后端是整个系统的重头戏。菜单模块、用户模块都属于比较常规的增删改查真正考验设计能力的是订单模块以及围绕订单产生的并发和状态问题。3.1 下单流程的事务与一致性用户下单时后端到底要处理哪些事情顺序是这样前端提交菜品列表、数量、预约时间、地址后端校验用户登录状态、菜品是否处于上架状态、私厨是否可接单计算订单总金额后端要重新算不能信任前端传的totalAmount生成订单号order_no例如日期时间 随机数避免从1开始自增让用户看出平台订单量插入orders主表、批量插入order_item明细表返回下单成功。第六步在你把这一套写完后觉得很简单但有个细节步骤3和步骤4之间菜品价格可能有变化库存可能不足比如今日已约满。怎么处理这里要引入“乐观锁”的基本思想。菜品表可以加一个version字段下单时先查出来更新库存或接单名额时SQL中带上WHERE version #{oldVersion}。如果更新的影响行数为0说明有人并发修改了数据当前请求直接提示“菜品已下架或已约满请刷新后重试”。这是面试八股文里最常见的考点把它写进代码里答辩直接加分。3.2 订单状态机每个节点该由谁触发状态设计为待接单0、已接单1、制作中2、待完成3、已完成4、已取消5。每个状态的变迁必须是显式的不允许随意跳转。下单成功状态置为0待接单私厨点击“接单”状态从0变1已接单同时记录接单时间私厨点击“开始制作”状态从1变2私厨点击“已完成”制作完成并已上门服务状态从2变3用户点击“确认收货”确认服务完成状态从3变4下单后未支付或私厨拒单状态从0变5。这里要注意两个点。第一状态变更的接口必须校验操作人身份用户能改的状态私厨不能改私厨能改的状态管理员也不该乱改。第二状态变更最好用update语句带条件类似UPDATE orders SET status 1 WHERE id ? AND status 0这样能防止前后端按钮连点时发生的状态覆盖问题。这种写法其实是乐观锁的一个变种既简单又安全非常推荐在毕设项目里直接使用。3.3 私厨接单的并发问题私厨在某个时段可能只接待一个订单如果两个人同时下单预约同一个下午两点谁应该成功如果不做控制两个订单都会被创建私厨到时根本忙不过来。最简单的处理方式是在订单表设计时额外加一个appointment_time_start和appointment_time_end字段然后在下单前检查该私厨在相同时间段是否存在状态非“已取消”的订单。这个检查要放在事务里并且给相关索引加上唯一约束比如unique index on chef_id, appointment_time_start让数据库在极端并发下自己帮你兜底。实际情况是毕设项目并发压力极小大概率不会真的撞上。但你要在论文和答辩时把这个“并发控制方案”讲出来这就足够体现出你有工程意识了。我当年的答辩老师就是抓住这个问题问的因为我代码里确实做了所以对答如流。3.4 Redis该不该用用在哪私厨平台里Redis不是必选但如果你在简历里写了“熟悉Redis”我建议你把它用在两个地方图形验证码存储登录或注册接口生成验证码把验证码以key为“captcha:{uuid}”的形式存到Redis里过期时间5分钟。校验时从Redis取校验完立即删除。相比之下存Session的写法在前后端分离场景下非常别扭。首页菜品缓存菜品列表查询频率高但数据变化不频繁可以在查询后写入Redis缓存十分钟。管理员上下架菜品时主动删除缓存下一次查询自动回源数据库。这个过程在Java里用RedisTemplate操作StringRedisTemplate就够了核心就是set和delete两个操作。如果你觉得自己Redis用得还不熟也可以不用直接用MySQL查询完全不影响系统运行。但是要把“我不用Redis的理由”准备一下项目数据量小、查询性能足够避免过度设计。诚实且有逻辑比堆技术栈更能打动人。4. 前端Vue落地页面结构、路由权限与和API对接的协作方式前端这块很多同学最大的问题是“组件很熟业务不熟”。一上来就在网上找个管理系统模板套结果自己的核心页面跟模板的组件对不上改得焦头烂额。其实私厨平台的前端没有想象中复杂核心在于两点路由权限和请求封装。4.1 工程结构与页面划分建议用Vue CLI或Vite初始化一个项目目录结构这样组织src/api所有接口请求方法集中管理一个模块一个JS文件例如user.js、dish.js、order.js、chef.js。这个方法的好处是后端接口地址一变你只需要改一个文件。src/router路由定义与守卫。你需要三套路由普通用户端页面、私厨端页面、管理后台页面三者用不同的layout组件包裹。src/store用Vuex或Pinia存当前登录用户信息、登录状态、角色。刷新页面后根据token重新拉取用户信息。src/views页面组件按角色分子目录如views/user、views/chef、views/admin。src/utilsaxios请求封装、公共工具函数。页面级的功能点对应关系大致是用户端首页私厨列表/菜品推荐、私厨详情页、生成订单页、订单列表页、订单详情页、个人中心。私厨端工作台接单提醒、接单管理、菜品管理、收益统计如果有。管理端分类管理、私厨审核、用户管理、订单管理、数据统计ECharts。4.2 路由守卫与权限控制前端的路由守卫不是真正的安全控制但它能极大改善用户体验。比如未登录用户点“我的订单”会被自动跳转到登录页已登录的用户访问管理后台会直接提示无权限。实现思路是在axios请求拦截器里注入token在响应拦截器里统一处理返回状态码。比如后端返回401时前端清除本地登录态并跳转到登录页。这个逻辑不复杂但你一定要写否则你需要每个页面都写一遍“判断是否登录”代码量翻倍且难维护。同时在路由的meta字段里标记角色beforeEach里做判断router.beforeEach((to, from, next) { const token localStorage.getItem(token) if (to.meta.requiresAuth !token) { next(/login) } else if (to.meta.role store.state.user.role ! to.meta.role) { next(/403) } else { next() } })这里必须强调前端路由守卫只是“用户体验层面的拦截”真正的数据权限校验一定要在后端做。否则别人直接调用你的接口还是能拿到数据。这个“两层校验”的意识我在文章前面提到过一次这里再强调一次因为它既是实际项目中频繁被问到的点也是代码审查时导师喜欢看的地方。4.3 后端接口格式统一前端少踩一半坑前后端分离项目最怕的就是接口格式不统一。有的接口返回{code:0,data:...}有的接口直接返回true前端每次都要单独判断非常容易出错。建议你在SpringBoot里定义一个全局返回体Result结构为code、message、data其中code为200时表示成功401表示未登录500表示服务器异常。所有Controller方法都返回Result类型配合全局异常处理器RestControllerAdvice这样能保证所有错误也走统一格式。前端axios封装时在响应拦截器里直接判断code不是200就弹错误提示并跳转登录页或抛出异常。这样业务代码只需要写const res await createOrder(orderData) if (res.code 200) { this.$message.success(下单成功) this.$router.push(/orders) }不用每个接口都try catch也不需要在每个请求里写loading状态。把这个基础设施做好后面开发效率至少快一倍。5. 前后端联调与部署最容易翻车的环节我踩过的坑都在这里如果你前面的代码都写完了却卡在联调和部署阶段那真是最冤的。这一节说几个我实打实遇到过的问题和对应的处理方案。5.1 跨域问题不是你代码错了是浏览器拦了开发环境下前端运行在localhost:8080后端运行在localhost:8081浏览器会拦截跨域请求。解决办法有两种第一种是后端加CORS配置允许指定来源跨域。用SpringBoot的Configuration实现WebMvcConfigurer重写addCorsMappings方法Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOriginPatterns(*) .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) .allowCredentials(true) .maxAge(3600); }注意allowCredentials(true)时allowedOrigin不能写成要写allowedOriginPatterns()这是前后端分离场景下非常容易踩的坑报错信息往往是“The value of the Access-Control-Allow-Origin header in the response must not be the wildcard *”。第二种是前端利用vue.config.js里的devServer.proxy做代理把/api开头的请求转发到后端。生产环境再用nginx做反向代理这样前后端同源没有跨域问题。两种方案你可以都配上开发时用代理上线时用nginx转发也顺带说明你了解“同源策略”和“CORS机制”的区别。5.2 登录Token前后端如何配合用户登录成功后后端会签发一个JWTJSON Web Token字符串返回给前端。前端把token存到localStorage里之后每次请求在请求头带上Authorization: Bearer {token}。后端用一个拦截器HandlerInterceptor统一解析token把用户信息放到请求上下文ThreadLocal里。这样做的好处是业务方法里随时可以拿到当前登录用户ID不需要每个接口都从参数里穿一个userId代码优雅很多。Token过期时间建议设置为2小时前端在axios响应拦截器里判断401状态码自动跳转登录页并清理本地过期数据。不要搞“无感刷新”那种方案毕设场景不需要而且实现复杂度会上一个台阶。5.3 服务器部署从本地到能给别人演示到了部署这一步很多同学的流程是本地能跑就行演示的时候打开IDEA跑后端再打开一个终端跑前端。这样也不是不行但万一现场网断了、电脑死机了你就真的什么都没了。建议至少提前部署到一台云服务器上哪怕是最低配的2核4G都能扛住这个项目。后端打包在pom.xml中配置好打包插件使用Maven的package命令打成jar包然后java -jar app.jar运行。生产环境要注意设置MySQL、Redis的地址为云服务器内网地址避免每次上线都改代码。前端打包npm run build生成dist目录把dist里的文件用Nginx托管。Nginx关键配置将/api路径代理到后端地址同时将前端history路由的404重写到index.html。location /api/ { proxy_pass http://127.0.0.1:8081/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; }这一套流程如果你跑通了答辩现场可以直接用域名演示比打开IDEA那一堆日志页面清爽多了印象分直接拉满。5.4 上传文件与图片存储菜品肯定会涉及图片上传这个功能也是毕设里的标配。最简单可靠的做法是前端用Element UI的上传组件把文件以FormData形式提交到后端接口后端接收MultipartFile保存到服务器的指定目录建议是/usr/local/upload/文件名用UUID重命名防止冲突保存成功后返回可访问的URL路径例如http://ip:8081/images/xxx.jpg数据库里只存这个路径字符串不存二进制。考虑清楚一点系统重启后上传的图片还在不在如果在代码里用相对路径保存重启后很可能丢失或错乱。绝对路径虽然也存在服务器迁移问题但对毕设来说完全够用。如果你买了云服务器对象存储这些就不必了但可以在论文的“展望”里提一句“生产环境可以用云存储替代本地存储”别具体展开免得给自己挖坑。6. 毕设答辩准备把代码工作变成拿高分的展示项目写完只是第一步最后论文和答辩表达所占的比重比很多人想象的都大。这一章不是让你学话术而是教你把做过的工作量整理成清晰可验证的证据链。6.1 论文LW的结构与每章写作重心标准毕设论文一般八章左右要避免“需求分析抄概念、数据库设计贴表结构”这种凑字数的写法。第一章绪论不要大段引述互联网发展史直接交代“私厨上门服务在社区场景下存在的信任、匹配、管理痛点”写两三页就够了。第二章相关技术SpringBoot、Vue、MySQL、Redis每个技术写两段一段是什么、一段为什么选它。这两段要扣住项目不要泛泛解释什么是Java。第三章系统分析可行性分析技术、经济、操作和功能需求分析角色用例描述。用例图必画但重点是文字描述要具体到“用户能够查看私厨的接单时间并选择一个未预约的时间段下单”。第四章系统设计架构设计画一张前后端分离拓扑图功能模块设计将用户端、私厨端、管理端各自的子功能列出来数据库设计把ER图、每张表的核心字段和用途列清楚。第五章系统实现每一个核心功能配截图和关键代码截图务必确保页面网址栏、数据、时间都真实统一不要出现“Hello World”测试数据。第六章系统测试功能测试用用例表格性能测试如果没做就写基于JMeter或Postman的接口测试即可。即使没有性能数据也要写清楚测试环境、测试方法、结果分析。6.2 答辩现场一定会被问的问题清单根据我和身边朋友被问过的经验私厨平台这类系统老师的问题集中在以下几个方面“你的系统有哪些角色权限是怎么控制的”——回答时先讲后端拦截器再讲前端路由守卫然后举一个例子私厨调用接单接口时后端会从token解析出当前用户id校验该用户是否为该订单的chef_id不对就返回失败。“下单时如果两个人同时买到同一个厨师的同一个时段怎么办”——我的方案是订单表加唯一索引chef_id, appointment_time_start插入第二个订单时会被数据库拒绝然后catch到异常后返回友好提示“该时段已被预约请选择其他时间”。“为什么选Vue不选React”——答Vue的模板语法更接近传统HTML开发习惯上手成本低而且Element UI的中文生态对后台系统开发更友好。这个回答方向不会出问题千万不要说“因为别人都用”。“你数据库哪些字段建了索引为什么”——哪些字段要建索引外键字段chef_id、user_id要订单状态字段如果你经常按状态筛选也可以建。把索引原理往B树方向答一答——减少回表查询、覆盖索引、数据量小时全表扫描不一定比走索引慢。这个知识点要提前准备是高频考点。“项目上线了吗如果遇到大规模并发怎么办”——诚实回答没上线或已部署但无真实用户然后说理想方案加缓存、消息队列削峰、订单分表分库。能把这个逻辑说顺就很加分。6.3 演示时的页面操作顺序建议最后一步就是演示。我给你的建议是不要从登录页开始慢慢点太浪费时间。先把三个角色的页面准备好演示时按“管理员审核私厨→私厨上架菜品→用户下单→私厨接单→完成服务→用户评价”这条主线一次走通每一步都要能讲出页面背后的业务逻辑。演示前做一次全流程自测非常重要。从注册一个用户开始登录后下单一单换厨师账号接单再换管理员审核。你会在自测中发现很多自己平时开发时压根没注意到的问题比如下单成功页面提示之后订单列表没有马上刷新比如私厨端需要刷新页面才能看到新订单。这些小问题不影响功能但会给答辩老师一种“项目不够细致”的感觉提前修掉收益非常大。我自己的经验是把整个流程用手机录一遍视频存着万一现场网络出问题直接放视频演示也是一个很稳妥的备用方案。最后分享一个做毕设的底层心得做这种全栈项目最大的感悟是代码能跑起来靠的是框架跑得稳靠的是对业务细节的理解。私厨平台看起来就是一个普通的交易系统但当你真正把权限、状态流转、并发控制一一实现后你会发现自己对SpringBoot、Vue、MySQL的理解完全不一样了。那些在学校里背过的“会话保持”“事务隔离级别”“乐观锁”在这里全部都有了实际落地的场景。不管最后答辩成绩如何做完这个项目后把这些代码和设计思路整理到简历上找实习或工作时的底气也会比直接刷八股文足一些。