机票预订系统课程设计
项目概述
1 项目背景与目标
随着航空业的快速发展,传统的线下机票预订方式已无法满足现代用户高效、便捷的出行需求,本项目旨在设计并实现一个功能完善的在线机票预订系统,该系统将模拟真实世界的机票预订流程,为用户提供航班查询、预订、支付、订单管理等功能,为管理员提供航班信息管理、用户管理和订单处理等功能。
主要目标:

- 用户端: 提供直观、易用的界面,让用户可以快速查询航班、完成预订和支付。
- 管理端: 提供一个后台管理界面,方便管理员对航班、用户等核心数据进行维护。
- 技术实现: 运用主流的后端开发技术(如 Java Spring Boot + Vue.js),设计合理的数据库结构,实现系统的核心业务逻辑,并确保系统的稳定性和可扩展性。
2 系统特点
- 用户友好: 界面简洁明了,操作流程顺畅。
- 功能完整: 覆盖机票预订的核心业务流程。
- 数据安全: 对用户密码等敏感信息进行加密存储。
- 技术前沿: 采用当前流行的前后端分离架构。
系统需求分析
1 功能性需求
A. 用户模块
- 用户注册与登录:
- 用户可以通过手机号/邮箱和密码进行注册。
- 支持用户登录和退出功能。
- 支持第三方登录(可选,如微信、QQ)。
- 个人信息管理:
- 用户可以查看和修改个人基本信息(姓名、手机号、邮箱等)。
- 用户可以管理常用乘机人信息,方便快速预订。
- 订单管理:
- 用户可以查看自己的所有历史订单(待支付、已支付、已完成、已取消)。
- 用户可以对“待支付”状态的订单进行支付或取消。
- 用户可以对“已完成”的订单申请退款(可选)。
B. 航班查询与预订模块(核心)
- 航班搜索:
- 用户输入出发地、目的地、出发日期、乘客人数(成人/儿童)等条件进行搜索。
- 系统根据条件筛选并展示符合条件的航班列表。
- 航班列表信息包括:航班号、航空公司、出发/到达时间、经停情况、价格等。
- 航班详情:
用户点击某个航班后,可以查看更详细的信息,如具体起降时间、机型、餐食服务、行李额度等。
- 预订流程:
- 用户选择航班后,进入预订页面。
- 填写乘机人信息(可从常用乘机人中快速选择或新增)。
- 选择舱位等级(经济舱、商务舱等)。
- 系统自动计算总价(票价 + 机场税费等)。
- 生成订单,订单状态为“待支付”。
- 支付功能:
- 模拟支付接口,用户点击“支付”后,订单状态更新为“已支付”。
- 支付成功后,生成电子机票(订单号)。
C. 管理员模块

- 航班管理:
- 航班增删改查: 管理员可以添加新的航班信息(航线、时间、价格、座位数等),修改或删除现有航班。
- 航班状态管理: 可以将航班标记为“已售罄”、“已起飞”、“已取消”等状态。
- 用户管理:
- 查看所有注册用户列表。
- 可以根据用户名、手机号等条件搜索用户。
- 管理员可以锁定或删除违规用户。
- 订单管理:
- 查看所有用户的订单列表。
- 可以根据订单号、用户名、航班号等条件搜索订单。
- 管理员可以处理异常订单,如手动取消订单、确认退款等。
- 数据统计(可选):
以图表形式展示热门航线、销售额、用户增长等统计数据。
2 非功能性需求
- 性能: 系统能够支持至少100个用户同时在线查询和预订,页面响应时间应在3秒以内。
- 安全性:
- 用户密码必须加密存储(如使用BCrypt)。
- 防止SQL注入、跨站脚本等常见Web攻击。
- 用户登录后,后续请求需进行身份验证。
- 可用性: 系统界面设计应直观,符合用户操作习惯,提供必要的错误提示和成功反馈。
- 可维护性: 代码结构清晰,注释完善,模块化设计,便于后期维护和功能扩展。
系统设计
1 技术选型
| 类别 | 技术选型 | 说明 |
|---|---|---|
| 前端 | Vue.js + Element Plus | Vue.js轻量、易上手,Element Plus提供丰富的UI组件库,能快速构建美观的管理界面。 |
| 后端 | Spring Boot + MyBatis-Plus | Spring Boot简化了Java Web开发,MyBatis-Plus简化了数据库操作,提高开发效率。 |
| 数据库 | MySQL 8.0 | 关系型数据库,成熟稳定,适合存储结构化的业务数据。 |
| 安全框架 | Spring Security + JWT | Spring Security提供全面的安全服务,JWT用于实现无状态的用户认证。 |
| 开发工具 | IntelliJ IDEA / VS Code | 主流IDE,支持高效开发。 |
| 项目构建 | Maven | 依赖管理和项目构建工具。 |
| 部署 | Docker + Nginx | 使用Docker容器化部署,Nginx作为反向代理和静态资源服务器。 |
2 系统架构
采用前后端分离的架构。
- 前端: 负责UI展示和用户交互,通过HTTP/HTTPS协议与后端API进行通信。
- 后端: 负责业务逻辑处理、数据持久化、API接口提供,不涉及任何页面渲染。
- 数据库: 负责数据的持久化存储。
3 数据库设计
设计以下核心数据表:
用户表 (t_user)
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| id | bigint | PK, Auto-Inc | 用户ID |
| username | varchar(50) | Not Null, Unique | 用户名(手机号/邮箱) |
| password | varchar(100) | Not Null | 加密后的密码 |
| nickname | varchar(50) | | 用户昵称 |
| phone | varchar(20) | Unique | 手机号 |
| email | varchar(100) | Unique | 邮箱 |
| role | varchar(20) | Default 'USER' | 角色 (USER, ADMIN) |
| create_time | datetime | | 创建时间 |
| update_time | datetime | | 更新时间 |

乘机人表 (t_passenger)
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| id | bigint | PK, Auto-Inc | 乘机人ID |
| user_id | bigint | FK (t_user.id) | 所属用户ID |
| name | varchar(50) | Not Null | 乘机人姓名 |
| id_card | varchar(18) | Not Null | 身份证号 |
| phone | varchar(20) | | 乘机人手机号 |
航班表 (t_flight)
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| id | bigint | PK, Auto-Inc | 航班ID |
| flight_no | varchar(20) | Not Null, Unique | 航班号 |
| departure_airport | varchar(50) | Not Null | 出发机场 |
| arrival_airport | varchar(50) | Not Null | 到达机场 |
| departure_time | datetime | Not Null | 出发时间 |
| arrival_time | datetime | Not Null | 到达时间 |
| status | varchar(20) | Default 'AVAILABLE' | 状态 (AVAILABLE, SOLD_OUT, CANCELLED) |
| economy_price | decimal(10,2) | Not Null | 经济舱价格 |
| business_price | decimal(10,2) | Not Null | 商务舱价格 |
| available_seats | int | Not Null | 剩余座位数 |
| create_time | datetime | | 创建时间 |
订单表 (t_order)
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| id | bigint | PK, Auto-Inc | 订单ID |
| order_no | varchar(50) | Not Null, Unique | 订单号 |
| user_id | bigint | FK (t_user.id) | 用户ID |
| flight_id | bigint | FK (t_flight.id) | 航班ID |
| passenger_id | bigint | FK (t_passenger.id) | 乘机人ID |
| cabin_class | varchar(20) | Not Null | 舱位 (ECONOMY, BUSINESS) |
| total_price | decimal(10,2) | Not Null | 订单总价 |
| status | varchar(20) | Default 'PENDING_PAYMENT' | 状态 (PENDING_PAYMENT, PAID, CANCELLED, REFUNDED) |
| create_time | datetime | | 创建时间 |
核心功能模块实现
1 用户认证与授权
- 登录: 用户提交用户名和密码,后端验证通过后,生成一个包含用户信息的JWT(JSON Web Token)并返回给前端。
- 请求拦截: 前端在后续每次请求的Header中携带该JWT。
- 权限校验: 后端通过一个拦截器(Interceptor)或过滤器来验证JWT的有效性,如果有效,则解析出用户信息存入
SecurityContext,并允许请求继续;如果无效或过期,则返回401未授权错误。 - 角色控制: 在Controller层的方法上使用
@PreAuthorize("hasRole('ADMIN')")等注解来限制不同角色的访问权限。
2 航班搜索与预订流程
-
航班搜索API (
GET /api/flights/search)- 请求参数:
departure,arrival,departureDate,passengers - 后端逻辑:
- 根据参数构建查询条件。
- 使用MyBatis-Plus的
QueryWrapper或自定义SQL查询t_flight表。 - 过滤掉状态不是
AVAILABLE的航班。 - 按出发时间排序返回结果列表。
- 响应: JSON格式的航班列表。
- 请求参数:
-
创建订单API (
POST /api/orders)- 请求体: 包含
flightId,passengerId,cabinClass的JSON对象。 - 后端逻辑 (关键步骤):
- 事务管理: 整个下单过程必须在一个数据库事务中完成。
- 检查航班状态: 查询航班,确保状态仍为
AVAILABLE且available_seats > 0,否则,下单失败。 - 锁定座位: 将
t_flight表中对应航班的available_seats字段减1。 - 生成订单: 在
t_order表中插入一条新记录,状态为PENDING_PAYMENT。 - 提交事务: 如果以上步骤全部成功,提交事务,如果任何一步失败,回滚事务,并恢复座位数。
- 请求体: 包含
项目计划与分工
| 阶段 | 主要任务 | 预计时间 | 负责人 |
|---|---|---|---|
| 第一周 | 需求分析、技术选型、数据库设计、环境搭建 | 5天 | 全体 |
| 第二周 | 搭建前后端项目框架,实现用户注册登录模块 | 5天 | 前端A, 后端B |
| 第三周 | 实现航班管理(后端CRUD)和航班查询(前后端联调) | 5天 | 前端A, 后端B |
| 第四周 | 实现核心的航班预订和支付逻辑,订单管理模块 | 5天 | 前端A, 后端B |
| 第五周 | 实现管理员后台,进行系统测试(功能、性能、安全) | 5天 | 全体 |
| 第六周 | 撰写课程设计报告、准备答辩PPT | 5天 | 全体 |
测试方案
- 单元测试: 使用JUnit对后端的Service层和Controller层的关键方法进行测试,确保每个函数按预期工作。
- 集成测试: 测试前后端接口的交互是否正常,数据格式是否匹配。
- 功能测试: 模拟真实用户操作流程,测试所有功能点,包括正常流程和异常流程(如:重复下单、支付失败、取消已支付订单等)。
- 性能测试: 使用JMeter等工具模拟多用户并发访问,测试系统的响应时间和吞吐量,找出性能瓶颈。
总结与展望
1 总结
本设计文档详细阐述了一个机票预订系统的完整设计方案,从需求到实现,覆盖了软件工程的各个环节,通过本课程设计,可以深入理解Web应用的开发流程,掌握前后端分离架构、数据库设计、Spring Boot等核心技术的实际应用。
2 未来展望
本系统还可以在以下方面进行扩展和优化:
- 高并发处理: 引入Redis作为缓存,缓存热门航班信息,减轻数据库压力,使用消息队列(如RabbitMQ)处理下单请求,实现削峰填谷。
- 实时价格与座位: 使用WebSocket技术实现航班价格的实时更新。
- 推荐系统: 基于用户历史订单,推荐相关航线。
- 移动端支持: 开发对应的移动App或小程序。
- 支付集成: 对接真实的第三方支付平台(如支付宝、微信支付)。