项目报告

固定资产管理系统

随着计算机信息技术的发展以及对资产、设备的管理科学化、合理化的高要求,利用计算机实现设备及资产的信息化管理已经显得非常重要。

固定资产管理系统是一个单位不可缺少的部分。但一直以来人们使用传统的人工方式管理固定资产的信息,这种管理方式存在着许多缺点,这对于查找、更新和维护都带来了不小的困难。因此,开发一个界面友好,易操作的资产管理软件进行自动化管理变得十分重要。这正是本系统开发的目的和意义。本文所阐述的固定资产管理系统,以浏览器/服务器模式高效地实现了固定资产管理的各项功能,可进行资产的添加,删除、修改、查询、打印报表等功能;还可以对每位职工的添加、删除、修改、查询基本操作;本系统还对权限进行限制,操作员只可对资产和用户进行基本操作,管理员可以为每位员工赋权限。

使用本系统,不仅提升了效率,而且满足现代高校资产管理的需要。

关键词:资产管理 JSP Struts Hibernate Spring


目    录

固定资产管理系统. I

摘  要. I

Abstract II

前    言. V

第1章 绪    论. 1

1.1 项目背景. 1

1.2 项目设计原则. 1

1.2.1 实用性原则. 1

1.2.2 经济性原则. 1

1.2.3 扩充性原则. 2

1.2.4 社会可行性原则. 2

1.3 本章小结. 2

第2章 系统分析. 3

2.1 需求分析. 3

2.2 技术可行性. 3

2.2.1 动态网站技术介绍. 3

2.2.2 程序语言的选择. 3

2.3 软件可行性分析. 4

2.3.1 软件环境. 4

2.3.2 硬件环境. 7

2.4 系统结构可行性分析. 7

2.4.1 B/S模式简介. 7

2.4.2 B/S模式的优点. 8

2.5 本章小结. 8

第3章 关键技术. 9

3.1 开发架构. 9

3.1.1 软件开发架构的意义. 9

3.1.2 Struts架构简介. 9

3.2 数据持久层. 11

3.2.1 持久层主流方案. 11

3.2.2 持久层主流方案. 12

3.2.3 持久化技术. 12

3.3 本章小结. 13

第4章 总体设计. 14

4.1 总体设计. 14

4.2 数据库设计. 15

4.2.1 数据库的需求分析. 15

4.2.2 数据库表的具体设计. 15

4.3 详细设计. 17

4.3.1 功能设计. 17

4.3.2 系统登陆. 18

4.3.3 系统用户管理. 20

4.3.4 员工信息管理. 23

4.3.5 资产入库管理. 24

4.3.6 资产维护管理. 28

4.3.7 资产借还管理. 29

4.3.8 打印报表. 31

4.3.9 密码修改. 34

4.4 技术难点. 34

4.4.1 中文乱码. 34

4.4.2 图片处理. 34

4.4.3 HQL语言. 35

4.4.4 安全性. 35

4.5 本章小结. 36

第5章 系统测试. 37

5.1 测试的定义及目的. 37

5.2 测试的原则. 37

5.3 系统的方法. 37

5.3.1 界面测试. 37

5.3.2 功能测试. 38

5.3.3 需求测试. 38

5.3.4 性能测试. 38

5.4 系统中其它要注意的地方. 38

5.5 固定资产管理系统的测试. 39

5.6 本章小结. 39

结  论. 40

致  谢. 41

参考文献. 42


前言

随着社会经济的迅速发展和科学技术的全面进步,计算机事业的飞速发展,以计算机与通信技术为基础的信息系统正处于蓬勃发展的时期。随着企业的发展,企业的规模也逐渐发生变化,其管理难度也越来越大,如何优化企业设备、资产的日常管理也就成为了一个大众化的课题。如何更好的提高生产效率,相关的企业资产管理系统的研发在社会中越来越受到重视。

固定资产已成为公司管理中不可或缺的一部分,在许多国家得到了广泛的研究与应用。总的说来,固定资产管理系统就是通过集中固定资产信息,对公司的资产进行调控。实现固定资产管理系统现代化的根本途径是信息化、系统化。

作为计算机应用的一部分,使用计算机对固定资产进行管理,具有手工管理所无法比拟的优点。例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高固定资产管理的效率,也是科学化、正规化管理的重要条件。固定资产管理系统通过采集固定资产日常工作中所产生的各种原始数据,根据资产管理的要求,对数据进行分类、统计、汇总、分析,建立程序化、制度化、规范化的固定资产计算机软件管理系统,包括了固定资产的一般特性、固定资产状态数据和固定资产能力数据,及时准确地报出各种报表,为固定资产管理提供了一个现代化的管理手段,这一手段可以强化和规范对固定资产的管理。便于计划、财务、审计等管理部门的介入,形成严格的监督、约束机制。


  1. 绪    论
  1. 项目背景

随着我国高等教育事业的迅猛发展,高等学校使用的固定资产规模在急速增长,使其日趋复杂,管理难度越来越大。尤其是随着校际间的合并与调整、学校内部推行的后勤、财务、人事、分配等各项改革的深化,对高等学校的固定资产管理工作不断提出新要求。但是,多年来固定资产管理工作一直是高校管理的一个薄弱环节,管理基础工作不够规范,资产安全控制体系尚不完善,家底不清、帐实不符、资产流失的现象在不少的学校依然存在,与高等教育发展改革的新形势很不适应。近几年来,为加强固定资产管理工作,国内一些地区和学校进行了有益的探索,开发管理软件,开始使用计算机管理教学仪器、设备等,技术上有了一定的进步。但总的看来,这些软件实现的往往是对原来手工劳动的简单替代,完成的仅仅是单一业务和专门用途资产的管理,未能从根本上改变高校固定资产管理被动、滞后的局面。

因此,必须以有力支撑高等教育发展改革的高度出发,对固定资产管理工作进行系统的规划和建设,运用现代信息技术真正实现管理水平上的飞跃。本系统就是基于此种社会背景进行独立开发,解决了以往资产管理中存在的普遍问题,如资产的录入、删除等模糊不清,数据来去不透明,致使资产无据可查。本系统不仅实现了通过简单操作完成繁琐的资产管理功能,而且将每笔资产的动态信息进行数据记录,里面有资产、相关操作人员和时间的记录,使得所有资产都有据可查、透明可见,提高资产管理效率,解决以往资产管理弊端。

  1. 项目设计原则
  1. 实用性原则

固定资产管理是企业管理中的一个重要组成部分,其管理具有数量大、种类多、价值高、使用周期长、使用地点分散等特点,管理难度比较大。很多单位目前仍采用人工记账的管理方式,因为以上原因使得管理工作异常艰难,导致资产流失和重复购置等问题,所以迫切的需要一款实用的管理软件的出现。充分考虑到在固定资产管理中可能遇到的种种问题,系统主要应该包括资产管理中的日常管理,从而实现对资产的全方位监控管理。

从实用性来分析。系统已实际需求为基础,尽量全面的做好需求分析,解决固定资产中的种种普遍问题,以减少日后更新软件的次数。

  1. 经济性原则

系统开发需要进行多方面的考虑,不仅要从使用性和扩充性考虑,还需要从适当的经济角度分析。首先,进行开发成本的估算以及了解取得效益的评估,确定要开发的项目是否值得投资开发,这些即为经济可行性研究的内容。对于大多数系统,一般衡量经济上是否合算,应考虑一个底线。其次,经济可行性研究范围比较广,包括成本—效益分析、公司的长期经营策略、开发所需的成本和资源、潜在的市场前景。

本系统建立适合高校自身需求的网络平台,提供广泛的涵盖资产管理多种需求的功能,数据处理方式灵活,满足需求,节省网站建设成本,并确保其较好的拓展性和开放性;同时网站具有基于WEB界面的管理后台,能够自主的对网站中的内容作更新、修改操作,节省了高校网站的运营成本,提高了信息更新、传播效率。

  1. 扩充性原则

网站的整体规划及框架设计是具可扩充性的。首先前台页面的设计能保证网站在增加栏目后不会破坏网站的整体结构。以此方便后期维护升级,不仅减少经济开支,并且大大提高了解决实际问题的效率,所以本系统具有很高的实际应用价值。其次后台数据库的设计具有高度的扩充性,能够根据需要对资产、员工的增、减、改、查,从而完成对资产设备的大批量录入或者删除及修改等相关操作,对员工表亦可如此操作,达到了根据实际需求实现操作并完成提高升级性能和高度扩充的目的。

  1. 社会可行性原则

研究要开发的项目是否存在任何侵犯、妨碍等责任问题,要开发项目的运行方式在用户组织内是否行的通,现有管理制度、人员素质和操作方式是否可行,这些即为社会可行性研究的内容。社会可行性所涉及的范围也比较广,它包括合同、责任、侵权、用户组织的管理模式及规范,其他一些技术人员常常不了解的陷阱等。本项目根据实际需求开发,能够完成资产的基本管理应用,具有一定的上线应用价值。

因为本平台是个人自主开发的,所以不存在侵权、管理制度、组织管理等问题,这个平台的社会可行性是可行的。

  1. 本章小结

本章主要介绍固定资产的管理在过去有很大的弊端,急需一个系统高效的管理系统。并且以实际角度出发,根据固定资产具有的相关特点对项目进行实用性、经济性、扩充性和社会可行性等多方面做到深层次的分析,达到管理容易、更新信息方便、操作简便、信息透明化等目的,从而解决以往存在的问题。

  1. 系统分析
  1. 需求分析

设备不仅是高校固定资产的重要组成部分,也是一个高校技术装备水平的重要标志,赖以正常经营和参与市场竞争的物质技术基础。根据高校的实际需求本系统具有以下的功能需求:

  1. 统一、友好的操作界面,能保证系统的易用性。
  2. 完善的资产及设备档案管理,支持资产及设备信息的增加、删除、修改、查询等基本管理模块。
  3. 软件同时提供了资产及设备的借出、归还管理,资产及设备的维修管理。
  4. 软件提供了多功能查询,有多种查询条件可以任意选择,方便信息的汇总。
  5. 连续录入式的应用增添及维护管理,用户的权限、密码修改设置。
  1. 技术可行性
  1. 动态网站技术介绍

Internet起源于20世纪60年代的美国,它在近几年迅速风靡全球,其根本原因不仅在于它拥有卓越的国际通信功能,更在于它拥有巨大的信息资源。所谓的Internet是指由分布在全世界成千上万的计算机网络遵循一定的通讯协议,并相互联系在一起而形成的国际互连网络,也就是说,Internet是建立和使用这些网络的人群、群体、公司以及各种网络资源的集合体。

随着网络技术的不断发展,单纯的静态页面已经不能满足发展的需要,因为静态页面是用单纯的HTML语言组成的,它没有交互性.因此,为了满足实际的需要,许多网页文件扩展名不再只是“htm”、“html”,出现了以“php”、“asp”、“jsp”、“shtml”等为后缀的网页文件,这些都是采用动态网页技术制作出来的。

  1. 程序语言的选择
  1. CGI

CGI(Common Gateway Interface,通用网关接口)。首先,客户端(即Web浏览器)根据某资源的URL(Uniform Resource Locator,统一资源定位器)向Web服务器提出请求,Web服务器的HTTP Daemon(守护进程)将此请求的参数通过标准输入stdin和环境变量传递给指定的CGI程序,并启动此应用程序进行处理,如要存取数据库服务器上数据库的数据,则向数据库服务器发出处理请求,数据库服务器将执行结果返回给CGI程序,CGI程序处理结果通过标准输出stdout返回给HTTP Daemon进程,再由HTTP Daemon进程返回给客户端,由浏览器解释执行,将最终结果在用户面前显示。CGI允许Web服务器运行外部应用程序,以通过外部程序来访问数据库等一些外部资源,并产生HTML文档给浏览器。但每次请求CGI程序都要重新启动程序,影响了响应的速度,且CGI程序不能被多个客户请求共享,影响了各种资源的使用效率。为了克服CGI的这些缺点,一些Web服务器厂商开发出了专用的API(Applications Program Interface应用程序接口),这样就允许程序员编写程序来扩展服务器的功能。API相对于CGI与Web服务器的结合更加紧密,占用的资源较少,运行的效率大有提高,安全性与保护性更好。但是开发API应用程序比开发CGI应用程序复杂得多,要求程序员掌握更多的计算机软件知识,且各种API之间的兼容性不好,业界没有一个统一的标准,使得API程序只能工作在专用的Web服务器与操作系统之上。编写CGI的程序设计语言有许多种,常用的有C,PERL,Visual C++等,由于对程序员的要求较高,且编写与调试比其它队编程技术困难,故近年来基于B/S的信息系统工程时间中已很少被采用。

  1. JSP

JSP(Java Server Pages)是由Sun公司倡导,许多别的公司参与一起创建的一种新动态网页技术标准,类似其他技术标准。在传统的网页HTML文件(*.htm,*.html)中加入Java程序片断(Script let)和JSP标签,构成了JSP网页(*.jsp)Servlet/JSP Container收到客户端发出的请求时,首先执行其中的程序片断,然后将执行结果以HTML格式响应给客户端,其中程序片断可以是:操作数据库,重新定向网页以及发送E-Mail等等,这些都是建立动态网站所需要的功能。所有程序操作都在服务器端运行,网络上传送给客户端的仅是得到的结果,与客户端的浏览器无关,因此,JSP被称为Server-side Language,所以被许多人认为是未来最有发展前途的动态网站技术之一。

经过如上的程序语言的比较,PHP功能相对简单,不适合作大程序,而CGI效率相对较低,所以也不考虑,因为该系统并没有原有的基础平台需要扩展,也不需要与其他系统进行太多的交互,所以使用J2EE的模式并不能够体现出J2EE本身的优势,而JSP又是J2EE的核心技术之一,可以随时升级为J2EE程序,这里暂时不考虑采用J2EE,这样只需要在ASP和JSP中进行选择.在进行了诸多因素的比较之后,最终认为目前这个阶段比较合适的是JSP,而选择Struts架构作为开发的主体框架,选用Hibernate作为数据持续性处理层,则是考虑到了其高速的开发效率,及代码重用性高,易于维护等各种优势。其最终目的是希望提高系统底层业务逻辑的可重用性,增加系统的可扩展性,降低系统维护成本。

  1. 软件可行性分析
  1. 软件环境

开发一个固定资产管理系统需相应的前段开发工具和数据管理系统,还需要一个服务器等。本系统根据Struts+Spring+Hibernate组合结构设计而成,利用Hibernate进行持久层开发,Struts进行业务逻辑控制,利用Spring进行Bean的管理,依赖注入。MVC模式贯穿了整个设计流程,Model层的使用spring的核心技术IOC控制依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间的依赖关系管理,如此减少代码冗余,View层主要运用Ajax无刷新提交,充分增加了客户体验,JSTL的应用使各个层之间的联系更加容易,JavaScript进行多种页面的验证,判断是否符合逻辑要求,若不符合验证需要重新填写,为后台服务器节省资源,已达到提高效率减轻服务器压力,继承使得我们可以对持久层的对象进行抽象,方便理解易于管理,可以简化创建用户界面的过程。Controller层中的action主要负责接受HTTP请求信息,可以接管用户请求并对异常进行处理。根据配置文件struts-config.xml的配置信息,把请求转发给合适的Action对象。Action类负责调用模型的方法,更新模型的状态,并帮助控制应用程序的流程。本文开发的固定资产管理系统所需要的环境如下:

开发工具:Myeclipse8.0,PowerDesigner12.5,Rational Rose

数据库:MySQL5.1

Web服务器:Tomcat 6.0

操作系统:Windows 7

外部包:Struts.jar,Hibernate.jar,JavaReport-V3-Enterprise-Released.jar

  1. 服务器端
  2. 开发工具

MyEclipse企业级工作平台(MyEclipse Enterprise Workbench,简称MyEclipse)是对Eclipse IDE的扩展,利用它我们可以在数据库和JavaEE的开发、发布,以及应用程序服务器的整合方面极大地提高了工作效率。它是功能丰富的JavaEE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML、Struts、JSF、CSS。JavaScript、SQL、Hibernate。本系统利用现在JAVAEE开发的主流工具MyEclipse进行开发,它不仅是一个开源软件,而且是一个基于Java的可扩展开发平台。MyEclipse的功能十分强大,支持也十分广泛,尤其是对各种开元产品的支持十分不错。

  1. 数据库

MySQL是最受欢迎的开源SQL数据库管理系统,它由MySQL AB开发、发布和支持。它是一个快速的、多线程、多用户和健壮的SQL数据库服务器,服务器支持关键任务、重负载生产系统的使用,也可以将它嵌入到一个大配置(mass-deployed)的软件中去,一个数据库是一个结构化的数据集合,如果要添加、访问和处理存储在一个计算机数据库中的数据,就需要一个像MySQL这样的数据库管理系统。从计算机可以 很好的处理大量的数据以来,数据库管理系统就在计算机处理中和独立应用程序或其他部分应用程序一样扮演着一个重要的角色。MySQL服务器就是这样一个快的、可靠的和易于使用的数据库服务器,它的连接性、速度和安全性使MySQL非常适合访问在Internet上的数据库。

  1. Web服务器

Tomcat不仅仅是一个Servlet容器,它也具有传统的Web服务器的功能:处理Html页面。基于Tomcat的开发其实主要是Jsp和Servlet的开发,开发Jsp和Servlet非常简单,可以用普通的文本编辑器或者IDE,然后将其打包成WAR即可,和传统的桌面应用程式不同,Tomcat中的应用程式是个WAR(Web Archive)文件,WAR是Sun提出的一种Web应用程式格式,和JAR类似,也是许多文件的一个压缩包。这个包中的文件按一定目录结构来组织:通常其根目录下包含有Html和Jsp文件或包含这两种文件的目录,另外还会有一个WEB-INF目录,这个目录非常重要。通常在WEB-INF目录下有一个web.xml文件和一个classes目录,web.xml是这个应用的设置文件,而classes目录下则包含编译好的Servlet类和Jsp或Servlet所依赖的其他类(如JavaBean)。通常这些所依赖的类也能打包成JAR放到WEB-INF下的lib目录下进行统一管理。在Tomcat4以后的高级版本中可以利用Servlet2.3提供的事件监听器功能,来对系统的应用或者Session实行监听。Tomcat也提供其它的一些特征,如与SSL集成到一块,实现安全传输。还有Tomcat也提供JNDI支持,这与那些J2EE应用服务器提供的是一致的。

  1. 开发语言

Java是一种跨平台,适合于分布式计算环境的面向对象编程语言。具体来说,它具有如下特性:面向对象、多态性、分布式、可靠、安全、多线程等如下:

面向对象:面向对象其实是现实世界模型的自然延伸。现实世界中任何实体都可以看作是对象。对象之间通过消息相互作用。另外,现实世界中任何实体都可归属于某类事物,任何对象都是某一类事物的实例。如果说传统的过程式编程语言是以过程为中心以算法为驱动的话,面向对象的编程语言则是以对象为中心以消息为驱动。用公式表示,过程式编程语言为:程序=算法+数据;面向对象编程语言为:程序=对象+消息。

所有面向对象编程语言都支持三个概念:封装、多态性和继承,Java也不例外。现实世界中的对象均有属性和行为,映射到计算机程序上,属性则表示对象的数据,行为表示对象的方法(其作用是处理数据或同外界交互)。所谓封装,就是用一个自主式框架把对象的数据和方法联在一起形成一个整体。可以说,对象是支持封装的手段,是封装的基本单位。Java语言的封装性较强,因为Java无全程变量,无主函数,在Java中绝大部分成员是对象,只有简单的数字类型、字符类型和布尔类型除外。而对于这些类型,Java也提供了相应的对象类型以便与其他对象交互操作。

多态性:就是多种表现形式,具体来说,可以用“一个对外接口,多个内在实现方法”表示。举一个例子,计算机中的堆栈可以存储各种格式的数据,包括整型,浮点或字符。不管存储的是何种数据,堆栈的算法实现是一样的。针对不同的数据类型,编程人员不必手工选择,只需使用统一接口名,系统可自动选择。运算符重载(operator overload)一直被认为是一种优秀的多态机制体现,但由于考虑到它会使程序变得难以理解,所以Java最后还是把它取消了。继承是指一个对象直接使用另一对象的属性和方法。事实上,我们遇到的很多实体都有继承的含义。例如,若把汽车看成一个实体,它可以分成多个子实体,如:卡车、公共汽车等。这些子实体都具有汽车的特性,因此,汽车是它们的“父亲”,而这些子实体则是汽车的“孩子”。Java提供给用户一系列类(class),Java的类有层次结构,子类可以继承父类的属性和方法。与另外一些面向对象编程语言不同,Java只支持单一继承。

平台无关性:Java是平台无关的语言是指用Java写的应用程序不用修改就可在不同的软硬件平台上运行。平台无关有两种:源代码级和目标代码级。C和C++具有一定程度的源代码级平台无关,表明用C或C++写的应用程序不用修改只需重新编译就可以在不同平台上运行。Java主要靠Java虚拟机(JVM)在目标码级实现平台无关性。JVM是一种抽象机器,它附着在具体操作系统之上,本身具有一套虚机器指令,并有自己的栈、寄存器组等。但JVM通常是在软件上而不是在硬件上实现。(目前,SUN系统公司已经设计实现了Java芯片,主要使用在网络计算机NC上。另外,Java芯片的出现也会使Java更容易嵌入到家用电器中。)JVM是Java平台无关的基础,在JVM上,有一个Java解释器用来解释Java编译器编译后的程序。Java编程人员在编写完软件后,通过Java编译器将Java源程序编译为JVM的字节代码。任何一台机器只要配备了Java解释器,就可以运行这个程序,而不管这种字节码是在何种平台上生成的。另外,Java采用的是基于IEEE标准的数据类型。通过JVM保证数据类型的一致性,也确保了Java的平台无关性。Java的平台无关性具有深远意义。首先,它使得编程人员所梦寐以求的事情(开发一次软件在任意平台上运行)变成事实,这将大大加快和促进软件产品的开发。其次Java的平台无关性正好迎合了“网络计算机”思想。如果大量常用的应用软件(如字处理软件等)都用Java重新编写,并且放在某个Internet服务器上,那么具有NC的用户将不需要占用大量空间安装软件,他们只需要一个Java解释器,每当需要使用某种应用软件时,下载该软件的字节代码即可,运行结果也可以发回服务器。目前,已有数家公司开始使用这种新型的计算模式构筑自己的企业信息系统。

分布式:分布式包括数据分布和操作分布。数据分布是指数据可以分散在网络的不同主机上,操作分布是指把一个计算分散在不同主机上处理。Java支持WWW客户机/服务器计算模式,因此,它支持这两种分布性。对于前者,Java提供了一个叫做URL的对象,利用这个对象,你可以打开并访问具有相同URL地址上的对象,访问方式与访问本地文件系统相同。对于后者,Java的applet小程序可以从服务器下载到客户端,即部分计算在客户端进行,提高系统执行效率。Java提供了一整套网络类库,开发人员可以利用类库进行网络程序设计,方便得实现Java的分布式特性。

可靠性和安全性:Java最初设计目的是应用于电子类消费产品,因此要求较高的可靠性。Java虽然源于C++,但它消除了许多C++不可靠因素,可以防止许多编程错误。首先,Java是强类型的语言,要求显式的方法声明,这保证了编译器可以发现方法调用错误,保证程序更加可靠;其次,Java不支持指针,这杜绝了内存的非法访问;第三,Java的自动单元收集防止了内存丢失等动态内存分配导致的问题;第四,Java解释器运行时实施检查,可以发现数组和字符串访问的越界,最后,Java提供了异常处理机制,程序员可以把一组错误代码放在一个地方,这样可以简化错误处理任务便于恢复。

由于Java主要用于网络应用程序开发,因此对安全性有较高的要求。如果没有安全保证,用户从网络下载程序执行就非常危险。Java通过自己的安全机制防止了病毒程序的产生和下载程序对本地系统的威胁破坏。当Java字节码进入解释器时,首先必须经过字节码校验器的检查,然后,Java解释器将决定程序中类的内存布局,随后,类装载器负责把来自网络的类装载到单独的内存区域,避免应用程序之间相互干扰破坏。最后,客户端用户还可以限制从网络上装载的类只能访问某些文件系统。上述几种机制结合起来,使得Java成为安全的编程语言。

多线程:线程是操作系统的一种新概念,它又被称作轻量进程,是比传统进程更小的可并发执行的单位。C和C++采用单线程体系结构,而Java却提供了多线程支持。Java在两方面支持多线程。一方面,Java环境本身就是多线程的。若干个系统线程运行负责必要的无用单元回收,系统维护等系统级操作;另一方面,Java语言内置多线程控制,可以大大简化多线程应用程序开发。Java提供了一个类Thread,由它负责启动运行,终止线程,并可检查线程状态。Java的线程还包括一组同步原语。这些原语负责对线程实行并发控制。利用Java的多线程编程接口,开发人员可以方便得写出支持多线程的应用程序,提高程序执行效率。必须注意地是,Java的多线程支持在一定程度上受运行时支持平台的限制。例如,如果操作系统本身不支持多线程,Java的多线程特性可能就表现不出来。

  1. 客户端

客户端由于不涉及到系统的开发和维护等问题,因此可以不用安装过多的软件,只要能够实现对服务器端的访问就可以,一般来说普通PC机即可。

  1. 硬件环境
  1. 服务器端

服务器端的配置是有建立站点所需的硬件来决定的。在最低配置下,服务器虽然能正常工作,但其性能往往不尽如人意,如果我们想使服务器工作的更好的话,我们需要更好的配置,特别是服务器的内存应该大于2G,下面为服务器的最低配置:

处理器:双核2.1GHz

内存:2GB

显卡:SVGA显示适配器

光驱:安装系统及相关软件

网卡:PCI和ISA接口均可

  1. 客户端

客户端主要用于浏览系统界面、同web数据库进行数据交互等基本操作,因此客户端对硬件要求不高,主要由所安装的Windows的要求来决定。但若期望性能更好,需要的配置应该高于以下配置:

处理器:双核2.1GHz

内存:2GB

硬盘:320G

显卡:SVGA显示适配器

网卡:PCI和ISA接口均可

  1. 系统结构可行性分析
  1. B/S模式简介

本系统采用B/S模式

B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。以目前的技术看,局域网建立B/S结构的网络应用,并通过Internet/Intranet模式下数据库应用,相对易于把握、成本也是较低的。它是一次性到位的开发,能实现不同的人员,从不同的地点,以不同的接入方式(比如LAN、WAN、Internet/Intranet等)访问和操作共同的数据库;它能有效地保护数据平台和管理访问权限,服务器数据库也很安全。特别是在JAVA这样的跨平台语言出现之后,B/S架构管理软件更是方便、快捷、高效。

  1. B/S模式的优点
  1. 维护和升级方式简单

目前,软件系统的改进和升级越来越频繁,B/S架构的产品明显体现着更为方便的特性。对一个稍微大一点的单位来说,系统管理员如果需要在几百甚至上千部电脑之间来回奔跑,效率和工作量是可想而知的,但B/S架构的软件只需要管理服务器就行了,所有的客户端只是浏览器,根本不需要做任何的维护。无论用户的规模有多大,有多少分支机构都不会增加任何维护升级的工作量,所有的操作只需要针对服务器进行就可以;如果是异地,只需要把服务器连接专网即可,实现远程维护、升级和共享。所以客户机越来越“瘦”,而服务器越来越“胖”是将来信息化发展的主流方向。今后,软件升级和维护会越来越容易,而使用起来会越来越简单,这对用户人力、物力、时间、费用的节省是显而易见的惊人。因此,维护和升级革命的方式是“瘦”客户机,“胖”服务器。

  1. 成本降低,选择更多

大家都知道windows操作系统在平常应用上几乎一统天下,浏览器成为了标准配置,但在服务器操作系统上windows并不是处于绝对的统治地位。现在的趋势是凡使用B/S架构的应用管理软件,只需安装在Linux服务器上即可,而且安全性高。所以服务器操作系统的选择是很多的,不管选用哪种操作系统都可以让大部分人使用windows作为桌面操作系统,电脑不受影响,这就使得最流行免费的Linux操作系统快速发展起来,Linux除了操作系统是免费的以外,连数据库也是免费的,这种选择非常盛行。

比如说很多人每天上“网易”网,只要安装了浏览器就可以了,并不需要了解“网易”的服务器用的是什么操作系统,而事实上大部分网站确实没有使用windows操作系统,但用户的电脑本身安装的大部分是windows操作系统。

  1. 本章小结

本章节首先对项目所要实现的功能进行分析,应主要包含对资产的录入、销毁、维修、借入借出和多功能查询,和对相关工作人员的管理和权限的分配。然后介绍一下本系统所涉及到的技术知识,及对系统所需要的软硬件环境进行说明。最后阐述为何会选择B/S结构和诸多好处。

  1. 关键技术
  1. 开发架构
  1. 软件开发架构的意义

对于已经习惯了使用传统的JSP设计方式实现动态网站的程序员,在刚开始接触Struts时经常会出现一种困惑:专业书籍和文章中总是使用Struts Framework这种说法,Struts通常也被称为是一种Web应用开发的架构(Framework),那么到底什么是架构,软件开发架构的意义又是什么呢?

如果将早期的软件开发方式比喻为传统手工业生产方式的话,那么基于软件开发架构的开发方式则是大型现代化工厂生产方式的体现。虽然二者都能够制作出产品,但是在生产效率及产品质量的保证上显然会有巨大的差异。

汽车生产厂家在制造一辆汽车时,总是先在各条生产线上制作出不同类型的零件,最终再由专业的技师在专业的组装生产线上将成百上千的零件组装成一台完整的汽车,显然,设计者的主要精力并不是用于重复地制造相同的车轮,相同的方向盘,而是利用现成的车轮组装出一辆辆不同的汽车。同样,开发人员也可以利用软件架构中提供的组建库(如同已经生产好的规范化的汽车核心零部件库),按照既定的组装方式将不同的组建应用在软件产品的各个环节,最终开发出一个完整的,高质量的软件产品。

实际上,如果需要,汽车设计者也可以将原有的车轮进行改造,例如涂上不同的颜色,贴上不同的装饰物等。同理,软件开发人员可以在现有组件的基础上进行扩展和改进,这实际上充分地实现了软件开发的可扩展性。

组件复用是面向对象编程思想的结晶,而在软件架构的基础上进行开发可以最大限度地实现组件的复用。在大型、多层结构的软件开发项目中,开发和使用具有可重用性,可扩展性,经过良好测试的软件组织,可以使开发者从大量繁琐的代码工作中解脱出来,专注于软件设计和业务逻辑的实现。通常将被验证为有效的,相同类型问题的解决方案进行抽象,即可提取形成一个应用程序框架,即Framework。每一种Framework都有自己的一套明确的实现机制,通常在Framework结构中都会包含一个“命令和控制”组件(“command and control”component),类似于工业生产中的“控制中心”,开发人员通过它可以很容易地控制、扩充和实现该Framework上的开发结构。

  1. Struts架构简介

随着Web开发技术的日益成熟,在Web开发领域中出现了许多设计好的软件开发框架,Struts就是一种基于MVC经典设计模式的框架,也是当前Web开发中比较成熟的一种框架。

  1. 经典的MVC模式

MVC(Model-View-Controller)模式,即模型-视图-控制器模式,其核心思想是将整个程序代码分成相对独立而又能协同工作的3个组成部分。

(1)模型(Model):业务逻辑层。实现具体的业务逻辑,状态管理的功能。

(2)视图(View):表示层。即与用户实现交互的界面,通常实现数据输入和输出功能。

(3)控制器(Controller):控制层。起到控制整个业务流程(Flow Control)的作用,实现View和Model部分的协同工作。

MVC设计模式可以针对需要为同样的数据提供多个不同视图的应用程序,例如:公司产品数据库中同样的产品信息数据,但需要根据用户的不同需求在页面中显示其所需的不同产品信息。

MVC设计模式中,事件一般是指客户端Web浏览器提交的各种不同请求,这些请求由控制器进行处理,控制器根据事件的类型来改变模型或各个视图,视图也可以接受模型发出的数据更新的通知,依据数据更新的结果调整视图效果,呈现在用户面前。而模型也可以通过视图所获得的用户提交的数据进行具体业务逻辑的处理。

显然这样的运行机制可以起到分工明确,职责清晰,各尽所长的效果。而在软件开发的过程中,这样的开发方式无疑可以有效地区分不同的开发者,尽可能减少彼此之间的互相影响。充分发挥每个开发者的特长。这在开发大型复杂的Web项目时体现得尤为突出。如图3-1所示。


模    型



视图1



视图 2



控制器



事 件



改变



改变



改变



更新



更新



获得数据



获得数据


  

图3-1

  1. Struts 1.2开发框架

作为基于MVC设计模式的Web应用的一种典型体现,Struts架构实际上是建立在Model2基础上的,对Model,View和Controller都提供了现成的实现组建。

  1. Controller控制器部分

Struts中的Controller控制器部分是通过专门的Servlet来实现的,该Servlet是一个Struts API中提供的Action Servlet类型的实例,Action Servlet类继承了javax.servlet.http.HttpServlet类,因此该类的实例可以和普通的Servlet一样工作,其作用是接收客户端浏览器的请求,然后选择执行相应的业务逻辑,再把响应结果送回到客户端。

Action对象是开发者定义的类(该类必须是Struts API中提供的Action类的子类)的实例。在继承该类的过程中开发者可以加入具体业务逻辑或调用业务逻辑模块。Action对象在进行了业务逻辑或调用业务逻辑模块。Action对象在进行了业务逻辑的处理以后会将应用程序流程转到合适的View组件,最终将响应送回浏览器客户端。Struts中提倡Action对象只用来决定“做什么”,相当于一个低层面的控制器,因此也可以将Action归纳为Controller的组成部分。

  1. Model模型部分

MVC系统中的Model模型部分从概念上可以分为两类:系统的内部状态和改变系统状态的动作。Struts中的Model部分一般由JavaBean以及EJB组成。在Struts架构中使用JavaBean来提供具体的业务逻辑,即“怎么做”,对于复杂的系统也可以使用EJB等组件来实现系统状态维护。这种业务逻辑的细分可以增强代码的可重用性。

  1. View视图部分

Struts中的View视图部分依然可以采用JSP来实现.此外,Struts还提供了丰富的自定义标签库,View部分使用这些自定义标签同样可以实现与Model部分的有效交互并能够增强显示功能。

  1. Struts开发环境安装

在Tomcat安装完成后,即可将Struts框架工具安装到对应的WEB Container中。可以通过Struts的二进制发布包安装Struts框架,具体操作步骤:

(1)下载二进制发布版;

(2)将下载的Struts二进制发布包进行解包,将解包目录下的lib目录下的所有.jar文件全部复制到项目目录的WEB-INF/lib下,如果在多个项目中都用到了Struts,则将上述文件直接复制到Tomcat目录下的common/lib下;

(3)将对应的lib目录下的struts.jar文件添加到环境变量CLASSPATH中即可。以上资源可以从http://jakarta.apache.org/struts/userGuide/index.html获得更多关于Struts安装和相关配置的说明信息。

  1. 数据持久层

数据是软件系统中不可缺少的环节,数据持久化的解决之道也一直是企业计算标准中最有影响力的部分。如今关系型数据库已经稳定地占据着主要的数据库市场,XML技术和XML数据库技术也日渐成熟。

J2EE的三层结构是指表示层(Presentation),业务逻辑层(Business Logic)以及基础架构层(Infrastructure),这样的划分非常经典,但是在实际的项目开发法中,开发者通常对三层结构进行扩展来满足一些项目的具体要求,一个最常用的扩展就是将三层体系扩展为五层体系,即表示层(Presentation),控制/中介层(Controller/Mediator)、领域层(Domain),数据持久层(Data Persistence)和数据源层(Data Source)。它其实是在三层架构中增加了两个中间层。控制/中介层位于表示层和领域层之间,数据持久层位于领域层和基础架构层之间。由于对象范例和关系范例这两大领域之间存在“阻抗不匹配”,所以把数据持久层单独作为J2EE体系的一个层提出来的原因就是能够在对象-关系数据库之间提供一个成功的企业级映射解决方案尽最大可能弥补这两种范例之间的差异。

  1. 持久层主流方案

数据是我们软件开发人员必须考虑的对象。无论你使用哪种技术,借助哪种工具,以及购买哪种软件平台产品,当接受一个实际的问题时,你都需要面对实际的数据,考虑实际数据的各种问题。在这些问题中往往都包含数据持久化的问题,这不仅是因为我们的计算机内存有限,更主要的原是业务逻辑的需要,作为一个接触软件技术,尝试写程序的人,我们要接触各种类型的数据。下面列举了三种常见的数据类型:

  1. 随机数据

这种数据指的是不确定结构,不了解数量,目前也搞不清关系的数据。它听起来很奇怪,但在实际的程序设计中十分常见。例如:从一个震动源传递到计算机采集卡的数据,再比如一个自然物生长过程中的数据。可能有些数据实际上是很有规律的,但是在设计程序时由于对它的了解很少,使它对于我们来说也成了随机的数据了。我曾经在遇到这种搞不大清楚的数据时,使用很大的数组或者多个链表来表述,不管下一个数据的值是什么,先存储起来再说。有时候当遇到的数据总也摸不到规律,或者越来越多,内存也容纳不下时,就找个文件存放起来,后来发现其实存入文件的方式很不错,起码可以一直继续下去。也许这就是最佳的持久化策略了。

  1. 属性数据

在接触具体的项目开发任务时,更多的时候要接触到属性类型的数据,这些数据来源于对象的属性,当然这些属性之间还存在关系,对于此类数据,似乎最好的持久化方法就是利用关系型数据库表了,在存入数据表的过程中还可以借助Hibernate来提高开发的效率,或者直接使用JDBC来传递SQL语句。这两种方法有些相似但还有细微的差别。

  1. XML数据

现在很多网络上的应用程序都使用XML类型的数据,或者说是一种树状的数据,如何将这两种数据持久化保存下来呢?一种方法是将XML数据拆分为属性数据,然后存储到关系型数据库中。另一种方式比较新,是将XML数据存储到XML数据库中,在XML数据库中存储这种数据时,数据的结构不变,XML数据在XML数据库中以文档对象形式保存,使用XPaht和XQuery查询语言来查询XML数据中的节点数据,或者多个XML文档中的多个节点数据。

  1. 持久层主流方案
  1. JDBC

许多开发者用JDBC进行数据库程序的开发。此中方式很多情况下都使用DAO模式,采用SQL进行查询。虽然用此方式可以使应用程序代码与具体的数据库厂商和数据库位置无关,不过JDBC是低级别的数据库访问方式,JDBC并不支持面向对象的数据库表示。JDBC数据库表示完全围绕关系数据库模型。在大型应用程序的DAO中书写这样的代码,维护量是非常大的。

  1. EJB

在J2EE的规范中,为EJB定义了两种持久化的解决方案:一种是BMP,另一种是CMP。其中CMP不需要将SQL语句加入到代码中。目前,在采用J2EE的应用中,EJB CMP方式得到了广泛应用。更加引人注意的是,随着EJB规范的发展,CMP也包含了一些高级关系的内容。但是,CMP的使用比较复杂,对很多开发人员来说比较难以掌握。而且,不是在所有的情况下都适合在系统中采用EJB,而且想要非常清楚的了解EJB规范也是非常费时的。在用EJB编码前,先要让专家理解API,然后需要了解每一个容器部署时所要关注的技术。此外,许多情况下商用容器的性能和支持也不是很好。

  1. JDO

JDO是一个存储java对象的规范,JDO规范1.0的提出可以使你将精力集中在设计Java对象模型,然后在企业应用软件架构的不同层面中存储传统的Java对象(Plain Old Java Objects,简称POJOs),采用JDOQL语言进行SQL操作。一些公司(包括sun)企图根据JDO规范进行设计并实现JDO产品,然而他们都不能很好的进行实现,并且性能优化上比较差。

  1. 持久化技术

一直以来,在Java开发领域中基于数据库应用的设计实现一直是面向关系的,也就是说与数据库相关的处理过程并没有实现真正的面向对象。如何在数据存取的操作中实现真正的面向对象,一直是开发人员探索的问题。正在使用中的对象序列化技术,EJB中Entity Bean技术等,都是在这方面很好的探索。但是实体Bean设计实现过程中的繁琐和复杂,使得许多开发人员望而却步。

而Hibernate的出现,提供了一个符合Java面向对象编程思想,易于使用的数据库持久化解决方案。因此,在目前行业的Java数据库应用项目中,有越来越多的开发人员开始尝试使用Hibernate在数据库外面包裹上一层面向对象的外衣,从而将开发人员从繁琐、重复、技术含量不高的数据库编程中结果出来。

Hibernate概述:

Hibernate在英文中的意思是“冬眠”,从这个角度也可以体会到Hibernate架构下提供的相关技术可以实现对十角状态的持久性保存。在传统的数据库编程中,开发人员要面对大量重复行代码的编写,以实现对不同数据表中的数据的获取,并将获取到的记录数据封装成对象,在处理完成之后,如果需要进行对象状态的存取,需要将对象中的数据拆卸成数据库记录中的对应字段的值,然后向数据库中进行存取。

这种工作方式显然没有实现真正意义上的数据存取阶段的面向对象。虽然数据存取过程中的工作步骤是基本固定的,但是由于操作的数据表中字段列表数据的不同,使得开发人员必须要不厌其烦地书写与相应的实体类对应的封装处理过程。

而在Hibernate中,类似这种重复性高,工作量大,但是又必须保证高质量完成的体力活,全部由Hibernate接管过去。这对广大的Java开发人员无疑是个非常好的消息。

Hibernate本质上是一个面向Java开发环境的对象/关系数据库映射工具。在Hibernate之前,开发人员要将面向对象的软件和关系数据库结合在一起,往往会费长麻烦。而借助Hibernate对象/关系数据库映射技术,可以非常轻松地将以面向对象思想封装的对像的各个状态数据映射到基于SQL的关系模型数据结构中去。如图3-2所示。


Java应用



Hibernate



HQL语句




数据库



SQL语句



XML

映射

文件


图3-2

  1. 本章小结

本章节阐述了Struts框架有何优点,并将MVC模式以图形加文字的双重方式进行介绍,充分展现其好处,引出固定资产管理系统选取Struts1.2为开发框架,采用经典的MVC模式对项目进行整体的分层,让项目层次分明、代码规范。再由框架引出数据库同样是系统中不可分割的一部分,然后提出通过Hibernate的映射文件简化对数据库的操作,从而达到更好的面向对象进行开发。

  1. 总体设计

系统设计是在系统分析的基础上由抽象到具体的过程。主要目标是将系统分析阶段所提出的反映了信息需求的系统逻辑方案转换成可以实施的基于计算机与通信系统的物理(技术)方案,为下一阶段系统实施提供必要的技术资料,应符合系统性、灵活性、可靠性、经济性的要求。根据系统分析阶段能确定新系统的逻辑模型、功能要求,在可实现的环境下设计出一个能在计算机网络环境上实施的方案,即建立新系统的物理模型。本阶段的任务是设计软件系统的模型层次结构,设计数据库的结构以及涉及模块的控制流程,其目的是明确系统具体怎么实现。这个阶段又分为两个步骤:概要设计和详细设计。概要设计解决软件系统的模块划分和模块的层次机构以及数据库设计;详细设计解决每个模块的控制流程,内部算法和数据结构的设计。根据种种分析设计在逐步实现各个功能,完成一个完整的固定资产管理系统。

  1. 总体设计


用户管理



资产管理



资产维护



系统管理



增加

删除用户



用户

信息维护



资产信息



删除资产信息



资产

借出



资产

归还



资产信息

查询



删除维修信息



添加维修信息



维修

信息查询



用户密码修改



系统退出



员工管理



增加员工信息




修改员工信息




删除员工信息




报表



打印报表




固定资产管理系统


本系统对固定资产进行标识,实现了固定资产生命周期和使用状态的全程跟踪。标识后的资产在进行清查和巡检时依靠设备编号从而达到:方便、快捷、准确的定位资产,保证了信息流和资产实物流的对应。利用计算机支持不同的团体机构完成固定资产管理的事物,由计算机来代替人工执行一系列的诸如增加新的资产信息、变更资产信息、删除资产信息、查询、修改等操作。这样使办公室人员可以轻松快捷地完成固定资产管理的任务,使企业的员工管理资产能够系统化、规范化、半自动化,从而有效地解决了企业固定资产的管理难题,使企业更轻松、更有效地管理固定资产。总体设计如图4-1所示。

图4-1 系统功能模块图

本系统主要分为四大模块:

资产管理模块:根据不同资产的唯一编号对资产进行购入、销毁、修改属性和多种组合条件的查询操作等,里面包括相应的逻辑验证及提示。对资产维护的增加维修设备、删除已经维修好的信息、查询操作;支持对固定资产库存报表的多种格式打印。

用户管理模块:可直接添加员工成为用户并为其分配不同的权限,管理员权限是本系统最大的权限,可以对所有的设备和人员进行维护、查询等操作。操作员不拥有分配权限的功能,可以完成除了此模块之外的所有功能,如:首先,可对资产进行录入、所有资产不同方式的查询、销毁某些设备、修改设备属性信息及对设备进行借出归还状态的跟踪和更改,及时更新设备的所处状态和库存设备的全部信息等。其次可对员工进行的增加、删除、修改信息和查询等相应的维护,可以将库存设备信息根据不同需求打印出来。

员工管理:支持对学校的教工信息的维护,包括新增员工、删除员工、修改员工所处状态和对员工进行明细查询等。

系统管理:修改登陆用户的登录密码及安全退出系统,保证系统的正常运行。

  1. 数据库设计
  1. 数据库的需求分析

依据项目的处理需求,对应数据表的设计及功能如下:

  1. 资产信息表:主要用于保存入库的资产信息。
  2. 资产设备的借出归还表:主要用于保存借出设备的信息。
  3. 资产设备维修信息表:主要用于保存维修资产的信息。
  4. 管理资产信息的用户表:主要用于保存系统管理员的信息。
  5. 公司员工其本信息表:主要用于保存公司员工的基本信息。
  6. 部门表:主要用于保存部门信息。
  1. 数据库表的具体设计

首先从用户的业务数据出发,设计出一张大表,然后对其进行优化。业务分析一定要具体,对于出现的每一张单据和报表都要分析清楚,看哪些字段会用来作为查询字段,然后为这些字段建立数字型的代码,如果字段本身就是数字型的可不予考虑。仔细分析业务数据,从优化查询的角度把业务数据的大表分割开,确保数据正确分布到相应的数据库表中,每个字段都代表此表的特性。本系统首先就从固定资产的实际出发,以资产表为主表,扩充出资产修为表、借出归还表和员工表,员工表属于部门表,员工升级成为用户,产生用户表。然后根据实际需求并考虑系统的后期扩展和健全性填充各个表的字段,以便完成资产管理的操作。

各个数据表如下:

设备借出归还表是由资产表和员工表根据实际需求衍生出来的一张业务表,此表用于保存某位员工于某个时间借出了某个编号的资产借,并打算在什么时间归还及实际的归还时间的全部信息,使得用户对资产的管理更加方便简单。表结构如表4-1资产设备借出归还表。

4-1 资产设备借出归还表

字段名

数据类型

长度

是否主键

描述

inout_no

int

10

借用流水号

ic_id

varchar

30


资产编号

comployee_no

varchar

30


员工编号

out_time

varchar

20


借出时间

should_time

varchar

20


应还时间

back_time

varchar

20


归还时间

用户表是依附于员工表而存在的一张管理员表,此表中根据competence字段区分管理员及操作员两种权限,管理员具有最高权限,操作员可对资产进行全方位的管理和信息查询。表结构如表4-2用户表。

4-2 用户表

字段名

数据类型

长度

是否主键

描述

userName

varchar

30

用户名

pwd

varchar

20


密码

comployee_no

varchar

30


员工编号

competence

varchar

15


权限

员工信息表是跟资产基本表密切相关的一张相关操作表,员工编号为唯一主键,能够标识员工身份。每一次对资产的操作都应该落实到具体的员工头上,让所有的操作都可查,使业务更加清晰,方便应用。表结构如表4-3员工信息表。

4-3 员工信息表

字段名

数据类型

长度

是否主键

描述

comployee_no

varchar

30

员工编号

comployee_name

varchar

25


员工姓名

sex

varchar

5


性别

age

int

10


年龄

dept

varchar

45


部门

profession

varchar

20


现任职务

address

varchar

60


家庭地址

phone

varchar

20


联系方式

comployee_statu

varchar

10


员工状态

设备借出归还表是由资产表和员工表根据实际需求衍生出来的一张业务表,此表用于保存某位员工于某个时间借出了某个编号的资产借,并打算在什么时间归还及实际的归还时间的全部信息,使得用户对资产的管理更加方便简单。表结构如表4-4资产设备借出归还表。

4-4 资产设备借出归还表

字段名

数据类型

长度

是否主键

描述

inout_no

int

10

借用流水号

ic_id

varchar

30


资产编号

comployee_no

varchar

30


员工编号

out_time

varchar

20


借出时间

should_time

varchar

20


应还时间

back_time

varchar

20


归还时间

部门表的存在是专门为了方便使用单而存在的表,其主要用于区分不同部门而方便操作,每个员工都有一个字段叫做dept,使得不同部门的人员,进行不同的归拢,方便管理。具体表结构如表4-5部门表。

4-5 部门表

字段名

数据类型

长度

是否主键

描述

dept

varchar

45

部门名称

资产设备维修信息表也是由资产基本表衍生出来的一张业务表,它用于管理哪些设备因为何种原因而需要维修,其中有由谁送去维修并经过谁手而修,维修流水号应该为唯一主键,包含所有的维修相关信息。表结构如表4-6资产设备维修信息表。

4-6 资产设备维修信息表

字段名

数据类型

长度

是否主键

描述

repair_no

int

10

维修流水号

zc_id

varchar

30


资产编号

send_time

varchar

30


送修时间

sender

varchar

50


送修人

Login_user

varchar

50


经手人

reason

varchar

50


送修原因

wx_time

varchar

30


维修时间

wx_result

varchar

45


维修结果

cost

float

30


花费金额

wx_comment

varchar

45


维修备注

  1. 详细设计
  1. 功能设计

本系统主要用于高校中的“资产”进行管理。具体地讲,固定资产管理系统就是通过资产的增加、删除、查看、借出、归还、维修等一系列手段来提高效率,最终达到发展目标的一种管理行为。总体来说就是解决固定资产管理中经常出现的实物与财务账目不符的情况,以实物管理为特点,以简化为目的,实现信息流和实物流的统一,并且提高工作效率减轻工作负担。本系统中各种功能操作都非常简单方便,操作员无须专门的培训就可以使用,大大的减少了误操作的几率。具体实现目标如下:

  1. 系统用户管理功能

当前登陆的用户可根据个人需要对自己的登陆密码进行修改。系统用户即管理员可对系统中的资产进行管理,可以对资产进行录入、资产查询、资产销毁、资产信息修改、资产借用等相关操作。用户是本系统中最大权限所有者,可以给任意员工分配权限使其成为新的用户,用户可以根据实际需求增加新的员工、修改员工的状态、修改员工的相关信息,亦可根据员工唯一ID对员工进行查询和删除。

  1. 员工信息管理功能

员工是本系统中的一个模块,主要和资产的归还、借出、维修等实物资产的流向状态进行绑定,使每一次对资产的操作都能落实到具体的人头上,让资产管理透明可查。

  1. 资产入库管理功能

资产入库功能由用户进行管理,用户有权限进行增、减、改、查操作。

  1. 资产维护管理功能

对于资产的管理必定涉及到资产的状态如:维修、报废、借出、正常,这些功能都是根据实际需要进行实现,保证了资产的不明流向和总体管理。

  1. 打印报表

针对资产清单进行打印,可根据实际不同需求打印不同格式如:word、excel、pdf等

  1. 系统最大限度地实现了易安装性、易维护性和易操作性

本系统以tomcat为服务器,搭建服务器小而轻便,安装简单。用户可根据不同的需求自行对资产进行维护,并且不必经过专门的培训即可掌握本系统的使用,实现了简单易懂方便维护等特性。

  1. 系统运行稳定、安全可靠

系统经过严格的测试并实际运行无误,可以安全稳定上线运行;根据权限拦截器防止越过登陆对本系统进行操作,所以安全可靠,能保证正常的工作运转。

  1. 系统登陆

用户登录模块是用户进入主页面的入口,用户可根据自己的用户名和密码进行登录,若不符则给予相应提示,重置按钮可将当前所填的信息清空,登陆页面如图4-2所示。

图4-2 用户登录

系统登陆是固定资产管理系统中最先使用的功能,因为用户登陆在数据库中使用的是用户表,人员表中有一个competence字段,是来标识用户权限的。在登陆时要根据数据库的这个字段来判断此用户是否具有管理员的权限。在网页里添写用户名和密码和验证码后点击【确定】按钮,网页通过action="login"进Struts配置文件中,代码如下:

<html:form method="post" action="login">  这个html:form与loginForm相绑定,在struts配置文件中的代码如下:

<form-beans>

<form-bean name="loginForm" type="com.jdy.gdzc.web.struts.form.LoginForm" />

<form-beans>

<action path="/login" scope="request" name="loginForm"

              type="org.springframework.web.struts.DelegatingActionProxy">

<forward name="success" path="/mainframe/framework.jsp" />

<forward name="fail" path="/index.jsp" />

</action>

在这个配置文件中,可以了解到如下信息:

根据type="org.springframework.web.struts.DelegatingActionProxy"可以找到Spring配置文件中对应的具体Action类是class="com.jdy.gdzc.web.struts.action.LoginAction"。

根据<forwardname="success"path="/mainframe/framework.jsp"/>和<forward name="fail" path="/index.jsp"/>可以了解, Action返回success时页面会被转到mainframe/framework.jsp文件,这就是登陆成功的页面。如果当Action返回fail时,页面会被转到index.jsp文件,这个文件是当用户登陆失败将要转到的页面。

Struts的Action的实现类是这个登陆页的核心内容,就来看看它是怎么实现的吧,如下所示:

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionForward;

import org.apache.struts.action.ActionMapping;

import com.jdy.gdzc.web.struts.form.LoginForm;

public class LoginAction extends BaseAction {       

       public ActionForward execute(ActionMapping mapping, ActionForm form,

                                      HttpServletRequest request, HttpServletResponse response) {

                String err = "";

                HttpSession session=(HttpSession)request.getSession();//获得图片上的验证码

                String randCode = (String) session.getAttribute("code");         

                LoginForm lf=(LoginForm)form;

                String username=lf.getUsername();

                String password=lf.getPassword();

                     if (lf.getCheckcode().equals(randCode)) {

                            if (assetManagerImpl.login(username, password)) {

                                   // 把登录成功的用户名,放在cookie中

                                   Cookie c = new Cookie("username",username);

                                   c.setMaxAge(60 * 60 * 24);

                                   response.addCookie(c);

                                   // 登录成功,跳到显示所有课程的页面

                                   String competence=userManaManagerImpl.competence(username);

                                   session.setAttribute("username", username);

                                   session.setAttribute("competence", competence);

                                   return mapping.findForward("success");

                            } else {

                                   err = "用户名或密码错误!";

                            }

                     } else {

                            err = "验证码错误!";

                     }           

                     request.setAttribute("gdzc.login.error", err);

                     return mapping.findForward("fail");          

       }

}

Struts的Action实现类的execute()方法是最先被执行的,这个方法本身也没有具体的事务,而是根据action的参数不同执行相应的方法。在登陆页里面可以找到有一个“action=login” 的字样,它的目的就是在这里做逻辑判断。当action=login时进入Action中执行execute()方法。execute()方法从LoginForm中得到用户提交的数据,然后在调用控制层中的login()方法,并将从LoginForm中得到的username, password做为参数传给控制层,调用后会返回一个boolean型的值。控制层再继续调用DAO层,DAO层得到从上层传进来的username, password并进行处理,调用后会返回一个boolean型的值并传给上层。如果为真则将username用户名放到session范围中,并返回“mapping.findForward("success")”,进入系统主页;否则返回“mapping.findForward("fail")”,将错误信息存到request范围中,跳到登陆界面并提示登陆错误信息:用户名或者密码错误、验证码错误。需要用户重新正确输入才能完成登录。接下来看一下DAO层是如何实现登陆:

import org.hibernate.Query;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import com.jdy.gdzc.dao.IUserDAO;

public class UserDAOImpl implements IUserDAO {     

         private SessionFactory sessionFactory;

         public void setSessionFactory(SessionFactory sessionFactory) {

                  this.sessionFactory = sessionFactory;

               }

         protected Session getSession() {

                  return sessionFactory.getCurrentSession();

               }

         public boolean login(String userName, String password) {

                  boolean flag = false;

                  Session session = this.getSession();

                  String hql = "select pwd from UserInfo where userName=:userName";

                  try {

                         Query query = session.createQuery(hql);

                         query.setString("userName", userName);

                         String pwd = (String) query.setMaxResults(1).uniqueResult();

                         if (password.equals(pwd)) {

                                flag = true;

                             }

                      } catch (Exception e) {

                               e.printStackTrace();

                            }

                 return flag;

       }

}

  1. 系统用户管理

系统用户管理:主要包括对系统用户的增加、系统用户的权限修改、系统用户的删除、分配系统用户的权限功能及对本身的登录密码做修改和对资产的相关维护,其中权限的分配分为操作员和管理员,操作员只能对除了用户管理之外的其他功能进行操作,而管理员是本系统中权限最大的,可以进行所有操作。当点击【用户管理】时出现用户管理界面如图4-3所示。

图4-3 用户管理界面

当点击【用户管理】时,系统会通过Stuts框架,找到userManaAction.do 从后台取出数据库中所有的员工信息,并将信息返回到界面显示出来,具体的表现代码实现如下:<input name="addUser" type="button" class="button" id="addUser"  value="添加用户"                                                   οnclick="window.location='/gdzc/user_info/user_add.jsp'">

<input name="edit" type="button" class="button" id="edit" value="修改权限"

οnmοuseοver="this.style.color='red'"

onMouseOut="this.style.color='#1e7977'"    οnclick="window.location='findUserbyname.do?username=${item.userName}'">

<input name="delete" type="button" class="button" id="delete" value="删除"

οnmοuseοver="this.style.color='red'"

onMouseOut="this.style.color='#1e7977'"

οnclick="if(confirm('您确定要删除编号为${item.comployee.comployeeNo}的用户吗?')) 

window.location='deleteUserAction.do?userName=${item.userName}'">

在点击【添加用户】时,会出现添加用户界面如图4-4所示。

图4-4 添加系统用户

在这个功能里可以增加新的用户并且为他分配相应的权限,用户必须是本系统中的员工,由当前用户通过添加系统用户功能,使其具有登陆系统的权限成为用户,但是这个权限分为管理员或者是操作员。按照提示输入完毕后点击【保存】按钮系统首先进行表单验证,若验证不通过给予相应的提示,如验证通过后,则获取表单数据,再将表单数据保存到后台数据库中,【返回】按钮会将用户带回用户管理界面,添加用户的具体代码如下:

public ActionForward execute(ActionMapping mapping, ActionForm form,

                                    HttpServletRequest request, HttpServletResponse response)

                                    throws Exception {

         AddUserForm auf= (AddUserForm)form;

         UserInfo user=new UserInfo();

Comployee com=new Comployee();

         user.setUserName(auf.getUserName());

user.setPwd(auf.getPassword());

         user.setCompetence(auf.getCompetence());

String eno=auf.getComployeeNo();

         com.setComployeeNo(eno);

         user.setComployee(com);

         if(!employeeManagerImpl.isEmployeebyno(eno)){

                        request.setAttribute("error", "*员工编号不存在");

                        return mapping.findForward("fail");                  

                    }

         if(userManaManagerImpl.insertUser(user)){

                        return mapping.findForward("success");

                   }

         else {return mapping.findForward("fail");}

  1. 员工信息管理

员工信息管理:

主要包括对学校教工的增加、修改、删除、查询功能。

添加员工功能:

不同部门根据各自需求,可添加任意数量的员工,添加员工时首先给其建立一个唯一的标识员工编号,以后对资产的相关操作都与员工编号进行绑定,另外员工还有一个状态分为:在职、休假、离职三类。

修改员工信息功能:

当进入员工信息管理主页面后,系统默认查处员工的信息,并且每个员工后面都有【修改】和【删除】两个按钮,当点击【修改】按钮时,系统首先将本条信息带到修改页面,除了员工的唯一标识符员工编号之外都可更改,用户可根据需求对员工信息进行修改,然后点击【保存】保存。

删除员工信息功能:

点击【删除】按钮会弹出提示框“您确定要删除员工编号为****的员工吗?”,点击【确定】即删除成功,点击【取消】则返回操作。

员工信息管理主页面如图4-5所示。

图4-5 员工信息管理

查询员工信息的具体代码如下:

public ActionForward execute(ActionMapping mapping, ActionForm form,

                                    HttpServletRequest request, HttpServletResponse response)

throws Exception {

         HttpSession session = request.getSession();// 分页

         int pageCount = 10; //int totalCount = 0; // 总记录数

         int currrentPage = 1;int totalPage = 0;

         String tempStr = request.getParameter("currentPage");

if (tempStr != null) {

                   currrentPage = Integer.parseInt(tempStr);

                   totalCount = employeeManagerImpl.showAllEmployee().size();

                   totalPage = (totalCount % pageCount == 0) ? (totalCount / pageCount)

                                                        : (totalCount / pageCount + 1);

if (totalPage= = 0) {totalPage = 1;}

                                  // 修正当前页面编号,确保: 1<=currrentPage<=totalPage

         if (currrentPage > totalPage) {currrentPage = totalPage;}

else if (currrentPage < 1) {currrentPage = 1;}

// 计算当前页面所显示的第一个记录的索引

         int pageStartRow = (currrentPage - 1) * pageCount;

         List list = employeeManagerImpl.findPageEmployee(pageStartRow, pageCount);

         request.setAttribute("totalCount", totalCount);

         request.setAttribute("pageCount", pageCount);

         session.setAttribute("countpage", totalPage);

         request.setAttribute("pages", currrentPage);

         request.setAttribute("list", list);

                   return mapping.findForward("success");}

  1. 资产入库管理

资产入库管理:作为本系统两大主要模块之一的它主要包括对资产的录入、资产的属性修改、资产的报废删除、资产的属性查询功能。本功能根据实际资产管理需要完成,首先满足实时录入新的不同设备功能了,可由用户随意添加,然后可以根据不同的信息改变完成对设备信息的修改更新,若此设备已经不具备继续使用功能,则可由用户点击【删除】完成销毁操作,彻底删除设备信息。如图4-6所示。

图4-6 资产入库管理

默认资产查询操作具体代码如下:

         public ActionForward execute(ActionMapping mapping, ActionForm form,

                                      HttpServletRequest request, HttpServletResponse response) {

                HttpSession session = request.getSession();// 分页

                int pageCount = 10; int totalCount = 0;

                int currrentPage = 1; int totalPage = 0;

                String tempStr = request.getParameter("currentPage");

                if (tempStr != null) {

                      currrentPage = Integer.parseInt(tempStr);}

                   totalCount = assetManagerImpl.showAllAssets().size();

                   totalPage = (totalCount % pageCount == 0) ? (totalCount / pageCount)

                                                              : (totalCount / pageCount + 1);

               if (totalPage == 0) {totalPage = 1;}

                                // 修正当前页面编号,确保: 1<=currrentPage<=totalPage

               if (currrentPage > totalPage) {currrentPage = totalPage;}

else if (currrentPage < 1) {currrentPage = 1;}

               int pageStartRow = (currrentPage - 1) * pageCount;

               List list = assetManagerImpl.findPageAssets(pageStartRow, pageCount);

                request.setAttribute("totalCount", totalCount);

               request.setAttribute("pageCount", pageCount);

               session.setAttribute("countpage", totalPage);

               request.setAttribute("pages", currrentPage);

               request.setAttribute("list", list);

               return mapping.findForward("success");  

       }

点击【添加资产】后出现如图4-7所示。

图4-7 添加资产

此系统从前台获取数据,首先进行表单验证,若所填不符合逻辑则给予提示,如正确则将数据封装到javaBean中,将对像传到底层,最后保存到数据库中,实现资产的添加。【重置】和【返回】两个按钮可尽最大程度的满足用户需求,简化添加资产的操作。具体代码实现如下:

//添加资产

       public boolean addAssets(ZcInfo zcinfo){

                boolean flag=false;

                Session session = this.getSession();

                try {

                       session.save(zcinfo);

                       flag=true;

                   } catch (Exception e) {

                       e.printStackTrace();

                   }

               return flag;

      }

在点击【修改】后,出现界面如图4-8所示。                               

图4-8 资产修改

修改主要是对当前行的数据进行修改,首先将相关信息带回到修改页面,然后再根据更改后的信息对数据库中的数据进行一次更新操作,具体代码如下:

//保存修改资产信息

public void saveUpdate(ZcInfo zcinfo){

              boolean flag=false;

              Session session = this.getSession();

              try {

                     session.update(zcinfo); 

                 flag=true;

                 } catch (Exception e) {

                      e.printStackTrace();}

}

若要对库存资产进行查询,可以选择菜单栏中的【资产查询】,出现界面如图4-9所示。

图4-9 资产查询

查询主要是对库存的资产进行按条件查询,可以根据所输入的查询条件不同,进行不同条件的多种组合,然后点击【查询】,就会按条件索引数据。此功能大大方便了用户对资产管理的查询操作,只需要根据实际需求的不同,输入不同的查询条件进行查询操作,即可查询出相应的结果。具体代码如下:

       public List checkZC(String zcId,String zcFactory,String zcNo,

                                                 String zcName,String zcType,String zcStatus,

                                                 String zcBuyer){

                List list=null;

                Session session = this.getSession();

String sql = "from ZcInfo where zcId=:zcId or zcNo=:zcNo or zcName=:zcName or zcType=:zcType or zcStatus=:zcStatus or zcFactory=:zcFactory or zcBuyer=:zcBuyer";                            

                 try {

                        Query query = session.createQuery(sql);

                        query.setString("zcId", zcId);

                        query.setString("zcNo", zcNo);

                        query.setString("zcName", zcName);

                        query.setString("zcType", zcType);

                        query.setString("zcStatus", zcStatus);

                        query.setString("zcBuyer", zcBuyer);

                        query.setString("zcFactory", zcFactory);

                        list = query.list();

                    } catch (Exception e) {

                          e.printStackTrace();

                      }         

              return list;    }

  1. 资产维护管理

资产维护管理:是本系统的另一主要模块,主要包括对维护物资的送去维修、维护物资的信息修改即此物资是否维修完成及各种相关维护信息、维护物资的删除即是此物资以无须维护可通过删除维护信息后正常使用、当前用户可根据自身实际需求进行多种组合查询维护物资的信息。如图4-10所示。

图4-10 资产维护管理

维修操作页面里的经手人一栏是有系统将当前登陆的用户名默认填上,并且不能修改,在这里当用户输入相应的维修信息后,点击【确定送修】后,系统会先进行表单验证,验证通过后会将表单的数据提交到后台数据库中,实现维修操作。具体的代码如下:

public ActionForward execute(ActionMapping mapping, ActionForm form,

                            HttpServletRequest request, HttpServletResponse response) {

         HttpSession session = request.getSession();// 分页

         int pageCount = 10; // 每页显示的记录数

         int totalCount = 0; // 总记录数

         int currrentPage = 1; // 当前页面编号

         int totalPage = 0; // 页面总数

         String tempStr = request.getParameter("currentPage");

         if (tempStr != null) {currrentPage = Integer.parseInt(tempStr); }

// 计算总记录数

                             totalCount = assetPerManagerImpl.showAllPerAssets().size();

                             // 计算总页数

                            totalPage = (totalCount % pageCount == 0) ?

 (totalCount / pageCount)

                                                                   : (totalCount / pageCount + 1);

         if (totalPage == 0) {totalPage = 1;    }

                           // 修正当前页面编号,确保: 1<=currrentPage<=totalPage

         if (currrentPage > totalPage) {currrentPage = totalPage;

              } else if (currrentPage < 1) {currrentPage = 1;   }

          // 计算当前页面所显示的第一个记录的索引

          int pageStartRow = (currrentPage - 1) * pageCount;

          List list = assetPerManagerImpl.findPagePerAssets(pageStartRow, pageCount);

          request.setAttribute("totalCount", totalCount);

          request.setAttribute("pageCount", pageCount);

          session.setAttribute("countpage", totalPage);

          request.setAttribute("pages", currrentPage);

          request.setAttribute("list", list);

          return mapping.findForward("success");            

}

  1. 资产借还管理

资产借出归还管理:此模块是根据固定资产管理的实际需求出发,以达到简化资产管理为目的的具体应用实现,是本系统的中心模块,也是资产管理的核心表现,作为本系统的另一主要模块,功能主要包括增加借出资产、查询借出资产、归还以借出的资产,用以实现对资产的初步管理,满足用户基本需求。

首先,用户可通过员工编号和设备编号查询是否有相关的借出信息,若有则查询出相应结果并显示,如若相关信息,则给予相关提示。

其次,用户可根据实际需求将某个编号的设备借给某个编号的员工,并自动将此借出信息保存到一张叫做借出归还的中间表中,用以储存借出与归还的信息,完成资产信息化,方便查询管理并且易于保存及信息交互。

最后,就是用户可以查询借出信息中的员工和设备的详细信息,也可将设备进行归还,删除掉借出信息,将设备中的状态字段通过实际需求变动改成符合实际的标示,这样就使得设备的实际所处状态一目了然,只要注意设备的状态字段,变可知道其是否处于正常应用状态或者是借出状态还是维修状态,极大地减轻了工作量,方便日后维护操作等相关的实际应用。如图4-11所示。

图4-11 资产借还管理

具体的代码如下:

       public ActionForward execute(ActionMapping mapping, ActionForm form,

                                       HttpServletRequest request, HttpServletResponse response)

                                       throws Exception {

               String message="";

               HttpSession session=(HttpSession)request.getSession();     

               String zcId=request.getParameter("zc_id");

               String comployeeNo=request.getParameter("em_id");

               String status=inOutAssetManagerImpl.zcStatus(zcId);

               if(!employeeManagerImpl.isEmployeebyno(comployeeNo)){

                       message="此员工编号不存在!";

               }else if(status==null){

                       message="此物品 不存在!";

               }else if(status.equals("维修")){

                       message="此物品正在维修,无法借出!请选择其他资产!";

               }else if(status.equals("报废")){

                       message="对不起,此物品已经报废!请选择其他资产!";

               }else if(status.equals("借出")){

                       message="对不起,此物品已经借出!请选择其他资产!";

               }else{

                   return mapping.findForward("success");

              }

              request.setAttribute("gdzc.status.message", message);

              return mapping.findForward("fail");

}

  1. 打印报表

报表管理功能:本功能用于明细统计资产,用户可根据自己的不同需求将资产进行打印输出,如word、excel、pdf等,打印内容包括资产的详细信息,及使用状态和购买人,使得资产管理不仅仅局限于电脑上,考虑用户需求以便资产管理。如图4-12所示。

图4-12 打印报表

具体实现代码如下:

public Report createReport(HttpServletRequest request) throws Exception{

       ArrayList<ZcInfo> list =(ArrayList)request.getAttribute("list");

    //实例化报表对象

    Report report = new Report();

    //在页眉中添加文本信息内容

    report.addHeaderText("打印入库单");

    //在报表的页眉添加一条横直线

    report.addHeaderSeparator(1);

    //在页尾添加一条横直线

    report.addFooterSeparator(1);

    //在页尾添加文本信息内容

    report.addFooterText("第{P}页, 共{N}页");   

       //在报表中添加文本信息内容

    report.addText("入库单一览表:");

    //在报表中添加换行符号

    report.addBreak();

    //在报表中添加表格

    report.addTable(getTableA(list));

    //在报表中添加换行符号

    report.addBreak();   

       //在报表中添加文本信息内容

    //report.addText("销售情况一览表(合并表格):");

    //在报表中添加换行符号

    //report.addBreak();

    //在报表中添加表格

    //report.addTable(getTableB());

    //在报表中添加换行符号

    //report.addBreak();

    return report;

}

//------得到销售情况一览表对象------

public Table getTableA(ArrayList<ZcInfo> list){

    String[][] data = getData(list);

    Table table = new Table(data);

    table.setColBorder(0);

    table.setRowBorder(0);

    table.setRowBorder(0,1);

    table.setRowBackground(0,new Color(128,0,0));

    table.setRowForeground(0,Color.white);

    for(int i =1 ;i<=list.size() ;i++){

          if(i%2==0) {

             table.setRowBackground(i,new Color(188,224,222));

          }              

             table.setRowForeground(i,Color.black);

     }

    return table;

}

//------得到销售情况一览表(合并表格)对象------

public Table getTableB(){

    String[][] data = getTotalData();

    Table table = new Table(data);

    table.setAlignment(Table.H_CENTER + Table.V_CENTER);

    table.setColAutoSize(true);

    table.setRowBackground(0,Color.LIGHT_GRAY);

    table.setRowBackground(1,Color.LIGHT_GRAY);

    table.setColBackground(0,Color.LIGHT_GRAY);

    table.setRowBackground(7,new Color(255,255,128));

    table.setHeaderRowCount(2);

    table.setHeaderColCount(1);

    table.setRowBorder(table.LINE_THIN);

    table.setColBorder(table.LINE_THIN);

    table.setCellSpan(0,0,new Dimension(1,2));

    table.setCellSpan(0,1,new Dimension(2,1));

    table.setCellSpan(0,3,new Dimension(2,1));

    table.setCellSpan(0,3,new Dimension(2,1));

    return table;

}

//生成销售情况数据,实际工程中一般从数据库中获取

public String[][] getData(ArrayList<ZcInfo> list){

     String[][] data = new String[list.size()+1][9];

                 data[0][0] = "资产编号"; data[0][1] = "资产名称"; data[0][2] = "资产类型";

                 data[0][3] = "供应商";data[0][4] = "单价";

                 data[0][5] = "出产日期";data[0][6] = "购买日期";data[0][7] = "购买者";data[0][8] = "资产状态";

                 for(int i =1 ; i<=list.size() ; i++){

                  data[i][0] = list.get(i-1).getZcId();

                  data[i][1] = list.get(i-1).getZcName();

                  data[i][2] = list.get(i-1).getZcType();

                  data[i][3] = list.get(i-1).getZcFactory();

                  data[i][4] = list.get(i-1).getZcPrice()+"";

                  data[i][5] = list.get(i-1).getZcProduceTime();

                  data[i][6] = list.get(i-1).getZcBuyTime();

                  data[i][7] = list.get(i-1).getZcBuyer();

                  data[i][8] =list.get(i-1).getZcStatus();  

                 }                 

    return data;

}

//得到销售汇总统计数据,实际工程中一般从数据库中获取

public String[][] getTotalData(){

    String[][] data = new String[8][5];

    data[0][0] = "区域"; data[0][1] = "上半年"; data[0][3] = "下半年";

    data[1][1] = "第一季度"; data[1][2] = "第二季度"; data[1][3] = "第三季度";data[1][4] = "第四季度";

    data[2][0] = "华南地区"; data[2][1] = "¥2,000,000"; data[2][2] = "¥2,500,000";

        data[2][3] = "¥2,200,000";data[2][4] = "¥0";

    data[3][0] = "华东地区"; data[3][1] = "¥6,000,000"; data[3][2] = "¥4,500,000";

        data[3][3] = "¥4,800,000";data[3][4] = "¥0";

    data[4][0] = "华中地区"; data[4][1] = "¥500,000"; data[4][2] = "¥400,000";

       data[4][3] = "¥700,000";data[4][4] = "¥0";

    data[5][0] = "华北地区"; data[5][1] = "¥3,000,000"; data[5][2] = "¥3,200,000";

       data[5][3] = "¥2,500,000";data[5][4] = "¥0";

    data[6][0] = "东北地区"; data[6][1] = "¥4,000,000"; data[6][2] = "¥5,000,000";

        data[6][3] = "¥4,400,000";data[6][4] = "¥0";

    data[7][0] = "总计"; data[7][1] = "¥15,500,000"; data[7][2] = "¥15,600,000";

       data[7][3] = "¥14,600,000";data[7][4] = "¥0";

    return data;

}

//定制Web报表在页面首部显示的工具栏为标准的样式,增加一个【返回】按钮,返回到首页

public String getToolbarScript(HttpServletRequest request){

    return "<a href=\"/hms/storeInShowAll.do\"><img src=\""+request.getRequestURI()+

       "?op=Resource&name=/resource/back.gif\" border=\"0\" alt=\"返回\"></a>";

}

%>

  1. 密码修改

修改密码:主要对当前用户的密码修改功能,首先用户需要重新输入登录密码,然后第一次输入新密码,再次输入新密码,当点击【提交】时,需验证两次输入的新密码是否一致,若不一致则不予以更改,确保正确操作完成修改功能。如图4-13所示。

图4-13 修改密码

  1. 技术难点
  1. 中文乱码

由于浏览器中的参数传递是按字节传送,因此英文和数字不会有任何的问题,而中文汉字则由两个字节组成。为了解决这个问题,使用了下面的两种方法:

  1. <%request.setCharacterEncoding(“gb2312”);%>
  2. request.getParameter("Password").getBytes("ISO-8849-1"),"GB2312")。
  1. 图片处理

在MySQL的数据库中可以存放任何格式的图片,但是要将其转换为二进制的数据存入数据库,在调用时再将二进制数据转换为图片,这样虽然便于管理,但是在当前国内的网速来看,这样的方法实在是不可取。因此本系统的图片均是存放的相对路径,将图片放在系统根目录下的upload文件夹中,按类分好,然后将其相对路径存入数据库的对应列中。这样可以大大提高网页浏览的速度。

  1. HQL语言

本系统中,所有对数据库的操作都由Hibernate来完成,因此用到了大量的HQL语言。HQL是Hibernate设计的一套完整而实用高效的查询语言,它通过面向对象的语句结构实现了和SQL语言类似的功能。HQL拥有面向对象语言的所有特性,这其中包括多态、继承和组合。如果向表里插入一条数据的话,直接调用save()方法即可,但如果要使用查询功能的话,我按照一般的SQL语句的方法:from 表名 where 条件,却总是找不到预期的数据,后来看书中发现,from后跟的是表对应映射的类文件名,而非表名,比如招聘表为invite,它对应的类为Invite.java,所以在from后要根Invite而不是invite。在本文中并不讨论那些非常复杂的查询,只使用连接两个表的查询。

Hibernate配备了非常强大的查询语言,HQL语言被设计为完全面向对象的查询,次语言具有主要特点如下:

  1. HQL语言不区分大小写,但对于对象和属性的名称则必须区分大小写。
  2. HQL是面向对象的查询方式,它是对持久化对象实体进行操作,从而实现对数据库的操作。
  3. HQL进行实体查询时,语句可以省略select子句。
  4. HQL在执行查询或是删除、更新操作时,要实体对象和数据库的表名不同,一定要与实体对象名称一致,包括大小写。
  1. 安全性

将项目发布到互联网上后,有些用户不是点击超链接打开网站的某个页面,而是在地址栏中直接写,而后进入,试图避开身份验证,处于对安全性的考虑,本项目在用户登陆后才能进入的页面中,特意添加了拦截器,用于防止恶意跳过登陆而操作系统,以确保系统安全正确的运行。拦截器配置如下。

       <!-- 权限检查拦截器继承 -->

       <bean

       class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

              <property name="beanNames">

                     <list>                 

                         <value>/zcgl</value>

                         <value>/add</value>

                         <value>/updateAssets</value>

                         <value>/save</value>

                         <value>/deleteAssets</value>

        </list>

              </property>

              <property name="interceptorNames">

                     <list>

                            <value>authorityInterceptor</value>

                     </list>

              </property>

       </bean>

在拦截器中设置了对用户名的判断,因为在登陆中以经将用户名放入到Session中了,所以只用判断是否有用户就行了,代码如下。

import javax.servlet.http.HttpServletRequest;

import org.aopalliance.intercept.MethodInterceptor;

import org.aopalliance.intercept.MethodInvocation;

import org.apache.struts.action.ActionMapping;

public class AuthorityInterceptor implements MethodInterceptor{

       public Object invoke(MethodInvocation invocation) throws Throwable {

              HttpServletRequest request = null;

              ActionMapping mapping = null;

              Object[] args = invocation.getArguments();

              for (int i = 0; i < args.length; i++) {

                     if (args[i] instanceof HttpServletRequest)

                            request = (HttpServletRequest) args[i];

                     if (args[i] instanceof ActionMapping)

                            mapping = (ActionMapping) args[i];

              }           

              if(request.getSession().getAttribute("username")!=null)

              {

                     return invocation.proceed();  

              }else{

                     return mapping.findForward("faillogin");

              }           

       }

}

  1. 本章小结

本章节为系统设计章节。首先详细设计系统应具备的功能,主要分为:资产管理模块、资产维护模块、员工管理模块、用户管理模块等四大模块。并充分分析项目需求,完善数据库的各个表。然后逐一演示系统功能,由语言叙述到截图显示进行全面讲解,最后到代码的详细分析,全面的介绍了系统的具体实现。其基本功能符合用户需求,能够实现对固定资产的基本信息录入、更新、操作、删除、打印等,从而实现对资产的管理。

最后简单阐述了一下项目进行中所遇到的主要问题及解决方法和为保证系统的安全性所采用的拦截器。

  1. 系统测试

在完成了程序的编写工作后,接下来将进行软件的测试,这里说的软件,并不单单是指程序本身,还包括其他方面。测试和开发一样,也是一项技术性很强的工作,有着很多的技巧。软件测试是软件质量保证的主要活动之一,因此,测试的质量直接影响软件的质量。

  1. 测试的定义及目的

软件测试就是在软件投入运行前,对软件的需求分析,设计规格说明和编码的最终复审,是保证软件质量的关键步骤。如果要给软件测试下定义,可以这样讲,软件测试是为了发现错误而执行程序的过程。

测试的目的在于将软件设计时设计者与程序开发者之间理解不一致的地方,功能与需求不一致的地方,不符合逻辑思维的情况都反映给质量控制部门,由质量控制部门调配需求部门统一做出一个明确解答,再由开发人员进行修改和补充。

测试的目标是以最少的时间和人力找出软件中潜在的各种错误和缺陷。

  1. 测试的原则

对于相对复杂的产品或系统来说,Zero-Bug是一种理想,Good-Enough是我们的原则。Good-Enough原则就是一种权衡投入/产出比的原则;不充分的测试是不负责任的;过分的测试是一种资源的浪费,同样也是一种不负责任的表现。我们操作的困难在于,如何界定什么样的测试是不充分的,什么样的测试是过分的。目前状况唯一可用的答案是:制定最低通过标准和测试内容,然后具体问题具体分析。

  1. 系统的方法

依据前面所说的测试对象,我们把测试划分为几个方面来进行测试。

  1. 界面测试

界面测试是测试过程中比较简单直观的一种测试方法,只要细心地按界面要求核对就行了。可这点往往是程序开发人员容易忽视和遗漏的地方,也是常常出Bug的地方。下面是界面测试中经常出现的几种Bug:

  1. 错别字,即界面中的标题或者文本内容中出现了错别字。这种Bug如果测试人员不细心,很难找出来,可能会出现在提示信息或界面中。
  2. 出现了一些根本读不懂的内容,一般多出现在程序的提示信息和一些较长的文本中。这种情况基本上出现在拼起来显示的提示中,页面的简单陈述是通过变量拼组起来的,通过程序将字一个一个地输出来。通常是因为程序中的控制错误或是程序开发人员对程序没有进行认真的自测,导致出现这种Bug。
  3. 程序员自创的词语,虽然意思对,但不符合界面的标准及需求。这种情况基本上是由于开发人员使用一些专业术语,并且混杂着自己的理解出现Bug,主要是由于开发过程中团队合作没有明确的分工,没有统一的规范用语。
  4. 页面类似的内容中,明显有字体,字号不同的情况,使界面整体风格看上去不一致,这种情况只出现在没有CSS定义的情况下,或是已经定义的CSS,开发人员在开发过程中没有调用。
  5. 标题相近的程序及模块,把标题弄混。这种情况多是因为业务方面的定义名称很相似或很类似,并且业务实体方面也很类似,开发人员在开发过程中忽略了开发名称和模块,只单独地实现其功能。
  1. 功能测试

顾名思义,功能测试主要是测试程序模块是否实现了设计中所有要求的功能,功能测试中需要注意的有:

  1. 查询功能中,有按单一查询条件进行查询的,也有按多个查询条件组合查询的,这里要注意多个查询条件之间的关系,还有一些常识性的问题。
  2. 录入功能中,需要注意的是前台设置的数值长度是否大于后台数值长度,以及前台与后台的数据结构是否相符,很多时候录入功能无法实现是由于这些原因。还有就是必须录入的字段的设置是否有误。
  3. 测试删除功能中需要注意的是单击【删除】按钮后,一般会出现提示信息,询问是否确定删除。通常情况下,我们单击【确认】按钮查看信息是否被删除掉了,而忽略了单击【取消】按钮后程序的反应,这时有可能的是没有删除,还有一种可能是即便单击了【取消】按钮,也一样删除了数据。另外,在删除多条记录的时候,要注意连续选中的几条记录是否真正都被删除了,即如果再按照这种查询方式查询,是否还能查询出来。有的时候需要在数据库中设一个标志位,而不是真正的物理删除。所以在下一次查询中,可能还会被查询出来,这主要是因为在查询条件中没有将标志位考虑在内。此外,最重要的一种删除方式既级联删除,当删除一个有子数据的信息时就会有异常抛出,这时我们需要用一个提示语“此信息有子数据,如果删除该信息则会连带的删除子数据,是否确定删除?”如果点击【是】那么就顺带的把与这条数据有关的信息都删除。如果点击【否】则什么信息都不会删除。
  4. 关于修改功能的测试,主要是看修改确认后是否数据真正已被修改了。这是最基本的功能,需要注意的是看是否能把不应该修改的数据也修改成功了。
  1. 需求测试

针对需求测试,是测试中很重要的一个环节。因为需求是在软件设计,开发乃至软件测试中重要的依据。要针对需求测试,首先就要对项目的需求和业务有一定的了解。这些需求很多时候是在实现增、减、查、改这些基本功能之上,针对项目和相关业务所作的一些逻辑上的控制。这就要求程序员在设计和编码的时候要充分理解考虑需求。

  1. 性能测试

性能测试在软件的质量保证中起着重要的作用。通常我们把性能指标全部归结到硬件,操作系统和开发环境上,而忽略了代码本身性能上的考虑。性能需求指标中,稳定性,并访支撑能力以及安全性都很重要,作为程序员需要评估该模块在系统运营中所处的环境、将要受到的负荷压力以及各种潜在的危险和恶意攻击的可能性。

  1. 系统中其它要注意的地方
  1. 时常有这样的情况发生,每个模块都能单独工作,但这些模块集成在一起之后却不能正常工作。其主要原因是,模块相互调用时接口会引入许多新问题。这就要求在进行程序设计和编码的时候要尽可能地从整体考虑。
  2. 实引用某些控件,实现了程序中未实现的功能的同时,也容易引发新的Bug。
  3. 错误本身出现在程序设计阶段,并非由于程序员编码造成的问题。这就要求我们无论是在开发还是测试阶段,对需求或程序设计存在疑问,应及时提出,及时解决。
  4. 由于一些模块被修改了,对其他模块造成了影响而出现了新的Bug。发现这些Bug要求我们对程序整体的结构有基本的了解,清楚模块之间的一些联系。
  1. 固定资产管理系统的测试

在完成编码的工作以后,根据以上的方法和步骤进行了如下的测试:

  1. 界面测试:在不开启Web服务器的情况下,反复点击网页上的超链接,测试其连接情况,直到所有的链接都达到预期的效果。
  2. 功能测试:对网站的几大功能模块逐一测试,尽最大可能发现其潜在的错误。
  3. 性能测试:将程序以局域网的形式发布,查看其是否满足多用户的要求。
  4. 需求测试:根据需求分析的内容,测试网站是否和当初的设计一样。

通过这几方面的测试,我及时修正了系统中存在的问题,很好的提高了系统的性能,达到了预期目标。

  1. 本章小结

代码虽然编写完成,却并不意味着项目的结束,还需要最后的一步检测。软件测试是软件质量保证的主要活动之一。因此,测试的质量直接影响软件的质量。所以要从诸多方面考虑测试的方向如:界面测试、功能测试、需求测试、性能测试,然后根据实际需求判断是否有不符,再进行校正修改。

结  论

毕业论文是本科学习阶段一次非常难得的理论与实际相结合的机会,通过这次比较完整的固定资产管理系统的设计,我摆脱了单纯的理论知识学习状态,实际设计的结合锻炼了我的综合运用所学的专业基础知识,解决实际问题的能力,同时我也提高我查阅文献资料、设计手册、设计规范等其他专业能力水平,而且通过对整体的掌控,对布局的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,经验得到了丰富的提高,并且意志品质力,抗压能力及耐力也都得到了不同程度的提升。这一次设计让我累计了无数实际经验,使我的头脑更好的被知识武装了起来,也必然会让我在未来的工作学习中表现出更高的应变能力,更强的沟通力和理解力。

论文在撰写过程中,力求将理论与实践相结合,在对资产管理进行阐述的同时,配合此系统从实际应用和操作技巧上加以说明,以期达到更深层次的理解与认识。

该系统由于在设计前期,进行了大量的需求分析,在此基础上将理论知识与开发技术运用到系统的实现过程当中,所以该系统具有较强的实用价值,能够实现一个中小型团体的固定资产管理系统所具备的各种功能。当然,由于时间有限,以及软、硬件设施的配置等限制因素,这个系统还不太完善,还有许多地方有待改进与完善;世界上对资产管理的内涵、标准及技术也日新月异,处于不断的变化发展之中,将会不断有观点、技术和实践的创新与突破,需要我们加以学习与改进,因此,我在论文的撰写过程当中,尽量避免使用结论性的语言;加之固定资产管理范围是一个涉及多领域的概念,每个不同的团体具体需要方向不同,且文理渗透,很难从整体上把握,难免存在许多疏漏,恳请各位老师加以批评指点。

参考文献

[1] 刘洋.精通Hibernate[M].电子工业出版社,2010.

[2] 史济民.软件工程――原理、方法与应用[J].高等教育出版社,2008.

[3] 张桂元,贾燕枫.Eclipse开发入门与项目实践[M].人民邮电出版,2006.

[4] 张桂元.Struts开发入门与项目实践[M].人民邮电出版社,2005.

[5] 孙卫琴.精通Struts:基于MVCJava Web设计与开发[M].电子工业出版社,2004.

[6] 鲁晓东.JSP软件工程案例精解[J].电子工业出版社,2005.

[7] 丁鹏.STRUTS技术解密及WEB开发实例[M].清华大学出版社,2009.

[8] 夏昕.深入浅出Hibernate[M].电子工业出版社.2008.

[9] 孙卫琴.精通Hibernate:Java对象持久化技术详解[DB].电子工业出版社,2007.

[10]李小喆,张晓辉,李祥胜.SQLServer 2000管理及应用系统开发[M].人民邮电出版社,2002.

[11] Thomas Kyte. Expert Oracle Database Architecture 9i and 10g Programming Techniques and Solutions [M]. BeiJing: Posts&Telecom Press.2005.

[12] Tsichritzis D C.Lochovsky F H.Data Models[M].Prentice-Hall.2010.

[13] Abraham Silberschatz. Database System Concepts(Fourth Edition) [M].BeiJing:Higher Education Press.2010.

[14] Thomas Connolly. Database System: A Practical Approach to Design, Implementation, and Management(Third Edition)[M].BeiJing: Publishing Houser of Electronics Industry.2009.

[15] Cay S.Horstmann,GaryCornell.Core Java 2.Volume I-Fundamentals (Seventh Edition)[M]. U.S.A.: Sun Microsystems Press.2005.