文档库 最新最全的文档下载
当前位置:文档库 › 数据库课程设计汇本~飞机订票系统

数据库课程设计汇本~飞机订票系统

数据库课程设计汇本~飞机订票系统
数据库课程设计汇本~飞机订票系统

数据库课程设计报告题目飞机订票管理系统

目录

第一章概述 (3)

1.1项目背景 (3)

1.2 编写目的 (3)

1.3 开发工具 (3)

1.3.1软件定义 (3)

1.3.2 开发环境 (3)

第二章需求分析 (4)

2.1 问题述 (4)

2.2 ER模型图 (4)

第三章数据库逻辑设计 (5)

3.1 定义数据库表 (5)

数据库表 (5)

第四章软件功能设计 (7)

4.1 软件功能结构图 (7)

4.2软件划分模块 (7)

4.2.1 整体流程: (7)

4.2.2 航班信息查询模块 (8)

4.2.3 顾客查询模块 (10)

4.2.4 订票、退票功能 (12)

4.2.5 财务查询 (17)

第五章界面设计 (18)

第六章结束语 (19)

第一章概述

1.1项目背景

航空业作为运输行业的基础,要提高我国运输行业的整体水平,必须从基础抓起。订票系统是航空业从事生产和管理的基层单位,加强订票系统是航空业基础地位的关键,也是保障航空业业可持续发展的重要基石。

随着现在航空运输业的发展,机票预订系统也成为了航空运输业的软件副产品,目前的管理系统都是与数据库关联,故数据库的管理也成为很热门的研究对象。此项目是以数据库为支撑,java(eclipse)为平台而开发的。

1.2 编写目的

编写此项目的目的是为了进一步了解数据库的储存管理机制以及数据库与其他的语言语言工具之间关联和协作。也可以熟悉项目开发的流程,步骤,为以后编写其他的程序打下基础。

1,了解并掌握数据结构的设计方法,具备初步的独立分析能力;

2,初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能

3,提高综合运用所学的理论知识和方法独立分析和解决问题的能力;

4,训练用系统的观点和软件开发的一般规进行软件开发,培养软件工作者所具备的的科学的工作方法和作风。

1.3 开发工具

1.3.1软件定义

Oracle 11g,PowerDesigner,eclipse

1.3.2 开发环境

Windows7,Java,database

第二章需求分析

2.1 问题述

设计一个飞机订票系统

要求具备如下基本功能:

1、班机基本信息的管理;

2、航班信息的管理;

3、旅客预定机票、取消预约、付款取票、退票的管理;

4、查询航班信息、航班预定情况、旅客信息,计算航班满座率。

5、统计每周、每月,每年营业收入情况。

2.2 ER模型图

Er模型图

第三章数据库逻辑设计3.1 定义数据库表

数据库表

字段名数据类型含义说明控制情况income float 收入可为空outcome float 支出可为空

Powerdesign下的物理模型构建

第四章软件功能设计

4.1 软件功能结构图

4.2软件划分模块

4.2.1 整体流程:

对主界面进行功能选择操作,通过反馈Action进入分功能操作,然后在Action模块中分别由search(),add(),delete(),update()关联到Dao包(Dao包主要管理连接数据库的业务),然后根据不同的功能进入到了关联数据库的部分,通过如下部分连接数据库:

1,加载JDBC驱动程序,成功加载后,会将Driver类的实例注册到DriverManager;

2,提供JDBC连接的URL,连接URL定义了连接数据库时的协议,子协议,数据源标识;

3,创建数据库的连接,向java.sql.DiverManager请求并获得Connection对象,该对象就代表一个数据库连接;

Connection conn=DriverManager.getConnection(url,username,password)

4,创建一个Statement,要执行SQL语句,必须获得java.sql.Statement 实例,然后将要执行的语句作为参数传进去

PreparedStatement pstmt=con.prepareStatement(sql);

5,执行sql语句,Statement接口提供了三种执行SQL语句的方法:executeQuery,executeUpdate,和execute

ResultSet rs=stmt.execute(String sql);

6处理结果:执行更新返回的本次操作影响到的记录数,执行查询返回的结果是个ResultSet对象,使用结果集对象的访问方法获取数据:

While(rs.next()){

String name=rs.getString(“name”);

String pass=rs.getString(1);

}

7,关闭JDBC对象:操作完成以后要把所有使用的JDBC对象全部关闭,以释放JDBC资源,关闭顺序和声明顺序相反:首先关闭记录集,然后关闭声明,最后关闭连接对象

If(rs!=null){

Try{

Rs.close();}catch(SQLException e){

e.printStackTrace();

}

}

然后是stmt最后是conn

这样就是整个流程的进行

4.2.2 航班信息查询模块

该模块属于基本功能,其主要实现对航班的基本信息的查询,修改和删除,是通过对后台的各种操作来方便前台。

其主要用的SQL语句有:select,insert,delete,update 等.

如select * from flight;(从flight表中检索所有的信息)

Insert into flight values(?,?,?,?,?);

然后数据库通过JDBC连接到java,再在java过对界面的操作,与各功能块的实现结合起来。

Java中的部分功能实现代码:

1,查询模块

private void queryData(int page) //查询模块采用分页显示

{

flightbasicDao=new FlightBasicMessDao(); //Dao包为与数据库连接

pageBean = new PageBean(flightbasicDao.queryCount(),10);

//分页操作

if(page <= 1){

pageBean.setCurPage(1);

}else if(page >= pageBean.getMaxPage()){

pageBean.setCurPage(pageBean.getMaxPage());

}else{

pageBean.setCurPage(page);

}

Vectorflightbasicinfo=flightbasicDao.queryFlightdata(pageBean.ge tCurPage(), pageBean.getRowsPrePage()); //将查询结果放入向量flightbasicinfo中//将查询结果用表格显示出来

Vector columns = new Vector();

Log.log(this, "queryData vipinfo size"+flightbasicinfo.size());

columns.add("起点");

columns.add("终点");

columns.add("起飞时间");

columns.add("到达时间");

columns.add("航班号");

columns.add("返航号");

columns.add("航空公司");

columns.add("票务类型");

columns.add("剩余票数");

columns.add("票价");

tModel.setDataVector(flightbasicinfo, columns);

//刷新表格

table.revalidate();

//设置分页信息

curPage.setText(pageBean.getCurPage()+"");

rowsPrePage.setText(pageBean.getRowsPrePage()+"");

maxPage.setText(pageBean.getMaxPage()+"");

maxCount.setText(pageBean.getMaxCount()+"");

}

连接数据库的部分:

public Vector queryFlightdata(int curPage,int rowsPrePage){ Vector flightinfo = new Vector();

Vector v = null;

//初始化connection,preparedstatement,resultset

Connection conn = null;

PreparedStatement stmt = null;

ResultSet rs = null;

try {

conn = Dbcp.getConnection();

stmt=conn.prepareStatement(Constants.QUERY_FLIGHTBASICINFO);

stmt.setInt(1, curPage*rowsPrePage);

stmt.setInt(2,(curPage-1)*rowsPrePage+1);

rs = stmt.executeQuery();

while(rs.next()){

v = new Vector();

v.add(rs.getString("startplace"));

v.add(rs.getString("endplace"));

v.add(rs.getString("starttime"));

v.add(rs.getString("returntime"));

v.add(rs.getString("flightnumber"));

v.add(rs.getString("returnflight"));

v.add(rs.getString("airfirm"));

v.add(rs.getString("style"));

v.add(rs.getString("tick"));

v.add(rs.getInt("price"));

flightinfo.add(v);

}

} catch (SQLException e) {

// TODO Auto-generated catch block

Log.log(this, "queryflightdata"+e.getMessage());

e.printStackTrace();

}finally{

Log.log(this,

"queryflightdata"+Constants.QUERY_FLIGHTBASICINFO);

Dbcp.close(rs, stmt, conn);

}

return flightinfo;

}

增删改操作类似,此处不做赘述。

4.2.3 顾客查询模块

该模块功能和航班信息查询模块功能类似,只是操作的表和信息不同而已。下面展示部分源码:

//顾客查询分为两表显示(数据库中只有一表),一储存已定票的顾客,一储存正在候补队伍的顾客,其差别在于顾客状态

public void queryData(){

Vector userinfo1=flightdao.queryUserinfo();

Log.log(this, "----------------queryData"+userinfo1.size());

Vector columns1=new Vector();

columns1.add("乘客");

columns1.add("乘客证件");

columns1.add("乘客机舱等级");

columns1.add("乘客所在航班号");

columns1.add("乘客联系方式");

columns1.add("乘客所定票数");

columns1.add("乘客状态");

tModel.setDataVector(userinfo1, columns1);

table.revalidate();

Log.log( this, "queryData stuinfo.size:"+userinfo1.size()+"columns size"+columns1.size());

}

public void queryData1(){

Vector userinfo1=flightdao.queryUserinfo1();

Log.log(this, "----------------queryData"+userinfo1.size());

Vector columns1=new Vector();

columns1.add("乘客");

columns1.add("乘客证件");

columns1.add("乘客机舱等级");

columns1.add("乘客所在航班号");

columns1.add("乘客联系方式");

columns1.add("乘客所定票数");

columns1.add("乘客状态");

tModel1.setDataVector(userinfo1, columns1);

table1.revalidate();

Log.log( this, "queryData stuinfo.size:"+userinfo1.size()+"columns size"+columns1.size());

}

public String[] queryFlightdata3(int count ){

// String[] flightinfo = new String[10];

String[] f = null;

Connection conn = null;

PreparedStatement stmt = null;

ResultSet rs = null;

try {

conn = Dbcp.getConnection();

stmt = conn.prepareStatement(Constants.QUERY_CANCEL);

stmt.setInt(1, count);

rs = stmt.executeQuery();

while(rs.next()){

f = new String[10];

f[0]=rs.getString("name");

f[1]=rs.getString("id");

f[2]=rs.getString("ps");

f[3]=rs.getString("flightnumber");

f[4]=rs.getString("telphone");

f[5]=rs.getString("ticket");

f[6]=rs.getString("customtype");

System.out.println("~~~~~~~~~~~~~~~~~~~queryVipdata"+f[0]+f[1]);

// vipinfo.add(v);

}

} catch (SQLException e) {

// TODO Auto-generated catch block

Log.log(this,

"~~~~~~~~~~~~~~~~~~~queryVipdata"+e.getMessage()+f[0]+f[1]);

e.printStackTrace();

}finally{

Log.log(this, "queryVipdata"+Constants.QUERY_CANCEL);

Dbcp.close(rs, stmt, conn);

}

return f;

}

4.2.4 订票、退票功能

订票的功能

也是基本功能之一,实际上也是对数据库中数据的增加和删除(或减少),不过其中会增加很多判断的部分,比如在订票之前需要先查询库里是不是还有余票,如果订票的数目小于或等于余票数目,则订票可以成功,如果订票数大于余票数,则会有一部分加入到候补队列中。退票亦是如此,如果退票的时候,发现候补队列里有人,且其票数刚好小于或等于退票的数目,则可以直接将候补队列的顾客加入到订票队列中。

部分源码:

private void handin(){

int len1=o.getJbtname().getText().trim().length();

int len2=o.getJbtadultticketnumber().getText().trim().length();

int len3=o.getJbtid().getText().trim().length();

int len4=o.getJbttelephone().getText().trim().length();

String len5=o.getJbtps().getSelectedItem().toString();

if(getstring(len1,len2,len3,len4)){

JOptionPane.showMessageDialog(dialog, "带**请务必全部输入"); }

else{

flightVo vo = new flightVo();

vo.setName(o.getJbtname().getText().trim());

vo.setId(o.getJbtid().getText().trim());

vo.setPs(o.getJbtps().getSelectedItem().toString());

// vo.setFlightnumber(Integer.parseInt( o.getJbtflight().getText() ));

vo.setFlightnumber( o.getJbtflight().getText() );

vo.setPhonenumber(o.getJbttelephone().getText().trim());

vo.setTick(Integer.parseInt(o.getJbtadultticketnumber().getText()));

vo.setTicket(o.getJbtadultticketnumber().getText());

vo.setCustomtype("已定票");

System.out.println(vo);

String msg = "";

System.out.println("提交");

int flag,count,count1,count2;

count=flightdao.queryflightinfo3(o.getJbtflight().getText());

count1=Integer.parseInt(o.getJbtadultticketnumber().getText());

count=count-count1;

if(count>0){

if(flightdao.addFlightinfo(vo) > 0){

if(flightdao.addFlightinfo1(vo)>0){

msg = "订票成功!";}

else{

msg="定票失败";

}

}

else{

msg="定票失败";

}

}else{

// msg="余票不足";

count=flightdao.queryflightinfo3(o.getJbtflight().getText());

count1=Integer.parseInt(o.getJbtadultticketnumber().getText());

count2=count1-count;

if(JOptionPane.showConfirmDialog(dialog, "余票不足,您可以订"+count+"票,剩下的"+count2+"加入候补?","确定",JOptionPane.YES_NO_OPTION) == 1){

return;

}

vo.setName(o.getJbtname().getText().trim());

vo.setId(o.getJbtid().getText().trim());

vo.setPs(o.getJbtps().getSelectedItem().toString());

//

vo.setFlightnumber(Integer.parseInt( o.getJbtflight().getText() ));

vo.setFlightnumber( o.getJbtflight().getText() );

vo.setPhonenumber(o.getJbttelephone().getText().trim());

vo.setTick(count);

vo.setTicket(count+"");

vo.setCustomtype("已定票");

if(count>0){

flightdao.addFlightinfo(vo);

flightdao.addFlightinfo1(vo);

msg="";

}

vo.setName(o.getJbtname().getText().trim());

vo.setId(o.getJbtid().getText().trim());

vo.setFlightnumber( o.getJbtflight().getText() );

vo.setPhonenumber(o.getJbttelephone().getText().trim());

vo.setPs(o.getJbtps().getSelectedItem().toString());

vo.setTicket(count2+"");

vo.setCustomtype("已候补");

flightdao.addFlightinfo2(vo);

msg="操作成功";

}

JOptionPane.showMessageDialog(dialog, msg);

hangkong.getClientFrame().setVisible(false);

hangkong.getClientFrame().dispose();

hangkong.getFrame().setVisible(true);

// queryData(Integer.parseInt(curPage.getText()));

}

}

private void jbOK(){

if(JOptionPane.showConfirmDialog(dialog, "确定需要退票?","退票",JOptionPane.YES_NO_OPTION) == 1){

return;

}

vo=new flightVo();

String msg = "";

int ticket=Integer.parseInt(c.getJtfChildTuiPiaoShu().getText().trim());

String id1 = c.getJtfID().getText().trim();

System.out.println("------------------"+id1);

System.out.println("------------------"+ticket);

System.out.println("------------------"+flightdao.flightquery1("1234"));

if(Integer.parseInt(c.getJtfChildTuiPiaoShu().getText().trim())>0){

int haveticket=Integer.parseInt(flightdao.flightquery1(id1));

if(ticket==haveticket){

vo.setTick(ticket);

vo.setId(c.getJtfID().getText().trim());

vo.setFlightnumber(c.getJtfDingDan().getText().trim());

String Id =c.getJtfID().getText().trim();

if(flightdao.deleteFlightinfo(Id) > 0){

flightdao.deleteFlightinfo(vo);

msg = "退票成功";

JOptionPane.showMessageDialog( dialog, msg );

jbbupiao();

jbRewrite();

}else{

msg = "退票失败";

JOptionPane.showMessageDialog( dialog, msg );

}

}else if(ticket

vo.setId(c.getJtfID().getText().trim());

vo.setTicket(ticket+"");

vo.setTick(ticket);

vo.setFlightnumber(c.getJtfDingDan().getText().trim());

flightdao.deleteFlightinfo1(vo);

flightdao.deleteFlightinfo(vo);

msg="退票成功";

JOptionPane.showMessageDialog( dialog, msg );

jbbupiao();

jbRewrite();

}else{

JOptionPane.showMessageDialog( dialog, "退票数目不能大于已定票数目" );

}

}

else{

msg = "退票数目不能为0";

JOptionPane.showMessageDialog( dialog, msg );

}

}

部分界面:

4.2.5 财务查询

这属于附加功能,实际上也就是通过记录每次的订票和退票的记录,然后通过profit=income-outcome就可以得到每周每月的收入和支出以及收支比了。

第五章界面设计

程序的见面设计做到了简洁,合理,交互性强

主界面:

其他的分界面在各功能模块均有展示,此处不赘述

第六章结束语

这次的数据库实验历时数周,但收获也是颇大的。数据库实验我做的是飞机订票系统,之前的实验有做过一些比较小的系统,如学生管理系统,都是直接从程序中调用数据,用链表等将其存储,连接数据库的系统还是第一次,不过其基本功能相似,只是增加的在数据库中的存储部分,数据库从数据结构的角度来说,也可以近似看成一个顺序表。系统的基本功能就是对这些表的增删改查来实现的。

实验设计的工具比较多,包括对数据库进行操作的开发语言工具,数据库管理系统,还有一些辅助的工具,如powerdesigner等。也体会到了各种工具的方便性,但是无论什么工具都是为了实现功能服务的。

本系统实现的功能有,航班的基本信息查询,顾客的基本信息查询,订票功能,退票功能以及账务的查询功能,基本上实现了所需要的基础功能,只是还有很多不完善的地方,比如航班的基本信息查询中的添加功能,只能一条一条记录的添加,并不能批量的添加,这样可能在使用时会造成很多的时间的浪费,是需要改善的地方,我觉得可以从接受添加信息的数据类型和写入数据库的数据类型的方面来改进,由一条数据变成一组数据。这是其中一个方面,还有的方面就是细节的处理问题,不过这一点该系统还是处理的比较好,比如说订票的时候,会提前判断余票数,并将余票数和订票数进行数目的对比,小于或等于的时候才可以顺利的加入到订票行列,大于的时候,则会继续查询,大于的时候,有多少是可以加入订票行列,而又有多少只能加入到候补行列。退票的时候也是一样,也会有细节处理的部分,退票时如果候补行列中有人,会自动询问是否将该人加入到订票行列,这也是比较智能的地方。

这门课的课设虽然是数据库课程设计,但其实对于数据结构的考察也是有的,数据库在数据结构的围中可以看成是一种加强版的线性表的结构,也就是针对这表来进行增删改查,实际上还帮助我们简化了自己通过编程去管理表结构的步骤,所以说,这次的课程设计的覆盖面也是很广的,做一个课程设计能够学到多方知识。

总而言之,这次的课程通过这么多天一个一个的敲进去,提高了我的动手能力,也让我对开发系统有了初步的认识。以后还是要多写程序来提高自己的编程和设计能力。

相关文档