随着Internet的迅速发展和用户数量的急剧增加,互联网对于企业和事业单位的运营和发展日益重要,网上交易也逐渐被人们认可,并成为未来交易的发展方向。在这种情况下,很多原有的C/S模式的系统也逐步向B/S模式靠拢,铁路客车售票系统也不例外。
铁路客车售票系统是铁路旅游服务信息系统的一个重要组成部分,为旅客提供优质便捷的服务。为了提高铁路客运的售票效率,丰富铁路客运的营销手段,火车站售票总站的下属代售点可以通过公用的互联网资源,实现网上的售票,查询及管理工作。本论文围绕如何实现基于B/S结构的客票系统展开讨论,通过对现有C/S结构的售票系统与B/S结构的优缺点进行比较 ,给出基于B/S结构售票系统的具体解决方案:查询,买票,订票,退票,新闻管理,用户管理等六大模块,并研究B/S结构在网络中面临的安全问题及提出相应的解决方案。在软件的结构设计中侧重售票系统主要功能的设计与实现。本论文的研究内容还涉及现有客车售票系统中常用的算法设计,对如何将B/S结构的售票系统与车票打印机连接起来也做了简要介绍。
本论文关于客票系统的研究分为以下几个章节 :第一章:绪论;第二章:B/S模式与开发平台介绍;第三章:需求分析;第四章:系统总体设计与数据库设计;第五章:系统的具体实现细节;第六章:结论与展望。
关键词: B/S结构 ;铁路客票 ;.net技术
With the development of Internet and the increasing of users, Internet now plays a very impartant part in the growing of a companies. Trades through net is accepted ,and perhaps to be a direction of furture trade. In the situation more and more C/S structure tend to be B/S structures,including the selling tickets system of train.
The selling tickets system of train plays a very important part in junketing,it provides a good service to customers.It is of importance of researching new ticket sell system.In order to enhance the efficince of train transportion,and enrich the means of it,the substitution station of trainstation can take advantage of network to sell tickets.This paper give a solution of tickets selling through comparing the C/S structure with the B/S structure.It also researches the problems of safe which B/S structure faces.It features the main function of the system.This paper also researches the common arithmetics of the sell system which is now using .And also it gives a brief introduction of how to connect this system with printer.
This paper have 6 parts. The chapter 1: introduction something about tickets system of train ;The chapter 2:the introduction of b/s structure;The chapter 3: request analyze; The chapter 4: the collectivity design of system;The chapter 5:introduction the details of design;The chapter 6: conclusion and expectation.
key words B/S structure; Railway Ticketing; .Net technology
目 录
摘 要
Abstract
第1章 绪论
1.1铁路信息化的现状及目标
1.2基于B/S结构的客车售票系统
1.3文章概要
第2章 B/S模式和开发平台
2.1 B/S模式介绍
2.1.1 B/S模式的概念
2.1.2 B/S模式与C/S模式对比
2.2 开发工具介绍
2.2.1 .NET的特点
2.2.2 ASP.NET
2.2.3 SQLServer2000介绍
第3章 需求分析
3.1功能需求
3.1.1 查询功能需求
3.1.2 售票功能需求
3.1.3 退票功能需求
3.1.4 订票功能需求
3.1.5 新闻功能需求
3.1.6 留言功能需求
3.1.7 用户管理功能需求
3.1.8 注册功能需求
3.2 性能需求
3.2.1 系统的准确性和及时性
3.2.2 系统的开放性和可扩展性
3.2.3 系统的易用性和易维护性
3.2.4 系统的响应速度
3.3 数据需求
3.3.1 数据录入和处理的准确性
3.3.2 数据的一致性和完整性
3.3.3 数据的共享与独立性
第4章 系统设计
4.1系统总体设计
4.1.1 设计目标
4.1.2 设计原则
4.1.3 功能设计
4.2 系统功能模块设计
4.2.1 注册模块
4.2.2 登录模块
4.2.3 售票模块
4.2.4 订票模块
4.2.5 退票模块
4.2.6 查询模块
4.2.7 个人资料模块
4.2.8 新闻阅读模块
4.2.9 留言板模块
4.2.10 管理用户模块
4.2.11 更新车次模块
4.2.12 查询剩余票模块
4.2.13 新闻管理模块
4.2.14 留言管理模块
4.2.15 销售统计模块
4.3 数据库设计
4.3.1 user表(用户表)
4.3.2 ticketsinf表(车次详细信息表)
4.3.3 putongliechejiage表(普通列车价格表)
4.3.4 putongliechewopujiage表(普通列车卧铺价格表)
4.3.5 kongtiaoliechejiage表(空调列车价格表)
4.3.6 kongtiaoliechewopujiage表(空调列车卧铺价格表)
4.3.7 dingpiao表(订票纪录表)
4.3.8 liuyan表(留言信息表)
4.3.9 xinwen表(新闻信息表)
4.3.10 客车售票系统E-R图
第5章 系统实现
5.1登陆模块
5.1.1实现原理
5.1.2关键代码
5.2注册模块
5.2.1实现原理
5.2.2 Button_queding_Click事件(提交事件)
5.2.3注册模块界面
5.3系统主界面
5.4售票模块
5.4.1实现原理
5.4.2绑定车次代码
5.4.3 价格计算原理及代码
5.4.4售票模块界面
5.5订票模块
5.6退票模块
5.6.1退票方式
5.6.2退订方式
5.7查询模块
5.7.1查询模块关键代码
5.7.2查询模块主体界面
5.8个人资料模块
5.9站内新闻模块
5.10意见反馈模块
5.11用户管理模块
5.12管理用户模块
5.13查询剩余票模块
5.14更新车次模块
5.15新闻管理模块
5.16留言管理模块
5.17销售统计模块
结论
致谢
参考文献
用信息化推动工业化,用信息技术改造传统产业,这是我国迫切要完成的一项战略性任务。作为工业文明的产物—铁路,如何借助信息技术的帮助,实现管理方式,运营组织,服务标准的现代化,这是摆在我国铁路工作者面前的重大课题。
铁路信息化是铁路现代化的重要标志,其根本目的是将信息技术应用到铁路生产经营与管理决策等各项活动中,改造传统产业,提高铁路生产率,提高市场竞争力,提高铁路运营经济效益。
我国铁路信息系统的建设已经取得了较大的成绩。到目前为止,我国铁路先后研制了许多先进的业务系统,如面向运营管理和提高服务水平的铁路运输管理信息系统(TMIS),调度指挥管理信息系统(DMIS),全国客票发售和预订系统(TRS)等等,这些系统的建立为铁路信息化的建设奠定了一定的基础。通信网络建设已经形成传输网,交换网,数据通信网三个基础网,现有的光传输通道达到3.3万公里,这位铁路运输信息系统的进一步完善与改进提供了有力支撑。
铁路信息化建设目前主要集中在搞好铁路运输生产管理上,加快计算机调度系统建设,完善客票发售与预订系统,搞好各地信息系统的结合,实现资源有效利用,信息共享。其总体目标是:形成具有国际水平的铁路信息化基础通信平台,实现各部门各系统之间的信息数据共享,互联互通;建成车,机,工,电,辆各部门调度控制,安全生产,运输指挥的现代化保障体系。为铁路运输各部门提供所需的管理信息资源和强有力的决策支持。通过现代客货营销手段和电子商务手段,带动铁路运输经济发展,大幅度提高运输效益。建立建全与信息化相适应的管理体制。我国目前的铁路信息化总体程度居国内领先,国际先进水平。
铁路客票发售和预订系统经过几年的建设,取得了很大的进展,目前,全国
铁路共建成计算机售票站1741个,联网售票车站774个。客票系统的推广使用,
标志着我国铁路客票计算机发售进入到一个全新的阶段,也为延伸服务在技术上
准备了必要的条件。
采用计算机出售火车票,大大方便了旅客购票,但毕竟还局限于火车站的售
票厅和市内售票处的售票窗口,现有的售票系统采用的是C/S结构,这对于火车站下属售票窗口的客户端更新及新增售车票代售点都不方便。为了解决售票大厅拥挤和团体集中购票的问题,提高铁路客运的售票效率及旅客便利性,使铁路客运在竞争日益激烈的运输行业更具优势,大、中城市可以建立基于B/S结构铁路售票系统,在该地区利用互联网资源实现随时随地对客票系统主机的访问,进行联网售票。
本文将围绕如果实现基于B/S结构铁路售票系统展开讨论,通过对现有B/S结构开发工具及语言的分析比较,确定了合适的开发工具及语言,实现铁路客车售票系统,并研究铁路售票系统所面临的安全问题并提出相应的解决方案。
全文分为六章:
第一章:绪论
介绍我国目前铁路信息化的有关背景和基于B/S结构铁路售票系统在铁路信息化过程中的独特优势。
第二章: B/S模式和开发工具
介绍B/S模式的概念、工作原理。本系统所选则开发平台是.net,开发语言是C#,数据库用的是sqlserver2000。
第三章:需求分析
在充分考虑客票系统业务的基础之上,提出了网络售票系统的总体设计方案。
第四章: 售票系统总体设计
针对客票系统业务进行数据库设计,系统总体结构设计。
第五章:售票系统的实现
详细介绍售票系统中每个功能模块如何实现,以及系统开发过程中遇到的难点问题。
第六章:结论
对论文的研究内容予以总结,说明了系统研究开发和实际投入使用的意义,
同时也指出了系统仍然存在的一些问题。
B/S(Browser/Server,浏览器/服务器)模式又称B/S结构。它是随着Internet技术的兴起,对C/S模式应用的扩展。在这种结构下,用户工作界面是通过IE浏览器来实现的。B/S模式最大的好处是运行维护比较简便,能实现不同的人员,从不同的地点,以不同的接入方式(比如LAN, WAN, Internet/Intranet等)访问和操作共同的数据。
C/S结构软件(即客户机/服务器模式)分为客户机和服务器两层,客户机不是毫无运算能力的输入、输出设备,而是据有了一定的数据处理和数据存储能力,通过把应用软件的计算和数据合理地分配在客户机和服务器两端,可以有效地降低网络通信量和服务器运算量。由于服务器连接个数和数据通信量的限制,这种结构的软件适于在用户数目不多的局域网内使用。
B/S(浏览器/服务器模式)是随着Internet技术的兴起,对C/S结构的一种改进。在这种结构下,软件应用的业务逻辑完全在应用服务器端实现,用户表现完全在Web服务器实现,客户端只需要浏览器即可进行业务处理,是一种全新的软件系统构造技术。这种结构更成为当今应用软件的首选体系结构。
1,数据安全性比较。由于C/S结构软件的数据分布特性,客户端所发生的火灾、盗抢、地震、病毒、黑客等都成了可怕的数据杀手。另外,对于集团级的异地软件应用,C/S结构的软件必须在各地安装多个服务器,并在多个服务器之间进行数据同步。如此一来,每个数据点上的数据安全都影响了整个应用的数据安全。所以,对于集团级的大型应用来讲,C/S结构软件的安全性是令人无法接受的。对于B/S结构的软件来讲,由于其数据集中存放于总部的数据库服务器,客户端不保存任何业务数据和数据库连接信息,也无需进行什么数据同步,所以这些安全问题也就自然不存在了。
2,数据一致性比较。在C/S结构软件的解决方案里,对于异地经营的大型集团都采用各地安装区域级服务器,然后再进行数据同步的模式。这些服务器每天必须同步完毕之后,总部才可得到最终的数据。由于局部网络故障造成个别数据库不能同步不说,即使同步上来,各服务器也不是一个时点上的数据,数据永远无法一致,不能用于决策。对于B/S结构的软件来讲,其数据是集中存放的,客户端发生的每一笔业务单据都直接进入到中央数据库,不存在数据一致性的问题。
3,数据实时性比较。在集团级应用里,C/S结构不可能随时随地看到当前业务的发生情况,看到的都是事后数据;而B/S结构则不同,它可以实时看到当前发生的所有业务,方便了快速决策,有效地避免了企业损失。
4,数据溯源性比较。由于B/S结构的数据是集中存放的,所以总公司可以直接追溯到各级分支机构(分公司、门店)的原始业务单据,也就是说看到的结果可溯源。大部分C/S结构的软件则不同,为了减少数据通信量,仅仅上传中间报表数据,在总部不可能查到各分支机构(分公司、门店)的原始单据。
5,服务响应及时性比较。企业的业务流程、业务模式不是一成不变的,随着企业不断发展,必然会不断调整。软件供应商提供的软件也不是完美无缺的,所以,对已经部署的软件产品进行维护、升级是正常的。C/S结构软件,由于其应用是分布的,需要对每一个使用节点进行程序安装,所以,即使非常小的程序缺陷都需要很长的重新部署时间,重新部署时,为了保证各程序版本的一致性,必须暂停一切业务进行更新(即“休克更新”),其服务响应时间基本不可忍受。而B/S结构的软件不同,其应用都集中于总部服务器上,各应用结点并没有任何程序,一个地方更新则全部应用程序更新,可以做到快速服务响应。
6,网络应用限制比较。C/S结构软件仅适用于局域网内部用户或宽带用户(1兆以上);而我们的B/S结构软件可以适用于任何网络结构(包括28.8K拨号入网方式),特别适于宽带不能到达的地方。
伴随着Internet/Intranet技术的发展,开发基于Web的应用程序势在必行,数据库技术更是需要和Web数据相结合,才是更为广阔的前景。ASP.Net作为微软推出的新兴Web应用程序开发技术,在数据库应用方面发挥着越来越重要的作用。 本系统的开发工具选用的是Microsoft.NET2003,编程语言选用的是C#,数据库选择用的SQLServer2000。
.NET是Microsoft.NET的简称。它是一个功能强大的面向网络、支持各种用户终端的开发平台环境。它定义了一种公用语言子集(Common Language Subset)来提供符合其规范的语言和类库之间的无缝集成。对下一代网络通信标准,可扩展标记语言(Extensible Markup Language,XML)提供完全支持。而且.NET平台的基础架构.NET框架(Framework),采用统一的命令集支持各种编程语言。从而消除各种异类框架之间的差异,将他们合并为一个整体。.NET框架提供强的跨语言继承性、错误处理和调试功能。使得编程人员可以自由的选择他们喜欢的编程语言,实现语言的互用性。
ASP.net 是一种建立在通用语言上的程序构架,能被用于一台Web服务器来建立强大的Web应用程序。ASP.net提供许多比现在的Web开发模式强大的的优势。 执行效率的大幅提高 ASP.net是把基于通用语言的程序在服务器上运行。不像以前的ASP即时解释程序,而是将程序在服务器端首次运行时进行编译,这样的执行效果,当然比一条一条的解释强很多。 世界级的工具支持ASP.net构架是可以用Microsoft(R)公司最新的产品 Visual Studio.net开发环境进行开发,WYSIWYG(What You See Is What You Get所见即为所得)的编辑。这些仅是ASP.net强大化软件支持的一小部分。 强大性和适应性 因为ASP.net是基于通用语言的编译运行的程序,所以它的强大性和适应性,可以使它运行在Web应用软件开发者的几乎所有的平台上。通用语言的基本库,消息机制,数据接口的处理都能无缝的整合到ASP.net的Web应用中。ASP.net同时也是language-independent语言独立化的,所以,你可以选择一种最适合你的语言来编写你的程序,或者把你的程序用很多种语言来写,现在已经支持的有C#(C++和Java的结合体),VB,Jscript。将来,这样的多种程序语言协同工作的能力保护您现在的基于COM+开发的程序,能够完整的移植向ASP.net。 简单性和易学性 ASP.net是运行一些很平常的任务如表单的提交客户端的身份验证、分布系统和网站配置变得非常简单。例如ASP.net页面构架允许你建立你自己的用户分界面,使其不同于常见的VB-Like界面。另外,通用语言简化开发使把代码结合成软件简单的就像装配电脑。 高效可管理性 ASP.net使用一种字符基础的,分级的配置系统,使你服务器环境和应用程序的设置更加简单。因为配置信息都保存在简单文本中,新的设置有可能都不需要启动本地的管理员工具就可以实现。这种被称为"Zero Local Administration"的哲学观念使Asp.net的基于应用的开发更加具体,和快捷。一个ASP.net的应用程序在一台服务器系统的安装只需要简单的拷贝一些必须得文件,不需要系统的重新启动,一切就是这么简单。 多处理器环境的可靠性 ASP.net已经被刻意设计成为一种可以用于多处理器的开发工具,它在多处理器的环境下用特殊的无缝连接技术,将很大的提高运行速度。即使你现在的ASP.net应用软件是为一个处理器开发的,将来多处理器运行时不需要任何改变都能提高他们的效能,但现在的ASP确做不到这一点。 自定义性,和可扩展性 ASP.net设计时考虑了让网站开发人员可以在自己的代码中自己定义"plug-in"的模块。这与原来的包含关系不同,ASP.net可以加入自己定义的如何组件。网站程序的开发从此变得比较简单。 安全性基于Windows认证技术和应用程序配置这可以确保您的原程序是绝对安全的。
SQL Server是Microsoft公司在原来和Sybase公司合作的基础上推出的一款面向高端的数据库系统。而SQL Server 2000版本则是最新的、大型联机事务处理的新型数据库平台。它继承了SQL Server以前版本的一些强大的优势,如简单易用、具有良好的稳定性和高效性等等。同时,它的功能比以前的版本更加强大,界面更加友好。总之,无论是在功能、安全性、可维护性,还是在易操作性上都较以前版本有了长足的进步。
客车售票系统的总目标是:在计算机网络,数据库和先进的开发平台上,利用现有的软件,配置一定的硬件,开发一个具有开放体系结构的、易扩充的、易维护的、具有良好人机交互界面的客车售票系统,为企业的决策层提供准确、精细、迅速的客票销售信息。
客票系统通过计算机网络将客户端与服务器的数据库相连,将从客户端得到的信息进行处理,实现车次查询,售票,订票,退票,新闻管理,销售统计等功能。以计算机为中心,实现销售业务的计算机自动化,为铁路部门降低成本、提高销售额、为铁路部门的经营决策提供及时精确的依据。
查询功能要能满足至少两种方式的查询:按车次查询,按站点查询。如果查询出来满足条件的车次后,用户可以直接点击购买。查询出来的信息里面应该包括车次,开车时间,到达时间,起始站,终点站,车辆类型等主要车次信息。
售票模块主要有两个入口:一个是系统主界面的买票按钮,另一个是查询结果后面的购买按钮。买票界面里可以供用户填写或者选择的内容有:车次,开车时间,起始站,终点站,座位类型 ,票数等。还要有价格计算按钮,购买按钮和重置按钮。每趟车次的具体路段起始站和终点站要在用户输入车次后自动绑定,供用户选择。点击购买按钮后,系统给出具体的购买票据,并且要能打印票据。
退票模块要能实现两种功能:退订和退票。退订是指用户有过订票记录,但票还没拿到;退票是指用户退掉已经拿到的车票(退票时间必须给出具体限制)。
订票模块和买票模块主要有两点区别:用户进行订票操作时必须要输入用户信息;订票的和买票的提前时间不同,订票可以提前更多的时间。订票操作成功后,系统应给出具体的订票信息票据。
普通用户可以从新闻模块里了解近期的最新站内通知或者新闻。
普通用户可以把系统使用过程中遇到的一些问题或者建议及时地反馈给系统管理员,以方便管理员更好的改进和完善系统。
当高级管理员登录系统时,用户管理界面入口可见,其他用户登录后则不能看到用户管理模块。用户管理模块主要有六个子模块:管理用户,剩余票查询,更新车次,销售情况统计,新闻管理,留言管理。
◆ 管理用户
系统的用户有三类,高级管理员,代售点用户和企业用户,不同的用户权限不同。这些权限具体体现在提前买票和订票时间上。除了高级管理员,其他的用户都要先注册才能使用,不同类型的用户登录系统后操作界面不太一样。
◆ 剩余票查询
管理员要能查询某个车次或者所有的车次剩余票信息。
◆ 更新车次
管理员可在第一次使用系统时通过这个功能模块来建立基本的车次信息库,在以后的业务活动中根据具体需要删除或者修改某些车次信息。
◆ 销售情况统计
用户可以统计某一时间段内某个车次或者某个代售点的销售情况,当然也可以查询所有车次或者所有代售点的销售情况。
◆ 新闻管理
管理员要能添加,修改,删除新闻内容。
◆ 留言管理
管理员可以查看,删除用户留言。
第一次使用系统时,首先要做的是注册用户,注册用户模块里主要分两种类型的注册:代售点注册和企业用户注册。这两种注册方式的差别体现在所填注册信息上。
不同的用户拥有不同的权限。
为了保证客车售票系统能够长期、安全、稳定、可靠、高效的运行,客车售票系统应该满足以下的性能需求
系统处理的准确性和及时性是系统的必要性能。在系统设计和开发过程中,要充分考虑系统当前和将来可能承受的工作量,使系统的处理能力和响应时间能够满足用户对信息处理的需求。
由于客车售票系统的查询功能对于整个系统的功能和性能完成举足轻重。作为系统的很多数据来源,车票销售数量和销售时间又影响企业的决策活动,其准确性很大程度上决定了客车售票系统的成败。在系统开发过程中,必须采用一定的方法保证系统的准确性。
售票系统在开发过程中,应该充分考虑以后的可扩充性。例如车次信息的临时或者永久性改变,用户查询的需求也会不断的更新和完善。所有这些,都要求系统提供足够的手段进行功能的调整和扩充。而要实现这一点,应通过系统的开放性来完成,即系统应是一个开放系统,只要符合一定的规范,可以简单的加入和减少系统的模块,配置系统的硬件。通过软件的修补、替换完成系统的升级和更新换代。
售票系统是直接面对普通用户的,而大多普通用户往往对计算机并不是非常熟悉。这就要求系统能够提供良好的用户界面。要实现这一点,就要求系统应该尽量使用用户熟悉的术语和中文信息界面;针对用户在使用中出现的错误操作,尽量给出中文提示。
售票系统中涉及到的数据是铁路部门的相当重要的信息,系统应提供方便的手段供系统维护人员进行数据的备份,日常的安全管理,以及系统意外崩溃时数据的恢复等工作。
售票系统在日常处理中的响应速度为秒级(具体响应时间根据当地网络而定),才能达到实时要求以及及时反馈信息要求,在进行统计分析时,由于数据量比较大,根据具体数据量响应速度可以从秒级提升到分钟级。
总的原则是操作人员不会应为系统响应速度影响工作效率。
数据的输入是否准确是数据处理的前提,错误的输入会导致系统输出的不正确和不可用,从而不能返回想要的结果。数据的输入来源是手工输入。所以系统地界面要让用户容易使用,如果用户出现误操作,系统能简单明了的给出中文提示。
由于系统的数据是共享的,在不同的代售点中,车次信息是共享数据,所以如何保证这些数据的一致性,是系统必须解决的问题。要解决这一问题,要求系统能保证数据的一致性,在数据录入处控制数据的去向,并且要求对数据库的数据完整性进行严格的约束。
对于输入的数据,要为其定义完整性规则,如果不能符合完整性约束,系统应该拒绝该数据,并给出出错提示。
整个售票系统的数据是共享的。然而,从系统开发的角度上看,共享会给设计和调试带来困难。因此,应该提供灵活的配置,使不同权限的用户都可以正常进行操作。
采用现有的互联网资源,实现B/S结构的铁路客车售票系统。
◆系统安全可靠
未经注册的用户不能登录系统,用户个人信息和购票信息通过互联网上传输时,要确保信息的安全性。
◆系统准确及时
用户对系统进行操作时,系统应在很短时间内(一般以秒为单位)给与响应。
◆系统的可扩展性
对于用户新的需求,能做到只需添加新模块即可满足用户要求。
系统总的功能模块结构如图4-1:
图4-1 系统功能模块结构图
针对系统总体功能结构图4-1,下面是每个功能模块的详细设计。
注册模块是每个信息系统必须有的一个功能模块,现在常用的注册机制主要有三种:
◆ 用户登录ID和密码直接由管理员分配,用户只能修改密码。
◆ 用户输入注册信息,等管理员验证通过后,给出登录名和密码,用户可以修改密码。
◆ 用户正确输入注册信息后,系统直接通过验证,把用户注册的用户名作为合法用户,这种是最常用的。本系统用的就是这种登录方式,这种注册方式用户名和密码都可以修改。
用户输入系统网址,首先出现的是系统登录页面,登陆页面的主要功能是验证用户的合法性,如果用户不经过登陆页面直接输入其他系统页面的网址,系统也会自动跳转到登陆页面。登录页面上还有注册用户入口 ,用户第一次使用本系统应该先注册,后使用。
买票模块可以说是客车售票系统最重要最核心的模块,其它的功能模块都是为是以它为核心,为它服务。进入买票页面后,用户可以选择或输入车次,开车时间,起始站,终点站,座位类型,是否学生票,票数等信息,可以点击计算价格和购买按钮。买票成功后可以给出用户具体的票据,也就是车票,本系统暂时先模拟了一张车票,车票上有打印按钮,当用户点击打印按钮,理论上可以打印出实际的车票,这个功能要设计到系统和车票打印机的连接,本系统主要侧重软件实现。
订票模块也是客票系统中必不可少的功能模块,订票是指在超出买票期限时用户可以和代售点达成协议,先付款预定车票,这也是缓解客票销售紧张的一种好方法。
订票界面和买票界面差不多,只是在买票页面上多了用户信息栏。当用户想要订票时候,除了需要输入车次信息和票数外,还要输入自己的信息,如:姓名,联系方式,身份证号,地址等。用户的订票信息将会被保存到dingpiao表里面(订票表)。
有的用户可能会应为很多原因,原先买的或者订的票现在又不想要,所以退票这个功能也是必不可少的。现在火车站退票的规定是在列车开车前可以退票,只能退还原票价80%的金额。退票模块分为两种退票方式:退票和退订。本系统设置的退票,退订比率均为80%,即无论退票还是退订返回给用户的金额是原票价的80%。用户退票成功后,用户的在dingpiao表里面(订票表)的纪录要立即删除。
如果用户买票时已经知道要购买的车次,那么直接在买票模块里输入车次就可以进行买票;如果用户买票时只知道出发地点和到达地点,这时就要用到查询功能,在查询功能支持两种查询方式:按车次查询和按站点查询。按车次查询直接输入车次就可以查出来该车次的车次信息;按站点查询又分为三种查询方式:按起始站,按终点站,按起始站和终点站的组合。无论以哪种方式查询,查询结果里面除了显示每一趟车次的详细信息外,每趟车次后面还有一个购买按钮,点击它就会跳到买票页面,用户就可以在这里购买该车次车票。
个人资料模块是个相对比较小的功能模块,它的作用是供用户查看或者修改自己的资料。用户登录系统主界面后,点个人资料系统就可以显示当前登陆用户的信息。用户可以在上面修改保存自己的信息。
新闻查看模块主要是让用户能及时的了解站内最新通知或者最新的业内新闻,新闻页面有今日要闻,以往新闻,新闻查询等子模块。
留言板的功能是让用户可以及时向管理员反馈在系统使用中的出现问题和用户建议,留言时要输入留言标题和内容,作者和留言时间系统可以自动获得,用户不用手动输入。
管理用户功能主要是为了方便系统管理员对所有用户的管理,系统管理员在这里可以查看,修改和增加用户。如果某个代售点被取消,管理员就可以在这里删除它的用户信息。
更新车次模块主要作用是方便管理员建立基本车次信息库,车次信息库由基本车次信息和详细路段信息组成,并且它们是相互对应的,基本信息里面只保存了该车次开车时间,到达时间,起始站,终点站,车辆类型等信息。详细路段信息包括该车次沿途经过所有站点的站名,各段的开始到达时间和路程信息等。管理员可查看,修改,增加删除车次信息和详细路段信息。
查询剩余票功能是方便管理员了解某个车次或者所有车次的车票销售情况。管理员可以搜索指定车次或者所有车的的车票销售情况,查询结果里面有该趟车所有类型座位的车票剩余数。
这里的新闻管理功能是针对管理员的,管理员在这里可以对系统发布的新闻进行后台管理,比如查看,增加 ,修改,删除新闻等,由于新闻一般比较多,删除新闻时主要是用时间段范围删除,即选定新闻发布的起始日期和终止日期,则这一段时间内的新闻都将被删除。
和4.2.13的新闻管理比较类似,留言管理是管理员针对用户的留言进行管理,管理员在这里可以看到用户的留言标题,内容,作者名称,留言时间等信息,管理员也可以对留言进行批量的删除。
要进行销售统计,主要是设置三个统计条件:
◆统计的时间范围选择,这是最基本的统计条件
◆统计方式选择,它又分为三种:按车次,按代售点,所有
◆统计结果显示方式,它分为两种:记录和合计。
本系统采用的数据库软件为SQLserver2000,本系统用到的数据库名为selltickets(售票),它里面包括9张表,为了便于理解,本系统的所有表的字段名称都为中文汉字,下面逐一介绍。
user表用来存储注册用户的信息,它的结构如表4-2:
表4-2 用户表
字段名称 |
数据类型 |
长度 |
描述 |
序号 |
Int |
4 |
主键 |
用户名 |
Char |
10 |
用户名 |
密码 |
Char |
10 |
密码 |
联系方式 |
Varchar |
50 |
联系方式 |
负责人 |
Char |
10 |
负责人 |
单位全称 |
Varchar |
50 |
单位全称 |
具体地址 |
Varchar |
20 |
具体地址 |
身份证 |
Char |
20 |
身份证号 |
代售点编号 |
Int |
4 |
为代售点用户自动分配编号 |
用户类型 |
Int |
4 |
代售点为1,企业用户为2 |
ticketsinf表存储的是车次的具体路段信息,它的结构如表4-3:
表4-3 车次详细信息表
字段名称 |
数据类型 |
长度 |
描述 |
序号 |
Decimal |
9 |
主键 |
车次 |
Char |
18 |
车次 |
开车时间 |
Datatime |
8 |
开车时间 |
到达时间 |
Datetime |
8 |
到达时间 |
出发站 |
Char |
50 |
出发站 |
到达站 |
Char |
50 |
到达站 |
行程 |
Decimal |
9 |
每两站之间的距离 |
putongliechejiage表存储的是普通列车的票价计算参数,它的具体结构如表4-4:
表4-4 普通列车价格表
字段名称 |
数据类型 |
长度 |
描述 |
序号 |
Int |
4 |
主键 |
里程 |
Int |
4 |
路程分段计费 |
普通列车 |
Decimal |
9 |
普通列车对应路段价格 |
普快列车 |
Decimal |
9 |
普快列车对应路段价格 |
特快列车 |
Decimal |
9 |
特快列车对应路段价格 |
空调费率 |
Int |
9 |
路段空调费率 |
座位类型 |
Char |
10 |
座位类型 |
putongliechewopujiage表存储的是普通列车卧铺票价的计算参数,它的具体结构如表4-5:
表4-5 普通列车卧铺价格表
字段名称 |
数据类型 |
长度 |
描述 |
序号 |
Int |
4 |
主键 |
里程 |
Int |
4 |
路程分段计费 |
上铺 |
Decimal |
9 |
上铺对应路段的价格 |
中铺 |
Decimal |
9 |
中铺对应路段的价格 |
下铺 |
Decimal |
9 |
下铺对应路段的价格 |
空调费率 |
Decimal |
9 |
路段空调费率 |
车辆类型 |
Char |
18 |
有普通,普快,特快之分 |
座位类型 |
Char |
18 |
有软卧和硬卧之分 |
kongtiaoliechejiage表存储的是空调列车票价的计算参数,它的具体结构如表4-6:
表4-6 空调列车价格表
字段名称 |
数据类型 |
长度 |
描述 |
序号 |
Int |
4 |
主键 |
里程 |
Int |
4 |
路程分段计费 |
普通列车 |
Decimal |
9 |
普通列车对应路段价格 |
普快列车 |
Decimal |
9 |
普快列车对应路段价格 |
特快列车 |
Decimal |
9 |
特快列车对应路段价格 |
kongtiaoliechewopujiage表存储的是空调列车卧铺票价的计算参数,它的具体结构如表4-7:
表4-7 空调列车卧铺价格表
字段名称 |
数据类型 |
长度 |
描述 |
序号 |
Int |
4 |
主键 |
里程 |
Int |
4 |
路程分段计费 |
上铺 |
Decimal |
9 |
上铺对应路段的价格 |
中铺 |
Decimal |
9 |
中铺对应路段的价格 |
下铺 |
Decimal |
9 |
下铺对应路段的价格 |
车辆类型 |
Char |
18 |
有普通,普快,特快 之分 |
座位类型 |
char |
18 |
有软卧和硬卧之分 |
dingpiao表存储的是用户的买票记录和订票信息,买票和订票操作产生的记录有不同的字段,本系统中把两种不同字段放在一张表里,如果订票字段为空,则系统可判断这是一条买票记录,它的具体结构如表4-8:
表4-8 订票记录表
字段名称 |
数据类型 |
长度 |
描述 |
序号 |
Int |
4 |
主键 |
车次 |
Char |
10 |
车次 |
出发站 |
Char |
10 |
车发站 |
到达站 |
Char |
10 |
到达站 |
座位类型 |
Char |
10 |
座位类型 |
票数 |
Decimal |
9 |
票数 |
总价格 |
Decimal |
9 |
总价格 |
用户名 |
Char |
50 |
用户名 |
联系方式 |
Decimal |
20 |
联系方式 |
身份证 |
Decimal |
20 |
身份证 |
发车日期 |
Datetime |
8 |
发车日期 |
时间 |
Datetime |
8 |
时间 |
座位号 |
Int |
4 |
座位号 |
liuyan表存储的是用户反馈给管理员的信息,它的具体结构如表4-9:
表4-9 留言信息表
字段名称 |
数据类型 |
长度 |
描述 |
序号 |
Int |
4 |
主键 |
标题 |
Varchar |
50 |
标题 |
内容 |
Varchar |
1000 |
留言内容 |
作者 |
Varchar |
50 |
留言的用户名 |
时间 |
Datetime |
8 |
发表留言的时间 |
xinwen表存储的是管理员发布的站内新闻,它的具体结构如表4-10:
表4-10 新闻信息表
字段名称 |
数据类型 |
长度 |
描述 |
序号 |
Int |
4 |
主键 |
标题 |
Varchar |
100 |
标题 |
发布时间 |
Datetime |
8 |
留言时间 |
内容 |
Varchar |
5000 |
留言内容 |
图4-11 系统E-R图
本章主要讲如何在前面分析和设计的基础上通过ASP.NET和sqlserver2000来实现售票系统。下面将详细介绍每个功能模块是如何实现。
在讲系统实现之前,现讲一下asp.net是如何对数据库进行操作的,因为本系统的所有模块基本上都涉及到数据库操作。
SQLserver2000数据库属于关系型数据库,而关系型数据库中最重要的也是最基础的是数据表 ,数据表是一系列相关数据的集合,每张数据表可分为行和列,每一行是一条记录,每一列是一个字段,为了存储数据,可以建立相应的数据表,使得数据以一条一条的记录方式存储在数据表中,当然这些都是用数据库管理软件来实现的。
数据库和数据表创建好后,我们就可以对数据库进行读写操作,asp.net是用ado.net来对数据库进行操作的,ado.net是一组有.NET Framework提供的对象类的名称,用于数据存储中的数据交互,需要注意的是,ado.net使用的是数据存储的概念,而不是数据库的概念,就是说,ado.net不但可以处理数据库中的数据 ,还可以处理其他存储方式中的数据,例如XML格式,Excel格式和文本文件格式中的数据。
Ado.net与ado相比有更大的可伸缩性和互操作性,它的一大特点是可以对断开的数据集进行操作。在Web应用程序中,由于用户在使用网页访问数据库时,网络一般是断开的,只有当用户发出请求时才与数据库建立连接,一旦请求完毕,就断开连接,这样做的最大好处就是可以节约服务器的资源,所以ado.net这个特性可以很大程度上提高应用程序的效率。
建立数据库连接的方法很多,如果使用的OLE DB编程接口,就要使用OleDbConnection对象,如果使用的是SQL Server编程接口,就要使用Sqlconnection对象(本系统使用的就是Sqlconnection对象)[3]。
如果要与数据库中的某一张表建立连接,在服务器资源管理器中找到对应的表,把它拖到对应的页面中去,系统会自动生成sqlDataAdapter对象和sqlConnection对象,我们可以用sqlConnection来生成数据集dataset对sqlDataAdapter按照提示向导做简单的配置,就可以在程序里调用它。
下面举个简单的例子:
假如现在生成了一个sqlDataAdapter,一个sqlConnection和一个dateset,如果我们要对数据表tickets执行查询操作,可以执行下面程序:
This.sqlConnection.selcetcommand.commandtext=”select* from tikcets”;
If(this. sqlConnection.state.tostring()==”closed”)
This. sqlConnection.open();
This. sqlDataAdapter.fill(this.dateset);
程序执行到这里,我们从数据表tikcets里无条件的查询了所有字段,并把它存放到了数据集dateset里面,dateset是由很多张表组成的,默认的查询结果是放在dataset[0]里面,如果我们要查看查询结果第i行的第j个列的值,可以通过调用this.dataset[0].rows[i][j].tostring();来实现。
上面仅介绍了asp.net如何实现对数据库的查询操作,还有修改,删除操作会在后的具体例子中予以说明。
用户输入用户名和密码后,点击登录,系统执行登录按钮的鼠标点击事件,登录按钮的鼠标点击事件里面先判断用户名和密码两个文本框是否为空,如果为空,提示“输入信息不完整!”,如果两个文本框不为空,以用户名为查询条件,查询user表(用户表),查询出来的结果填充到数据集里面,然后判断数据集里面的数据表,如果行数为空,说明用户为非法用户,提示“用户名或者密码错误”,如果行数大于等于一,通过验证,跳转到系统主界面。
点击”登陆”按扭后执行下面代码:
private void Button_denglu_Click(object sender, System.EventArgs e)
{
if(this.sqlConnection_user.State.ToString()=="Closed")
this.sqlConnection_user.Open();
// 如果数据库连接状态为关闭,打开数据库连接
if(this.text_name.Text.Trim()!=""&&this.text_password.Text.Trim()!="")
//如果用户名和密码栏不为空
{ string sql="select * from [user] where 用户名='"+this.text_name.Text.Trim()+"'and 密码='"+this.text_password.Text.Trim()+"'";
//构造查询语句:以用户名为条件查询数据库,
this.sqlDataAdapter_user.SelectCommand.CommandText=sql;
this.sqlDataAdapter_user.Fill (this.dataSet_user);
//把查询结果填充到数据集里面
if(this.dataSet_user.Tables[0].Rows.Count>0)
//如果查询结果不为空
{
Session["username"]=this.text_name.Text.Trim();
// 把当前用户名纪录在Session["username"]。
this.Response.Redirect("main.aspx");
//跳转到系统主界面。
}
else
Global.Alert(this,"用户名或密码输入有误,请重新输入!");
//如果查询结果为空,提示错误信息。
}
else
{
Global.Alert(this,"用户名或密码输入不完整!");
//如果用户名和密码栏由空值,提示错误信息。
Session["username"]=null;
}
}
登陆模块界面如图5-1:
图5-1 登录模块界面
注册模块里有两种注册方式:代售点注册和企业用户注册。代售点注册是针对火车站下属的售票窗口,企业用户注册是针对长期需要购票的企事业单位,如大中专院校和企业单位。这两种不同的注册方式要求用户填写的注册信息不同,但是它们的注册信息是存放在同一张表(user表)里面的。既然注册信息都放在一张表里面,那么如何区分两种不同的用户?本系统从user表里的两个字段来区分:一是“代售点编号”字段,如果是代售点注册,系统在用户注册时自动分配给该用户一个编号,如果是企业用户注册,该字段为空;二是通过“用户类型来区分”,如果是代售点注册,用户类型为“1”,如果是企业用户注册,该字段值为“2”,如果是高级管理员该字段值为“0”,这个字段的值在订票和买票操作中要用到,因为不同的用户类型他的提前订票和买票时间不同。
在注册页面当用户点击两个RadioButton按钮:代售点注册和企业用户注册,这两个组件的AutoPostBack属性的值都为True,并且它们Grounpname相同,当用户任意点击其中一个,系统会自动把用户选择返回给服务器,服务器根据选择的注册方式初始化页面,点击两个RadioButton出现的用户信息填写框不同。这里是把两种用户注册信息放到一个页面里,在页面的page_load事件里,判断是那种注册方式,根据不同的注册方式隐藏一种,显示另外的信息栏。
当用户点击确定(注册)按钮时,系统首先判断页面上所有的信息栏有没有空,有空则提示“信息输入不完整”,否则进入下一步判断,用户注册页面这里要求用户名6-16个字符,密码8-16个字符,所以这里要判断用户名和密码格式是否合法,密码和重复密码要一致,密码长度要合法。如果输入信息都满足上述条件,把用户的注册信息存储到user表(用户表)里面,然后系统跳转到注册成功页面,在此页面停留5秒钟,自动回到用户登录页面,这里用户也可以手动点击回到用户登录页面。
◆Button_queding_Click事件的核心代码如下:
this.sqlDataAdapter_user.InsertCommand.CommandText="insert into [user] (序号,用户名,密码,联系方式,负责人,代售点编号,具体地址,身份证,用户类型) values('"+xuhao+"','"+xingming+"','"+mima+"','"+lxfs+"','"+fzr+"','"+bianhao+"','"+dz+"','"+sfz+"','"+yonghuleixing+"')";//构造sql插入语句
if(this.sqlConnection1.State.ToString()=="Closed")
this.sqlConnection1.Open();//打开数据库连接
this.sqlDataAdapter_user.InsertCommand.ExecuteNonQuery();//执行插入语句
this.Response.Redirect("zhucechenggong.aspx");//跳转到注册成功信息页面
◆获取IP的代码如下 :
this.Label_IP.Text=Page.Request.UserHostAddress;
◆获取浏览器版本号的代码如下:
this.Label_LLQ.Text=Request.Browser.Version;
图5-2 注册模块界面
系统主界面是所有系统其它所有模块的入口,主界面上的所有按钮鼠标点击事件主要执行两种代码:一是直接跳转如:
this.Response.Redirect("xxx.aspx");,“xxx.aspx”是其它功能页面的名称,
二是在主界面的上弹出新的窗口,如:
string msg;
msg = "";
this.RegisterStartupScript("个人信息",msg);//执行javascript脚本
系统主界面如图5-3:
图5-3 系统主界面
在买票页面,用户需要输入购买的车次,开车时间,起始站,终点站,座位类型,是不是学生票,票数,等信息。这里要注意的是:当用户输入车次后,直接去点起始站和终点站的下拉菜单是没有可选值的,正确定操作是输入车次后,点确定,系统会根据车次把该车次的详细路段信息绑定到起始站和终点站的下拉菜单里面,为什么要输入车次后点击确定? 这就是B/S结构系统得特点,要想得到结果必须要把数据提交给后台服务器,如果只是输入车次不点确定,后台无法或者车次信息。同样的道理,当上面的车票信息都填写完后要点击价格按钮,系统会根据车次信息把价格计算出来,显示给用户。计算出来价格后,用户就可以点击购买按钮,进行买票。点击购买按钮后,系统首先从Senssion[“name”]里面得到当前登录的用户名,根据用户名在user表(用户表)里面找到该用户的用户类型,根据用户类型得出该用户的提前买票时间,然后把当前的系统时间和开车时间求差值,把这个差值和提前买票时间做个比较 ,如果差值大于提前买票时间,提示“不在购票期限内!”。否则,在dingpiao表(订票表)里面添加买票纪录 ,在tickets表(车次信息表)里把对应的车次对应座位类型的票数减去购买的票数。最后给出买票详单,买票详单上显示了车票的具体信息,这些字段信息是如何获得的?通常有两种方法:一,买票操作成功后,调用买票详单页面,通过URL把所有的车票信息传递过去;二,调用买票详单页面时,只传递车次,详单页面的page_load事件里面直接获取车次,根据车次去订票表里面查找购票信息,再把它们显示出来,本系统用的是第二种方法。买票详单上面有打印按钮,点击它可以把车票打印出来。
DropDownList_qsz(起始站下拉框)和DropDownList_zdz(终点站下拉框)两个下拉框开始时是空的,当用户输入车次后,点击“确定”按钮,系统会根据车次从数据库里面的ticketsinf表查询该车次的所有沿途站点,并把它绑定到DropDownList_qsz和DropDownList_zdz上,用户就可以从DropDownList_qsz和DropDownList_zdz里面分别选择起始站和终点站。
Button_quding_click(确定车次)事件里绑定起始站的核心代码如下:
dsbegin=new DataSet(); //存放起始站的查询结果
sql="SELECT 出发站 FROM ticketsinf"; /* 构造查询语句
sql+=" where 车次='"+ this.Text_checi.Text.Trim()+"'"; */
if(this.sqlConnection1.State.ToString()=="Closed") /*打开数据库连接
this.sqlConnection1.Open(); */
this.sqlDataAdapter_ticketsinf.SelectCommand.CommandText=sql; /*执行查询操作
this.sqlDataAdapter_ticketsinf.Fill(this.dsbegin); */
this.DropDownList_qsz.DataSource=this.dsbegin; //以下为绑定起始站代码
this.DropDownList_qsz.DataMember=this.dsbegin.Tables[0].ToString();
this.DropDownList_qsz.DataTextField=this.dsbegin.Tables[0].Columns[0].ToString();
this.DropDownList_qsz.DataValueField=this.dsbegin.Tables[0].Columns[0].ToString();
this.DropDownList_qsz.DataBind();
计算价格是本系统中比较复杂的一个模块。首先我们先了解一下铁路部门是如何计算车票价格的。火车票价格计算参数有四张表,它们分别是“普通列车硬座价格表”,“普通列车卧铺价格表”,“空调列车硬座价格表”,“空调列车卧铺价格表”
他们的大体结构如下[13]:
1.普通列车硬座价格表
图5-4 普通列车硬座价格表
2. 普通列车卧铺价格表
图5-5 普通列车卧铺价格表
3. 空调列车硬座价格表
图5-6 空调列车硬座价格表
4. 空调列车卧铺价格表
图5-7 空调列车卧铺价格表
本系统数据库中有四张表
(putongliechejiage,putonglichewopujiage,kongtiaoliejiage,kongtiaoliechewopujiage),分别与上面四张表结构相对应。下面讲具体实现价格计算的流程,
图5-8 价格计算流程图
价格计算的核心代码:(仅以普通列车硬座为例)
if((kongtiao=="")&&(zuoweileixing=="硬座")) //如果是普通列车硬座
{
this.sqlDataAdapter_putongche.SelectCommand.CommandText="select 里程,普通列车,普快列车,特快列车,空调费率 ,座位类型 from putongliechejiage "; //构造查询语句
if(this.sqlConnection2.State.ToString()=="Closed")
this.sqlConnection2.Open(); //打开数据库
this.sqlDataAdapter_putongche.Fill(this.dsputongche); //执行查询语句
int hangshu=this.dsputongche.Tables[0].Rows.Count; //记录查询结果的行数
if(leixing=="普通") //如果车辆类型为“普通”
{
for(int i=0;i { if(lucheng>=decimal.Parse(this.dsputongche.Tables[0].Rows[i][0].ToString())&&lucheng<decimal.Parse(this.dsputongche.Tables[0].Rows[i+1][0].ToString())) //判断路程是在那个范围内 {jiage=decimal.Parse(this.dsputongche.Tables[0].Rows[i][1].ToString())+decimal.Parse(this.dsputongche.Tables[0].Rows[i][4].ToString()); //得出价格 break; //退出循环 } } } 1.售票界面如图5-9: 图5-9 售票界面 2.票据如图5-10: 图5-10 车票票据 订票模块和买票模块共用一个界面,当在软件主界面分别点击买票和订票按钮时,通过URL传递给买票页面的参数(flag)不一样,买票页面在page_load事件里面先判断flag的值,如果flag=1,买票界面下面的用户信息栏(如图5-11)不显示,如果flag=2则显示用户信息栏。其它的操作原理基本一致,只是订票操作在dingpiao表中要记录的字段多一些,这里不再螯述。 图5-11 用户信息结构图 下面是订票产生的票据: 图5-12 订票详单 点击订票详单上面的打印机图标,可以把订票详单打印出来。 退票模块主要有两个功能:退票和退订,如果用户已经买到票,又想把票退掉,可以选择退票功能,前提是车票上的开车日期在退票之后,否则不能退;如果用户有过订票记录,但还没拿到票,现在又想取消订票,可以选择退订功能,退票和退订在合法的时间范围内返给用户的金额是原价的80%(本系统暂定为80%)。退订和退票的操作流程一致,如下: 选择退票方式-〉输入车次-〉选择时间-〉点“确定”-〉选择起始站和终点站-〉选择作为类型-〉输入票数--〉点“价格”-〉点退票。 这里要注意的是,如果用户选择的是退订方式,底下的用户信息栏用户要如实填写,即和订票时输入的信息要完全一样,否则退票操作不能完成。 用户选择退票时,系统重新加载页面显示退票要填写的信息栏。用户点退票按钮后,系统先判断所有的信息栏有没有空值,如果有给出错误提示“信息输入不完整” ,如果没有空值,获取系统时间,用车票上的开车时间减去系统时间得到差值,如果差值大于等于零,表示可以退票,把订票表里面的该条买票纪录删除,并在车次基本信息表的对应车次和对应座位类型票数上加上退票数。退票方式中用到的确定车次和计算价格和买票模块中的原理基本一样,唯一不同的是退票方式下的计算价格返回的是两个值,一个原价,一个现退金额,买票模块中的计算价格只返回一个价格。 退票功能的主体界面如图5-13: 图5-13 退票模块界面 退订方式和退票方式界面大体一致,只是退订方式比退票多了一个用户信息栏,实现的原理也差不多,只不过退订在删除订票记录的时候必须要验证订票用户信息,当用户名,身份证号都对应上,才可以删除该条订票记录,删除订票记录后,也要修改车次基本信息表的剩余票数。 退订方式的主体界面如图5-14: 图5-14 退订主体界面 查询模块的功能是当用户买票时,他只知道开车时间,起始站和终点站,但是不知道坐哪趟车,或者是用户想了解车次的详细信息等等。用户这些需求都可以通过查询功能来实现。查询模块的操作流程图如图5-15: 图5-15 车次查询流程图 1.DateGrid控件 DateGrid(数据网格)控件是用来把数据库中的查询结果展示给用户,使用之前先要设置好它的数据源和数据成员。当执行了查询语句后,填充数据集,再执行数据网格绑定,数据就可以展示出来。 本页面的DateGrid控件主要有以下几个事件: DataGrid_ItemComman事件。这个事件里面常用的命令有两种:select ,delete, DateGrid里面用到的是select命令,也就是我们在查询结果中看到的“购买”。如图5-16: 图5-16 车次查询结果 这个事件的代码如下: if(e.CommandName=="Select") //判断命令类型 { string flag=this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString(); //取当前行的索引 Response.Redirect("maipiao.aspx?flag="+flag); //跳转到买票页面,并传递参数flag } DataGrid的数据源是dateset_chaxun,数据成员是tickets,数据键字段是“车次”。this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString();这行代码的意思就是获取数据键字段,在这个数据网格中数据字段是“车次”。 Response.Redirect("maipiao.aspx?flag="+flag);这里面的flag参数传递的就是车次,用户点击“购买”后,系统会跳转到买票页面,那里面的车次字段,起始站和终点站字段系统会自动给它们绑定数据。用户只需要选择开车时间和座位类型等即可。 DataGrid_PageIndexChanged事件是DateGrid控件里面最常用的事件,它的功能是实现分页,用户可以自己定义DateGrid里面每页显示多少行(查询模块里面设置的是每页显示10行),当查询结果超过设定的行数时,DateGrid底线会出现分页符(“下一页”或者“1.2…”),点击它可以显示其与查询结果,它的代码如下: this.sqlDataAdapter_tickets.Fill(this.dschaxun); //重新填充数据集合 this.DataGrid1.CurrentPageIndex=e.NewPageIndex; //获取新的页面索引 this.DataGrid1.DataBind(); //绑定数据 2.查询功能代码 这里的查询方式有两种:按车次查询和按站点查询。按车次算法比较简单,这里不多讲,主要讲按站点查询。 按站点查询又分为三种方式:按起始站,按终点站,按起始站和终点站组合。 如何区分三种查询方式?这里使用的是判断起始站,终点站文本框里面是否为空,它们有四种组合方式,除去全空外,其余三种刚好对应三种查询方式, 判断查询方式的代码如下: if(this.TextBox_qsz.Text.Trim() !="" && this.TextBox_zdz.Text.Trim() !="") type="zh"; //起始站和终点站都不为空,查询类型为 “zh” else if(this.TextBox_qsz.Text.Trim() !="") //按起始站查询 type="sfz"; else if(this.TextBox_zdz.Text.Trim() !="") // 按终点站查询 type="zdz"; if(type!=null) { this.displayccxx(type); //调用查询车次函数 } 查询车次函数displayccxx的代码比较长,这里不具体给出,只讲一下查询原理。 讲原理之前我们首先了解一下tikcetsinf表(车次详细路段信息表)的结构如5-17,站点查询主要是查询它里面的数据。 图5-17 车次详细路段信息 调用查询函数时要传递查询方式参数(type)过去,如this.displayccxx(type),displayccxx函数的内部执行结构是这样的:用case 语句进行判断type的值,如果type=”sfz”,即按起始站进行查询,如果type=”zdz”,即按终点站进行查询,这两种查询方式原理其实是一样,它以出发站(到达站)作为查询条件,去搜索tikcetsinf表,把查询结果填充到dateset (数据集)中去,如果dateset .tables[0].rows.count >1,进行循环取每一行的车次字段值,然后以车次为查询条件对tickets表进行查询,把该车次的基本信息展示给用户。 组合查询(即有起始站又有终点站)方式:假如我们要查询从成都到北京西的车次信息,首先把ticketsinf表中的车次,出发站,到达站三个字段全部查询出来放到数据集的一张表里面,假如这张表名为table,用count纪录table表的行数。执行循环:(for i=0;i 如果table表里面的第一行的出发站等于成都,作标记flag1=1,并纪录该行的车次,然后再判断该行的到达站是否等于北京西,如果该行的到达站也等于北京西站,作标记flag2=2,如果flag1=1并且flag2=2,以该行的车次为条件对tickets表进行查询,把查询结果展示给用户;如果第一行没有满足条件,继续判断下一行纪录,假如某一行的出发站等于成都,但是它的到达站不等于北京西,而在下面的某行找到一行到达站等于北京西,这时候就要判断车次,因为ticketsinf表中纪录很多车次的信息,如果不判断车次是否相等,会出现查出错。如果结果在table 都查询完后仍没有满足flag1=1并且flag2=2 ,它们的车次相等,则说明没有用户要的车次信息。 图5-18 查询模块主界面 个人资料模块位于系统主界面上,用户登陆系统后,可以对自己的个人信息进行修改,但是用户自己不能修改用户类型和代售点编号。 个人资料对话框如图5-19: 图5-19 个人资料编辑界面 火车站如果发布了最新通知或者新闻,代售点或企业单位通过新闻模块了解最新的业内信息和一些车次变动信息。这里说的新闻模块是指用户看到的新闻页面,具体新闻的添加删除会在后面的用户管理里面详细谈到。 用户打开站内新闻页面时,页面就已经有新闻显示出来,比如今日要闻栏里显示的今天的所有新闻,以往新闻里显示的是所有的新闻纪录。新闻栏里显示的是今日新闻的第一条新闻,这些都是不用用户操作 直接显示出来的,所以它们的代码都是在 Page_load事件里面执行的。 今日要闻的实现原理是:从系统获取今天的日期,以它为条件所有数据库里的xinwen表(新闻表),然后把查询结果的新闻标题绑定到DataGrid_jryw(今日要闻_数据网格),这里要注意的是,从xinwen表里面查询出来的新闻标题可能很长,如果直接绑定到DataGrid_jryw中去可能界面比较乱,所以在绑定之前先要对查询结果进行处理,这里是利用循环语句把查询结果所有的行都执行substring(0,10)方法,这样标题就只显示前10个字符,substring是string()自带的方法。 以往新闻的代码原理和上面一样,不同的是它无条件的执行查询语句,即查询所有新闻内容。 新闻模块的界面如图5-20: 图5-20 新闻中心界面 该功能在系统的主界面上,它的作用是把用户在使用系统中遇到的问题,或者意见建议及时地反馈给管理员,为系统的升级和完善提供参考意见。意见反馈模块被调用时是以窗口形式出现在主界面上的。用户填写好意见标题和内容后,点击“提交” 按钮,用户意见将被保存到liuyan表(留言表)里面。意见反馈界面如图5-215.4.4售票模块界面
5.5订票模块
5.6退票模块
5.6.1退票方式
5.6.2退订方式
5.7查询模块
5.7.1查询模块关键代码
5.7.2查询模块主体界面
5.8个人资料模块
5.9站内新闻模块
5.10意见反馈模块