演唱会购票系统
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每分钟(cron0 * * * * ?)扫描一次,自动取消超时(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/ # 用户头像
