毕业设计实战:基于SpringBoot+Vue的火车票订票系统设计与实现,从0到1避坑指南!

53 阅读9分钟

毕业设计实战:基于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. 环境搭建(一步一截图)

  1. 装JDK 1.8:官网下载,配JAVA_HOME,cmd验证
  2. 装IDEA+插件:装Vue.js、MyBatisX、Lombok插件
  3. MySQL建库create database train_ticket charset=utf8mb4;
  4. SpringBoot项目:用Spring Initializr,选Web、MyBatis、MySQL驱动
  5. 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简单模拟)

  1. 准备一个车次,设置5个座位
  2. 用10个线程同时请求购票接口
  3. 预期结果:只有5个订单成功,5个失败
  4. 检查数据库:座位剩余数应为0,没有重复座位订单

3. 性能优化点

  • 车次查询缓存:热门线路的车次信息缓存到Redis,设置5分钟过期
  • 数据库索引:给train表的departuredestinationdepart_time加联合索引
  • 分页查询:订单列表一定要分页,避免数据量大时卡死

六、答辩准备:突出亮点和解决方案

  1. 演示主线清晰:游客查询→用户登录→选票购票→支付成功→查看订单→管理员后台处理
  2. 讲技术难点:“如何防止超卖”(乐观锁+事务)、“如何设计座位库存”(按日期分表+实时扣减)
  3. 展示数据库设计:ER图展示核心表关系,解释为什么设计座位库存表
  4. 准备问题
    • Q:和12306比差在哪?A:我们专注于校园场景,简化了实名认证、候补等复杂功能,核心购票流程完整
    • Q:能承受多少并发?A:目前单机部署,用乐观锁保证数据一致性,可扩展为集群部署
    • Q:支付怎么实现?A:校园项目用模拟支付,真实环境接支付宝/微信接口

七、论文写作要点(附加分!)

  1. 第三章系统分析:画数据流程图(用户购票、管理员管理车次)
  2. 第四章系统设计:画功能结构图、E-R图、表结构要详细
  3. 第五章系统实现:截图界面时,关键字段要清晰,配简要说明
  4. 第六章测试:测试用例表格化,结果明确

最后:毕设资源分享

火车票系统是经典的电商类毕设,技术栈成熟,业务逻辑清晰,容易出成果。

需要SpringBoot+Vue完整项目源码数据库建表SQL(带测试数据)答辩PPT模板的同学,评论区留言“火车票系统”,我会分享资料。遇到具体问题(如座位并发、订单状态机)也可以提问。

特别提醒

  1. 车次数据用真实数据(如北京-上海G字头),别用假数据
  2. 支付做模拟即可,别真接支付接口(涉及资金安全)
  3. 前端界面简洁大方,别搞花哨特效

点赞收藏,毕业设计一次过!祝大家顺利毕业!🎓