文章目录
- 摘 要
- 沈阳理工大学信息网络实验室设备信息管理系统
- 1 引 言
- 1.1研究背景
- 1.2研究目的和意义
- 2 系统开发
- 2.1 系统开发环境简
- 2.1.1 操作系统
- 2.1.2 开发工具
- 2.1.3 MySQL关系型数据库
- 2.2 系统开发技术简介
- 2.2.1 Java 语言简介
- 2.2.2 Swing/AWT 图形化设计工具简介
- 2.2.3 SQL语言简介
- 2.1 系统开发环境简
- 3 系统分析
- 3.1 系统的功能需求分析
- 3.1.1 系统需求
- 3.1.2 功能需求
- 3.1.3 性能需求
- 3.2 系统实现可行性分析
- 3.2.1技术可行性
- 3.2.2 经济可行性
- 3.2.3 实现可行性
- 3.2.4 法律可行性
- 3.2.5用户使用可行性
- 3.1 系统的功能需求分析
- 4 系统设计
- 4.0 系统架构
- 4.1 功能需求与设计
- 4.1.1 整体模块设计
- 4.1.2 管理员功能设计
- 4.1.3 普通用户功能设计
- 4.2 数据库设计
- 4.2.1 数据库的需求分析
- 4.2.2 数据库业务需求分析
- 4.2.3 数据库的逻辑设计
- 4.3 前端页面设计
- 4.3.1 Swing工具包简介
- 4.3.2界面设计
- 5 系统实现
- 5.1 登陆功能实现
- 5.2 菜单功能实现
- 5.3 使用功能的实现
- 6 总 结
- 参考文献
- 结语
摘 要
随着Internet技术的发展,人们的日常生活、学习已经离不开网络。未来社会人们的生活和工作将越来越依赖于数字技术的发展,越来越数字化、网络化、电子化、虚拟化。Internet的发展历程以及目前的应用状况和发展趋势,可以充分地相信网络技术将极大的改变我们的生活和工作方式,甚至社会的价值观也会发生某种变化。实验室设备管理系统是一个典型的信息管理系统,本系统是一个为适应对学校实验室设备管理的迫切需求而设计开发的软件系统,其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面,经过分析和比较,我们决定使用MyEclipse和MySQL 5.5作为开发工具,利用其提供的各种面向对象的开发手段,尤其是数据窗口这一能方便而简洁操纵数据库的智能化对象,首先在短时间内建立系统应用原型,然后,对初始原型系统进行需求迭代,不断修正和改进,直到形成用户满意的可行系统。
关键字: 实验室设备管理;信息管理系统;Java程序设计;数据库开发
沈阳理工大学信息网络实验室设备信息管理系统
1 引 言
1.1研究背景
随着计算机信息技术的发展以及对资产、设备管理科学化,合理化的高要求,利用计算机实现资产及设备的信息化管理已经迫在眉睫。随着市场的不断扩大,产量日益增加以及产品品种的不断增多,设备的规模也在不断扩大;随着设备使用年限的增长,由于老化而导致停机的风险也将升高,如何有效分析设备历史故障进而采取措施来有效地维护设备、管理设备成为面临的问题.
1.2研究目的和意义
因为现在各个高校内教学设备众多但自动管理水平相比过低,很多实验室管理设备都采用在设备购进以后将设备的基本情况和相关信息登记存档。存档以后档案基本就没人记录与维护,至于以后设备的变迁或损坏都不会记录在设备档案中,即不能体现设备的即时状态。而有些即使有设备管理系统的单位,就算是能把设备的即时信息体现在设备档案上,但设备的缺陷处理及设备缺陷等功能没有实施,设备检修的备品备件情况和检修成本核算没有实现,整个学校教学设备管理信息化仍处于较低水平。
本信息管理系统合理的借鉴并结合国内学校设备管理现状,并通过对各行业设备管理情况的长期研究探索,以灵活、通用为主要设计思想,开发适合于学校实验室设备管理的信息系统。使用本系统之后,将会提高学校的办公效率和设备可靠性,减少工作人员的劳动强度,减少办公耗材,提高学校的现代化管理水平。
现代化的实验室规模一般较大,传统的实验室设备管理方式往往跟不上发展的需要,及时了解实验室设备的明确动向与状态对实验室设备的使用效率至关重要,也是实验室完成预算与决策的关键因素。针对这些,本系统选用MySQL5.5作为后台数据库,使用Java作为后端逻辑设计的语言,利用Swing、AWT作为前端开发UI工具包来开发实验室设备管理系统。
2 系统开发技术
2.1 系统开发环境简介
在规划设计系统所需要实现的一系列功能之初,最先考虑得是开发系统所选用的语言和工具,如何利用相关平台和工具能够快速、简单、稳定的进行开发。在选择之后,接下来就是对系统进行编码工作,这就需要先设计好系统模块。整个系统的设计思想,也就是从底层到界面分别是:数据访问层(Dao层)、实体类(POJO类)、用户界面层(界面 事件)。
在该结构上,根据每个层的具体功能的复杂性来设计子层。下一步是执行数据访问层所需的逻辑操作,这些逻辑层是抽象系统中数据访问操作和业务逻辑需要调用的数据访问层共同的。第一件事是封装数据访问的实体类。这里有一点需要说明的是,系统使用JDBC来进行对MySql数据库访问和持久化存储。
2.1.1 操作系统
(1)Windows 10 和 Windows 以后的版本
关于 Windows 10,微软宣布它将以比以前更快的节奏更新 Windows,将不会有官方的“Windows 11”;相反,Windows Update(或另一个企业服务模型)会将现有的Windows 10 更新为新版本。在编写此书时,已经有两个这样的更新发生在 2015 年 11月(也称为版本 1511,指服务年和月份)和 2016 年 7 月(版本 1607,也因为周年更新的营销名称所知)。
(2)Windows 10 和 “一个内核”
多年来,几种不同类型的 Windows 已经发展起来。在 PC 上运行的主流 Windows,它还运行一个分叉 Windows2000。Windows Phone 7 基于 Windows CE(运行的一个变体。维护和扩展所有这些代码库显然是困难的。因此,微软决定将内核和基础平台支持的二进制文件聚合为一个。这开始于 Windows 8 和 Windows 电话 8,其中共享内核。使用 Windows 10,融合就完成了,这个共享平台被称为 Onecore,它运行在 PC、电话、XboxOne 游戏控制台、全息屏和物联网(IoT)设备上。
2.1.2 开发工具
Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。
Eclipse是一个开放源代码的软件开发项目,专注于为高度集成的工具开发提供一个全功能的、具有商业品质的工业平台。它主要由Eclipse项目、Eclipse工具项目和Eclipse技术项目三个项目组成,具体包括四个部分组成Eclipse Platform、JDT、CDT和PDE。JDT支持Java开发、CDT支持C开发、PDE用来支持插件开发,Eclipse Platform则是一个开放的可扩展IDE,提供了一个通用的开发平台。它提供建造块和构造并运行集成软件开发工具的基础。Eclipse Platform允许工具建造者独立开发与他人工具无缝集成的工具从而无须分辨一个工具功能在哪里结束,而另一个工具功能在哪里开始。
2.1.3 MySQL关系型数据库
MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。 MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库。 与其他的大型数据库例如Oracle、DB2、SQL Server等相比,MySQL自有它的不足之处,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于 MySQL是开放源码软件,因此可以大大降低总体拥有成本。
2.2 系统开发技术简介
“沈阳理工大学信息网络实验室设备信息管理系统”,采用Maven搭建项目、Java语法基础完成后端开发,使用Swing/AWT GUI 轻量级组件完成前端页面的设计实现,使用lombok插件简化后端代码,使用JUnit完成系统的功能单元测试,使用JDBC使得Java能够访问操作MySQL数据库。
2.2.1 Java 语言简介
Java是由James Gosling等人于1991年在Sun公司设计出来的一门计算机编程语言。该语言最初名叫“Oak”,但发现“Oak”已经是Sun公司另外一种语言的注册商标,于是在1995年取太平洋上一个盛产咖啡岛屿的名字,更名为“Java”。自Java正式推出于1995年,Java语言以其独特的优势迅速发展。二十年后,它成为迄今为止最优秀的面向对象语言。Java已逐渐从原来的语言成为一个产业,基于Java语言的J2EE体系结构已经成为 Microsoft.NET 平台的一个强大的竞争对手。
Java平台由Java虚拟机和Java应用编程接口构成.Java的API提供了一个标准的接口独立于操作系统,Java程序只需编译一次,就可在各种系统中运行。
2.2.2 Swing/AWT 图形化设计工具简介
(1)Swing用户界面开发工具包
Swing是一个用于开发Java应用程序用户界面的开发工具包。 以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面工具包中所有的包都是以swing作为名称,例如javax.swing,javax.swing.event。
(2)AWT抽象窗口工具包
AWT,中文译为抽象窗口工具包,该包提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的图形用户界面的基本工具。AWT中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系,称之为peers,当利用AWT编写图形用户界面时,实际上是在利用本地操作系统所提供的图形库。由于不同操作系统的图形库所提供的样式和功能是不一样的,在一个平台上存在的功能在另一个平台上则可能不存在。为了实现Java语言所宣称的一次编写到处运行,AWT不得不通过牺牲功能来实现平台无关性,也即AWT所提供的图形功能是各种操作系统所提供的图形功能的交集。
2.2.3 SQL语言简介
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。
SQL的核心部分相当于关系代数,但又具有关系代数所没有的许多特点,如聚集、数据库更新等。它是一个综合的、通用的、功能极强的关系型数据库语言。其特点是:
(1)数据描述、操纵、控制等功能一体化。 (2)两种使用方式,统一的语法结构。 (3)高度非过程化。 (4)语言简洁,易学易用。
3 系统分析
3.1 系统的功能需求分析
在软件工程中,需求分析指的是在建立一个新的或改变一个现存的系统时描写新系统的目的、范围、定义和功能时所要做的所有的工作。 因为软件需求分析将产品转化为软件需求,即将用户(业务)语言表达的产品需求转化为开发人员语言表达的软件需求,使得开发、测试人员更能准确、完整的理解需求。因为软件需求分析,清晰完整地表述软件需求,基于此开展的设计方案才能考虑得更加全面、更加有弹性,评审设计方案也有据可依。只有做了软件需求分析,才能了解软件的需求集合的实际规模,估算软件产品的开发工作量才能相对靠谱,再结合人力资源情况,给出开发计划。 需求分析是软件工程中的一个关键过程。在这个过程中,系统分析员和软件工程师确定顾客的需要。只有在确定了这些需要后他们才能够分析和寻求新系统的解决方法。下面就是从软件需求分析的常用角度,描述“沈阳理工大学信息网络实验室设备信息管理系统”的需求。
3.1.1 系统需求
经过前期需求的调查与分析,总结得到“沈阳理工大学信息网络实验室设备信息管理系统”的整体需求。随着高校规模的扩大,实验室及仓库的增多,人工管理实验设备已经变得过于低效,该系统的主要使用目的在于实现高校实验室设备管理的自动化,设备管理系统将贯穿于设备从购进到维修到报废的整个流程的管理过程,帮助管理员高效的管理整个实验室的所有设备,给上级领导提供一个审核监督管理的平台。 因此,系统网站要求能实现的就是以上要求,在此之上,要保证操作界面的简洁性、易读性,且性能要求为轻量级,适应各年龄段人群使用。除此之外,还要求系统的功能操作能够及时响应和反馈,所有数据都要与数据库进行交互,保证用户使用的实时性和便捷性。
3.1.2 功能需求
“沈阳理工大学信息网络实验室设备信息管理系统”使用者定位有三种人群,包括:实验室管理员、普通用户、上级领导的三种权限用户,这三者各有不同权限,且权限之间互相交互,从而实现系统的各个功能。下面的是不同身份权限的具体说明:
一、普通用户模式,应具有以下功能:
(1)实验室设备信息查询,普通用户只有查询的权限,只能查看设备的相关信息。并且可以进行分类查找。 (2)申请人员信息注册、查询。普通用户如果想要申请设备,那么就要先在申请表中注册(登记),登记完之后,用户可以查看申请表中的信息进行验证是否登记成功。 (3)用户信息管理:注册新用户、修改原密码。当前用户如果还想新设置一个账户,那么可以使用注册功能。如果想要修改当前用户的密码,那么也可以使用修改原密码的功能进行操作。 (4)设备申请与归还,这是普通用户能够操作的核心功能。当前用户在申请表中登记之后,就可以使用申请设备的功能进行申请设备,申请成功后申请走的部分设备的状态显示为未归还。使用完毕时候,用户使用归还的功能,自行对设备进行归还操作,这一部分的设备状态更改为已归还。
二、管理员(领导)模式,应具有以下功能:
管理员具有较大的权限,与用户的功能相比具有所有实体信息的增删改查功能。
(1)设备信息管理。管理员账户拥有设备信息的增删改查功能。
(2)申请人员信息注册、查询。管理员可以对所有的申请人员信息进行增删改查的操作。
(3)类型管理。可以对设备类型以及申请人员类型的类型信息增删改查。设备类型与设备信息相关联,申请人员类型与申请人员信息关联。
(4)用户管理。管理员拥有最大的权限,可以查看所有注册的用户信息,并且可以在界面上进行增加(注册)用户、删除用户、修改密码。
(5)设备申请与归还管理。管理员也可以对设备进行申请以及归还的操作,与用户的功能一样。
(6)设备资产管理。管理员可以进行设备报废管理,在报废申请的界面填入设备名称与数量信息,那么该部分的设备在设备表中删除或者修改。管理员可以进行设备维修申请的功能,在维修申请的界面填写申请维修的设备信息,在查询的面板中显示一条维修申请的记录,同时这条记录默认为未批准的状态。上级领导拥有设备维修批准的功能,在批准的界面显示所有的维修申请记录,领导根据这条记录的编号进行批准操作,此时这条维修申请的记录中的批准状态更改为已批准,可以进行维修。
3.1.3 性能需求
(1)硬件性能需求
CPU 处理器:Intel Core i3 以上 或者是 AMD Athlon II X2 以上; ROM 内存:1GB 以上; 硬盘容量:1G 空闲空间(仅系统需求,不包括软件环境搭建需求)。
(2)软件环境需求
操作系统:Windows XP 往后的操作系统; 前台:Eclipse; 数据库:MySQL 5.5 以及更高更新的版本。
3.2 系统实现可行性分析
可行性是指在企业当前的条件下,是否有必要建设新系统,以及建设新系统的工作是否具备必要的条件。也就是说,可行性包括必要性和可能性。参考国家标准《计算机软件文档编制规范》(GB/T 8567-2006),在信息系统建设项目中,可行性研究通常从经济可行性、技术可行性、法律可行性和用户使用可行性四个方面来进行分析,其中经济可行性通常被认为是项目的底线。
3.2.1技术可行性
技术可行性也称为技术风险分析,研究的对象是信息系统需要实现的功能和性能,以及技术能力约束。技术可行性主要通过考虑以下问题来进行论证:
(1)技术:现有的技术能力和信息技术的发展现状是否足以支持系统目标的实现。
(2)资源:现有的资源(例如,掌握技术的员工、企业的技术积累、构件库、软硬件条件等)是否足以支持项目的实施。
(3)目标:由于在可行性研究阶段,项目的目标是比较模糊的,因此技术可行性最好与项目功能、性能和约束的定义同时进行。在可行性研究阶段,调整项目目标和选择可行的技术体系都是可以的,而一旦项目进入开发阶段,任何调整都意味着更多的开销。 需要特别指出的是,技术可行性绝不仅仅是论证在技术手段上是否可实现,实际上包含了在当前资源条件下的技术可行性。
实验室设备信息管理系统,使用 Java 面向对象语言进行开发,运用Java来进行编写后端代码的逻辑,使用MySQL 5.5关系型数据库进行数据的存储和提取,配合采用的Swing、AWT等相关前端组件的技术力求让系统的界面简洁、易用、友好。
系统用到的相关开发软件有 Eclipse 编译器、MySQL 5.5数据库等。开发所采用的技术和开发工具都是较为基础的,稳定性和可操作性都很好。所以,开发实现方便,不存在问题,系统在技术方面的可行性很高。
3.2.2 经济可行性
经济可行性也称为投资收益分析或成本效益分析,主要评估项目的建设成本、运行成本和项目建成后可能的经济收益。。而经济收益的考虑则非常广泛,可以分为直接收益和间接收益、有形收益和无形收益,还可以分为一次性收益和非一次性收益、可定量的收益和不可定量的收益等。
在系统开发初期,由于用户需求和候选系统方案还没有确定,成本不可能得到准确的估算。因此,此时的经济可行性分析只能大致估算系统的成本和收益,判断信息系统的建设是否值得。
实验室设备信息管理系统,从前期的需求调研分析、系统总体设计到系统实施阶段以及测试维护,整个流程全部独立完成。使用的是免费的开发工具,除去笔记本电脑硬件的损耗,成本几乎为零。因此,开发该系统的成本几乎为零,在经济方面的可行性是完全可行的。而在后期的维护系统中,只需要花费时间与精力即可,也同样无需经济成本。
3.2.3 实现可行性
在先前的课程当中由于程序设计的老师带着我们一起做了图书借阅系统的所有功能、界面设计以及对应的实现。所以,在实现该系统功能的可行性上并没有太大的难度。系统的界面设计也比较简洁、友好,在用户访问系统的实现方面也同样很简单。
3.2.4 法律可行性
法律可行性也称为社会可行性,具有比较广泛的内容,它需要从政策、法律、道德、制度等社会因素来论证信息系统建设的现实性。该系统与国家法律或政策没有抵触,在政府信息化的领域中没有使用未被认可的加密算法,并没有未经许可在产品中使用了其他企业的被保护的技术或构件等,这样的项目在法律可行性上就是可行的。
实验室设备信息管理系统的设计和实现,完全属于个人行为,相关系统也只是属于服务类性质,并不会用它作为盈利的手段,相关的技术和系统版权也不会侵犯他人以及国家的利益,不会违反国家的相关政策和法律。因此,系统在法律方面是可行的。
3.2.5用户使用可行性
用户使用可行性也称为执行可行性,是从信息系统用户的角度来评估系统的可行性,包括企业的行政管理和工作制度、使用人员的素质和培训要求等,可以细分为管理可行性和运行可行性。 (1)管理可行性。管理可行性是指从企业管理上分析系统建设可行性。主管领导不支持的项目一般会失败,中高层管理人员的抵触情绪很大,就有必要等一等,先积极做好思想工作,创造条件。另外,还要考虑管理方法是否科学,相应的管理制度改革的时机是否成熟,规章制度是否齐全等。当前实验室设备管理系统不涉及到企业管理及相关的内容,所以管理的话有开发者进行负责,需要开发人员做好思想准备,制定好规范的管理制度以及方法。 (2)运行可行性。运行可行性也称为操作可行性,是指分析和测定信息系统在确定环境中能够有效工作,并被用户方便使用的程度和能力。运行可行性还需要评估系统的各种影响,包括对现有IT设施的影响、对用户组织机构的影响、对现有业务流程的影响、对地点的影响、对经费开支的影响等。 如果某项影响会过多改变用户的现状,需要将这些因素作进一步的讨论并和用户沟通,提出建议的解决方法。否则,系统一旦建成甚至在建设过程中,就会受到用户的竭力反对,他们会抵制使用系统。经过仔细的分析与评估当前系统对用户的现状并无相关影响,对其他信息也并无影响,操作界面简洁明了,使用过程非常简单,便于操作人员的使用,所以在运行可行性方面来看是可行的。
4 系统设计
4.0 系统架构
系统分为管理员模块和普通用户模块,通过MySQL数据库和Java语言来实现管理员模块以及普通用户模块。该系统设计实现了对用户信息的注册登录初始化等功能,针对类别,又对其设备、申请人员类别进行管理操作;设备信息模块可以对其进行添加、删除、修改、查询等操作; 用户对其申请、归还登记、管理员还可以对实验设备资产进行管理,当一批设备报废那么登记报废表,当设备损坏需要维修,管理员填写设备维修申请表,领导的管理员账号根据查询显示的维修申请的记录进行批准维修。
4.1 功能需求与设计
4.1.1 整体模块设计
系统总体功能模块如图4.1所示。上图为实验室设备系统的所有模块以及实现的功能,总体上分为两个角色进行操作。管理员的权限较大,拥有较多的功能。而用户权限不够,对很多信息没有修改、增加、查询、删除的权限,所以对应的模块功能较少。
实验室设备管理系统有两个菜单界面,分别对应着管理员、用户,两者之间的权限不同,拥有的功能也不太相同。管理员账户功能有几个模块:设备信息管理模块、申请人员管理模块、类型管理模块、用户管理模块、设备申请管理模块、设备资产信息管理模块,普通用户的功能有几大模块:设备信息管理、申请人员信息管理、用户管理、设备申请管理,用户的部分模块与管理员大致相同,但是却比管理员少了很多功能(权限不够),我们接下来对每一模块的具体功能进行分析需求。
4.1.2 管理员功能设计
(1)设备信息管理模块
设备信息管理模块功能设计如图4.2所示。如果有新买的一些设备需要放置到实验室,那么需要管理员根据设备信息(设备名称、设备类别、增加数量、存放位置、单品价格等)进行设备增加操作。如果管理员不小心输入错误,想要重新再输入一遍,可以重置所有输入框的内容,显示为空重新输入。
为了方便管理员进行管理设备信息,所以需要显式的展示所有的设备信息,或者进行指定的查询操作。如果点击查询修改界面那么映入眼帘的就应该是默认查询到的所有设备信息。可以查询全部,在查询的时候可以输入名称中的关键字进行模糊查询,还可以根据设备名称进行指定查询。
如果之前增加信息时管理员不小心输入错误一个内容增加成功了,那么在后续的功能设计中与之对应就应该设置一个修改的功能。在系统中设备的名称是唯一的,所以我们设计根据设备名称进行修改其他的设备信息。
如果有的设备损坏无法修理甚至直接报废,那么就需要管理员在设备管理模块进行删除操作,这里也是设计根据设备的名称进行删除操作。
(2)申请人员信息管理模块
申请人员信息管理模块功能设计如图4.3所示。这是一个高校网络实验室设备管理系统,那么与之对应,一定会有不同的学生或者老师来到实验室中借走需要的实验设备,所以需要给申请人员信息进行登记、查询等操作。
如果有需要申请设备的人员来进行申请设备,需要先进行登记申请人员信息,这里就是设计一个增加操作,用户/管理员输入对应的人员信息(姓名、性别、年龄、电话等),将申请人员的信息登记进入系统中保存,方便后续设备申请归还损坏等情况能够找到对应人员的信息。
为了方便管理员进行管理申请人员信息,所以需要显式的展示所有的人员信息,或者进行指定的查询操作。如果点击查询修改界面那么映入眼帘的就应该是默认查询到的所有人员信息。可以查询到所有的人员信息,同时因为不同人的名字可能相同,但是申请记录的编号是唯一的,所以可以进行根据申请人编号进行指定的查询操作。如果不确定某个人员的具体名字,可以输入名字中的某个字进行模糊查询,非常方便。
如果之前增加信息时管理员/用户不小心输入错误一个内容登记成功了,那么在后续的功能设计中与之对应就应该设置一个修改的功能。在系统中编号是唯一的,所以我们设计根据人员编号进行修改信息。
如果有的申请人员很久没有来借设备,为了节省内存空间避免不必要的信息储存,那么就需要管理员在申请人员管理模块进行删除操作,这里也是设计根据申请人员的编号进行删除操作。
(3)类型管理模块
类型管理模块功能设计如图4.4所示。在之前的模块中,有了设备类别管理和申请人员信息管理,为了更方便的进行分类以及管理,我们设计了一个类型管理模块,对实验室设备和申请人员进行分类, 实验室设备可分为微型计算机类、路由器类、交换机类、网线类等等,申请人员类别就有导师、学生。管理员具有类别信息增删改查的权限。新增一个类别,那么管理员设置编号和类别名称保存在系统当中。有一个类别不需要了那么根据编号删除这个记录,有个类别名称写错了,管理员根据编号进行修改这条记录。为了方便管理员查看类别信息,显示所有查询到的对应类别信息,并且如果类别信息过多,可以根据编号进行指定查询。
(4)系统用户管理模块
系统用户管理模块功能设计如图4.5所示。这是一个实验室设备管理系统,所以如果想要登入系统那么就一定需要账号进行注册登陆。所以在这里我们设计一个用户信息管理模块来帮助管理员更好的管理系统用户的登入信息。
如果是第一次登陆,没有账号的人想要使用这套系统,那么统一交由管理员进行增加用户信息。所以需要设计一个增加用户信息保存到系统中的功能。管理员输入用户名和密码进行保存账户信息,同时注册的时候要要有一定的注册规则:首先用户名和密码都不能为空值,其次输入的用户名不能是已经在系统中存在的用户名,系统中每个用户名是唯一的。
为了方便管理员更好的管理用户的账户信息,在前端界面可以展示全部查询到的用户信息,包括用户名和密码。同时如果有的用户或者管理员在注册之后觉得之前输入的密码不太安全,想要更换一个密码,所以设计了一个更改账户的功能,管理员可以通过用户名和原密码来设置新的密码,同时为了防止新密码误操作输入错误,又增加了确认密码来保证新密码输入正确。
如果有的用户长时间不进行登陆操作,那么的话就需要管理员对长期不使用的账户进行回收操作。与之对应设计一个删除账户的功能。管理员根据用户名进行删除信息。
(5)申请归还管理模块
申请归还管理模块功能设计如图4.6所示。实验室设备管理系统,保管登记设备以待他人申请使用,所以申请和归还是这个系统最为核心的功能。设备申请管理,首先用户先得登记申请人员信息,让自己的信息在系统中可以查到,以便申请和归还的后续操作。
然后进行具体的设备申请操作,设计申请的功能,输入设备名称、设备类别、申请日期、操作人员等信息,在系统中登记这一条记录中的上述信息得以保存,同时这条记录的默认状态设置为未归还,因为设备已经被他人给申请走了,所以当前系统中的设备信息对应的部分也要进行修改,申请之后相当于当前数量减少,需要拿到设备原数量和申请数量,把设备的当前数量修改成原数量-申请数量。同时这两个操作(在系统中保存申请记录、修改设备信息并且保存)是一个原子性的操作,必须是一步操作并作为一个事务,如果中间发生程序异常那么需要进行事务回滚。
设备申请之后使用完就要进行归还。进行具体的设备归还操作,设计归还的功能,输入申请记录编号(因为同一个设备可能会被多个人员申请,只有申请编号是独一的),根据申请记录编号进行修改,输入归还日期、归还数量、操作人员等信息,将系统中的这一条记录对应的归还信息进行填充,同时这条记录的状态修改为已归还,因为设备归还完毕,所以当前系统中的设备信息对应的部分也要进行修改,归还之后相当于当前数量增加,需要拿到设备原数量和归还数量,把设备的当前数量修改成原数量 归还数量。同时这两个操作(在系统中修改申请记录并保存、修改设备信息并且保存)是一个原子性的操作,必须是一步操作并作为一个事务,如果中间发生程序异常那么需要进行事务回滚。 为了方便管理员以及用户进行查看申请记录,所以在这一模块中设计查询功能,查询全部的申请记录信息并展示,同时进行联表查询,查询对应设备的当前数量信息进行展示,方便后续人员知道数量决定是否申请以及归还。
(6)设备资产管理模块
设备报废处理功能设计如图4.7所示。在该系统中因为设备可能使用的时间过长,或者在使用的过程中不慎损坏且无法维修或者维修代价高于成本领导不予批准的情况下,这批设备就会进行报废处理。那么如何进行报废处理呢?报废就是不在使用了,将这批设备的信息从系统中移除开,所以在这里我们是这样设计的,根据设备名称进行修改或者删除操作,如果报废的数量达到设备的总数量,那么该设备的信息将从系统中进行移除,如果报废的数量没有达到设备的总数量,那么对设备的数量进行修改操作,修改之后的数量等于之前的数量-报废的数量。
设备维修申请功能设计。如果设备因为使用出现损坏的情况下,要去进行维修,那么需要先填写维修设备信息(设备名称、设备类别、维修数量、维修日期)到当前系统中,同时批准状态默认显示为未批准。因为可能维修的代价过大没有维修的必要或者该批设备已经淘汰没必要维修等情况,需要领导进行综合考虑之后再做决定,所以在填写完维修申请表之后,该条申请记录的状态默认为未批准状态。同时所有记录都会查询到并且展示给管理员,同时可以根据申请记录编号进行指定查询,方便管理员进行后续相关的操作。
设备维修批准功能设计。这个功能是只有管理员账户中的领导专用的账户才能够使用。首先能够显示所有的维修申请记录,方便领导进行查看维修申请信息,同时上级领导自己进行综合考虑,决定是否批准指定的维修记录,如果选择批准的话,那么输入这条记录的申请编号进行批准,此时根据编号将维修申请表中的这条记录中的批准状态修改成”已批准”,显示领导已经同意且批准,可进行维修。
4.1.3 普通用户功能设计
(1)设备信息管理
设备信息管理功能设计如图4.8所示。普通用户的设备管理模块功能与管理员这一模块有部分相同。用户的权限较小所有没有对设备信息进行增加、删除、修改的能力,只有进行进行设备信息的权利,所以用户的设备管理只有查询操作。默认显示查询全部设备信息,可以根据设备名称进行指定查询,同时可以实现输入名称的关键字进行模糊查询。
(2)申请人员管理
申请人员信息管理功能设计如图4.9所示。这是一个实验室设备管理系统,那么与之对应,一定会有不同的学生或者老师来到实验室中借走需要的实验设备,对于普通用户来说这个功能还是很重要的,需要给申请人员信息进行注册登记(增加)、查询等操作。
如果有需要申请设备的人员来进行申请设备,需要先进行登记申请人员信息,这里就是设计一个增加操作,用户/管理员输入对应的人员信息(姓名、性别、年龄、电话等),将申请人员的信息登记进入系统中保存,方便后续设备申请归还损坏等情况能够找到对应人员的信息。
为了方便用户查看自己的信息是否登记成功同时输入无错误,所以需要显式的展示申请人员信息,或者进行指定的查询操作。如果点击查询修改界面那么映入眼帘的就应该是默认查询到的所有人员信息。可以查询到所有的人员信息,同时因为不同人的名字可能相同,但是申请记录的编号是唯一的,所以可以进行根据申请人编号进行指定的查询操作。如果不确定某个人员的具体名字,可以输入名字中的某个字进行模糊查询,非常方便。
用户没有对申请人员信息删除修改的权限,如果用户登记申请人员信息出现错误,那么请联系系统管理员告知自己申请记录的编号进行修改。
(3)用户管理
用户管理功能设计如图4.10所示。这里普通用户的用户管理功能与管理员相比,少了查询与修改删除操作。每个用户只能知道自己的用户名和密码,不能查询他人或者全部用户的信息,同时用户也不能删除其他用户的信息,没有删除的权限。普通用户只是可以进行简单注册,以及修改原密码。
(4)设备申请管理
设备申请管理功能设计如图4.11所示。普通用户的申请归还管理与管理员相比完全一致,申请与归还是当前系统中最为重要的核心功能。在管理员功能设计已经进行阐述,在这里就不展开介绍了。
4.2 数据库设计
数据库是系统数据的存储与读取的交互媒介,是软件环境的基础架构之一。数据库的设计,就是对数据库的表结构进行设计。数据库就是与数据交互的,一个好的数据库设计,能使开发效率成倍的提升;相反,一个不合理的设计,则会导致响应时间长,数据臃肿,占用更多的资源得到更低的效率,甚至于导致系统软件的直接崩溃,所以数据库设计是非重要的,一个合理的设计更加重要。
4.2.1 数据库的需求分析
需求分析的任务是了解和分析应用系统将要提供的功能及未来数据库用户的数据需求,哪些数据要存储在数据库中,使用数据的业务规则是什么,数据之间有什么联系及约束,那些数据将被频繁访问,有哪些性能需求等,即了解用户真正希望从数据库中得到什么。
(1)系统目标
随着信息技术的发展,管理信息系统已经取代人工登记信息的方式,成为管理信息资料的重要手段。本系统面向管理员与普通用户,对网络实验室设备进行集中式管理。同时该系统根据管理员对设备的实时调整进行及时更新,同时提供设备申请、设备归还,设备维修、设备报废等不同模块的管理功能,极大的方便了高校实验室的设备管理,让管理的效率得到提升。
(2)系统功能分析
通过对实验室设备管理系统的用户需求的调查与了解,系统主要提供的功能如下:
1.管理员账户的基本信息管理。主要提供管理员账户的基本信息录入、删除、维护和查询等功能,管理员账户操作不再前端显示,只能再后端进行操作。功能如下:
- 管理员录入管理员账户基本信息;
- 管理员更新、增加及删除管理员账户基本信息;
- 系统管理员更改个人密码;
2.普通用户账户的基本信息管理。主要提供普通用户的基本信息录入、删除、维护和查询等功能,功能如下:
- 管理员、普通用户录入(自行注册)系统用户基本信息;
- 管理员更新、增加及删除普通用户基本信息;
- 管理员根据用户名查询基本信息;
- 普通用户更改个人密码;
3.设备信息的基本信息管理。主要提供设备的基本信息录入、删除、更新和查询等功能,功能如下:
- 管理员录入设备基本信息;
- 管理员根据设备名称(名称唯一)更新、增加及删除设备基本信息;
- 管理员、普通用户可以查询全部设备信息,也可根据名称查询,也可以输入名称关键字进行模糊查询;
4.申请人员信息的基本信息管理 。主要提供设备申请人员的基本信息录入、删除、更新和查询等功能,功能如下:
- 管理员、普通用户录入登记注册设备申请人员的基本信息;
- 管理员根据人员编号(id唯一)更新、增加及删除设备基本信息;
- 管理员、普通用户可以查询全部申请人员信息,也可根据编号查询;
5.类型信息的基本信息管理。主要提供设备类型、申请人员类型的基本信息录入、删除、更新和查询等功能,功能如下:
- 管理员录入设备类型、申请人员类型的基本信息;
- 管理员根据人员编号(id唯一)更新、增加及删除类型基本信息;
- 管理员可以查询全部类型信息,也可根据编号查询;
6.设备申请归还的基本信息管理。主要提供设备申请与归还记录的基本信息申请、归还、查询等功能,功能如下:
- 管理员、用户录入(登记)申请设备以及操作人的基本信息;
- 管理员、用户根据申请记录的编号对该条记录可以进行归还操作,相当于修改操作;
- 管理员、用户可以查询全部申请记录信息,也可根据编号查询;
7.设备资产信息的基本信息管理。主要提供设备报废与设备维修及上级批准的基本信息增加、修改、删除、查询等功能,功能如下:
- 管理员、录入(登记)报废设备的基本信息,在系统中设备信息中的当前数量进行修改或者设备信息进行删除;
- 管理员根据设备名称(名称唯一)增加(申请)及查询设备基本信息,录入基本的设备维修信息,等待上级领导批复;
- 管理员中的领导账号可以查询全部维修申请记录信息,根据编号对指定的维修记录进行批准(状态改为已批准)操作。
4.2.2 数据库业务需求分析
数据库的数据需求可以根据与用户的交流和设计着自己对企业或组织的业务分析得到。实验室设备管理系统数据需求及业务规则分析如下:
(1)管理员账户信息表:主要是对系统后台的管理员账户信息进行存储,其中:编码是唯一标识,用户名是唯一且非空,密码是非空,需要存储用户名、密码组成,编号是自增主键不需要专门设置;
(2)普通用户账户信息表:主要是对系统后台的普通用户信息进行存储,其中:编码是唯一标识,用户名是唯一且非空,密码是非空,需要存储用户名、密码组成,编号是自增主键不需要专门设置; (3) 设备详细信息表:主要对实验室设备具体相关的信息进行存储,其中:编码是唯一标识,设备名称是唯一且非空,需要存储编号、设备名称、类型编号、类型名称、当前数量、数量单位、存放位置、购买日期、单品价格组成,编号是自增主键不需要专门设置; (4)申请人员详细信息表:主要对申请设备的人员具体相关的信息进行存储,其中:编码是唯一标识,需要存储编号、名字、人员类别、性别、年龄、电话组成; (5)设备类别信息表:主要对设备类别具体相关的信息进行存储,其中:编码是唯一标识,需要存储类别编号、类别名称组成; (6)申请人员类别信息表:主要对申请人员类别具体相关的信息进行存储,其中:编码是唯一标识,需要存储类别编号、类别名称组成; (7)设备申请记录信息表:主要对申请设备的每一条记录具体相关信息进行存储,其中:申请记录编码是唯一标识,需要存储申请编号、设备名称、类型名称、申请日期、归还日期、申请数量、归还数量、操作人员、归还状态组成,编号是自增主键不需要专门设置; (8)设备维修记录信息表:主要对设备维修申请的每一条记录具体相关信息进行存储,其中:维修记录编码是唯一标识,需要存储维修申请编号、设备名称、类型名称、需要维修的数量、维修天数、上级领导是否批准组成,编号是自增主键不需要专门设置;
4.2.3 数据库的逻辑设计
(1)设备信息表用于存储设备基本信息,如表4.1所示
(2)设备类别表用于存储设备类别基本信息,如表4.2所示
(3)申请人员类别表用于存储申请人员类别基本信息,如表4.3所示
(4)申请人员信息表用于存储申请人员基本信息,如表4.4所示
(5)管理员信息表用于存储管理员账户的基本信息,如表4.5所示
(6)普通用户信息表用于存储普通用户的基本信息,如表4.6所示
(7)设备申请信息表用于存储设备申请记录的基本信息,如表4.7所示
(8)设备维修申请信息表用于存储设备维修记录的基本信息,如表4.8所示
4.3 前端页面设计
实验室设备管理系统的前端界面实现有Java中的SWing、AWT Java GUI工具包来实现,利用各种轻量级组件组成我们需要展示的界面以及弹窗。
4.3.1 Swing工具包简介
Swing 是一个为Java设计的GUI工具包。Swing是JAVA基础类的一部分。Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表,如图4.12所示。Swing提供许多比AWT更好的屏幕显示元素。它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT。它们是JFC的一部分。它们支持可更换的面板和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们。这意味着你可以在任意平台上使用JAVA支持的任意面板。轻量级组件的缺点则是执行速度较慢,优点就是可以在所有平台上采用统一的行为。
4.3.2界面设计
(1)登陆界面设计
界面设计图形如图4.13所示,登陆界面是进入该系统的入口,设置用户名和密码的标签和文本框,下面有选择管理员角色还是普通用户角色的单选框,点击登录进入功能菜单界面。
(2)主界面菜单设计
主界面菜单设计模板如图4.14所示,进入主界面后在显示窗口的最上面对应着当前角色(管理员/普通用户)的所有功能模块,点击具体的模块会出现下拉框,对应具体的使用功能。点击具体选项进入到具体的功能界面。
(3)查询与修改界面设计
每一块信息的查询修改删除界面设计如图4.15所示,在面板的上部有着标签按钮和文本框可以进行对应的指定查询。在面板的中部显示所有查询到信息放到表单中,在面板的下部有着对应的标签和按钮进行修改删除对应的相关信息,面板最下方所有按钮进行具体的功能操作。
(4)信息增加界面设计
信息增加界面设计如图4.16所示,面板中主要有标签和文本框进行组成,因为录入的信息较多,所以占据面板的大部分空间,在面板的下部放置增加的按钮进行对应的功能操作,为了方便中间输入错误进行重新输入,设置重置的按钮,使得所有文本框设置为空。
5 系统实现
5.1 登陆功能实现
(1)登陆界面功能实现,如图5.1所示
管理员输入用户名和密码,然后程序在后台中查询数据库进行比对操作,比对成功才能登陆成功进入系统主界面,如果用户民和密码都为空,点击登陆,弹出提示框用户名和密码不能为空,请输入,如图5.2所示。
如果输入的用户名在数据库中不存在,那么弹出提示框输入的用户名在系统中不存在,如图5.3所示。
如果用户名输入正确,密码输入错误,那么,点击登录弹出提示框输入密码错误。如图5.4所示。点击登陆进入主界面,点击重置文本框清空。
(2)具体实现的关键代码如下:
代码语言:javascript复制if(e.getSource()==btnConfirm) {
char[] c1 = txtPassword.getPassword();//密码框获取密码
String pwd = new String(c1);
String username = txtName.getText().trim();
User user = UserDao.selectUserByName(username);
if(pwd.equals("")|| username.equals("")){
JOptionPane.showMessageDialog(null,"用户名和密码不能为空,请输入!");
} else if (user.getName()== null) {//先看name在 User表中是否存在
JOptionPane.showMessageDialog(null, "该用户不存在!");
} else if (!user.getPassword().equals(pwd)) {// 如果密码和 数据库中的用户密码不一致
JOptionPane.showMessageDialog(null, "输入密码错误!");
} else { //如果都一致的话,那么相当于登陆成功
new AdminMenu("实验室设备管理系统");
}
}
5.2 菜单功能实现
(1)主界面功能实现,如图5.5所示
菜单界面的功能就是点击主页面具体模块的下拉选项,会出现对应的页面。
(2)具体实现关键代码
代码语言:javascript复制public void actionPerformed(ActionEvent e) {
if(e.getSource()==itemEquipmentAdd){
new EquipmentAdd("设备增加");
}
if(e.getSource()==itemAgree){
new Agree();
}
if(e.getSource()==itemEquipmentRepair){
new EquipmentRepair();
}
if(e.getSource()==itemEquipmentScrap){
new EquipmentScrap();
}
if(e.getSource()==itemPeopelAdd){
new BorrowPeopelAdd("申请人员信息增加");
}
if(e.getSource()==itemPeopelManage){
new BorrowPeopelTypeManage();
}
if(e.getSource()==itemPeopelSelectModify){
new BorrowPeopelSelectModify();
}
if(e.getSource()==itemEquipmentSelect){
new EquipmentSelectModify();
}
if(e.getSource()==itemEquipmentTypeManage){
new EquipmentTypeManage();
}
if(e.getSource()==itemUserAdd){
new UserAdd("用户注册");
}
if(e.getSource()==itemUserDelete){
new UserDelete();
}
if(e.getSource()==itemUserUpdate){
new UpdatePassword("修改密码");
}
if(e.getSource()==itemEquipmentBorrow){
new EquipmentBorrowManage();
}
if(e.getSource()==itemEquipmentReturn){
new EquipmentReturnManage();
}
}
5.3 使用功能的实现
因为管理员的功能较多权限较大,而且包含了用户的所有功能,所以在这里就只介绍管理员功能的实现。
(1)设备信息录入功能实现,如图5.6所示
在文本框中输入设备的具体信息,点击增加按钮,如果访问数据库成功,在数据库中成功添加一条记录,那么弹出增加成功。如果在数据库中未成功添加该条信息,那么弹出增加失败。点击重置,各个文本框设置为空。
- 前后端交互事件的关键代码如下:
if(e.getSource()==btnAdd){//增加
Equipment e1=new Equipment();
e1.setId(0);
e1.setName(txtEquipmentName.getText());
e1.setTypeName(cmbEquipmentType.getSelectedItem().toString());
e1.setNumber(Integer.parseInt(txtNumber.getText()));
e1.setUnit(txtUnit.getText());
e1.setLocation(txtLocation.getText());
e1.setPurchaseDate(txtPurchaseDate.getText());
e1.setPrice(Double.parseDouble(txtPrice.getText().trim()));
String typeName=cmbEquipmentType.getSelectedItem().toString();
int ret= EquipmentDao.insertEquipment(e1, typeName);
if(ret==1)
JOptionPane.showMessageDialog(null, "增加成功!");
else
JOptionPane.showMessageDialog(null, "增加失败!");
}
if(e.getSource()==btnExit){//退出
System.exit(1);
}
if(e.getSource()==btnReset) {// 重置
txtEquipmentName.setText("");
txtNumber.setText("");
txtUnit.setText("");
txtLocation.setText("");
txtPurchaseDate.setText("");
txtPrice.setText("");
}
}
- 访问数据库的关键代码如下:
String sql2="insert into equipment(id, name, typeid, typename, number, unit, location, purchaseDate, price) values (?,?,?,?,?,?,?,?,?)";
System.out.println(sql2);
statement2 = connection.prepareStatement(sql2);
statement2.setInt(1,0);
statement2.setString(2,equipment.getName());
statement2.setInt(3,typeID);
statement2.setString(4,equipment.getTypeName());
statement2.setInt(5,equipment.getNumber());
statement2.setString(6,equipment.getUnit());
statement2.setString(7,equipment.getLocation());
statement2.setString(8,equipment.getPurchaseDate());
statement2.setDouble(9,equipment.getPrice());
ret = statement2.executeUpdate();
(2) 设备信息修改与查询功能实现,如图5.7所示
默认在中间面板中显示查询到的所有设备信息,如果根据点击下拉框根据设备名称进行查找,可以输入关键字实现模糊查询的指定查找。因为设备名称是唯一的,所以可以根据设备名称进行修改当前设备的其他信息,同时可以根据输入设备名称进行删除操作,将设备信息在系统中进行删除。
- 功能实现的关键代码如下:
if(e.getSource()==btnModify){//修改
Equipment b1 = new Equipment();
b1.setName(txtEquipmentName.getText());
String typeName = cmbType.getSelectedItem().toString().trim();
b1.setTypeName(typeName);
b1.setNumber(Integer.parseInt(txtNumber.getText()));
b1.setUnit(txtUnit.getText());
b1.setLocation(txtLocation.getText());
b1.setPurchaseDate(txtPurchaseDate.getText());
b1.setPrice(Double.parseDouble(txtPrice.getText()));
int i=EquipmentDao.updateEquipment(b1);
if(i>0)
JOptionPane.showMessageDialog(null, "修改成功");
else
JOptionPane.showMessageDialog(null, "没成功");
}
- 访问数据库的关键代码如下:
connection = Dao.getConnection();
String sql = "select id,name,typename,number,unit,location,purchaseDate,price from equipment where name like" "'%" s "%'";
System.out.println(sql);
statement = connection.prepareStatement(sql);
resultSet = statement.executeQuery();
while(resultSet.next()) {
Equipment equipment = new Equipment();
equipment.setId(resultSet.getInt("id"));
equipment.setName(resultSet.getString("name"));
equipment.setTypeName(resultSet.getString("typename"));
equipment.setNumber(resultSet.getInt("number"));
equipment.setUnit(resultSet.getString("unit"));
equipment.setLocation(resultSet.getString("location"));
equipment.setPurchaseDate(resultSet.getString("purchaseDate"));
equipment.setPrice(resultSet.getDouble("price"));
list.add(equipment);
}
return list;
(3) 申请人员信息录入功能实现,如图5.8所示
在文本框中输入申请人员的具体信息,点击增加按钮,如果访问数据库成功,在数据库中成功添加一条记录,那么弹出增加成功。如果在数据库中未成功添加该条信息,那么弹出增加失败。点击重置,各个文本框设置为空。
- 功能实现关键代码如下:
BorrowPeopel b1=new BorrowPeopel();
b1.setPeopelId(txtPeopelID.getText());
b1.setPeopelName(txtName.getText());
b1.setSex(txtSex.getText());
b1.setAge(Integer.parseInt(txtAge.getText()));
String typeName=cmbType.getSelectedItem().toString().trim();
b1.setPeopelTypeName(typeName);
b1.setPhone(txtPhone.getText());
int i= BorrowPeopelDao.insert(b1);
if(i==1)
JOptionPane.showMessageDialog(null, "增加成功!");
else
JOptionPane.showMessageDialog(null, "增加失败!");
- 访问数据库的关键代码如下:
connection = Dao.getConnection();
// 构造sql语句
String sql = "insert into borrowpeopel values(?,?,?,?,?,?)";
System.out.println(sql);
statement = connection.prepareStatement(sql);
// 占位符替换
statement.setString(1,b.getPeopelId());
statement.setString(2,b.getPeopelName());
statement.setString(3,b.getPeopelTypeName());
statement.setString(4,b.getSex());
statement.setInt(5, b.getAge());
statement.setString(6,b.getPhone());
// 执行sql语句
ret = statement.executeUpdate();
(4)申请人员信息查询与修改功能实现,如图5.9所示
默认在中间面板中显示查询到的所有申请人员信息,如果根据点击下拉框根据编号进行查找。因为编号是唯一的,所以可以根据编号进行修改当前记录的其他信息,同时可以根据输入编号进行删除操作,将申请人员信息在系统中进行删除。
- 功能实现关键代码如下:
if(e.getSource()==btnSelect){
String selectType =cmbChoice.getSelectedItem().toString().trim();
if(selectType.equals("全部")){ // 查询全部(模糊查询)
// 调用查询全部的函数
String s = txtSelect.getText();
List<BorrowPeopel> list1 = BorrowPeopelDao.selectAll(s);
// 查找完之后添加到面板当中
//TODO
Object[][] r1=getSelect(list1);
String[] colName= {"编号","名字","类别","性别","年龄","电话"};
table=new JTable(r1,colName);//表中的数据
scrollPane.setViewportView(table);
}else if(selectType.equals("申请人编号")){// 指定查询
// 调用根据编号进行查询的方法
String s = txtSelect.getText();
List<BorrowPeopel> list2 = BorrowPeopelDao.selectById(s);
// 查找完之后添加到面板当中
//TODO
Object[][] r1=getSelect(list2);
String[] colName= {"编号","名字","类别", "性别","年龄","电话"};
table=new JTable(r1,colName);//表中的数据
scrollPane.setViewportView(table);
}
}
- 访问数据库关键代码如下:
connection = Dao.getConnection();
// 2.拼接sql语句
String sql = "select * from borrowpeopel where peopelname like" "'%" s "%'" ;
System.out.println(sql);
//3.执行sql查询语句
statement = connection.prepareStatement(sql);
resultSet = statement.executeQuery();
//可以包括多类的查询条件,根据前面的界面来完善。
while(resultSet.next()) {
BorrowPeopel b = new BorrowPeopel();
b.setPeopelId(resultSet.getString("peopelid"));
b.setPeopelName(resultSet.getString("peopelName"));
b.setPeopelTypeName(resultSet.getString("peopelTypeName"));
b.setSex(resultSet.getString("sex"));
b.setAge(resultSet.getInt("age"));
b.setPhone(resultSet.getString("phone"));
list.add(b);
}
return list;
(5) 设备类型管理功能实现,如图5.10所示
在文本框中输入设备类型的具体信息,点击增加按钮,如果访问数据库成功,在数据库中成功添加一条记录,那么弹出增加成功。如果在数据库中未成功添加该条信息,那么弹出增加失败。默认在中间面板中显示查询到的所有设备类型信息,可以根据编号进行指定查找。因为编号是唯一的,所以可以根据编号进行修改当前记录的其他信息,同时可以根据输入编号进行删除操作,将指定设备类型信息在系统中进行删除。
- 功能实现关键代码如下:
if(e.getSource()==btnInsert){
EquipmentType b = new EquipmentType();
b.setTypeId(Integer.parseInt(txtEquipmentTypeID.getText()));
b.setTypeName(txtEquipmentTypeName.getText());
int ret = EquipmentTypeDao.insert(b);
if(ret==1){
JOptionPane.showMessageDialog(null,"增加成功!");
}else{
JOptionPane.showMessageDialog(null,"增加失败!");
}
}
- 访问数据库关键代码如下:
//1.先拿到数据库的连接
connection = Dao.getConnection();
//2.拼接sql语句
String sql = "insert into equipmenttype values (?,?)";
System.out.println(sql);
statement = connection.prepareStatement(sql);
// 占位符防止sql注入,最好不要直接拼接到sql语句中
statement.setInt(1, b.getTypeId());
statement.setString(2,b.getTypeName());
//3.执行sql语句
ret = statement.executeUpdate();
(6) 申请人员类型管理功能实现,如图5.11所示
在文本框中输入申请人员类型的具体信息,点击增加按钮,如果访问数据库成功,在数据库中成功添加一条记录,那么弹出增加成功。如果在数据库中未成功添加该条信息,那么弹出增加失败。默认在中间面板中显示查询到的所有人员类型信息,可以根据编号进行指定查找。因为编号是唯一的,所以可以根据编号进行修改当前记录的其他信息,同时可以根据输入编号进行删除操作,将指定设备类型信息在系统中进行删除。
- 功能实现关键代码如下:
if(e.getSource()==btnSelect){
String s = txtSelect.getText();
if(s.equals("")){
// 查询全部
Object[][] r1=getSelect(BorrowPeopelTypeDao.selectAll());
String[] colName= {"编号","类别名"};
table=new JTable(r1,colName);//表中的数据
scrollPane.setViewportView(table);//表与滚动条联系起来
}else{
// 指定查询
List<BorrowPeopelType> list = BorrowPeopelTypeDao.selectTypeById(s);
Object[][] r1=getSelect(list);
String[] colName= {"编号","类别名"};
table=new JTable(r1,colName);//表中的数据
scrollPane.setViewportView(table);//表与滚动条联系起来
}
}
- 访问数据库关键代码如下:
//1.先拿到数据库的连接
connection = Dao.getConnection();
//2.拼接sql语句
String sql = "select * from borrowpeopeltype";
System.out.println(sql);
statement = connection.prepareStatement(sql);
//3.执行sql语句
resultSet = statement.executeQuery();
while (resultSet.next()) {
BorrowPeopelType peopelType = new BorrowPeopelType();
peopelType.setPeopelTypeId(resultSet.getString("peopelTypeId"));
peopelType.setPeoelTypeName(resultSet.getString("peopelTypeName"));
list.add(peopelType);
}
return list;
(7)用户信息注册功能实现,如图5.12所示
在文本框中输入用户名和密码,点击添加,将对应信息放到user类中,在插入到user表中。 同时用户名和密码的文本框都不能为空,如果为空点击添加显示用户民和密码不能为空请重新输入。同时用户名都是唯一的,不能输入已经存在过的用户名。
- 功能实现关键代码如下:
if(e.getSource()==btnAdd){
// 添加用户
// 往数据库中的user表中插入 这个一条用户信息,相当于注册
String username = txtName.getText();
char[] c = txtPassword.getPassword();
String password = new String(c);
if(username.equals("")|| password.equals("")){
JOptionPane.showMessageDialog(null,"用户名或密码不能为空!");
return;
}
User user = new User();
user.setUserName(username);
user.setPassword(password);
// username不能重复 ,给数据库中的user表中的 username字段设置成not null
int ret = UserDao.insertUser(user);
if(ret==1){
JOptionPane.showMessageDialog(null,"插入成功!");
}else{
JOptionPane.showMessageDialog(null,"插入失败!");
}
}
- 访问数据库关键代码如下:
//1.先拿到数据库的连接
connection = Dao.getConnection();
//2.拼接sql语句
String sql = "insert into user values (null,?,?)";
System.out.println(sql);
statement = connection.prepareStatement(sql);
// 占位符防止sql注入,最好不要直接拼接到sql语句中
statement.setString(1,user.getUserName());
statement.setString(2,user.getPassword());
//3.执行sql语句
ret = statement.executeUpdate();
(8) 删除与查询用户信息功能实现,如图5.13所示
在文本框中输入用户名,点击删除,在系统中对用户登陆账号数据进行删除。
- 功能实现关键代码如下:
if(e.getSource()==btnDelete){
// 读取输入的 用户名,调用UserDao的delete 方法进行删除
String name = txtUserName.getText();
int ret = UserDao.deleteUser(name);
if(ret==1){
JOptionPane.showMessageDialog(null,"删除成功!");
}else{
JOptionPane.showMessageDialog(null,"删除失败!");
}
}
- 访问数据库关键代码如下:
//1.拿到数据库连接
connection = Dao.getConnection();
//2.拼接sql语句
String sql = "delete from user where username =?";
System.out.println(sql);
statement = connection.prepareStatement(sql);
// 占位符替换
statement.setString(1,name);
// 3.执行sql语句
ret = statement.executeUpdate();
(9) 修改用户密码功能实现,如图5.14所示
设置非空校验。输入用户名,查询user表看是否存在,如果存在,那么输入密码,查询user表,查看原密码与用户名是否匹配,如果匹配,输入新密码与确认新密码,如果不一致那么返回,如果一致,那么修改密码成功。
- 功能实现关键代码如下:
if(e.getSource()==btnConfirm){
String name= txtName.getText().trim();
// 原密码
char[] passwordchs = txtPassword.getPassword();
String password =new String(passwordchs);
// 新密码
char[] newPasswordchas = txtNewPassword.getPassword();
String newPassword = new String(newPasswordchas);
// 确认密码
char[] confirmPasswordchs = txtConfirmPassword.getPassword();
String confimPassword = new String(confirmPasswordchs);
// 我就简单的写了,不加那么多检验了,只写关键的检验
// 用户名和原密码在数据库中能否查到
User user1 = new User();
user1.setUserName(name);
user1.setPassword(password);
// 新密码与确认新密码是否一致,检验
if(!newPassword.equals(confimPassword)){
JOptionPane.showMessageDialog(null,"新密码与确认密码不一致,请重新输入");
txtNewPassword.setText("");
txtConfirmPassword.setText("");
return;
}
// 经过检验后无错误,那么进行修改
// 我把数据表中的name字段设置成了unique,所以是唯一的,所以可以根据name拿到这条记录
int ret = UserDao.updateUser(name,newPassword);
if(ret==0){
JOptionPane.showMessageDialog(null,"修改失败!");
}else{
JOptionPane.showMessageDialog(null,"修改成功!");
}
}
- 访问数据库关键代码如下:
//1.先拿到数据库的连接
connection = Dao.getConnection();
//2.拼接sql语句
String sql = "update user set password=? where username= ?";
System.out.println(sql);
statement = connection.prepareStatement(sql);
// 占位符防止sql注入,最好不要直接拼接到sql语句中
statement.setString(1, password);
statement.setString(2, name);
//3.执行sql语句
ret = statement.executeUpdate();
(10) 设备申请功能实现,如图5.15所示
设备申请操作设计,输入设备名称、设备类别、申请日期、操作人员等信息,点击申请,在系统中登记这一条记录中的上述信息得以保存,如果申请成功,弹出提示框申请成功,否则弹出提示框申请失败。同时这条记录的默认状态设置为未归还,因为设备已经被他人给申请走了,设备信息中的数量也会修改成申请走之后的数量。
为了方便管理员以及用户进行查看申请记录,所以在点击查询,可以查询到全部的申请记录信息并展示,同时进行联表查询,查询对应设备的当前数量信息进行展示。
- 功能实现关键代码如下:
if(e.getSource()==btnBorrow){
EquipmentBorrow b = new EquipmentBorrow();
b.setName(txtEquipmentName.getText());
String typeName = cmbChoice.getSelectedItem().toString();
b.setTypeName(typeName);
b.setBorrowNumber(Integer.parseInt(txtNumber.getText()));
b.setBorrowDate(txtDate.getText());
b.setPeopel(txtPeopel.getText());
int ret = EquipmentBorrowDao.insert(b);
if(ret==1)
JOptionPane.showMessageDialog(null, "申请成功!");
else
JOptionPane.showMessageDialog(null, "申请失败!");
}
- 访问数据库关键代码如下:
// 拿到数据库连接
connection = Dao.getConnection();
// 构造sql语句
String sql = "insert into equipmentBorrow(name,typeName,borrowDate,borrowNumber,peopel) values(?,?,?,?,?)";
System.out.println(sql);
statement = connection.prepareStatement(sql);
//占位符替换
statement.setString(1,b.getName());
statement.setString(2,b.getTypeName());
statement.setString(3,b.getBorrowDate());
statement.setInt(4,b.getBorrowNumber());
statement.setString(5,b.getPeopel());
// 执行sql语句
ret = statement.executeUpdate();
//给申请表中添加一条申请记录的同时,一定记得修改原设备表中当前设备数量的信息
/*
* 先查找到原目标中的设备数量
*/
int preNum = selectNum(b.getName());
String sqlUpdate = "update equipment set number =? where name=?";
statement = connection.prepareStatement(sqlUpdate);
// 给原设备数量 设成 申请走之后的数量
int finalNum = preNum-b.getBorrowNumber();
statement.setInt(1,finalNum);
statement.setString(2,b.getName());
int a =statement.executeUpdate();
System.out.println("原来的设备信息已经完成修改!" "目前修改行: " a);
(11) 设备归还功能实现,如图5.16所示
设备归还操作设计,输入申请编号、设备名称、设备类别、归还日期、归还数量、操作人员等信息,点击归还,在系统中对指定申请记录进行修改,如果归还成功,弹出提示框归还成功,否则弹出提示框归还失败。同时这条记录的状态设置为已归还,因为设备已经被归还了,设备信息中的数量也会修改成归还之后的数量。
为了方便管理员以及用户进行查看申请记录,所以在点击查询,可以查询到全部的申请记录信息并展示,同时进行联表查询,查询对应设备的当前数量信息进行展示。
- 功能实现关键代码如下:
if(e.getSource()== btnReturn){
EquipmentBorrow b = new EquipmentBorrow();
b.setBorrowId(Integer.parseInt(txtId.getText()));
b.setReturnNumber(Integer.parseInt(txtNumber.getText()));
b.setReturnDate(txtDate.getText());
b.setName(txtEquipmentName.getText());
int ret = EquipmentBorrowDao.update(b);
if(ret==0)
JOptionPane.showMessageDialog(null, "归还失败!");
else
JOptionPane.showMessageDialog(null, "归还成功!");
}
- 访问数据库关键代码如下:
// 拿到数据库连接
connection = Dao.getConnection();
// 构造sql语句
String sql = "update equipmentBorrow set returnDate=?,state=?,returnNumber=? where borrowId=?";
System.out.println(sql);
statement = connection.prepareStatement(sql);
//占位符替换
statement.setString(1,b.getReturnDate());
statement.setString(2,"已归还");
statement.setInt(3,b.getReturnNumber());
statement.setInt(4,b.getBorrowId());
// 执行sql语句
ret = statement.executeUpdate();
System.out.println("归还之后的返回值是:" ret);
//给申请表中修改一条申请记录(归还)的同时,一定记得修改原设备表中当前设备数量的信息
/**
* 先查找到原目标中的设备数量
*/
int preNum = selectNum(b.getName());
System.out.println("申请之后的数量:" preNum);
String sqlUpdate = "update equipment set number =? where name=?";
statement = connection.prepareStatement(sqlUpdate);
// 给原设备数量 设成 申请走之后的数量
int returnNum =b.getReturnNumber();
System.out.println("归还的数量:" returnNum);
int finalNum = preNum b.getReturnNumber();
System.out.println("归还后的数量:" finalNum);
statement.setInt(1,finalNum);
statement.setString(2,b.getName());
int a =statement.executeUpdate();
if(a==1){
System.out.println("归还后修改原数据成功!");
}else{
System.out.println("归还后修改原数据失败!");
}
(12)设备报废处理功能实现,如图5.17所示
设备报废处理功能实现,在该系统中因为设备可能使用的时间过长,或者在使用的过程中不慎损坏且无法维修或者维修代价高于成本领导不予批准的情况下,这批设备就会进行报废处理。在文本框中输入报废设备的信息,点击报废按钮,根据设备名称进行修改或者删除操作,如果报废的数量达到设备的总数量,那么该设备的信息将从系统中进行删除,如果报废的数量没有达到设备的总数量,那么对设备的数量信息进行修改操作,修改之后的数量等于之前的数量-报废的数量。
- 功能实现关键代码如下:
if(e.getSource()==btnSelect){
//查询
String name=cmbChoice.getSelectedItem().toString();
String value=txtSelect.getText();
if(name.equals("全部")){
Object[][] r1=getSelect(EquipmentDao.selectAll(value));
String[] colName= {"编号","名字","类别名","当前数量","数量单位","存放地点","购入日期","购入单价"};
table=new JTable(r1,colName);//表中的数据
scrollPane.setViewportView(table);//表与滚动条联系起来
}else if(name.equals("设备名称")){
Object[][] r1=getSelect(EquipmentDao.selectByName(value));
String[] colName= {"编号","名字","类别名", "当前数量","数量单位","存放地点","购入日期","购入单价"};
table=new JTable(r1,colName);//表中的数据
scrollPane.setViewportView(table);//表单重新显示
}
- 访问数据库关键代码如下:
// 先定义数据库连接,预处理
Connection connection = null;
PreparedStatement statement = null;
int ret = 0;
//1.获取到数据库连接
connection = Dao.getConnection();
//2.拼装sql语句
String sql="delete from equipment where name=?";
System.out.println(sql);
statement = connection.prepareStatement(sql);
statement.setString(1,name);
ret = statement.executeUpdate();
(13) 设备维修申请功能实现,如图5.18所示
设备维修申请功能实现。如果设备因为使用出现损坏的情况下,要去进行维修,那么需要先在文本框中维修设备信息(设备名称、设备类别、维修数量、维修日期),点击申请按钮,在系统中保存一条设备维修申请记录,同时批准状态默认显示为未批准。点击查询,所有维修申请记录都会查询到并且展示给管理员,同时可以根据申请记录编号进行指定查询,方便管理员进行后续相关的操作。
- 功能实现关键代码如下:
if(btnBorrow==e.getSource()){
Repair repair = new Repair();
repair.setName(txtEquipmentName.getText());
repair.setTypeName(cmbChoice.getSelectedItem().toString());
repair.setNumber(Integer.parseInt(txtNumber.getText()));
repair.setWorkerName(txtWorker.getText());
repair.setWorkDate(txtDate.getText());
int ret = RepairDao.insert(repair);
if(ret==1){
JOptionPane.showMessageDialog(null,"申请操作成功,申请记录已添加,等待领导批复!");
}else{
JOptionPane.showMessageDialog(null,"申请操作失败,申请记录添加失败!");
}
}
- 访问数据库关键代码如下:
String sql="insert into repair(id,name,typename,number,workerName,workDate) values (null,?,?,?,?,?)";
System.out.println(sql);
statement = connection.prepareStatement(sql);
statement.setString(1,repair.getName());
statement.setString(2,repair.getTypeName());
statement.setInt(3,repair.getNumber());
statement.setString(4,repair.getWorkerName());
statement.setString(5,repair.getWorkDate());
ret = statement.executeUpdate();
System.out.println(sql);
(14) 设备维修批准功能实现,如图5.19所示
设备维修批准功能实现。这个功能是只有管理员账户中的领导专用的账户才能够使用。首先能够显示所有的维修申请记录,方便领导进行查看维修申请信息,可以输入编号,点击查询显示指定记录,也可以不填点击查询显示全部记录。同时上级领导自己进行综合考虑,决定是否批准指定的维修记录,如果选择批准的话,那么在文本框中输入这条记录的申请编号,点击批准按钮,此时根据编号将维修申请表中的这条记录中的批准状态修改成”已批准”,显示领导已经同意且批准,可以进行维修。
- 功能实现关键代码如下:
if(btnAgree ==e.getSource()){
int ret = RepairDao.agree(Integer.parseInt(txtId.getText()));
if(ret==1){
JOptionPane.showMessageDialog(null,"批准成功!");
}else{
JOptionPane.showMessageDialog(null,"批准失败!");
}
}
- 访问数据库关键代码如下:
String sql="update repair set agree=? where id=?";
System.out.println(sql);
statement = connection.prepareStatement(sql);
statement.setString(1,"已批准");
statement.setInt(2,id);
ret = statement.executeUpdate();
System.out.println(sql);
6 总 结
沈阳理工大学信息网络实验室设备管理系统,是针对于高校对于实验室设备管理的软件,在软件需求调查分析阶段,通过对实验室设备管理的发展,历史背景的研究,与现实实验室现状相结合,总结分析,得到实验室管理中最常用的几个模块。在设备功能业务管理中,最大的两个模块就是设备信息资源的管理,再则就是设备申请记录的管理。设备信息管理主要包括设备信息的管理、设备申请记录的管理、设备维修申请记录的管理、设备类别信息的管理;人员的管理主要是系统用户人员的管理、申请人员信息的管理、申请人员类别的管理。这是实验室系统最基本的功能。
经过前期分析调查之后,设计和规划本系统需要实现的模块,主要包括了设备信息的管理,申请人员的管理,设备申请归还的管理以及设备资产(维修、报废)的管理。经过细致的分析总结之后,每个模块之下需要的具体的功能尽量完善,设备信息管理模块包括:设备信息的增加、删除、查询、修改,设备类别的增删改查;申请人员管理模块包括:申请人员信息管理、人员类别管理等;系统用户管理模块包括:注册用户、修改密码以及查询用户、删除用户;然后是设备申请与归还的管理,最后是设备资产模块的管理,包括设备报废处理、设备维修申请、设备维修申请批准。
在用户显示模块,主要实现了包括:设备信息查询、申请人员注册及查询以及注册用户、修改密码,然后是设备申请与归还。在设计完成之后,就是数据库设计还有编码,经过几周的时间之后,系统已经编码并测试完成,经过实际的测试之后,实现功能与设计之初的要求一致,达到了预期的目标。当然,整个系统从设计到实现中,也还有诸多不足之处。设计之初的调查阶段,对于系统的整个需求分析,以及业务流程的掌控不是特别的完美,所以导致的结果是,系统的职能分配,重管理员轻普通用户,管理员端的功能基本满足日常需求,但是普通用户的需求并没有得到充分的满足,所以用户端的功能模块以及功能设计等还有待进一步完善。
整个系统设计与实现需要的是全面的技术支持,就本文采用的具体技术就有,Java 语言后台编写技术,Swing、AWT等GUI工具包使用各种轻量级组件实现前端的显示界面,以及数据库MYSQL的设计与使用。除此之外,还有了解和掌握了许许多多的规范与要求,另外还有对于开发工具的熟悉使用,操作系统的熟悉等等。
做完整个设计之后,再回想整个过程,从开始的选题到最后,中间经历了一个完整的软件系统的设计与开发实现。用到了面向对象程序设计这门课程的很多知识,还利用到了许多辅助文献资料,无论是理论思路的建立,还是实际的文献资料查找,或者是实际编码过程,用到的都是专业知识。在这个过程也检验了自己在课程中的知识学习储备,从信息系统的理论设计,流程建立,资料情报收集,数据库设计,又或者是 Java 语言的应用,Swing 前端界面的实现,还有对MySql关系型数据库的应用,多多少少都是我们专业目前阶段需要掌握的技术及能力。使得自己的技术知识再次的得到运用与检验,对于程序开发设计的理解更加深刻与全面。
当前系统swing的项目总体上逻辑并不复杂,在这个项目中也可以将jdbc全换成mybatis实现,写个接口再加个xml配置文件就可以使用,很方便,也可以节省了写JDBC时需要写的百分之九十的代码。同时在这个项目中也有一些简洁、严谨的闪光点,单例模式 双重校验锁获取数据库唯一实例且保证线程安全,SQL语句用占位符替换不用字符串拼接以防sql注入等等。还有一些优化代码的操作,引入lombok依赖,实体类加注解实现getter、setter等等。
同时在整个开发过程中,老师总是能指出关键性的问题,让我去思考和解决,在无法解决的时候,给我提供指导性的帮助。在与老师的交流过程中,能学习到思考问题的方式、看待问题的角度,解决问题的方法,这些都让我受益匪浅。当然,还有同学的帮助和在与同学交流中,得到的新的观点等。通过完成整个设计,也让我对于程序设计和开发更加熟悉与热爱,更加有信心向着这个方向走下去,这是最大的收获。
参考文献
[1] 孙更新,宾晟,宫生文. Java 程序开发大全[M]. 中国铁道出版社. 2010 [2] 杨冬青,李红燕,唐世渭. 数据库系统概念(第六版)[M].机械工业出版社. 2012. 1233 [3] 李新良,游新娥,禹云. Java 面向对象程序设计教程. 北京理工大学出版社. 2015 [4] 王靖,薛艳梅. 管理信息系统[M]. 重庆大学出版社.2015 [5]董小园. Java 面向对象程序设计[M]. 北京:清华大学出版社.2014 [6]万常选,廖国琼,吴京慧,刘喜平. 数据库系统原理与设计(第 2 版)[M].北京:清华大学出版社. 2015
结语
课程设计代码及报告相关资料放在百度网盘了,需要的同志们自取即可。
链接:https://pan.baidu.com/s/1VO2Yw0BLdkRQqYMRldFE9w 提取码:rain