
温馨提示本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片1. 引言随着剧本杀行业的快速发展线下门店在预约管理、剧本库存、场次安排和会员运营等方面面临越来越大的管理压力。传统的人工排表和纸质记录方式效率低、易出错难以满足多门店、多场次的运营需求。本文基于 Spring Boot 设计并实现一套剧本杀管理系统覆盖门店日常运营的核心环节帮助经营者提升管理效率和服务质量。2. 系统需求分析2.1 功能需求系统面向门店管理员、前台人员和玩家三类角色主要功能包括用户管理支持管理员、前台、玩家三类账号的注册、登录和权限控制。剧本管理维护剧本的名称、类型、人数范围、时长、难度、简介和封面图等信息。场次管理创建每日场次设置开场时间、可用座位数、对应剧本和主持人。预约管理玩家在线选择场次并提交预约支持取消预约和预约状态跟踪。订单管理预约成功后生成订单记录支付金额、支付方式和订单状态。评价管理玩家在游戏结束后对剧本和门店进行评分与留言。数据统计按日、周、月统计预约量、营业额和热门剧本排行。2.2 非功能需求安全性使用 Spring Security 实现登录认证和基于角色的接口权限控制密码采用 BCrypt 加密存储。可靠性核心业务操作使用事务管理保证预约和订单数据的一致性。易用性前端采用简洁的后台管理界面操作流程贴近门店实际使用习惯。可维护性后端按分层架构组织代码便于后续扩展新功能。3. 系统总体设计3.1 技术架构系统采用前后端分离架构后端基于 Spring Boot 构建 RESTful API前端使用 Vue.js 开发管理页面数据库选用 MySQL缓存层使用 Redis 存储热门剧本和场次信息。flowchart TD A[前端 Vue.js] --|HTTP JSON| B[Spring Boot 后端] B -- C[Spring Security 认证授权] B -- D[业务逻辑层 Service] D -- E[数据访问层 MyBatis-Plus] E -- F[(MySQL 数据库)] B -- G[Redis 缓存]3.2 功能模块划分系统按业务功能划分为以下模块用户模块、剧本模块、场次模块、预约模块、订单模块、评价模块和统计模块。各模块之间通过 Service 层进行解耦模块内部遵循 Controller、Service、Mapper 三层结构。3.3 数据库设计系统核心数据表包括用户表、剧本表、场次表、预约表、订单表和评价表。下面给出主要表结构设计。表名说明主要字段sys_user用户表id、username、password、role、phone、create_timescript剧本表id、name、type、min_players、max_players、duration、difficulty、description、cover_urlsession场次表id、script_id、start_time、end_time、total_seats、booked_seats、host_id、statusreservation预约表id、session_id、user_id、seats、status、create_timeorders订单表id、reservation_id、amount、pay_method、status、pay_timereview评价表id、user_id、script_id、score、content、create_time4. 系统核心功能实现4.1 项目结构后端项目采用标准的 Maven 多模块结构主要包结构如下com.example.murder ├── controller // 接口控制层 ├── service // 业务逻辑层 ├── mapper // 数据访问层 ├── entity // 实体类 ├── dto // 数据传输对象 ├── config // 配置类 ├── common // 通用工具与返回结果 └── MurderApplication.java4.2 用户登录与权限控制系统使用 Spring Security 实现基于 JWT 的登录认证。用户登录成功后返回 Token前端在后续请求中携带 Token 访问受保护接口。管理员和前台账号拥有管理权限玩家账号仅能访问预约相关接口。Configuration EnableWebSecurity public class SecurityConfig { Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() .antMatchers(/api/auth/login, /api/scripts/list).permitAll() .antMatchers(/api/admin/**).hasRole(ADMIN) .antMatchers(/api/reservation/**).hasAnyRole(USER, ADMIN) .anyRequest().authenticated() .and() .addFilterBefore(jwtFilter(), UsernamePasswordAuthenticationFilter.class); return http.build(); } }4.3 剧本管理模块剧本管理模块提供剧本的增删改查功能。管理员可以上传剧本封面、维护剧本类型和人数范围玩家端可以按类型和人数筛选可预约的剧本。Service public class ScriptServiceImpl implements ScriptService { Resource private ScriptMapper scriptMapper; Override public PageResultlt;Scriptgt; pageQuery(ScriptQueryDTO query) { LambdaQueryWrapperlt;Scriptgt; wrapper new LambdaQueryWrapperlt;gt;(); wrapper.like(StringUtils.isNotBlank(query.getName()), Script::getName, query.getName()) .eq(query.getType() ! null, Script::getType, query.getType()) .orderByDesc(Script::getCreateTime); Pagelt;Scriptgt; page scriptMapper.selectPage( new Pagelt;gt;(query.getPageNum(), query.getPageSize()), wrapper); return PageResult.of(page); } }4.4 场次与预约模块场次模块由管理员按日期创建设置开场时间和可用座位数。玩家提交预约时系统通过数据库行锁或乐观锁控制并发避免超卖座位。Transactional(rollbackFor Exception.class) public ReservationResult createReservation(ReservationDTO dto) { Session session sessionMapper.selectById(dto.getSessionId()); if (session null || session.getStatus() ! 1) { return ReservationResult.fail(场次不存在或已关闭); } int remain session.getTotalSeats() - session.getBookedSeats(); if (remain dto.getSeats()) { return ReservationResult.fail(剩余座位不足); } // 更新已预约座位数 sessionMapper.increaseBookedSeats(dto.getSessionId(), dto.getSeats()); // 创建预约记录 Reservation reservation new Reservation(); reservation.setSessionId(dto.getSessionId()); reservation.setUserId(dto.getUserId()); reservation.setSeats(dto.getSeats()); reservation.setStatus(0); reservationMapper.insert(reservation); // 生成订单 Order order new Order(); order.setReservationId(reservation.getId()); order.setAmount(calculateAmount(session, dto.getSeats())); order.setStatus(0); orderMapper.insert(order); return ReservationResult.success(reservation.getId()); }4.5 数据统计模块统计模块使用 SQL 聚合查询按时间维度统计预约量和营业额并计算热门剧本排行为门店运营决策提供数据支持。Service public class StatisticsServiceImpl implements StatisticsService { Resource private OrderMapper orderMapper; Override public Listlt;DailyStatVOgt; dailyRevenue(String startDate, String endDate) { return orderMapper.selectDailyRevenue(startDate, endDate); } Override public Listlt;ScriptRankVOgt; hotScripts(int limit) { return orderMapper.selectHotScripts(limit); } }5. 系统测试系统开发完成后对核心接口进行了功能测试和并发测试。功能测试覆盖登录、剧本管理、场次创建、预约下单和评价等主要流程并发测试模拟多个玩家同时预约同一场次验证座位数不会超卖。测试结果表明系统各项功能运行正常预约并发控制有效。6. 总结与展望本文设计并实现了一套基于 Spring Boot 的剧本杀管理系统覆盖用户、剧本、场次、预约、订单、评价和统计等核心业务模块基本满足门店日常运营管理需求。系统采用前后端分离架构具备良好的扩展性和可维护性。后续可以在消息提醒、会员积分、多门店管理和在线支付对接等方面继续完善进一步提升系统的实用性和用户体验。