火车票网上订购系统
2
2007-6-20
1. 概述 ……………………………………………………………………………………….3 2. 系统总体结构实现 ……………………………………………………………………..3 3.
现层实现 ……………………………………………………………………………….6 4. 持久层和业务逻辑层实现 ……………………………………………………13 5. 系统维护与拓展 …………………………………………………………………………18 6. 结语 ………………………………………………………………………………………..19 7. 附录………………………………………………………………………………20
1. 系统名称:火车票网上订购系统
2. 第二小组成员:
041251015 陈松宇
041251031 段永伟 (
人)
041251041 谷博
041251046 郭庆涛 (组长)
3. 系统运作平台:Windows XP SP2,Jakarta Tomcat 5.5.20以上兼容版本 4. 开发平台:Windows XP SP2 & Ubuntu Linux 7.10, Eclipse 3.2
5. 采用技术:本系统采用基于ZK 2.3.0 + Spring 2.0 + Hibernate 3.0三层分离的B/S
架构
6. 系统功能概述:
a) 注册或非注册用户均可通过本系统查询全国范围内十日内的铁路车次信
息,以及各车次车票的价格和销售情况;
b) 注册用户可以通过本系统前端服务网站进行登录,然后订购全国十天内的
铁路(具体某些线路可能提前预售天数会有所不同)车票。
本系统采用基于ZK 2.3.0 + Spring 2.0 + Hibernate 3.0三层分离的B/S架构
表现层 业务逻辑层 持久层
ZK 2.3.0 Spring 2.0 Hibernate 3.0
项目工程文件的目录结构主要分为两个部分—前台的页面文件、以及后台逻辑的实
现代码文件:
1).本项目工程名称:ticketorder,为此目录结构的根。 2).src目录为系统后台处理主要逻辑的Java代码。
a).bean目录下面存放的是系统的一些相关的实体类。包括用户信息、车次信
息、订单信息、车站公告等等。
b).dao目录下面存放的是系统的后台处理逻辑类。 3).WebRoot目录存放系统前台页面文件。
a).admin目录下存放的是系统的后台管理中心的页面文件。 4).work目录下存放的是系统数据库的建库脚本:train_station.sql。 5).其他的.jar文件是本系统所使用的库文件。
1).
2).
ZK是一套以AJAX/XUL/Java 为基础的网页应用程式开发框架,用于丰富网页应
用程式的使用界面。利用ZK框架设计的web应用程序具备丰富的胖客户端特性和简单
的设计模型.ZK包括一个基于AJAX可自动 进行交互式操作的事件驱动引擎和一套兼
容XUL的组件.利用直观的事件驱动模型,你可以用具有XUL特性的组件来表示你的应用程序并通过由用户触发的监听 事件来操作这些组件,就像开发桌面应用程序一样简单.ZK还可以与现存一些框架和技术相结合如:JSF和Portals.
ZK
a).相比Struts, JSF等表现层框架来说,页面的渲染以及客户端的事件响应方面,ZK
都提供了具有绝对优势的便利,并且ZK对客户端的事件响应不仅仅单纯依赖于
JavaScript,我们还可以用Java、Groovy、Ruby、Python等取而代之。使用我们熟悉的语言的编写事件处理可以说提高了不少效率,至少可以说避免了JavaScript难以调试这个问题。
b).ZK提供了一套基于XUL的桌面化组件,对于网站页面的布局及美工的工作来
说提高不少的效率。
c).ZK同时提供了一个基于AJAX可自动进行交互式操作的事件驱动引擎,这明显
可以在一定程度上提高用户的体验满意度。用户不必再为了一个简单的请求而再一次等
待一个又一个的页面缓慢地载入。
表现层与后台的交互主要通过系统的控制流处理模块以及业务逻辑来完成,这里不
对系统的业务逻辑代码作过多的阐述,主要注重与以下几个方面的实现:
a).前台与后台的数据交换:
对象
总的来说,前后台的数据主要是通过将数据封装成一个个实体对象,如src/bean/目录下的User,Reservation,Route,Message等等。我们可以利用Spring的JavaBean管理机制轻松的达到这个目的。
还有一部分的数据交换,如用于更新页面DOM模型的部分数据,与服务器的交互
是通过ZK提供的AU引擎来做到的。我们在页面利用AJAX技术异步地传输这些有关页面更新的事件信息,经由服务器端的AU引擎处理,并及时地返回页面更新的结果,
在经过客户端的JavaScript脚本引擎的解释,最终达到在不刷新页面的情况下更新页面
元素的效果。带来的好处无非就是可以让用户少一些无谓的等待时间,同时也节省了一
部分网络带宽。
b).页面控制流的跳转:
org.zkoss.zk.ui.Executions.sendRedirect(java.lang.String url);
利用此方法在前台页面随意自由的进行页面跳转。至于说页面间的数据共享或
者会话保持,是通过org.zkoss.zk.Session来实现的。
如上,设计本着界面简洁、符合大众使用习惯的原则,首页的布局
主要分为网站Logo、用户导航、侧边工具栏以及主体部分。
用户导航栏提供了在系统的不同页面之间进行方便的跳转;
同时,用户可以通过侧边栏进行快速登陆、注册及车次查询等。
主体部分的车站公告的特点是所有消息都是及时更新的,一旦后台 管理员在线发布了新的一条公告,那么前台页面就会立即得到最新的消息,而
无需对该页面进行重新部署。
用户登陆的消息都通过一个模态对话框进行通告。而不需要进行多
一次的页面跳转,充分考虑到了用户的使用便利方面的因素。
用户的订单填写主要考虑了如下问题:
最大限度地保证用户填写信息的有效性:这是通过AJAX技术实时异步地与后台交互,检查用户填写的如车次信息、用户名、密码、信用卡号等资料
是否与数据库中的有效地符合,如若不是,系统将及时给出提示信息,并且在
用户信息保持无效的情况下将限制该订单的提交。
一旦用户通过订票中心提交了一次订票申请,用户可以马上在其用户
控制面板察看自己所有订单的处理情况。对于订单状态仍处于NEW的,即表示该订票申请仍被处理,用户可以取消该订票。
这是为火车票定购系统管理员所提供的在线订单管理页面。
管理员可以对所有订单进行查看、处理、删除等操作。
管理员同时可以在线实时地为火车票定购前台发布最新的系统公告。
一. 持久层实现
类图:
类图原图
如图所示:持久化采用DAO模式,三个Agent(UserAgent, RouteAgent,
ReservationAgent)负责查找和存储相应的数据库对象(User, Route, Reservation)。此外,UserAgent提供用户注册,用户登陆,用户有效性验证等功能;
ReservationAgent提供车票预定,预定查询等功能,而RouteAgent提供车次查询,车次更新等功能。
通过采用Factory 模式,由AgentFactory创建三个Agent,同时AgentFactory还要数据库连接等资源。
顺序图:
a. 路线的查询过程
原图
b. 用户注册过程
register 原图
c. 车票预定过程
车票预定原图
二. 业务逻辑: a) 用户注册
用户填写注册表单,系统要求用户填写的用户名不得与其他用户名重复,否则
这册失败。 b) 车票预定
只有注册过的用户才可以进行预定,每次预定过程中,系统都会对用户有效性
进行检查。系统默认每条线路每天都有发车,如果所预定的线路在预定日期的
发车的剩余车票小于该预定所要求的车票数,则预定失败。
c) 线路查询
用户可以查询某个日期内,某条线路的详细情况。系统支持的查询条件包括,
线路的起点,终点,发车日期等。
三. 部分实现代码:
a) Factory 类
class AgentFactory
{…..
public UserAgent getUserAgent()
{
if(usrAgent == null) usrAgent = new UserAgent(session);
return usrAgent;
}
public ReservationAgent getReserveAgent()
{
if(reservationAgent == null) reservationAgent = new ReservationAgent(session, usrAgent,
ruteAgent);
return reservationAgent;
}
public RouteAgent getRouteAgent()
{
if(ruteAgent == null) ruteAgent = new RouteAgent(session);
return ruteAgent;
}
} b) UserAgent 类
class UserAgent
{
private Session session;
UserAgent(Session session)
{
this.session = session;
}
public boolean register(User customer)
{
boolean success = true;
if(customer.getName() == null) success = false;
else if(userNameExist(customer.getName())) success = false;
else
{
session.save(customer);
}
return success;
}
public boolean login(String name, String password)
{
boolean success = true;
if(!userNameExist(name)) success = false;
else
{
User usr = (User)session.load(User.class, name);
if(!usr.getPassword().equals(password)) success = false;
}
return success;
}
public boolean userValid(String name)
{
return userNameExist(name);
}
public boolean userNameExist(String name)
{
boolean exist = true;
if(name == null) exist = false;
else
{
Object obj = session.load(User.class,name);
if(obj == null) exist = false;
}
return exist;
}
}
维护:
1. 数据库维护
, 对数据库中的火车票信息和客户预约信息创建索引,使得查询时速度更快
, 定期对数据库进行备份,将用作数据统计的已兑现的预约信息移存到其他存储设备中,
使得服务器端保存的数据是最新,访问频率最高的 , 另外数据库定期删除无效信息,以使得数据库的存取性能最优化 2.软件更新和升级
, 对软件在使用期间可能存在的问题进行修正,提供补丁和程序更新 3.硬件的日常维护
, 服务器的售后服务为生产商提供
, 对于常见的硬件维护,如内存的更换,存储设备的更换,则由我方提供
拓展:
1.在设计阶段,设计方提出与电信运营商合作提供短信定制电子化车票的技术
还没有
实现,因此我方决定在第一期产品投入运行以后,在产品服务和技术成熟的条件下对产品进
行拓展,将支持短信定制车票的功能添加到产品中 2.若招标方对产品提出了新的功能,如火车站与所在地区的大学进行合作,在假期可以为
大学生提供团体订购服务,从而节省了大学生订购火车票的难题 3.该产品还可以横向发展,不仅仅提供火车票网上订购,还可以提供其他交通工具(如飞
机,长途汽车)的网上订购
产品售后服务承诺
尊敬的招标方:您们好!
首先感谢您对我们小组的信任和支持,为了让您得到更好的售后服务,同时
维护您的权益,我们特制定如下承诺:
凡购买我公司产品保修两年,在质保期内出现质量问题,本公司免费维修,终身
提供技术支持及配件。售后服务不受时间限制,在接到电话后立即派人解决,听
取用户反馈意见并及时处理。如果您在使用我们的产品时遇到问题,欢迎随时与
我们联系。
技术服务内容:
a. 为用户提供技术
,包括现场操作培训,设备维护和维修培训。
b. 组织工程技术人员开展定期跟踪服务
c. 负责用户设备安装和日常维护的指导
d. 免费为用户提供技术咨询服务,免费提供软件升级。
本项目是在这一学期中通过招标、投标、需求分析、详细设计和最终实现,在这几个阶段中
项目进行了轮换,因此感谢招标方,需求分析方和详细设计方在前期作出的努力以及在最后
阶段和我方的协助合作!
最终软件产品已经可以使用,由于技术和开发经验方面还有所欠缺,产品中可能还存在不足
的地方,希望各方在试用后提出宝贵的意见和建议! 另外,产品能够最终实现也离不开在项目每个阶段课程老师和助教的及时检查和各小组的评
审
最后感谢小组成员在工作上的共同努力!