1. 项目背景与核心需求
火车票务系统作为现代交通出行的重要基础设施,其效率和稳定性直接影响着数亿旅客的出行体验。传统售票窗口模式存在高峰期排队时间长、余票信息更新滞后、人工操作易出错等问题。我们团队基于Python+Vue技术栈开发的这套系统,正是为了解决这些痛点而生。
系统采用前后端分离架构,前端基于Vue.js构建响应式用户界面,后端采用Django/Flask框架提供RESTful API服务。这种架构选择主要基于以下考量:
- Vue.js的组件化开发模式能快速构建复杂的票务交互界面
- Django自带ORM和Admin后台可加速开发进程
- Flask的轻量级特性适合快速迭代API接口
- MySQL作为成熟的关系型数据库,能很好处理票务数据的关联查询
2. 技术架构设计
2.1 整体架构设计
系统采用典型的三层架构:
code复制前端层(Vue.js) ↔ 业务逻辑层(Python) ↔ 数据存储层(MySQL)
前端使用Vue CLI脚手架初始化项目,主要依赖包括:
- Vue Router:实现SPA路由跳转
- Axios:处理HTTP请求
- Element UI:提供基础UI组件
- Vuex:管理全局状态(如用户登录态)
后端服务根据需求可灵活选择:
- Django方案:适合需要完整后台管理的场景
- Flask方案:适合需要快速开发API接口的场景
2.2 数据库设计要点
核心数据表包括:
- 用户表(users):存储乘客和工作人员信息
- 车次表(trains):记录列车班次、时刻表等
- 座位表(seats):管理车厢座位信息
- 订单表(orders):存储购票记录
- 退票表(refunds):记录退票信息
关键设计考虑:
sql复制-- 采用InnoDB引擎支持事务
CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL COMMENT '关联用户',
`train_id` int(11) NOT NULL COMMENT '关联车次',
`seat_id` int(11) NOT NULL COMMENT '关联座位',
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '1待支付 2已支付 3已取消',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_user` (`user_id`),
KEY `idx_train` (`train_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 核心功能实现
3.1 车次查询与余票计算
余票计算是系统的核心算法之一,实现逻辑:
python复制def get_available_seats(train_id, date):
"""
获取某车次某日期的可用座位
:param train_id: 车次ID
:param date: 出发日期
:return: 可用座位列表
"""
# 1. 获取该车次所有座位
all_seats = Seat.objects.filter(train_id=train_id)
# 2. 查询已被预订的座位
booked_seats = Order.objects.filter(
train_id=train_id,
departure_date=date,
status__in=[1, 2] # 待支付和已支付订单
).values_list('seat_id', flat=True)
# 3. 计算余票
available_seats = [seat for seat in all_seats if seat.id not in booked_seats]
return available_seats
3.2 高并发订票处理
为解决高并发下的超卖问题,我们采用以下策略:
-
数据库层面:
- 使用SELECT FOR UPDATE加锁
- 设置事务隔离级别为REPEATABLE READ
-
应用层面:
- 引入Redis分布式锁
- 实现排队机制
关键代码示例:
python复制@transaction.atomic
def create_order(user_id, train_id, seat_id):
"""
创建订单(带锁版)
"""
try:
# 检查座位是否可用
seat = Seat.objects.select_for_update().get(
id=seat_id,
train_id=train_id,
is_locked=False
)
# 锁定座位
seat.is_locked = True
seat.save()
# 创建订单
order = Order.objects.create(
user_id=user_id,
train_id=train_id,
seat_id=seat_id,
status=1
)
return order
except Exception as e:
transaction.set_rollback(True)
raise OrderException("创建订单失败")
4. 安全与性能优化
4.1 安全防护措施
-
认证授权:
- JWT实现无状态认证
- RBAC权限控制模型
-
数据安全:
- 敏感字段加密存储(如密码)
- SQL注入防护(使用ORM参数化查询)
- CSRF防护(Django中间件)
-
接口安全:
- 限流防刷(Django Ratelimit)
- 敏感操作二次验证
4.2 性能优化实践
-
查询优化:
- 添加合适的数据库索引
- 使用select_related/prefetch_related减少查询次数
-
缓存策略:
- 热点数据Redis缓存(如车次信息)
- 页面静态化(如公告信息)
-
异步处理:
- Celery处理耗时操作(如出票通知)
- Django Channels实现实时余票更新
5. 部署与监控
5.1 生产环境部署
推荐部署方案:
code复制Nginx(负载均衡) ↔ Gunicorn/Uvicorn(应用服务器) ↔ Django/Flask ↔ MySQL
关键配置示例:
ini复制# Gunicorn配置示例
workers = 4
worker_class = 'gevent'
bind = '0.0.0.0:8000'
timeout = 120
5.2 监控方案
-
系统监控:
- Prometheus + Grafana监控服务器指标
- Sentry收集应用错误
-
业务监控:
- 关键业务指标埋点(如订票成功率)
- 定时任务检查数据一致性
6. 开发经验与避坑指南
6.1 常见问题解决
-
时区问题:
- 统一使用UTC时间存储
- 前端按需转换本地时区
-
跨域问题:
- 配置CORS中间件
python复制# Django CORS配置示例 CORS_ALLOWED_ORIGINS = [ "https://yourdomain.com", ] -
静态文件处理:
- 开发环境使用django.contrib.staticfiles
- 生产环境使用Nginx直接托管
6.2 性能调优技巧
-
数据库优化:
- 使用explain分析慢查询
- 合理设置数据库连接池大小
-
前端优化:
- 组件懒加载
- 路由级别代码分割
-
缓存策略:
- 多级缓存(本地+Redis)
- 缓存失效策略(如主动更新)
7. 项目扩展方向
-
移动端适配:
- 开发响应式布局
- 封装微信小程序API
-
智能推荐:
- 基于用户历史的推荐算法
- 结合天气/节假日的动态定价
-
微服务改造:
- 按业务拆分服务(用户/订单/票务)
- 引入服务网格管理
这套系统在实际开发中,我们特别注重事务完整性和并发控制,通过合理的锁策略和重试机制,确保在高并发场景下仍能保持数据一致性。对于初学者来说,建议先从Flask版本入手,理解基础原理后再过渡到Django的全功能版本。