「2026-电影院预约系统」 /~b5cd3Lp6lU~:/ 链接:https://pan.quark.cn/s/666774cb40b4








🎬 星空影院预约系统
一个基于 FastAPI + Three.js 的全栈3D影院选座系统
功能特性 • 快速开始 • 系统架构 • API文档 • 常见问题
</div>
📖 项目简介
星空影院预约系统是一个现代化的在线影院选座平台,采用 3D可视化技术 让用户能够直观地选择影院座位。系统包含完整的用户端和管理后台,支持影院管理、排期管理、订单处理和用户管理等功能。
🌟 核心亮点
-
🎨 3D可视化选座 – 基于Three.js的沉浸式3D影院场景
-
💺 智能座位布局 – 支持自定义行列、间距、阶梯高度
-
👑 VIP区域自动识别 – 后排自动识别为VIP座位
-
🔒 JWT认证授权 – 安全的用户认证和权限管理
-
📊 完整的管理后台 – 影院、排期、订单、用户全流程管理
-
📱 响应式设计 – 支持PC和移动端访问
✨ 功能特性
用户端功能
| 👤 用户认证 | 注册、登录、JWT令牌管理 |
| 🏢 影院浏览 | 查看所有影院及配置信息 |
| 🎬 电影排期 | 查看电影排期和可用座位 |
| 🎯 3D选座 | 实时3D场景选择座位 |
| 💰 价格计算 | 自动计算普通座/VIP座价格 |
| 📋 订单管理 | 查看订单、支付订单 |
| ⏰ 座位锁定 | 15分钟自动释放机制 |
管理后台功能
| 📊 数据概览 | 影院、排期、订单、收入统计 |
| 🏢 影院管理 | 创建、编辑、删除影院及3D配置 |
| 🎬 排期管理 | 创建、编辑、删除电影排期 |
| 📋 订单管理 | 查看、支付、删除订单(分页) |
| 👥 用户管理 | 创建、编辑用户、权限管理(分页) |
| ⚙️ 系统设置 | 数据库管理、API测试 |
🚀 快速开始
环境要求
-
Python: 3.8+
-
数据库: SQLite (自带)
1. 安装依赖
cd backend
pip install fastapi uvicorn sqlalchemy pydantic python-jose passlib bcrypt python-multipart
2. 初始化数据库
cd backend
python seed_data.py
初始化内容:
-
✅ 创建数据库表
-
✅ 创建管理员账户: admin / admin123
-
✅ 创建测试用户: user1 / user123
-
✅ 创建示例影院
-
✅ 创建示例排期
-
✅ 初始化座位状态
3. 启动后端服务
cd backend
python main.py
服务将在 http://localhost:8000 启动
4. 访问系统
方法1: 使用启动脚本(推荐)
双击运行: 快速测试.bat
方法2: 手动启动
打开浏览器访问:
-
用户登录页: frontend/login_simple.html
-
用户面板: frontend/user.html
-
管理后台: frontend/admin.html
-
3D选座页: frontend/booking_cinema2.html
-
调试版选座: frontend/booking_debug.html
默认账号
管理员:
用户名: admin
密码: admin123
普通用户:
用户名: user1
密码: user123
🏗️ 系统架构
技术栈
后端
FastAPI 0.104.1 # Web框架
SQLAlchemy 2.0.23 # ORM
SQLite # 数据库
JWT (python-jose) # 认证
Pydantic 2.5.0 # 数据验证
Uvicorn # ASGI服务器
前端
Three.js r128 # 3D图形引擎
TailwindCSS # 样式框架
Font Awesome # 图标库
原生JavaScript # 核心逻辑
项目结构
电影预约系统/
├── backend/ # 后端代码
│ ├── main.py # FastAPI入口
│ ├── database.py # 数据库连接
│ ├── models.py # SQLAlchemy模型(5个表)
│ ├── schemas.py # Pydantic模式
│ ├── auth.py # JWT认证工具
│ ├── seed_data.py # 测试数据初始化
│ ├── cinema_booking.db # SQLite数据库
│ └── routers/ # API路由
│ ├── auth.py # 认证API + 用户管理API
│ ├── cinemas.py # 影院API + 排期API
│ ├── seats.py # 座位状态API
│ └── bookings.py # 订单API
│
├── frontend/ # 前端代码
│ ├── index.html # 登录注册页
│ ├── login_simple.html # 简化登录页
│ ├── user.html # 用户面板
│ ├── admin.html # 管理后台(带侧边栏)
│ ├── booking_cinema2.html # 3D选座页
│ ├── booking_debug.html # 调试版选座
│ ├── api.js # API封装
│ └── asset/ # 静态资源
│ ├── three.min.js # Three.js库
│ └── font-awesome/ # 图标库
│
├── 文档/ # 项目文档
│ ├── README.md # 本文档
│ ├── 系统调试指南.md # 故障排除指南
│ ├── 启动检查清单.md # 系统检查清单
│ └── 继续使用指南.md # 使用指南
│
├── 快速测试.bat # 一键启动脚本
└── README.md # 项目说明
数据库模型
1. User (用户表)
id # 用户ID
username # 用户名(唯一)
email # 邮箱
phone # 手机号
hashed_password # 加密密码
is_admin # 是否管理员
created_at # 创建时间
2. Cinema (影院表)
id # 影院ID
name # 影院名称
address # 影院地址
rows # 总行数
seats_per_row # 每排座位数
row_spacing # 排间距(米,用于3D渲染)
seat_spacing # 座位间距(米)
step_height # 阶梯高度(米)
price_regular # 普通座价格
price_vip # VIP座价格
vip_rows # VIP排数(最后N排)
3. Screening (排期表)
id # 排期ID
cinema_id # 影院ID
movie_name # 电影名称
movie_poster # 电影海报URL
start_time # 开始时间
duration # 时长(分钟)
hall_name # 影厅名称
4. SeatStatus (座位状态表)
id # 座位ID
screening_id # 排期ID
seat_row # 行号(0-index)
seat_col # 列号(0-index)
seat_label # 座位标签(A1, A2, B1…)
status # 状态(available/selected/occupied)
user_id # 锁定用户ID
occupied_at # 锁定时间
booking_id # 订单ID
5. Booking (订单表)
id # 订单ID
user_id # 用户ID
screening_id # 排期ID
seat_ids # 座位ID列表(JSON)
total_price # 总价
status # 状态(pending/paid/cancelled)
qr_code # 二维码
created_at # 创建时间
paid_at # 支付时间
📡 API文档
认证相关
用户注册
POST /api/auth/register
Content-Type: application/json
{
"username": "newuser",
"password": "password123",
"email": "user@example.com",
"phone": "13800138000"
}
用户登录
POST /api/auth/login
Content-Type: application/json
{
"username": "user1",
"password": "user123"
}
Response:
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGc…",
"token_type": "bearer"
}
影院相关
获取所有影院
GET /api/cinemas
获取影院排期
GET /api/cinemas/{cinema_id}/screenings
获取所有排期
GET /api/screenings
座位相关 (重要!)
获取场次座位状态
GET /api/screenings/{screening_id}/seats
Authorization: Bearer {access_token}
Response:
{
"cinema": {
"rows": 8,
"seats_per_row": 10,
"row_spacing": 2.0,
"seat_spacing": 1.4,
"step_height": 0.4,
"price_regular": 45.0,
"price_vip": 80.0,
"vip_rows": 2
},
"movie": {
"name": "流浪地球2",
"poster": "https://…",
"start_time": "2026-02-28T19:00:00"
},
"seats": [
{
"id": 1,
"row": 0,
"col": 0,
"label": "A1",
"status": "available",
"is_vip": false
},
…
]
}
订单相关
创建订单
POST /api/bookings
Authorization: Bearer {access_token}
Content-Type: application/json
{
"seat_ids": [1, 2, 3]
}
获取订单列表
GET /api/bookings?skip=0&limit=20
Authorization: Bearer {access_token}
支付订单
PUT /api/bookings/{booking_id}/pay
Authorization: Bearer {access_token}
管理员API
创建影院
POST /api/admin/cinemas
Authorization: Bearer {admin_token}
Content-Type: application/json
{
"name": "星空影院-IMAX厅",
"rows": 10,
"seats_per_row": 12,
"row_spacing": 2.0,
"seat_spacing": 1.4,
"step_height": 0.4,
"price_regular": 60,
"price_vip": 100,
"vip_rows": 2
}
创建排期
POST /api/admin/screenings
Authorization: Bearer {admin_token}
Content-Type: application/json
{
"cinema_id": 1,
"movie_name": "流浪地球2",
"movie_poster": "https://…",
"hall_name": "1号厅",
"start_time": "2026-02-28T19:00:00",
"duration": 120
}
获取用户列表
GET /api/auth/users
Authorization: Bearer {admin_token}
设置管理员权限
PUT /api/auth/users/{user_id}/admin?is_admin=true
Authorization: Bearer {admin_token}
删除用户
DELETE /api/auth/users/{user_id}
Authorization: Bearer {admin_token}
完整API文档
启动后端后访问: http://localhost:8000/docs
🎨 3D渲染说明
Three.js场景组成
1. 相机设置
camera.position.set(0, 18, 28); // 相机位置
camera.lookAt(0, 2, -8); // 观察目标
camera.fov = 50; // 视野角度
2. 灯光系统
-
环境光: 提供基础照明
-
主光源: 模拟影院顶部灯光
-
屏幕微光: 从屏幕发出的蓝色光晕
-
氛围灯: 左侧蓝色 + 右侧橙色
-
座位区照明: 6个聚光灯照亮座位区
3. 座位模型
每个座位由以下部分组成:
-
CylinderGeometry – 底座(圆柱)
-
BoxGeometry – 座椅垫(长方体)
-
BoxGeometry – 靠背(长方体)
-
BoxGeometry x2 – 左右扶手
4. 材质系统
-
普通座: 灰色 MeshStandardMaterial
-
VIP座: 金色 + 自发光效果
-
已选中: 绿色 + 强发光
-
已售出: 红色
5. 交互控制
-
OrbitControls: 鼠标拖拽旋转视角
-
Raycaster: 点击检测座位
-
滚轮缩放: 调整观察距离
自定义3D参数
在管理后台创建影院时,可以调整以下3D渲染参数:
| rows | 8 | 1-20 | 总行数 |
| seats_per_row | 10 | 1-30 | 每排座位数 |
| row_spacing | 2.0 | 0.5-5.0 | 排间距(米) |
| seat_spacing | 1.4 | 0.5-3.0 | 座位间距(米) |
| step_height | 0.4 | 0-1.0 | 阶梯高度(米) |
| vip_rows | 2 | 0-10 | VIP排数 |
🔧 配置说明
后端配置
文件: backend/main.py
# 服务器配置
HOST = "0.0.0.0"
PORT = 8000
# JWT配置
SECRET_KEY = "your-secret-key-change-this-in-production-2024"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 60
# 数据库配置
DATABASE_URL = "sqlite:///./cinema_booking.db"
# CORS配置
CORS_ORIGINS = ["*"] # 生产环境请限制具体域名
前端配置
文件: frontend/api.js
const API_BASE = 'http://localhost:8000';
const TOKEN_KEY = 'cinema_token';
const USER_KEY = 'cinema_user';
修改API地址
如果后端部署在其他地址,修改 frontend/api.js:
const API_BASE = 'http://your-server:port';
🔒 安全说明
生产环境必做
修改SECRET_KEY
# backend/auth.py
SECRET_KEY = "生成一个强随机密钥"
启用HTTPS 使用Let's Encrypt或购买SSL证书
限制CORS
# backend/main.py
app.add_middleware(
CORSMiddleware,
allow_origins=["https://your-domain.com"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
数据库备份 定期备份 cinema_booking.db 文件
修改默认密码 首次登录后立即修改admin密码
🐛 常见问题
1. 后端启动失败
问题: ModuleNotFoundError
解决:
pip install -r requirements.txt
2. 数据库错误
问题: sqlite3.OperationalError
解决:
cd backend
python seed_data.py
3. 3D场景不显示
问题: Three.js加载失败
解决: 确保 frontend/asset/three.min.js 文件存在
4. API请求失败
问题: CORS error 或 401 Unauthorized
解决:
-
检查后端是否启动
-
检查Token是否有效
-
查看浏览器控制台错误信息
5. 座位无法选择
问题: 点击座位无反应
解决:
-
检查是否已登录
-
查看浏览器控制台是否有JavaScript错误
-
尝试使用 booking_debug.html
6. 管理后台无法加载
问题: 加载数据失败
解决:
-
确认使用管理员账号登录
-
检查 api.js 和 admin.html 是否正确引用
-
查看浏览器控制台错误
📚 更多文档
-
系统调试指南.md – 详细的故障排除步骤
-
启动检查清单.md – 完整的系统检查流程
-
继续使用指南.md – 快速上手指南
🚀 部署指南
开发环境
# 启动后端
cd backend
python main.py
# 访问前端
# 直接用浏览器打开 frontend/*.html 文件
生产环境
1. 使用Uvicorn部署
cd backend
uvicorn main:app –host 0.0.0.0 –port 8000 –workers 4
2. 使用Nginx代理
server {
listen 80;
server_name your-domain.com;
# 前端静态文件
location / {
root /path/to/frontend;
index index.html;
try_files $uri $uri/ /index.html;
}
# 后端API代理
location /api/ {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
3. 使用Docker部署
Dockerfile:
FROM python:3.9-slim
WORKDIR /app
COPY backend/requirements.txt .
RUN pip install -r requirements.txt
COPY backend/ .
EXPOSE 8000
CMD ["uvicorn", "main:app", "–host", "0.0.0.0", "–port", "8000"]
📝 开发计划
- 添加真实支付功能(支付宝/微信)
- 优化移动端适配
- 添加数据统计图表
- 支持MySQL/PostgreSQL数据库
- 添加邮件通知功能
📄 开源协议
MIT License
👥 作者
星空影院团队 © 2026
如果觉得不错,请给个⭐Star支持一下!
Made with ❤️ by Star Cinema Team
</div>


