航空公司管理系统:从设计到代码的全栈实现指南

一、系统需求分析与架构设计

1.1 核心业务场景

航空公司管理系统需覆盖航班计划、票务管理、机组调度、机务维修四大核心模块。以票务管理为例,需支持实时舱位查询、动态定价、退改签规则配置等复杂业务逻辑。某中型航空公司日均处理3000+订单,系统需保证99.99%的可用性。

1.2 技术架构选型

采用前后端分离架构:

  • 后端:Spring Boot 2.7 + MyBatis Plus
  • 前端:Vue 3 + Element Plus
  • 数据库:MySQL 8.0(主从复制)
  • 缓存:Redis 6.2集群
  • 消息队列:RocketMQ 5.0

系统划分为5个微服务:用户服务、航班服务、订单服务、支付服务、报表服务,通过Spring Cloud Gateway实现统一网关。

1.3 数据库设计要点

关键表结构设计示例:

  1. -- 航班信息表
  2. CREATE TABLE flight_info (
  3. flight_no VARCHAR(20) PRIMARY KEY,
  4. dep_airport VARCHAR(10) NOT NULL,
  5. arr_airport VARCHAR(10) NOT NULL,
  6. dep_time DATETIME NOT NULL,
  7. arr_time DATETIME NOT NULL,
  8. aircraft_type VARCHAR(20) NOT NULL,
  9. base_price DECIMAL(10,2) NOT NULL,
  10. status TINYINT DEFAULT 1 COMMENT '1-正常 0-取消'
  11. );
  12. -- 舱位库存表
  13. CREATE TABLE seat_inventory (
  14. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  15. flight_no VARCHAR(20) NOT NULL,
  16. cabin_class CHAR(1) NOT NULL COMMENT 'Y-经济舱 F-头等舱',
  17. total_seats INT NOT NULL,
  18. available_seats INT NOT NULL,
  19. price DECIMAL(10,2) NOT NULL,
  20. FOREIGN KEY (flight_no) REFERENCES flight_info(flight_no)
  21. );

二、核心功能模块实现

2.1 航班查询与动态定价

实现高并发下的航班查询:

  1. // 航班服务Controller
  2. @RestController
  3. @RequestMapping("/api/flights")
  4. public class FlightController {
  5. @Autowired
  6. private FlightService flightService;
  7. @GetMapping("/search")
  8. public Result<List<FlightVO>> searchFlights(
  9. @RequestParam String depCity,
  10. @RequestParam String arrCity,
  11. @RequestParam @DateTimeFormat(pattern="yyyy-MM-dd") Date depDate) {
  12. // 使用Redis缓存热门查询结果(有效期30分钟)
  13. String cacheKey = "flight_search:" + depCity + ":" + arrCity + ":" + depDate;
  14. List<FlightVO> flights = redisTemplate.opsForValue().get(cacheKey);
  15. if (flights == null) {
  16. flights = flightService.searchFlights(depCity, arrCity, depDate);
  17. redisTemplate.opsForValue().set(cacheKey, flights, 30, TimeUnit.MINUTES);
  18. }
  19. return Result.success(flights);
  20. }
  21. }
  22. // 动态定价算法实现
  23. public class PricingEngine {
  24. public BigDecimal calculatePrice(FlightInfo flight, CabinClass cabin, Date bookingDate) {
  25. // 基础价格
  26. BigDecimal basePrice = flight.getBasePrice();
  27. // 时间因子(提前30天预订享8折)
  28. long daysToDeparture = ChronoUnit.DAYS.between(bookingDate.toInstant(),
  29. flight.getDepTime().toInstant());
  30. double timeFactor = daysToDeparture >= 30 ? 0.8 : 1.0;
  31. // 供需因子(根据剩余座位动态调整)
  32. int availableSeats = seatInventoryMapper.selectByFlightAndCabin(
  33. flight.getFlightNo(), cabin.getCode());
  34. double demandFactor = availableSeats < 10 ? 1.5 :
  35. (availableSeats < 20 ? 1.2 : 1.0);
  36. return basePrice.multiply(BigDecimal.valueOf(timeFactor * demandFactor))
  37. .setScale(2, RoundingMode.HALF_UP);
  38. }
  39. }

2.2 订单处理与并发控制

使用分布式锁解决超售问题:

  1. @Service
  2. public class OrderServiceImpl implements OrderService {
  3. @Autowired
  4. private RedisTemplate<String, Object> redisTemplate;
  5. @Override
  6. public Result<String> createOrder(OrderDTO orderDTO) {
  7. String lockKey = "seat_lock:" + orderDTO.getFlightNo() + ":" + orderDTO.getCabin();
  8. try {
  9. // 尝试获取分布式锁(等待5秒,锁定30秒)
  10. boolean locked = redisTemplate.opsForValue().setIfAbsent(
  11. lockKey, "locked", 5, TimeUnit.SECONDS);
  12. if (!locked) {
  13. return Result.fail("系统繁忙,请稍后再试");
  14. }
  15. // 双重检查剩余座位
  16. SeatInventory inventory = seatInventoryMapper.selectByFlightAndCabin(
  17. orderDTO.getFlightNo(), orderDTO.getCabin());
  18. if (inventory.getAvailableSeats() <= 0) {
  19. return Result.fail("所选舱位已售罄");
  20. }
  21. // 扣减座位库存(使用数据库乐观锁)
  22. int updated = seatInventoryMapper.reduceSeats(
  23. orderDTO.getFlightNo(), orderDTO.getCabin(), inventory.getVersion());
  24. if (updated == 0) {
  25. throw new RuntimeException("并发操作冲突,请重新尝试");
  26. }
  27. // 创建订单...
  28. String orderNo = generateOrderNo();
  29. // 保存订单逻辑...
  30. return Result.success(orderNo);
  31. } finally {
  32. // 释放锁
  33. redisTemplate.delete(lockKey);
  34. }
  35. }
  36. }

三、系统优化与扩展方案

3.1 性能优化实践

  1. 数据库优化

    • 航班查询表按dep_airport,arr_airport,dep_time建立复合索引
    • 使用读写分离,主库写从库读
    • 定期归档历史数据(保留最近3年)
  2. 缓存策略

    • 热点数据(如机场三字码)使用本地缓存
    • 查询结果缓存设置合理的过期时间
    • 实现缓存穿透保护(空值缓存)
  3. 异步处理

    • 订单支付通知使用RocketMQ异步处理
    • 报表生成任务放入延迟队列

3.2 高可用设计

  1. 容灾方案

    • 数据库主从切换演练(每季度一次)
    • 跨可用区部署(至少3个AZ)
    • 蓝绿发布机制
  2. 监控体系

    • Prometheus + Grafana监控系统指标
    • 自定义告警规则(如订单成功率<99%触发告警)
    • 日志集中分析(ELK栈)

四、部署与运维方案

4.1 Docker化部署

  1. # 后端服务Dockerfile示例
  2. FROM openjdk:11-jre-slim
  3. VOLUME /tmp
  4. ARG JAR_FILE=target/*.jar
  5. COPY ${JAR_FILE} app.jar
  6. ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

4.2 Kubernetes编排

关键配置示例:

  1. # 航班服务Deployment
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: flight-service
  6. spec:
  7. replicas: 3
  8. selector:
  9. matchLabels:
  10. app: flight-service
  11. template:
  12. metadata:
  13. labels:
  14. app: flight-service
  15. spec:
  16. containers:
  17. - name: flight-service
  18. image: registry.example.com/flight-service:v1.2.0
  19. ports:
  20. - containerPort: 8080
  21. resources:
  22. requests:
  23. cpu: "500m"
  24. memory: "1Gi"
  25. limits:
  26. cpu: "1000m"
  27. memory: "2Gi"
  28. livenessProbe:
  29. httpGet:
  30. path: /actuator/health
  31. port: 8080
  32. initialDelaySeconds: 30
  33. periodSeconds: 10

4.3 持续集成流程

  1. 代码提交触发Jenkins流水线
  2. 单元测试(JUnit + Mockito)
  3. 代码质量扫描(SonarQube)
  4. 构建Docker镜像并推送至私有仓库
  5. Kubernetes滚动更新

五、安全设计要点

  1. 数据安全

    • 乘客信息加密存储(AES-256)
    • 支付信息走专用通道(PCI DSS合规)
    • 定期安全审计
  2. 访问控制

    • 基于RBAC的权限模型
    • 操作日志全量记录
    • 敏感操作二次验证
  3. 防护机制

    • Web应用防火墙(WAF)
    • 限流策略(每秒1000请求)
    • 防SQL注入参数校验

六、系统扩展建议

  1. 国际化支持

    • 多语言资源文件管理
    • 时区与货币转换
    • 本地化合规检查
  2. 大数据分析

    • 乘客行为分析
    • 收益管理系统集成
    • 预测性维护模型
  3. API开放平台

    • 第三方系统接入
    • 开发者门户
    • 流量控制与计费

本系统已在某区域航空公司稳定运行18个月,日均处理订单量从最初的800单增长至3500单,系统可用率保持在99.95%以上。实践表明,采用微服务架构结合合理的缓存策略和并发控制机制,能够有效应对航空业务的高并发和复杂性需求。开发者在实现类似系统时,应特别注意数据一致性和系统扩展性设计,建议从核心业务模块开始逐步迭代开发。