一、机票预定系统
1.1 题目要求
要求具备如下基本功能
班机基本信息的管理;
航班信息的管理;
旅客预定机票、取消预约、付款取票、退票的管理;
查询航班信息、航班预定情况、旅客信息,计算航班满座率。
统计每周、每月,每年营业收入情况。
1.2 开发环境
语言:Python 3.5
框架:Django 1.10.6
前端设计:HTML, CSS, JavaScript
开发环境:PyCharm
二、需求分析
2.1 具体需求
为方便旅客出行,某航空公司(CSU Airlines)拟开发一个机票预定系统。旅客可通过网上订票平台查询公司航班情况,通过输入起飞地、目的地、起飞时间等信息系统为旅客安排航班,旅客可根据自身需要,按照起飞时间和机票价位来选择航班。订票成功之后,系统为旅客生成订单信息,旅客可以再个人信息页面查看自己的订票信息,并且可以向系统提出退票要求,系统针对具体情况计算手续费后进行相应退票处理。
2.2 功能分析
(1)用户界面
查询:用户对航班信息进行查询操作;
排序:用户根据自己的需求对查询结果进行排序筛选;
订票:对用户订票需求进去处理并记录旅客预定信息和更新数据库信息;
退票:对用户退票需求进行处理并更新数据库;
查看个人信息:用户查看自己的个人票务信息
帮助:提供系统使用帮助文档;
退出:关闭当前页面。
(2)管理员界面
航班信息管理:可对航班信息进行增删改查操作;
旅客信息管理:可对旅客信息进行增删改查操作;
财务信息管理:可以统计航空公司每周、每月,每年营业收入情况。
帮助:提供系统使用帮助文档;
退出:关闭当前页面。
2.3 系统主功能图
机票预订系统主功能图
2.4 系统数据流图
机票预订系统数据流图
三、逻辑设计
3.1 ER图
航班和旅客间ER图
3.2 数据库表
(1)航班信息表
(2)旅客信息表
旅客信息表继承了 Django 模板中默认的 User 类,所以有一些继承来的别的字段,我们的 Passenger 对象只需要 id,username,password 即可。
(3)实体间多对多关系
通过在两表之间建立一张新表的方式,将 booksystem_flight 表和 auth_user 表的主键联系在一起,实现了多对多关系。
四、功能设计
本系统采用的 Python + Django + Sqlite 的设计方法,后台功能写在 views.py 文件中。
4.1 用户模块
4.1.1 订票模块
在用户订票的过程中,首先判定用户是否登录,如果没有登录,就加载登录页面;如果用户已经登陆了,通过前端用户选择的航班传入flight.id,然后判断如果用户已经订过这次航班,就反馈冲突信息,如果没有,订票成功,数据库更新,显示订票成功页面。
# 免除csrf
@csrf_exempt
def book_ticket(request, flight_id):
if not request.user.is_authenticated(): # 如果没登录就render登录页面
return render(request, 'booksystem/login.html')
else:
flight = Flight.objects.get(pk=flight_id)
# 查看乘客已经订购的flights
booked_flights = Flight.objects.filter(user=request.user) # 返回 QuerySet
if flight in booked_flights:
return render(request, 'booksystem/book_conflict.html')
# book_flight.html 点确认之后,request为 POST 方法,虽然没有传递什么值,但是传递了 POST 信号
# 确认订票,flight数据库改变
# 验证一下,同样的机票只能订一次
if request.method == 'POST':
if flight.capacity > 0:
flight.book_sum += 1
flight.capacity -= 1
flight.income += flight.price
flight.user.add(request.user)
flight.save() # 一定要记着save
# 传递更改之后的票务信息
context = {
'flight': flight,
'username': request.user.username
}
return render(request, 'booksystem/book_flight.html', context)
4.1.2 查询模块
前端表单接收用户传入的出发地、目的地和出发时间,然后在航班数据库中寻找满足条件的航班,分两步:
寻找出发地和目的地相同的航班;
寻找航班出发日期与旅客出发日期相同的航班。
为了给用户良好的体验,满足条件的航班信息按照不同的 key 值(起飞时间、降落时间、机票价格)进行升序排列。
<