随着社会发展的不断进步,出行选择飞机的消费者也越来越多,为了满足人们的出行需求,方便旅客购票以及机场管理,实现航空公司的现代化管理,进一步提高工作效率,需要开发一个售票及管理系统。该系统需要具有完整的存储,查询,管理,核对等功能。用户可以通过该系统进行机票的查询预订操作,机场可以对航班班次、用户订单等信息进行查询和管理。
该 C/S 系统分别从管理员和用户两个角色出发,目标实现了航班管理、预订机票两大主要功能模块。管理员可以管理航班、管理班次、查看用户订单;用户可以查询航班、预订机票、退订机票。通过数据库和前后端代码的连接,实现了机票预订系统的核心逻辑和必须功能。
在数据库中至少应该包含下列数据表:
根据要求以及现有的产品参考进行需求分析。首先构想的是做一个 C/S 系统,分别从用户端、管理员端两个角度出发进行功能设计。其中两边功能主要有如下几点:
用户端主要功能:
管理端主要功能:
管理航班班次:可以增加航班,增加、删除、查询航班班次;
管理订单:可以查询用户订单信息;
可以做的附加功能:
整体需求的主要模块如下图 41 所示。
图 4-1 需求图
根据大致需求,进行详细拆分后可以得到数据流图,如下图 42 所示。
图 4-2 数据流图
机场售票和管理系统的数据需求应该包括如下几点:
数据的输入是否准确是数据处理的前提,错误的输入会导致系统输出的不正确和不可用从而使系统的工作失去意义。数据的输入来源是手工输入,手工输入要通过系统面上的安排系统具有容错性,并且对操作人员要进行系统的培训。在系统中,数据输入往往是大量的,因此系统要有一定的处理能力,以保证迅速的处理数据。
由于系统的数据是共享的,在不同的航空公司中,机票航班等是共享数据,所以如何保证这些数据的一致性,是系统必须解决的问题。要解决这一问题,要有一定的人员维护数据的一致性,在数据录入处控制数据的去向,并且要求对数据库的数据完整性进行严格的约束。对于输入的数据,要为其定义完整性规则,如果不能符合完整性约束,系統应拒绝该数据。
整个机场售票和管理系统的数据是共享的。然而,从系统开发的角度上看,共享会给设计和调试带来困难。因此,应该提供灵活的配置,使各个分系统能够独立运行,而通过人工干预的手段进行系统数据的交换。这样,也能提供系统的强壮性。
系统的设计主要为功能设计、页面设计、数据库设计三大块,也就是后端、前端、和数据存储。其中前两大数据模块在下方分点阐述。
系统的功能模块组成主要为两部分:用户模块、管理员模块。用户模块需要实现的两大功能就是预订机票、退订机票,为了识别不同用户进行的操作,还需要登录注册系统。管理员模块要实现的功能简单来说就是增删改查,考虑到实际操作的真实性,这里设计的管理员有权利对航班和班次进行查询、增加、删除操作,对用户的订单只有查询操作。
两个模块的功能逻辑设计和大致流程如下图 43、图 44 所示。
图 4-3 用户模块
图 4-4 管理员模块
页面设计如下所示:
- 班次管理
- 查看班次页面
- 查看订单页面
- 增加班次页面
- 删除班次页面
- 航班管理
- 增加航班页面
- 删除航班(未完成)
- 登录注册
- 登录页面
- 注册页面
- 预定机票
- 航班查询页面
- 输入信息预定页面
- 退订机票
- 查询订单并删除页面
- 个人信息(未完成)
其中部分原型页面设计如下图 4-5 机票查询图、 4-6 信息输入、图 4-7 班次查询所示。
图 4-5 机票查询
图 4-6 信息输入
图 4-7 班次查询
ER 图设计如下图 48 所示。
图 4-8 ER 图
根据 ER 图分析,可以根据三个原则进行表的设计。
最初设计过于冗余,在功能的开发过程中不断修改打磨,更改结构设计。因此在最终设计中,总共设计了四个表,涵盖了所需要的所有信息,分别是:
表的详细设计及字段内容如下。
字段名 | 含义 | 类型 | 备注 |
---|---|---|---|
flight_id | 航班号 | varchar(20) | 主码 |
company_name | 公司名 | varchar(20) | |
plane_type | 机型 | varchar(20) | |
departure_city | 出发城市 | varchar(20) | |
arrival_city | 到达城市 | varchar(20) |
字段名 | 含义 | 类型 | 备注 |
---|---|---|---|
class_id | 班次号 | varchar(20) | 主码 |
departure_time | 起飞时间 | datetime | |
departure_airport | 起飞机场 | varchar(20) | |
arrival_time | 到达时间 | datetime | |
arrival_airport | 到达机场 | varchar(20) | |
a_number | 商务舱座位 | int(11) | |
b_number | 经济舱座位 | int(11) | |
a_price | 商务舱价格 | int(11) | |
b_price | 经济舱价格 | int(11) | |
flight_id | 航班号 | varchar(20) | 外码,约束名为 classes_flight_fid_fk |
字段名 | 含义 | 类型 | 备注 |
---|---|---|---|
account | 账号 | varchar(20) | 主码 |
password | 密码 | varchar(20) | |
name | 用户名 | varchar(20) | |
sex | 性别 | varchar(10) | |
age | 年龄 | int | |
tel | 电话号码 | varchar(20) |
字段名 | 含义 | 类型 | 备注 |
---|---|---|---|
order_id | 订单号 | int | 主码 |
name | 乘客名 | varchar(20) | |
account | 账号 | varchar(20) | 外码,约束名为 passengers_users_account_fk |
id | 身份证号 | varchar(20) | |
order_time | 订单时间 | datetime | |
seat | 座位号 | varchar(5) | |
degree | 舱位类型 | varchar(2) | |
class_id | 班次号 | varchar(20) | 外码,约束名为 passengers_classes_cid_fk |
建表 SQL 语句如下
-- 表1 航班信息表(flight) 记录航班信息
-- 航班号flight_id,公司名company_name,飞机类型plane_type
-- 出发城市departure_city,到达城市arrival_city
DROP TABLE IF EXISTS flight;
CREATE TABLE flight (
flight_id varchar(20) NOT NULL PRIMARY KEY,
company_name varchar(20) NOT NULL,
plane_type varchar(20) NOT NULL,
departure_city varchar(20) NOT NULL,
arrival_city varchar(10) NOT NULL
);
-- 表2 班次信息表(class) 记录班次信息
-- 航班号id,航班名name,起飞时间departure_time,到达时间arrival_time
-- 起飞地点departure_airport,到达地点arrival_airport
-- 座位数a_number,b_number, 票价a_price,b_price
DROP TABLE IF EXISTS classes;
CREATE TABLE classes (
class_id varchar(20) NOT NULL PRIMARY KEY,
departure_time datetime NOT NULL,
departure_airport varchar(20) NOT NULL,
arrival_time datetime NOT NULL,
arrival_airport varchar(20) NOT NULL,
a_number int(11) NOT NULL,
b_number int(11) NOT NULL,
a_price int(11) NULL,
b_price int(11) NULL,
flight_id varchar(20) NULL,
constraint classes_flight_fid_fk FOREIGN KEY (flight_id)
references flight(flight_id)
on delete cascade on update cascade
);
-- 表3 用户信息表(users)记录用户信息
-- 账号account, 密码password,用户姓名name,性别sex
-- 年龄age,电话tel
DROP TABLE IF EXISTS users;
CREATE TABLE users (
account varchar(20) NOT NULL PRIMARY KEY,
password varchar(20) NOT NULL,
name varchar(20) NOT NULL,
sex varchar(10) null,
age int null,
tel varchar(20) null
);
-- 表4 旅客订票信息表
-- 序号order_id, 身份证号id, 座位号seat, 舱位degree
DROP TABLE IF EXISTS passengers;
CREATE TABLE passengers (
order_id int NOT NULL PRIMARY KEY,
name varchar(20) NOT NULL,
account varchar(20) NOT NULL,
id varchar(20) NOT NULL,
order_time datetime NOT NULL,
seat varchar(5) NOT NULL,
degree varchar(2) NOT NULL,
class_id varchar(20) NOT NULL,
constraint passengers_classes_cid_fk FOREIGN KEY (class_id)
references classes(class_id)
on delete cascade on update cascade,
constraint passengers_users_account_fk FOREIGN KEY (account)
references users(account)
on delete cascade on update cascade
);
本系统主要通过 MySQL+Navicat 实现了数据库的功能,通过 Java 的 DBHelper 设置对应数据库的连接,使得程序可以成功执行。
数据库及表单设计如图 4-9 所示。
图 4-9 数据库和表
数据库的连接配置文件如图 4-10 所示。
图 4-10 数据库连接
用户在登录界面输入账号和密码,若账号存在,且密码与数据库中储存的密码一致时,登录成功,不一致则出现弹框显示账号不存在/密码错误。在程序中通过 select 语句实现了账号密码的查询,如下图 4-11 所示。
图 4-11 登录查询账号密码
注册新用户,用户在输入框输入个人信息,其中账号、密码、姓名是必填项,按下提交后校验发现没有填的话则弹出弹框提示用户填写。数据填写正确后通过语句检查数据库中是否已存在该账号,若存在,则提示用户重新输入账号。账号无重复后资料输入无误后,账号创建成功,数据库中插入新用户信息,并跳回登录界面。
其中插入新用户主要使用了 Insert 语句,如图 4-12 所示。
图 4-12 插入新用户信息
用户登录成功后,进入机票查询界面,在对应位置输入出发城市、到达城市、出发时间、到达时间,还可通过公司和舱位进行筛选,最后在右侧显示筛选后的班次信息,班次信息可以看到出发时间、到达时间、出发机场、到达机场、票价等详细信息。用户可以通过“预订”按键预订机票。
查询筛选班次主要使用了 Select 语句,出发城市、到达城市、出发时间、到达时间这四个为必选项,所以写在了基础语句之中,其它筛选项通过 if 语句判断是否选择后再加入 SQL 语句。主要语句内容如图 4-13 所示。
图 4-13 查询筛选班次信息
选择想要预定的班次,点击“预订”按钮后,会出现一个填写乘客信息的弹框,正确输入乘客基本信息后则预定成功,对应班次的余票减一处理。如果同一班次的座位号已被预订,则会弹框提示“座位号已被预订,预定失败”,否则弹框显示“预订成功”。
订单号是逐个递增的,由于考虑到可能在有乘客退订的情况下订单号不连续,所以在插入新订单的时候,新 order_id 的获取是先通过一个 select max(order_id)获取原本订单号的最大值,最后插入的时候加一。更新票数也是根据班次号、舱位类型进行判断,再使用 update 语句更新对应班次对应舱位的座位数为(原来的值-1)。主要部分代码如下图 4-14 所示。
图 4-14 机票预订
用户可以通过左上角的菜单进入“退订机票”页面。通过选择框用户可以看到自己账号下的订单号并进行选择。对应订单号对应的数据会显示页面中,在确认订单信息无误后用户可以点击“确认取消订单”按钮取消该订单。
在取消订单后要进行两个操作,一个是使用 delete 语句删除乘客表中对应的订单数据,另一个是对对应的座位进行加一操作。这个地方的设计本来可以更简便,让座位数为(初始值-count(对应订单数))的设计,然后利用触发器来实现。这也算是一个实现不太完美的点。目前系统的具体实现如下图 4-15 所示。
图 4-15 退订机票
左上角菜单栏可以选择查询班次信息还是订单信息,通过输入框输入一些对应信息后,点击查询按钮就可显示筛选后对应的班次、订单信息,可供管理员对信息进行检查核对。信息以表格形式呈现。
其中订单查询的语句如下图 4-16 所示。
图 4-16 订单查询
输入航班各个信息后,点击确认,当航班号重复时,会提示航班已存在,重新添加航班号。信息无误后点击确认,则航班添加成功。
其中增加航班的主要语句如图 4-17 所示。
图 4-17 增加航班
选择增加班次,添加班次的基本信息后,确认添加,旁边列表会显示对应班次已有的起飞降落时间,如有冲突则添加失败,如果信息填写正确且没有冲突班次则添加班次成功。
选择取消班次,通过选择框管理员可以看到所有的班次号并进行选择。对应班次号对应的数据会显示在页面中,检查无误后,点击确认删除,该班次则取消成功。
其中取消班次的主要语句如图 4-18 所示。
图 4-18 取消班次
该系统一共有三个包,分别为机场(管理班次&查询订单)、公司(管理航班)、用户(登录注册、预订退订)。
package | .java | 备注 |
---|---|---|
Airport | flight | 增加班次、删除班次 |
Airport | main_system | 入口文件 |
Airport | research | 查询订单、查询班次 |
Company | addflight | 增加航班、删除航班(未完成) |
Company | company_system | 入口文件 |
Customer | plane_message | 入口文件 |
Customer | login_layout | 登陆页 |
Customer | register_layout | 注册页 |
Customer | user | 预订/退订菜单选择页 |
Customer | plane_message_layout | 预订机票页 |
Customer | unsubscribe | 退订机票页 |
Customer | order_layout | 填写乘客信息弹框 |
Customer | payment_layout | 账单、取票详情页(未完成) |
Customer | buttonUI | 各种按钮的显示样式 |
Customer | Warning_info | 提示弹框 |
系统页面展示如下。
用户页面入口文件进入就是登陆页,输入账号密码正确,选择登陆可以进入机票预订/退订页,选择注册可以进入注册页。如图 4-19 所示。
图 4-19 登录页面
注册页面,输入账号、密码、姓名三个必填项,电话、年龄两个选填项,以及一个性别选择框。点击“注册”按钮,如果没有重复的账号,且输入数据符合规范就会跳转到登录页面,否则会出现注册失败弹框。如图 4-20 所示。
图 4-20 注册页面
机票查询页面,左边的输入框可以输入想要查询的航班班次信息。点击“搜索”在右侧会出现查询结果。如图 4-21 所示。
图 4-21 机票查询
得到搜索结果的查询页面。每一个符合要求的班次都有两个舱位:商务舱和经济舱,可以选择需要的进行机票预订操作。如图 4-22 所示。
图 4-22 筛选结果
选择预订机票后弹框要求输入信息,包括乘客证件号、乘客姓名以及要预约的座位号。如果座位号已被预订则预定失败,否则添加成功。如图 4-23 所示。
图 4-23 机票预订
通过左上角的菜单栏可以切换到退订机票页面。如图 4-24 所示。
图 4-24 机票退订
选择当前账号已预订的订单号可以查看详细信息。确认无误后点击“确定取消该订单”删除订单。如图 4-25 所示。
图 4-25 选择订单
班次信息查询页面,上面输入信息点击“搜索”可以筛选班次。默认显示所有班次信息。如图 4-26 所示。
图 4-26 班次查询
订单信息查询页面,上面输入信息点击“搜索”可以筛选订单。默认显示所有订单信息。如图 4-27 所示。
图 4-27 订单信息查询
安排航班班次页面。可以选择对应的航班号,输入信息则可安排航班班次。尤其需要注意输入的机场和起飞时间信息,会在右边的两个表格显示已占用的时间段,不能相互冲突,否则会添加班次失败。如图 4-28 所示。
图 4-28 安排班次
选择当前班次号可以查看班次信息。确认无误后点击“确定取消航班”删除班次。如图 4-29 所示。
图 4-29 取消班次
增加航班页面,可以输入信息增加航班。如图 4-30 所示。
图 4-30 增加航班
设计了系统 ER 图、数据流图;
实现了数据库的表创建;
实现了数据的增删改查;
实现了系统完整的功能流程;
实现了系统和数据库的连接;
实现了页面 UI;