温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片!
1. 项目背景
随着互联网和移动支付的普及,在线购票已成为电影观众的主要购票方式。传统线下排队购票效率低、体验差,而第三方票务平台又存在手续费高、数据不透明等问题。因此,开发一个基于 Python 和 Django 的自建电影购票票务系统,既能满足影院自主运营的需求,也能为开发者提供一个完整的 Web 全栈实战项目。
本系统采用 Django 作为后端框架,结合 MySQL 数据库和 Bootstrap 前端框架,实现从影片管理、场次排期、在线选座到订单支付、票务核销的完整业务流程。
2. 技术选型
本项目的技术栈以 Python 生态为核心,具体选型如下:
| 层次 | 技术 | 说明 |
|---|---|---|
| 后端框架 | Django 4.x | MTV 架构,自带 Admin 后台和 ORM |
| 数据库 | MySQL 8.0 | 存储用户、影片、场次、订单等数据 |
| 前端 | Bootstrap 5 + jQuery | 响应式页面布局与交互 |
| 缓存 | Redis | 缓存热门影片和座位锁定状态 |
| 支付 | 支付宝沙箱 / 微信支付 | 模拟在线支付流程 |
| 部署 | Nginx + Gunicorn | 生产环境部署方案 |
3. 系统功能设计
系统按用户角色划分为前台用户端和后台管理端两大模块,核心功能如下:
3.1 用户端功能
- 用户注册与登录:支持手机号或邮箱注册,密码加密存储。
- 影片浏览与搜索:按类型、上映时间、热度筛选影片,支持关键词搜索。
- 影片详情:展示海报、简介、演员、评分和上映日期。
- 场次选择:选择影院、日期和场次,查看剩余座位。
- 在线选座:可视化座位图,支持一次购买多张连座票。
- 订单支付:生成订单后跳转支付,支持支付超时自动取消。
- 订单管理:查看历史订单、退票和电子票二维码。
3.2 管理端功能
- 影片管理:上架、下架影片,维护影片信息。
- 影院与影厅管理:维护影院信息和影厅座位布局。
- 场次排期:为影片安排放映时间、影厅和票价。
- 订单管理:查看所有订单,处理退票请求。
- 数据统计:按日、按月统计票房和上座率。
4. 数据库设计
系统核心数据表包括用户表、影片表、影院表、影厅表、场次表、座位表和订单表。下面给出主要表结构:
from django.db import models class Movie(models.Model): title = models.CharField(max_length=100, verbose_name="影片名称") genre = models.CharField(max_length=50, verbose_name="类型") duration = models.IntegerField(verbose_name="时长(分钟)") release_date = models.DateField(verbose_name="上映日期") poster = models.ImageField(upload_to="posters/", verbose_name="海报") description = models.TextField(verbose_name="简介") rating = models.DecimalField(max_digits=3, decimal_places=1, default=0.0) class Meta: db_table = "movie" class Session(models.Model): movie = models.ForeignKey(Movie, on_delete=models.CASCADE) hall = models.ForeignKey(Hall, on_delete=models.CASCADE) start_time = models.DateTimeField(verbose_name="开场时间") price = models.DecimalField(max_digits=6, decimal_places=2, verbose_name="票价") class Meta: db_table = "session" class Order(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) session = models.ForeignKey(Session, on_delete=models.CASCADE) seats = models.CharField(max_length=100, verbose_name="座位编号") total_price = models.DecimalField(max_digits=8, decimal_places=2) status = models.IntegerField(default=0, verbose_name="0待支付 1已支付 2已退票") created_at = models.DateTimeField(auto_now_add=True) class Meta: db_table = "order"5. 核心功能实现
5.1 在线选座
选座是购票系统的核心交互。实现思路是:影厅座位按行列编号,已售座位在数据库中标记为不可选。用户点击座位后,前端记录选中状态,提交订单时后端再次校验座位是否被占用,避免并发冲突。
from django.db import transaction from django.core.cache import cache def lock_seats(session_id, seat_list, user_id): """使用 Redis 锁防止座位超卖""" lock_key = f"session:{session_id}:seats" with transaction.atomic(): for seat in seat_list: lock = cache.lock(f"{lock_key}:{seat}", timeout=300) if not lock.acquire(blocking=False): return False, f"座位 {seat} 已被锁定" return True, "锁定成功"5.2 订单超时取消
用户提交订单后若未在 15 分钟内支付,系统应自动释放座位。这里使用 Django 的定时任务实现:
from django.utils import timezone from django_celery_beat.models import PeriodicTask def cancel_expired_orders(): """定时任务:取消超时未支付订单并释放座位""" expired = Order.objects.filter( status=0, created_at__lt=timezone.now() - timezone.timedelta(minutes=15) ) for order in expired: order.status = 2 order.save() # 释放座位逻辑...6. 页面展示
系统主要页面包括首页、影片列表、影片详情、选座页、订单确认页和个人中心。首页展示正在热映和即将上映的影片,选座页通过 Canvas 绘制座位图,用户点击座位后实时更新选中状态和总价。
管理后台直接复用 Django Admin,在此基础上扩展影片、场次和订单的自定义管理页面,降低开发成本。
7. 项目部署
生产环境推荐使用 Nginx + Gunicorn 部署 Django 应用,MySQL 和 Redis 作为数据层。部署步骤如下:
- 使用
pip install -r requirements.txt安装依赖。 - 执行
python manage.py migrate初始化数据库。 - 使用
python manage.py collectstatic收集静态文件。 - 配置 Gunicorn 启动应用,Nginx 反向代理并托管静态资源。
- 使用 Supervisor 守护进程,保证服务异常时自动重启。
8. 总结
本文从需求分析、技术选型、数据库设计到核心功能实现,完整介绍了基于 Python 和 Django 的电影购票票务系统的开发过程。该系统覆盖了 Web 开发中常见的用户认证、数据建模、并发控制和定时任务等知识点,适合作为毕业设计或全栈进阶项目。后续可以在此基础上扩展会员积分、优惠券、影评社区等功能,进一步完善系统生态。