一、项目背景与目标
中国铁路12306平台作为全球最大的在线票务系统,日均处理千万级请求,其核心业务包括车次查询、余票管理、订单生成与支付等。本期末项目旨在通过SpringBoot(后端)、Vue(前端)与MySQL(数据库)的技术组合,模拟实现12306平台的核心业务流程,验证学生对于高并发场景下系统设计、数据库优化及前后端分离架构的掌握程度。
项目目标明确为:
- 实现车次信息管理、余票动态更新、用户购票流程等核心功能;
- 通过MySQL索引优化与事务管理,提升数据读写效率;
- 利用Vue实现响应式界面,模拟12306的交互体验;
- 基于SpringBoot的RESTful API设计,完成前后端数据交互。
二、技术选型与架构设计
1. 技术栈选择
- SpringBoot:基于Java的微服务框架,提供快速开发能力与完善的依赖管理,适合构建高并发的后端服务。
- Vue.js:渐进式前端框架,支持组件化开发与数据双向绑定,可高效实现动态页面渲染。
- MySQL:关系型数据库,通过索引优化与事务隔离级别设置,满足票务系统对数据一致性的严格要求。
- Redis(可选扩展):用于缓存热点数据(如余票信息),减轻数据库压力。
2. 系统架构
采用分层架构设计:
- 表现层(Vue):负责用户界面展示与交互,通过Axios调用后端API。
- 业务逻辑层(SpringBoot):处理车次查询、订单生成、支付校验等核心业务。
- 数据访问层(MyBatis):封装MySQL操作,实现CRUD与事务管理。
- 数据库层(MySQL):存储车次、用户、订单等数据,通过分表策略优化性能。
三、核心功能实现
1. 车次与余票管理
-
数据库设计:
train_schedule表:存储车次编号、出发站、到达站、出发时间、座位类型及总数。ticket_stock表:记录各车次剩余票数,通过事务保证余票更新的原子性。CREATE TABLE ticket_stock (id INT AUTO_INCREMENT PRIMARY KEY,train_id VARCHAR(20) NOT NULL,seat_type VARCHAR(10) NOT NULL,remaining_tickets INT DEFAULT 0,update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
-
并发控制:
使用MySQL的行级锁(SELECT ... FOR UPDATE)防止超卖:@Transactionalpublic boolean reserveTicket(String trainId, String seatType, int quantity) {TicketStock stock = ticketStockMapper.selectByTrainAndSeat(trainId, seatType);if (stock.getRemainingTickets() < quantity) {return false;}ticketStockMapper.updateRemainingTickets(trainId, seatType, stock.getRemainingTickets() - quantity);return true;}
2. 用户购票流程
-
前端交互(Vue):
通过表单收集用户信息(出发地、目的地、日期),调用后端接口获取车次列表:axios.get('/api/trains', { params: { from: '北京', to: '上海', date: '2023-12-01' } }).then(response => { this.trains = response.data; });
-
订单生成:
后端验证余票后生成订单,使用UUID作为订单号,并记录用户ID、车次信息及支付状态:public Order createOrder(User user, TrainSchedule train, int ticketCount) {Order order = new Order();order.setOrderId(UUID.randomUUID().toString());order.setUserId(user.getId());order.setTrainId(train.getId());order.setTicketCount(ticketCount);order.setStatus("UNPAID");orderMapper.insert(order);return order;}
3. 支付与通知
- 模拟支付:
通过定时任务(Spring Scheduler)模拟第三方支付回调,更新订单状态为“PAID”:@Scheduled(fixedRate = 5000)public void processPayments() {List<Order> unpaidOrders = orderMapper.selectByStatus("UNPAID");unpaidOrders.forEach(order -> {// 模拟支付成功order.setStatus("PAID");orderMapper.update(order);// 发送通知(邮件/短信)});}
四、性能优化与测试
1. 数据库优化
-
索引设计:
在ticket_stock表的train_id和seat_type字段上建立复合索引,加速余票查询: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平台的核心业务,验证了学生在系统设计、数据库优化与前后端交互方面的能力。项目不仅巩固了理论知识,更为未来开发实际业务系统提供了宝贵经验。