1. 项目概述
这个基于SpringBoot的电影售票系统是我去年指导的一个本科毕业设计项目,从需求分析到最终上线调试完整走了一遍流程。现在回想起来,这个项目确实涵盖了企业级应用开发的典型要素:前后端分离架构、第三方支付对接、影院排片算法、高并发座位锁定机制,以及当时让我和学生头疼了两周的选座冲突问题。
系统采用现在主流的SpringBoot+Vue技术栈,后端用MyBatis-Plus做ORM层,Redis处理缓存和分布式锁,Swagger生成API文档。前端使用Vue+ElementUI实现响应式布局,特别针对手机端购票流程做了优化。数据库设计上,我们放弃了传统的多表关联查询方案,而是采用空间换时间的策略,把场次座位状态直接用JSON存到Redis里,实测在500并发下单时响应时间能控制在300ms以内。
2. 核心功能模块设计
2.1 影院管理子系统
影院端采用RBAC权限模型,包含以下核心功能点:
- 影厅管理:配置不同规格影厅的座位矩阵(IMAX厅的坡度参数需要特殊处理)
- 排片管理:支持批量导入排期,自动规避放映间隔冲突(我们开发了基于时间窗口的冲突检测算法)
- 票房统计:使用ECharts实现实时票房热力图展示
java复制// 排片冲突检测核心逻辑
public boolean checkScheduleConflict(LocalDateTime startTime,
LocalDateTime endTime,
Long hallId) {
return scheduleMapper.selectList(new LambdaQueryWrapper<Schedule>()
.eq(Schedule::getHallId, hallId)
.le(Schedule::getStartTime, endTime)
.ge(Schedule::getEndTime, startTime)).isEmpty();
}
2.2 用户购票子系统
用户端重点解决了以下技术难点:
- 座位锁定机制:采用Redis分布式锁+过期时间方案
- 支付超时处理:接入支付宝沙箱环境,用Spring定时任务处理未支付订单
- 推荐算法:基于用户历史记录实现简单的协同过滤推荐
特别注意:座位锁定时间建议设置在5-10分钟,过短会导致支付失败率高,过长会影响座位周转率
3. 关键技术实现细节
3.1 高并发选座解决方案
我们对比了三种方案后选择了最终实现:
- 悲观锁方案(性能差,不推荐)
- 乐观锁方案(适合低频场景)
- Redis事务+Watch方案(最终采用)
java复制public boolean lockSeats(Long scheduleId, List<String> seats) {
String lockKey = "lock:" + scheduleId;
try {
redisTemplate.watch(lockKey);
// 检查座位是否可用
Object current = redisTemplate.opsForValue().get(lockKey);
if (current != null && ((Set<String>)current).stream().anyMatch(seats::contains)) {
redisTemplate.unwatch();
return false;
}
redisTemplate.multi();
redisTemplate.opsForValue().set(lockKey, seats, 10, TimeUnit.MINUTES);
return redisTemplate.exec() != null;
} catch (Exception e) {
redisTemplate.discard();
throw new RuntimeException("锁定座位失败", e);
}
}
3.2 分布式Session管理
由于需要支持横向扩展,我们采用Redis存储Session:
yaml复制# application.yml配置
spring:
session:
store-type: redis
timeout: 1800
redis:
host: 127.0.0.1
port: 6379
4. 项目部署与远程调试
4.1 宝塔面板部署实战
推荐的生产环境部署方案:
- 前端:Nginx静态部署(配置gzip压缩和HTTP/2)
- 后端:使用宝塔的Java项目管理器部署Jar包
- 数据库:MySQL 8.0主从配置(毕业设计可用单机)
4.2 IDEA远程调试技巧
在开发过程中我们频繁使用远程调试:
- 在启动命令中添加参数:
bash复制java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar your-app.jar
- IDEA创建Remote JVM Debug配置
- 遇到断点不生效时检查防火墙设置
5. 常见问题解决方案
5.1 典型报错处理
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| Lombok不生效 | IDE未安装插件 | 安装Lombok插件并启用注解处理 |
| MyBatis-Plus主键冲突 | 未配置@TableId | 添加@TableId(type = IdType.AUTO) |
| Redis连接超时 | 防火墙限制 | 检查6379端口和protected-mode配置 |
5.2 性能优化经验
- 缓存策略:将热门影片信息缓存24小时
- SQL优化:给schedule表的hall_id和start_time字段加联合索引
- JVM调优:生产环境建议设置-Xmx为可用内存的70%
6. 项目扩展方向
这个基础框架可以进一步扩展:
- 接入微信小程序端(需改造认证流程)
- 增加会员积分系统
- 实现动态票价算法(根据上座率浮动定价)
- 加入影院食品售卖模块
我在项目验收后发现一个有趣的现象:周三下午场的上座率往往比周末早场更高,这可能与影院的定价策略有关。如果让我重新设计这个系统,我会加入基于历史数据的智能排片功能,这需要引入机器学习组件,但对学生毕设来说可能有些超纲了。
