1. 项目概述:基于SpringBoot的话剧演出订票系统
这个话剧文艺演出网站订票系统是我去年指导的一个计算机专业毕业设计项目,采用SpringBoot+Vue前后端分离架构实现。系统核心功能包括演出信息展示、在线选座购票、订单管理、会员中心等模块,完全模拟商业票务平台的核心业务流程。
对于计算机专业学生来说,这类系统是非常典型的毕业设计选题——它既包含了常规的CRUD操作,又涉及支付接口对接、座位锁定算法、高并发控制等实际业务场景中的技术难点。我在指导学生开发过程中发现,很多同学容易在座位并发控制、第三方支付对接、前后端数据交互这几个关键环节踩坑。
2. 技术选型与架构设计
2.1 后端技术栈
SpringBoot 2.7 + MyBatis-Plus的组合是我们选择的基础框架。相比传统的SSM框架,SpringBoot的自动配置特性让项目搭建变得极其简单。这里特别说明几个关键依赖的选择:
- spring-boot-starter-data-redis:用于处理座位锁定的分布式锁
- alipay-sdk-java:支付宝沙箱支付接口
- hutool-all:国产工具包,处理各种通用工具类
- lombok:简化实体类编写
注意:使用lombok时需要确保IDE安装了对应插件,否则会出现"you aren't using a compiler supported by lombok"的报错
2.2 前端技术栈
采用Vue3+Element Plus实现管理后台,Vant3用于移动端H5页面。前后端完全分离,通过axios进行数据交互。这种架构的优势在于:
- 开发效率高:前端可以独立运行调试
- 部署灵活:前端静态资源可部署在CDN
- 性能优化:可按需加载前端资源
2.3 数据库设计
核心表包括:
| 表名 | 主要字段 | 说明 |
|---|---|---|
| t_show | id,title,cover,price,start_time,end_time | 演出信息表 |
| t_seat | id,show_id,row_num,col_num,status | 座位表 |
| t_order | order_no,user_id,total_amount,status | 订单主表 |
| t_order_item | order_no,seat_id,price | 订单明细表 |
特别要注意座位表的设计,status字段我们使用0-可用 1-锁定 2-已售三种状态,配合Redis实现分布式锁控制。
3. 核心功能实现细节
3.1 选座购票流程实现
这是系统最复杂的业务场景,涉及到高并发控制。我们实现的流程如下:
- 前端展示可售座位(灰色不可选)
- 用户选择座位后,前端发送锁定请求
- 后端处理锁定逻辑:
java复制// 使用Redis分布式锁 String lockKey = "seat_lock:"+seatId; boolean locked = redisTemplate.opsForValue() .setIfAbsent(lockKey, userId, 10, TimeUnit.MINUTES); if(!locked){ throw new BusinessException("座位正在被其他用户锁定"); } // 更新数据库座位状态 seatMapper.updateStatus(seatId, SeatStatus.LOCKED); - 生成订单后,异步处理支付结果回调
踩坑记录:初期没有设置锁的过期时间,导致系统异常时座位被永久锁定。后来增加了10分钟自动释放机制。
3.2 支付接口对接
我们同时接入了支付宝沙箱环境和微信支付模拟接口。以支付宝为例,关键配置如下:
yaml复制# application.yml配置
alipay:
app-id: 202100xxxx
merchant-private-key: MIICXQIBAAKBgQC...
alipay-public-key: MIGfMA0GCSqGSIb3DQE...
notify-url: /api/order/alipay/notify
return-url: /order/pay/success
支付回调处理要注意验签和幂等性控制:
java复制@PostMapping("/alipay/notify")
public String alipayNotify(HttpServletRequest request){
// 1. 验签
boolean signVerified = AlipaySignature.rsaCheckV1(...);
if(!signVerified){
return "failure";
}
// 2. 处理业务逻辑(注意幂等)
String orderNo = request.getParameter("out_trade_no");
orderService.handlePaySuccess(orderNo);
return "success";
}
3.3 演出信息管理
后台管理采用Element Plus实现,包含富文本编辑器用于演出详情编辑。这里遇到一个典型问题:SpringBoot默认限制了上传文件大小,需要在配置中调整:
properties复制# 设置最大上传50MB
spring.servlet.multipart.max-file-size=50MB
spring.servlet.multipart.max-request-size=50MB
4. 部署与上线实践
4.1 本地开发环境
推荐使用IDEA创建SpringBoot项目,注意几点:
- JDK版本要统一(建议17)
- Maven配置阿里云镜像加速依赖下载
- 安装Lombok插件
4.2 生产环境部署
我们采用宝塔面板部署方案:
-
前端打包:
bash复制
npm run build生成的dist目录上传到Nginx
-
后端打包:
bash复制
mvn clean package -DskipTests生成的jar包通过宝塔的Java项目管理器部署
-
数据库使用MySQL 8.0,注意配置连接池参数:
yaml复制spring: datasource: url: jdbc:mysql://localhost:3306/ticket?useSSL=false username: root password: 123456 hikari: maximum-pool-size: 20 connection-timeout: 30000
5. 常见问题解决方案
5.1 内存溢出问题
在压力测试时可能出现"java: OutOfMemoryError: insufficient memory"错误,解决方案:
- 调整JVM参数:
bash复制
java -Xms512m -Xmx1024m -jar ticket.jar - 检查是否有内存泄漏(特别是静态集合的使用)
5.2 版本兼容性问题
"警告: 源发行版 17 需要目标发行版 17"这类问题通常是因为:
- IDEA中Project Structure设置的SDK版本不一致
- pom.xml中java.version配置与实际JDK版本不符
- Maven编译插件版本过低
5.3 高并发场景优化
针对抢票场景,我们做了以下优化:
- 使用Redis缓存热门演出信息
- 座位锁定采用异步队列处理
- 数据库查询添加合适索引
- 前端加入防重复提交机制
6. 项目扩展方向
这个基础系统还可以进一步扩展:
- 接入短信通知(使用阿里云短信服务)
- 实现会员积分系统
- 增加演出评价功能
- 开发微信小程序端
- 接入智能推荐算法
我在实际开发中发现,支付回调处理和座位并发控制是最容易出问题的两个环节。建议在这两部分多写单元测试,模拟各种异常情况。比如网络超时、重复回调、并发请求等场景,确保系统健壮性。
