1. 项目概述:SpringBoot+Vue电影订票系统全栈解决方案
这套电影订票系统采用当前主流的前后端分离架构,后端基于SpringBoot 2.x构建RESTful API,前端使用Vue 2.x+ElementUI实现响应式界面,数据存储选用MySQL 8.0。系统完整实现了影院管理、影片排期、座位选择、订单支付等核心业务场景,代码结构遵循阿里巴巴Java开发规范,前后端均提供详细的接口文档和部署指南。
我在实际部署测试中发现,这套系统特别适合作为全栈开发的学习案例——它涵盖了用户认证(JWT)、跨域处理、MyBatis-Plus高效CRUD、Vue路由守卫等典型企业级应用技术点。数据库设计采用三范式原则,包含12张核心表,ER图清晰展现了影院业务实体关系。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构深度解析
2.1 后端技术栈设计
SpringBoot后端采用经典三层架构:
- 控制层:
@RestController处理HTTP请求,统一返回Result封装 - 服务层:
@Service实现业务逻辑,包含事务管理@Transactional - 持久层:MyBatis-Plus 3.4+实现动态SQL,配套PageHelper分页插件
安全控制方面:
java复制// JWT认证示例
@Configuration
public class JwtConfig {
@Bean
public FilterRegistrationBean<JwtFilter> jwtFilter() {
FilterRegistrationBean<JwtFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new JwtFilter());
registration.addUrlPatterns("/api/*");
return registration;
}
}
2.2 前端工程化实践
Vue前端项目特点:
- 基于Vue CLI 4.x脚手架构建
- 使用Vuex进行状态管理,模块化store设计
- 路由采用懒加载提升首屏速度
javascript复制// 路由守卫示例
router.beforeEach((to, from, next) => {
if (to.meta.requiresAuth && !store.getters.isLogin) {
next('/login?redirect=' + encodeURIComponent(to.fullPath))
} else {
next()
}
})
2.3 数据库关键设计
MySQL表结构亮点:
- 座位表采用行列坐标存储,配合状态字段实现可视化选座
- 订单表使用乐观锁控制并发售票
- 影片表包含富文本字段存储详情HTML
sql复制CREATE TABLE `t_seat` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`hall_id` int(11) NOT NULL COMMENT '影厅ID',
`row_num` int(11) NOT NULL COMMENT '行号',
`col_num` int(11) NOT NULL COMMENT '列号',
`status` tinyint(4) DEFAULT '0' COMMENT '0-可选 1-已售 2-维修',
PRIMARY KEY (`id`),
KEY `idx_hall` (`hall_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 核心功能实现细节
3.1 选座购票业务流程
- 排期查询:根据日期、影片ID查询放映计划
- 座位渲染:前端根据影厅模板动态生成SVG座位图
- 实时锁座:通过WebSocket保持座位状态同步
- 订单创建:采用Redis分布式锁防止超卖
关键并发控制代码:
java复制public Result createOrder(OrderDTO dto) {
String lockKey = "lock:schedule:" + dto.getScheduleId();
try {
// 尝试获取分布式锁
Boolean locked = redisTemplate.opsForValue()
.setIfAbsent(lockKey, "1", 30, TimeUnit.SECONDS);
if (!locked) {
return Result.error("当前购票人数过多,请重试");
}
// 业务处理...
} finally {
redisTemplate.delete(lockKey);
}
}
3.2 支付系统集成
系统预留了支付宝、微信支付接口:
- 支付状态机设计:待支付->已支付/已超时
- 使用Spring Scheduled定时关闭超时订单
- 支付成功回调验证签名防止伪造请求
支付超时处理配置:
properties复制# application.yml
task:
payment-timeout: 900 # 15分钟超时
4. 部署与运维实践
4.1 开发环境搭建
-
后端准备:
- JDK 1.8+
- Maven 3.6+
- MySQL 8.0+(需配置大小写敏感)
bash复制# 初始化数据库 mysql> source db/movie_db.sql -
前端准备:
- Node.js 14.x
- 配置API代理地址
javascript复制// vue.config.js devServer: { proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true } } }
4.2 生产环境部署
推荐使用Docker Compose编排:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql-data:/var/lib/mysql
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
frontend:
build: ./frontend
ports:
- "80:80"
5. 典型问题排查指南
5.1 常见启动问题
-
数据库连接失败:
- 检查MySQL账号权限
- 验证
application.yml中的连接池配置
yaml复制spring: datasource: url: jdbc:mysql://localhost:3306/movie_db?useSSL=false&serverTimezone=Asia/Shanghai username: root password: 123456 hikari: maximum-pool-size: 20 -
前端跨域问题:
- 确保后端已配置CORS
- 检查Nginx代理设置
java复制@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("*") .maxAge(3600); } }
5.2 性能优化建议
-
缓存策略:
- 影片详情使用Redis缓存
- 热门场次预加载到内存
java复制@Cacheable(value = "movie", key = "#id") public Movie getMovieDetail(Long id) { return movieMapper.selectById(id); } -
SQL优化:
- 为排期查询添加复合索引
- 避免
SELECT *操作
sql复制ALTER TABLE t_schedule ADD INDEX idx_cinema_movie (cinema_id, movie_id);
6. 二次开发建议
-
扩展功能方向:
- 增加会员积分系统
- 实现退票业务流
- 接入短信通知服务
-
界面定制技巧:
- 修改
src/assets/styles/common.scss主题色 - 使用Vue动态组件实现多皮肤切换
vue复制<component :is="currentSkin + '-seat'" /> - 修改
-
安全增强措施:
- 添加接口限流防护
- 实施XSS过滤
java复制@Bean public FilterRegistrationBean<XssFilter> xssFilter() { FilterRegistrationBean<XssFilter> registration = new FilterRegistrationBean<>(); registration.setFilter(new XssFilter()); registration.addUrlPatterns("/*"); return registration; }
这套系统在我参与的影院数字化改造项目中表现稳定,日均处理订单量可达3000+。特别值得注意的是其清晰的模块划分,比如将座位状态管理独立为微服务时,只需调整seat-service模块的部署方式即可。对于需要处理高并发售票的场景,建议结合RabbitMQ实现异步下单,这个改造点在源码的order-service模块已有预留扩展接口。
