1. 项目概述:基于Django与Vue3的现代化影院管理系统
最近刚完成一个电影院售票系统的全栈项目,采用Django REST framework作为后端API服务,配合Vue3的前端动态交互。这个系统从零开始搭建,前后耗时约三个月,期间踩过不少坑也积累了些实战经验。如果你正在寻找一个既能学习现代Web开发技术栈,又具备商业落地价值的项目案例,这个架构值得深入探讨。
传统影院管理系统往往采用单体架构,前后端耦合度高,维护困难。我们这套方案通过前后端分离设计,实现了以下核心价值:
- 后端专注业务逻辑与数据安全,提供标准的RESTful API
- 前端获得完全独立的演进能力,可快速迭代用户体验
- 通过JWT实现无状态认证,轻松应对高并发场景
- 采用WebSocket实现实时座位状态同步,避免售票冲突
技术选型方面,Django提供了完善的ORM系统和admin后台,特别适合快速构建数据密集型应用;而Vue3的组合式API配合Pinia状态管理,让前端复杂交互的逻辑组织变得清晰可控。部署时用Nginx做反向代理,Gunicorn运行Django服务,Vite打包的前端静态资源加载速度比传统webpack提升明显。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 后端架构深度解析
2.1 Django模型设计与优化
核心数据模型采用Django的ORM进行定义,主要包含以下几个关键实体:
python复制class Movie(models.Model):
title = models.CharField(max_length=200)
duration = models.PositiveIntegerField() # 分钟为单位
release_date = models.DateField()
director = models.CharField(max_length=100)
actors = models.TextField()
description = models.TextField()
poster_url = models.URLField()
rating = models.DecimalField(max_digits=3, decimal_places=1)
class Meta:
indexes = [
models.Index(fields=['release_date']),
models.Index(fields=['rating'])
]
class CinemaHall(models.Model):
name = models.CharField(max_length=50)
seat_map = models.JSONField() # 存储座位二维矩阵
total_seats = models.PositiveIntegerField()
class Screening(models.Model):
movie = models.ForeignKey(Movie, on_delete=models.PROTECT)
hall = models.ForeignKey(CinemaHall, on_delete=models.PROTECT)
start_time = models.DateTimeField()
end_time = models.DateTimeField()
price = models.DecimalField(max_digits=6, decimal_places=2)
class Meta:
ordering = ['start_time']
几个关键设计要点:
- 使用
JSONField存储影厅座位图,便于前端动态渲染座位矩阵 - 为高频查询字段添加数据库索引,如影片的上映日期和评分
- 场次(Screening)模型通过计算自动生成end_time,避免数据不一致
- 采用PROTECT外键约束防止误删关联数据
踩坑提醒:Django的ORM在复杂查询时容易产生N+1问题。我们使用
select_related和prefetch_related进行优化,例如获取场次信息时:python复制screenings = Screening.objects.select_related('movie', 'hall').filter( start_time__gte=timezone.now() ).prefetch_related('ticket_set')
2.2 RESTful API设计与JWT认证
采用Django REST framework构建API,关键端点包括:
| 端点 | 方法 | 描述 | 权限 |
|---|---|---|---|
| /api/auth/register | POST | 用户注册 | 允许匿名 |
| /api/auth/login | POST | 获取JWT令牌 | 允许匿名 |
| /api/movies/ | GET | 获取影片列表 | 允许匿名 |
| /api/screenings/ | GET | 查询场次 | 允许匿名 |
| /api/orders/ | POST | 创建订单 | 需认证 |
| /api/seats/{screening_id}/ | GET | 获取座位 |
