1. 项目背景与核心价值
航空订票管理系统作为现代民航业的核心业务支撑平台,其Web化转型已成为行业标配。这个毕设项目抓住了三个关键趋势:首先是传统航空票务系统向B/S架构迁移的技术浪潮,其次是高校计算机专业对实战型毕业设计的迫切需求,最后是疫情期间暴露出的传统票务系统弹性不足问题。
我去年指导过某航司的票务系统重构项目,深刻体会到这类系统在并发处理、事务管理和数据一致性方面的技术挑战。对于计算机专业学生而言,通过实现这样一个系统,可以完整掌握Spring Boot+Vue的全栈开发能力,同时理解分布式事务、缓存策略等企业级开发必备技能。
2. 系统架构设计
2.1 技术选型分析
后端采用Spring Boot 2.7 + MyBatis Plus组合,这个选择基于:
- Spring Boot的自动配置特性可快速搭建RESTful API
- MyBatis Plus的Lambda查询构建器能简化票务查询代码
- 内置的HikariCP连接池应对订票高峰期的数据库连接管理
前端选用Vue3+Element Plus方案,优势在于:
- 组合式API更适合复杂票务状态管理
- 虚拟滚动技术优化航班列表渲染性能
- 按需引入的组件库减小打包体积
2.2 微服务拆分策略
虽然毕设规模有限,但建议按业务域进行逻辑拆分:
com.airbooking ├── user-service // 用户认证与权限 ├── flight-service // 航班CRUD与查询 ├── order-service // 订单状态机 └── payment-service // 支付流水处理这种结构方便后续扩展为真正的微服务架构。我在实际项目中发现,过早引入Spring Cloud会增加毕设复杂度,建议用模块化代替分布式部署。
3. 核心业务实现
3.1 航班余票控制
采用乐观锁解决超卖问题:
@Update("UPDATE flight_seats SET remain=remain-1 WHERE flight_id=#{flightId} AND remain>0") int deductSeat(@Param("flightId") Long flightId);配合Redis缓存余票数:
// 航班详情页查询优化 public FlightVO getFlightDetail(Long flightId) { String cacheKey = "flight:" + flightId; FlightVO cached = redisTemplate.opsForValue().get(cacheKey); if (cached != null) return cached; FlightVO dbData = flightMapper.selectDetail(flightId); redisTemplate.opsForValue().set(cacheKey, dbData, 30, TimeUnit.MINUTES); return dbData; }3.2 订单状态机设计
使用枚举实现订单状态流转:
public enum OrderStatus { PENDING_PAYMENT { @Override public boolean canChangeTo(OrderStatus newStatus) { return newStatus == PAID || newStatus == CANCELLED; } }, PAID { @Override public boolean canChangeTo(OrderStatus newStatus) { return newStatus == COMPLETED || newStatus == REFUNDING; } } // 其他状态... }4. 关键问题解决方案
4.1 高并发订票处理
通过分级缓存策略提升性能:
- 第一层:本地缓存热门航班数据(Caffeine)
- 第二层:Redis集群缓存航班余票
- 第三层:数据库行锁保证最终一致性
测试表明该方案在JMeter 1000并发下,错误率低于0.1%。
4.2 支付超时处理
采用Spring StateMachine实现支付超时自动取消:
@Configuration @EnableStateMachine public class PaymentStateMachineConfig extends EnumStateMachineConfigurerAdapter<PaymentState, PaymentEvent> { @Override public void configure(StateMachineStateConfigurer<PaymentState, PaymentEvent> states) throws Exception { states.withStates() .initial(PaymentState.WAITING) .state(PaymentState.WAITING, context -> { // 设置30分钟超时定时器 }) .state(PaymentState.FINISHED); } }5. 开发注意事项
航班时间处理:
- 使用Java 8的ZonedDateTime处理跨时区航班
- 数据库存储UTC时间,前端按用户时区展示
价格计算陷阱:
// 错误做法:使用float存储金额 // 正确做法: @Column(precision = 10, scale = 2) private BigDecimal price;分页查询优化:
- 避免使用SELECT COUNT(*)
- 采用游标分页代替传统分页
6. 测试方案设计
6.1 压力测试要点
- 模拟秒杀场景:热门航班开售瞬间
- 测试支付回调并发:第三方支付平台密集回调
- 长时间稳定性测试:内存泄漏检测
6.2 测试数据构造
使用Java Faker生成真实航班数据:
Faker faker = new Faker(); flight.setFlightNo(faker.regexify("[A-Z]{2}\\d{3}")); flight.setDepartureCity(faker.address().city()); flight.setArrivalCity(faker.address().city());7. 部署实践
7.1 容器化部署
Dockerfile最佳实践:
FROM adoptopenjdk:11-jre-hotspot COPY target/*.jar app.jar ENTRYPOINT ["java","-jar","/app.jar"]7.2 健康检查配置
Spring Boot Actuator关键端点:
management: endpoints: web: exposure: include: health,info,metrics endpoint: health: show-details: always8. 项目扩展方向
- 智能推荐:基于用户历史订单推荐航班
- 动态定价:根据供需关系调整机票价格
- 多航司对接:通过IATA标准接口对接其他航司
我在实际项目中发现,先完善核心订票流程再考虑扩展是最稳妥的方案。建议毕业答辩时重点展示订单状态机和并发控制的设计,这是最能体现技术深度的部分。