数据库课程
——民航售票管理系统
安徽大学
计算机科学与技术1班
陈斌E11314079
陈柚霖E11314033
刘昊霖E11314031
2016-9-20
目录
一、 目的及
2
1. 实验目的 2
2. 实验要求 2
二、 实验环境 3
三、 实验
与步骤 3
1. 系统需求分析 3
2. 概念结构设计 7
3. 逻辑结构设计 13
4. 数据库与应用系统的实施和维护 16
四、 小组成员分工 47
五、
48
一、 目的及要求
1. 实验目的
(1) 通过本次课程设计,熟练掌握一种开发语言(如C#)和一种数据库系统软件(如SQL server 2014)的使用。
(2) 加深对软件工程的理解,训练编写程序的良好习惯。包括:认真编写需求分析文档、做好系统功能和数据库设计、学会自己进行程序的算法、数据结构设计。
(3) 培养良好的程序设计风格(模块划分、接口设计、程序界面、应用系统设计)和习惯(程序备份、版本更新与控制),提高软件测试、调试的能力与技巧。
(4) 通过本次课程设计,应该达到具有独立完成小型应用系统设计的能力,具备编写较为规范的软件设计文档的能力。
2. 实验要求
民航售票管理系统主要分为机场、航空公司和客户三方的服务。航空公司提供航线和飞机的资料,机场则对在本机场起飞和降落的航班和机票进行管理,而客户能得到的服务应该有航班线路和剩余票数的查询,以及网上订票等功能。客户又可以分为两类,一类是普通客户,对于普通客户只有普通的查询功能和订票功能,没有相应的机票优惠,另一种是经常旅客,需要办理注册手续,但增加了里程积分功能和积分优惠政策。机场还要有紧急应对措施,在航班出现延误时,要发送相应的信息。
本系统至少能完成如下查询功能:
(1) 查某代售地某月售出的票数和金额。
(2) 查航空公司拥有多少航班。
(3) 查某天某航空还剩多少票或座位。
(4) 查某天某航空还剩商务舱座位以及经济舱座位票价。
(5) 查某航空公司拥有多少售票点、某月售出总金额以及某航线售出票数。
二、 实验环境
本系统开发平台及运行环境如下:
系统开发平台:Microsoft Visual Studio 2015
系统开发语言:C#
数据库管理软件:SQL Server 2014
运行平台:Windows10 教育版
运行环境:Microsoft.NET Framework SDK v4.5
三、 实验内容与步骤
1. 系统需求分析
(1) 信息要求:指用户需要从数据库中获得信息的内容与性质。数据库中需要存储哪些数据。
本系统是针对民航售票进行管理,主要涉及航空公司信息、客户信息、飞机信息、航线信息、航班信息、订票信息等多种数据信息。
用户名和密码信息:
字段名
数据类型
长度
主键否
描述
Username
varchar
16
是
用户名
Password
varchar
16
密码
Userclass
char
1
用户类别
航空公司信息:
字段名
数据类型
长度
主键否
描述
Aid
varchar
16
是
编号
Aname
varchar
64
名称
Aaddr
varchar
64
地址
Acont
varchar
32
联系方式
机场信息:
字段名
数据类型
长度
主键否
描述
APid
varchar
16
是
编号
APname
varchar
64
名称
APaddr
varchar
64
地址
APcont
varchar
32
联系方式
客户信息:
字段名
数据类型
长度
主键否
描述
Cid
varchar
16
是
编号
Cname
varchar
16
姓名
Ccont
char
11
联系方式
IsSpec
char
1
特殊客户?
Points
int
里程积分
飞机信息:
字段名
数据类型
长度
主键否
描述
Pid
varchar
16
是
编号
Type
varchar
32
型号
SeatsNum
int
座位数
Aid
varchar
16
外键
航空公司编号
座位信息:
字段名
数据类型
长度
主键否
描述
Sid
varchar
16
是
编号
Level
char
1
座位等级
Pid
varchar
16
外键
飞机编号
IsChoose
char
1
是否被选
航线信息:
字段名
数据类型
长度
主键否
描述
Lid
varchar
16
是
编号
SPosition
varchar
32
起点
EPosition
varchar
32
终点
Distance
real
里程
Aid
varchar
16
外键
航空公司编号
航班信息:
字段名
数据类型
长度
主键否
描述
Fid
varchar
16
是
编号
Ftime
datetime
时间
Pid
varchar
16
外键
飞机编号
Lid
varchar
16
外键
航线编号
APid
varchar
16
外键
机场编号
Level
char
1
座位等级
Price
real
票价
订票信息:
字段名
数据类型
长度
主键否
描述
Bid
int
Identity(1,1)
是
编号
Fid
varchar
16
外键
航班编号
Cid
varchar
16
外键
客户编号
Sid
varchar
16
外键
座位编号
Pay
real
购票金额
Btime
datetime
购票时间
(2) 处理要求:用户需要完成什么处理功能,对处理的响应时间有什么要求(给出功能模块图)。
民航售票管理系统主要满足三类用户的要求,这三类用户分别是航空公司管理员、机场管理员和客户(分为普通客户和经常旅客)。航空公司管理员提供航线和飞机的资料,机场管理员则对在本机场起飞和降落的航班和机票进行管理,而客户能得到的服务应该有航班线路和剩余票数的查询,以及网上订票等功能。具体的需求分析如下:
1) 航空公司管理员:
1 提供飞机基本信息
2 提供航班基本信息
3 查询售票点信息、某月售出总金额以及某航线售出票数
2) 机场管理员:
1 对本机场的航班信息进行管理
2 对本机场的机票信息进行管理
3 查询某月售票数量和金额
3) 客户:
1 查询航班信息
2 机票订购
3 里程积分优惠(经常旅客)
功能模块图如下所示:
图1功能模块图
(3) 安全性与完整性要求。
数据库的安全性是指保护数据库,防止不合法的使用所造成的数据泄露和破坏。数据库系统中保证数据安全性的主要措施是进行存取控制,即规定不同用户对于不同数据对象所允许执行的操作,并控制各用户只能存取他有权(操作权力)存取的数据。存取控制机制分为自主存取控制 (DAC)与强制存取控制(MAC),主要包括两部分:
一是定义用户权限,并将用户权限登记到数据字典中;
二是合法权限检查。
数据库完整性指数据的(逻辑而非物理)正确性和相容性。为了防止数据库中存在不合语义的数据,防止错误数据的输入和输出。数据库完整性技术包括完整性约束条件与完整性检查两部分。完整性约束条件指为维护数据库的完整性,DBMS提供加在数据库数据之上的语义约束条件,作为数据库模式的一部分存入数据库。完整性检查意味检查数据库是否满足完整性约束条件的机制。完整性约束条件作用的对象可以是关系、元组、列三种。其中列约束主要是列的类型、取值范围、精度、排序等的约束条件。元组的约束是元组中各个字段间的联系的约束。关系的约束是若干元组间、关系集合上以及关系之间的联系的约束。完整性约束条件涉及这三类对象,其状态可以是静态的,也可以是动态的。 完整性约束条件一般分为实体完整性、参考完整性 自定义完整性。定义实体完整性约束条件要考虑修改关系中主码的问题;定义参考完整性约束条件要考虑外码能否接受空值问题、在被参照关系中删除元组的问题(级联删除或受限删除)、在参照关系中插入元组时的问题。
2. 概念结构设计
根据分析,民航售票管理系统包含航空公司、机场、客户、飞机、座位、航线、航班及机票8个实体,各个实体的局部E-R图如下所示,其中航空公司编号是航空公司实体的主码,机场编号是机场实体的主码,客户编号是客户实体的主码,飞机编号是飞机实体的主码,座位编号是座位实体的主码,航线编号是航线实体的主码,航班编号是航班实体的主码,机票编号是机票实体的主码。
图2航空公司实体及属性
图3机场实体及属性
图4客户实体及属性
图5飞机实体及属性
图6座位实体及属性
图7航线实体及属性
图8航班实体及属性
图9机票实体及属性
(1) 逐一设计分ER图,合并分ER图,生成基本ER图。
根据需求分析的结果可以看到,在民航售票管理系统中一个航空公司可以提供多条航线、多架飞机,飞机拥有多个座位,一个机场可以安排多个航班,一个航班对应一架飞机、涉及一条航线、可以有多个客户选择乘坐,一个客户可以订购多张机票,一张机票对应一个座位。
由以上分析可得各个局部的E-R图,如下所示(忽略各个实体的属性):
图10航空公司与飞机及航线之间的E-R图
图11飞机与航班之间的E-R图
图12航班与航线之间的E-R图
图13机场与航班之间的E-R图
图14客户与航班之间的E-R图
图15客户与机票之间的E-R图
图16飞机与座位之间的E-R图
图17座位与机票之间的E-R图
(2) 若在合并中存在属性冲突、命名冲突以及结构冲突,给出解决办法,若存在不必要的冗余,则消除并给出设计方法。
合并分E-R图并不是单纯地将各个分E-R图画在一起,而是必须消除各个分E-R图中的不一致,以形成一个能为全系统中所有用户共同理解和接受的统一的概念模型。各个分E-R图之间的冲突包括3种:属性冲突、命名冲突以及结构冲突。
经过分析,将航空公司、机场、客户、飞机、座位、航线、航班及机票之间进行关联。因此,合并各个分E-R图,生成基本E-R图,如下所示:
图18民航管理系统基本E-R图
(3) 基本ER图中要求标明主码、外码、联系类型。
基本E-R图中,各实体的主码用下划线加粗显示,外码倾斜加粗表示,联系类型表明于连接线上。
3. 逻辑结构设计
(1) 给出由ER得到的关系模型,并注明转换过程中应用的规则。
E-R图向关系数据模型转换的基本规则如下:
1) 一个实体转换为一个关系模式,实体的属性就是关系的属性,实体的键就是关系的键;
2) 一个联系转化为一个关系模式,与该联系相连的各个实体的键以及联系的属性为该关系的属性,该关系的键分为3种情况:
1 1:1联系:任一相连实体的键都可以作为该关系的主键。
2 1:n联系:n端(多端)实体的键作为该关系的主键。
3 m:n联系:各端实体的键的组合为该关系的主键。
其中,1:1联系可以和联系的任意一端实体的关系模式合并,将联系的属性和另一端关系模式的键加入该关系模式即可;1:n联系则需要和多端的关系模式合并,在多端关系模式中加入联系的属性和1端关系模式的键即可;m:n联系不能与实体合并,必须转换为单独的关系模式。
根据E-R图向关系数据模型转换的相关规则,将图18所示的E-R图转换为关系数据模型,得到民航售票管理系统的关系模式如下:
航空公司(编号,名称,地址,联系方式),应用规则1)。
航线(编号,航空公司编号,起点,终点,里程),应用规则2)-②1:n联系。
飞机(编号,航空公司编号,型号,座位数),应用规则2)-②1:n联系。
机场(编号,名称,地址,联系方式),应用规则1)。
航班(编号,飞机编号,航线编号,机场编号,时间,座位等级,票价),应用规则2)-①1:1联系及规则2)-②1:n联系。
座位(编号,飞机编号,等级,被选?),应用规则2)-②1:n联系。
客户(编号,姓名,联系方式,特殊客户?,积分),应用规则1)。
机票(编号,座位编号,航班编号,客户编号,金额),应用规则2)-①1:1联系及规则2)-②1:n联系。
(2) 数据模型的优化。
数据库的逻辑设计的结果不是唯一的。为了进一步提高数据库应用系统的性能,还应该根据应用需要适当地修改、调整数据模型的结构,这就是数据模型的优化。关系数据模型的优化通常以规范化理论为指导。
(3) 确定数据依赖。
分别写出每个关系内部属性的以及不同关系模式属性间的数据依赖。根据需求分析可知:
1. 航空公司关系模式的数据依赖:{编号->名称,编号->地址,编号->联系方式};
2. 航线关系模式的数据依赖:{编号->航空公司编号,编号->起点,编号->终点,编号->里程};
3. 飞机关系模式的数据依赖:{编号->航空公司编号,编号->型号,编号->座位数};
4. 机场关系模式的数据依赖:{编号->名称,编号->地址,编号->联系方式};
5. 航班关系模式的数据依赖:{编号->飞机编号,编号->航线编号,编号->机场编号,编号->时间,(编号,座位等级)->票价};
6. 座位关系模式的数据依赖:{编号->飞机编号,编号->等级,编号->被选?};
7. 客户关系模式的数据依赖:{编号->姓名,编号->联系方式,编号->特殊客户?,编号->积分};
8. 机票关系模式的数据依赖:{编号->座位编号,编号->航班编号,编号->客户编号,编号->金额};
(4) 对各个关系模式之间的数据依赖进行极小化处理,消除冗余的联系。
采用分析方法,根据数据项之间逻辑关系的说明,已经消除了各个关系模式之间的数据冗余联系。
(5) 按照数据依赖的理论确定个关系模式分别属于第几范式。
根据各个范式的定义:
1) 航空公司关系模式属于BCNF,因为该关系模式的码是航空公司编号,且每一个决定因素都包含码,所以∈BCNF;
2) 航线关系模式属于BCNF,因为该关系模式的码是航线编号,且每一个决定因素都包含码,所以∈BCNF;
3) 飞机关系模式属于BCNF,因为该关系模式的码是飞机编号,且每一个决定因素都包含码,所以∈BCNF;
4) 机场关系模式属于BCNF,因为该关系模式的码是机场编号,且每一个决定因素都包含码,所以∈BCNF;
5) 航班关系模式属于1NF,因为该关系模式的码是(编号,座位等级),存在非主属性部分依赖于码,所以∈1NF;
6) 座位关系模式属于BCNF,因为该关系模式的码是座位编号,且每一个决定因素都包含码,所以∈BCNF;
7) 客户关系模式属于BCNF,因为该关系模式的码是客户编号,且每一个决定因素都包含码,所以∈BCNF;
8) 机票关系模式属于BCNF,因为该关系模式的码是机票编号,且每一个决定因素都包含码,所以∈BCNF;
(6) 用户子模式设计。
将概念模型转换为全局逻辑模型后,还应该根据局部应用需求,结合具体DBMS的特点设,计用户的外模式。
机场管理员查某代售地某月售出的票数和金额,建立相应视图:
视图1(机场编号,机场名称,月售票数,月售票金额);
客户查航空公司拥有多少航班,建立相应视图:
视图2(航空公司编号,航空公司名称,航班总数);
客户查某天某航空还剩多少票或座位,建立相应视图:
视图3(航空公司编号,航空公司名称,剩余票数,剩余座位数);
客户查某天某航空还剩商务舱座位以及经济舱座位票价,建立相应视图:
视图4(航空公司编号,航空公司名称,航班编号,座位等级,票价);
航空公司管理员查某航空公司拥有多少售票点、某月售出总金额以及某航线售出票数,建立相应视图:
视图5(航空公司编号,航空公司名称,售票点总数,月售总金额);
视图6(航空公司编号,航空公司名称,航线编号,售出票数);
(7) 对不同级别用户定义不同的视图保证系统安全性。
客户只能查看航空公司、机场等基本信息,及票价信息、座位信息,个人基本信息;航空公司管理员可以查看涉及该航空公司的所有信息(如售票统计信息等),机场管理员可以查看涉及该机场的所有信息(如该机场售票统计信息等)。
4. 数据库与应用系统的实施和维护
(1) 应用程序的编码和调试。
(2) 给出截图(标明图号)简单阐述该模块的基本功能。
给出该模块的设计思路,针对难点部分进行详细地阐述。
首先是登录模块:
输入用户名和密码,选择登录用户,点击登录。链接数据库,检查数据库中是否存在该用户,以及密码是否正确,如果错误,提示用户名或密码错误,否则进入相应的用户界面。
相关代码:
///判断用户名和密码是否正确
///
///
用户名
///
密码
///
用户类型(1为航空公司管理员,2为机场管理员,3为经常旅客)
privateboolIsLogin(stringname, stringpwd, inttype)
{
boolb = false;
using (SqlConnectioncon = newSqlConnection(strCon))
{
stringsql;
if (type == 1)
sql = "select count(*) from Admins where ADid=@name and ADpass=@pwd and Aid is not null";
elseif (type == 2)
sql = "select count(*) from Admins where ADid=@name and ADpass=@pwd and APid is not null";
else
sql = "select count(*) from Users where Cid=@name and Cpass=@pwd";
using (SqlCommandcmd = newSqlCommand(sql, con))
{
try
{
con.Open();
//给sql中的参数赋值
SqlParameters1 = newSqlParameter("@name", name);
SqlParameters2 = newSqlParameter("@pwd", pwd);
cmd.Parameters.Add(s1);
cmd.Parameters.Add(s2);
intn = Convert.ToInt32(cmd.ExecuteScalar());
if (n> 0)
b = true;
}
catch (Exceptionex)
{
MessageBox.Show(ex.Message);
connectDatabase = false;
}
}
}
returnb;
}
管理员模块:
登录航空公司管理员账号,进入航空公司管理员界面,管理员首先向数据库中添加相应的数据信息。
飞机信息录入:
点击飞机信息录入,可以进行添加飞机信息操作。可以自动导入文件,也可以手动添加相关信息。以导入文件为例:
点击导入文件按钮,选择相应文件,点击打开。如果格式不正确,则给出相应提示,否则导入相应信息,点击提交,将数据存入数据库中。
同理,座位信息、航线信息均可按此方法导入数据库中。
相关代码为:
//提交
privatevoidbutton4_Click(objectsender, EventArgse)
{
//提交前检查是否有信息,没有则提示用户至少添加一行数据
if (dataGridView1.Rows.Count == 0)
MessageBox.Show("请至少添加一行数据", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
else
{
inttag = 0;
using (SqlConnectioncon = newSqlConnection(strCon))
{
try
{
con.Open();
//检查是否有不完整信息
for (inti = 0; i
0)
tag++;
}
}
if (tag == dataGridView1.RowCount)
{
MessageBox.Show("提交成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
//DialogResult diares = MessageBox.Show("要清除当前表格中的数据吗?", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
//if (diares == DialogResult.Yes)
// dataGridView1.Rows.Clear();
}
}
catch (Exceptionex)
{
MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK);
}
}
}
}
此外,航空公司管理员可以查询相关信息。点击查询统计,会弹出相关子菜单,可以查询相应的信息。
由于现在数据库中还没有相关航班信息及售票信息,暂时还不能查询到相关信息,等航班信息录入及旅客购票操作完成后再进行查询即可查询到相关信息。
登录机场管理员账号,进入机场管理员界面,管理员首先向数据库中添加相应的数据信息。
航班信息录入:
点击导入文件,导入相关航班信息:
相关代码为:
//提交
privatevoidbutton4_Click(objectsender, EventArgse)
{
//提交前检查是否有信息,没有则提示用户至少添加一行数据
if (dataGridView1.Rows.Count == 0)
MessageBox.Show("请至少添加一行数据", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
else
{
inttag = 0;
using (SqlConnectioncon = newSqlConnection(strCon))
{
try
{
con.Open();
//检查是否有不完整信息
for (inti = 0; i 0)
tag++;
}
}
if (tag == dataGridView1.RowCount)
{
MessageBox.Show("提交成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
//DialogResult diares = MessageBox.Show("要清除当前表格中的数据吗?", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
//if (diares == DialogResult.Yes)
// dataGridView1.Rows.Clear();
}
}
catch (Exceptionex)
{
MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK);
}
}
}
}
机场管理员也可以查询该机场售出票数及金额(由于当前旅客还未进行购票操作,暂时查询不到相关信息)。
旅客账号注册模块:
点击登录界面的注册键,进入注册界面:
输入相关信息点击立即注册即可:
如果信息不完整,或前后密码不一致,或者用户名已被注册都会提示错误信息:
相关代码为:
privatevoidbtnRegisterNow_Click(objectsender, EventArgse)
{
stringusername = txtUserName.Text.Trim();//用户名
stringpassword = txtUserPassword.Text.Trim();//用户密码
stringconfirmpwd = txtConfirmPassword.Text.Trim();//确认密码
stringname = txtName.Text.Trim();//用户姓名
stringusertel = txttel.Text.Trim();//用户手机
if (password != confirmpwd)
{
MessageBox.Show("密码不一致,请重新输入", "提示");
return;
}
if (username == "" || password == "" || confirmpwd == "" || name == "" || usertel == "")
{
MessageBox.Show("请输入完整信息", "提示");
return;
}
if (password.Length> 16)
{
MessageBox.Show("密码长度大于16,请重新输入", "提示");
return;
}
if (password.Length< 6)
{
MessageBox.Show("密码长度小于6,请重新输入", "提示");
return;
}
if (usertel.Length != 11)
{
MessageBox.Show("手机号码应为11位,请重新输入", "提示");
return;
}
//通过客户端应用程序连接数据库
using (SqlConnectioncon = newSqlConnection(strCon))
{
try
{
con.Open();
//查找数据库该用户名是否已被注册
stringsql;
sql = "select * from Users where Cid=@uname";
using (SqlCommandcmd = newSqlCommand(sql, con))
{
cmd.Parameters.AddWithValue("@uname", username);
using (SqlDataReaderreader = cmd.ExecuteReader())
{
if (reader.HasRows)
{
MessageBox.Show("该用户名已被注册");
return;
}
}
}
//向数据库中插入相关信息
sql = string.Format("insert into Users values('{0}','{1}','{2}','{3}','N',0)", username, password, name, usertel);
using (SqlCommandcmd = newSqlCommand(sql, con))
{
intcount = cmd.ExecuteNonQuery();
if (count> 0)
{
DialogResultdiares = MessageBox.Show("注册成功!一定要记住自己的密码呦^_^", "恭喜您", MessageBoxButtons.OK);
if (diares == DialogResult.OK)
{
this.Close();
}
}
else
{
MessageBox.Show("注册失败!", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
return;
}
}
}
catch (Exceptionex)
{
MessageBox.Show(ex.Message);
}
}
}
旅客模块:
输入用户名和密码,点击登录,进入旅客界面:
输入起始地和目的地并点击查询即可查询到相关航班信息:
座位等级H—商务舱,L—经济舱。
点击确认购票进入座位选择界面:
选择座位后点击预定:
点击确定:
订票成功后,此座位已经不能被预定了(S201座位已经不能被预定):
航班信息查询相关代码为:
//查询航班信息
voidselectFlight(stringsql)
{
if (textBox1.Text == "" || textBox2.Text == "")
{
MessageBox.Show("起始地与目的地不可为空!!!");
return;
}
if (textBox2.Text == textBox1.Text)
{
MessageBox.Show("起始地与目的地不可相同!!!");
return;
}
//查询相关航班信息
using (SqlConnectioncon = newSqlConnection(strCon))
{
try
{
con.Open();
dgvflight.Rows.Clear();
using (SqlCommandcmd = newSqlCommand(sql, con))
{
using (SqlDataReaderreader = cmd.ExecuteReader())
{
if (!reader.HasRows)
{
MessageBox.Show("抱歉,没有找到您查询的航班~", "提示");
return;
}
//有该航班则显示相关航班信息
while (reader.Read())
{
intindex = dgvflight.Rows.Add();
dgvflight.Rows[index].Cells[0].Value = reader["Fid"].ToString();
dgvflight.Rows[index].Cells[1].Value = reader["Pid"].ToString();
dgvflight.Rows[index].Cells[2].Value = reader["SPosition"].ToString();
dgvflight.Rows[index].Cells[3].Value = reader["EPosition"].ToString();
dgvflight.Rows[index].Cells[4].Value = reader["Ftime"].ToString();
dgvflight.Rows[index].Cells[5].Value = reader["Level"].ToString();
dgvflight.Rows[index].Cells[6].Value = reader["Price"].ToString();
dgvflight.Rows[index].Cells[7].Value = reader["Distance"].ToString();
}
}
}
}
catch (Exceptionex)
{
MessageBox.Show(ex.Message);
}
}
}
预定机票相关代码为:
privatevoiddgvflight_CellContentClick(objectsender, DataGridViewCellEventArgse)
{
if (e.RowIndex>= 0)
{
DataGridViewColumncolumn = dgvflight.Columns[e.ColumnIndex];
if (columnisDataGridViewButtonColumn)//预定
{
DialogResultdia = MessageBox.Show("是否确认预定此座位", "提示", MessageBoxButtons.OKCancel);
if (dia == DialogResult.OK)
{
using (SqlConnectioncon = newSqlConnection(strCon))
{
try
{
con.Open();
stringsql = string.Format("select IsSpec,Points from Users where Cid='{0}'", Cid);
using (SqlCommandcmd = newSqlCommand(sql, con))
{
SqlDataReaderreader = cmd.ExecuteReader();
while (reader.Read())
{
IsSp = reader["IsSpec"].ToString();
Dist = Convert.ToInt32(reader["Points"]);
}
reader.Close();
}
if (Dist> 2000)
zhekou = 0.8f;
//写订票记录
sql = string.Format("insert into Tickets values('{0}','{1}','{2}',{3},'{4}')", Fid, Cid, dgvflight.Rows[e.RowIndex].Cells[5].Value.ToString(), Convert.ToInt32(dgvflight.Rows[e.RowIndex].Cells[7].Value) * zhekou, DateTime.Now);
using (SqlCommandcmd = newSqlCommand(sql, con))
{
cmd.ExecuteNonQuery();
}
sql = string.Format("update Plane set SeatsNum = SeatsNum-1 where Pid='{0}'", dgvflight.Rows[e.RowIndex].Cells[1].Value.ToString());
using (SqlCommandcmd = newSqlCommand(sql, con))
{
cmd.ExecuteNonQuery();
}
//标记此票已经被购买了,不能重复购买
sql = string.Format("update Sit set IsChoose='Y' where Sid='{0}'", dgvflight.Rows[e.RowIndex].Cells[5].Value.ToString());
using (SqlCommandcmd = newSqlCommand(sql, con))
{
cmd.ExecuteNonQuery();
}
//经常旅客增加里程积分
if (IsSp == "Y")
{
sql = string.Format("update Users set Points=Points+{0} where Cid='{1}'", juli, Cid);
using (SqlCommandcmd = newSqlCommand(sql, con))
{
cmd.ExecuteNonQuery();
}
if (Dist> 2000)
MessageBox.Show("订票成功!由于您是经常旅客,里程积分达到2000分,有8折优惠,实际票价为 " + Convert.ToInt32(dgvflight.Rows[e.RowIndex].Cells[7].Value) * zhekou + " 元");
else
MessageBox.Show("订票成功!", "提示");
dgvflight.Rows.RemoveAt(e.RowIndex);
}
else
{
MessageBox.Show("订票成功!", "提示");
dgvflight.Rows.RemoveAt(e.RowIndex);
}
}
catch (Exceptionex)
{
MessageBox.Show(ex.Message);
}
}
}
else
{
//取消购票
}
}
}
}
此外,旅客也可以注册成为经常旅客,只需点击旅客界面右下角的注册键:
点击确定即可:
再次点击会给出已经是经常旅客的提示:
相关代码为:
privatevoidlinkLabel1_LinkClicked(objectsender, LinkLabelLinkClickedEventArgse)
{
stringsql = string.Format("select IsSpec from Users where Cid='{0}'", cid);
using (SqlConnectioncon = newSqlConnection(strCon))
{
try
{
con.Open();
using (SqlCommandcmd = newSqlCommand(sql, con))
{
SqlDataReaderreader = cmd.ExecuteReader();
while(reader.Read())
{
isspec = reader["IsSpec"].ToString();
}
reader.Close();
}
}
catch (Exceptionex)
{
MessageBox.Show(ex.Message);
}
}
if(isspec=="Y")
{
MessageBox.Show("您已经是经常旅客了!", "提示");
return;
}
if (MessageBox.Show("成为经常旅客可以享受积分优惠政策(里程积分需达到2000分),是否注册?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
{
sql = string.Format("update Users set IsSpec='Y' where Cid='{0}'",cid);
using (SqlConnectioncon = newSqlConnection(strCon))
{
try
{
con.Open();
using (SqlCommandcmd = newSqlCommand(sql, con))
{
intn = cmd.ExecuteNonQuery();
if (n> 0)
{
MessageBox.Show("注册成功!", "提示");
}
}
}
catch (Exceptionex)
{
MessageBox.Show(ex.Message);
}
}
}
}
现在再次购票即可增加里程积分,当里程积分达到2000分即可享受8折优惠。
由于现在里程积分为0,需要先购票使得里程积分达到2000分,之后便可享受8折优惠:
现在登录航空公司管理员账号进行查询统计:
首先查询航班情况:
查询售票点情况:
查询售出票数及金额:
相关代码为:
privatevoid查询航班情况ToolStripMenuItem_Click(objectsender, EventArgse)
{
dataGridView2.Columns.Add("c1", "航班编号");
dataGridView2.Columns.Add("c2", "起点");
dataGridView2.Columns.Add("c3", "终点");
stringsql = string.Format("select distinct Fid,SPosition,EPosition from Flight,Line where Flight.Lid=Line.Lid and Aid='{0}'", Aid);
using (SqlConnectioncon = newSqlConnection(strCon))
{
using (SqlCommandcmd = newSqlCommand(sql, con))
{
try
{
con.Open();
SqlDataReaderreader = cmd.ExecuteReader();
while (reader.Read())
{
inti = dataGridView2.Rows.Add();
dataGridView2.Rows[i].Cells[0].Value = reader["Fid"].ToString();
dataGridView2.Rows[i].Cells[1].Value = reader["SPosition"].ToString();
dataGridView2.Rows[i].Cells[2].Value = reader["EPosition"].ToString();
}
reader.Close();
}
catch (Exceptionex)
{
MessageBox.Show(ex.Message);
}
}
}
}
privatevoid查询售票点个数ToolStripMenuItem_Click(objectsender, EventArgse)
{
dataGridView2.Columns.Add("c1", "机场编号");
dataGridView2.Columns.Add("c2", "机场名称");
dataGridView2.Columns.Add("c3", "机场地址");
dataGridView2.Columns.Add("c4", "联系方式");
stringsql = string.Format("select distinct Flight.APid,APname,APaddr,APcont from Flight,Line,Airport where Flight.Lid=Line.Lid and Flight.APid=Airport.APid and Aid='{0}'", Aid);
using (SqlConnectioncon = newSqlConnection(strCon))
{
using (SqlCommandcmd = newSqlCommand(sql, con))
{
try
{
con.Open();
SqlDataReaderreader = cmd.ExecuteReader();
while (reader.Read())
{
inti = dataGridView2.Rows.Add();
dataGridView2.Rows[i].Cells[0].Value = reader["APid"].ToString();
dataGridView2.Rows[i].Cells[1].Value = reader["APname"].ToString();
dataGridView2.Rows[i].Cells[2].Value = reader["APaddr"].ToString();
dataGridView2.Rows[i].Cells[3].Value = reader["APcont"].ToString();
}
reader.Close();
}
catch (Exceptionex)
{
MessageBox.Show(ex.Message);
}
}
}
}
privatevoid查询售出票数及金额ToolStripMenuItem_Click(objectsender, EventArgse)
{
dataGridView2.Columns.Add("c1", "售出总票数");
dataGridView2.Columns.Add("c2", "售票总金额");
stringsql = string.Format("select count(*) as Count,sum(Pay) as Sum from Tickets,Flight,Sit,Line where Tickets.Fid=Flight.Fid and Sit.Sid=Tickets.Sid and Sit.Level=Flight.Level and Line.Lid=Flight.Lid and Aid='{0}'",Aid);
using (SqlConnectioncon = newSqlConnection(strCon))
{
using (SqlCommandcmd = newSqlCommand(sql, con))
{
try
{
con.Open();
SqlDataReaderreader = cmd.ExecuteReader();
while (reader.Read())
{
inti = dataGridView2.Rows.Add();
dataGridView2.Rows[i].Cells[0].Value = reader["Count"].ToString();
dataGridView2.Rows[i].Cells[1].Value = reader["Sum"].ToString();
}
reader.Close();
}
catch (Exceptionex)
{
MessageBox.Show(ex.Message);
}
}
}
}
登录机场管理员账号,查询售出票数及金额:
选择查询的起止日期,点击查询即可:
相关代码为:
privatevoidbutton5_Click(objectsender, EventArgse)
{
stringsql = string.Format("select count(*) as Count, sum(Pay) as Sum from Tickets, Flight, Sit where Tickets.Fid = Flight.Fid and Sit.Sid = Tickets.Sid and Sit.Level = Flight.Level and APid = '{0}' and Btime between '{1}' and '{2}'", APid, dateTimePicker1.Value.ToString(), dateTimePicker2.Value.ToString());
using (SqlConnectioncon = newSqlConnection(strCon))
{
using (SqlCommandcmd = newSqlCommand(sql, con))
{
try
{
con.Open();
SqlDataReaderreader = cmd.ExecuteReader();
while (reader.Read())
{
inti = dataGridView2.Rows.Add();
dataGridView2.Rows[i].Cells[0].Value = reader["Count"].ToString();
dataGridView2.Rows[i].Cells[1].Value = reader["Sum"].ToString();
}
reader.Close();
}
catch (Exceptionex)
{
MessageBox.Show(ex.Message);
}
}
}
}
四、 小组成员分工
经过小组成员的精心合作,我们设计开发的民航售票管理系统按时完成,小组成员任务分工如下表所示:
表1小组成员任务分工
任务
完成人
需求分析
陈斌、陈柚霖、刘昊霖
概念结构设计
陈柚霖、陈斌、刘昊霖
逻辑结构设计
陈柚霖、陈斌、刘昊霖
数据库创建
陈斌
代码编写与调试
陈斌
系统测试
陈柚霖、刘昊霖、陈斌
编写
陈斌、陈柚霖、刘昊霖
五、 总结
在本次课程设计中,我们小组所选择的是设计一个民航售票管理系统,这对我们来说是一次尝试与创新的过程,也可以说是一个挑战的过程,毕竟以前没有作过,缺少经验。现在利用自己学到的知识设计并制作一个民航售票管理系统,这本身就是一个知识转化为生产力的过程,所以大家都很兴奋,不同程度的投入了很高的热情与努力。在具体的设计与实施中,我们看到并感受到了一个管理系统从无到有的过程,对具体的设计步骤、思路、方法、技巧都有了进一步的了解,并感受深刻。
在设计中我们基本能按照规范的方法和步骤进行,首先对现有的系统进行调查,并查阅有关资料,最后确定设计方案,然后设计并制作,实施过程中我们深刻的认识到认真执行管理系统软件标准的重要性,我们由于对管理系统软件相关的标准和规范不太了解,缺少行为操作准则,所以在设计中手法比较生硬,主与次也没能很好把握住,这些方面通过这次我们都要加强了解。
在这次课程设计中,我们被分配以小组为单位去完成民航售票管理系统的设计与制作,所以小组内的分工和相互协调很重要,大家可以在分工中扬长避短,各及所长,这样可以很好的提高大家的积极性,和合作意识,并有效的缩短开发时间,但我们在这方面做的还不够,缺乏人员管理与沟通,导致人力资源浪费,可以说是不足之处,且迫切的需要思考和改进,这一点必须指明。这在以后的工作与学习中将会非常重要。