返回作品

电影院订票系统

创建于 2025 年 6 月 1 日

标签
  • Spring Boot
  • MyBatis
  • MySQL
  • Apache Shiro
  • JWT
  • Quartz
  • Vue
  • Element UI

项目介绍

电影院订票系统是一个前后端分离的在线售票项目,后端为 Spring Boot 服务(CinemaManager),前端拆分为管理端(CinemaManagerAdmin)与用户端(CinemaManagerUser)两个 Vue 工程。项目覆盖了从影片上映、影厅排片、场次定价到用户选座下单、限时支付、订单取消的完整业务链路。

系统数据模型围绕影院运营设计:sys_cinema 管理影院信息(如”911影院”及其 IMAX、激光、4K、杜比等影厅类型),sys_hall 管理影厅座位模板,sys_session 表示某个影厅某部电影的具体场次,sys_bill 记录用户订单,sys_moviesys_movie_category 与中间表 sys_movie_to_category 支撑影片的多分类与票房统计。

项目架构

后端采用经典的 Controller-Service-Mapper 分层,配合 MyBatis XML 映射与 PageHelper 分页;数据源使用 Druid 连接池,数据库为 MySQL 8.0。安全方面引入 Apache Shiro 作为安全框架,但关闭了 Shiro 自带的 session 存储,改用自定义 JwtFilter 配合 java-jwt 实现无状态认证——登录后携带 token 请求,ShiroConfig 中放行注册、登录、图片与查询类接口,其余接口一律走 jwt 过滤器。

座位状态是系统的核心数据结构:每个场次的 session_seats 以 JSON 字符串存储,形如 {"1":[0,0,3,...],"2":[...]},key 表示排数,数组下标 +1 表示座号,0 为可选、1 为空位(无座)、2 为已选择、3 为已售出。前端解析该 JSON 渲染座位图,下单时把更新后的座位 JSON 随订单一并提交给后端,后端据此更新场次售出座位数 sall_nums

超时订单由 QuartzConfig 中的定时任务兜底:每 5 分钟执行一次 cancelTimeoutBill,通过 SQL 条件 sysdate() >= deadline and cancel_state = 0 and pay_state = 0 查出所有超时未支付订单,将其标记为取消,并调用 SessionSeatsUtil / CancelTimeoutBillUtil 把对应座位坐标复位为 0,同时回减场次的售出座位数。

核心功能

  • 影片与影院管理:管理员维护影片信息、海报图集、上映状态与电影类别,管理影院、影厅座位模板和场次排片;场次支持语言版本、票价、开场/散场时间与截止时间,未过截止时间的场次不允许删除关联影片与影厅。
  • 可视化选座购票:用户端 ChooseSeat.vue 以流程图(选场次 → 选座位 → 15 分钟内付款 → 取票观影)引导购票,座位按可选/空位/已选/已售四态渲染;单场最多选 5 座,提交时前端会二次校验座位是否已被他人占用,后端下单时同步更新场次座位。
  • 限时支付与超时释放SysBillMapper.xmladdBilladdtime(sysdate(), 15*100) 生成 15 分钟支付截止时间;支付接口更新订单状态后,会把座位置为已售并累加电影票房 movie_box_office;用户主动取消或超时未支付都会释放占座。
  • 票房排行榜MovieRankingList 常量定义总票房、国产票房、进口票房三类榜单,配合 SysMovieMappermovie_area 与票房排序,驱动用户端榜单页。
  • RBAC 权限管理sys_rolesys_resourcesys_role_resource 三级模型支撑菜单可见性与操作权限控制,管理员可对角色进行细粒度授权。

功能截图

暂无运行截图。

快速上手

项目使用 Node.js 16、Spring Boot 2.4.0、MySQL 8.0.19。后端通过 Maven 导入 CinemaManager 工程,在 application.yml 中配置数据库连接并执行 cinema_manager.sql 初始化数据后启动(默认端口 9231);两个前端工程分别在目录下执行 npm installnpm run dev 即可启动管理端与用户端。种子数据自带管理员与普通用户账号,可登录后分别体验后台排片与前台购票流程。

总结

项目把影院运营中最典型的”排片—选座—下单—支付—释放”闭环落到了实处,座位 JSON 的数据设计简洁直观,Quartz 定时取消超时订单的兜底机制保证了座位资源不因用户弃单而流失,Shiro + JWT 的组合也让前后端分离场景下的认证授权保持轻量无状态。整体代码结构清晰、注释完整,是一个适合学习完整电商类业务流程的参考项目。