演唱会购票系统

SpringBootVueRedisMySQL

本项目是一套演唱会在线购票系统,采用前后端分离架构,覆盖从用户浏览演唱会、查看票档与座位图、在线选座下单、支付到订单状态流转的完整购票流程。系统围绕**普通用户、管理员**双角色构建:普通用户可搜索演唱会、在线选座、下单购票并管理订单,也可提交反馈建议;管理员负责演唱会、票档、座位、订单、用户、公告、轮播图、反馈的全面管理及平台数据统计,辅助运营决策。

演唱会购票系统 — 项目介绍文档

一、项目概述

本项目是一套演唱会在线购票系统,采用前后端分离架构,覆盖从用户浏览演唱会、查看票档与座位图、在线选座下单、支付到订单状态流转的完整购票流程。系统围绕普通用户、管理员双角色构建:普通用户可搜索演唱会、在线选座、下单购票并管理订单,也可提交反馈建议;管理员负责演唱会、票档、座位、订单、用户、公告、轮播图、反馈的全面管理及平台数据统计,辅助运营决策。

属性 说明
项目名称 演唱会购票系统(Concert Ticket System)
架构模式 B/S 前后端分离
后端技术 Spring Boot 3.5.11 / MyBatis-Plus 3.5.6 / MySQL 8.0 / Redis / JWT
前端技术 Vue 3 / Element Plus / Pinia / Axios / ECharts / Vite
开发语言 Java 21 / JavaScript(ES6+)
适用场景 计算机毕设、课程设计、源码学习与二次开发

二、技术架构

2.1 后端技术栈

类别 技术选型 版本 说明
核心框架 Spring Boot 3.5.11 Java 企业级开发框架
ORM 框架 MyBatis-Plus 3.5.6 增强版 MyBatis,简化 CRUD
数据库 MySQL 8.0+ 关系型数据库
缓存 Spring Data Redis 随 Spring Boot 管理 演唱会详情缓存、Lua 原子库存、分布式锁
安全认证 java-jwt(JWT) 4.4.0 无状态 Token 认证
JSON 处理 fastjson2 2.0.43 高性能 JSON 序列化
参数校验 Spring Validation 随 Spring Boot 管理 DTO 参数校验
工具库 Lombok 随 Spring Boot 管理 简化样板代码
构建工具 Maven 3.8+ 依赖管理与项目构建

2.2 前端技术栈

类别 技术选型 版本 说明
核心框架 Vue 3(Composition API) 3.4+ 渐进式前端框架
UI 组件库 Element Plus 2.5+ 企业级桌面端组件库
路由 Vue Router 4.2+ 单页应用路由管理
状态管理 Pinia 2.1+ Vue 官方状态管理库
HTTP 客户端 Axios 1.6+ 基于 Promise 的 HTTP 库
图表 ECharts / vue-echarts 5.6+ / 6.6+ 数据可视化图表库
构建工具 Vite 5.0+ 下一代前端构建工具

2.3 架构图

┌─────────────────────────────────────────────────────────┐
│                      浏览器(Browser)                    │
├───────────────────────┬─────────────────────────────────┤
│   前台页面(Front)     │     后台管理(Admin)             │
│   localhost:3000       │     localhost:3000/admin         │
│   · 首页/轮播图/公告    │     · 数据统计仪表盘(ECharts)    │
│   · 演唱会搜索/列表     │     · 演唱会管理(增删改查)        │
│   · 演唱会详情/票档     │     · 票档管理(票价/库存)        │
│   · 在线选座/购票       │     · 座位管理(批量生成/统计)     │
│   · 我的订单/个人中心   │     · 全平台订单管理              │
│   · 反馈建议/公告列表   │     · 用户管理(启用/禁用)        │
│                       │     · 反馈/公告/轮播图管理         │
└───────────────────────┴─────────────────────────────────┘
                          │  HTTP /api/*
                          ▼
┌─────────────────────────────────────────────────────────┐
│              Spring Boot 后端(localhost:8080)            │
├─────────────┬──────────────┬──────────────┬──────────────┤
│  Interceptor │  Controller  │   Service    │   Mapper     │
│  JwtInterceptor│ user/concert│   业务逻辑    │  MyBatis-Plus│
│  @Anonymous  │ order/seat   │   事务管理    │  XML 自定义SQL│
│  AdminInterceptor│ admin/公告│   定时任务    │  Redis 缓存  │
└─────────────┴──────────────┴──────────────┴──────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────┐
│              MySQL 8.0(concert_ticket_system)          │
│   8 张数据表:user, concert, seat_type, seat, orders,      │
│   notice, banner, feedback                                │
└─────────────────────────────────────────────────────────┘

2.4 安全设计

  • JWT 认证拦截器:JwtInterceptor 统一拦截 /api/** 接口,解析 Authorization: Bearer <token> 后,将 userId / username / role 写入 request 属性供业务层使用,Token 无效或过期返回 401
  • @Anonymous 注解:标注公开接口(注册、登录、演唱会列表/详情、公告、轮播图、首页统计等),免登录访问,无需维护路径白名单
  • AdminInterceptor 拦截器:拦截 /api/admin/** 后台接口,校验当前用户角色为管理员(role=1),权限不足返回 403
  • 密码 MD5 加密:注册、修改密码时使用 MD5 摘要存储,数据库不保存明文
  • 逻辑删除:所有业务表均含 deleted 字段,MyBatis-Plus 全局逻辑删除配置,避免物理删除造成数据丢失
  • 统一响应与异常:所有接口返回 Result<T> 统一结构,GlobalExceptionHandler 全局兜底异常并映射为统一错误码

三、功能模块

3.1 前台功能(普通用户)

模块 功能点 说明
首页 轮播图展示、公告滚动、平台统计、限时抢购、正在热售 轮播 Banner、公告类型标识(重要/普通)、演唱会/门票/用户/好评率统计、抢购倒计时、热门演唱会推荐
演唱会搜索 关键词、状态筛选 支持按标题/演出者/场馆模糊搜索;按售票状态(未开售/销售中/已售罄)筛选
演唱会详情 演出信息、票档选择、座位图展示 展示海报、演出艺人、演出时间、场馆、售票状态、演出介绍,以及票档列表与剩余库存
在线选座购票 选择票档、在线选座、自动计价 可视化座位图(可选/已选/已售),支持批量选座,下单即锁定座位并原子扣减票档库存
我的订单 订单列表、支付/取消、订单详情 订单全生命周期管理;待支付订单 15 分钟内未支付由定时任务自动取消并释放座位与库存
个人中心 修改资料、上传头像、修改密码 昵称/手机号/邮箱/头像可编辑;修改密码需验证原密码
反馈建议 提交反馈、查看我的反馈 提交标题与内容,管理员处理后可查看回复
公告列表 公告浏览 查看公告列表与详情,重要公告带类型标识与置顶

3.2 后台功能(管理员)

模块 功能点 说明
仪表盘 平台数据统计 ECharts 可视化:总销售额、总订单数、总用户数、总演唱会数、今日订单、今日销售额、最近 7 天订单趋势、订单状态分布、演唱会销售排行
演唱会管理 演唱会增删改查 维护标题、演出者、场馆、演出时间、海报、售票状态(未开售/销售中/已售罄/已结束)、限时抢购标记
票档管理 票档增删改查 维护票档名称(内场 VIP、看台区等)、票价、总库存、剩余库存、排序
座位管理 座位列表、批量生成、清除、统计 按票档批量生成座位(行 × 列),实时统计可售/已售/锁定数量
订单管理 全平台订单查询 按订单号、用户 ID、状态多条件分页检索
用户管理 用户列表、启用/禁用 按用户名/手机号/角色/状态检索,可禁用异常账号
反馈管理 反馈列表、回复、删除 处理用户反馈并回复,反馈处理状态自动流转
公告管理 公告增删改查 类型(普通/重要)、置顶、启用/禁用
轮播图管理 轮播图增删改查 标题、图片、跳转链接、排序、启用/禁用
个人信息 查看/修改管理员信息 与前台个人中心一致

四、项目亮点

4.1 双角色权限体系

系统基于 role 字段实现**普通用户(0)/ 管理员(1)**双角色模型:

  • 注册接口仅允许注册普通用户,管理员账号通过数据库初始化脚本内置;
  • 前台与后台页面分离,前端路由守卫(requiresAdmin)与后端 AdminInterceptor 双重校验,非管理员无法访问后台;
  • 订单详情等敏感接口额外校验归属(userId),杜绝越权访问。

4.2 在线选座购票

  • 可视化座位图:前端按排/座渲染座位矩阵,清晰区分可选 / 已选 / 已售三种状态,并展示票档剩余库存;
  • 座位状态机:选座下单 → 锁定座位(0 可售 → 2 锁定,防止并发抢占)→ 支付成功确认已售(1)→ 取消或超时自动释放;
  • 支持批量选座,按所选座位数量自动计算订单总价。

4.3 库存防超卖与订单超时自动取消

  • 原子扣减:下单时通过 UPDATE seat_type SET remain_quantity = remain_quantity - ? WHERE remain_quantity >= ? 原子扣减票档库存,避免并发下超卖;取消/超时自动恢复库存;
  • 座位锁定:下单时按行批量锁定所选座位,防止多个用户同时选中同一座位;
  • 定时任务:OrderExpireTask 每分钟(cron 0 * * * * ?)扫描一次,自动取消超时(15 分钟)的待支付订单并恢复库存、释放座位,防止死单占用库存。

4.4 Redis 缓存与原子化工具

  • 演唱会详情缓存:演唱会详情接口使用 Redis 缓存(concert:detail:{id},1 小时过期),更新/删除演唱会时主动清除缓存,优化高并发读场景;
  • RedisUtil 工具类:内置 Lua 脚本实现原子扣减/恢复库存、分布式锁(tryLock / releaseLock)、防重复提交标记,为后续高并发扩展预留能力。

4.5 限时抢购与多状态演唱会

  • concert 表通过 flash_sale 字段标记限时抢购,首页展示抢购专区并带倒计时;
  • 演唱会状态机:未开售(0)→ 销售中(1)→ 已售罄(2)→ 已结束(3),后台可随时调整售票状态。

4.6 数据可视化运营

后台仪表盘集成 ECharts 图表:总销售额、订单量等核心指标卡片,最近 7 天订单趋势折线图、订单状态分布饼图、演唱会销售排行柱状图,辅助运营决策。

4.7 代码规范性

  • 全局统一异常处理(GlobalExceptionHandler),错误信息统一封装;
  • 统一响应体(Result<T>),所有接口返回格式一致;
  • 所有数据库操作使用 Lambda 表达式构建条件(LambdaQueryWrapper),避免字段名硬编码;
  • 实体继承 BaseEntity,公共字段(id、createTime、updateTime、deleted)统一维护;
  • 状态字段统一数字枚举(演唱会、订单、用户角色/状态),前端直接映射展示状态文本;
  • 文件上传路径集中配置(file.upload-path),默认头像、上传资源走统一静态映射。

五、项目结构

concert-ticket-system/
├── db/                                 # 数据库初始化脚本
│   └── concert_ticket_system.sql       # 建表 + 初始数据脚本
├── springboot/                         # 后端 Spring Boot 项目
│   ├── pom.xml
│   └── src/main/
│       ├── java/com/example/
│       │   ├── common/                 # 公共模块
│       │   │   ├── annotation/        # @Anonymous 注解
│       │   │   ├── interceptor/       # JwtInterceptor、AdminInterceptor 拦截器
│       │   │   ├── utils/             # JwtUtil、OrderNoUtil、RedisUtil
│       │   │   ├── BaseEntity.java    # 基础实体
│       │   │   └── Result.java        # 统一响应体
│       │   ├── config/                # WebConfig、RedisConfig、MybatisPlusConfig、
│       │   │                          # JacksonConfig、GlobalExceptionHandler
│       │   ├── modules/               # 业务模块
│       │   │   ├── admin/             # 平台数据统计
│       │   │   ├── banner/            # 轮播图
│       │   │   ├── concert/           # 演唱会
│       │   │   ├── feedback/          # 用户反馈
│       │   │   ├── notice/            # 公告
│       │   │   ├── order/             # 订单 + 过期订单定时任务 + 票务领域服务
│       │   │   ├── seat/              # 票档 + 座位
│       │   │   └── user/              # 用户(注册/登录/个人中心)
│       │   └── MainApplication.java   # 启动类
│       └── resources/
│           ├── mapper/                # MyBatis XML 自定义 SQL
│           ├── static/images/         # 静态资源(演唱会海报、默认头像)
│           └── application.yml        # 主配置文件
├── vue/                               # 前端 Vue 3 项目
│   ├── package.json
│   ├── vite.config.js
│   └── src/
│       ├── api/                       # API 封装(7 个模块)
│       ├── components/Navbar.vue      # 前台导航栏
│       ├── layouts/FrontLayout.vue    # 前台布局(导航 + 页脚)
│       ├── router/index.js            # 路由配置(含登录/管理员守卫)
│       ├── store/user.js              # Pinia 用户状态
│       ├── utils/request.js           # Axios 拦截器(认证 + 错误处理)
│       └── views/
│           ├── 前台页面                # Home、ConcertList、ConcertDetail、Order、
│           │                          # OrderDetail、Profile、Feedback、NoticeList、
│           │                          # Login、Register
│           └── admin/                 # 后台:Layout、Dashboard、Concert、SeatType、
│                                      # Seat、Order、User、Feedback、Notice、Banner、Profile
└── uploads/                           # 文件上传目录
    └── avatars/                       # 用户头像
客服
反馈