基于Java的资产管理系统的设计与实现

欢迎添加微信互相交流学习哦!

二维码

项目源码:https://gitee.com/oklongmm/biye

摘  要
随着社会经济的迅速发展,企业规模不断扩大,拥有的各类资产快速增长,传统的手工记录资产的方式所暴露的效率低下、错误率高、安全性差等问题已经成为制约企业发展的重要障碍。探索现代企业生产运作过程中对安全、高效、准确的追求相适应的资产管理方式已成为企业在激烈的竞争中能否把握先机的重要课题。
    为了达到企业对资产进行合理分配、科学管理的要求,提高资产在企业日常运作中的利用效率,降低资产管理的成本,本文提出了基于JAVA语言,以MyEclipse作为开发平台,运用软件工程方面的技术,设计实现了一套可以对企业资产和人力资源实时了解和管理的资产管理系统。
本文首先介绍了资产管理系统的研究背景及意义,并对资产管理相关研究的现状进行了分析,接着介绍了在开发过程中所使用到的技术和工具,主要包括:Java语言与Java开发平台、Access数据管理系统、MyEclipse的开发平台等。然后对资产管理系统进行了需求分析,详细说明了系统需要解决的问题。通过需求分析,对系统进行了概要设计和详细设计,包括系统功能的划分、系统框架、概念模型等方面的设计。接着根据分析的结果,采用了基于Java平台和C/S体系结构结合Access2007数据库管理系统的开发方案进行了系统开发,保证了整个系统在实际应用过程中的简便性、安全性和易维护性。
本文设计的资产管理系统主要由系统管理、资产信息管理、类别管理、账户管理、职员管理、资产还借管理五大模块组成。本系统实现了企业管理者对公司拥有资产的数量、类型、价格、状态的整体把握;对公司职员年龄、性别、职务和相关信息的详细了解;对资产流动和使用过程中各环节的使用者、时间、用途、状态的点对点衔接。基本满足了企业对资产和人员进行管理的要求。
本文设计的资产管理系统已经能够成功运行,达到了系统的预期开发目标。该资产管理系统的开发和应用,展示了企业管理过程中自动化、信息化的发展方向,提高了企业管理人员的工作效率和管理水平,使得企业的管理工作更加的系统、科学、高效。

关键词:资产管理系统;MyEclipse开发平台;Access数据管理系统;Java语言与Java开发平台;C/S体系结构 
Abstract
With the rapid socio-economic development, companies have been expanding and the amount of various types of assets they owned have been grown rapidly. It has become a major obstacle to the development of enterprises that the traditional way depending on manually record assets exposed many problems such as low efficiency, high error rate and poor security. Exploring the modern enterprise asset management operation of the process for the production safety, efficiency and accuracy has become an important issue of business to grasp the opportunity in the fierce competition.
In order to achieve reasonable distribution of assets, scientific management, improve asset utilization efficiency in daily business operations, and reduce costs of asset management, this paper designed and implemented a set of assets management system to control human resources and business assets in real-time using software engineering technology, based on the JAVA language and MyEclipse platform. 
First of all, this paper describes the background and significance of asset management system, and analyzes the current situation related to asset management. Then it lists the used techniques and tools, including Java language, Java development platform, Access data management system and MyEclipse development platform. Secondly, it products the asset management system needs analysis, a detailed description of the system need to be addressed. Through needs analysis, the outline of the system design and detailed design generates, including the delineation of the system function, the system frame, the conceptual model and other aspects of the design. After that according to the results of analysis, we carried out a development program based on Java platform and C/S architecture binding Access2007 database management system to ensure simplicity, safety and ease of maintenance. 
The issue of asset management system designed consists of system management, asset information management,sort management, account management, staff management and asset borrow-return management. Relying on the system, business managers implement the overall grasp of the assets’ amount, type, price and state, the detailed understanding of the company's employees’ age, sex, job and related information, and  the engagement of user, time, purpose and status in the process of assets liquidity and use. Those functions basically meet the business assets and personnel management.
The asset management system has been designed to be able to run successfully, and achieved the desired target. Development and application of the asset management system showed the prospects of automation and information in enterprise management process, improved the efficiency and management level of manager, making the management of enterprises more systematic, scientific and efficient.


Keywords: Asset Management System, MyEclipse development platform, Access2007 database management system,Java language and Java development platform,C/S architecture binding


 


 
目  录
第1章  绪论    1
1.1 研究背景及意义    1
1.2 现状分析    1
1.3 开发技术和工具    2
1.3.1 Java语言与Java平台    2
1.3.2 Access数据管理系统    3
1.3.3 MyEclipse 开发平台    4
1.4 论文的组织结构    4
第2章  系统需求分析    6
2.1系统需求概述    6
2.2系统功能性需求    6
2.2.1系统管理    6
2.2.2资产信息管理    6
2.2.3类别管理    6
2.2.4职员管理    7
2.2.5账户管理    7
2.2.6资产借还管理    7
2.3系统非功能性需求    8
2.3.1用户界面需求    8
2.3.2软硬件环境需求    8
2.3.3产品质量要求    8
2.4 系统体系结构的选择    8
第3章 系统概要设计    9
3.1 概念模型设计    10
3.2 数据库设计    10
第4章 系统详细设计与实现    13
4.1 系统登录模块设计    13
4.1.1 功能设计    13
4.1.2 算法描述    13
4.1.3 系统实现    13
4.2 系统管理模块设计    14
4.2.1 关键功能设计    14
4.2.2 算法描述    14
4.2.3 系统实现    15
4.3 资产信息管理模块设计    16
4.3.1 功能设计    16
4.3.2 算法描述    16
4.3.3 系统实现    16
4.4 账户管理模块设计    18
4.4.1 功能设计    18
4.4.2 算法描述    18
4.4.3 系统实现    19
4.5 职员管理模块设计    20
4.5.1 功能设计    20
4.5.2 算法描述    20
4.5.3 系统实现    20
4.6 资产还借管理模块设计    22
4.6.1 功能设计    22
4.6.2 算法描述    22
4.6.2 系统实现    22
第5章 总结与展望    25
5.1 总结    25
5.2 研究展望    25
参考文献    27
致  谢    28

 
第1章  绪论
1.1 研究背景及意义
    社会经济的迅速发展和科学技术的全面进步,使得以计算机与通信技术为基础的管理信息系统蓬勃发展。随着企事业单位的发展,各类资产数量大幅增加,管理人员在对资产进行登记管理时的工作量明显增大,手工记录资产显然已成为影响单位资产管理效率的一个重要因素。伴随着资产数量的增多,资产管理及使用的另外一个特点是其呈现分布式趋势,资产主要分布在各个基层单位使用,有很多资产利用率不高,存在着资产闲置、资产处置不规范等现象和问题,且有形资产本身具有价值高,使用周期长,管理难度大,变动性大,使用地点分散的特点,而使用落后的人工手动管理,不仅面临着巨大的工作量,而且查询起来困难,对于增加、减少、借出、归还、租赁等操作不便,增加了管理难度,在统计和汇总方面也带来了巨大的挑战,若处理不当,会使得管理弱化,造成资产流失[1]。
    随着信息技术的飞速发展,管理方式的改变是企事业单位取得成功的关键所在。社会信息化的发展以及资产管理理论和方法的成熟,也让越来越多企事业单位认识到:加强资产管理,可以有效地将多余闲置的设备得到合理化分流,为单位带来成本下降和工作效率提高的效益,并且可视为竞争力的杠杆,因此,资产管理的重要性已逐渐从后勤保障被提升到战略层次的范畴[2]。
在资产管理中,利用信息化技术引入一套科学的资产管理方法及系统,将大大有助于提升管理效益。过去繁琐的资产盘点透过自动化可以轻松完成,使资产管理有条不紊,帐物相符,快速反应当前状态,实时发现并解决问题,从而优化资产回报率,并提高利用有形资产来提供优质服务的能力,即通过资产管理来确保有形资产物尽其用、安全运行,在希望的时间和地点提供需要的设备,同时尽可能地降低运行和维护成本。因此,开发资产管理系统目的即在于解决企业资产管理过程中不必要的人力、物力的浪费,提高数据汇总速度,从而提高资产管理的合理性和科学性[3]。系统的开发与利用,不仅可以进行资产清查、摸清资产存量及其使用状况,更有利于今后采取针对性的措施以保障资产安全和完整,促进资产整合、调配和共享,提高资产使用效益。
1.2 现状分析
90年代末,西方各国根据资产管理理论提出了新的质量管理理论,在理论和实际上都有所突破。我国学者在资产管理方面也做了较多研究。诸如魏霞飞、赵瑞玺等学者指出目前在资产的管理方面,我国无论是在制度上还是在实际操作过程中存在着较大的问题[4]。主要存的问题有:一是管理混乱造成资源浪费,很多单位系统采购过以后都当做了一堆废铁闲置,毫无用处,需要的部门也无法通过渠道获得白白闲置了的政府资源;二是担保不透明造成国家投资损失,有些管理者为了一些私利,将政府的事业单位资产通过贱卖,通过不正当置换换来个人的利益造成了国家的损失;三是制度还不够完善,国家发展到至今一直还没有一部完整的事业单位资产管理办法,让人有漏洞可寻,造成国家损失;四是管理手段落后,普查一次时间长,政府事业单位的资产在逐年增加很难与详细普查,因此应采用信息化手段进行管理。
一套合理的资产管理系统,可以在实际工作中,极大地提高工作效率,增加效益,降低成本,有助于真正实现厉行节约的原则。它的简单易学的用户界面及强大的系统功能,在众多同类系统中脱颖而出。原来耗时耗人耗力的资产盘点工作,现在只要一两个人很短时间内就可以轻松完成;大量的重复购置和闲置浪费情况现在及时得到解决[5]。
通过系统,不仅各资产负责人可以随时地清晰地查询到自己所负责的所有资产详细信息,而且也可以给领导审批资产采购计划等决策作为依据;通过财务核对功能,还可以使资产帐与财务帐一一对应起来,大大方便了日后的资产清查与管理;通过系统,还可以灵活使用物资调拨,使资产的使用价值发挥到最大;可以对理顺各种资产管理体制、落实资产管理制度、实现对资产的全面监控和有效利用、提高管理工作效率,更好地服务于企业单位各方面,发挥十分积极的作用[6]。将资产管理工作搭建在一个高水平的管理平台之上,不仅使管理变得更加科学化、规范化,同时也有力地促进了企业整体管理水平的提高,主要表现在以下几个方面:。
1. 促进资产管理的信息化、网络化,使各种资产的管理能真正落到人,落实到点。
2. 轻松管理固定资产,在办公室的方寸之中就能掌控全方位资产信息,提高物资利用效益,降低成本支出。
3. 为企业资产清查、财帐物帐核对提供更为可靠的平台,避免企业在资产管理环节上可能造成财产流失的隐患。
总之,本毕业设计的主要目标即是:研究单位资产管理系统的需求特点,从提髙管理人员在资产管理方面的效率出发,建立一个规范化、集中化、标准化的基于网络的单位资产管理规范,以解决资产管理的瓶颈。基于Java技术,通过不断的研究与设计,开发一套适用于企业资产日常管理的资产管理信息系统,结合不断发展的网络数据库技术,促进资产的科技管理,提高资产的利用效益,实现资产管理的网络化、科学化、规范化。
1.3 开发技术和工具
1.3.1 Java语言与Java平台
Java 编程语言的风格十分接近C、C++语言。Java是一个纯的面向对象的程序设计语言,它继承了 C++ 语言面向对象技术的核心,Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java SE 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性[7]。
Java 不同于一般的编译执行计算机语言和解释执行计算机语言,它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编译、到处执行”的跨平台特性。与传统程序不同,Sun 公司在推出 Java 之际就将其作为一种开放的技术。全球数以万计的 Java 开发公司被要求所设计的 Java 软件必须相互兼容。“Java 语言靠群体的力量而非公司的力量”是 Sun 公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同[8]。
Sun 公司对 Java 编程语言的解释是:Java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。Java 平台是基于 Java 语言的平台。
1.3.2 Access数据管理系统
数据库技术是现在信息系统的核心技术,任何一个系统都不可能脱离数据库,所以本系统采用处理单机访问效果较理想的Access2007数据库管理系统。
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 Microsoft Jet Database Engine 和 图形用户界面两项特点,是 Microsoft Office 的系统程序之一。
MS ACCESS以它自己的格式将数据存储在基于Access Jet的数据库引擎里。它还可以直接导入或者链接数据(这些数据存储在其他应用程序和数据库)[9]。
软件开发人员和数据架构师可以使用Microsoft Access开发应用软件,“高级用户”可以使用它来构建软件应用程序。和其他办公应用程序一样,ACCESS支持Visual Basic宏语言,它是一个面向对象的编程语言,可以引用各种对象,包括DAO(数据访问对象),ActiveX数据对象,以及许多其他的ActiveX组件。可视对象用于显示表和报表,他们的方法和属性是在VBA编程环境下,VBA代码模块可以声明和调用Windows操作系统函数。图1.1是Access2007的界面图。
 
图1.1  Access2007界面图
1.3.3 MyEclipse 开发平台
MyEclipse 是一个非常好用的用于开发Java, J2EE的 Eclipse 插件集合。它的功能很强大,支持也非常广泛。所以很多Java开发人员选择它进行开发,它能够大大的简化开发流程,提高开发效率和开发质量。图1.2是MyEclipse的界面图。
 
                            图1.2  MyEclipse界面图
1.4 论文的组织结构
第一章为绪论,介绍了整个毕业设计的研究背景和意义,以及当前的发展现状及应用。并介绍了开发所应用到的相关技术与工具。
第二章阐述了系统的需求分析,主要针对用户群的需求,功能的需求以及性能上的需求方面进行了分析。
第三章介绍了系统的概要设计,确定系统模块结构,进行概念模型的设计及数据库的设计,列举了系统中使到的E-R图及数据库表。
第四章主要介绍系统的详细设计与实现,包括:系统管理模块、资产信息管理模块、账户管理模块、职员管理模块以及资产还借管理模块的详细设计与实现。
第五章是结束语,对整个系统进行了总结,并提出了目前系统的不足和继续改进的方向。
 
 
第2章  系统需求分析
通过进行相关调研,研究需要开发的资产管理系统在使用中要达到的目的、要求和必要性,从而总结出资产管理系统的需求分析主要包括功能性需求和非功能性需求等方面的内容。
2.1系统需求概述
资产管理系统由系统管理、资产信息管理、类别管理、账户管理、职员管理、资产还借管理六大模块组成。
系统管理:系统管理包含系统设置、切换用户和退出系统三个功能。
资产信息管理:包含资产类别管理和信息管理功能。
类别管理:包含大类管理和子类管理功能。
账户管理:包含添加账户、删除用户、修改密码功能。
职员管理:包含添加职员、删除职员、修改职员功能。
资产借还管理:包含领用资产、归还资产、归还记录、维修的资产、报废的资产等功能。
2.2系统功能性需求
2.2.1系统管理
1.系统设置
管理员可在系统设置中自定义资产价格下限
2.切换账户
登陆用户可在系统设置中切换其他用户,这里自动跳到系统登陆界面进行重新登陆。
3.退出账户
用户可点击“退出账户”来退出登录。
2.2.2资产信息管理
资产信息管理功能是让用户进行资产的维护操作;包括可按条件查询资产,可按类别添加资产,修改资产,删除资产,维修资产,报废资产等操作。
2.2.3类别管理
1.大类管理
大类管理功能是让管理员用户进行资产信息大类的维护操作;包括增加删除修改查询类别操作。
2.子类管理
子类管理功能是让管理员用户进行资产信息大类别下子类别的维护操作;包括增加删除修改查询子类类别操作。
2.2.4职员管理
1.添加职员
管理员用户可在添加职员界面添加新的职员,需要编写新职员的姓名、性别、年龄、职务、备注等信息。
2.修改职员
管理员用户可在修改职员界面对已存在的职员信息进行修改操作。
3.删除职员
管理员用户可删除已存在的职员信息。
2.2.5账户管理
1.添加账户
管理员可在添加账户界面添加新的登录账户及密码,并且可检测新用户名是否已存在,以确保不会重复添加。
2.删除账户
管理员可已删除已存在的登录账户信息。
3.修改密码
管理员可为已存在的登录账户进行修改密码操作;用户可以修改自己账户的密码信息。
2.2.6资产借还管理
1.领用资产
进入领用资产界面前会检测是否有可领用的资产信息,有则弹出领用资产界面。用户领用资产需要选择要领用的资产并填写相关信息,比如领用人、用备注等等信息。
2.归还资产
进入资产归还界面前系统会判断是否有借出的资产信息,有则弹出归还资产界面。用户归还资产需要选择要归还的资产并填写相关信息。
3.归还记录
归还记录界面会显示出所有领用资产的归还记录,以便查询。并且管理员可对归还记录进行删除操作。
4.维修资产
管理员在资产信息管理界面可对资产添加维修记录,在维修资产界面会显示出所有的资产维修记录,以便查询或他用。
5.报废资产
管理员在资产信息管理界面可对资产进行报废操作,在报废资产界面会显示出所有的资产报废记录,以便查询或他用。
2.3系统非功能性需求
2.3.1用户界面需求
1.人性化:加入友好的提示信息、帮助信息,有清楚的错误提示。
2.操作简单:操作简单易上手。
3.用户界面:界面结构调理清楚,布局简洁。
4.语言和清晰度:使用正常语言而不是用专业术语、完善是觉得清晰度。
2.3.2软硬件环境需求
1.网络要求:所有用户计算机接入企业内部局域网络,所有系统必须在一个网络环境下,以实现与其他系统的接口调用。
2.硬件要求:windows系统普通PC,1G内存以上。
3.数据库:Access
4.运行环境:Sun Java JRE1.6 For Win.
5.系统平台:WinXP/Win7
2.3.3产品质量要求
1.正确性:不能出现业务出错的情况。
2.可靠性:除硬件、电源、操作系统和服务器外程序不允许异常退出或崩溃。
3.易用性:安装操作简单易上手。
4.安全性:用户信息保密。
5.可扩展性:可在当前所做需求的基础上进行功能上的拓展。
6.可移植性:可运行在当前大多数主流的操作平台上。
2.4 系统体系结构的选择
一般来说,分布式应用系统的架构模式主要有两种:C/S模式和B/S模式。
C/S(Client/Server)模式即客户机/服务器模式,在这种模式中,客户端提供用户界面、运行逻辑处理程序,数据库服务器接受客户端SQL查询语句并对数据库进行查询,然后将查询结果返回给客户端。这种架构方式的优点在于结构简单、速度快;但是系统维护和升级困难,往往改动一个地方,就需要升级所有客户端的程序。
B/S(Browse/Server)模式即浏览器/服务器模式,在这种模式中,将所有业务逻辑都放在服务器上进行,因此无需开发专用的客户端应用程序,只需有通用的浏览器即可使用系统,浏览器只负责接受用户请求并将服务器处理结果显示给用户,大大缩短了应用程序开发周期并减少了系统管理员的工作量[10],[11]。
在本系统设计开发时,考虑到系统使用者主要是公司的管理者和财会人员这一特殊群体,并考虑到整个系统的安全性。因此我们依旧选择C/S模式作为本系统的架构。

第3章 系统概要设计
 根据对系统功能需求的分析,对系统的各项功能进行整合、分块,按照结构化程序设计的要求,本系统需要完成的主要功能包括系统设置、资产信息管理、类别管理、职员管理、资产借还管理和账户管理等主要模块,整体系统具有全面性、规范性、高效性、适用性等特点,达到信息化管理的目标:
1.提供一个统一的信息平台,实现信息资源共享,对资产数据资源实时利用;
2.提供一个工作平台,直接在计算机上完成资产日常的管理,简化工作流程与环节;
3.为资产进行资产卡和编号方式管理,及时、方便的掌握资产目前所处状况及流向(减少、变动、报废等);
4.提供较强的系统查询功能(如自定义查询),为领导对资产决策提供依据,为下级资产管理人员实时了解自身家底提供方便。
 
图3.1 系统功能模块图
通过该系统的使用,可以更好地理顺资产管理体制、落实资产管理制度、实现对资产的全面监控和有效利用、提高管理工作效率,更好地服务于企业发展等方面。
资产管理系统模块的分解实质就是功能的分析,是一个由抽象到具体的步骤。功能框架图给出它们从总体到一般的所属关系。图中的矩形框代表的是一个功能模块,根据前一章进行的分析,在研究设计基本内容中给出具体对应的模块功能框架图,可具体实现模块的详细设计,如图3.1所示:
3.1 概念模型设计
为了使用户的数据准确明了的表达出来,需要建一个概念性的数据模型。概念性数据模型是一种面向问题的数据模型,是按用户的观点来对数据和信息建模[12]。最常用的表示概念性数据模型的方法称为E-R模型。
E-R图是概念模型中常用的设计工具,一般有三部分组成:
矩形框表示实体;菱形框表示联系;椭圆框表示实体属性。
本系统主要包含了职员、资产、大类别、子类别、归还记录、领用记录、管理员等几个实体。具体E-R图如图3.2所示:
 
图3.2 系统E-R图
3.2 数据库设计
在系统概念数据模型的基础上,针对具体的数据库系统产生的模型叫物理数据模型,它相对概念数据模型最大的不同是,它针对了具体的数据环境,即目标数据库,进行了实体与关系转化为表与关系的物理性定义[13],[14]。
根据系统E-R图分析,得出管理模块的数据逻辑结构[15],下面列举了系统主要的数据库表(实体)模型,具体如下:
表3-1 资产信息表
中文含义    字段名称    字段类型    长度    主键    备注
自动编号    Aid    自动编号        是    
大类编号    ACid    数字            
子类编号    ASid    数字            
资产名称    Aname    备注            
状态    Astatus    文本            
型号    Amodel    备注            
价格    Aprice    数字            
购入日期    Apur_date    备注            
使用者    Ause_by    备注            
备注    Aremark    备注            
表3-2职员信息表
中文含义    字段名称    字段类型    长度    主键    备注
职员编号    Eid    自动编号        是    
姓名    Ename    备注            
性别    Esex    文本            
年龄    Eage    数字            
职务    Eposition    备注            
备注信息    Eremark    备注            


表3-3资产领用表
中文含义    字段名称    字段类型    长度    主键    备注
领用编号    Lid    自动编号        是    
资产编号    LAid    数字            
员工编号    LEid    数字            
管理员    LOname    备注            
领用时间    Ldate    日期/时间            
目的用途    Lpurpose    备注            
备注    Lremark    备注            
表3-4资产归还表
中文含义    字段名称    字段类型    长度    主键    备注
归还编号    Rid    自动编号        是    
资产编号    RAid    数字            
资产名称    RAname    备注            
使用者    Ruse_by    备注            
领用时间    RLdate    日期/时间            
归还时间    Rdate    日期/时间            
领用管理员    RLOname    备注            
归还管理员    RROname    备注            
备注    Rremark    备注            

 
第4章 系统详细设计与实现
详细设计阶段的根本任务是确定应该怎样具体实现所要求的系统,也就是经过这个阶段的实际工作,应该得出对目标系统的精确描述,从而在系统实现阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序[16]。具体来说就是把经过总体设计得到的各个功能模块详细地加以描述。
4.1 系统登录模块设计
4.1.1 功能设计
执行程序后,显示登录界面,输入正确的账号和密码后,可跳转至操作界面对系统进行操作。
4.1.2 算法描述
    预先使用Access,将可登录系统的初始账号和与账号一一对应的密码存入数据库,输入账号密码点击登录后,程序连接数据库比较是否有与所输入账号密码一致的组合,若存在,则可登录系统;若不存在或有其它不符合规范的操作则报错。
4.1.3 系统实现
    执行程序后,系统弹出登录界面。如图4.1所示。
                    
                             图4.1资产管理系统登录界面
    若输入的账号密码无法与数据库中的信息相匹配,则系统报错,如图5.2所示
                 
                        图4.2  登录界面报错提示
 
    若账号密码正确,登录系统后,进入系统的主界面如图5.3所示
 
                              图4.3 资产管理系统主界面
4.2 系统管理模块设计
4.2.1 关键功能设计
这一模块主要包括系统设置和用户账户的切换和退出。
1.系统设置:对系统录入的资产的价格下限进行设置 ,从而确定纳入资产管理系统的资产范围。
2.切换账户:通过这个功能可以实现不同账户的切换,方便在同一客户端上不同管理者进行操作。
3.退出账户:操作完成后可通过这个功能退出系统。
4.2.2 算法描述
1.系统设置:首先要对用户的输入内容进行判断,若不合法,则进行告警。若合理则写入数据库文件备用。
2.切换账户:账户的切换包括了系统的退出与重新执行,退出后可直接调用系统登录模块。
4.2.3 系统实现
    点击系统管理选项会展开相关选项卡,点击选项卡选择需要的功能会进入对应的操作界面。如图5.4所示
                          
                         图4.4系统管理菜单界面

    点击系统设置选项卡会弹出系统设置界面,可对资产资产价格下限进行设置。如图4.5所示
                     
                            图4.5 系统设置界面
     若输入的资产与提示的输入格式不符,例如在价格下限中包含非数字的符号,则则系统会提示不合法。如图4.5所示
                        
                           图4.5系统设置界面警告
     点击切换账户后会出现上节所示的资产管理系统登录界面。
4.3 资产信息管理模块设计
4.3.1 功能设计
这一模块主要是实现资产的管理工作,包括资产的录入和查找。为了使资产管理系统化,在录入资产时应包含录入资产的名称、所属大类和小类、购入的价格,日期和型号等信息,若资产所属的大类或小类不存在,在可通过大类管理和小类管理选项进行资产大类和资产小类的添加。
由于这是资产管理系统的核心内容,因此对资产的增添结果还应直接的体现在主界面的左侧树形表和右侧的资产列表中。
4.3.2 算法描述
这一部分虽然操作的对象数据表不同,但主要都是通过基本的sql语句对数据库进行的操作,再将结果反馈在主界面的表格中。 
4.3.3 系统实现
点击资产信息管理选项,在展开的选项卡中选择类别管理菜单下的大类管理或子类管理可切换至对应的操作界面,可以进行大类或子类的添加、删除、修改、查找、关闭等具体操作,如图4.5,图4.6所示。
                
                       图4.5大类管理界面
                    
                                  图4.6 子类管理界面
点击信息管理选项卡,可切换至信息管理界面,可在与资产对应得大类和子类下添加资产的相关信息也可根据资产的相关信息查找以添加的资产。如图5.7所示。
               
                      图4.7 资产信息管理界面
    在进行具体的添加资产的操作中,在相应数据中填入符合预设规范的实体属性即可添加资产,若信息不符合规范,例如价格低于系统设置中输入的资产价格下限,系统则会报错。如图4.8所示
              
                    图4.8资产信息录入报错界面
     在正确填写并成功添加资产后,资产信息会即时的出现在资产管理系统主界面,如图4.9所示,第4条资产信息即为我们修改资产价格后录入的。
      
                   图4.9 主界面在录入资产后更新
4.4 账户管理模块设计
4.4.1 功能设计
这一模块主要是用来添加或删除可登录资产管理系统的账户。
1.添加账户:当有新的用户时,可以添加新的账户,新的用户可通过该账户登录系统对资产进行管理。
2.删除账户:当某个旧的账户不再使用时,管理员可以通过这里对旧的账户进行删除以节省数据库空间并提高安全性。
3.修改密码:为保证安全性,账户使用一段时间后,用户可以通过这个操作对账号的密码进行修改。
4.4.2 算法描述
这一模块的算法比较简单,都是通过操作基本的SQL语句对数据库中的数据进行操作。添加、删除等按钮的具体实现前面已有描述。
4.4.3 系统实现
 点击账户管理选项,在展开的选项卡中选择添加账户、删除账户或修改密码可进入对应界面。如图4.10,图4.11所示 
                         
                             图4.10 添加账户界面
                         
                              图4.11 删除账户界面
    需要注意的是,在进行这一操作时,为避免误操作及逻辑上的正确性,删除的对象应限制在非登录账户,若帐户名为正在登录的账户,则系统会报警,如图4.12所示
                        
                            图4.12 输入当前账户时的警告
   修改账户密码的界面载入图4.13所示,保证新密码两次输入一致则可修改成功,对象则默认为当前登陆账户
                                 
                                       图4.13修改密码界面
4.5 职员管理模块设计
4.5.1 功能设计
这一模块主要是对公司职员的姓名、性别、年龄、职务等信息进行增删和修改。
4.5.2 算法描述
这一模块的算法比较简单,依旧是通过操作基本的SQL语句对数据库中的数据进行操作。
4.5.3 系统实现
点击职员选项,在展开的选项卡中选择添加职员、删除职员或修改职员可进入对应界面。图4.14为添加职员界面,与添加资产类似,填入与系统预设的规范相一致的信息后,该职员的信息将会被添加到数据库中,可以在资产还借等相关模块中被选择。
              
                      图4.14添加职员界面
  图4.15为删除职员界面,在进行操作时先根据姓名或职务查找要删除的职员,选择查找到的结果即可删除该职员的相关信息,如图4.16所示
                    
                               图4.15删除职员界面
                    
                        图4.16通过姓名查找到相关信息 
修改职员界面如图4.17所示,在已填加的职员信息中选择并进行修改即可
                    
                                图4.17修改职员界面
4.6 资产还借管理模块设计
4.6.1 功能设计
 这一模块主要用于记录公司资产的还借情况。
4.6.2 算法描述
这一模块的算法比较简单,都是通过操作基本的SQL语句对数据库中的数据进行操作。
4.6.2 系统实现
执行程序后,领用资产、归还资产以及查看归还记录的相关界面如图5.18,图5.19,图5.20所示。
        
                      图4.18 资产领用界面


 
           
                                   图4.19 资产归还界面

 
图4.20 归还记录界面 
第5章 总结与展望
5.1 总结
本文研究了企业资产管理系统的需求特点,从提髙管理人员在资产管理方面的效率出发,基于Java技术,开发一套适用于企业资产日常管理的资产管理信息系统。主要包括如下工作:
1.查阅了资产管理系统研究的背景,明确了系统开发的目标及;研究了系统开发中用到的JAVA语言、Access数据库等关键技术。
2.针对资产管理工作流程的实际情况,进行了系统设计,选取了合理的开发方案,系统地分析了数据库和数据库管理系统的概念,创建规范的数据库。
3.阐述了基于客户端/服务器架构的资产管理系统的开发过程,实现了资产管理系统的基本功能。
本系统是基于 C/S 模式开发的,使用简单方便并且易于维护。采用C/S结构时,客户端和服务器端都能够处理任务,这虽然对客户机的要求较高,但因此可以减轻服务器的压力。
在这次课程设计中我深刻地认识到,在开发一个项目时一定要先做好整体的规划,按照软件的开发过程,详细地写好每一个必要的文档。一个软件文档的最主要目标是传达一个系统的技术要素和使用方法。第二个目标是提供软件开发过程中的需求,决策,行为,角色和责任的书面记录。只有实现了这两个目标,软件文档才真正提供了有意义的信息。软件的概念就是:程序+文档,程序就是文档,文档集成在程序中。
在程序开发的过程中,要求在选择开发环境时不仅要考虑环境对设计、开发的完美支持,而且要考虑对维护、文档的支持;要求软件人员在设计、开发过程中要考虑维护问题、文档问题。程序与文档合一的概念不仅存在于系统的设计、开发阶段而且存在于系统的维护阶段,它贯穿软件的生命周期
5.2 研究展望
目前本系统主体部分的功能已经全部实现,但由于时间和精力的关系,系统还存在很多不足,还有几个方面有待完善,具体如下:
1.系统在细节上的设计与实现需要进一步的完善。系统的基本功能都已实现,但有些细节还需进一步的优化。
2.系统操作界面比较简单,需进一步美化。各功能操作后,所显示的结果页面的比例有待进一步的优化。
3.系统功能有待于进一步的扩展。将更多的需求内容加入到系统中,使系统更加完善。
通过以后的继续学习研究,将对系统做进一步完善处理,克服以上指出的系统缺陷,使该资产管理系统更加完善。
 
参考文献
[1]  石薪靖.宁波钢铁有限公司设备管理信息系统的应用与开发[J].科技创新导报,2010(07): 202-203.
[2]  葛金明.中专学校固定资产管理系统的设计与实现[J]. 信息安全与技术,2013(08): 70-71.
[3]  唐桂华,夏晖.我国MIS的开发现状及发展趋势[J]. 电子科技大学学报(社科版),2002(2): 22-24.
[4]  魏霞飞,赵瑞玺.加强固定资产管理 提升企业经济效益.露天采矿技术. 2006年. 第B09期. 74-75.
[5]  王辉.固定资产管理系统[D].杭州:浙江工业大学,2012.
[6]  Mohammad Javad Mirzaei, Reza Dashti, Ahad Kazemi, Mohammad Hassan Amirioun, An asset-management model for use in the evaluation and regulation of public-lighting systems, Utilities Policy, Volume 32, March 2015, P19-28.
[7]  何宗霖.零基础学Java Web开发[M]. 北京:机械工业出版社. 2010:7-9.
[8]  (美)埃克尔 著,陈昊鹏 译. Java编程思想(第4版)[M]. 北京:机械工业出版社. 2007:3-4.
[9]  祁大鹏. Access2007实用教程.北京:电子工业出版社,2010:3-5.
[10] 孙鑫. Java Web开发详解[M]. 北京:电子工业出版社. 2006:16-19.
[11] 詹素青. 基于B /S 模式的MIS 的开发[J]. 电化教育研究, 2004(8):12-13
[12] 李发陵,刘志强. 软件工程[M]. 清华大学出版社.2013:46-49
[13]  Amy J.C. Trappey, Charles V. Trappey, Lin Ma, Jimmy C.M. Chang, Intelligent engineering asset management system for power transformer maintenance decision supports under various operating conditions, Computers & Industrial Engineering, Available online 6 January 2015.
[14] 王珊 萨师煊.数据库系统概论(第四版)[M].北京:高等教育出版社, 2006:34-40
[15]  Gang Ma, Liping Sun, The Design and Implement of FPSO Assets Management System, Procedia Environmental Sciences, Volume 12, Part A, 2012, Pages 484-490.
[16]  唐向上. 高校固定资产管理数据系统的分析与实现[D].成都:电子科技大学,2012.
 
 
致  谢
    论文即将完成,在武汉理工四年以来的学习深造也即将告一段落,在此期间我结识了多位学识渊博、治学严谨的老师,也认识了多位来自不同工作岗位的同学,他们都给了我很多的帮助,让我顺利的走向毕业,在此向他们表示衷心的感谢。
    首先感谢江雪梅老师在毕业论文期间给予我的耐心指导和帮助,也感谢在此过程中给予我帮助的同学和朋友们,你们无私的帮助使我不仅能顺利完成毕业设计,更增长了我的知识,为人生增加了一笔财富。本论文的顺利完成,离不开各位领导、老师、同学和朋友的关心与帮助。我相信在以后的工作和学习中,毕业论文期间收获的东西将对我的帮助会很大,我的收获与你们的帮助是分不开的,谢谢你们。
    最后感谢各位评审老师对论文的评审,感谢您们在百忙之中对本论文提出的宝贵的意见和建议,我会在以后的学习和工作中继续努力,在学习的道路上努力前行。 
附录 
资产管理系统关键程序
   在具体的程序设计中,实现每个功能所对应的程序都可细分为三大部分,即控制类程序,实体类程序和用户界面类程序,。
    控制类程序是为了实现不同程序段间的相互调用,实体类程序则用于读取数据库内某一实体的实体属性并将去反馈在操作界面上,用户界面类程序主要用于生成用户的操作窗口和操作按钮并对每个按钮的功能进行设置,是实现整个系统功能的关键部分。
    由于各功能模块在实现过程中都遵循上述原则,因此各模块源程序的重复语句较多。为节省篇幅,仅列出部分关键程序:
    
1控制类程序:
    系统入口程序
public class AssetManageSystem {
    /**
     * 程序入口
     * 
     * @param args
     */
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager
                    .getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }
        new Login("固定资产管理系统--管理员登录", "login");

    数据库连接管理程序
public final class ConnectionManager {
    private static final String DRIVER_CLASS = "sun.jdbc.odbc.JdbcOdbcDriver";// 驱动类
    private static final String DATABASE_URL = "jdbc:odbc:Assets;";//连接URL
    private static final String USER_NAME = "";//数据库用户名
    private static final String PASSWORD = "";//数据库密码
    private ConnectionManager() {//私有构造方法,禁止实例化
    }

    public static Connection getConnection() {//取得数据库连接
        try {
            Class.forName(DRIVER_CLASS);//加载驱动类
            Connection con = DriverManager.getConnection(DATABASE_URL,
                    USER_NAME, PASSWORD);//获得连接对象
            return con;//返回连接对象
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, "没有找到连接数据库所需的驱动类!", "错误",
                    JOptionPane.ERROR_MESSAGE);
            return null;
        } catch (SQLException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, "数据库连接错误!请核实配置文件是否有误!", "错误",
                    JOptionPane.ERROR_MESSAGE);
            return null;
        }
    }

    public static void closeConnection(Connection con) {//关闭数据库连接
        try {
            if (con != null && !con.isClosed()) {//连接对象不为空,并且不是关闭的
                con.close();//关闭连接对象
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void closeStatement(PreparedStatement cst) {//关闭数据库操作对象
        try {
            if (cst != null) {//数据库操作对象不为空
                cst.close();//关闭数据库操作对象
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void closeResultSet(ResultSet rs) {//关闭结果集
        try {
            if (rs != null) {//结果集对象不为空
                rs.close();//关闭结果集
                rs = null;//设置其值为空
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

    生成菜单栏程序
public class MenuFactory {
    // 菜单栏所属窗口
    private MainFrame frame = null;
    public MenuFactory(MainFrame frame) {
        this.frame = frame;
    
public JMenuBar buildMenuBar() {
    JMenuBar mb = new JMenuBar();                    //创建工具栏
    JMenu mSystem = new JMenu("系统管理");            //系统管理菜单
    JMenuItem miSetting = new JMenuItem("系统设置");    //系统设置菜单项
    JMenuItem miLogon = new JMenuItem("切换帐户");    //切换帐户菜单项
    JMenuItem miExit = new JMenuItem("退出系统");    //退出系统菜单项
    JMenu mAssets = new JMenu("资产信息管理");        //资产信息管理菜单
    JMenu mCategory = new JMenu("类别管理");            //类别管理子菜单
    JMenuItem miCategory = new JMenuItem("大类管理");//大类管理菜单项
    JMenuItem miSubcate = new JMenuItem("子类管理");    //子类管理菜单项
    JMenuItem miAsset = new JMenuItem("信息管理");    //信息管理菜单项
    JMenu mUser = new JMenu("帐户管理");                //帐户管理菜单
    JMenuItem miAddUser = new JMenuItem("添加帐户");    //添加帐户菜单项
    JMenuItem miDelUser = new JMenuItem("删除帐户");    //删除帐户菜单项
    JMenuItem miUpdPwd = new JMenuItem("修改密码");    //修改密码菜单项
    JMenu mEmployee = new JMenu("职员管理");            //职员管理菜单
    JMenuItem miAddEmp = new JMenuItem("添加职员");    //添加职员菜单项
    JMenuItem miDelEmp = new JMenuItem("删除职员");    //删除职员菜单项
    JMenuItem miUpdEmp = new JMenuItem("修改职员");    //修改职员菜单项
    JMenu mLendOrReturn = new JMenu("资产还借管理");    //资产还借管理菜单
    JMenuItem miLend = new JMenuItem("领用资产");    //领用资产菜单项
    JMenuItem miReturn = new JMenuItem("归还资产");    //归还资产菜单项
    JMenuItem miRRecord = new JMenuItem("归还记录");    //归还记录菜单项
    JMenuItem miMaintain = new JMenuItem("维修的资产");//维修的资产菜单项
    JMenuItem miScrap = new JMenuItem("报废的资产");//报废的资产菜单项
    MenuHandler mh = new MenuHandler(frame);

    miSetting.setActionCommand("set");
    miLogon.setActionCommand("logon");
    miExit.setActionCommand("exit");
    miCategory.setActionCommand("mgCate");
    miSubcate.setActionCommand("mgSubcate");
    miAsset.setActionCommand("mgAsset");
    miAddUser.setActionCommand("addUser");
    miDelUser.setActionCommand("delUser");
    miUpdPwd.setActionCommand("updPwd");
    miAddEmp.setActionCommand("addEmp");
    miDelEmp.setActionCommand("delEmp");
    miUpdEmp.setActionCommand("updEmp");
    miLend.setActionCommand("lend");
    miReturn.setActionCommand("return");
    miMaintain.setActionCommand("maintain");
    miScrap.setActionCommand("scrap");
    miRRecord.setActionCommand("rRecord");

    mSystem.setIcon(ImageGetter.getIcon("AMSConfiguration" + File.separator
            + "img" + File.separator + "sysm.gif"));
    miSetting.setIcon(ImageGetter.getIcon("AMSConfiguration"
            + File.separator + "img" + File.separator + "sys_config.gif"));
    miLogon.setIcon(ImageGetter.getIcon("AMSConfiguration" + File.separator
            + "img" + File.separator + "sys_logon.gif"));
    miExit.setIcon(ImageGetter.getIcon("AMSConfiguration" + File.separator
            + "img" + File.separator + "sys_exit.gif"));
    mAssets.setIcon(ImageGetter.getIcon("AMSConfiguration" + File.separator
            + "img" + File.separator + "assetm.gif"));
    mCategory.setIcon(ImageGetter.getIcon("AMSConfiguration"
            + File.separator + "img" + File.separator + "asset_catem.gif"));
    miCategory.setIcon(ImageGetter.getIcon("AMSConfiguration"
            + File.separator + "img" + File.separator
            + "asset_catem_cate.gif"));
    miSubcate.setIcon(ImageGetter.getIcon("AMSConfiguration"
            + File.separator + "img" + File.separator
            + "asset_catem_subcate.gif"));
    miAsset.setIcon(ImageGetter.getIcon("AMSConfiguration" + File.separator
            + "img" + File.separator + "asset_assetm.gif"));
    mUser.setIcon(ImageGetter.getIcon("AMSConfiguration" + File.separator
            + "img" + File.separator + "userm.gif"));
    miAddUser.setIcon(ImageGetter.getIcon("AMSConfiguration"
            + File.separator + "img" + File.separator + "user_add.gif"));
    miDelUser.setIcon(ImageGetter.getIcon("AMSConfiguration"
            + File.separator + "img" + File.separator + "user_del.gif"));
    miUpdPwd.setIcon(ImageGetter.getIcon("AMSConfiguration"
            + File.separator + "img" + File.separator + "user_updpwd.gif"));
    mEmployee.setIcon(ImageGetter.getIcon("AMSConfiguration"
            + File.separator + "img" + File.separator + "empm.gif"));
    miAddEmp.setIcon(ImageGetter.getIcon("AMSConfiguration"
            + File.separator + "img" + File.separator + "emp_add.gif"));
    miDelEmp.setIcon(ImageGetter.getIcon("AMSConfiguration"
            + File.separator + "img" + File.separator + "emp_del.gif"));
    miUpdEmp.setIcon(ImageGetter.getIcon("AMSConfiguration"
            + File.separator + "img" + File.separator + "emp_upd.gif"));
    mLendOrReturn
            .setIcon(ImageGetter.getIcon("AMSConfiguration"
                    + File.separator + "img" + File.separator
                    + "lendorreturn.gif"));
    miLend.setIcon(ImageGetter.getIcon("AMSConfiguration" + File.separator
            + "img" + File.separator + "lr_lend.gif"));
    miReturn.setIcon(ImageGetter.getIcon("AMSConfiguration"
            + File.separator + "img" + File.separator + "lr_return.gif"));
    miRRecord.setIcon(ImageGetter.getIcon("AMSConfiguration"
            + File.separator + "img" + File.separator
            + "lr_returnrecord.gif"));
    miMaintain.setIcon(ImageGetter.getIcon("AMSConfiguration"
            + File.separator + "img" + File.separator + "lr_maintain.gif"));
    miScrap.setIcon(ImageGetter.getIcon("AMSConfiguration" + File.separator
            + "img" + File.separator + "lr_scrap.gif"));

    mSystem.add(miSetting);
    mSystem.addSeparator();
    mSystem.add(miLogon);
    mSystem.add(miExit);
    mCategory.add(miCategory);
    mCategory.add(miSubcate);
    mAssets.add(mCategory);
    mAssets.add(miAsset);
    mUser.add(miAddUser);
    mUser.add(miDelUser);
    mUser.addSeparator();
    mUser.add(miUpdPwd);
    mEmployee.add(miAddEmp);
    mEmployee.add(miDelEmp);
    mEmployee.add(miUpdEmp);
    mLendOrReturn.add(miLend);
    mLendOrReturn.add(miReturn);
    mLendOrReturn.addSeparator();
    mLendOrReturn.add(miRRecord);
    mLendOrReturn.addSeparator();
    mLendOrReturn.add(miMaintain);
    mLendOrReturn.add(miScrap);
    miSetting.addActionListener(mh);
    miLogon.addActionListener(mh);
    miExit.addActionListener(mh);
    miCategory.addActionListener(mh);
    miSubcate.addActionListener(mh);
    miAsset.addActionListener(mh);
    miAddUser.addActionListener(mh);
    miDelUser.addActionListener(mh);
    miUpdPwd.addActionListener(mh);
    miAddEmp.addActionListener(mh);
    miDelEmp.addActionListener(mh);
    miUpdEmp.addActionListener(mh);
    miLend.addActionListener(mh);
    miReturn.addActionListener(mh);
    miMaintain.addActionListener(mh);
    miScrap.addActionListener(mh);
    miRRecord.addActionListener(mh);

    mb.add(mSystem);
    mb.add(mAssets);
    mb.add(mUser);
    mb.add(mEmployee);
    mb.add(mLendOrReturn);

    return mb;
}
}


    数据库操作程序(资产信息查找部分)
public class DBWorker {

    /**
     * 查找资产信息
     * 
     * @param procName
     *            存储过程名
     * @param param
     *            存储过程参数
     * @return
     */
    public static Collection selAsset(String proc, String param) {
        // 连接数据库
        System.out.println("selAsset-proc:"+proc);
        Connection con = ConnectionManager.getConnection();
        PreparedStatement cst = null;
        ResultSet rs = null;
        // 建一个资产信息列表
        Collection<Asset> ac = new ArrayList<Asset>();
        try {
            // 取得资产信息表数据
            String sql = "select * from view_asset";
            if("proc_selAsset".equals(proc)){
                if(param!=null&&!"".equals(param)){
                    if("maintain".equals(param))
                        sql = "select * from view_asset where Astatus = '维修'";
                    else if("scrap".equals(param))
                        sql = "select * from view_asset where Astatus = '报废'";
                    else if("all".equals(param))
                        sql = "select * from view_asset";                    
                }else
                    sql = "select * from view_asset";
            }
            else if("proc_selAssetInCate".equals(proc))
                sql = "select * from view_asset where Cname = '"+param+"' or Sname ='"+param+"'";
            else if("proc_selAssetInUser".equals(proc))
                sql = "select * from view_asset where Ause_by like '%"+param+"%'";
            else if("proc_selAssetInAid".equals(proc))
                sql = "select * from view_asset where  Aid ="+param;
            cst = con.prepareStatement(sql);
            rs = cst.executeQuery();
            while (rs.next()) {
                Asset a = new Asset();
                a.setId(rs.getInt(1));
                a.setName(rs.getString(2));
                a.setCateName(rs.getString(3));
                a.setSubcateName(rs.getString(4));
                a.setModel(rs.getString(5));
                a.setPrice(rs.getDouble(6));
                a.setPurDate(rs.getString(7));
                a.setStatus(rs.getString(8));
                a.setUseBy(rs.getString(9));
                a.setRemark(rs.getString(10));
                ac.add(a);
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            ConnectionManager.closeResultSet(rs);
            ConnectionManager.closeStatement(cst);
            ConnectionManager.closeConnection(con);
        }
        return ac;
    }
2实体类程序(资产信息部分):
public class Asset {
    private int id;//资产编号
    private String name;//资产名称
    private String cateName;//大类名称
    private String subcateName;//子类名称
    private double price;//资产价格
    private String model;//型号
    private String purDate;//购入日期
    private String status;//状态
    private String useBy;//使用者
    private String remark;//备注
    public String getCateName() {
        return cateName;
    }
    public void setCateName(String cateName) {
        this.cateName = cateName;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getModel() {
        return model;
    }
    public void setModel(String model) {
        this.model = model;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    public String getPurDate() {
        return purDate;
    }
    public void setPurDate(String purDate) {
        this.purDate = purDate;
    }
    public String getRemark() {
        return remark;
    }
    public void setRemark(String remark) {
        this.remark = remark;
    }
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    public String getSubcateName() {
        return subcateName;
    }
    public void setSubcateName(String subcateName) {
        this.subcateName = subcateName;
    }
    public String getUseBy() {
        return useBy;
    }
    public void setUseBy(String useBy) {
        this.useBy = useBy;
    }
}
3 用户界面类程序:
    资产信息管理模块
public class AssetView extends JDialog {
    private MainFrame frame = null;                    //对话框所属窗体
    private JButton btnAdd = new JButton("添加");    //添加按钮
    private JButton btnDelete = new JButton("删除");    //删除按钮
    private JButton btnUpdate = new JButton("修改");    //修改按钮
    private JButton btnQuery = new JButton("查找");    //查找按钮
    private JButton btnReset = new JButton("重置");    //重置按钮
    private JButton btnHelp = new JButton("帮助");    //帮助按钮
    private JComboBox cboCate = new JComboBox();    //大类下拉框
    private JComboBox cboSubcate = new JComboBox();    //子类下拉框
    private JComboBox cboStatus = new JComboBox();    //状态下拉框
    private JTextField txtID = new JTextField("(系统自动生成)");//资产编号文本框
    private JTextField txtName = new JTextField();    //资产名称文本框
    private JTextField txtPrice = new JTextField();    //价格文本框
    private JTextField txtModel = new JTextField();    //型号文本框
    private JTextField txtPurDate = new JTextField();//购入日期文本框
    private JTextArea txaRemark = new JTextArea();    //备注文本域
    /**
     * 构造方法
     * 
     * @param frame
     *            JFrame 对话框所属窗口
     * @param title
     *            String 对话框标题
     */
public AssetView(MainFrame frame, String title) {
    super(frame, title);
    try {
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);//默认关闭行为
        this.frame = frame;//设置对话框所属窗体
        init();//初始化对话框
        WindowCenter.showCenter(frame, this);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
    /**
     * 初始化对话框
     * 
     * @throws Exception
     */
    private void init() throws Exception {
        getContentPane().setLayout(null);        //设置布局管理器为空
        JLabel lblID = new JLabel("资产编号:");    //资产编号标签
        lblID.setBounds(20, 20, 80, 20);        //资产编号标签位置和宽高
        add(lblID);                                //添加资产编号标签
        txtID.setBounds(90, 20, 100, 20);        //资产编号文本框位置和宽高
        txtID.setEditable(false);                //文本框不可编辑
        add(txtID);                                //添加资产编号文本框
        JLabel lblName = new JLabel("资产名称:");//资产名称标签
        lblName.setBounds(200, 20, 80, 20);        //资产名称标签位置和宽高
        add(lblName);                            //添加资产名称标签
        txtName.setBounds(270, 20, 100, 20);    //资产名称文本框位置和宽高
        add(txtName);                            //添加资产名称文本框
        JLabel lblCate = new JLabel("大类名称:");//大类名称标签
        lblCate.setBounds(20, 50, 80, 20);        //大类名称标签位置和宽高
        add(lblCate);                            //添加大类名称标签
        cboCate.setBounds(90, 50, 100, 20);        //大类下拉框位置和宽高
        add(cboCate);                            //添加大类下拉框
        JLabel lblSubcate = new JLabel("小类名称:");//子类名称标签
        lblSubcate.setBounds(200, 50, 80, 20);    //子类名称标签位置和宽高
        add(lblSubcate);                        //添加子类名称标签
        cboSubcate.setBounds(270, 50, 100, 20);    //子类下拉框位置和宽高
        add(cboSubcate);                        //添加子类下拉框
        JLabel lblPurDate = new JLabel("购入日期:");//购入日期标签
        lblPurDate.setBounds(20, 80, 80, 20);    //购入日期标签位置和宽高
        add(lblPurDate);                        //添加购入日期标签
        txtPurDate.setBounds(90, 80, 100, 20);    //购入日期文本框位置和宽高
        add(txtPurDate);                        //添加购入日期文本框
        JLabel lblTip = new 
            JLabel("格式:xxxx-xx-xx或者xxxx.xx.xx");//提示标签
        lblTip.setBounds(25, 105, 240, 20);        //提示标签位置和宽高
        add(lblTip);                            //添加提示标签
        JLabel lblPrice = new JLabel("价格:");    //价格标签
        lblPrice.setBounds(20, 140, 50, 20);    //价格标签位置和宽高
        add(lblPrice);                            //添加价格标签
        txtPrice.setBounds(70, 140, 70, 20);    //价格文本框位置和宽高
        add(txtPrice);                            //添加价格文本框
        JLabel lblStatus = new JLabel("状态:");    //状态标签
        lblStatus.setBounds(20, 170, 50, 20);    //状态标签位置和宽高
        add(lblStatus);                            //添加状态标签
        cboStatus.addItem("正常");                //添加状态选项
        cboStatus.addItem("维修");                //添加状态选项
        cboStatus.addItem("报废");                //添加状态选项
        cboStatus.setBounds(70, 170, 70, 20);    //状态下拉框位置和宽高
        add(cboStatus);                            //添加状态下拉框
        JLabel lblModel = new JLabel("型号:");    //型号标签
        lblModel.setBounds(20, 200, 50, 20);    //型号标签位置和宽高
        add(lblModel);                            //添加型号标签
        txtModel.setBounds(70, 200, 70, 20);    //型号文本框位置和宽高
        add(txtModel);                            //添加型号文本框
        JLabel lblRemark = new JLabel("备注:");    //备注标签
        lblRemark.setBounds(170, 140, 50, 20);    //备注标签位置和宽高
        add(lblRemark);                            //添加备注标签
        JScrollPane scpRemark = new JScrollPane();//滚动面板
        scpRemark.setBounds(220, 140, 150, 80);    //滚动面板位置和宽高
        scpRemark.setVerticalScrollBarPolicy(
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);//垂直滚动
        txaRemark.setLineWrap(true);            //文本域自动换行
        txaRemark.setWrapStyleWord(true);        //单词边界换行
        scpRemark.getViewport().add(txaRemark);    //显示备注文本域
        add(scpRemark);                            //添加滚动面板
        btnAdd.setBounds(50, 250, 60, 20);        //设置添加按钮位置和宽高
        add(btnAdd);                            //添加添加按钮
        btnDelete.setEnabled(false);
        btnDelete.setBounds(160, 250, 60, 20);    //设置删除按钮位置和宽高
        add(btnDelete);                            //添加删除按钮
        btnUpdate.setEnabled(false);
        btnUpdate.setBounds(270, 250, 60, 20);    //设置修改按钮位置和宽高
        add(btnUpdate);                            //添加修改按钮
        btnQuery.setBounds(50, 290, 60, 20);    //设置查询按钮位置和宽高
        add(btnQuery);                            //添加查询按钮
        btnReset.setBounds(160, 290, 60, 20);    //设置重置按钮位置和宽高
        add(btnReset);                            //添加重置按钮
        btnHelp.setBounds(270, 290, 60, 20);    //设置帮助按钮位置和宽高
        add(btnHelp);                            //添加帮助按钮
        setSize(395, 350);                        //设置窗体宽高
        setModal(true);                            //设置对话框为模态
        setResizable(false);                    //设置窗体大小不可变。
        cboCate.addItem("请选择");                //在大类列表中添加选项
        addCateItem(cboCate, DBWorker.selCate("", CateSelType.BY_HAVE_SUBCATE));// 添加含有了类的大类名
        cboCate.addActionListener(new ActionListener() {//单击大类名称列表框中的某项时
            public void actionPerformed(ActionEvent ae) {
                cboSubcate.removeAllItems();//先删除存在的元素再添加新元素 
                if (cboCate.getSelectedIndex() != 0) {//当选中项不为"请选择"时,将执行添加操作
                    addSubcateItem(cboSubcate, DBWorker.selSubcate(cboCate
                            .getSelectedItem().toString(),
                            SubcateSelType.BY_CATE_NAME));
                }
            }
        });
        btnAdd.addActionListener(new ActionListener() {//处理添加按钮事件
            public void actionPerformed(ActionEvent ae) {
                if (isLegality()) {            //如果资产符合登记要求
                    String remark = txaRemark.getText().trim();//获得备注信息
                    if (remark.equals("")) {                //如果备注信息为空
                        remark = "暂无备注";                    //设置默认备注信息
                    }
                    String proc = "proc_addAsset ('" + txtName.getText().trim()
                            + "','" + cboCate.getSelectedItem().toString()
                            + "','" + cboSubcate.getSelectedItem().toString()
                            + "','" + txtModel.getText().trim() + "','"
                            + txtPrice.getText().trim() + "','"
                            + txtPurDate.getText().trim() + "','"
                            + cboStatus.getSelectedItem() + "','" + remark
                            + "')";//插入SQL语句
                    if (DBWorker.modifyRecord(proc) != 0) {//执行插入操作
                        JOptionPane.showMessageDialog(frame, "资产信息添加成功!", "提示",
                                JOptionPane.INFORMATION_MESSAGE);
                        frame.tap.setTableModel(frame.tap.table, DBWorker
                                .selAsset("proc_selAsset", "all"), frame.head);// 更新显示
                    } else {
                        JOptionPane.showMessageDialog(frame,
                                "数据库访问错误,无法完成添加操作!", "提示",
                                JOptionPane.ERROR_MESSAGE);
                        // 这里将错误信息写入日志里
                    }
                }
            }
        });
        btnDelete.addActionListener(new ActionListener() {//删除按钮事件处理
            public void actionPerformed(ActionEvent e) {
                String id = txtID.getText().trim();            //获得资产编号
                String name = txtName.getText().trim();        //获得资产名称
                if (!DBWorker.selLent(id, LentSelType.BY_ASSET_ID)
                                        .isEmpty()) {// 检查该资产是否被领用
                    JOptionPane.showMessageDialog(frame, "该资产已被领用!不能删除!",
                            "警告",JOptionPane.WARNING_MESSAGE);//如果已被领用则不能删除
                    return;
                }
                int confirm = JOptionPane.showConfirmDialog(frame, "确定删除资产 \""
                        + name + "\" 吗?", "确认", JOptionPane.OK_CANCEL_OPTION);
                if (confirm != JOptionPane.OK_OPTION) {//如果用户单击的不是确定按钮
                    return;//直接返回,不执行后面的语句
                }
                int success = DBWorker.modifyRecord("proc_delAsset ('" + id
                        + "')");//删除资产信息
                if (success != 0) {//删除成功
                    JOptionPane.showMessageDialog(frame, "删除成功!", "提示",
                            JOptionPane.INFORMATION_MESSAGE);
                    reset();// 重置表单控件
                    frame.tap.setTableModel(frame.tap.table, DBWorker.selAsset(
                            "proc_selAsset", "all"), frame.head);// 更新显示
                } else {
                    JOptionPane.showMessageDialog(frame, "数据库访问错误!删除失败!", "错误",
                            JOptionPane.ERROR_MESSAGE);
                }
            }
        });
        btnUpdate.addActionListener(new ActionListener() {//修改按钮事件处理 
            public void actionPerformed(ActionEvent e) {
                if (isLegality()) {
                    String assetID = txtID.getText().trim();    //获得资产编号
                    String assetName = txtName.getText().trim();//获得资产名称
                    int confirm = JOptionPane.showConfirmDialog(frame,
                            "确认修改资产 \"" + assetName + "\" 吗?", "提示",
                            JOptionPane.OK_CANCEL_OPTION);
                    if (confirm != JOptionPane.OK_OPTION) {//如果用户单击的不是确定按钮
                        return;//直接返回,不执行后面的语句
                    }
                    String remark = txaRemark.getText().trim();//获得用户备注信息
                    if (remark.equals("")) {                    //如果备注为空
                        remark = "暂无说明";                        //设置默认的备注信息
                    }
                    String proc = "proc_updAsset ('" + assetID + "','"
                            + assetName + "','"
                            + cboCate.getSelectedItem().toString() + "','"
                            + cboSubcate.getSelectedItem().toString() + "','"
                            + txtModel.getText().trim() + "','"
                            + txtPrice.getText().trim() + "','"
                            + txtPurDate.getText().trim() + "','"
                            + cboStatus.getSelectedItem() + "','" + remark
                            + "')";//拼接更新SQL语句
                    int success = DBWorker.modifyRecord(proc);//执行更新操作
                    if (success != 0) {//删除成功
                        JOptionPane.showMessageDialog(frame, "修改成功!", "提示",
                                JOptionPane.INFORMATION_MESSAGE);
                        frame.tap.setTableModel(frame.tap.table, DBWorker
                        .selAsset("proc_selAsset", "all"), frame.head);// 更新显示
                    } else {
                        JOptionPane.showMessageDialog(frame, "数据库访问错误!修改失败!",
                                "错误", JOptionPane.ERROR_MESSAGE);
                    }
                }
            }
        });
        btnQuery.addActionListener(new ActionListener() {//查找按钮事件处理
            public void actionPerformed(ActionEvent e) {
                InputDialog id = new InputDialog(frame, "输入--查找");//弹出对话框
                String inputId = id.getInputId();            //获得输入的资产编号
                String inputName = id.getInputName();        //获得输入的资产名称
                if (inputId == null && inputName == null) {//如果资产编号和名称为空
                    return;                                    //直接返回,不执行后面的语句
                }
                if (inputId == null) {//如果资产编号为空
                    Collection ac = DBWorker.selAsset("proc_selAssetInName",
                            inputName);    // 取得指定名称的资产信息
                    if (ac.isEmpty()) {//判断查询记录是否为空
                        JOptionPane.showMessageDialog(frame, "没有你要查找的资产信息!",
                                "提示", JOptionPane.INFORMATION_MESSAGE);
                        txtName.requestFocus();//资产名称文本框获得焦点
                    } else {
                        btnAdd.setEnabled(false);//设置添加按钮不能使用
                        showResult(ac);// 显示资产信息
                        
                        btnDelete.setEnabled(true);//启用删除按钮
                        btnUpdate.setEnabled(true);//启用修改按钮
                    }
                }
                if (inputName == null) {//如果资产名称为空
                    Collection ac = DBWorker.selAsset("proc_selAssetInAid",
                            inputId);// 取得指定编号的资产信息
                    if (ac.isEmpty()) {//判断查询记录是否为空
                        JOptionPane.showMessageDialog(frame, "没有你要查找的资产信息!",
                                "提示", JOptionPane.INFORMATION_MESSAGE);
                        txtName.requestFocus();
                    } else {
                        btnAdd.setEnabled(false);//设置添加按钮不能使用
                        showResult(ac);// 显示资产信息
                        btnDelete.setEnabled(true);//启用删除按钮
                        btnUpdate.setEnabled(true);//启用修改按钮
                    }
                }
            }
        });
        /* 重置按钮事件处理 */
        btnReset.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                reset();
            }
        });
        /* 帮助按钮事件处理 */
        btnHelp.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                // 弹出CHM帮助文件,并指向关于资产添加的帮助页面
                try {
                    String url = "hh AMSConfiguration" + File.separator
                            + "help" + File.separator
                            + "help.chm::/infoManage.html";
                    Runtime.getRuntime().exec(url);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
    /**
     * 给大类列表框添加元素
     * 
     * @param cbo
     *            列表框
     * @param dataSet
     *            数据集
     */
    private void addCateItem(JComboBox cbo, Collection dataSet) {
        Iterator i = dataSet.iterator();
        while (i.hasNext()) {
            cbo.addItem(((Category) i.next()).getName());
        }
        dataSet = null;
    }
    /**
     * 给子类列表框添加元素
     * 
     * @param cbo
     *            列表框
     * @param dataSet
     *            数据集
     */
    private void addSubcateItem(JComboBox cbo, Collection dataSet) {
        Iterator i = dataSet.iterator();
        while (i.hasNext()) {
            cbo.addItem(((Subcate) i.next()).getName());
        }
        dataSet = null;
    }
    /**
     * reset 重置
     */
    private void reset() {
        txtID.setText("(系统自动生成)");
        txtName.setText("");
        cboCate.setSelectedIndex(0);
        cboSubcate.removeAllItems();
        txtPurDate.setText("");
        txtPrice.setText("");
        txtModel.setText("");
        cboStatus.setSelectedIndex(0);
        txaRemark.setText("");
        btnUpdate.setEnabled(false);
        btnDelete.setEnabled(false);
        btnAdd.setEnabled(true);
    }
    /**
     * 显示结果
     * 
     * @param dataSet
     *            数据集
     */
    private void showResult(Collection dataSet) {
        Iterator aci = dataSet.iterator();
        while (aci.hasNext()) {
            Asset a = (Asset) aci.next();
            txtID.setText(a.getId() + "");
            txtName.setText(a.getName());
            cboCate.setSelectedItem(a.getCateName());
            cboSubcate.setSelectedItem(a.getSubcateName());
            txtPurDate.setText(a.getPurDate());
            txtModel.setText(a.getModel());
            txtPrice.setText(a.getPrice() + "");
            cboStatus.setSelectedItem(a.getStatus());
            txaRemark.setText(a.getRemark());
        }
        aci = null;
        dataSet = null;
    }
    /**
     * 检查输入是否合法
     * 
     * @return
     */
    private boolean isLegality() {
        boolean legality = false;
        // 取得用户设置的价格下限
        double price = Double.parseDouble(new IOWorker()
                .inPut("AMSConfiguration" + File.separator + "config"
                        + File.separator + "config.tsc"));
        if (txtName.getText().trim().equals("")) {
            JOptionPane.showMessageDialog(frame, "资产名称不能为空!", "提示",
                    JOptionPane.INFORMATION_MESSAGE);
            txtName.requestFocus();
        } else if (cboCate.getSelectedIndex() == 0) {
            JOptionPane.showMessageDialog(frame, "未选择类别", "提示",
                    JOptionPane.INFORMATION_MESSAGE);
            cboCate.requestFocus();
        } else if (txtPurDate.getText().trim().equals("")) {
            JOptionPane.showMessageDialog(frame, "日期不能为空!", "提示",
                    JOptionPane.INFORMATION_MESSAGE);
            txtPurDate.requestFocus();
        } else if (!txtPurDate.getText().trim().matches(
                "^[1-3][0-9]{3}(-|\\.)(0?[1-9]|1[0-2])(-|\\.)"
                        + "(0?[1-9]|[1,2][0-9]|30|31)$")) {
            // 如果日期格式不为:xxxx-(xx|x)-(xx|x)或者xxxx.(xx|x).(xx|x)
            JOptionPane.showMessageDialog(frame, "日期格式不正确!", "提示",
                    JOptionPane.ERROR_MESSAGE);
            txtPurDate.requestFocus();
            txtPurDate.selectAll();
        } else if (txtPrice.getText().trim().equals("")) {
            JOptionPane.showMessageDialog(frame, "价格不能为空", "提示",
                    JOptionPane.INFORMATION_MESSAGE);
            txtPrice.requestFocus();
        } else if (!txtPrice.getText().trim().matches(
                "^([1-9]|[1-9]\\d*)|([1-9]|[1-9]\\d*\\.\\d{1,2})$")) {
            // 价格必须大于0或0.00或0.0
            JOptionPane.showMessageDialog(frame, "价格输入非法!请重新输入!", "提示",
                    JOptionPane.ERROR_MESSAGE);
            txtPrice.requestFocus();
            txtPrice.selectAll();
        } else if (Double.parseDouble(txtPrice.getText().trim()) < price) {
            // 价格必须大于等于用户设置的价格下限
            JOptionPane.showMessageDialog(frame, "价格至少" + price + "元才算固定资产!",
                    "提示", JOptionPane.INFORMATION_MESSAGE);
            txtPrice.requestFocus();
            txtPrice.selectAll();
        } else if (txtModel.getText().trim().equals("")) {
            JOptionPane.showMessageDialog(frame, "型号不能为空!", "提示",
                    JOptionPane.INFORMATION_MESSAGE);
            txtModel.requestFocus();
        } else {
            legality = true;
        }
        return legality;
    }
}
 

猜你喜欢

转载自blog.csdn.net/weixin_55459367/article/details/113924579