毕业设计实战:基于SpringBoot+Vue的火车票订票系统设计与实现,从0到1避坑指南!
当初做火车票订票系统毕设时,光“座位库存”和“订单生成”的并发处理就卡了4天——多个用户同时抢同一座位时没加锁,导致“一票多卖”,导师一句“业务逻辑不严谨”让我重构了数据库设计😫 踩遍所有坑后总结出这套高效流程,今天把需求分析、技术选型、核心功能到测试的全流程细节说透,让你轻松搞定高质量毕设!
一、先搞懂“火车票订票系统要啥”!需求分析别想当然
刚开始我做系统时,想着加个“智能推荐最优路线”的算法,结果导师说“核心是车次管理、座位库存、订单流程,不是复杂算法”。后来明白,需求分析要先抓住“用户真实痛点”,这步做对,能避免80%的返工!
1. 核心用户&功能拆解(实战验证版)
系统有三类用户:管理员、会员用户、游客,权限要严格区分:
-
会员用户端(核心体验):
- 车次查询:按出发地/目的地/日期筛选、查看车次详情(时间、票价、余票)
- 在线购票:选择座位、填写乘客信息、生成订单、模拟支付
- 订单管理:查看我的订单、取消未支付订单、查看历史订单
- 个人信息:维护常用乘客信息、查看购票记录、账户余额管理
- 留言反馈:提交问题咨询、查看回复
-
管理员端(后台管理):
- 车次管理:发布/下架车次、设置票价和座位数、管理经停站信息
- 订单管理:查看所有订单、处理退款申请、导出订单报表
- 会员管理:审核注册用户、冻结异常账户、重置密码
- 留言管理:回复用户咨询、管理留言内容
- 数据统计:查看热门车次、销售数据统计
-
游客功能:
- 车次查询:查看车次信息
- 用户注册:填写信息成为会员
2. 需求分析避坑指南(血泪教训)
- 别做“火车站大屏”:我当初想做实时座位图,结果数据库压力巨大。简化成“按车厢显示余票数”就够用
- 一定要画业务流程图:用DrawIO画“查询→选座→下单→支付→出票”完整流程,导师一眼看懂核心逻辑
- 约束条件提前写:“身份证号必须18位”、“出发时间必须晚于当前时间”、“同一车次同一座位不能重复售出”,编码时直接实现
3. 可行性分析三句话说清楚
- 技术可行:SpringBoot简化配置,Vue组件化开发,MySQL存储关系型数据完全胜任
- 经济可行:所有工具免费(IDEA社区版+MySQL+Tomcat),部署到云服务器学生版一年不到100元
- 操作可行:界面模仿12306,用户零学习成本,管理员后台简洁直观
二、技术选型:稳定大于一切!
当初跟风用SpringBoot 3.x + Vue3 + Redis缓存,结果“余票查询”缓存同步问题卡了3天。推荐Java 8 + SpringBoot 2.7 + MySQL 8.0 + Vue2,资料多,坑少!
1. 技术栈选择理由
| 技术 | 为什么选 | 避坑提醒 |
|---|---|---|
| SpringBoot 2.7 | 自动配置、内嵌Tomcat、开发效率比SSM高50% | 别用3.x!与部分中间件兼容性差 |
| Vue2 + ElementUI | 组件丰富、表格和表单开发快、学习曲线平缓 | 别用Vue3+TS!毕设时间紧,别在语法上耗时间 |
| MySQL 8.0 | 支持事务、性能好、窗口函数方便统计 | 一定设utf8mb4编码,不然生僻姓名乱码 |
| Redis(可选) | 缓存热门车次查询,提升性能 | 非必需!初期可不用,答辩时说“可扩展” |
2. 环境搭建(一步一截图)
- 装JDK 1.8:官网下载,配JAVA_HOME,cmd验证
- 装IDEA+插件:装Vue.js、MyBatisX、Lombok插件
- MySQL建库:
create database train_ticket charset=utf8mb4; - SpringBoot项目:用Spring Initializr,选Web、MyBatis、MySQL驱动
- Vue项目:vue-cli创建,装axios、element-ui、vue-router
三、数据库设计:并发问题是核心
票务系统最怕“超卖”!我当初没设计好座位库存逻辑,同一个座位被卖了两次,差点毕设挂掉。
1. 核心表设计(6张表足够)
- 车次表(train):id、车次号、出发地、目的地、出发时间、到达时间、票价、总座位数、剩余座位数、状态(上架/下架)
- 座位库存表(seat_inventory):id、车次id、日期、车厢号、座位类型、总数量、剩余数量(按日期分表是关键!)
- 订单表(order):id、订单号、用户id、车次id、乘车人信息、座位信息、订单状态(待支付/已支付/已取消)、实付金额、创建时间
- 用户表(user):id、用户名、密码、真实姓名、身份证号、手机号、邮箱、余额
- 留言表(message):id、用户id、标题、内容、回复、状态
- 字典表(dict):车站名称、座位类型、订单状态等枚举值
2. 核心业务逻辑实现
避坑重点:如何防止超卖?
// 错误做法(我当初的坑):
public boolean buyTicket(Long trainId, Long userId) {
Train train = trainMapper.selectById(trainId);
if (train.getRemainSeats() > 0) {
train.setRemainSeats(train.getRemainSeats() - 1);
trainMapper.updateById(train); // 这里可能被并发覆盖!
createOrder(trainId, userId);
return true;
}
return false;
}
// 正确做法(使用乐观锁):
public boolean buyTicket(Long trainId, Long userId) {
Train train = trainMapper.selectById(trainId);
if (train.getRemainSeats() > 0) {
int rows = trainMapper.updateRemainSeats(trainId, train.getVersion());
if (rows > 0) {
createOrder(trainId, userId);
return true;
}
}
return false; // 更新失败说明被别人抢了
}
3. 表关联测试必须做!
-- 查询用户“张三”的所有订单及车次信息
SELECT o.order_no, t.train_no, t.departure, t.destination,
t.depart_time, o.seat_info, o.status, o.actual_amount
FROM `order` o
JOIN train t ON o.train_id = t.id
JOIN user u ON o.user_id = u.id
WHERE u.username = '张三'
ORDER BY o.create_time DESC;
四、功能实现:抓住票务核心流程
不用做“候补购票”、“中转推荐”等复杂功能!把“查票→选座→下单→支付”主流程做完整,答辩足够用。
1. 用户端:购票流程(必做!)
-
车次查询页:
- 三要素:出发地、目的地、日期(默认今天)
- 筛选条件:车次类型(高铁/动车/普快)、出发时间范围
- 列表显示:车次号、时间、历时、票价、余票(余票小于10张标红)
-
座位选择页:
- 显示车厢和座位类型(一等座、二等座)
- 简化设计:不画真实座位图,用“剩余X张”代替
- 选择数量,立即计算总价
-
订单确认页:
- 自动填充登录用户信息
- 可添加新乘客(姓名、身份证号)
- 倒计时15分钟支付(用前端定时器实现)
2. 管理员端:车次和订单管理
- 车次管理:
- 列表:车次号、起止站、时间、票价、总座位、剩余座位、状态
- 操作:新增(表单验证所有字段)、编辑、下架(逻辑删除)
- 重点:设置座位库存时,要同步生成未来30天的库存记录
- 订单管理:
- 按状态筛选:待支付、已支付、已取消
- 按条件查询:订单号、用户姓名、车次号
- 操作:查看详情、手动取消(退款)、导出Excel
3. 页面设计要点
- 色彩方案:主色蓝色(科技感),辅色绿色(成功)、红色(警告)
- 响应式:Bootstrap栅格,手机端折叠导航
- 交互反馈:任何操作都有明确提示(成功/失败/等待)
五、测试:并发测试是重点!
很多同学只测“正常下单”,没测“多人抢票”,答辩时导师一模拟就出问题。
1. 功能测试用例
| 测试场景 | 操作步骤 | 预期结果 |
|---|---|---|
| 余票为0时购票 | 查询无余票车次,点击购票 | 提示“该车次已无余票” |
| 重复购买同一座位 | 两个浏览器同时买同一车次同座位 | 只有一个成功,另一个提示“座位已被占用” |
| 超时未支付 | 下单后等待15分钟不支付 | 订单自动取消,座位释放回库存 |
| 身份证格式校验 | 输入17位身份证提交 | 提示“身份证号应为18位” |
2. 并发测试(用Jmeter简单模拟)
- 准备一个车次,设置5个座位
- 用10个线程同时请求购票接口
- 预期结果:只有5个订单成功,5个失败
- 检查数据库:座位剩余数应为0,没有重复座位订单
3. 性能优化点
- 车次查询缓存:热门线路的车次信息缓存到Redis,设置5分钟过期
- 数据库索引:给
train表的departure、destination、depart_time加联合索引 - 分页查询:订单列表一定要分页,避免数据量大时卡死
六、答辩准备:突出亮点和解决方案
- 演示主线清晰:游客查询→用户登录→选票购票→支付成功→查看订单→管理员后台处理
- 讲技术难点:“如何防止超卖”(乐观锁+事务)、“如何设计座位库存”(按日期分表+实时扣减)
- 展示数据库设计:ER图展示核心表关系,解释为什么设计座位库存表
- 准备问题:
- Q:和12306比差在哪?A:我们专注于校园场景,简化了实名认证、候补等复杂功能,核心购票流程完整
- Q:能承受多少并发?A:目前单机部署,用乐观锁保证数据一致性,可扩展为集群部署
- Q:支付怎么实现?A:校园项目用模拟支付,真实环境接支付宝/微信接口
七、论文写作要点(附加分!)
- 第三章系统分析:画数据流程图(用户购票、管理员管理车次)
- 第四章系统设计:画功能结构图、E-R图、表结构要详细
- 第五章系统实现:截图界面时,关键字段要清晰,配简要说明
- 第六章测试:测试用例表格化,结果明确
最后:毕设资源分享
火车票系统是经典的电商类毕设,技术栈成熟,业务逻辑清晰,容易出成果。
需要SpringBoot+Vue完整项目源码、数据库建表SQL(带测试数据)、答辩PPT模板的同学,评论区留言“火车票系统”,我会分享资料。遇到具体问题(如座位并发、订单状态机)也可以提问。
特别提醒:
- 车次数据用真实数据(如北京-上海G字头),别用假数据
- 支付做模拟即可,别真接支付接口(涉及资金安全)
- 前端界面简洁大方,别搞花哨特效
点赞收藏,毕业设计一次过!祝大家顺利毕业!🎓