最新资讯
THE LATESET NEWS咨询热线
400-216-6935电话:400-216-6935
邮箱:08745329@qq.com
世界杯买球平台:数据库课程设计——火车票销售
世界杯买球平台总结
数据库课程设计课题,设计了一个火车票务系统,实现了火车信息查询、车票查询购票、订单查询、个人信息管理等功能,数据为从12306爬取的真实数据.
项目链接
世界杯买球平台前端项目链接:
后端项目链接:
如果觉得有帮助,请点star
世界杯买球平台主题摘要
火车票销售系统
开发环境与技术需求分析
世界杯买球平台1.用户登录注册
用户注册登录后即可使用系统的所有功能,如添加乘客、购票、查询订单等。
2.系统需要提供基本列车信息查询:
根据车次查看列车是否正常运行,查看列车基本信息(如列车类型、始发站、终点站、行驶时间、到站时间、运行时间、车厢数量、等等)
根据列车数量,查询列车停靠站信息(包括列车各停靠站的站名、到达时间、行驶时间、运行时间等)
3.系统需要提供根据列车数量查询列车详情的功能:
您可以根据始发站和终点站查询符合您行程要求且运行正常的列车(可按行车时间或运行时间排序),并可以进一步查询中途经过的车站,以及行车时间、到站时间等。
系统需要提供一个持续传输的查询。根据输入的始发站和终点站,可以查询符合换乘条件的列车,可以按照行驶时间或总运行时间排序。
4.购票
查看符合您出行条件的列车后,您可以查看列车剩余座位并购买车票。
先添加乘客(添加需要购票的乘客)->选座(为每位乘客选择座位)->下单付款->购票成功
连续换乘车票的购买流程类似,只是选座时需要为两趟车选一个座位。
5.系统需要提供用户个人信息修改功能和密码修改功能。
6.用户可以为自己以外的乘客买票,所以提供了添加乘客的功能。每个用户可以添加多个乘客为其他乘客购票。
7.系统提供订单查询功能,可查询与自身相关的所有订单,如所有订单、未付款订单、未付款订单。
8.未付款订单 已下单未付款,可在规定时间内进行付款操作。如未在规定时间内完成操作,订单将无效,成为未完成付款。订购。
9.No travel order 对于已付款但尚未旅行的订单,您可以在 no travel order 中查看您的旅行计划。未发车的订单可在同一始发站和目的地站换乘其他列车。
10.没有旅行订单也可以退款取消订单。
数据库概念设计
本系统共有6个实体集中国铁路售票电话订票,即用户实体、旅客实体、列车信息实体、列车停靠信息实体、订单实体、列车座位信息实体
(1)用户实体:
保存在系统中注册的用户信息,主码为用户电话号码,作为每个用户的唯一标识,电话号码也作为登录用户名系统。有用户定义的完整性约束:用户类型(0为学生,1为成人,2为管理员),性别(0为女性,1为男性)
(2)乘客实体:
您可以在每个用户下添加多个乘客信息,然后为多个乘客购票。
(3)火车信息实体:
火车信息存储火车的整体信息。每辆列车都有自己的通用列车信息,表示列车是正常运行还是停止。以车次号作为列车主码(由于列车号次相同,途中因行车方向不同,班次可能会有所变化,但车次号是固定的)
(4)车站信息实体:
每辆列车都有一个停靠信息表,其中存储了列车停靠的不同车站,按站号排序。
(5)列车座位信息表,为了简化系统设计的难度,将设置以D、G开头的固定班次,设置特殊座位、一等座、二等座等座位种类,车厢有软卧、硬卧、硬座三种座位,如果座位类型相同,则座位数量和车内布局也相同。例如:特等舱车厢18座一排2座一等车厢一车座52座一排4座二等车厢85座一排5座软卧车厢一排36位,一排2个位置,分为上下铺。一辆硬卧车有66个位置,一排3 一个硬座有120个位置,一排6个座位。
火车座位信息的主要代码是火车号和车厢号。外码为车次号中国铁路售票电话订票,参考车次信息实体。
当车厢号固定时,表示座位类型已固定。具体位置是根据座位号对相应行的座位数进行模运算得到的。
5%2 = 1 块 A
(6)订单信息实体:
在系统中存储所有订单信息。订单信息实体主码为订单号,外码为用户手机号(用户实体主码)、旅客身份证号(旅客实体主码)、车次号(火车的车次)。信息主码)。
整体E-R图为:
说明:
(1)每个用户可以添加多个乘客
(2)每个用户可以有多个订单
(3)每个订单属于一位乘客
(4)每个订单有一个列车信息
(5)每个订单都有一趟列车的座位信息
(6)每个订单有两个车站信息
(7)每列火车有多个站点
(8)每列火车都有多节车厢的座位信息
E-R 图到关系模式的转换
(1)实体到关系模式
用户(电话号码、密码、身份证号、邮箱、真实姓名、用户类型、性别、地址)
旅客(旅客身份证号、旅客真实姓名、旅客电话、旅客类型、地址)
列车信息(车次、列车数量、列车类型、列车车厢数量、列车出发站、列车终点站、列车行驶时间、列车到达时间、列车到达日期、列车运行时间、列车状态)
火车座位信息(车号、车号、座位类型、座位数)
列车停靠信息(车次、车展号、站名、到站时间、总运行时间、行驶时间)
订单信息(订单号、出发站号、到达站号、车厢号、座位号、订单创建时间、订单状态、行车时间)
(2)接触进入关系模式
用户有乘客(用户电话号码、乘客身份证号)
用户拥有一个订单(用户手机号、订单号)
乘客有订单(乘客身份证号、订单号)
订单拥有列车(订单号,列车号)
订单有座位(订单号、车厢号、座位号)
列车信息有列车停靠信息(车次、车次、站号)
火车有座位(车次、车厢号)
(3)实体和关系合并,E-R图中的一对一和一对多关系通过参照完整性和关系模式进行合并,并做了一些修改合并。
用户(电话号码、密码、身份证号、邮箱、真实姓名、用户类型、性别、地址)
乘客(用户电话号码、乘客身份证号码、乘客真实姓名、乘客电话号码、乘客类型、地址)
列车信息(车次、列车数量、列车类型、列车车厢数量、列车出发站、列车终点站、列车行驶时间、列车到达时间、列车到达日期、列车运行时间、列车状态)
火车座位信息(车次、车厢号、座位类型、座位数)
车站信息(车次、车次、站号、站名、到站时间、总运行时间、行车时间)
订单信息(订单号、用户手机号、乘客身份证号、车次号、出发站号、到达站号、车厢号、座位号、订单创建时间、订单状态、行车时间)
数据库逻辑设计
数据库物理结构设计
(1)用户表:
在user表中,由于查询和更新条件都是用户的电话号码,设置用户的电话号码为主码,会相应地创建索引,提高查询效率。
(2)乘客桌:
主要代码是用户的电话号码和乘客身份证号码。由于很多查询都是基于这两个条件,所以设置主要代码是为了提高查询效率。虽然更新比较费时间,但是更新的频率比查询的频率要少很多。
(3)火车信息表:
以车次号为主码,自动创建索引,提高查询效率。
(4)车站信息表:
这张表的查询量很大,但是插入、删除和更新的操作很小,所以在这张表上建立一定的索引是非常划算的。
由于需要根据车次和车次查询停靠站信息,所以可以对车次和车次建立通用索引,提高查询效率。
根据始发站和到站检索合格列车时,需要使用站名中国铁路售票电话订票,所以要在站名上建立通用索引
(5)火车座位表:
火车座位表的主要代码是车次号和车厢号,会自动索引。查询也会基于这两个条件,所以不需要添加其他索引。
(6)订购单:
由于order表的插入频率和查询频率都很高,建索引会降低插入效率,不建索引会降低查询效率,所以需要两者取舍。
由于订单表的主码是订单号,所以会自动创建唯一索引。
用户手机号和旅客身份证号作为外码,经常成为查询条件,所以要在外码上建立一个通用索引。
查询剩余车票信息时,需要查看某辆车的订单列表,该车辆已经订购了一段时间。查询条件需要有出发站号、到达站号、列车号、订单状态、行驶日期。
因此考虑建立一个关于出发站号、到达站号、列车号、订单状态和出发日期的通用索引。提高查询效率。毕竟查询次数远多于预订次数,所以查询次数会超过插入次数,以换取空间换取更快的效率也是可以接受的。
整体项目结构
说明:
(1)用户先注册账号,再登录
登录后进入首页,然后有不同版块可供选择
(2)列车信息查询部分:
列车信息:可查询所有正常运行的列车信息
火车时刻表:可以根据车次查看列车停靠站信息中国铁路售票电话订票,
列车查询:可根据始发站和到达站查询符合条件的列车
连续换乘:可根据始发站和到达站查询一次可换乘的列车
(3)购票板块:
余票查询:可根据始发站和到达站查询符合条件的列车,查看余票和订票(跳转到购票界面)
购票:添加乘客后,您可以为乘客选择座位中国铁路售票电话订票,然后支付车票。
连续换乘:您可以根据始发站和到达站查询一次换乘可以到达的列车,然后购票,跳转到连续换乘购票界面。
连续换乘购票:添加乘客后,为乘客选择座位,然后付款,购票成功
(4)订单信息部分:
所有订单:查询用户名下所有订单的状态
未支付订单:查询用户名下所有未支付订单,即可支付订单
未出行的订单:可查看已付款但尚未出行的订单,并可退改票。
订单重新预订:重新选座已支付费用。
(5)个人信息部分:
查看个人信息:查看用户的个人信息。
修改个人信息:修改用户个人信息
修改密码:修改登录密码
查看乘客信息:查看该用户名下的所有乘客。
添加旅客:在该用户名下添加旅客,即可为该旅客购票
界面截图
(1)列车信息查询界面
(2)火车时刻表查询
(3)火车查询
(4)续转查询
(5)余票查询及购买
(6)订单列表
关键sql语句设计
(1)根据车次查询列车的所有停靠站
select b.station_no as 车站编号 ,b.station_name as 车站名,
b.train_number as 车次 , b.start_time as 开车时间,
b.arrive_time as 到达时间 , b.running_time as 历时
from train_parking_station(列车经停站信息表) as a ,train_parking_station as b
where a.train_number = '车次' and a.train_no = b.train_no
order by b.station_no
(2)根据始发站和目的站搜索符合条件的列车
select C.train_no as 列车编号 ,C.train_number as 车次 ,
C.station_name as 起始站 ,D.station_name as 目的站 ,
C.station_no as 起始站编号 , D.station_no as 目的站编号 ,
C.start_time as 开车时间 , D.arrive_time as 到达时间,
C.running_time as 到起始站已运行时间 ,D.running_time as 到目的站已运行时间
from train_parking_station(列车经停站信息表) as C ,train_parking_station as D
where C.train_no = D.train_no
and C.station_name ='济南西'
and D.station_name = '上海虹桥'
and C.station_no < D.station_no
and C.train_no in
(select train_no
from train_info
where train_running_type = '正在运行')
(3)根据始发站、目的站搜索符合条件的列车
select C.train_no as 列车编号 ,C.train_number as 车次 ,
C.station_name as 起始站 ,D.station_name as 目的站 ,
C.station_no as 起始站编号 , D.station_no as 目的站编号 ,
C.start_time as 开车时间 , D.arrive_time as 到达时间,
C.running_time as 到起始站已运行时间 ,D.running_time as 到目的站已运行时间
from train_parking_station(列车经停站信息表) as C ,train_parking_station as D
where C.train_no = D.train_no
and C.station_name ='济南西'
and D.station_name = '上海虹桥'
and C.station_no < D.station_no
and C.train_no in
(select train_no
from train_info
where train_running_type = '正在运行')
(4)根据始发站和目的站查询换乘列车
select A.train_no as 列车-1编号 ,A.train_number as 列车-1车次, D.train_no as 列车-2编号 ,
D.train_number as 列车-2车次, A.station_no as 起始站编号,
A.station_name as 起始站名称, B.station_no as 列车-1换乘站编号 ,
B.station_name as 列车-1换乘站名称 ,C.station_no as 列车-2换乘站编号,
D.station_no as 目的站编号, D.station_name as 目的站名称,
A.start_time as 列车-1发车时间 , B.arrive_time as 列车-1到达时间,
C.start_time as 列车-2发车时间 ,D.arrive_time as 列车-2到达时间
from train_parking_station as A , train_parking_station as B ,
train_parking_station as C ,train_parking_station as D
where A.station_name = '哈尔滨' and D.station_name = '广州'
and B.station_name = C.station_name
and A.train_no = B.train_no and C.train_no = D.train_no and B.train_no <> C.train_no
and B.arrive_time < C.arrive_time
and A.station_no <B.station_no and C.station_no<D.station_no
and A.train_no in (select train_no from train_info where train_running_type = '正在运行')
and C.train_no in (select train_no from train_info where train_running_type = '正在运行')
(5)根据始发站号、目的站号、列车号查询列车途中停靠点
select A.train_no as 列车编号, A.train_number as 车次 ,
A.station_name as 起始站 ,B.station_name as 目的站,
A.station_no as 经停站-1编号 , B.station_no as 经停站-2编号 ,
A.start_time as 开车时间 , B.arrive_time as 到达时间,
A.running_time as 到经停站-1已运行时间 ,B.running_time as 到经停站-2已运行时间
from train_parking_station as A ,train_parking_station as B
where A.station_no between '起始站编号' and '目的站编号'
and B.station_no between '起始站编号' and '目的站编号'
and A.train_no = '列车编号'
and A.train_no = B.train_no
and B.station_no = A.station_no +1 order by A.station_no ,B.station_no
(6)根据出发站号、目的地站号、车次号、日期查询本行程已占用座位
select train_no, carriage_no , seat_no from order_list
where start_station_no < '起始站编号' and end_station_no > '目的站编号'
and train_no = '列车编号' and left(train_start_date,10) = '日期'
and order_status <> '已退票' and order_status <> '已改签' and order_status <> '未完成支付'
union select train_no,carriage_no , seat_no from order_list
where start_station_no < '目的站编号' and end_station_no > '目的站编号' and train_no = '列车编号' and left(train_start_date,10) = '日期'
and order_status <> '已退票' and order_status <> '已改签' and order_status <> '未完成支付'
union select train_no,carriage_no , seat_no from order_list
where start_station_no > '起始站编号' and end_station_no <'目的站编号'
and order_status <> '已退票' and order_status <> '已改签' and order_status <> '未完成支付'
and train_no = '列车编号' and left(train_start_date,10) = '日期'
union select train_no,carriage_no , seat_no from order_list
where start_station_no = '起始站编号' and end_station_no = '目的站编号'
and train_no = '列车编号' and left(train_start_date,10) = '日期'
and order_status <> '已退票' and order_status <> '已改签' and order_status <> '未完成支付'
参考文献
[1] 数据库系统概念(第六版),Abraham,Silberschatz 等人,机械工业出版社,2013 年
[2] 数据库系统概论(第五版),王山,萨世轩,高等教育出版社,2014
[3] Spring Boot开发实践,陈光建主编
【4】王松的Spring Boot+Vue全栈开发实践
世界杯买球平台【5】游禹兮的vue.js2