SpringBoot+Vue影城管理系统开发实战

SpringBoot+Vue影城管理系统开发实战 1. 项目概述前后端分离的影城管理系统这个基于SpringBootVueMyBatisMySQL的影城管理系统是我去年为本地一家连锁影院开发的实战项目。当时客户需要一套能同时满足前台售票、后台管理和数据分析需求的系统还要支持多终端访问。经过技术选型最终采用了现在这个前后端分离的架构方案上线后运行稳定日均处理订单量超过3000笔。前后端分离架构最大的优势在于解耦。前端Vue负责展示和交互后端SpringBoot处理业务逻辑MyBatis作为ORM框架操作MySQL数据库。这种架构让我们的团队可以并行开发——前端工程师专注页面效果后端工程师专注API设计最后通过接口文档对接效率提升了40%左右。提示选择前后端分离架构时一定要提前定义好接口规范。我们团队吃过亏早期没统一接口格式导致后期联调浪费了大量时间。2. 技术栈深度解析2.1 SpringBoot后端框架SpringBoot是我们后端的核心框架版本选用的是2.7.3。这个版本稳定且社区支持好内置Tomcat服务器省去了繁琐的配置。项目中用到了几个关键特性自动配置通过SpringBootApplication注解自动加载所需配置Starter依赖spring-boot-starter-web处理HTTP请求Actuator用于监控应用健康状态RestController RequestMapping(/api/movie) public class MovieController { Autowired private MovieService movieService; GetMapping public ResponseEntityListMovie getAllMovies() { return ResponseEntity.ok(movieService.findAll()); } }2.2 Vue前端框架前端采用Vue 3的组合式API写法相比选项式API代码组织更灵活。项目中使用的主要技术点Vue Router管理路由Pinia替代Vuex做状态管理Axios处理HTTP请求Element Plus组件库构建UI// 电影列表组件示例 script setup import { ref, onMounted } from vue import { getMovies } from /api/movie const movies ref([]) onMounted(async () { try { const res await getMovies() movies.value res.data } catch (error) { console.error(获取电影列表失败:, error) } }) /script2.3 MyBatis持久层MyBatis版本选用3.5.6配合MyBatis-Plus 3.5.1增强功能。项目中特别注意了SQL注入防护严格使用#{}占位符而非${}所有查询参数都经过校验使用XML映射文件管理复杂SQL!-- 电影动态查询示例 -- select idselectMovies resultTypeMovie SELECT * FROM movie where if testtitle ! null AND title LIKE CONCAT(%, #{title}, %) /if if teststatus ! null AND status #{status} /if /where ORDER BY release_date DESC /select2.4 MySQL数据库设计数据库采用MySQL 8.0主要表结构设计如下表名主要字段说明movieid, title, duration, price, status电影基本信息screeningid, movie_id, room_id, start_time排片信息orderid, user_id, screening_id, seats, total_price订单信息userid, username, password, phone, role用户账户特别注意了索引优化CREATE INDEX idx_screening_time ON screening(start_time); CREATE INDEX idx_order_user ON order(user_id);3. 核心功能实现细节3.1 电影排片管理排片功能是系统的核心需要考虑影厅时间冲突检测不同时段价格策略排片数据缓存处理后端冲突检测逻辑public boolean checkScreeningConflict(Screening newScreening) { ListScreening existScreenings screeningMapper.findByRoomAndDate( newScreening.getRoomId(), newScreening.getStartTime().toLocalDate() ); return existScreenings.stream().anyMatch(exist - exist.getStartTime().isBefore(newScreening.getEndTime()) exist.getEndTime().isAfter(newScreening.getStartTime()) ); }3.2 在线选座功能前端使用Canvas绘制座位图关键点实时同步座位状态本地缓存已选座位15分钟未支付自动释放座位状态同步采用WebSocketconst socket new WebSocket(wss://yourdomain.com/ws/seats); socket.onmessage (event) { const data JSON.parse(event.data); if(data.type SEAT_UPDATE) { updateSeatStatus(data.screeningId, data.seats); } };3.3 支付对接集成支付宝和微信支付注意支付结果异步通知处理订单状态机设计对账机制支付状态转换设计stateDiagram [*] -- PENDING PENDING -- PAID: 支付成功 PENDING -- CANCELLED: 用户取消 PENDING -- TIMEOUT: 超时未支付 PAID -- REFUNDED: 申请退款4. 系统部署实战4.1 后端部署采用Docker部署SpringBoot应用FROM openjdk:11-jre COPY target/cinema-system.jar /app.jar EXPOSE 8080 ENTRYPOINT [java,-jar,/app.jar]启动命令docker build -t cinema-backend . docker run -d -p 8080:8080 --name cinema-backend cinema-backend4.2 前端部署使用Nginx部署Vue项目server { listen 80; server_name cinema.example.com; location / { root /var/www/cinema-frontend; try_files $uri $uri/ /index.html; } location /api { proxy_pass http://backend:8080; } }4.3 数据库部署MySQL配置优化建议[mysqld] innodb_buffer_pool_size 2G innodb_log_file_size 256M max_connections 2005. 踩坑经验与优化建议5.1 性能优化记录接口响应慢问题启用MyBatis二级缓存添加Spring Cache注解Nginx开启gzip压缩数据库查询优化大表添加适当索引复杂查询拆分为多个简单查询使用EXPLAIN分析慢查询5.2 安全防护措施SQL注入防护禁用${}拼接SQL使用PreparedStatement定期进行安全扫描XSS防护前端过滤特殊字符后端统一转义输出设置HttpOnly Cookie5.3 监控与日志使用Spring Boot Actuator暴露健康端点集成Prometheus监控JVM指标ELK收集分析日志日志收集配置示例appender nameFILE classch.qos.logback.core.rolling.RollingFileAppender filelogs/app.log/file rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy fileNamePatternlogs/app.%d{yyyy-MM-dd}.log/fileNamePattern /rollingPolicy /appender6. 项目扩展方向这套系统在实际运营中还在不断迭代近期新增的几个实用功能会员积分系统电影推荐算法移动端小程序接入数据分析看板特别是推荐算法部分我们基于用户历史订单数据实现了简单的协同过滤# 简化的推荐算法示例 def recommend_movies(user_id): user_ratings get_user_ratings(user_id) similar_users find_similar_users(user_ratings) return aggregate_recommendations(similar_users)这个项目从技术选型到最终上线历时3个月期间遇到了各种挑战但最终交付的系统获得了客户高度评价。最大的体会是在复杂业务系统中清晰的架构设计比炫技更重要。前后端分离确实带来了开发效率的提升但也增加了联调成本需要团队有良好的协作规范。