尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Spring Boot外卖点餐系统开发实战:从数据库设计到部署避坑指南

Spring Boot外卖点餐系统开发实战:从数据库设计到部署避坑指南 简介这是一套基于Spring Boot开发的外卖点餐系统完整毕设资源面向计算机专业本科生及Java初学者解决课程设计、毕业设计中缺乏可运行全栈项目参考的痛点。资源包含可直接部署的源码、结构规范的毕业论文含绪论、技术选型、需求与系统设计、模块实现、测试分析等6章以及答辩用PPT覆盖用户、商家、骑手、管理员四类角色核心功能。压缩包共638个文件25.24MB含121个Java后端逻辑文件、79个Vue前端组件、72个HTML页面、64个JS交互脚本、38个Class编译文件、21个CSS样式文件及1个SQL建表脚本技术栈清晰体现前后端分离与Spring Boot主流整合方案。已有133人学习下载读者可快速掌握商品管理、订单流转、权限控制等实战模块并通过bat启动脚本和分层代码结构理解企业级项目组织方式。1. 项目整体设计与思路拆解1.1 为什么选外卖点餐系统作为毕设题目每年毕业季Java方向的学生基本都在那几个经典题目里打转学生管理系统、图书管理系统、宿舍管理系统。不是说这些题目不行而是同质化太严重答辩时老师在台下听了几十遍一样的业务流程很难对你的系统产生兴趣。外卖点餐系统之所以值得做是因为它本身就是一个贴近真实商业场景的项目麻雀虽小五脏俱全涉及的技术点足够丰富又能讲出实际的业务逻辑。从功能覆盖度来看外卖系统天然具备三种角色普通用户点餐、商家出餐、管理员平台运营这三种角色对应三种完全不同的功能集合光是权限设计这一点就能在论文里写出一章内容。从技术深度来看它需要处理菜品展示、购物车、下单、支付对接、订单状态流转、超时取消、配送状态更新等一系列业务场景每个环节都有可以深挖的点。从工作量来看一个有完整用户端、商家端、管理端的系统前后端代码量加起来可以轻松突破一万行这在答辩时也是实打实的成果展示。最关键的一点是外卖系统能够很自然地引入一些“进阶”技术点Redis缓存热点菜品、JWT做无状态认证、WebSocket推送订单状态、定时任务处理超时订单、支付接口对接回调。这些技术在答辩时非常加分因为面试官和答辩老师最关心的不是你会不会用Spring Boot写CRUD而是你有没有思考过真实业务场景下的技术选型问题。1.2 技术栈选型背后的取舍逻辑技术选型是论文里必须写清楚的部分也是答辩时老师必问的方向。我的建议是不要追求大而全而是选择一套“主流且自洽”的技术组合每一个选型都要能说出理由。主框架选Spring Boot 2.7.x这个版本是目前毕设和中小型项目中最稳妥的。有些同学喜欢追新用Spring Boot 3.x但3.x强制要求JDK 17而且很多第三方库的兼容性还不到位自己踩坑倒是无所谓问题是答辩时一旦环境出问题会非常被动。持久层框架用MyBatis-Plus它在MyBatis基础上封装了通用Mapper和通用Service单表操作几乎不用写SQL能把大量时间省下来处理复杂的多表关联查询和业务逻辑。有人会问为什么不用JPA我的回答是国内企业用MyBatis系的居多而且外卖系统里有不少复杂的动态查询比如按分类、价格区间、销量排序联合筛选菜品MyBatis-Plus的LambdaQueryWrapper写起来比JPA的Specification直观得多。数据库用MySQL 8.0这个版本已经是主流支持窗口函数、CTE在写排名统计类SQL比如销量排行、商家评分统计时会方便很多。缓存用Redis主要缓存热点数据菜品列表、分类信息、轮播图以及购物车在未登录状态下的临时存储。认证方案用JWT配合拦截器为什么不选Session因为前后端分离架构下Session的跨域处理和分布式扩展都很麻烦而JWT天然无状态后端只需要在拦截器里校验令牌的合法性即可。前端部分用Vue 2 Element UI搭建管理后台和商家端用户端用微信开发者工具做小程序。小程序和后台管理用同一套后端接口这个设计本身就是亮点——一套Spring Boot后端同时支撑小程序端、管理后台Web端、商家端Web端三个前端RESTful API的复用价值在这里体现得非常充分。1.3 系统运行流程与整体逻辑整个系统的业务流转可以归结为一条主线用户浏览菜品 → 加入购物车 → 提交订单 → 模拟支付 → 商家接单 → 商家出餐 → 模拟配送 → 用户收货 → 订单完成。这条主链路里穿插着几条并发线用户可以在订单未接单前申请取消商家可以拒绝接单系统可以超时自动取消未支付订单一般是15分钟用户确认收货后可以评价商家和菜品。这些边界条件考虑得越完整论文里的业务分析部分就越有说服力答辩时也更有底气。系统架构上采用前后端完全分离的方案。后端只提供RESTful API接口端口设为8080前端Vue项目通过反向代理开发环境用Vite的proxy配置生产环境用Nginx访问后端。图片资源单独用本地上传目录存储通过一个静态资源映射路径对外暴露访问URL。支付这块我建议直接做成模拟支付本地生成一份假的支付跳转页面用户点击“确认支付”后直接回调后端接口更改订单状态。不必真的去接支付宝或微信支付因为个人开发者没有商户资质而且答辩时老师知道你不可能走真实支付流程模拟支付加清晰的注释说明就够了。2. 数据库设计与接口规划2.1 核心数据表的结构与关系外卖系统的数据库设计是整个项目的地基表结构设计得好不好直接决定了后面写业务代码时是顺风顺水还是步步踩坑。在设计时先把核心业务抽象出来再逐步细化我最终规划了9张核心表用户表、商家表、菜品分类表、菜品表、购物车表、地址表、订单表、订单明细表、评价表外加一个用于存储轮播图或公告信息的配置表。以下是各表的核心设计思路。用户表字段要少而精。核心字段就是id、openid小程序端唯一标识、昵称、头像、手机号、性别、创建时间。其中openid需要设置唯一索引因为小程序登录时是拿code换openid它是天然的登录凭证。手机号在用户首次授权时进行绑定用于接单短信通知这个可以做成日志形式模拟。商家表需要区分两类信息一类是资质信息比如店铺名称、营业执照号、法人姓名、联系电话另一类是经营信息比如店铺Logo、起送价、配送费、营业状态正常营业还是暂停接单、评分、月销量。起送价和配送费是下单时计算订单金额的关键参数必须在订单创建时快照保存一份到订单表里否则商家改了起送价就会影响历史订单的展示这也算是一个从真实业务里学到的经验。菜品表是用户端浏览的核心数据源字段包括菜品名称、图片、分类分类id、价格、包装费、月销量、状态上架/下架、创建时间。价格用decimal(10,2)存储这是所有涉及金额字段的统一规范绝对禁止用float或double——二进制浮点数在金额计算时会产生精度丢失一分钱的误差在真实交易里是大事故在答辩时也是会被老师抓出来的低级错误。订单表和订单明细表是一对多的关系。订单表的字段要充分支持业务流转订单号用时间戳加随机数生成作为展示给用户的订单编号、订单状态待支付/待接单/待配送/已完成/已取消、用户id、商家id、配送地址快照、订单总金额、配送费、包装费、备注、创建时间、支付时间、接单时间、送达时间。为什么地址和金额要做快照因为用户地址可能后续修改菜品价格可能调整订单必须保存下单那一刻的快照数据否则售后和复盘时会出现对不上的情况。订单明细表记录每一道菜的id、名称快照、单价快照、数量、小计金额。这里所有的名称和价格都做快照这是外卖系统数据库设计里最容易忽略但又最重要的细节。2.2 接口规划与状态码约定接口设计直接照搬RESTful风格资源用名词复数表示操作通过HTTP方法体现。以菜品模块为例GET /api/dish/page是分页查询GET /api/dish/{id}是查询详情POST /api/dish是新增PUT /api/dish是修改DELETE /api/dish/{id}是删除。每次操作都带上JWT令牌放在请求头里后端拦截器统一校验。响应结构体我封装了一个统一的Result类包含三个字段code状态码、msg提示信息、data业务数据。约定200为成功400为参数错误401为未认证403为无权限500为服务器异常。前端在axios的响应拦截器里统一判断code非200时弹出错误提示。这个封装看起来简单但它能让前后端联调时的沟通成本降到最低前后端只用对一份接口文档说话。订单相关接口需要单独说明因为它的状态流转是最复杂的。我设计了五个核心接口提交订单POST /api/order、查询订单详情GET /api/order/{id}、商家接单PUT /api/order/accept、取消订单PUT /api/order/cancel、确认收货PUT /api/order/confirm。状态流转只允许按照固定顺序切换后端在每次状态变更时做合法性校验比如已完成的订单不允许取消已取消的订单不允许接单。这种状态机校验逻辑用Java的枚举加switch来实现代码简洁且不容易出错。2.3 数据库设计中容易踩的坑第一个坑是字段命名不规范。Java后端开发中实体类属性用小驼峰命名like orderStatus数据库字段需要转成下划线风格order_status这种映射关系MyBatis-Plus默认支持但如果数据库字段命名混用、不统一自动映射就会失效到时候查出来的数据全是null。最稳妥的做法是建表时就统一使用下划线命名并打开MyBatis-Plus的驼峰映射开关默认就是开启的。第二个坑是时间字段的类型选择。MySQL中datetime和timestamp的区别容易让人困惑我的建议是统一使用datetime配合Java里的LocalDateTime类型。datetime的存储范围更大不会出现2038年问题。在MyBatis-Plus里创建时间字段可以配置自动填充通过实现MetaObjectHandler接口在insert时自动填充创建时间和更新时间这样业务代码里就不用手动set时间了省事且统一。第三个坑是逻辑删除而非物理删除。菜品、分类、商家等核心业务数据都不应该做物理删除而是用is_deleted字段标记。在MyBatis-Plus里只需要在实体类的isDeleted字段上加TableLogic注解所有查询都会自动带上WHERE is_deleted0的条件删除操作也会自动转化为更新语句。这样设计的最大好处是数据可追溯误删后还有恢复的余地。3. 核心功能实现与实操细节3.1 用户端小程序点餐功能实现用户点餐的核心链路有完整的闭环首页加载分类和推荐菜品 → 点击加购 → 购物车结算 → 选择地址 → 提交订单 → 模拟支付 → 等待商家接单 → 收到通知 → 确认收货。小程序端我采用了原生小程序语法开发。首页用swiper组件做轮播图展示下方用scroll-view实现左侧分类列表和右侧菜品列表的联动滚动。左右联动的实现逻辑是左侧点击分类右侧滚动到对应分类右侧滚动时计算当前滚动位置对应的分类高亮左侧对应项。这个交互细节看起来简单但要做得丝滑需要好好处理滚动监听和高度计算。接口层面菜品列表用了分页加载下拉刷新的方式。加购和购物车是外卖系统里比较核心的交互逻辑。购物车在服务端和本地各存一份本地存储用于实现即时响应点一下立即显示角标1服务端存储用于跨设备同步和提交订单时的数据源。为什么不用纯本地存储因为用户换手机登录后购物车数据会丢失而且商家端需要看到用户加购行为来做一些推荐策略。在实现上购物车存的不是菜品快照而是菜品id和数量获取购物车详情时再联表查询菜品最新价格这样菜品调价后购物车里的价格展示永远是实时的。提交订单的接口是核心中的核心它的参数包含地址id、商家id、购物车明细列表前端传、备注。后端拿到请求后要做四件事校验地址属于当前用户、校验购物车明细中所有菜品属于同一商家且所有菜品都在上架状态、计算订单金额菜品价格包装费配送费-优惠减免、开启事务写入订单表和订单明细表。第四步必须加事务因为写订单表和明细表是两个操作任何一个失败都要回滚否则会出现只有订单没有明细的脏数据。这里分享一个我实际开发时踩过的坑。最开始我把购物车明细直接传给后端后端根据前端传来的菜品价格计算订单金额然后某次测试时发现用户可以通过抓包修改价格参数把订单金额改成1分钱下单。搞明白原理后我改成后端根据菜品id重新查询数据库价格再计算前端传的菜品列表只保留id和数量字段价格一律以服务端查询为准。这个修复不仅堵住了安全隐患在论文里也可以作为一个安全设计亮点来写。3.2 商家端与管理后台的权限体系商家端和管理后台用的都是Vue 2 Element UI区别在于路由和权限控制不同。整套权限体系是典型的RBAC模型用户表 → 角色表 → 权限表 → 用户角色关联表 → 角色权限关联表。放到外卖业务里我简化为三个固定角色用户微信小程序、商家网页管理端、管理员网页管理后台每个角色对应的路由表在前端和后端各有一份。前端控制主要体现在路由守卫上。Vue Router的beforeEach钩子函数里判断当前用户的角色是否拥有目标路由的访问权限如果没有就跳转到401页面。后端控制的实现方式是自定义一个RequireRole注解标注在Controller方法上拦截器里解析JWT中的角色信息校验角色是否匹配。这一套设计是标准的RBAC落地方式写进论文里能体现出对权限设计有深入理解。商家端的功能核心是订单管理和菜品管理。订单管理需要实现待接单、待配送、已完成、已取消四个Tab页的分类列表商家点击接单后订单状态变为待配送然后进入按时间排序的配送列表。菜品管理本质上是一个标准CRUD功能配合图片上传组件。图片上传是管理后台里比较容易被忽视但实际很繁琐的点开发环境中图片存储在本地上传目录通过后端的静态资源映射暴露访问部署上线时可以考虑放到云存储但在毕设阶段本地存储加Nginx访问完全够用。管理后台的角色是平台运营者核心功能是商家审核、用户管理、数据统计。数据统计我用ECharts实现了一个简单的大屏页面折线图展示近7天订单趋势、饼图展示订单状态分布、柱状图展示商家销量TOP10。这些统计接口对应的SQL要写得高效比如近7天订单趋势就通过 GROUP BY DATE(create_time) 来做数据量大时要建立时间索引。3.3 关键技术点登录鉴权与定时任务登录鉴权这块小程序端的技术方案和Web端略有不同。小程序端是用微信的code换取openid来实现“无密码登录”但标准的流程还需要将openid和用户的手机号绑定后续通过openid直接登录。具体实现小程序端调用wx.login()获取临时code后端拿着code调用微信接口换取openid然后查询用户表——如果记录存在则直接返回JWT不存在则自动注册一个账号再返回JWT。这套流程用户无感知比传统账号密码登录的体验好很多。JWT令牌我用jjwt库生成自定义了payload用户id、角色、过期时间然后用HS256算法签名。拦截器里统一解析请求头中的Authorization字段校验签名和有效期把解析出的用户信息放在ThreadLocal中供后续业务逻辑使用。这套方案在前后端分离架构中优势明显后端无状态扩展时只需要多节点部署不需要处理Session共享。定时任务在处理超时订单时扮演了关键角色。我直接用Spring自带的Scheduled注解实现了一个定时任务每隔一分钟扫描一次订单表把超过15分钟未支付的订单自动修改为已取消并恢复对应的菜品库存。有些同学会问为什么不用消息队列延迟消息因为在毕设项目里引入RabbitMQ或Kafka确实可以展示技术深度但也确实会增加部署复杂度而且延时消息的方案在Spring Boot集成上需要额外配置性价比不高。用Scheduled配合数据库扫描是最直接、最可靠、最容易讲明白的方案。如果后续要扩展这个定时任务还可以加一个功能订单超过30分钟商家未接单时自动取消并推送通知。4. 项目启动配置与部署避坑指南4.1 本地开发环境准备与配置清单把这份项目的代码在本地完整跑起来需要提前准备好一套统一的环境。JDK版本必须用8或11不要用17因为项目使用的很多旧版本依赖尤其是MyBatis-Plus和某些代码生成器在JDK 17下会出现反射访问异常。数据库用MySQL 8.0Redis用5.0以上版本即可。前端部分需要安装Node.js 14用于Vue项目的启动和打包。开发工具方面后端我用的IntelliJ IDEA社区版就够用前端用的VSCode小程序用的微信开发者工具。后端项目的application.yml配置文件里有四个核心配置段需要重点关注。第一段是数据源配置url里需要加上useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai这三个参数后者是8.0以上版本连接MySQL必须要加的参数。第二段是Redis配置注意密码字段如果是空密码就直接注释掉。第三段是文件上传配置本地存储路径需要手动创建比如D:/upload/同时配置静态资源映射路径为/upload/**映射到该物理路径。第四段是JWT的密钥和过期时间配置密钥至少32位过期为7天过期时间太短会导致用户体验差太长又存在安全隐患。数据库初始化文件是一个structure.sql包含全部建表语句和基础测试数据。执行时建议直接通过IDEA的Database工具连接执行而不是用命令行因为编码格式可能在Windows控制台里出问题。执行完成后可以通过几条简单的SELECT语句快速验证数据是否导入成功比如查一下菜品表里是否有测试数据。4.2 后端启动流程与前端联调后端启动比较简单运行SpringBootApplication类即可。但启动过程中有一个常见问题端口被占用。如果8080被占用可以在配置里改成8081但前后端联调时前端代理的target端口记得同步修改。IDEA启动报错时优先看控制台最下面的第一行错误大部分情况都是数据库连接失败或Redis未启动。前端项目的启动分两步。管理后台进入admin-web目录执行npm install安装依赖然后npm run serve启动开发服务访问localhost:9527端口可以在vue.config.js里修改。小程序端用微信开发者工具导入user-miniapp目录同时在project.config.json里检查appid是否配置正确——没有自己的小程序appid可以用测试号但测试号可能某些接口受限。联调过程中最容易出的问题就是跨域。虽然配置了代理但开发初期还是会有新手直接在前端代码里写localhost:8080的完整请求地址绕过代理导致跨域报错。我的建议是前端所有请求都基于axios实例封装通过baseURL加上/api前缀由Vite代理转发到后端8080端口。后端同时开启CorsConfig配置类做兜底。前端通过代理访问是因为请求是浏览器发出的存在跨域限制而代理服务器转发时后端感觉是同一个源这属于开发环境的标准做法。代理路径映射配置里注意处理好路径重写这是很多新手配置代理时最容易搞错的地方。4.3 线上部署实操从Jar包到Nginx部署在Linux服务器上的方式比较稳固。我用的是一台2核4G内存的云服务器系统是CentOS 7.9。首先在服务器上安装JDK 8、MySQL 8.0、Redis 6.0、Nginx 1.20这些都可以通过包管理器直接安装。然后本地上执行mvn clean package -DskipTests打包把target目录下的jar包通过scp传到服务器的/opt/app目录再用nohup java -jar order-system.jar /app/logs/order.log 21 启动。部署中有几个关键细节需要体现。一是MySQL的密码和字符集设置建议直接使用utf8mb4因为它能完整支持emoji表情和生僻字外卖系统的菜品名称和用户备注里经常会出现这些特殊字符。二是Nginx的配置需要同时配置前端静态页面的托管和后端接口的反向代理。前端打包后的dist目录上传到/usr/share/nginx/html然后在配置里新增location /api/块通过proxy_pass转发到localhost:8080。配置完成后记得执行nginx -t检查配置语法然后nginx -s reload重载配置。部署完成后建议做一次全面自测用户端走一遍完整的点餐流程商家端接单出餐管理后台查看数据统计。把所有日志输出到独立文件而不是控制台方便出现问题后排查。线上环境有一个需要特别记录的问题默认的MySQL连接超时时间是8小时如果一晚上没有请求第二天第一次访问时连接池里的连接已经断开会报Communications link failure错误。解决办法是在数据源配置里增加连接有效性检测同时设置合理的空闲回收时间。5. 论文写作与答辩PPT筹备5.1 论文结构安排与写作重点论文的结构要严格按照本校毕设模板来但大纲逻辑基本是通用的。我建议按这样的章节安排第一章绪论背景意义、国内外现状、研究内容、第二章相关技术介绍Spring Boot、MyBatis-Plus、Redis、JWT、Vue、第三章系统分析可行性分析、需求分析、用例图、第四章系统设计总体架构、功能模块设计、数据库设计、第五章系统实现按用户端、商家端、管理后台三个维度写核心功能实现、第六章系统测试功能测试用例表、性能测试结果、第七章总结与展望。写作时的重心应该放在第三章和第四章这两章是体现业务理解和技术设计能力的核心区域。技术介绍章节要控制在6-8页只写与项目直接相关的技术并且最好写一句为什么选择这项技术不要出现大段的官方文档翻译。测试章节至少写20个测试用例覆盖各个角色的核心流程和异常流程每个用例包含测试步骤、预期结果、实际结果、是否通过四列用表格呈现即可。论文中要多插入截图和表格这一点很重要。功能界面截图直接从系统里截取配上文字说明。数据库设计的表格里字段名、类型、约束、说明都要完整。论文篇幅一般要求1.5万字以上包含代码时通常可以达到2万字。代码不要大段粘贴只在关键位置贴核心方法并注释说明。5.2 答辩PPT的设计思路PPT的本质是让答辩老师在五分钟内快速理解你的系统完成了什么、有哪些亮点因此它应该是论文的提纯带着明显的讲述逻辑。我做了12页PPT第一页封面向老师问好并说明选题第二页放背景与意义第三页放系统功能结构图第四页放技术架构图第五到第七页分别展示用户端、商家端、管理后台的核心功能界面第八页放核心难点与解决方案第九页放数据库设计E-R图第十页放测试结果第十一页做总结第十二页标注“请各位老师批评指正”并附上致谢信息。第八页是最重要的一页把项目里最值得说的技术点浓缩成四个卡片JWT鉴权免登录、Redis缓存热点菜品、定时任务自动取消超时订单、订单状态机管理。每一张卡片都要配上“问题-方案-效果”的结构化描述。比如“订单超时未支付如何自动关闭”这个问题方案是定时任务每分钟扫描一次待支付订单优惠价格超过15分钟则自动取消效果是避免无效订单占用库存。这样清晰有力的表达在答辩中非常受用。5.3 答辩老师常问的10个问题整理根据我之前答辩和帮朋友模拟答辩的经验老师几乎必问的问题集中在为什么选型、安全设计、并发场景、数据一致性这四类。常见的第一个问题为什么用Spring Boot而不是传统的SSH框架这个问题考察的是框架演进理解要答出Spring Boot的核心优势自动配置、内嵌Tomcat、无XML配置、生态完善。第二个问题Redis在你的系统里具体缓存了什么数据怎么保证缓存和数据库的一致性这个要如实回答缓存了菜品列表和分类一致性方案可以提到先更新数据库再删除缓存的策略。第三个问题系统如何防止SQL注入这个要答出MyBatis的#{}预编译机制以及不要使用字符串拼接SQL的原则。第四个问题假设在下单高峰期系统会出现什么问题怎么优化可以从数据库连接池、Redis缓存、异步削峰三个维度来回答。第五个问题页面加载慢是怎么排查的可以从浏览器Network面板、数据库慢查询日志、Redis命中率三个方向回答。第六个问题订单状态是怎么保证不出现并发冲突的答出数据库行锁和乐观锁机制。第七个问题JWT和Session的区别这个要答得深入一些包括无状态和有状态的区别、分布式场景下的优劣。第八个问题如果用户支付成功了但后端处理失败怎么办答出本地事务加补偿机制或者引入消息队列来做最终一致性。第九个问题系统里有哪些表表关系如何这种题目要求对数据库结构非常熟练一定要把表名和关联关系背得滚瓜烂熟。第十个问题你觉得自己系统最大的亮点是什么除了技术点之外可以强调你完整经历了需求分析、设计、开发、测试、部署的全流程这对工程能力的锻炼是课堂项目所无法比拟的。6. 实战踩坑记录与个人心得6.1 六个让我印象最深的坑第一个坑是MyBatis-Plus的自动填充失效。我在配置MetaObjectHandler时不小心把实体类字段名写错了导致创建时间一直没有被填充。排查半天才发现是字段映射对不上。解决方案是仔细核对自动填充的字段名和实体类属性名完全一致。第二个坑是购物车跨商家问题。最初设计时没有约束购物车只能存在同一商家的菜品结果用户在A商家加了两个菜又去B商家加了一个菜提交订单时后端按商家拆分订单才发现了问题。解决方案是在接口层直接校验如果购物车里有不同商家的菜品前端就提示“购物车已满请先清空再选购其他商家”。第三个坑是小程序端的本地缓存不清理。用户登录后切换账号购物车数据还是上一个账号的。解决方案是在用户登录成功时主动清除本地购物车缓存并且每次拉取购物车时携带用户id后端按用户维度存储和查询。第四个坑是金额精度问题。刚开始用double计算结果前端显示会出现1.2000000001这种狗血情况。后来全部金额字段统一改为BigDecimal并配合前端保留两位小数显示问题彻底解决。第五个坑是Linux部署后微信小程序请求失败。在本地开发时微信开发者工具默认不校验合法域名所以接口随便一个IP都能访问。但部署到服务器后如果用真机预览小程序要求服务器域名必须是HTTPS且已经配置到小程序后台的合法域名里。这个坑在联调阶段容易浪费大量时间。第六个坑是定时任务重复执行。项目部署了多节点之后多个节点的定时任务同时扫描同一批超时订单可能导致重复处理。解决方案是引入一个分布式锁比如用Redis的setnx命令加锁抢到锁的节点才执行定时任务。6.2 如果你准备用这份代码做二次开发如果你想直接拿这份源码做自己的毕设或项目我建议不要原样照搬而是从以下三个方面做差异化改造。第一功能上加一个自己感兴趣的点比如会员积分体系、优惠券满减、拼单功能。第二技术上加一个自己熟悉但当前系统没用的技术比如ElasticSearch做菜品搜索、RabbitMQ做订单消息通知、Docker封装部署。第三界面风格上做一次整体改造更换主色调和布局风格避免答辩时被同一届学生看出来是同一个模板。改造成本最大的是新增表结构和对应页面但这部分在论文里也是加分项因为它体现了“独立发现问题并解决问题的能力”。比如加优惠券功能需要新增优惠券表、用户领券关系表、订单使用优惠券记录表修改下单金额计算逻辑。这个过程如果完整走一遍你对系统的理解深度就不是停留在“能跑代码”的层面而是真正掌握了业务逻辑的底层。6.3 从毕设到工作的几点心得做这个项目的过程中我最深的体会是毕设的价值不在于代码量多少而在于你能不能把每个设计决策背后的原因讲清楚。面试官和答辩老师看的都是思考深度。因为真实工作中大部分时间花在技术选型、方案对比、边界情况处理、跨团队协调上。你如果在毕设阶段就有意识地去思考“为什么选Redis而不是本地缓存”“为什么加索引”“为什么订单金额要做快照”你在面试时讲项目的深度和自信程度是完全不同的。另一个体会是要重视日志和异常处理。项目里接了一个全局异常处理器所有自定义异常都统一返回统一的错误码和提示信息运行时异常也通过日志记录下来。这个习惯在开发阶段帮助节省了大量定位问题的时间。做毕设时多花点时间在日志、统一响应、异常处理上这些“无趣”的代码会在答辩和面试时成为你手里非常有说服力的素材。最后再分享一个小技巧每次提交代码前把项目从零开始重新跑一遍。只是启动后端、启动前端、走一遍主流程大概只需要10分钟但能帮你避免非常多“我本地明明可以跑”的尴尬。我在答辩前一晚就是这么反复跑了三遍确保现场演示时万无一失。本文还有配套的精品资源点击获取
返回列表