还剩63页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
通讯计费系统设计文档管理信息表主题计费系统版本V
3.0内容设计关键字计费参考文档中国__设计需求创建时间2004-07-21创建人冯昌建最新发布日期2005-07-21TOC\o1-3\h\z\u前言21__的背景和__技术简介
21.1什么是__计费系统
31.2___要大力____计费系统
31.3__计费系统的主要应用系统32系统分析
42.1可行性分析
42.2用户需求分析
42.3需求详细说明
52.4模型分析
72.5__环境分析83系统设计
93.1设计目标
93.2系统功能模块划分
93.3系统用例图104数据库设计
114.1数据库需求分析
114.2数据库的建立
114.3数据库系统体系结构
114.4数据库系统的组成
124.5数据库设计理念
124.6数据库设计内容
124.7数据库结构设计
134.8数据表之间的__
195.1数据库的访问
205.2前台母版制作
205.3前台各功能的实现
225.4后台功能的实现23采集服务端24采集客户端28数据整合端376系统测试
426.1软件测试常识
426.2系统测试环境及__工具
436.3系统功能测试437结论
537.1本站特色
537.2不足之处
537.3个人总结53前言计费系统已不再是传统意义上整个__业务的附属,随着__业务的高速发展,它已经成为__运营支撑系统(OSS)实现运营收入的源头和依据__计费系统的准确性、实时性直接关系到____质量和__运营商的收入随着__市场竞争从“网络竞争”向着“客户竞争”的演变,计费系统已成为__运营商的核心竞争力之一__计费系统采用了MyEclipse__工具,MySQL数据库服务器,前台的用户账单查询系统采用的是Tomcat应用服务器采用MVC经典模式,表示层用了JSP,控制器用了Struts1,使用这种设计模式使得业务层和逻辑层分离开来而且也提高了__速度,根据需求分别用到了JDBC和Hibernate框架来对数据库进行访问本设计说明书主要介绍了系统的背景意义、系统分析、系统,数据库设计以及功能实现1__的背景和__技术简介
1.1什么是__计费系统__营运计费系统是一个计费的系统,要想对用户进行准确的收费,首先必须能够获得用户使用开放验室的准确的使用记录,数据挖掘系统就是为获取这些记录而提供的数据挖掘系统分为数据采集和数据整合2个部分数据采集开放实验室是一个Unix服务器,Unix服务器本身就具有记录系统日志的功能用户每次登录和退出Unix服务器的信息都会被自动保存到一个在线日志文件/var/adm/wtmpx中采集系统通过调用Unix系统函数来读取这个日志文件中的内容,然后对读取到的内容进行整理,整理为方便计费的数据,其中包括登录名、登录时间或登出时间等作为计费依据的数据最后把这些数据存入数据库中,以备其他系统使用为了使读取的数据量不至于过大,采集系统会每小时定时执行一次,每次只采集上一个小时时间段之内的数据采集系统定时将用户使用服务器的数据存入到了数据库中,但这些数据都是流水帐的数据,是用户每次使用UNIX操作系统的用时如果用户量大,用户频繁地登入/出,将产生大量的数据,不便于将来生成用户的月账单使用情况进行月统计和年统计,因此,出现了整合系统,整合系统的出现提高了用户查询账单的速度
1.2___要大力____计费系统计费系统已不再是传统意义上整个__业务的附属,随着__业务的高速发展,它已经成为__运营支撑系统(OSS)实现运营收入的源头和依据__计费系统的准确性、实时性直接关系到____质量和__运营商的收入随着__市场竞争从“网络竞争”向着“客户竞争”的演变,计费系统已成为__运营商的核心竞争力之一__计费系统已不再是被动的后台系统,而其作为整个__行业的核心竞争力所在的地位日益巩固,已经成为整个__系统的灵魂它能有效地提供服务,降低运营成本,提高运营效率无论是运营商、内容提供商还是各分销商必须给予它足够的重视,才能在群雄逐鹿中占居有利地位
1.3__计费系统的主要应用系统__计费系统是BOSS(业务运营支撑系统)的一部分目前国内还处在BOSS建设的初级阶段,首先能做到的是将业务流程中某个环节中的不同业务进行纵向整合,如帐务管理中的长话、市话、数据各部分的整合,以及服务不同业务的综合客服系统智能网上__的业务、IP业务等,基础网络本身能够实现计费功能,这时就需要系统具有很强的整合能力,将各项使用费汇总计算出用户应支付的费用2系统分析
2.1可行性分析在__市场竞争的环境下,计费系统是__运营商进行市场竞争的最重要的核心支撑系统,是__公司进行市场运作的神经中枢__公司都把计费系统的建设和有效运行作为提高服务质量、增强自身竞争实力、__业务量上升的重要手段;“提高服务质量、参与市场竞争”需要计费系统的有力支持目前看来,__营运提供__服务所产生的服务质量问题,越来越集中在__计费系统领域现在用户__和投诉的热点,如资费政策的执行、话费争议、查询难等问题都与计费系统息息相关;“维护__运营商自身利益和效益”需要计费系统的有力支持作为计费系统,不但要做到准确地完成各项业务的费用计算,还要及时回收资金、最大程度地减少欠费,提高企业资金的利用率在目前竞争环境下,互联互通普遍存在,保证网间结算费用及时回收、不发生流失,成为计费系统一项很重要的任务每一个__运营商的计费系统都应该有足够的手段判定结算费用的实际数目、判断互联对方结算报表的客观性、合理性,确保网间结算“以我为主”而不能“以对方为主”,并能够提供充分有力的结算依据;“市场经营决策”需要计费系统的有力支持__市场竞争的不断加剧,要求__运营商的市场经营决策必须科学化、理性化一个决策的失误,可能给__公司带来难以弥补的损失、甚至危及企业的生存计费系统掌握着__公司运作的大多数企业数据,其中蕴涵着企业经营态势、客户群分布特征及消费习惯、各项业务发展状况等非常有价值的信息,应该尽快着手加以挖掘和利用,辅助__市场经营决策
2.2用户需求分析__运营商新增一项OpenLab(开放实验室)出租业务,即该__运营商提供基于Unix平台的实验室环境,选择使用这种业务的用户能够远程登录到实验室中做基于这个实验室环境的一些工作和实验运营商希望借助先进的计算机技术对访问实验室的用户进行管理和计费,由此实现对此项业务运营的支持与管理本系统主要涉及的是后台的数据挖掘和前台的用户账单查询用户成功登录账单查询系统后可以快速查询月账单以及详细账单由于后台的数据采集到的数据是流水账的数据(用户1小时内每次使用UNIX操作系统的用时)如果用户量大,用户频繁登录登出,将产生大量的数据,当用户需要查询账单时,查询速度会大大降低,为了提高查询效率出现了数据整合系统,数据整合系统是对原始数据进行时整合,天整合,月整合
2.3需求详细说明图
2.1数据挖掘部署图
2.
3.1数据采集客户端模块采集系统:由系统定时启动扫描系统的登录历史文件(wtmpx)并且分解此文件,把用户登录/登出实验室的数据发送到服务器端由于系统本身分散的特点采集点与数据存储点是分散的,数据是用Socket进行传输的,此传输方式的优点是数据库安全;缺点是面向底层__,需要处理多线程、数据传输失败等细节图
2.2数据采集用例图
2.
3.2数据采集服务端模块数据采集服务端负责接受客户端发送过来的数据,并且将这些数据存储到数据库服务器中图
2.3数据采集存储点说明图
2.
3.3数据整合模块把采集的原始数据按用户或按实验室进行统计整合便于实验室和用户快速查询个人的应交费情况整合分为按实验室整合与按用户在不同实验室上的整合不同用户在不同实验室上的数据整合规则一小时内的数据整合成一条记录单独存放在一张表中-天表detaildays_x一天内的数据整合成一条记录单独存放在一张表中-月表detailmonths_x一个月内的数据整合成一条记录单独存放在一张表中-年表detailyears_x(这三张表结构完全一样,除时间范围具体的值不同.因为该表查询的频繁度很高,在设计的时候设计成天表31张,月表12张,年表根据年份一年一张)按不同实验室的数据整合一小时内的数据整合成一条记录单独存放在一张表中-天表detaildays一天内的数据整合成一条记录单独存放在一张表中-月表detailmonths一个月内的数据整合成一条记录单独存放在一张表中-年表detailyears注意该表的查询主要是运营商在统计运营情况的时候使用,使用频率相对较低设计的时候采用每种表各一张图
2.4整合系统用例图
2.
3.4用户账单查询模块用户可以通过该系统修改个人的信息资料或查询个人的交费情况.用户应该交纳的费用公式交纳费用=登录时长*资费单位费用+资费基本费用.用户使用实验室的时长公式:登录时长=用户登出时间-用户登录的时间.
2.4模型分析由于系统本身分散的特点采集点与数据存储点是分散的,数据是用Socket进行传输的,此传输方式的优点是数据库安全;获取用户使用实验室的准确记录有三种情况
1.利用操作系统自身的记录日志的功能;
2.利用开放式实验室的个人web主页功能;
3.使用开放实验室的e__il功能本系统中只对操作系统自身的功能进行处理本系统是一个j__a+JDBC+Hibernate+Struts1+MySQL数据库__的__计费系统,由前台的账单查询于后台的数据采集、整合两个部分组成
2.5__环境分析
2.
5.
1.集成__工具MyEclipse:,Eclipse是一个开放源代码的、基于J__A的、可扩展的软件__平台它专注于为高度集成的工具__提供一个全功能的、具有商业品质的工业平台它不仅仅是一个J__A的IDE,更通过插件的形式提供其他集成软件__工具的基础它能扩展到任何语言的__,甚至能成为__绘制的工具MyEclipse企业级工作平台(MyEclipseEnterpriseWorkbench,简称MyEclipse)是对EclipseIDE的扩展,利用它我们可以在数据库和J2EE的__、发布,以及应用程序服务器的整合方面极大的提高工作效率它是功能丰富的J2EE集成__环境,包括了完备的编码、调试、测试和发布功能,完整支持HTMLStrutsJSFCSSJ__ascriptSQLHibernateMyEclipse是一款功能强大的J2EE集成__环境,支持代码编写、配置、测试以及除错
2.
5.
2.数据库MySQL本系统采用MySQL,MySQL是一个高性能、多线程、多用户、建立在客户—服务器结构上的RDBMS,专门为了速度和稳定性而设计相对于像Oracle和MicrosoftSQLServer一样的更商业化、非开放源代码的系统来说,快速、健壮和友好的数据库引擎、高级的数据管理和恢复工具、不断改进的特性__、遵守现有的SQL标准、友好的商业许可原则,都是促成MySQL成为可实施的选择因素MySQL的较低总体拥有成本和更稳定、更安全的系统特性,使越来越多的企业把他们的系统移植到MySQL,并且收获着MySQL开放源代码带来的效益MySQL的特征高性能、可靠性、可扩展性、可移植性、开放源代码、还有容易使用,遵循现有标准,国际化,广泛的应用程序支持等特征
[2]
2.
5.3应用服务器Tomcat Tomcat服务器是Apache组织__的一种JSP引擎,本身具有WEB服务器的功能,可作为__的WEB服务器来使用但在作为WEB服务器方面,Tomcat处理静态网页时不如Apache迅速,也没有Apache健壮,所以一般将Tomcat与Apache配合使用,让Apache对网页的静态页面请求提供服务,而Tomcat专为JSP做引擎,提供JSP解析,以得到更好的性能并且Tomcat本身就是Apache的一子项目,所以Tomcat对Apache提供了强有力的支持本设计采用的是3系统设计
3.1设计目标对于典型的数据库管理系统,尤其是对__这样的数据流量特大的系统,必须要满足快速查询、操作灵活等设计本系统在设计时应该满足以下几个目标a.要对Unix产生的日志文件wtmpx进行备份;b.采集数据时客户端向服务端发送数据失败或者服务端接受数据失败时要把这些数据存起来,以便下次重新发送这些失败数据;c.采集系统定时将用户使用服务器的数据存入到了数据库中,但这些数据都是流水帐的数据,是用户每次使用UNIX操作系统的用时如果用户量大,用户频繁地登入/出,将产生大量的数据,不便于将来生成用户的月账单和对开放实验室的使用情况进行月统计和年统计,因此,要对这些数据进行整合即按实验室和用户的时整合、天整合、月整合d.本系统的前台用到了Strut__VC模式,用Struts框架提高了__速度,使得业务层与视图层分离开来,便于系统的可维护性;
3.2系统功能模块划分1)后台模块划分后台是一个C/S架构,有3个模块,分别是数据采集、数据整合、数据模拟数据采集模块由系统定时启动扫描系统的登录历史文件把用户登录/登出实验室的数据采集并分析处理后存储到数据库服务器.整合系统:把采集的原始数据按用户或按实验室进行统计整合便于___统计查询或便于用户查询个人的应交费情况.2)前台模块划分前台是用户所使用的界面,用户可以通过此界面进行登录、查看个人信息、修改个人信息以及查询业务账单用户登陆模块个人信息维护模块可以查看和更改个人基本信息;账单查询模块可以查看业务月账单以及月详细账单
3.3系统用例图图
3.1后台模型图图
3.2前台流程图4数据库设计数据库在一个信息管理系统中占有非常重要的地位,数据库结构设计的好坏将直接对应用系统的效率及实现的效果产生影响合理的数据库结构设计可以提高数据存储的效率,保证数据的完整和一致这里我采用了MySQL来实现__后台数据挖掘系统和__前台的用户自服务系统数据库我的数据库设计包括如下几个步骤
4.1数据库需求分析收集基本数据、数据结构及数据处理的流程,组成一份详尽的数据字典,为后面的具体设计打下基础通过对系统功能的分析总结出如下的需求信息
1、用户信息表(users)
2、资费信息表(pricings)
3、用户业务帐号信息表(userservi__s)
4、数据原始表(details_x)
5、用户时整合表(detaildays_x)
6、用户天整合表(detailmonths_x)
7、用户月整合表(detailyears_x)
8、实验室时整合表detaildays
9、实验室天整合表detailmonths
10、实验室月整合表(detailyears)
4.2数据库的建立数据库的访问方式JDBC和Hibernate J__a提供了数据库访问的应用程序接口Jdbc,通过这些接口可以操作后台的强大的数据库,另外开源框架Hibernate对JDBC进行了轻量级的封装,可以使程序员用面向对象的思维方式来操作后台的数据库,本系统用JDBC实现了数据采集,数据整合,费用查询的数据库访问,用Hibernate实现了用户登陆,修改个人信息,查看个人信息的数据库操作本系统采用的数据库为MySQL
4.3数据库系统体系结构数据库系统体系结构是指数据库系统的组成构件(Component)、各构件的功能及各构件间的协同工作方式数据库的体系结构主要包括外模式,模式,内模式三级体系结构三个模式中模式是内模式的逻辑表示;内模式是模式的物理实现;外模式则是模式的部分抽取三个模式反映了三种不同的观点模式表示了概念级数据库,体现对数据库的总体观;内模式表示物理数据库,体现对数据库的存储观;外模式表示用户数据库,体现了数据库的用户观总体观和存储观只有一个,而用户观可能有多个,有一个应用就有一个用户观两种映射在三个模式之间存在着两种映射模式-外模式的映射的作用是保证数据的概念模式发生变化时,只需要改变映射关系,从而保持外模式不变,而应用程序根据外模式编写,这种外模式__于模式的特性,即逻辑数据__性;模式-内模式映射的作用是当存储模式发生改变时,只需要改变映射关系,从而保持模式和子模式不变,这种逻辑数据__于物理数据的特性,即物理数据__性
4.4数据库系统的组成数据库系统是指实际可运行的按照数据库方式存储和维护并向应用程序提供数据或者信息支持的系统一个完整的数据库系统由数据库,数据库管理系统,数据库应用程序,支持数据库运行的计算机软硬件环境以及数据库___等组成
4.5数据库设计理念数据库设计是从用户对数据的需求出发,创建一个性能良好,能满足不同用户需求,又能被选定的DBMS所接受的数据模式,进而构造出数据库结构的过程这里所说的数据库结构包括数据库的逻辑结构和物理结构数据库设计有两个最重要的目标满足应用功能需求和良好的数据库性能满足应用功能需求,主要是能把用户当前应用以及可预知的将来应用所需要的数据以及其__全部准确的存放与数据库中,并能根据用户的需求对数据进行合理的修改操作
4.6数据库设计内容数据设计的内容主要有数据库结构特性设计,数据库行为特性设计和数据库物理模式设计数据库的结构特性设计是确定数据库的框架和数据结构他是汇总各用户试图产生的全局逻辑结构它反映了现实世界及其__,能数据共享数据库行为特性的设计是确定用户的行为和操作,并根据其行为特性设计出数据库的子模式在数据库系统中,数据库的行为和动作反映在数据库应用程序中,这些行为和动作主要包括数据库的记录的添加,删除,修改,数据库的查询和统计,事务处理和报表处理等数据库物理模式设计要求是根据数据库结构的动态特性,在特定的关系数据库系统中,把数据库的逻辑结构模型加以物理实现,从而得出数据库的存储模式和存取方法
4.7数据库结构设计在采集数据的存储方式,根据客户需求与系统性能的考虑,设计是把数据库存储表结构分为3类采集的原始登录数据记录表按不同用户在不同实验室上的数据整合表按不同实验室的数据整合表注意按实验室整合与按用户在不同实验室上整合的存储因为数据量的问题在设计上有区别其中前者的表按天,月,年各一张,后者的天表31张,月表12张,年表根据年份一年一张原始采集用户登录时长明细表details_x其中x是1-31图
4.1原始记录ER图表
4.1原始数据表字段英文名字段汉字名类型是否为空loginname登录名Varchar20否loginip登录IPVarchar24否logintime登录时间Timestamp否logouttime登出时间Timestamp否labip实验室IPVarchar24否duration登录时长long否这31张表是采集服务端所用,服务端每小时从客户端接受到的用户登出记录都将存入表details_x(x为用户的登出日期)
(二)按用户统计整合的时记录表detaildays_x其中x为1-31图
4.2用户时整合记录的ER图表
4.2用户时整合记录表字段英文名字段汉字名类型是否为空loginname登录名Varchar20否loginip登录IPVarchar24否logouttime登出时间Timestamp否labip实验室IPVarchar24否duration登录时长long否这31张表是整合端所用,整合端每小时按用户业务整合一次用户登录时间数据,把同一用户上一小时的所有记录整合成一条记录,并存入表detaildays_x中x为用户的登出日期
(三)按用户统计整合的天记录detailmonths_x其中x为1-12图
4.3用户天整合记录的ER图表
4.3用户天整合记录表字段英文名字段汉字名类型是否为空loginname登录名Varchar20否loginip登录IPVarchar24否logouttime登出时间Timestamp否labip实验室IPVarchar24否duration登录时长long否这12张表是整合端所用,整合端每天按用户业务整合一次用户登录时间数据,把同一用户上一天的所有记录整合成一条记录,并存入表detailmonths_x中x为用户的登出月份
(四)按用户统计整合的月记录detailyears_x其中x为年图
4.4用户月整合记录的ER图表
4.4用户月整合记录表字段英文名字段汉字名类型是否为空loginname登录名Varchar20否Loginip登录IPVarchar24否logouttime登出时间Timestamp否Labip实验室IPVarchar24否Duration登录时长long否这几张表是整合端所用,整合端每月按用户业务整合一次用户登录时间数据,把同一用户上一月的所有记录整合成一条记录,并存入表detailyears_x中x为用户的登出年份
(五)按实验室整合的时记录表detaildays图
4.5实验室时整合记录的ER图表
4.5实验室时整合记录表字段英文名字段汉字名类型是否为空logouttime登出时间Timestamp否Labip实验室IPVarchar24否Duration登录时长long否整合端每小时按实验室服务器整合一次用户使用的时间数据把实验室上一小时的所有记录整合成一条记录,并存入表detaildays中
(6)按服务器整合的天记录表degtailmonths图
4.6实验室天整合记录的ER图表
4.6实验室天整合记录表字段英文名字段汉字名类型是否为空logouttime登出时间Timestamp否Labip实验室IPVarchar24否Duration登录时长Long否整合端每天按实验室服务器整合一次用户使用的时间数据把实验室上一天的所有记录整合成一条记录,并存入表detailmonths中
(7)按实验室整合的月记录表detailyears图
4.7实验室月整合记录的ER图表
4.7实验室月整合记录表字段英文名字段汉字名类型是否为空logouttime登出时间Timestamp否Labip实验室IPVarchar24否Duration登录时长long否整合端每月按实验室服务器整合一次用户使用的时间数据把实验室上一月的所有记录整合成一条记录,并存入表detailyears中
(8)用户帐务帐号、用户业务账号、资费的实体—__图如下图
4.8用户帐务帐号、用户业务账号、资费ER图表
4.8用户表Users字段英文名字段汉字名类型约束条件说明id用户IDIntPKname用户名Varchar20非空loginname用户登录名Varchar20UNIloginpassword用户登录__Varchar20非空status用户状态Int非空默认1,0开通1停用2(删除)phone用户__Varchar20e__il用户电邮Varchar20enrolldate用户开户日期Date非空closedate用户注销日期Datepaymenttype支付方式Int非空career职业Varchar20nationality民族Varchar12___性别Tinyint非空Company公司Varchar20zip邮编Varchar8这个表主要用来存储用户的基本信息,包括用户名、__、真实姓名等
(9)资费表pricings,用于存储__所提供的资费方式表
4.9资费表字段英文名字段汉字名类型约束条件id资费IDIntPKname资费名称Varchar20UNIbasefee基本费用double非空ratefee费用率doubledescription资费描述Varchar50
(10)用户业务帐号表userservi__s表
4.10业务帐号表字段英文名字段汉字名类型约束条件id业务IDIntPKuserid用户IDVarchar20loginname用户登录名Varchar20非空loginpassword用户登录__Varchar20非空labip实验室IP非空status状态Varchar20非空pri__id资费IDVarchar20enrolldate业务申请日期Date非空closedate业务停止日期Date
4.8数据表之间的__用户业务账号表userservi__s与用户表users项是一对多的关系;表示一个用户业务账号只能被一个用户使用,一个用户可以制定多种用户业务账号用户业务账号表userservi__s与资费表pricings是多对一的关系,表示一个户业务账号只能选择一种资费方式,而一种资费方式可被多户业务账号使用数据采集与整合中各表之间的依赖关系如下图
4.9各表之间的依赖关系5功能设计和实现
5.1数据库的访问本系统是通过JDBC和Hibernate框架来实现对数据库的操作的,Hibernate的使用可以使我用面向对象的思维方式对数据库进行操作,它是开源的框架,对Jdbc进行了轻量级的封装,并且支持各种关系映射,但是如果映射文件比较复杂,所以当数据库表过多时就不适宜采用此种数据库访问方式结合了Jdbc和Hibernate的优缺点,在这个项目中数据采集,整合、以及用户查询帐单时要用到的表有82张表,所以这些部分就采用了JDBC数据库访问方式;对于验证用户的登录信息,查询用户信息,修改用户信息时数据表少,就采用了Hibernate框架进行数据库访问JDBCUtil工具类通过读取配置文件db.properties来获得数据库的登录名、__、驱动根据这些信息得到数据库的连接,此类也提供了Connection,PreparedStatementResultSet的关闭方法HibernateSessionFactory工具类提供了获取一个session的方法,以及释放资源的方法
5.2前台母版制作__母版如图图
5.1__模板母版页概述摸版是用layout做成的,在WEB-INF目录下配置了一个文件layout.xml在配置文件struts-config.xml中,配置一个插件TilesPlugin,就可以分析文件layout.xml了plug-inclassName=set-propertyproperty=definitions-configvalue=/WEB-INF/layout.xml/set-propertyproperty=definitions-debugvalue=2/set-propertyproperty=definitions-parser-detailsvalue=2/set-propertyproperty=definitions-parser-validatevalue=true//plug-in前台母版的四个板块如图Logo.jsp部分图
5.2__标志部分头部图
5.3头部分Menu.jsp部分这一部分需要动态显示,用户成功登陆后才能显示用户的权限,在jsp页面上用EL表达式以及jstl的核心标签来显示用户的权限,具体代码如下其中userrights是一个__,它存放的是权限对象(权限名称name、以及连接url)这个__是存放在HttpSession中的在menu.jsp中用foreatch循环来遍了这个__,得到权限的名称以及地址c:forEachvar=menuitemitems=${userrights}ahref=${menuitem.url}${menuitem.name}/a/td/c:forEachFoot部分图
5.4模版尾部分
5.3前台各功能的实现前台用到了开源框架Struts1,可以把同一个模块的所有功能的实现写在一个类里面,提高了__速度,而且Strut__VC模式使表现层(主要jsp和html页面)与业务层分离开来,有利于系统的维护和安全本系统的前台分为2个部分与用户个人信息相关部分、账单查询部分用户信息部分使用的类是UserAction,它继承了Strutsapi中的类__ppingDIspatchAction这个类中包含4个方法用户登录是否成功、用户登出本系统、查看个人信息、修改个人信息用户账单查询部分使用的类是FeeQueryAction它继承了Strutsapi中的类DispatchAction这个类中包含2个方法月账单查询、详细账单查询Struts1中有一个总的控制器ActionServlet,它负责接受http请求,根据struts-config.xml配置文件的信息把请求通过Action__pping转发给适当的ActionWeb.xml中要对struts1中总的控制器ActionServlet进行的配置
1、index.jsp——首页在整个项目中,首先被用户看到的用户自服务的登陆页面,只有登陆成功才能拥有用户权限输入就可以进入前台登录主页进入此页面时程序要随机产生一个验证码,验证码时由一个servlet产生的,类名为CodeServlet要在web.xml中对这个servlet进行配置,把产生的验证码要存入HttpSession中便于同用户输入的验证码进行核对
2、sendlogin.do——登陆成功后用户将进入欢迎界面,此界面显示了用户的操作权限核对用户信息会调用类UserAction中的方法sendLogin(..):首先通过HttpServletRequest得到用户的name、password、验证码然后判断验证码是否正确,如果验证码不正确则返回登录首页,如果验证码正确则调用dao层的类UserDaoImpl中的方法loginname,password方法,返回值为true时,就将用户的所有权限以__的形式存放在session中,用户的姓名、用户的id存入Session中,__用于在jsp页面显示用户权限,id、姓名用于识别用户是否登陆以及用来查询用户的帐单3.infor__tion.do——用户信息编辑页面,此页面动态显示了用户的个人信息在类UserAction中提供了一个客户查询个人信息的方法infor__tion.1)通过HttpSession得到用户的id;2)调用dao层的方法getUserById(id)返回一个用户对象;3)把此用户对象当做属性存入到HttpServletRequest中在infor__tion.jsp页面用EL表达式得到用户的信息(getUserById()方法采用的是Hibernate框架来访问的数据库,简单方便)
4、modify.do——用户将修改后的个人信息进行保存后,将会显示这个页面,页面会提示用户“恭喜,您的个人信息修改成功!”在modify方法中,1)通过HttpRequest提供的方法 getParameterString得到用户填写的新信息,2)通过HttpSession中的用户id得到用户对象;3)对这个用户对象重新设值;4)调用dao层的方法updateUsers来保存新的用户信息
5、feeQuery.domethod=browseFeeByMonth——显示的是用户所有业务的月账单具体数据库查询通过用户输入的账号,年,月查询月帐单,在Action中调用dao层的方法getFeeByMonth
6、feeQuery.domethod=browseFeeDetailByMonth——显示的是月账单明细
7、logout.do——退出本系统,将进入本系统的首页登陆页面,action中的代码如下/***类UserAction中的方法客户登出的方法*/publicActionForwardlogoutAction__pping__ppingActionFormformHttpServletRequestrequestHttpServletResponseresponsethrowsEx__ption{ifrequest.getSessionfalse!=nullrequest.getSession.invalidate;return__pping.findForwardlogout;}
5.4后台功能的实现服务端通过网络接收由客户端发送过来的数据,并且将数据插入到数据库表中客户端通过网络定时向服务端发送匹配好的数据整合端定时对数据库中的数据按用户和实验室进行整合后台界面的制作采用的是J__a用户图形处理界面
5.
4.1采集服务端1)采集服务端的UI设计图
5.5采集服务端UI设计2)采集服务端——类图服务端的主线程是ServerLauncher,这个主线程将调用线程DataRe__rvierTh线程DataRe__rvierTh主要是负责接受客户端的连接,并为每个客户端启动一个数据接受线程(CollectionTh).服务端的主线程是ServerLauncher,这个主线程将调用线程DataRe__rvierTh线程DataRe__rvierTh主要是负责接受客户端的连接,并为每个客户端启动一个数据接受线程(CollectionTh).线程CollectionTh它相当于客户端的数据处理器,re__iver()方法负责接受从客户端发送来的数据,并且调用接口DetailDAO中的insert()方法,将数据插入数据库表中如果数据存储成功则发送0给客户端,否则发送-
1.DetailDAO是一个接口提供了访问数据库的方法BasicDAO是接口的实现类图
5.6采集服务端类图设计3)采集服务端-——时序图图
5.7采集服务端时序图4)配置文件说明表
5.1配置文件说明属性key属性value例子备注说明portport=9997采集的服务器端口driverdriver=com.mysql.jdbc.Driver数据库驱动程序类名urlurl=jdbc:mysql://
127.
0.
0.1:3306/netctosscharacterEncoding=gb2312数据库连接URLuseruser=root数据库连接用户名passwordpassword=root数据库连接口令5)类详细说明
5.1)ServerLauncher类:服务器数据接受器启动器主要负责启动服务器接受线程函数说明函数__in主要用来创建DataRecieverTh对象,并调用此对象的start函数来启动线程
5.2)DataRecieverTh类服务器接受主线程是一个线程类,继承JDK的标准线程类Thread主要负责接受客户连接,并为每个客户启动一个数据接收线程来进行客户数据接收成员说明成员属性名成员属性说明collectionth定义的一个Vector的数据结构,便于管理每个客户采集点serversocket服务器Socket对象InitialSocket()方法负责网络服务器的初始化工作Run()方法负责接收客户连接,并建立客户处理线程并启动线程,并在collectionth中记录该客户线程处理对象
5.3)CollectionTh类每个客户数据接收处理类该类主要接收采集器发送过来的数据,接收成功后发送一个成功标志,然后保存接收的数据该类继承Thread成员属性说明成员属性名成员属性说明socket每个客户Socket的代理socketinputstream客户socket输入网络流outputstream客户socket输出网络流dao专门负责把接受的数据写入到数据库函数run()主要调用re__ive()私有函数Re__ive()函数通过inputstream读取数据,并发送成功标记,然后调用全局的dao保存数据SendFlag()函数向客户端发送一个标记0表示接受成功,-1表示接受失败
5.4)DBEnvInit类数据库环境初始化类该类封装了两个函数工具,完成对数据库的连接函数getDBParamter,负责从属性文件读取数据库连接参数函数getConnection,负责根据连接属性打开与数据库的连接
5.5)DetailDAO类提供对Detail数据库的插入等操作访问函数insert负责把接收到的数据插入到数据库BasicDAOEntityType泛型类封装对数据库访问最常用的规范在后面的DAO类,缺省必须实现该接口
5.
4.2采集客户端1)采集客户端UI设计图
5.8采集客户端UI图设计2)采集客户端——类图客户端主线程类CollectionLauchor,它负责启动采集线程CollectionThread.采集线程CollectionThread用来启动采集过程主要是调用采集器类DataCollector进行数据采集;采集器类DataCollector1)首先由getNativeIP()获取本机的ip,2)然后初始化日志文件initlog(),3)接着注入LogDealer类的对象,4)用方法__ppingLogBuffer()把日志文件内存映射;5)在用方法parseLOgBuffer()分析日志文件,把登陆的数据放入__login,登出的数据放入__logout,6)在方读取上次匹配失败的数据并放入登陆__login;7)在用方法__tch()将登录登出的数据进行匹配;8)用方法passivate()保存匹配失败的数据;9)调用LogDealer中的deal()方法数据发送类LogDealer负责把匹配好的数据发送到服务端,如果服务端接受失败则对这些数据进行保存图
5.9采集客户端类图设计3)采集客户端——时序图图
5.10采集客户端时序图4)配置文件说明为了保证系统得灵活性,在该系统中把服务器和本机有关的参数都通过属性文件配置,由程序动态读取文件名确定为unix_server.properties属性key属性value例子备注说明intervalinterval=60采集的间隔时间以分钟为单位ipip=
192.
168.
0.20采集点的IP地址sour__filesour__file=f:\\usr\\adm\\wtmpx采集的源的文件名,包含目录destinationpathdestinationpath=f:\\usr\\history\\采集源的备份目录,目录后面必须加\目录分隔符号com__ndcom__nd=cmd/Cmove数据源被采集的时候,先__到备份目录,这个属性设置数据源文件__的shell指令或dos指令historyfilehistoryfile=history.dat保存匹配失败的数据serveripserverip=
127.
0.
0.1接收服务器IPserverport接收服务器端口storefilestorefile=store.dat数据发送失败的临时存储文件目录采用使用上面的指定的备份目录5)类详细说明
5.1)类CollectionLaunchor采集主程序类,发动采集线程
5.2)类CollectionThread采集线程,负责启动采集过程封装一个采集线程该类主要调用采集器类DataCollector进行数据采集该类继承JDK的Thread类函数说明run()方法主要创建DataCollector对象,并调用其collection函数进行数据采集该函数是Thread的run函数覆盖函数.
5.3)类DataCollector负责采集环境的处理与数据采集,分析处理所有的采集任务有该类完成,主要获取本机IP,__备份并清空日志文件,读取日志文件,解析日志文件,匹配处理日志登录/登出记录获取用户登录时间,在线用户下次匹配函数说明getNativeIP读取要采集服务器的IP,该IP用属性文件配置Initlog函数负责调用Runtime执行mvshell指令进行日志文件的备份并清空原始文件备份的文件名wtmpx+年4位+月(2位)+日(2位)+时(2位),比如wtmpx
2008053013.返回类型String返回的是采集数据源的备份文件(包含路径)__ppingLogBuffer函数原型public__ppedByteBuffer__ppingLogBufferStringfileName主要把备份的日志文件映射为本地内存缓冲,便于后面解析参数Stringfilename备份日志文件名返回类型String本地文件映射缓冲__ppedByteBufferParseLogBuffer函数原型privatevoidparseLogBuffer__ppedByteBufferlogbufferVectorLogRecordloginsVectorLogRecordlogouts负责解析缓冲的内存结构,利用参数返回两个Vector结构对象,一个存放登录数据,一个存放登出数据参数__ppedByteBufferlogbuffer要解析的本地内存缓冲VectorLogRecordlogins返回解析后的登录数据VectorLogRecordlogouts返回解析后的登出数据返回类型void【参考】数据登录登出的判别标准#defineEMPTY0#defineRUN_LVL1#defineBOOT_TIME2#defineOLD_TIME3#defineNEW_TIME4#defineINIT_PRO__SS5#defineLOGIN_PRO__SS6--登录进程#defineUSER_PRO__SS7--用户进程#defineDEAD_PRO__SS8--终止进程【参考】WTMPX文件的结构位置范围字节长度含义000-03132/*userloginname*/032-0354/*inittabid*/036-06732/*devi__nameconsolelnxx*/068-0714/*pro__ssid*/072-0732/*typeofentry*/074-0752/*pro__sstermination*/076-0772/*exitstatus*/2/*这是C数据类型补齐产生的空位*/080-0834/*timeentrywas__de*//*seconds*/084-0874/*andmicroseconds*/088-0914/*sessionIDusedforwindowing*/092-11120/*reservedforfutureuse*/112-1132/*significantlengthofut_host*/___-371257/*remotehostname*/Active()函数负责把上次未匹配的数据读取为Vector结构便于后面匹配参数是存放上次未匹配的登录日志记录,返回Vector结构,其中元素类型LogRecord参数StringloginFilename保存上次未匹配的数据的文件名该文件在属性配置文件中设置返回类型VectorLogRecord上次未匹配的所有登录数据__tch()函数说明负责匹配登录/登出数据,并返回用户登录时间数据参数是两个Vector类型的登录/登出数据结构,元素类型是LogRecord返回的是匹配好的用户登录时长记录,数据类型是Vector,其中元素类型是__tchedRecord详细说明请参考__tchedRecord类的说明参数VectorLogRecordlogins登录数据VectorLogRecordlogouts登出数据返回类型Vector__tchedRecord匹配生成的用户登录时长数据Passivate()函数说明函数原型privatevoidpassivateVectorLogRecordloginsStringloginFilenamethrowsInitEx__ption负责把这次没有匹配好的登录记录保存成文件,以便下次采集的时候匹配参数是没有匹配好的登录记录类型是Vector,其中元素类型是LogRecord.参数VectorLogRecordlogins没有匹配成功的登录数据StringloginFilename保存没有成功的登录数据的文件名,在属性配置文件中设置Collection()函数说明函数原型publicvoidcollectthrowsCollectionEx__ption负责整个采集过程这是该类中的唯一的一个public函数,主要供采集线程调用
5.4)图
5.11采集客户端状态图
5.4)LogRecord类,负责登录/登出数据封装
5.5)__tchedRecord类,负责匹配好的数据的封装
5.6)CollectionListener接口,规范采集好的数据的处理方式函数说明函数原型voiddealVector__tchedRecord__tches;负责匹配好数据的处理,返回void参数是Vector类型,元素类型是__tchedRecord是匹配好的所有登录时长数据参数Vector__tchedRecord__tches已经匹配好的生成用户登录时长数据返回类型void
5.7)LogDealer类,负责匹配好数据的发送处理,如果发送失败,则数据被保存该类主要实现CollectionListener接口Init()函数说明函数原型privatevoidinitthrowsInitEx__ption主要初始化服务器参数,服务器参数使用属性文件配置主要包含IP,port,destinationpath,storefileInitSocket()函数说明函数原型publicvoidinitSocketthrowsLinkEx__ption主要初始化网络连接如果初始化失败,则产生异常Send()函数说明函数原型publicvoidsendO__ectOutputStreamoos__tchedRecorddatathrowsSendEx__ption主要负责数据发送该函数调用前先度取历史发送失败数据合并参数O__ectOutputStreamoos发送数据的网络流__tchedRecorddata要发送的数据包含上次发射失败未发射的数据Re__ive()函数说明函数原型publicintrecieveDataInputStreamdisthrowsRecieveEx__ption接受服务器发送过来的标记为避免数据发送失败产生数据丢失,服务器接受数据保存成功后发送一个成功标记,给客户采集点该函数负责接受该标记参数DataInputStreamdis网络接受流返回类型int服务器是否处理成功的标记,0表示处理成功,否则是失败Store()函数说明函数原型publicvoidstoreStringpathStringfileVector__tchedRecord__tchesthrowsIOEx__ption当数据发送若干次失败后,客户采集点就会把数据存储到临时文件中,在下次采集的时候在读取出来合并发送,该函数就是把发送失败的数据保存到临时文件参数Stringpath临时保存文件的路径Stringfile临时保存文件名Vector__tchedRecord__tches,发送失败后剩余的要保存的数据Load()函数说明函数原型publicVector__tchedRecordloadStringpathStringfilethrowsIOEx__ption该函数就是加载上次未发送成功的数据参数Stringpath临时保存文件的路径Stringfile临时保存文件名返回类型Vector__tchedRecord读取的上次未保存成功的数据Deal()函数说明函数原型publicvoiddealVector__tchedRecord__tches该函数是公有的函数封装整个发送过程参数Vector__tchedRecord__tches采集匹配成功的用户登录时长数据返回类型void
5.
4.3数据整合端1)UI设计图
5.12整合端UI设计2)数据整合——类图ServerLauncher类整合启动程序类DataIntegratorTh类整合线程,主要完成整合的调用Integration接口整合接口规范IntegrationByClient类实现了接口Integration,它主要是用来建立数据库连接,调用dao层中的数据库访问方法IntegrationFactory类利用工厂模式,负责产生一个整合对象ConnectionPool类数据库连接池的使用负责得到数据库的连接BasicIntegrateDAO类数据库访问的接口,提供的按实验室和用户分别进行时整合、天整合、月整合的6个方法IntegrateImp类实现了接口BasicIntegrateDAO图
5.13整合端类图设计3)数据整合——时序图图
5.14整合端时序图设计4)配置文件说明属性key属性value例子备注说明driverdriver=com.mysql.jdbc.Driver数据库驱动程序类名urljdbc:mysql://
127.
0.
0.1:3306/netctosscharacterEncoding=gb2312数据库连接URLuseruser=root数据库连接用户名passwordpassword=louisyyy数据库连接口令dayruledayrule=4每日整合时间规则monthrule_daymonthrule_day=16每月整合时间规则-天monthrule_hourmonthrule_hour=4每月整合时间规则-时intervalinterval=1时整合规则-整合的单位间隔时间5)类详细说明
5.1)ServerLauncher类整合启动程序类__in()函数说明创建DataIntegratorTh线程对象,并调用run函数启动线程
5.2)DataIntegratorTh类整合线程,主要完成整合的调用Run()函数说明函数原型publicvoidrun负责根据整合规则,并调用相应的整合函数对数据进行整合
5.3)Integration接口整合接口规范
5.3)
1.
1.函数initInit()函数说明对整合的规则配置参数进行初始化
5.3)
1.
2.函数integrateIntegrate()函数说明publicvoidintegrateinttype;负责根据整合规则,并调用相应的整合函数对数据进行整合参数inttype指按时天月三种类型整合
5.3)
1.
3.函数releaseRelease()函数说明函数原型publicvoidrelease;负责释放整合过程中产生的临时数据
5.3)
2.IntegrationByClient整合的J__a调用实现
5.3)
3.IntegrationFactory类利用工厂模式产生的一个类,负责产生整合对象函数getIntegrationClientDAO:函数说明函数原型publicstaticIntegrationgetIntegrationClientDAO读取配置参数,产生IntegrationByClient对象,并初始化,并返回给该函数的调用者该函数的设计请参考J__a模式设计中构建模式之工厂模式该模式的好处可以屏蔽具体实现类参数void返回类型Integration就是整合对象与具体的实现类无关
5.4)DBEnvInit类见数据采集存储中的说明函数getConnection从连接池中获取一个连接,在目前版本中,池的大小固定为1函数open负责调用DBEnvInit中的函数来打开连接,并形成池函数close负责关闭池中的某个连接
5.6)BasicIntegrateDAO负责所有整合的实现,该类中应该实现一个数据库连接注入6系统测试
6.1软件测试常识软件测试的目的是想以最少的人力、物力和时间找出软件中潜在的各种错误和缺陷,通过修改各种缺陷和错误来提高软件质量,回避软件发布后由于潜在的软件缺陷和错误造成的隐患带来的商业风险
[4]1)所有的软件测试都应该追溯到用户的需求;2)应当尽早的和不断的进行软件测试;3)完全测试是不可能的,测试需要终止;4测试无法显示软件潜在的缺陷;5)尽量避免测试的随意性;6)程序员应避免测试自己的程序1)按照__阶段分单元测试单元测试又称模块测试,是针对软件设计最小单位程序模块进行正确性检验的测试工作集成测试在单元测试的基础上,将所有的程序模块进行有序的、递增的测试确认测试通过检验和提供客观证据,证实软件是否满足客户特定预期用途的需要系统测试为验证系统是否达到原始目标,而对集成的硬件和软件系统进行测试验收测试按照项目任务书和合同、供需双方约定的验收依据文档进行的对整个系统的测试与评审,决定是否接受或拒收系统2)按测试实施组织划分__测试__方通过检测和提供客观证据,证实软件的实现是否满足规定的需求用户测试在用户的应用环境下,用户通过运行和使用软件,检测与核实软件实现是否符合自己预先的要求第三方测试介于软件__方和用户方之间的测试组织的测试3)按测试技术的划分白盒测试通过对程序内部的分析和检测来寻找问题,黑盒测试通过软件的外部表现来发现其存在的缺陷和错误灰盒测试介于白盒测试与黑盒测试的一种测试
6.2系统测试环境及__工具表
6.1系统测试环境环境版本操作系统:WindowsXp/Unix应用服务器Tomcat表
6.2__工具__工具版本MyEclipse
6.0MySQLHibernate
3.xStruts
11.x
6.3系统功能测试运行测试的计算机的WEB服务器和数据库配置好后,把此源码放入IIS的虚拟目录中,通过http://localhost/netselfservi__/index.jsp来访问本__前台测试
1、进入用户账单查询系统首页图
6.1系统首页
2、登录成功后用户会获得相应的权限个人基本信息编辑、账单查询(月查询和详细查询)、推出本查询系统图
6.2登录成功后页面
3、__个人信息编辑会显示用户的基本信息,如果用户要进行个人信息修改,修改后__保存即可图
6.3用户个人资料页面
4、修改个人信息个人信息修改成功后,在页面的顶部会有提示即“恭喜,您的个人信息修改成功!”图
6.4用户修改个人资料页面
5、__账单查询可以在此页面输入自己或他人的用户账务账号、年、月查询月账单输入账号、年、月得到的查询结果如下图
6.5账单查询页面图
6.5账单查询页面__“明细”可以查询到当月的详细账单情况图
6.6月账单查询页面
6、__退出后回到本系统的登录首页后台管理平台测试
1、启动数据采集服务器端一直等待采集点的连接输入服务器的端口号、驱动、数据库连接的url、MySQL的用户名以及__,如后__“保存”再__“运行服务器端”,服务器准备接收从客户端发送过来的数据,效果如下图
6.7服务端等待接受客户端数据
2、采集客户端客户端端每隔一段时间会自动发送数据到服务器端填写服务端ip,端口,数据源文件,采集间隔时间等注意客户端的服务器端口的填写要与服务端的端口填写一致然后__“保存修改”再__“运行客户端“,此时程序会分解日志文件wtmpx,并把上一个小时匹配成功的数据发送到服务器端,匹配失败的数据将存入到文件history.dat中,等到下一次在匹配
2.1服务器端成功接受到客户端发送过来的数据则客户端会出现如下界面界面注释wtmpx200905070535文件是wtmpx文件的拷贝文件,程序要分解这个文件,在上一个小时内一共有68个用户登录使用了实验室,上上个小时历史文件中匹配失败的数据为0,这68个用户中有6个用户登出了实验室,所以成功匹配数据为6条,保存匹配失败的登录数据62条到历史文件history.dat中“新老数据合并“是把上次服务器存储失败的数据与这6条数据放入同一个__中,然后发送到服务器端,如果服务器端成功保存这6条数据,将会显示发送成功的数据信息此时服务器端也会显示接收成功的信息客户端、服务端界面如下图
6.8服务端成功接收客户端数据以后每隔一个小时客户端都会重复上面的工作客户端发送数据,服务端接收数据一小时后界面更新为客户端一小时后客户端在次分解日志文件,读取上次匹配失败的数据62条,上次匹配失败的数据62条加上这次分解的登录数据241条,一共有数据303条其中登出的数据有90条,所有匹配成功的数据有90条,213个用户还没有登出,因此这213条数据要存入历史文件history.dat中,等待下次匹配将这90条数据以及上次服务器接收失败的数据一起发送到服务端服务端服务端再次接收客户端发送过来的数据图
6.9一个小时后服务端成功接收客户端数据
2.2服务器端接受数据失败客户端界面(左边)与服务端界面(右边)如下界面注释由于服务端数据库连接失败,导致服务端无法将客户端发送过来的匹配成功的5条数据存入数据库表detaildays_X中,所有客户端需要保存这5条接收失败的数据,保存至文件stor.dat中,等待下一次发送(由于数据库、网络发生的故障导致服务端不能存储的数据都将会保存在stor.dat中)图
6.10一服务端接收客户端数据失败一小时后客户端在次向服务端发送匹配成功数据100条,加上上次发送失败的5条数据,一共是105条,所有数据大小为105,全部发送到服务端客户端界面(左边)与服务端界面(右边)如下图
6.11一个小时后服务端再次成功接收客户端数据
3、数据整合端每隔一段时间系统会自动按实验室和用户进行整合图
6.12整合端界面__“运行数据整合端”图
6.13时、天、月整合界面注释
3.1时整合在2009-05-0815:5128整合端分别按实验室和用户进行了时整合,把上一个小时之内(2009-05-0814:00:00至2009-05-0814:5959)使用同一实验室的同一个用户的所有数据整理成一条数据,然后插入到天表detaiildays_8中;把上一小时内登录同一实验室的所有数据整理成一条数据,然后插入到实验室天表detaildays中用户时整合语句insertintodetaildays_8selectloginnameloginip__xlogoutdateaslogouttimelabipsumdurationasdurationfromdetails_8wherelogoutdatebetween2009-05-0814:00:00and2009-05-0814:59:59groupbyloginnameloginiplabip实验室时整合语句insertintodetaildaysselect__xlogouttimeaslogouttimelabipsumdurationasdurationfromdetaildays_8wherelogouttimebetween2009-05-0814:00:00and2009-05-0814:59:59groupbylabip
3.2天整合每天的16点系统会把昨天的数据整合成一条数据,如上界面的2009-05-08把2009-05-07使用同一实验室的同一用户的所有数据整合成一条数据然后插入月表detailmonths_5中;把2009-05-07登录同一实验室的所有数据整理成一条,插入到实验室余额表detailmonths中用户天整合insertintodetailmonths_5selectloginnameloginip__xlogouttimeaslogouttimelabipsumdurationasdurationfromdetaildays_7wherelogouttimebetween2009-05-0700:00:00and2009-05-0723:59:59groupbyloginnameloginiplabip实验室天整合insertintodetailmonthsselect__xlogouttimeaslogouttimelabipsumdurationasdurationfromdetaildayswherelogouttimebetween2009-05-0700:00:00and2009-05-0723:59:59groupbylabip
3.3月整合每月8号的16点系统会自动把上一个月的数据整合成一条,如上界面2009-05-0816点把2009-4月使用同一实验室的同一用户的所有数据整理成一条,插入年表detailyears_2009中;把2008-4月登录同一实验室的所有数据整理成一条,插入到实验室的年表中detailyears.用户月整合insertintodetailyears_2009selectloginnameloginip__xlogouttimeaslogouttimelabipsumdurationasdurationfromdetailmonths_4wherelogouttimebetween2009-04-0100:00:00and2009-04-3023:59:59groupbyloginnameloginiplabip实验室月整合insertintodetailyearsselect__xlogouttimeaslogouttimelabipsumdurationasdurationfromdetailmonthswherelogouttimebetween2009-04-0100:00:00and2009-04-3023:59:59groupbylabip7结论
7.1本站特色跨平台设计J__A一个很重要的特性就是跨平台,本系统使用J__A语言__,在有数据输入的地方统一使用配置文件,这样,只需要修改配置文件,就能在Windows和Linux环境下运行据JDBC和Hibernate的优缺点以及程序本身的需要采用了2种不同的数据库访问方式前台的用户账单查询采用来了Strut1框架,提高了__速度,使得业务层与表现层分离开来
7.2不足之处在后台数据采集的过程中,客户端往服务端发送数据采取的时底层的Socket,采用这种方式的缺点时面向底层__,需要处理多线程以及数据传输失败等细节
7.3个人总结经过一个月的学习与实践,一个基于j__a的__计费系统的后台和前台查询系统基本完成通过这个项目我学到了很多知识,后台的数据采集与数据整合巩固了我的j__a基础,使我进一步的熟悉使用__、线程、I/O、异常处理、网络编程、图形用户界面变成前台的用户账单查询采用了Strut1MVC模式使得逻辑层与表现层处分离开来由于设计时间的仓促,加之本人水平有限,系统还存在好多不足之处有待于进一步完善,相信在以后的学习过程中能够发现并解决更多的不足和问题____
[1]孙卫琴.精通Struts基于MVC的J__aWeb设计与__[M].北京电子工业出版社,
2004.8
[2]VikramVaswani美.MySQL完全手册[M].电子工业出版社
2004.11
[3]王君柯.艾波.__运营支撑系统-软件体系结构模式系统[M].人民邮电出版社
2006.
[4]柳纯录.软件评测师教程[M].清华大学出版社
2005.
[5]吴斯特曼.J__a核心技术[M].机械工业出版社,
2008.
[6]王一飞候曾秀.CSS入门经典[M].清华大学出版社,
2008.
07.
[7]刘智勇.零基础学J__aScript[M].机械工业出版社,
2008.
01.
[8]王珊萨师煊.数据库系统概论[M].高等教育出版社,2006,
05.
[9]夏昕曹晓钢唐勇.深入浅出Hibernate[M].电子工业出版社,2005,
06.
[10]郭__.J__AEEWEB工程师培训JDBC+Servlet+JSP整合__[M].电子工业出版社,
2008.致谢自己填写附录采集客户端重要代码把备份的日志文件映射为本地缓冲内存,便于后面的解析public__ppedByteBuffer__ppingLogBufferStringfilenamethrowsIOEx__ption{Filefile=newFilefilename;iffile.exists==false{//进程__文件可能失败,导致没有文件System.out.println文件不存在!;returnnull;}__ppedByteBuffermbb=null;FileInputStreamfis=newFileInputStreamfilename;FileChannelfc=fis.getChannel;mbb=fc.__pFileChannel.__pMode.READ_ONLY0fis.__ailable;returnmbb;}解析本地内存缓存,logout返回解析后的用户登出数据,login返回解析后的登录数据publicvoidparseLogBuffer__ppedByteBufferlogbufferListlogoutListlogin{//循环读取,根据登录类型分别放入logout,loginwhiletrue{byte[]line=newbyte
[372];try{logbuffer.getline;}catchEx__ptione{return;}ByteBufferbb=ByteBuffer.wrapline;//把字节数组包装到字节缓冲区中byte[]user=newbyte
[32];bb.getuser;bb.getnewbyte
[36];intpid=bb.getInt;shorttype=bb.getShort;bb.getnewbyte
[6];intsecond=bb.getInt;intms=bb.getInt;longtime=second*1000l+ms;bb.getnewbyte
[26];byte[]hostname=newbyte
[257];bb.gethostname;LogRecordlr=newLogRecord;lr.setVisittimetime;lr.setPidpid;lr.setUsernewStringuser.trim;lr.setLabipip;lr.setUseripnewStringhostname.trim;iftype==7login.addlr;iftype==8logout.addlr;}}负责匹配登录/登出数据,把匹配成功的记录存放到__中,并返回此__privateList__tchedRecord__tchListLogRecordlogoutListLogRecordlogin{logins=newArrayListLogRecord;//用来存放没有匹配成功的记录(都是登入)List__tchedRecord__tch=newArrayList__tchedRecord;forLogRecordlog7:login{intflag=0;forLogRecordlog8:logout{iflog
7.getPid==log
8.getPidlog
7.getUserip.equalslog
8.getUseriplog
7.getUser.equalslog
8.getUser{longtime=log
8.getVisittime-log
7.getVisittime;__tchedRecorde=new__tchedRecordlog
7.getUserlog
7.getVisittimelog
8.getVisittimelog
8.getUseriplog
8.getLabiptime;__tch.adde;break;}flag++;}ifflag=logout.size{//存储没有匹配的记录logins.addlog7;}}return__tch;}向服务端发送匹配好的数据(每次发送一条记录)网络初始化工作oos对象输出流,dis数据输入流socket=newSocketipport;OutputStreamis=socket.getOutputStream;oos=newO__ectOutputStreamis;InputStreamos=socket.getInputStream;dis=newDataInputStreamos;publicvoidsendO__ectOutputStreamoos__tchedRecorddatathrowsSendEx__ption{try{oos.writeO__ectdata;oos.flush;}catchIOEx__ptione{thrownewSendEx__ption客户端发送数据失败!;}}接收从服务端发送过来的标记(服务器端是否接受成功)publicintre__iveDataInputStreaminthrowsRe__iveEx__ption{inti=0;try{i=in.readInt;}catchIOEx__ptione{thrownewRe__iveEx__ption客户端接受标记失败!;}returni;}此方法用于存储服务端接收失败的数据privatevoidstoreStringpathStringfilenameList__tchedRecorddata{O__ectOutputStreamoos=null;try{//覆盖了原来那个存储发送失败数据的文件FileOutputStreamfos=newFileOutputStreampath+filename;oos=newO__ectOutputStreamfos;ifdata.size!=0{for__tchedRecordfail:data{oos.writeO__ectfail;}System.out.println文件stor.dat共保存了发送失败数据的条数为+data.size;}}catchEx__ptione{e.printStackTra__;}finally{try{oos.close;}catchEx__ptione{}}}采集服务端重要代码每次向数据库表插入一条记录之后,就要向客户端发送一个标记publicvoidsendFlagintflag{try{OutputStreamos=socket.getOutputStream;outputstream=newDataOutputStreamos;outputstream.writeIntflag;outputstream.flush;}catchEx__ptione{e.printStackTra__;}}接收从客户端发送过来的记录,并调用数据保存函数publicvoidrun{try{InputStreamis=socket.getInputStream;inputstream=newO__ectInputStreamis;DBEnvlnitdben=newDBEnvlnit;//连接数据库Connectionconnection=dben.getConnection;//循环接受本次从客户端发送过来的数据,接受完之后,跳出循环whiletrue{Detaildetail=null;detail=re__ive;//调用数据接收函数,返回需要存储的记录ifdetail!=null{dao=newDetailDAO;//插入数据库的操作dao.setConconnection;intflag=dao.insertdetail;//返回0表示插入成功,否则失败sendFlagflag;//插入数据库成功后返回一个整数0给客户端}else{System.out.println网络问题,可能采集点采集完毕,自动退出\n客户网络断掉可能网络有问题,可能客户发送完毕!;try{socket.close;}catchEx__ptione{e.printStackTra__;}break;}}}catchIOEx__ptione{System.out.println网络异常;}catchDBNetEx__ptione{System.out.printlne.getMessage;sendFlag-1;}}把接收到记录插入到数据库表details_x中publicintinsertDetaildetail{______DateFor__tdf=new______DateFor__tdd;Datedate=newDate;Strings=df.for__tdate;StringBuffer__=newStringBuffer;try{StringtableName=details_+Integer.parseInts;Stringsql=insertintodetails_+Integer.parseInts+values;;ps=con.prepareStatementsql;ps.setString1detail.getUsername;ps.setString2detail.getLoginip;ps.setTimestamp3detail.getLogintime;ps.setTimestamp4detail.getLogouttime;ps.setString5detail.getLabip;ps.setDouble6detail.getDuration;ps.executeUpdate;con.commit;__.append数据插入表+tableName+\n;inttime=int__th.__ildetail.getDuration/1000*60-1;__.append接受数据+detail.getUsername+\t+time+分\t+detail.getLoginip;System.out.println__.toString;return0;//代表插入成功}catchEx__ptione{e.printStackTra__;try{con.rollback;}catchEx__ptionee{ee.printStackTra__;}}finally{try{ps.close;}catchEx__ptione{e.printStackTra__;}}return-1;//代表插入失败}采集整合端重要代码根据整合规则调用相应的整合函数publicvoidrun{init;//读取配置文件,初始,天,月的整合具体时间//得到IntegrationByClient类(调用整合,数据库操作类)ib=IntegrationFactory.getIntegrationClientDAO;try{______DateFor__tdf=new______DateFor__tyyyy-MM-ddHH:mm:ss;Calendarc=Calendar.getInstan__;c.setCalendar.HOUR_OF_DAYc.getCalendar.HOUR_OF_DAY-1;c.setCalendar.MINUTE0;c.setCalendar.SECOND0;System.out.printlndf.for__tc.getTime;ib.integrate1;//用户时整合ib.integrate4;//实验室时整合whiletrue{Calendarcal=Calendar.getInstan__;intyear=cal.getCalendar.YEAR;intmonth=cal.getCalendar.MONTH;intday=cal.getCalendar.DAY_OF_MONTH;GregorianCalendar__day=newGregorianCalendaryearmonthdaydayrule00;GregorianCalendar__month=newGregorianCalendaryearmonthmonthrule_daymonthrul_hour00;longbetweenday=__day.getTimeI__illis-cal.getTimeI__illis;longbetwee__onth=__month.getTimeI__illis-cal.getTimeI__illis;//启动天整合线程ifbetweenday0betweenday=interval*60000{ThreadbyDayTh=newIntegratebyDaythbetweenday;byDayTh.start;}//启动月整合线程ifbetwee__onth0betwee__onth=interval*60000{ThreadbyMonthTh=newIntegratebyMonththbetwee__onth;byMonthTh.start;}//调用时整合线程try{Thread.sleepinterval*60*1000;//每隔一个小时就采集一次}catchEx__ptione{System.out.println当前线程被中断;}ib.integrate1;//用户时整合ib.integrate4;//实验室时整合}}catchDBLinkFalseEx__ptione{e.printStackTra__;System.out.printlne.getMessage;}}用户时整合的数据库操作publicvoidintegrateByHourintyearintmonthintdayinthour{//detaildays_xx存放每个用户在第xx天时每个小时的数据整合______DateFor__tdf=new______DateFor__tyyyy-MM-ddHH:mm:ss;Calendarc=Calendar.getInstan__;c.setyearmonthdayhour-100;Stringdatetime1=df.for__tc.getTime;c.setyearmonthdayhour-15959;Stringdatetime2=df.for__tc.getTime;StringtableName1=detaildays_+day;StringtableName2=details_+day;Stringsql=insertinto+tableName1+selectloginnameloginip__xlogoutdateaslogouttimelabipsumdurationasduration+from+tableName2+wherelogoutdatebetween+datetime1+and+datetime2++groupbyloginnameloginiplabip;System.out.println用户时整合语句\n+sql;try{PreparedStatementps=conn.prepareStatementsql;ps.executeUpdate;conn.commit;}catchSQLEx__ptione{System.out.println用户时整合事务操作失败;e.printStackTra__;failDiary1;try{conn.rollback;}catchSQLEx__ptione1{e
1.printStackTra__;e.printStackTra__;System.out.println回滚失败!;}}}。