题 目 springboot 农田灌溉设备管理系统
目 录
摘要 1
1 绪论 1
1.1选题的目的和意义 1
1.2研究现状 1
1.3系统开发技术的特色 1
1.4论文结构与章节安排 1
2 农田灌溉设备管理系统 系统分析 3
2.1 可行性分析 3
2.2 系统流程分析 3
2.2.1数据增加流程 3
2.3.2数据修改流程 4
2.3.3数据删除流程 4
2.3 系统功能分析 4
2.3.1 功能性分析 4
2.3.2 非功能性分析 5
2.4 系统用例分析 6
2.5本章小结 7
3 农田灌溉设备管理系统 总体设计 8
3.1 系统架构设计 8
3.2 系统功能模块设计 8
3.2.1整体功能模块设计 9
3.2.2设备管理模块设计 9
3.2.3检修维护管理模块设计 10
3.3 数据库设计 10
3.3.1 数据库概念结构设计 10
3.3.2 数据库逻辑结构设计 14
3.4本章小结 17
4 农田灌溉设备管理系统 详细设计与实现 18
4.1登录模块的实现 18
4.2管理员管理模块 21
4.3设备管理模块 22
4.4设备入库管理模块 25
4.5检修维护管理模块 27
4.6个人资料模块 31
5系统测试 34
5.1系统测试的目的 34
5.2 系统测试用例 34
5.3 系统测试结果 35
结论 37
参考文献 38
致 谢 40
针对农田灌溉设备管理系统的现状,应用软件技术开发了农田灌溉设备管理系统,实现了农田灌溉设备管理数字化和规范化,有效地提高了设备管理的工作效率,降低了管理人员的劳动强度。计算机管理以其快捷高效的特点在很多领域已经取代了传统的手工管理方式,尤其是在繁复琐碎的物质设备管理中,计算机管理管理手段的这一优势更显得十分突出。与传统管理方式相比较,农田灌溉设备管理系统能更加有效的进行信息管理。设备管理系统应用数据库,对信息数据以数据库形式表示,更容易更新和管理。
关键词:springboot技术;MYSQL; 农田灌溉设备管理系统
Abstract
According to the current situation of farmland irrigation equipment management system, the farmland irrigation equipment management system is developed by using software technology, which realizes the digitization and standardization of farmland irrigation equipment management, effectively improves the work efficiency of equipment management and reduces the labor intensity of managers. In the field of traditional material management, computer management has been replaced by manual management, especially in the field of complex and efficient material management. Compared with traditional management methods, farmland irrigation equipment management system can manage information more effectively. The equipment management system applies the database to represent the information data in the form of database, which is easier to update and manage.
Keywords: Springboot technology; MYSQL; Farmland irrigation equipment management system
1 绪论
1.1 选题的目的和意义
在农田灌溉设备管理系统工作中,设备的编排是一项十分复杂、棘手的工作。在编排过程中,由于数量多容易出错。利用计算机辅助进行设备编排工作,既提高了编排的科学性,又大大减轻管理人员的工作强度,提高工作效率,从而农田灌溉设备管理现代化迈上了一个新台阶。又因为现在各个农田灌溉设备众多但自动管理水平相比过低,很多农田灌溉设备都采用在设备购进以后将设备的基本情况和相关信息登记存档。存档以后档案基本就没人记录与维护,至于以后设备的变迁或损坏都不会记录在设备档案中,即不能体现设备的即时状态。而有些即使有农田灌溉设备管理系统的单位,就算是能把设备的即时信息体现在设备档案上,但设备的缺陷处理及设备缺陷等功能没有实施,设备检修的备品备件情况和检修成本核算没有实现,整个农田灌溉设备管理信息化仍处于较低水平。将管理任务分成小.块,落实到个人并能随时查询设备当前情况和历史情况,对设备的可靠性分析有直接作用,使管理人员从手工计算、统计工作中解脱出来。
1.2研究现状
农田灌溉设备管理系统是一个农田灌溉系统中不可缺少的部分,它的内容对于农田灌溉设备对管理者来说都至关重要,所以农田灌溉设备管理系统应该能够为农业提供充足的信息和快捷的查询手段。该系统还可以帮助农田灌溉进行有效的设备管理,对设备的维护,农田灌溉设备的估计有很大的帮助,提高农业对的可持续发展能力与市场竞争力。
目前国内农田灌溉设备管理系统自动化管理水平不是很高。大多数学农田灌溉设备管理系统办法是设备采购进来以后,将设备的基本情况和相关信息登记存档,然后将档案存档。以后档案基本就没人维护,如设备位置出库、检修情况、设备当前运行状态等信息根本不会体现在设备台帐上,即设备跟踪信息不能及时体现在设备档案上。某些使用农田灌溉设备管理系统,对设备的跟踪信息即使能体现在设备档案上,但设备的缺陷处理及设备缺陷等功能没有实施,设备检修的备品备件情况和检修成本核算没有实现,整个农田灌溉设备管理信息化仍处于较低水平。本信息管理系统合理的借鉴国际领先的农田灌溉设备管理系统思想并结合国内农田灌溉设备管理系统现状,可以完全能满足国内农田灌溉设备管理系统的需要。并通过对各行业设备管理情况的长期研究探索,以灵活、通用为主要设计思想,可提高农业农田灌溉效率和设备可靠性,减少工作人员的劳动强度,减少耗材,提高农业农田灌溉设备管理系统的现代化管理水平。
1.3系统开发技术的特色
(1) 农田灌溉设备管理系统中的web后台管理中的后端不再使用古老的jsp+javabean+servlet技术,而是使用当前主流的springboot框架,它减少java配置代码,简化编程代码,目前springboot框架也是很多企业选择的框架之一。
(2) 农田灌溉设备管理系统中的web后台管理中的前端使用的是JavaScript框架,它配合ajax[8]和jquery[9]可以美化页面设计。
(3) 农田灌溉设备管理系统中数据库用的mysql5.7,它执行效率高。
1.4论文结构与章节安排
论文将分层次经行编排,除去论文摘要致谢文献参考部分,正文部分还会对网站需求做出分析,以及阐述大体的设计和实现的功能,最后罗列部分调测记录,论文主要架构如下:
第一章:引言。第一章主要介绍了课题研究的背景,系统开发的现状和本文的研究内容与主要工作。
第二章:系统需求分析。第二章主要从系统的用户、功能等方面进行需求分析。
第三章:系统设计。第三章主要对系统框架、系统功能模块、数据库进行功能设计。
第四章:系统实现。第四章主要介绍了系统框架搭建、系统界面的实现。
第五章:系统测试。第五章主要对系统的部分界面进行测试并对主要功能进行测试
2 农田灌溉设备管理系统 系统分析
系统分析是开发一个项目的先决条件,通过系统分析可以很好的了解系统的主体用户的基本需求情况,同时这也是项目的开发的原因。进而对系统开发进行可行性分析,通常包括技术可行性、经济可行性等,可行性分析同时也是从项目整体角度进行的分析。然后就是对项目的具体需求进行分析,分析的手段一般都是通过用户的用例图来实现。下面是详细的介绍。
在项目上使用的工具大部分都是是当下流行开源免费的,所以在开发前期,开发时用于项目的经费将会大大降低,不会让开发该软件在项目启动期受到经费的影响,所以经济上还是可行的。尽量用最少的花费去满足用户的需求。省下经费用于人工费,以及设备费用。将在无纸化,高效率的道路上越走越远。
所以经济可行性没有问题。
(2)操作可行性:
此次项目设计参考了几个该模式下网站的开发案例,对他们的操作界面分析,将众多案例结合在一起,突出以人为本简化操作,所以具有基本计算机知识的人都会操作本项目。
因此操作可行性也没有问题。
(3)技术可行性:
技术可行性指的是对于搭建框架的可行性,以及有更优秀的技术出现时系统的技术更新换代的纳新性如何,开发时间成本费用比如何。
现有的springboot技术能够迎合所有电子商务系统的搭建。开发这个农田灌溉设备管理系统的时候我采用了springboot+MYSQL用以运行整体程序。
综上所述技术可行性也没有问题。
(4)法律可行性:
从开发者角度来看,springboot和MYSQL是网上开源且免费的,在知识产权方面不会产生任何法律纠纷。
从用户使用角度来看,只要不再系统上贩卖违禁品,对系统做出条约协议,杜绝非法支付即可。
综上所述法律可行性也没有问题。
业务流程是用一些特定的符合和线条来进行演示用户在使用系统时的过程,在进行系统分析的时候,业务流程可以帮助开发人员更好的理解业务,发现错误,完善系统。
用户成功登入系统后就能够实现增加数据的操作,增加数据的编号是特定的,系统生成,用户不能随意填写,除了编号以外,其他增加信息用户自己填写,填写后的信息经过系统验证,验证合法通过就显示增加数据成功了,相反的话,就没有增加成功,图2-1显示的就是在增加数据时的流程。
图2-1 数据增加流程图
数据修改时的流程和上面介绍的数据增加时的流程差不多,如图2-2所示。
图2-2 数据修改流程图
如果系统里面存在一些没有用的数据的话,相关的管理人员还可以对这些数据进行删除,图2-3就是数据删除时的流程图。
图2-3 数据删除流程图
按照农田灌溉设备管理系统的角色,我划分为了管理员管理模块这一大部分。
管理员管理模块:
(1)用户管理:管理员可以对管理员信息进行管控。
(2)设备管理:管理员在后台可以对农田灌溉设备管理系统中显示的设备信息进行增删改查。
(3)设备入库管理:管理员可以对农田灌溉设备管理系统设备入库进行管控。
(4)设备出库管理:在“设备出库”这一菜单下,可以对管理人员操作的设备出库进行管控。
(5)运行参数管理:管理员在可以对农田灌溉设备管理系统中显示的运行参数信息进行增删改查。
(6)检修维护管理:管理员在可以对农田灌溉设备管理系统中显示的检修维护信息进行增删改查。
农田灌溉设备管理系统的非功能性需求比如 农田灌溉设备管理系统的安全性怎么样,可靠性怎么样,性能怎么样,可拓展性怎么样等。具体可以表示在如下3-1表格中:
表3-1 农田灌溉设备管理系统非功能需求表
安全性 | 主要指 农田灌溉设备管理系统数据库的安装,数据库的使用和密码的设定必须合乎规范。 |
可靠性 | 可靠性是指 农田灌溉设备管理系统能够安装用户的指示进行操作,经过测试,可靠性90%以上。 |
性能 | 性能是影响 农田灌溉设备管理系统占据市场的必要条件,所以性能最好要佳才好。 |
可扩展性 | 比如数据库预留多个属性,比如接口的使用等确保了系统的非功能性需求。 |
易用性 | 用户只要跟着 农田灌溉设备管理系统 的页面展示内容进行操作,就可以了。 |
可维护性 | 农田灌溉设备管理系统 开发的可维护性是非常重要的,经过测试,可维护性没有问题 |
web后台管理上的管理员是维护整个农田灌溉设备管理系统中所有数据信息的。管理员角色用例如图2-3所示。
图2-3农田灌溉设备管理系统管理员角色用例图
本章主要通过对农田灌溉设备管理系统的可行性分析、流程分析、功能需求分析、系统用例分析,确定整个农田灌溉设备管理系统要实现的功能。同时也为农田灌溉设备管理系统的代码实现和测试提供了标准。
本章主要讨论的内容包括农田灌溉设备管理系统的功能模块设计、数据库系统设计。
本 农田灌溉设备管理系统从架构上分为三层:表现层(UI)、业务逻辑层(BLL)以及数据层(DL)。
图3-1 农田灌溉设备管理系统系统架构设计图
表现层(UI):又称UI层,主要完成本 农田灌溉设备管理系统的UI交互功能,一个良好的UI可以打打提高用户的用户体验,增强用户使用本 农田灌溉设备管理系统 时的舒适度。UI的界面设计也要适应不同版本的 农田灌溉设备管理系统 以及不同尺寸的分辨率,以做到良好的兼容性。UI交互功能要求合理,用户进行交互操作时必须要得到与之相符的交互结果,这就要求表现层要与业务逻辑层进行良好的对接。
业务逻辑层(BLL):主要完成本 农田灌溉设备管理系统 的数据处理功能。用户从表现层传输过来的数据经过业务逻辑层进行处理交付给数据层,系统从数据层读取的数据经过业务逻辑层进行处理交付给表现层。
数据层(DL):由于本 农田灌溉设备管理系统 的数据是放在服务端的mysql数据库中,因此本属于服务层的部分可以直接整合在业务逻辑层中,所以数据层中只有数据库,其主要完成本 农田灌溉设备管理系统 的数据存储和管理功能。
在上一章节中主要对系统的功能性需求和非功能性需求进行分析,并且根据需求分析了本农田灌溉设备管理系统中的用例。那么接下来就要开始对本农田灌溉设备管理系统的架构、主要功能和数据库开始进行设计。农田灌溉设备管理系统根据前面章节的需求分析得出,其总体设计模块图如图3-2所示。
图3-2 农田灌溉设备管理系统功能模块图
后台管理者能够实现对后台设备管理增删改查操作,设备管理模块结构图如下图:
图3-3设备管理模块结构图
后台管理者能够实现对后台检修维护管理增删改查操作,检修维护管理模块结构图如下图:
图3-4检修维护管理模块结构图
数据库设计一般包括需求分析、概念模型设计、数据库表建立三大过程,其中需求分析前面章节已经阐述,概念模型设计有概念模型和逻辑结构设计两部分。
下面是整个农田灌溉设备管理系统中主要的数据库表总E-R实体关系图。
图3-6 农田灌溉设备管理系统 总E-R关系图
下面根据 农田灌溉设备管理系统 的数据库总E-R关系图可以得出 农田灌溉设备管理系统需要很多E-R图,在此罗列出来一些主要的数据库E-R模型图。
图3-7运行参数E-R关系图
图3-8 设备入库信息E-R关系图
图3-9设备出库管理E-R关系图
图3-10设备管理E-R关系图
通过上一小节中 农田灌溉设备管理系统中总E-R关系图上得出一共需要创建很多个数据表。在此我主要罗列几个主要的数据库表结构设计。
overhaul_and_maintenance表:
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
overhaul_and_maintenance_id | int | 11 | 是 | 是 | 检修维护ID |
equipment_model | varchar | 64 | 是 | 否 | 设备型号 |
equipment_name | varchar | 64 | 否 | 否 | 设备名称 |
equipment_type | varchar | 64 | 否 | 否 | 设备类型 |
repair_personnel | varchar | 64 | 否 | 否 | 维修人员 |
maintenance_time | datetime | 0 | 否 | 否 | 维修时间 |
maintenance_status | varchar | 64 | 否 | 否 | 维修状态 |
maintenance_quantity | int | 11 | 否 | 否 | 维修数量 |
equipment_picture | varchar | 255 | 否 | 否 | 设备图片 |
maintenance_details | text | 0 | 否 | 否 | 维修详情 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
operating_parameters表: | |||||
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
operating_parameters_id | int | 11 | 是 | 是 | 运行参数ID |
equipment_model | varchar | 64 | 是 | 否 | 设备型号 |
equipment_name | varchar | 64 | 否 | 否 | 设备名称 |
equipment_type | varchar | 64 | 否 | 否 | 设备类型 |
operator | varchar | 64 | 否 | 否 | 操作人员 |
running_state_ | varchar | 64 | 否 | 否 | 运行状态 |
running_quantity | int | 11 | 否 | 否 | 运行数量 |
running_time | datetime | 0 | 否 | 否 | 运行时间 |
equipment_picture | varchar | 255 | 否 | 否 | 设备图片 |
operating_parameters | text | 0 | 否 | 否 | 运行参数 |
operation_details | text | 0 | 否 | 否 | 运行详情 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
equipment_warehousing表: | |||||
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
equipment_warehousing_id | int | 11 | 是 | 是 | 设备入库ID |
equipment_model | varchar | 64 | 否 | 否 | 设备型号 |
equipment_name | varchar | 64 | 否 | 否 | 设备名称 |
equipment_type | varchar | 64 | 否 | 否 | 设备类型 |
equipment_specification | varchar | 64 | 否 | 否 | 设备规格 |
warehousing_personnel | varchar | 64 | 否 | 否 | 入库人员 |
receipt_quantity | int | 11 | 否 | 否 | 入库数量 |
warehousing_time | datetime | 0 | 否 | 否 | 入库时间 |
equipment_picture | varchar | 255 | 否 | 否 | 设备图片 |
equipment_parameters | text | 0 | 否 | 否 | 设备参数 |
warehousing_remarks | text | 0 | 否 | 否 | 入库备注 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
equipment_ex_warehouse表: | |||||
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
equipment_ex_warehouse_id | int | 11 | 是 | 是 | 设备出库ID |
equipment_model | varchar | 64 | 否 | 否 | 设备型号 |
equipment_name | varchar | 64 | 否 | 否 | 设备名称 |
equipment_type | varchar | 64 | 否 | 否 | 设备类型 |
equipment_specification | varchar | 64 | 否 | 否 | 设备规格 |
ex_warehouse_personnel | varchar | 64 | 否 | 否 | 出库人员 |
outbound_quantity | int | 11 | 否 | 否 | 出库数量 |
delivery_time | datetime | 0 | 否 | 否 | 出库时间 |
equipment_picture | varchar | 255 | 否 | 否 | 设备图片 |
equipment_parameters | text | 0 | 否 | 否 | 设备参数 |
ex_warehouse_remarks | text | 0 | 否 | 否 | 出库备注 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
device_management表: | |||||
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
device_management_id | int | 11 | 是 | 是 | 设备管理ID |
equipment_model | varchar | 64 | 是 | 否 | 设备型号 |
equipment_name | varchar | 64 | 否 | 否 | 设备名称 |
equipment_type | varchar | 64 | 否 | 否 | 设备类型 |
number_of_equipment | int | 11 | 否 | 否 | 设备数量 |
equipment_specification | varchar | 64 | 否 | 否 | 设备规格 |
equipment_picture | varchar | 255 | 否 | 否 | 设备图片 |
equipment_parameters | text | 0 | 否 | 否 | 设备参数 |
device_details_ | text | 0 | 否 | 否 | 设备详情 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
Upload表: | |||||
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
upload_id | int | 11 | 是 | 是 | 上传ID |
name | varchar | 64 | 否 | 否 | 文件名 |
path | varchar | 255 | 否 | 否 | 访问路径 |
file | varchar | 255 | 否 | 否 | 文件路径 |
display | varchar | 255 | 否 | 否 | 显示顺序 |
father_id | int | 11 | 否 | 否 | 父级ID |
dir | varchar | 255 | 否 | 否 | 文件夹 |
type | varchar | 32 | 否 | 否 | 文件类型 |
Group表: | |||||
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
group_id | mediumint | 8 | 是 | 是 | 用户组ID |
display | smallint | 4 | 是 | 否 | 显示顺序 |
name | varchar | 16 | 是 | 否 | 名称 |
description | varchar | 255 | 否 | 否 | 描述 |
source_table | varchar | 255 | 否 | 否 | 来源表 |
source_field | varchar | 255 | 否 | 否 | 来源字段 |
source_id | int | 10 | 是 | 否 | 来源ID |
register | smallint | 1 | 否 | 否 | 注册位置 |
create_time | timestamp | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
3.4本章小结
整个农田灌溉设备管理系统的需求分析主要对系统总体架构以及功能模块的设计,通过建立E-R模型和数据库逻辑系统设计完成了数据库系统设计。
4农田灌溉设备管理系统 详细设计与实现
农田灌溉设备管理系统 的详细设计与实现主要是根据前面的 农田灌溉设备管理系统 的需求分析和 农田灌溉设备管理系统 的总体设计来设计页面并实现业务逻辑。主要从 农田灌溉设备管理系统 界面实现、业务逻辑实现这两部分进行介
系统的登录窗口是用户的入口,用户只有在登录成功后才可以进入访问。通过在登录提交表单,后台处理判断是否为合法用户,进行页面跳转,进入系统中去。
登录合法性判断过程:用户输入账号和密码后,系统首先确定输入输入数据合法性,然后在login.jsp页面发送登录请求,调用src下的mainctrl类的dopost方法来验证。
用户登录模块的IPO如下所示:
输入:用户名和密码。
处理:
1)检测用户输入的账号、密码是否正确及在数据库已对应存在。
2)从数据库中提取记录,并储存在本地的session中(timeout默认=30min)。
3)根据用户名,将其显示在系统首页上。
输出:是否成功的信息。
登录流程图如下所示。
图5-1登录流程图
系统登录界面如下所示。
图5-2系统登录界面
登录关键代码如下所示。
/**
* 登录
* @param data
* @param httpServletRequest
* @return
*/
@PostMapping("login")
public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
log.info("[执行登录接口]");
String username = data.get("username");
String email = data.get("email");
String phone = data.get("phone");
String password = data.get("password");
List resultList = null;
Map<String, String> map = new HashMap<>();
if(username != null && "".equals(username) == false){
map.put("username", username);
resultList = service.select(map, new HashMap<>()).getResultList();
}
else if(email != null && "".equals(email) == false){
map.put("email", email);
resultList = service.select(map, new HashMap<>()).getResultList();
}
else if(phone != null && "".equals(phone) == false){
map.put("phone", phone);
resultList = service.select(map, new HashMap<>()).getResultList();
}else{
return error(30000, "账号或密码不能为空");
}
if (resultList == null || password == null) {
return error(30000, "账号或密码不能为空");
}
//判断是否有这个用户
if (resultList.size()<=0){
return error(30000,"用户不存在");
}
User byUsername = (User) resultList.get(0);
Map<String, String> groupMap = new HashMap<>();
groupMap.put("name",byUsername.getUserGroup());
List groupList = userGroupService.select(groupMap, new HashMap<>()).getResultList();
if (groupList.size()<1){
return error(30000,"用户组不存在");
}
UserGroup userGroup = (UserGroup) groupList.get(0);
//查询用户审核状态
if (!StringUtils.isEmpty(userGroup.getSourceTable())){
String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();
String res = String.valueOf(service.runCountSql(sql).getSingleResult());
if (res==null){
return error(30000,"用户不存在");
}
if (!res.equals("已通过")){
return error(30000,"该用户审核未通过");
}
}
//查询用户状态
if (byUsername.getState()!=1){
return error(30000,"用户非可用状态,不能登录");
}
String md5password = service.encryption(password);
if (byUsername.getPassword().equals(md5password)) {
// 存储Token到数据库
AccessToken accessToken = new AccessToken();
accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
accessToken.setUser_id(byUsername.getUserId());
tokenService.save(accessToken);
// 返回用户信息
JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));
user.put("token", accessToken.getToken());
JSONObject ret = new JSONObject();
ret.put("obj",user);
return success(ret);
} else {
return error(30000, "账号或密码不正确");
}
}
管理员在yhzhgl查看管理员信息,先使用sql语句查询出所有管理员表的数据,然后调用PageManager.getPages(url,4,sql, request ),返回一个ArrayList的对象,在for循环里,使用Java得到每个ArrayList对象的数据,在jsp页面中解析ArrayList对象,得到其各个键值对的值。
管理员管理界面如下图所示。
图5-3管理员管理界面
管理员管理关键代码如下所示。
public String encryption(String plainText) {
String re_md5 = new String();
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(plainText.getBytes());
byte b[] = md.digest();
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
re_md5 = buf.toString();
} catch (Exception e) {
e.printStackTrace();
}
return re_md5;
}
添加设备信息时,输入必填字段后,表现层的YifangController接受传过来的设备信息参数,再调用YifangController类的addYifang方法,经过YifangService业务层到YifangMapper持久层的处理,完成对整个添加设备信息的操作。addYifang方法也和用户管理中的addUser方法类似,同时做添加和修改工作。
修改设备信息时,选择需要修改的设备进行修改,调用YifangController控制器的editYifang方法,拿到该设备原本的信息并显示到页面,管理员再对需要修改的设备信息字段进行修改,完成后调用addYifang方法,调用业务层的updateByKey方法,更新数据库的设备信息表的数据。
设备管理流程图如下所示。
图5-4设备管理流程图
设备添加界面如下图所示。
图5-5设备添加界面
设备查询界面如下图所示。
图5-6设备查询界面
设备管理关键代码如下所示。
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
service.insert(service.readBody(request.getReader()));
return success(1);
}
@Transactional
public Map<String, Object> addMap(Map<String,Object> map){
service.insert(map);
return success(1);
}
public Map<String,Object> readBody(BufferedReader reader){
BufferedReader br = null;
StringBuilder sb = new StringBuilder("");
try{
br = reader;
String str;
while ((str = br.readLine()) != null){
sb.append(str);
}
br.close();
String json = sb.toString();
return JSONObject.parseObject(json, Map.class);
}catch (IOException e){
e.printStackTrace();
}finally{
if (null != br){
try{
br.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
return null;
}
public void insert(Map<String,Object> body){
StringBuffer sql = new StringBuffer("INSERT INTO ");
sql.append("`").append(table).append("`").append(" (");
for (Map.Entry<String,Object> entry:body.entrySet()){
sql.append("`"+humpToLine(entry.getKey())+"`").append(",");
}
sql.deleteCharAt(sql.length()-1);
sql.append(") VALUES (");
for (Map.Entry<String,Object> entry:body.entrySet()){
Object value = entry.getValue();
if (value instanceof String){
sql.append("'").append(entry.getValue()).append("'").append(",");
}else {
sql.append(entry.getValue()).append(",");
}
}
sql.deleteCharAt(sql.length() - 1);
sql.append(")");
log.info("[{}] - 插入操作:{}",table,sql);
Query query = runCountSql(sql.toString());
query.executeUpdate();
}
4.4设备入库管理模块
删除设备入库时,选择需要删除的设备进行删除,把主键的uId传到HetongController控制器,再调用控制器的deleteHetong方法,数据经过HetongService业务层解析和处理,请求HetongMapper持久层调用deleteByPrimaryKey方法操作数据库将设备入库数据从数据库中删除。
查找设备入库时,输入需要查找的设备入库名,调用getData方法获取所有数据并且进行分页,把获取到的所有数据显示到视图上,这时候只需要用脚本方法便能快速查找,不涉及对数据库操作。
设备入库管理流程图如下所示。
图5-7设备入库管理流程图
设备入库添加界面如下图所示。
图5-8设备入库添加界面
设备入库管理关键代码如下所示。
@RequestMapping(value = "/del")
@Transactional
public Map<String, Object> del(HttpServletRequest request) {
service.delete(service.readQuery(request), service.readConfig(request));
return success(1);
}
@Transactional
public void delete(Map<String,String> query,Map<String,String> config){
StringBuffer sql = new StringBuffer("DELETE FROM ").append("`").append(table).append("`").append(" ");
sql.append(toWhereSql(query, "0".equals(config.get(FindConfig.GROUP_BY))));
log.info("[{}] - 删除操作:{}",table,sql);
Query query1 = runCountSql(sql.toString());
query1.executeUpdate();
}
4.5检修维护管理模块
管理员选择添加检修维护,管理员在yifang_list查看检修维护,点击检修维护,跳转至zijinshoufu_add.Java,添加检修维护记录则将添加的检修维护记录数据封装在HashMap中,然后调用CommDAO的insert方法将检修维护记录内容插入检修维护记录表中。
检修维护管理流程图如下所示。
图5-9检修维护管理流程图
检修维护添加界面如下图所示。
图5-10检修维护添加界面
检修维护管理关键代码如下所示。
@PostMapping("/set")
@Transactional
public Map<String, Object> set(HttpServletRequest request) throws IOException {
service.update(service.readQuery(request), service.readConfig(request), service.readBody(request.getReader()));
return success(1);
}
public Map<String,String> readConfig(HttpServletRequest request){
Map<String,String> map = new HashMap<>();
map.put(FindConfig.PAGE,request.getParameter(FindConfig.PAGE));
map.put(FindConfig.SIZE,request.getParameter(FindConfig.SIZE));
map.put(FindConfig.LIKE,request.getParameter(FindConfig.LIKE));
map.put(FindConfig.ORDER_BY,request.getParameter(FindConfig.ORDER_BY));
map.put(FindConfig.FIELD,request.getParameter(FindConfig.FIELD));
map.put(FindConfig.GROUP_BY,request.getParameter(FindConfig.GROUP_BY));
map.put(FindConfig.MAX_,request.getParameter(FindConfig.MAX_));
map.put(FindConfig.MIN_,request.getParameter(FindConfig.MIN_));
return map;
}
public Map<String,String> readQuery(HttpServletRequest request){
String queryString = request.getQueryString();
if (queryString != null && !"".equals(queryString)) {
String[] querys = queryString.split("&");
Map<String, String> map = new HashMap<>();
for (String query : querys) {
String[] q = query.split("=");
map.put(q[0], q[1]);
}
map.remove(FindConfig.PAGE);
map.remove(FindConfig.SIZE);
map.remove(FindConfig.LIKE);
map.remove(FindConfig.ORDER_BY);
map.remove(FindConfig.FIELD);
map.remove(FindConfig.GROUP_BY);
map.remove(FindConfig.MAX_);
map.remove(FindConfig.MIN_);
return map;
}else {
return new HashMap<>();
}
}
@Transactional
public void update(Map<String,String> query,Map<String,String> config,Map<String,Object> body){
StringBuffer sql = new StringBuffer("UPDATE ").append("`").append(table).append("`").append(" SET ");
for (Map.Entry<String,Object> entry:body.entrySet()){
Object value = entry.getValue();
if (value instanceof String){
sql.append("`"+humpToLine(entry.getKey())+"`").append("=").append("'").append(value).append("'").append(",");
}else {
sql.append("`"+humpToLine(entry.getKey())+"`").append("=").append(value).append(",");
}
}
sql.deleteCharAt(sql.length()-1);
sql.append(toWhereSql(query,"0".equals(config.get(FindConfig.LIKE))));
log.info("[{}] - 更新操作:{}",table,sql);
Query query1 = runCountSql(sql.toString());
query1.executeUpdate();
}
public String toWhereSql(Map<String,String> query, Boolean like) {
if (query.size() > 0) {
try {
StringBuilder sql = new StringBuilder(" WHERE ");
for (Map.Entry<String, String> entry : query.entrySet()) {
if (entry.getKey().contains(FindConfig.MIN_)) {
String min = humpToLine(entry.getKey()).replace("_min", "");
sql.append("`"+min+"`").append(" >= '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("' and ");
continue;
}
if (entry.getKey().contains(FindConfig.MAX_)) {
String max = humpToLine(entry.getKey()).replace("_max", "");
sql.append("`"+max+"`").append(" <= '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("' and ");
continue;
}
if (like == true) {
sql.append("`"+humpToLine(entry.getKey())+"`").append(" LIKE '%").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("%'").append(" and ");
} else {
sql.append("`"+humpToLine(entry.getKey())+"`").append(" = '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("'").append(" and ");
}
}
sql.delete(sql.length() - 4, sql.length());
sql.append(" ");
return sql.toString();
} catch (UnsupportedEncodingException e) {
log.info("拼接sql 失败:{}", e.getMessage());
}
}
return "";
用户点击登录填写账号信息登录后,会切换内容为“某某用户欢迎您”和历史订单,并给出注销链接。当用户登录成功后会将个人信息保存在session作用域中,点击自己的用户名时,会跳转到个人详细信息页面,由后台通过Freemarker取出session作用域中的用户信息进行动态渲染,例如,邮箱、电话号码、用户名等等。同时页面上会显示修改个人信息和修改密码的按钮,这时客户可以修改自己的登录密码以保障账号的安全性,防止被人窃取账号,通过UserController.java的updatePassword()实现,同时也可以根据自己的个人信息是否变动做出相应的修改,通过updateUserInfo()实现。
密码修改流程图如下所示。
图5-11密码修改流程图
个人信息界面如下图所示。
图5-12个人信息界面图
修改密码界面如下图所示。
图5-13修改密码界面图
修改密码逻辑代码如下所示。
/**
* 修改密码
* @param data
* @param request
* @return
*/
@PostMapping("change_password")
public Map<String, Object> change_password(@RequestBody Map<String, String> data, HttpServletRequest request){
// 根据Token获取UserId
String token = request.getHeader("x-auth-token");
Integer userId = tokenGetUserId(token);
// 根据UserId和旧密码获取用户
Map<String, String> query = new HashMap<>();
String o_password = data.get("o_password");
query.put("user_id" ,String.valueOf(userId));
query.put("password" ,service.encryption(o_password));
Query ret = service.count(query, service.readConfig(request));
List list = ret.getResultList();
Object s = list.get(0);
int count = Integer.parseInt(list.get(0).toString());
if(count > 0){
// 修改密码
Map<String,Object> form = new HashMap<>();
form.put("password",service.encryption(data.get("password")));
service.update(query,service.readConfig(request),form);
return success(1);
}
return error(10000,"密码修改失败!");
}
5系统测试
系统开发到了最后一个阶段那就是系统测试,系统测试对软件的开发其实是非常有必要的。因为没什么系统一经开发出来就可能会尽善尽美,再厉害的系统开发工程师也会在系统开发的时候出现纰漏,系统测试能够较好的改正一些bug,为后期系统的维护性提供很好的支持。通过系统测试,开发人员也可以建立自己对系统的信心,为后期的系统版本的跟新提供支持。
系统测试包括:设备展示功能测试、设备添加、设备搜索、密码修改功能测试,如表5-1、5-2、5-3、5-4所示:
表5-1 设备查看功能测试表
用例名称 | 设备查看 |
目的 | 测试设备查看功能 |
前提 | 用户登录 |
测试流程 | 点击设备列表 |
预期结果 | 可以查看到所有设备信息 |
实际结果 | 实际结果与预期结果一致 |
管理员添加设备界面测试:
表5-2管理员添加设备界面测试表
用例名称 | 设备发布测试用例 |
目的 | 测试设备发布功能 |
前提 | 用户正常登录情况下 |
测试流程 | 1)点击设备信息管理就,然后点击添加后并填写信息。 2)点击进行提交。 |
预期结果 | 提交以后,页面首页会显示新的设备信息 |
实际结果 | 实际结果与预期结果一致 |
设备搜索功能测试:
表5-3设备搜索功能测试表
用例名称 | 设备搜索测试 |
目的 | 测试设备搜索功能 |
前提 | 无 |
测试流程 | 1)在搜索框填入搜索关键字。 2)点击搜索按钮。 |
预期结果 | 页面显示包含有搜索关键字的设备 |
实际结果 | 实际结果与预期结果一致 |
密码修改功能测试:
表5-4密码修改功能测试表
用例名称 | 密码修改测试用例 |
目的 | 测试管理员密码修改功能 |
前提 | 管理员用户正常登录情况下 |
测试流程 | 1)管理员密码修改并完成填写。 2)点击进行提交。 |
预期结果 | 使用新的密码可以登录 |
实际结果 | 实际结果与预期结果一致 |
通过编写 农田灌溉设备管理系统的测试用例,已经检测完毕设备查看模块、设备添加模块、设备搜索模块、密码修改功能测试,通过这4大模块为农田灌溉设备管理系统的后期推广运营提供了强力的技术支撑。
至此,农田灌溉设备管理系统已经结束,在开发前做了许多的准备,在本系统的设计和开发过程中阅览和学习了许多文献资料,从中我也收获了很多宝贵的方法和设计思路,对系统的开发也起到了很重要的作用,系统的开发技术选用的都是自己比较熟悉的,比如Web、springboot技术、MYSQL,这些技术都是在以前的学习中学到了,其中许多的设计思路和方法都是在以前不断地学习中摸索出来的经验,其实对于我们来说工作量还是比较大的,但是正是由于之前的积累与准备,才能顺利的完成这个项目,由此看来,积累经验跟做好准备是十分重要的事情。
当然在该系统的设计与实现的过程中也离不开老师以及同学们的帮助,正是因为他们的指导与帮助,我才能够成功的在预期内完成了这个系统。同时在这个过程当中我也收获了很多东西,此系统也有需要改进的地方,但是由于专业知识的浅薄,并不能做到十分完美,希望以后有机会可以让其真正的投入到使用之中。
[1]吴昊鹏,班剑锋,李建华.一种基于MR的电解槽设备辅助管理系统的实现方法[J].机械与电子,2022,40(03):40-44.
[2]陆昕,苏立清,曹耀兵. 一种数据处理的方法、多云管理系统以及相关设备[P]. 广东省:CN112104697B,2022-03-04.
[3]张诚,张杰,吴智晖,张斌.浅谈天然气净化厂设备综合管理系统应用及发展趋势[J].中国设备工程,2022(04):82-83.
[4]孙存虎.基于物联网的机械设备安全管理系统研究[J].河南科技,2022,41(04):21-24.DOI:10.19968/j.cnki.hnkj.1003-5168.2022.04.004.
[5]李博.基于物联网的设备停机管理系统设计及实现[J].物联网技术,2022,12(02):86-88.DOI:10.16667/j.issn.2095-1302.2022.02.023.
[6]张楠,何敏,孙有恒,郭雪卿,胡振中.基于BIM的地铁施工设备物资精细化管理系统[J/OL].施工技术(中英文):1-7[2022-03-30].http://kns.cnki.net/kcms/detail/10.1768.TU.20220210.1624.002.html
[7]熊柏祥.基于Springboot和Vue框架的考试资源服务平台的设计与实现[J].信息与电脑(理论版),2022,34(01):97-99+103.
[8]毛烁. 镭立设备管理系统助力生产经营企业“降本增效”[N]. 中国信息化周报,2021-12-06(017).DOI:10.28189/n.cnki.ndnjy.2021.000570.
[9]郑文国,安剑奇,董文佳,尹枫,岑延卓. 基于B/S网络架构的设备加工型企业管理系统的研究与实现[C]//.2021中国自动化大会论文集.,2021:162-166.DOI:10.26914/c.cnkihy.2021.053498.
[10]喻佳,吴丹新.基于SpringBoot的Web快速开发框架[J].电脑编程技巧与维护,2021(09):31-33.DOI:10.16184/j.cnki.comprg.2021.09.013.
[11]巢晟盛.基于SpringBoot微服务架构下前后端分离的MVVM模型浅析[J].电脑知识与技术,2021,17(23):128-129+141.DOI:10.14004/j.cnki.ckt.2021.2412.
[12]赵志威,张生月,蒋应举,屠晓光.基于SpringBoot的高新技术企业创新能力评价平台设计与实现[J].现代信息科技,2021,5(15):40-42.DOI:10.19850/j.cnki.2096-4706.2021.15.011.
[13]向福川,方玉,刘浪,唐振云,练瑶.基于SpringBoot+Vue框架的协同育才系统设计与开发[J].现代信息科技,2021,5(14):5-7+12.DOI:10.19850/j.cnki.2096-4706.2021.14.002.
[14]崔灿. 预防性维护设备管理系统研究[D].湖北工业大学,2021.DOI:10.27131/d.cnki.ghugc.2021.000447.
[15]鲁文行. 基于组态软件的印刷包装设备监控管理系统研究[D].西安理工大学,2021.DOI:10.27398/d.cnki.gxalu.2021.001270.
[16]Fuyuan Cheng. Talent Recruitment Management System for Small and Micro Enterprises Based on Springboot Framework[J]. Advances in Educational Technology and Psychology,2021,5(2).
[17]方璐, 云智实验设备管理系统. 河南省,泛锐云智科技,2021-02-01.
[18]Jian Chen,Chen Jian,Pan Hailan. Design of Man Hour Management Information System on SpringBoot Framework[J]. Journal of Physics: Conference Series,2020,1646(1).
[19]GB/T 37693-2019, 信息技术 基于感知设备的工业设备点检管理系统总体架构[S].
[20]Zhao Xiaoxu. Application of spacecraft manufacturing equipment management system[P]. Beijing Institute of Spacecraft Environment Engineering (China);South China Univ. of Technology (China);Guangdong Academy of International Academic Exchange (China),2021.
致 谢
逝者如斯夫,不舍昼夜。转眼间,大用户用户活便已经接近尾声,人面对着离别与结束,总是充满着不舍与茫然,我亦如此,仍记得那年秋天,我迫不及待的提前一天到了学校,面对学校巍峨的大门,我心里充满了期待:这里,就是我新生活的起点吗?那天,阳光明媚,学校的欢迎仪式很热烈,我面对着一个个对着我微笑的同学,仿佛一缕缕阳光透过胸口照进了我心里,同时,在那天我认识可爱的室友,我们携手共同度过了这难忘的两年。如今,我望着这篇论文的致谢,不禁又要问自己:现在,我们就要说再见了吗?
感慨莫名,不知所言。遥想当初刚来学校的时候,心里总是想着工科学校会过于板正,会缺乏一些柔情,当时心里甚至有一点点排斥,但是随着我对学校的慢慢认识与了解,我才认识到了她的美丽,她的柔情,并且慢慢的喜欢上了这个校园,但是时间太快了,快到我还没有好好体会她的美丽便要离开了,但是她带给我的回忆,永远不会离开我,也许真正离开那天我的眼里会满含泪水,我不是因为难过,我只是想将她的样子映在我的泪水里,刻在我的心里。最后,感谢我的老师们,是你们教授了我们知识与做人的道理;感谢我的室友们,是你们陪伴了我如此之久;感谢每位关心与支持我的人。
少年,追风赶月莫停留,平荒尽处是春山。
免费领取项目源码,请关注点赞+私聊