1. 项目背景与核心需求
汽车售票网站作为传统客运行业数字化转型的关键载体,正在经历从单纯票务功能向综合出行服务平台转变的过程。m088项目正是基于这样的行业背景,旨在打造一个集班次查询、在线购票、订单管理、旅客服务于一体的现代化汽车票务平台。
这个系统的核心价值在于解决了三个行业痛点:
- 消除地域购票限制,旅客无需再到车站排队
- 实时同步全国客运班次数据,避免信息孤岛
- 通过电子票务系统降低运营方人力成本
从技术视角看,这类系统需要重点处理:
- 高并发售票时的库存一致性
- 多运营商间的数据接口标准化
- 移动端与PC端的跨平台体验统一
2. 系统架构设计
2.1 技术栈选型
前端采用Vue3+Element Plus组合,主要考虑因素包括:
- 组件库丰富,适合快速搭建后台管理系统
- 组合式API更利于复杂业务逻辑封装
- 打包体积比React更小,适合移动端场景
后端选择Spring Boot+MyBatis框架组合,关键优势体现在:
- 自动配置机制简化了微服务部署
- 与Redis的缓存集成只需简单注解
- MyBatis的动态SQL便于处理复杂查询条件
数据库采用MySQL 8.0+Redis 6.2组合方案:
CREATE TABLE `ticket_order` ( `order_id` varchar(32) NOT NULL COMMENT '雪花算法生成', `schedule_id` bigint NOT NULL COMMENT '班次ID', `seat_numbers` varchar(255) NOT NULL COMMENT 'JSON格式座位号', `order_status` tinyint NOT NULL DEFAULT '0' COMMENT '0未支付1已支付2已退票', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`order_id`), KEY `idx_schedule` (`schedule_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb42.2 微服务拆分方案
将系统拆分为四个核心服务:
- 用户服务:处理注册登录、个人信息管理
- 班次服务:维护车次、站点、时刻表数据
- 订单服务:处理购票、退改签业务流
- 支付服务:对接微信/支付宝支付网关
服务间通信采用RocketMQ实现最终一致性,例如:
- 支付成功消息触发订单状态更新
- 退票申请触发座位库存释放
3. 核心业务实现
3.1 余票查询优化
采用多级缓存策略提升查询性能:
- 本地缓存:使用Caffeine缓存热门线路数据
- 分布式缓存:Redis存储实时余票数量
- 数据库:每日凌晨预生成余票快照
缓存更新策略示例:
@CacheEvict(cacheNames = "ticketCache", key = "#scheduleId") public void updateTicketInventory(Long scheduleId) { // 更新数据库库存 ticketMapper.updateInventory(scheduleId); // 异步刷新Redis缓存 redisTemplate.opsForValue().set( "ticket:"+scheduleId, ticketMapper.selectRemainCount(scheduleId) ); }3.2 高并发售票控制
实现分布式锁保证库存安全:
- 采用Redisson实现可重入锁
- 设置锁自动续期防止业务超时
- 引入令牌桶算法限流
关键代码逻辑:
public boolean purchaseTicket(Long scheduleId, Integer seatCount) { String lockKey = "lock:ticket:" + scheduleId; RLock lock = redissonClient.getLock(lockKey); try { // 尝试加锁,最多等待500ms,锁持有3000ms if (lock.tryLock(500, 3000, TimeUnit.MILLISECONDS)) { int remain = ticketMapper.selectRemainCount(scheduleId); if (remain >= seatCount) { ticketMapper.updateInventory(scheduleId, remain - seatCount); return true; } } } finally { lock.unlock(); } return false; }4. 特殊场景处理
4.1 超卖预防机制
采用双重校验保证数据一致性:
- 前端显示余票时进行第一次过滤
- 提交订单前再次查询真实库存
- 支付完成后最终确认座位占用
库存扣减事务处理:
START TRANSACTION; SELECT remain_count FROM ticket_inventory WHERE schedule_id = ? FOR UPDATE; UPDATE ticket_inventory SET remain_count = remain_count - ? WHERE schedule_id = ? AND remain_count >= ?; COMMIT;4.2 退票业务设计
退票流程需要考虑:
- 不同时间段的退票手续费计算
- 座位库存的延时释放(防止黄牛刷票)
- 原路退款与账户余额两种方式
状态机设计示例:
stateDiagram-v2 [*] --> 未支付 未支付 --> 已取消: 超时未支付 未支付 --> 已支付: 完成支付 已支付 --> 已乘车: 验票通过 已支付 --> 退票中: 申请退票 退票中 --> 已退票: 审核通过 退票中 --> 已支付: 审核拒绝5. 安全防护措施
5.1 防自动化攻击
实施以下防护策略:
- 图形验证码:购票关键环节强制验证
- 行为验证:监测异常点击频率
- 设备指纹:识别可疑终端设备
5.2 数据加密方案
敏感数据处理方式:
- 用户密码:BCrypt强哈希存储
- 身份证号:AES加密后存储
- 通信数据:全站HTTPS+敏感字段二次加密
加密实现示例:
public String encryptIdCard(String idCard) { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivParameterSpec); byte[] encrypted = cipher.doFinal(idCard.getBytes()); return Base64.getEncoder().encodeToString(encrypted); }6. 性能优化实践
6.1 数据库优化
实施关键措施:
- 班次表按线路ID水平分表
- 建立组合索引优化查询:
ALTER TABLE `schedule` ADD INDEX `idx_line_departure` (`line_id`, `departure_time`); - 使用SSD存储提升IOPS
6.2 前端性能提升
采用以下方案:
- 路由懒加载减少首屏资源
- WebP格式压缩站牌图片
- 关键接口数据预加载
- 虚拟滚动优化长列表渲染
7. 运维监控体系
7.1 日志收集方案
搭建ELK日志系统:
- Filebeat采集各节点日志
- Logstash进行日志过滤处理
- Elasticsearch建立全文索引
- Kibana提供可视化查询
7.2 业务监控指标
核心监控项包括:
- 购票成功率
- 平均响应时间
- 支付超时率
- 库存同步延迟
Prometheus配置示例:
- job_name: 'ticket_service' metrics_path: '/actuator/prometheus' static_configs: - targets: ['service1:8080', 'service2:8080']8. 项目演进方向
未来可扩展功能:
- 联程票智能推荐算法
- 基于GIS的实时车辆追踪
- 人脸识别检票系统集成
- 会员积分与优惠券体系
技术升级路径:
- 逐步迁移到Service Mesh架构
- 试点应用分布式事务方案
- 引入图数据库优化路径查询
关键实施建议:初期应先保证核心票务流程的稳定性,再逐步扩展增值服务功能。数据库分库分表建议在日订单量超过10万时再考虑实施。