基于SpringBoot+Vue+MySQL的中国铁路12306系统大学生期末项目实践

一、项目背景与目标

中国铁路12306平台作为全球最大的在线票务系统,日均处理千万级请求,其核心业务包括车次查询、余票管理、订单生成与支付等。本期末项目旨在通过SpringBoot(后端)Vue(前端)MySQL(数据库)的技术组合,模拟实现12306平台的核心业务流程,验证学生对于高并发场景下系统设计、数据库优化及前后端分离架构的掌握程度。

项目目标明确为:

  1. 实现车次信息管理、余票动态更新、用户购票流程等核心功能;
  2. 通过MySQL索引优化与事务管理,提升数据读写效率;
  3. 利用Vue实现响应式界面,模拟12306的交互体验;
  4. 基于SpringBoot的RESTful API设计,完成前后端数据交互。

二、技术选型与架构设计

1. 技术栈选择

  • SpringBoot:基于Java的微服务框架,提供快速开发能力与完善的依赖管理,适合构建高并发的后端服务。
  • Vue.js:渐进式前端框架,支持组件化开发与数据双向绑定,可高效实现动态页面渲染。
  • MySQL:关系型数据库,通过索引优化与事务隔离级别设置,满足票务系统对数据一致性的严格要求。
  • Redis(可选扩展):用于缓存热点数据(如余票信息),减轻数据库压力。

2. 系统架构

采用分层架构设计:

  • 表现层(Vue):负责用户界面展示与交互,通过Axios调用后端API。
  • 业务逻辑层(SpringBoot):处理车次查询、订单生成、支付校验等核心业务。
  • 数据访问层(MyBatis):封装MySQL操作,实现CRUD与事务管理。
  • 数据库层(MySQL):存储车次、用户、订单等数据,通过分表策略优化性能。

三、核心功能实现

1. 车次与余票管理

  • 数据库设计

    • train_schedule表:存储车次编号、出发站、到达站、出发时间、座位类型及总数。
    • ticket_stock表:记录各车次剩余票数,通过事务保证余票更新的原子性。
      1. CREATE TABLE ticket_stock (
      2. id INT AUTO_INCREMENT PRIMARY KEY,
      3. train_id VARCHAR(20) NOT NULL,
      4. seat_type VARCHAR(10) NOT NULL,
      5. remaining_tickets INT DEFAULT 0,
      6. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
      7. );
  • 并发控制
    使用MySQL的行级锁(SELECT ... FOR UPDATE)防止超卖:

    1. @Transactional
    2. public boolean reserveTicket(String trainId, String seatType, int quantity) {
    3. TicketStock stock = ticketStockMapper.selectByTrainAndSeat(trainId, seatType);
    4. if (stock.getRemainingTickets() < quantity) {
    5. return false;
    6. }
    7. ticketStockMapper.updateRemainingTickets(trainId, seatType, stock.getRemainingTickets() - quantity);
    8. return true;
    9. }

2. 用户购票流程

  • 前端交互(Vue)
    通过表单收集用户信息(出发地、目的地、日期),调用后端接口获取车次列表:

    1. axios.get('/api/trains', { params: { from: '北京', to: '上海', date: '2023-12-01' } })
    2. .then(response => { this.trains = response.data; });
  • 订单生成
    后端验证余票后生成订单,使用UUID作为订单号,并记录用户ID、车次信息及支付状态:

    1. public Order createOrder(User user, TrainSchedule train, int ticketCount) {
    2. Order order = new Order();
    3. order.setOrderId(UUID.randomUUID().toString());
    4. order.setUserId(user.getId());
    5. order.setTrainId(train.getId());
    6. order.setTicketCount(ticketCount);
    7. order.setStatus("UNPAID");
    8. orderMapper.insert(order);
    9. return order;
    10. }

3. 支付与通知

  • 模拟支付
    通过定时任务(Spring Scheduler)模拟第三方支付回调,更新订单状态为“PAID”:
    1. @Scheduled(fixedRate = 5000)
    2. public void processPayments() {
    3. List<Order> unpaidOrders = orderMapper.selectByStatus("UNPAID");
    4. unpaidOrders.forEach(order -> {
    5. // 模拟支付成功
    6. order.setStatus("PAID");
    7. orderMapper.update(order);
    8. // 发送通知(邮件/短信)
    9. });
    10. }

四、性能优化与测试

1. 数据库优化

  • 索引设计
    ticket_stock表的train_idseat_type字段上建立复合索引,加速余票查询:

    1. CREATE INDEX idx_train_seat ON ticket_stock (train_id, seat_type);
  • 分表策略
    按日期分表存储历史订单,减少单表数据量。

2. 压力测试

使用JMeter模拟1000并发用户进行购票操作,监控数据库连接池(HikariCP)与响应时间,优化后系统平均响应时间降至200ms以内。

五、项目总结与启示

1. 技术收获

  • 掌握了SpringBoot的事务管理与RESTful API设计;
  • 理解了高并发场景下数据库锁机制的重要性;
  • 学会了通过Vue实现动态数据绑定与组件化开发。

2. 实践建议

  • 初学者:优先实现核心功能(如车次查询、购票),再逐步扩展支付与通知模块;
  • 进阶优化:引入Redis缓存余票数据,使用消息队列(如RabbitMQ)解耦订单生成与支付流程;
  • 团队协作:通过Git进行版本控制,利用Postman进行API文档管理与测试。

3. 未来方向

  • 集成第三方登录(如微信、支付宝);
  • 添加车次晚点预测与智能推荐功能;
  • 部署至云服务器(如阿里云ECS),配置Nginx负载均衡。

六、结语

本期末项目通过SpringBoot+Vue+MySQL的技术组合,成功模拟了12306平台的核心业务,验证了学生在系统设计、数据库优化与前后端交互方面的能力。项目不仅巩固了理论知识,更为未来开发实际业务系统提供了宝贵经验。