航空客户管理系统-项目评审
不知不觉实训也将近一个月了,基础的C#知识差不多也都过完了,我们随即迎来了第一个项目--航空客户管理系统。
三天了,项目做完了,也评审完了,从最初的对整个项目复杂的流程想得头昏脑胀到慢慢地经过自己的思考慢慢将项目做出来,这个过程是艰辛的,有时候真是写的心烦意乱,但是还是克服了下来,真的没有什么不可以,当时十分怀疑我能不能完成这个系统,到现在我坐在这里写感想。这几天让我真的明白了不少,尤其是今天的评审,在没有评审之前我觉得自己将这个项目研究了出来,虽然集成度不高,但是是自己写出来的,总是会有一点点窃喜。但是,今天的评审看到大家做的都那么好,系统功能齐全,上去演讲项目透彻、清晰,真的觉得自己一直以来其实都只是生活在自己狭小的一个圈子里,更不用说平时跟周围同学讨论,也没有借鉴到别人好的学习方法,当时拿到这个项目时我第一反应时间是赶紧将老师讲的思路给记下来,全班同学交流地热火朝天,唯有我一个人安安静静地想整个系统的流程。到最后,我的程序只完成了老师的要求,没有一点创新,考虑也不周全,是我对自己要求太松了,鼠目寸光,这是本次项目我最大的感想,同时也是最大的收获,再接下来的学习生活中我一定要慢慢改正这个缺点!
进入正题吧,下面就是我整个项目的流程和设计思路:
航空客户管理系统小型需求分析:
1、航空客户管理系统实现多个客户端与服务器端进行通信操作,客户端可以将自己的操作要求发送给服务器端,服务器端接收之后会有相应的结果返回。
2、为了让客户端与服务器端明白互相想要什么操作,引进了包文,通过在服务器与客户端之间传递一定格式的包文来实现相应的操作,但前提是首先规定一条客户端与服务器端相互遵守的准则(例如,规定1是查询 2是添加 3 是删除 4是修改)
3、包文的定义:建立一个包文的类,分为三部分:
第一部分可以定义一个字段表示是具体实现什么操作(客户端和服务器端都识别的操作规则);
第二部分用来保存相应的操作所需要的数据,例如添加的时候客户端需要把要添加的数据放在这个部分传递给服务器, 由服务器去硬盘接收数据(反实例化的过程)然后根据传来的数据做相应的处理。
第三部分保存服务器端处理好数据后返回的一个反馈信息,比如:返回给客户端添加成功。
4、服务器与客户端之间链接问题:
对于客户端:当它有要求时就会发送相应操作的包文给服务器端(序列化过程),此时客户端并没有断了链接也没有一直执行其他的操作要求,而是一直在等待服务器的回应,服务器端接收该包文后(反序列化过程)经过一系列的解读,执行了相应的操作,将处理后的数据封装到包文中发送给客户端,此时客户端得到了返回的结果,才会中断此次通信链接。
5、序列化过程,将数据存放在硬盘
|
下图是整个系统的业务流程(多个客户端可以同时发请求给服务器)
下面是我做的这个系统的一些文档:
一、项目的整体框架
整个项目分为三个程序集:
1、服务器端:
2、 客户端
3、类库:将服务器端和客户端 都共同使用的类存放在这个类库中,外部的程序集要想使用这个类库必须先添加这个类库的引用
1、类库中定义的类:
(1)异常类(BusException);
(2)包(客户端服务器端进行通信通过包,发送给服务器的包和从服务器返回的包);
Package类:定义了一个抽象的包类,包含一个抽象字段mark,于客户端与服务器端发送操作指令的代号
ChangePackage类:定义一个用于保存添加信息的包类,继承抽象的包Package,除了一个覆盖积累的字段mark,该类还定义一个Customer类型的属性Customer用于操作类Customer的一个对象
QueryPackage类:如果客户端要求检索客户信息时会发送这个包到服务器端,服务器端到硬盘取出数据然后将取出的数据包装在这个包中,然后返回给客户端。这个包继承抽象的包Package,除了一个覆盖基类的字段mark,该类还定义了一个List<Customer>类型的属性Customers用于操作客户信息的集合List<Customer>,当服务器到硬盘读取出数据时会将取出的信息赋值包中的这个属性,然后将包发送到客户端,客户端接收到包以后取出数据直接进行操作。
ReturnPackage类:该包用于向客户端传递服务器端相关处理后的反馈信息,除了一个覆盖积累的字段mark,该类还定义了一个string类型的字段Str,用于保存服务器要发送给客户端的反馈信息。
UpdatePackage类:如果客户端要修改客户信息就会使用这个包,
该包继承包类ChangePackage实现客户端发送修改客户的请求
服务器端服务器可以根据接收的包做相应的处理,由于修改客
户信息是根据客户×××号检索要修改的客户信息的,所以应
用包将用户输入的客户×××号传送到服务器端,故在该类中
还定义了一个string类型的字段id,用来保存用户输入的要修改
客户的×××号。
TicketPackage类:如果客户端想要为指定的客户添加票务信息时就需要使用这个包传递给服务器,让服务器执行相应操作。在该类中除了覆盖基类Package的属性Mark外,还有一个string类型cardid字段用来保存用户要选择添加票务信息的客户,还有一个Ticket类型的ticket字段,用来保存用户要添加的订票信息。
(3)几个实体类:
Customer类(客户的基本信息):
字段
|
类型
|
说明
|
cardid
|
string
|
×××号
|
id
|
int
|
编号
|
integral
|
int
|
积分
|
mobile
|
string
|
手机号
|
name
|
string
|
姓名
|
tickets
|
List<Ticket>
|
客户的订票信息
|
Ticket类(票务的基本信息):
字段
|
类型
|
说明
|
Id
|
id
|
编号
|
datet
|
datetime
|
订票日期
|
fightnumber
|
string
|
航班号
|
price
|
double
|
机票价格
|
CustomerSet类(保存客户信息的集合)
TicketSet类(保存客户的订票信息的集合)
2、服务器端:
Program:不断接收客户端发起的请求,反序列化得到客户发来的包,然后根据包中mark字段确定要具体实现什么操作
Server BusMemory:处理服务器与磁盘进行数据的的写入和读出,写入时使用InMemory(序列化过程,没有返回值),读取数据OutMemory(反序列化过程,返回意义List<Customer>)
BusOpt:处理客户端发来的请求,具体实现的过程,实现客户信息的添加、修改、机票信息的添加和客户端发来的要求查询客户信息的数据的返回
Program:主界面的布置,提示用户选择操作,根据用户的选择跳转相应的业务处理类
ManageCustomer:如果用户选择客户信息管理,就会跳转到这个类,实现用户输入要添加或者要修改的客户信息,然后封装成要发送的包,最后调用BusTransport的Transport方法将封装好的包序列化发送给服务器
Client
ManageTicket:如果用户选择为某个客户添加机票信息,就会跳转到这个类,然后提示用户输入信息封装成包,最后调用BusTransport的Transport方法将封装好的包序列化发送给服务器
QueryCustomer:如果用户选择查询某个客户信息的时候就会跳转到这个类,提示用户输入要查看的客户的×××号,最后封装成包,调用BusTansport的Transport方法将封装好的包序列化发送给服务器
BusTransport:该类用来实现与服务器信息的交互,是一个可序列化的类,向服务器发送请求后等待服务器的处理后解读服务器发来的反馈信息显示在客户端主界面。
二、项目的整体设计思路:
1、整个系统实现对客户信息的添加、修改、查看和添加某一个指定的客户的订票信息,系统功能比较简单,但是要实现在客户端发送这个操作的请求,然后去服务器执行,最后将反馈信息返回给用户。整个系统分为三层架构:
(1)表现层:界面的显示,主要实现与用户信息的交互
(2)业务逻辑层:处理整个系统管理过程中所有的操作和处理
(3)数据处理层:实现将整个系统的数据写入和读出硬盘
转载于:https://blog.51cto.com/fayling/631047