机票预定系统,一步一步教你利用AgileEAS

By admin in 4858.com on 2019年8月24日

 一、引言

追忆与认证

   
前面小编就用了大批量的字数笔者讲课了“商品入库”模块,在商品入库模块之中,大家介绍
了与之唇亡齿寒的田间处理音讯系列开垦中的三个共性场景,以及那么些利用场景中所涉及的缓存、业务管理、票据打印等有关的本领。

   
能够说,在WinForm篇中的示例代码之中,最有价值的模块正是“商品入库”,在真实的MIS应用场景中,有最少四分一的应用与“商品入库”类似。

机票预订系统 – Shuai-Xie –
Github

1.引言
  1.1编纂目标
  在成功了针对性《档案管理系统》软件市镇的开始时期考查,同偶尔常间与多位软件使用者举行了健全深透地研商和剖判的基础上,提议了那份软件必要原则表达书。
  此供给原则表达书对《档案管理系统》软件做了健全细致的顾客必要剖判,分明所要开采的软件应具有的效果、质量与分界面,使系统一分配析职员及软件开拓人士能明白地领会客商的急需,并在此基础上尤为提议概略设计表明书和造成后续规划与支出职业。本表达书的意料读者为顾客、业务或须要解析人士、测量试验人士、客户文书档案编写者、项目处理人士。
  1.2品类背景
  由于文件多,种类多,文件成立者多,创建时间为不定时,要珍重好有的小卖部重大的公文极为狼狈,相同的时候鉴于人士的流动,对原始的文件的再次出现,显得力不可能支,有的时候搜索与重新整理文件要浪费广大的人力、物力。並且近些日子,由于竞争的刚强程度持续的加重,档案的军事管制不当会严重到导致厂商的面临着亏空以至停业的范畴。于是大伙儿不断地在商量希望能找到化解的点子。
  为了缓和上述的主题材料,让企职业单位能够使得的左右,有效的分享文件能源,爱护好文件,及推动档案处理的消息化、标准化和集成化,本身多方听取意见、追加和百中国科学技术大学气实用成效,进而精通文件处理的流水生产线,同临时候组成各机构、各行业与公司文件管理的措施,开采出一套适合于档案多而复杂的田间管理连串。
  1.3概念、缩写词和符号
  需要:顾客解决难题或达到目的所需的标准或效果与利益;系统或种类部件要知足合同、标准,标准或其余正规鲜明文书档案所需具有的准则或权能。
  1.4参考资料
  鲁荣江、王立丰:《Visual Basic
项目案例导航》,科学出版社,二零零一年五月版
  陈明:《软件工程》,中心广播TV大学出版社,二零零三年十二月版
  段兴:《Visual Basic
6.0控件实用程序设计100例》,人民邮电出版社,二零零三年四月
  杜春雷、孙会莲:《怎样利用Visual basic
6.0汉语版》,机械出版社,两千年6月
  张曜、张青、李丁:《Visual Basic
函数实用手册》,治金工业出版社,二零零三年16月
  范国平、陈晓(Chen Xiao)鹏:《Access 3000数据库系统开采实例导航》,人民邮政和邮电通讯出版社,二零零四年11月版
  闪四清:《SQL Server 实用简明教程》,哈工业余大学学东军事和政院学出版社,2004年1月版
   
  2.职责概述
  2.1目标
  2.1.1开支目的
  在当今世界计算机推广的随时,大家早就习于旧贯用微型Computer办公,结果本来会时有暴发一大波的电子文件,这几个文件有金玉的野史价值,但大家只要将越来越多的年月花费在探寻那个文件上,即费时又伤脑筋。本软件遵照此需要实行付出的。
  2.1.2应用指标
  让企职业单位可以行得通的牵线,有效的分享文件资源,爱惜好文件,及推进档案管理的音讯化、规范化和集成化,完成Computer的智能化管理,以拉长工效和经济效果与利益。
  2.2运转条件
  2.2.1硬件条件
  A. 一台586 以上的微机及极其
  B.内存16MB(最好32MB内存)
  C.VGA 彩显一台
  2.2.2软件条件
  A.windows 98 以上的操作系统 
  B.Microsoft Visual Basic 6.0.普通话版数据库管理种类
  C.Office 3000APP
  2.3规范与限定
  本档案处理系统软件是采用于中型Mini公司的。在效能上还可进一步落到实处广安市预防护、与E-Mail和因特网电话集成起来,成为网络档案管理系统软件。
   
  3. 数额描述
  3.1静态数据
  上面列出了七个表的切切实实静态数据:
  1)档案目录表
  此表贮存档案类型音信
  
  字段
  字段名
  类型
  宽度
  1
  档案类型
  Text
  20
  2
  安全等级
  Text
  20
  2)档案宾馆表
  此表寄存档案的消息
  
  字段
  字段名
  类型
  宽度
  1
  档案名称
  Text
  50
  2
  档案内容
  Memo
  自动
  3
  档案注解
  Text
  50
  4
  档案创设者
  Text
  20
  5
  档案创造时间
  Data/time
  自动
  6
  最终修改者
  Text
  20
  7
  最后修改时间
  Data/time
  自动
  8
  档案类型
  Text
  20
  9
  附Gavin件
  Text
  50
  10
  安全等第
  Text
  20
  3) 登录表
  此表贮存操作职员和工人的音讯
  
  字段
  字段名
  类型
  宽度
  1
  用户名
  Text
  50
  2
  密码
  Text
  50
  3
  权限
  Text
  20
  4
  级别
  text
  50
  4) 操作职员和工人消息表
  此表寄存操作职员和工人详细新闻表
  
  字段
  字段名
  类型
  宽度
  1
  员工号
  Text
  50
  2
  姓名
  Text
  50
  3
  身份证号码
  Text
  50
  4
  职称
  Text
  50
  5
  工龄
  Text
  50
  6
  专门的学问部门
  Text
  50
  7
  工作电话
  Text
  50
  8
  移动电话
  Text
  50
  9
  传真号码
  Text
  50
  10
  E_Mail
  Text
  50
  11
  专业
  Text
  50
  12
  学历
  Text
  50
  13
  爱好
  Text
  50
  14
  家庭电话
  Text
  50
  15
  家庭地址
  Text
  50
  16
  省份
  Text
  50
  17
  城市
  Text
  50
  18
  出破壳日期
机票预定系统,一步一步教你利用AgileEAS。  Data/time
  自动
  19
  签订时间
  Data/time
  自动
  20
  截止时间
  Data/time
  自动
  21
  权限
  Text
  50
  22
  级别
  Text
  50
  23
  照片
  Text
  50
  24
  性别
  Text
  50
  25
  婚姻情状
  Text
  50
  5) 公司新闻表
  主要存放集团的消息
  
  字段
  字段名
  类型
  宽度
  1
  公司名称
  Text
  50
  2
  集团电话
  Text
  50
  3
  公司传真
  Text
  50
  4
  负责人
  Text
  50
  5
  公司地址
  text
  50
  6)帮助表
  此表寄放帮忙音信
  
  字段
  字段名
  类型
  宽度
  1
  名称
  Memo
  自动
  2
  内容
  memo
  自动
  3.2动态数据
  输入数据:菜单选项,查找关键字,新建记录项。
  输出数据:由询问关键字显著的数据库记录集结。
  内部生成的数额:中间查询结果。
  3.3数据库描述
  本软件应用ACCESS数据库。
  3.4数目流图
  《档案管理系统》软件的数据流图是比较清楚的,对各功能模块来讲都相比有规律。但完全的图相比较繁琐,各类成效模块的数目流图如下。
   
  1.登入多少流图
  
  顾客名及密码
  
  身份验证
  
  登入退步
  
  登入成功
  
  错
  
  对
  
  登录表
      
  选拔操作
  
  添加
  
  修改
  2.档案处理
   
  
  删除
    
  3.档案查询
  
  接纳查询项目
  
  查询条件
  
  查询
  
  显示
   
  3.系统铺排
  
  张开数据库库
  
  选用图片
  
  选拔操作
  
  集团音信配置
  
  系统桌面配置
  
  数据库路线
  
  公司消息载入
  
  修改
  
  确认
   
  4.系统爱护
  
  登入表音讯载入
  
  操作职员和工人管理
  
  数据复苏
  
  选拔路线
  
  系统数据管理
  
  添加
  
  选取操作
  
  数据备份
  
  选拔路线
  
  修改
  
  删除
  
   备份
  
  恢复
  
  打开
   
  5.打字与印刷表格
  
  接纳操作
   
  
  打字与印刷单条记录
  
  打字与印刷全部记录
  
  打字与印刷操作职员和工人新闻
  
  打印
   
  3.5多少字典
  这里给出二个数目成分的字典卡牌与现实多少卡牌的含义:
  名称:档案类型音讯
  描述:发生文档类型送交档案目录表
  定义:档案类型新闻=档案类型+安全品级
   
  4. 意义供给
  4.1效率划分
  本系统有以下作用模块:
  1)档案处理模块 
  2)查询管理模块 
  3)系统安顿模块 
  4)系统一保险证模块
  5)打字与印刷表格模块 
  6)协理模块
  4.2效果描述
  上面详细描述一下依次功能模块:
  1)档案管理
  (1)
档案目录管理:只限于一般顾客和协会者操作。並且不相同的客户级别所操作的档案类型是有限制的。客户能够向在这之中加多、修改和删除档案类型。也可设置档案类型的等第,以拉长它们的保密性。
  (2)
档案旅舍:限于全部操作职员和工人。一般浏览者只可以查看档案,无法对档案做另外的退换。而且分化的客户品级所看到的档案是有限制的。一般客商可向里面加多、修改和删除档案。也可安装档案等第,以增加它们的保密性。
  2)查询处理
  (1)
查询单条档案记录:首若是切合于整个操作职员和工人的。在窗体上,先能够挑选查询的标准,再输加入关贸总协定组织键字名。按查询就能够。要是你素不相识该档案也足以在窗体上摘取模糊寻找。查到记录后,也可双击记录就能够显示详细音信。
  (2)
查询任何档案:是给管理员用的,是为着便利管理员查找档案,也会有关键字寻觅和模糊搜索。查到记录后,也可双击记录就可以展现详细新闻。
  (3)
查询操作职员和工人:是给管理员用的,因为操作职员和工人的音信是保密的,所以只限助理馆员使用。
  也可能有多样查询办法。查到记录后,也可双击记录就可以展现详细信息。
  3)系统布局
  (1)
配置集团音信:只限管理员配置,首假若安插集团的为主音讯。一般客商和浏览者均可查看。
  (2)
配置系列桌面:客商能够计划自个儿心爱的桌面图形。只要在窗体上单击接纳图片,再选取所爱怜的图形就能够。
  (3) 数据库保存路线:只限管理员使用。用于展开数据库。
  4)系统保养
  (1)
数据备份:客户能够经过选取保存的路子把数据库保存在硬盘中,也可保存在软盘中。
  (2) 数据恢复:客商能够透过选拔路线把数据苏醒。
  (3)
操作职员和工人管理:只限管理员。在那之中能够增多、修改、删除操作职员和工人,设置他们的权力、等第及密码。
  (4) 系统一整合治音讯:显示距离管理员整理系统的日子。
  5)打字与印刷表格
  (1)
打字与印刷单条档案记录:首要适用于一般浏览者和一般顾客。他们不得不打字与印刷在他们的权力和等级限制内所能查看的档案。
  (2)
打字与印刷全体档案:是为大班设置的,管理员能够遵照须要安装打字与印刷。也能够让档案以报表的形式转换文书文件或HTML文件输出。
  打印操作人士的消息只限管理员使用。
  6)帮助
  (1) 帮忙音信:展现系统的事无巨细协助音信。
  (2) 关于系统:重若是展现系统的一对新闻。
   
  5.品质供给
  5.1多少正确度
  A.要遵纪守法严厉的数量格式输入,否则系统不予以响应进行拍卖。
  B.查询时要确定保证查全率,全体相应域包括查询关键字的笔录都应能查到。因为普通有文件的记录会非常多,所以本系统选取了二种办法开展询问:直接询问和模糊查询。
  5.2光阴个性
  一般操作的响应时间应在1~2秒内,对软磁盘和打字与印刷机的操作也应在可承受的时辰内到位。
  5.3适应性
  满足企职业单位选择的急需(记录量调控在1000项内)。
  对眼下提到的运作情状要求不应存在困难。
  6. 运行供给
  6.1客户界面
  超越VB的分界面,全新感到,操作便捷,一望而知,视图特出等特色。並且使用菜单分界面驱动格局,给操功客商带来了强大的有益,对客商本身。对鼠标和键盘单独协助。
  6.2硬件接口
  本软件无需一定的硬件或硬件接口举办帮助。
  486之上PC机均可运营此软件。
  6.3软件接口
  运营于Windows95及越来越高版本具备WIN32 API的操作系统之上。
  6.4故障管理
  符合规律使用时不应出错,若运维时相遇不可恢复生机的系统错误,也必须确认保证数据库安然无事。
  调节和测验中相见的难点及消除的方案:
  1)遭逢跳出“数据库已经关门“提醒音讯阻止程序运维时
  能够查阅一下进展此项操作时,操作的表是或不是曾经被关闭了也许是在并未有关闭此表的境况
  下又壹遍利用打开语句展开此表。
  2)关于空记录带来的难为
  有些空记录往往会使程序不可能运维。此时你可用“if not
isnull”语句先剖断一下是还是不是为
  空记录,再操作。
  3)有个别运维错误也可用如下语句排除
  On Error GoTo Erropoint
   Erropoint :
   Msgbox Err.Descripton
   Exit sub
  或用On Error resume Next等语句进行处理。
   
  7.别的供给
  1)系统的功效落成境况: 客商可在本系统下促成各样客户须要的效能
  2)系统的安全性: 对于系统的主要性数据都有密码珍视,具备自然的安全性
  3)系统的容错性: 客户输错数据都有提醒音信,具备较好的容错质量。
  4)系统的密闭性: 用户的密闭性较好,客户许多在提醒消息下输多少。

   随着电脑局域网和广域网的出现,网络产品(包蕴软、硬件)品质持续压实;品种、数量迅猛增进和发展;以及数据库才具的成熟和软件工程措施的向上,各类Computer网络管理种类越来越健全。旅游景点微型Computer定票系统是Computer技艺与互连网手艺相结合的产物。方便飞快的查询总括使领导能准确地垄断(monopoly)景点的经纪情形并对订票职员展开监察、处理,并为其提供标准、可靠的决策依据。其成功完成增加了旅游景点的买票功用和管理水平,使直接由人工买票的层面划上句号,进而走入智能化领票的新阶段。

正文的开始和结果

   
大家因而“商品入库模块”完毕了物品的库操作,系统会写入数据库商品入库明细和商品仓库储存音信,那么那几个新闻怎么样查呢,大家得提供“仓库储存音信查询”和“入库记录查询”四个模块。

    
本文将详细的介绍“库存消息查询”模块已毕进度,“库存音信查询”要兑现的遵守为:依据顾客的输入码(拼音简码)和询问采取(是不是出示零仓库储存记录)查询商品仓库储存消息(仓库储存表)并突显在分界面上,操作员也得以接纳把询问结果打字与印刷出来。

一、机票预约系统

   本文介绍以Delphi为支付语言,Microsoft SQL Server
6.5为后台,运转于Windows NT
4.0的旅游景点微机订票系统的开辟方法。该系统符合各大、中、小旅游景点买票系统的自动化管理,具备较强的实际推广应用价值。

制做分界面

     
首先,我们要求在UI项目中扩展八个WinForm窗体StoreQueryForm拖动控件达到如下效果:

4858.com 1

1.1 标题供给

务求有所如下基本成效

  1. 班机基本消息的管住;
  2. 航班消息的治本;
  3. 行人预定机票、撤废预约、付款定票、退票的管理;
  4. 查询航班音讯、航班预约情形、游客新闻,计算航班满座率。
  5. 总括每一周、每月,每年总收入景况。

  二、系统总体方案设计

 拍卖查询

     
接下去大家编辑查询有关的代码,先在数据层接口项目中的IProductStoreList的总部类定义IProductStoreList.cs文件中追加如下代码:

 1:  /// <summary>

 2:  /// 表接口 IProductStoreList(产品库存)。

 3:  /// </summary>

 4:  public partial interface IProductStoreList

 5:  {

 6:      /// <summary>

 7:      /// 查询商品库存。

 8:      /// </summary>

 9:      /// <param name="pyCode">拼音码。</param>

10:      /// <param name="showZero">是否显示零库存记录。</param>

11:      void GetProductStoreList(string pyCode,bool showZero);

12:  }

         一样,大家需求在数据层完结项目中落到实处那么些方法:  

 1:  public void GetProductStoreList(string pyCode, bool showZero)

 2:  {

 3:      Condition condition = this.CreateCondition();

 4:   

 5:      if (pyCode.Length > 0)

 6:      {

 7:          condition.AddElement("SqlText", "CODE in (select CODE from dbo.PRODUCT where PYCODE like '" + pyCode + "%')", ElementType.SqlCondition);

 8:      }

 9:   

10:      if (!showZero)

11:          condition.AddElement("NUMBER", 0, ElementType.GreaterThan);

12:   

13:      condition.AddOrderElement("CODE");

14:      condition.AddOrderElement("IDN", true);

15:      this.Query(condition);

16:  }

         
大家在那地方稳重看一下,因为在商品仓库储存表中绝非定义产品的拼音简码,所以本身就应用了八个字查询,并以SQL条件的样式写了出来,在完成选择中,应该在成品仓库储存表中扩大拼音简码字典,以福利查询。

        接下去大家写编写UI中的“查询”开关的事件管理代码如下:

 1:  private void btnSearch_Click(object sender, EventArgs e)

 2:          {

 3:              IProductStoreList table = DALHelper.DALManager.CreateProductStoreList();

 4:              table.GetProductStoreList(this.tbSearch.Text, this.cnZero.Checked);

 5:   

 6:              decimal sumMoney = decimal.Zero;

 7:   

 8:              try

 9:              {

10:                  this.Cursor = Cursors.WaitCursor;

11:                  this.lvInfo.Tag = table;

12:   

13:                  this.lvInfo.BeginUpdate();

14:                  this.lvInfo.Items.Clear();

15:   

16:                  foreach (IProductStore ps in table.Rows)

17:                  {

18:                      decimal money = ps.Price * ps.Number;

19:                      sumMoney += money;

20:                      ListViewItem item = new ListViewItem(new string[] { string.Empty, ps.Code, ps.Name, ps.Spec, ps.Unit, ps.Price.ToString("F2"), ps.Number.ToString(), money.ToString("F2") }, 0);

21:                      this.lvInfo.Items.Add(item);

22:                  }

23:   

24:              }

25:              finally

26:              {

27:                  this.lvInfo.EndUpdate();

28:                  this.Cursor = Cursors.Default;

29:              }

30:   

31:              this.lblTip.Text = "汇总:共有记录" + table.Rows.Count + "条,总金额" + sumMoney .ToString("F2")+ "元";

32:          }        

      
到这一步,我们就成功了数码查询而且出示在分界面上的供给,下一步成功张开导出。

1.2 开垦条件

  • 语言:Python 3.5
  • 框架:Django 1.10.6
  • 前边三个设计:HTML, CSS, JavaScript
  • 开拓条件:PyCharm

  
微型Computer买票系统利用星形拓扑局域网结构,由服务器、集线器、Computer、打字与印刷机组成,见图1。服务器上运营数据库及系统管理程序,完成查询、总括、报表打字与印刷、系统一保险证等作用。各购票微型Computer与相应的打印机放置在购票窗口,运营定票程序,实现分界面输入、门票打印及定票员个人新闻查询计算等作用。

拍卖打字与印刷

     
首先,大家必要创建报表,这一步在日前的稿子中一度有过详尽的牵线了,在那本身就不介绍了,选取对象报表,数据对象为Product.DAL.SQLServer.ProductStoreList,大家做出如下样式的表格:

4858.com 2

       
把创设好的表格保存在编写翻译指标目录中的Reports文件夹中并取名叫商品库存查询报.rdl。

      
接下来大家修改程序,把表格挂载进来,编写“打字与印刷预览”开关的事件管理代码:

 1:  private void btnPrint_Click(object sender, EventArgs e)

 2:  {

 3:      if (this.lvInfo.Items.Count == 0)

 4:      {

 5:          MessageBox.Show("没有需要打印的数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

 6:          return;

 7:      }

 8:   

 9:      if (this.printForm == null)

10:          this.printForm = new RDLViewDialog();

11:   

12:      //

13:      System.IO.TextReader textReader = null;

14:      try

15:      {

16:          string fileName = Path.Combine(Application.StartupPath, "Reports\\商品库存查询报表.rdl");

17:          textReader = new System.IO.StreamReader(fileName);

18:          this.printForm.SourceRdl = textReader.ReadToEnd();

19:      }

20:      finally

21:      {

22:          if (textReader != null)

23:              textReader.Close();

24:      }

25:   

26:      this.printForm.DataObject = this.lvInfo.Tag;

27:      this.printForm.PrintPreview();

28:  }

二、要求剖判

  
对于订票系统来讲,打字与印刷机的进程和多少经过网络的传输速度是拾分主要的目的。如黄冈野生动物园在其高峰期,每一日有大约2万人入园游览,须要利用三台微型Computer进行售票,而入园客人民代表大会都聚焦在同等段时光,如凌晨刚开园到中午10点左右,晚上2点~3点时期等,所以降低游客排队等待时间、加速订票速度就是计算机定票系统必需消除的难题。影响订票速度有双方面因素,一是硬件打字与印刷机的打字与印刷速度,二是打字与印刷程序运转打字与印刷和传输数据的进程。经实际测验,EPSON
stylus color
850彩色喷墨打字与印刷机,其打字与印刷速度为Spirior纸8页/分钟,能够满意供给。

 修改程序,调整打字与印刷

       编写翻译并运营程序,大家看一下周转效果:

4858.com 3

        打印预览:

 

4858.com 4

 

      
至此,“商品库存查询”模块的相关管理就此停止,接下去本身将介绍“入库消息查询”,这么些模块笔者将介绍大家一贯运用报表做为UI显示主体,希望我们感兴趣,对AgileEAS.NET平台感兴趣的爱侣啊,能够下载了完整代码之后自个儿看看,有标题请立刻的和自己关系。  

     
有关本例所涉及的数据表结构请参见依照AgileEAS.NET平台基础类库举行利用开采-总体表明及数量定义一文,有关数据对象模型定义文件、文书档案、DDL脚本请下载:,本例完整代码下载:Product.Demo.rar。

2.1 具体须求

为便利旅客骑行,某航空集团(CSU
Airlines)拟开垦八个机票预订系统。游客可透过网络定票平台查询公司航班情形,通过输入起飞地、指标地、起飞时间等音信体系为客人配备航班,游客可依据小编必要,遵照起飞时间和机票价格来抉择航班。买票成功以往,系统为客人生成订单音信,游客能够再个人音讯页面查看本身的购票消息,而且能够向系统建议退票要求,系统针对具体意况总结手续费后开展相应退票管理。

  
在程序方面为了满意打字与印刷速度的渴求,经过测量检验和全面接纳,鲜明用Delphi做为程序设计语言。Delphi把有力的指标Pascal语言和便捷方便的RAD相结合,是三个通用的图形客户分界面(GUI)开拓工具,它是依照可视化和零部件的定义而规划出来的,并且能极其有利地操纵数据库及落到实处种种报表,使得编制程序急迅,且是近日调节和测量检验编写翻译速度最快的编制程序语言之一。在门票打字与印刷时一直调用Delphi的类Printers中的种种进度和函数,如Printers.Canvas.Textout(x:integer;y:integer;const
Text:string)再组成别的的历程和函数就能够完结高效打字与印刷,消除了前后相继打字与印刷速度的难题。

链接

一步一步教你使用AgileEAS.NET基础类库实行利用开采-连串目录

DotNET集团架构应用实行-系列目录

AgileEAS.NET平台支付指南-种类目录

AgileEAS.NET应用开采平台介绍-著作索引

AgileEAS.NET平台利用开荒教程-案例布置

AgileEAS.NET官网

高速软件工程实验室

QQ群:116773358

2.2 成效深入分析

(1)顾客分界面

  • 询问:客户对航班音信举行询问操作;
  • 排序:顾客依据自个儿的供给对查询结果开展排序筛选;
  • 领票:对客户购票须要进去管理并记录游客预订新闻和换代数据库新闻;
  • 退票:对顾客退票供给进行拍卖并更新数据库;
  • 查看个人音信:客户查看自身的私家票务消息
  • 帮助:提供系统利用援助文档;
  • 退出:关闭当前页面。

(2)管理员分界面

  • 航班音讯管理:可对航班信息举办增加和删除改查操作;
  • 客人音信保管:可对游客新闻实行增加和删除改查操作;
  • 财务消息保管:能够总结航空集团每一周、每月,每年总收入情况。
  • 帮助:提供系统应用援救文档;
  • 脱离:关闭当前页面。

   系统挑选SQL Sever做为数据库,SQL
Sever是一个客商机/服务器关系型数据管理连串(WranglerDBMS),使用Transact-SQl在顾客机和SQL
Sever之间发送央求,能够满意系统的网络传输要求。Delphi中得以通过BDE(数据库引擎)和ODBC实行数据库访谈,大概经过ADO直接开展数据库访谈。

2.3 系统主功效图

机票预约系统主功用图

  
别的在总的程序设计时,记挂到利用本系统的操作员素质长短不一,Computer操作水平绝对十分低,所涉嫌的操作要尽恐怕轻松,尽量少输入音信,尽量利用下拉框和甄选框,幸免失误。本系统操作员要输入的只有游客人数(成年人和娃娃或学生)和车辆数。别的音信如票价,程序运行时从数据库中机动调出,时间取自系统时间,总价由Computer自动生成,分界面轻易、操作轻巧、易学易用。
  三、系统软件总体规划设计

2.4 系统数据流图

机票预约系统数据流图

   1.数码库表设计

三、逻辑设计

  
系统数据库中国共产党有零领票消息表、密码表、操作员音信表、票价音信表,以及为总结查询建造的视图等。以零订票音信表为例介绍表的结构。其字段定义如表1所示。

3.1 ER图

航班和客世间EEvoque图

  
连串号:由买票员的标志符号,随机号和管理器订票开首的票数记录组成。如GK006662,代表标志号为G的领票员,随机号为K,第6662张票。

3.2 数据库表

(1)航班音信表

(2)旅客消息表

客人音信表承袭了 Django 模板中暗许的 User
类,所以有部分接续来的别的字段,我们的 Passenger 对象只要求id,username,password 就能够。

(3)实体间多对多关系

经过在两表之间组建一张新表的章程,将 booksystem_flight 表和 auth_user
表的主键联系在一道,完毕了多对多涉及。

   退票否:此字段用来标志票是不是可行,若有效,则为1,无效为0。

四、功用设计

本系统使用的 Python + Django + Sqlite 的宏图格局,后台作用写在
views.py 文件中。

   2.软件结构划虚拟计

4.1 客商模块

  
系统软件设计遵从模块化程序设计的牵记,自顶向下,步步求精。系统前后相继由系统管理模块和订票模块组合。买票模块运维在定票微型Computer上,系统管理模块运营在服务器上。

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 = Flight.objects.get(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数据库改变

        # 验证一下,同样的机票只能订一次
        if request.method == 'POST':
            if flight.capacity > 0:
                flight.book_sum += 1
                flight.capacity -= 1
                flight.income += flight.price
                flight.user.add(request.user)
                flight.save()  # 一定要记着save
        # 传递更改之后的票务信息
        context = {
            'flight': flight,
            'username': request.user.username
        }
        return render(request, 'booksystem/book_flight.html', context)

  四、系统关键功能特色及完成格局

4.1.2 查询模块

后边叁个表单接收客商传入的出发地、指标地和出发时间,然后在航班数据库中查找满意条件的航班,分两步:

  1. 寻觅出发地和指标地同样的航班;
  2. 找寻航班出发日期与客人出发日期一致的航班。

为了给客户能够的体会,满意条件的航班新闻依据分化的 key
值(起飞时间、降落时间、机票价格)进行升序排列。

# 搜索结果页面
def result(request):
    if request.method == 'POST':
        form = PassengerInfoForm(request.POST)  # 绑定数据至表单
        if form.is_valid():
            passenger_lcity = form.cleaned_data.get('leave_city')
            passenger_acity = form.cleaned_data.get('arrive_city')
            passenger_ldate = form.cleaned_data.get('leave_date')
            # print(type(passenger_ldate))

            # 全设为naive比较
            # china_tz = pytz.timezone('Asia/Shanghai')
            # passenger_ltime = datetime.datetime(
            #     year=passenger_ldate.year,
            #     month=passenger_ldate.month,
            #     day=passenger_ldate.day,
            #     hour=0, minute=0, second=0,
            #     tzinfo=china_tz
            # )

            # 全设为aware比较
            passenger_ltime = datetime.datetime.combine(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.leave_time.replace(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 = Flight.objects.get(pk=flight_id)
    flight.book_sum -= 1
    flight.capacity += 1
    flight.income -= flight.price
    flight.user.remove(request.user)
    flight.save()
    return HttpResponseRedirect('/booksystem/user_info')

   1.登陆及密码输入模块

4.1.4 个人消息模块

是因为助理馆员和顾客共用叁个签到窗口,所以在展现顾客音讯时,供给对登录的客户地点进行判别,假设登陆的客户是管理员,则加载管理页面,假若是普通客户,则加载顾客个人的订单页面。

# 显示用户订单信息
# 航班信息,退票管理
def user_info(request):
    if request.user.is_authenticated():
        # 如果用户是管理员,render公司航班收入统计信息页面 admin_finance
        if request.user.id == ADMIN_ID:
            context = admin_finance(request)  # 获取要传入前端的数据
            return render(request, 'booksystem/admin_finance.html', context)
        # 如果用户是普通用户,render用户的机票信息 user_info
        else:
            booked_flights = Flight.objects.filter(user=request.user)  # 从 booksystem_flight_user 表过滤出该用户订的航班
            context = {
                'booked_flights': booked_flights,
                'username': request.user.username,  # 导航栏信息更新
            }
            return render(request, 'booksystem/user_info.html', context)
    return render(request, 'booksystem/login.html')  # 用户如果没登录,render登录页面

  
登入及密码输入模块用于限制操作员的权柄,程序完结的职能:从分界面上抽取密码,查询数据库密码表,有一致密码操作员有权走入下一分界面,叁次输入战败,程序自动退出。其余在领票模块中,依据密码要抽出对应的操作员的名字,以便将订票新闻与操作员相关联。从数据库中依照输入密码取相应的操作员函数如下,当中handletbl为密码表名称,id、handlename、handlecode为表中字段,代表编号、操作员姓名、操作员密码。

4.2 管理员模块

function TFormPswd.gethandlename(code:String):String;   var name:String;   begin   name:=;   Query2.Close;   Query2.SQL.Clear;   Query2.DisableControls;   Query2.SQL.Add(Select id,handlename,handlecode from handletbl);   Query2.Open;   if Query2.locate(handlecode,code,[]) then   begin   name:=query2.FieldByName(handlename).AsString;   end;   Query2.close;   Result:=name;   end;
   2.系统主分界面输入模块

4.2.1 航班音信管理

航班对象承接了 models.Model,航班消息管理在 Django
暗中认可的后台管理分界面中完结。

from django.contrib.auth.models import Permission, User
from django.db import models

# Create your models here.
# 添加primary_key会覆盖掉默认的主键
class Flight(models.Model):
    user = models.ManyToManyField(User, default=1)  # 有了这个字段之后,默认的后台添加失效,必须要自定义Form,除去这个字段
    name = models.CharField(max_length=100)  # 班次  南方航空CZ3969
    leave_city = models.CharField(max_length=100, null=True)  # 离开城市
    arrive_city = models.CharField(max_length=100, null=True)  # 到达城市
    leave_airport = models.CharField(max_length=100, null=True)  # 离开的机场
    arrive_airport = models.CharField(max_length=100, null=True)  # 到达的机场
    leave_time = models.DateTimeField(null=True)  # DateTimeField包括了DateField信息,并且添加了时间
    arrive_time = models.DateTimeField(null=True)
    capacity = models.IntegerField(default=0, null=True)  # 座位总数
    price = models.FloatField(default=0, null=True)  # 价格
    book_sum = models.IntegerField(default=0, null=True)  # 订票总人数
    income = models.FloatField(default=0, null=True)  # 收入

    def __str__(self):
        return self.name

在运用 Django 暗中同意的后台管理时,由于 Flight 中多了字段 user,而 user
对象是不可能从后台输入的,所以在 Django 默许的表单管理中出来 user,因为
Flight 与 User 之间关系是多对多,所以 Django 创立的 book_system
表中是从未 user 字段的,通过下边包车型客车主意解决。

# 自定义Flight对象的输入信息
class FlightForm(forms.ModelForm):
    class Meta:
        model = Flight
        exclude = ['user']  # user信息不能从后台输入

  
系统的主分界面输入模块用于输入和出示订票消息,依据其音信和票价自动总括出行客的总人数以及票价。在此模块中必要操作员只输入游客人数,按“鲜明”,就可以自行测算和显示总价,按“打字与印刷”则打字与印刷门票。为了防止操作员误输入除整型数据以外的任何字符如A、B等而招致程序出错,程序中在须要多少输入的特德it地方,设置推断规范,只同意整型数据输入。

4.2.2 游客音讯保管

行人继续了 django.contrib.auth.User
类,大家只须要自定义客商表单必要输入的指标,别的暗中同意生成的字段不用考虑。

# 用户需要输入的字段
class UserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ['username', 'email', 'password']

   3.总结与查询、报表打字与印刷模块

4.2.3 航空公司财务计算

总括航空公司周周、每月、每年的收入,並且展现全体的订单音讯。

# 管理员后台财务管理
# 统计航空公司每周、每月,每年营业收入情况。
def admin_finance(request):
    all_flights = Flight.objects.all()
    all_flights = sorted(all_flights, key=attrgetter('leave_time'))  # 将所有航班按照起飞时间排序

    # 将航班每天的输入打上不同的时间标签 [周,月,日]
    week_day_incomes = []
    month_day_incomes = []
    year_day_incomes = []

    # 用set存储所有的 周,月,年
    week_set = set()
    month_set = set()
    year_set = set()
    for flight in all_flights:
        if flight.income > 0:  # 只统计有收入的航班
            # 打上周标签
            this_week = flight.leave_time.strftime('%W')  # datetime获取周
            week_day_incomes.append((this_week, flight.income))  # 添加元组(week, income)
            week_set.add(this_week)
            # 打上月标签
            this_month = flight.leave_time.strftime('%m')  # datetime获取月
            month_day_incomes.append((this_month, flight.income))  # 添加元组(month, income)
            month_set.add(this_month)
            # 打上年标签
            this_year = flight.leave_time.strftime('%Y')  # datetime获取年
            year_day_incomes.append((this_year, flight.income))  # 添加元组(year, income)
            year_set.add(this_year)

    # 存储每周收入
    # 将每周的收入用 IncomeMetric 类型存储在 week_incomes List中
    week_incomes = []
    for week in week_set:
        income = sum(x[1] for x in week_day_incomes if x[0] == week)  # 同周次的income求和
        flight_sum = sum(1 for x in week_day_incomes if x[0] == week)  # 同周次的航班总数目
        week_income = IncomeMetric(week, flight_sum, income)  # 将数据存储到IncomeMetric类中,方便jinja语法
        week_incomes.append(week_income)
    week_incomes = sorted(week_incomes, key=attrgetter('metric'))  # 将List类型的 week_incomes 按周次升序排列

    # 存储每月收入
    # 将每月的收入用 IncomeMetric 类型存储在 month_incomes List中
    month_incomes = []
    for month in month_set:
        income = sum(x[1] for x in month_day_incomes if x[0] == month)
        flight_sum = sum(1 for x in month_day_incomes if x[0] == month)
        month_income = IncomeMetric(month, flight_sum, income)
        month_incomes.append(month_income)
    month_incomes = sorted(month_incomes, key=attrgetter('metric'))  # 将List类型的 month_incomes 按月份升序排列

    # 存储每年收入
    # 将每年的收入用 IncomeMetric 类型存储在 year_incomes List中
    year_incomes = []
    for year in year_set:
        income = sum(x[1] for x in year_day_incomes if x[0] == year)
        flight_sum = sum(1 for x in year_day_incomes if x[0] == year)
        year_income = IncomeMetric(year, flight_sum, income)
        year_incomes.append(year_income)
    year_incomes = sorted(year_incomes, key=attrgetter('metric'))  # 将List类型的 year_incomes 按年份升序排列

    # 存储order信息
    passengers = User.objects.exclude(pk=1)  # 去掉管理员
    order_set = set()
    for p in passengers:
        flights = Flight.objects.filter(user=p)
        for f in flights:
            route = f.leave_city + ' → ' + f.arrive_city
            order = Order(p.username, f.name, route, f.leave_time, f.price)
            order_set.add(order)

    # 信息传给前端
    context = {
        'week_incomes': week_incomes,
        'month_incomes': month_incomes,
        'year_incomes': year_incomes,
        'order_set': order_set
    }
    return context

  
总括与查询、报表打字与印刷模块用于落到实处领票新闻的总括与查询,能够设定起止日期等新闻,并可生成报表打字与印刷。总计与查询用内嵌的SQL查询语言完结,报表使用Delphi的急迅报表组件Qreport部件组中的各类控件。

五、分界面设计

   4.门票打字与印刷模块

4858.com,5.1 招待分界面

招待分界面

拟订一趟行程(塞内加尔达喀尔→新加坡 2017/4/2)

输入行程

  
门票打字与印刷模块达成门票的打字与印刷输出作用。在门票打字与印刷中需根据门票的体制鲜明输出的地点,为了促成飞快打字与印刷,在打字与印刷时间接调用printers的进度和函数。

5.2 查询分界面

客商 Let’s Go 之后,加载查询结果页面。

查询成功分界面

暗中同意的机票新闻遵照标价升序排列,客商通过点击机票新闻上方的字段能够挑选服从起飞时间大概达到时刻升序排列,如下图,注意后两行的改造。

询问结果依照起飞时间升序排列

假定客户要求的航班数据库中荒诞不经,就上报错误音信。
将顾客的指标地修改成人中学华(数据库中尚无那趟航班)进行测量试验。

询问失利界面

   打字与印刷的长河如下:

5.3 购票分界面

点击购票按键举办领票

鉴于顾客还并未登入,会直接报告到登入分界面。

登陆页面

出于客户未有注册,顾客在该页面点击 Click here
步入注册账号页面,完毕账号注册。

挂号页面

顾客注册完账号直接加载到查询页面。

签到成功未来

客商再一次点击买票,假诺客商并未有订过该趟航班,加载买票确认页面,若是客商已经订过了,加载售票抵触页面。

健康领票页面

在正规买票页面点击确认,实现买票。

平常定票页面完结订票

在私有基本客户能够查看自身的购票消息。

客户个人民代表大会旨

假设客户挑选了和谐早已订过的机票,加载购票争持页面。

定票争持页面

procedure printmsg(thesyqo,Totalpeople,adultNum, childNum,Totalcar,bigcar,middlecar,minicar,totalmoney, prtdate:String);   begin   Printer.Canvas.Font.Charset := GB2312_CHARSET;   Printer.BeginDoc;   Printer.PageHeight;   Printer.PageWidth;   Printer.Canvas.Font.Size :=14;//字体设置   ……//根据用户需要插入要打印的内容   Printer.Canvas.TextOut(x+2370,y,thesyqo);//打印内容   Printer.EndDoc;   end;
   5.退票管理模块

5.4 退票分界面

在顾客的私有基本,能够拓宽退票。

退票页面

分选确认,实现退票,客户定票消息刷新。

退票后的客商个人主旨

  
实际的定票进度中提到到由于各样缘由旅客退票的景况,而Computer打字与印刷售出的进场券及有关音信已经存入数据库中,当有退票情状爆发时,必然存在操作员定票金额与数据库查询结果不均等的情景,为了消除这一情景,扩大了退票管理模块。

5.5 管理员分界面

组织者 admin 登陆账号

在头里的 login_user
函数中一度有过推断,假使登入客商是管理员,加载航空公司的财务页面。

login_user 函数登陆顾客地方决断

组织者登入成功。

领队页面 – 集团财务消息

5.6 后台处理分界面

链接尾巴部分输入 admin 步入后台管理

踏向后台

管理员登入账号

领队登陆

后台数据,蕴含 Flight,User 和 Django 暗中同意生成的数据。

后台分界面

航班音信管理,显示全部航班消息,能够增删改查。

航班新闻处理

游子新闻保管,操作同航班音讯管理,注册的客户的新闻都会保留在此处。

游子音讯保管

六、结束语

其实从大三上的寒假开头,我就在为这一次的数据库课设做筹算,从学长们这里打听到了数据库课设最佳的落到实处情势是写网站,于是寒假回来笔者就学习了基础的
html, css, js,对网站前端有了骨干认知,又结合本人眼下常用的 Python
语言,学习了 Django
网页开荒框架,对网址后端管理有了深层认知。固然对网址前后端的交互还大概有一些模糊,不过经过本次数据库课设之后,作者相当多的疑云获得精通答,对
Python + Django + Sqlite 开拓非常一箭穿心了。

此番数据库作者用的是 Django 暗中同意的数据库
Sqlite,这是叁个轻量级的数据库,除了自带的一部分发令与别的数据库有异样,超越30%SQL 语句与主流数据库都一律,不过 Sqlite
是贰个本地型的数据库,无需安装和治本配置,并且占用空间比十分小,用来做Mini的网址开辟完全够用。

在建设机票预定系统时,首要的主题材料正是创制实体,并分明实体之间的关系,三个客人能够订购多架飞机,三个飞行器能够继承几个客户,飞机和客人中间是多对多涉及,清楚那或多或少的前提下,技能建设合理的数据库实现专门的职业要求。

除此以外,有少数很深的拿走是,在用 web 开荒的时候,对数据库的操作已经不是
SQL
语句了,而是经过高级语言(如Python)的语法来产生对数据库的增加和删除改查操作。

举个大致的事例,在查询 booksystem_flight 表中的全数航班音讯时:

  • SQL: select * from booksystem_flight;
  • Django: Flight.objects.all( )

足见高档语言和数据库的组合开采使得广大底层的多少操作也转化成了开垦人士熟习的高档语言程序,但好歹,还是是对数据库进行了操作,守旧的
SQL 语句依旧有用,方便大家作证代码逻辑是或不是科学,综上说述,收获广大。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有