python飞机票预定系统_数据库课程设计-机票预订系统
⼀、机票预定系统
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 = (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数据库改变
# 验证⼀下,同样的机票只能订⼀次
hod == 'POST':
if flight.capacity > 0:
flight.book_sum += 1
flight.capacity -= 1
flight.income += flight.price
flight.user.add(request.user)
flight.save() # ⼀定要记着save
django admin 自定义页面# 传递更改之后的票务信息
context = {
'flight': flight,
'username': request.user.username
}
return render(request, 'booksystem/book_flight.html', context)
4.1.2 查询模块
前端表单接收⽤户传⼊的出发地、⽬的地和出发时间,然后在航班数据库中寻满⾜条件的航班,分两步:
寻出发地和⽬的地相同的航班;
寻航班出发⽇期与旅客出发⽇期相同的航班。
为了给⽤户良好的体验,满⾜条件的航班信息按照不同的 key 值(起飞时间、降落时间、机票价格)进⾏升序排列。# 搜索结果页⾯
def result(request):
hod == 'POST':
form = PassengerInfoForm(request.POST) # 绑定数据⾄表单
if form.is_valid():
passenger_lcity = form.('leave_city')
passenger_acity = form.('arrive_city')
passenger_ldate = form.('leave_date')
# print(type(passenger_ldate))
# 全设为naive⽐较
# china_tz = pytz.timezone('Asia/Shanghai')
# passenger_ltime = datetime.datetime(
# year=ar,
# month=h,
# day=passenger_ldate.day,
# hour=0, minute=0, second=0,
# tzinfo=china_tz
# )
# 全设为aware⽐较
passenger_ltime = datetime.datetimebine(passenger_ldate, datetime.time())
print(passenger_ltime)
# filter 可⽤航班
all_flights = Flight.objects.filter(leave_city=passenger_lcity, arrive_city=passenger_acity)
usable_flights = []
for flight in all_flights: # off-set aware
flight.leave_time = flight.place(tzinfo=None) # replace⽅法必须要赋值。。笑哭
if flight.leave_time.date() == passenger_ltime.date(): # 只查当天的航班
usable_flights.append(flight)
# 按不同的key排序
usable_flights_by_ltime = sorted(usable_flights, key=attrgetter('leave_time')) # 起飞时间从早到晚usable_flights_by_atime = sorted(usable_flights, key=attrgetter('arrive_time'))
usable_flights_by_price = sorted(usable_flights, key=attrgetter('price')) # 价格从低到⾼
# 转换时间格式
time_format = '%H:%M'
# for flight in usable_flights_by_ltime:
# flight.leave_time = flight.leave_time.strftime(time_format) # 转成了str
# flight.arrive_time = flight.arrive_time.strftime(time_format)
#
# for flight in usable_flights_by_atime:
# flight.leave_time = flight.leave_time.strftime(time_format) # 转成了str
# flight.arrive_time = flight.arrive_time.strftime(time_format)
# 虽然只转换了⼀个list,其实所有的都转换了
for flight in usable_flights_by_price:
flight.leave_time = flight.leave_time.strftime(time_format) # 转成了str
flight.arrive_time = flight.arrive_time.strftime(time_format)
# 决定 search_head , search_failure 是否显⽰
dis_search_head = 'block'
dis_search_failure = 'none'
if len(usable_flights_by_price) == 0:
dis_search_head = 'none'
dis_search_failure = 'block'
context = {
# 搜多框数据
'leave_city': passenger_lcity,
'arrive_city': passenger_acity,
'leave_date': str(passenger_ldate),
# 搜索结果
'usable_flights_by_ltime': usable_flights_by_ltime,
'usable_flights_by_atime': usable_flights_by_atime,
'usable_flights_by_price': usable_flights_by_price,
# 标记
'dis_search_head': dis_search_head,
'dis_search_failure': dis_search_failure
}
if request.user.is_authenticated():
context['username'] = request.user.username
return render(request, 'booksystem/result.html', context) # 最前⾯如果加了/就变成根⽬录了,url错误
else:
return render(request, 'booksystem/index.html') # 在index界⾯提交的表单⽆效,就保持在index界⾯
else:
context = {
'dis_search_head': 'none',
'dis_search_failure': 'none'
}
return render(request, 'booksystem/result.html', context)
4.1.3 退票模块
退票时需要更新数据库,更新航班的(capacity, book_sum, income)字段,并且在 booksystem_flight_user 表中删除这个订单。# 退票
def refund_ticket(request, flight_id):
flight = (pk=flight_id)
flight.book_sum -= 1
flight.capacity += 1

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。