(附源码)springboot农田灌溉设备管理系统 毕业设计 260931

news2024/11/19 21:20:21

题    目 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.1 可行性分析

(1)经济可行性:

在项目上使用的工具大部分都是是当下流行开源免费的,所以在开发前期,开发时用于项目的经费将会大大降低,不会让开发该软件在项目启动期受到经费的影响,所以经济上还是可行的。尽量用最少的花费去满足用户的需求。省下经费用于人工费,以及设备费用。将在无纸化,高效率的道路上越走越远。

所以经济可行性没有问题。

(2)操作可行性:

此次项目设计参考了几个该模式下网站的开发案例,对他们的操作界面分析,将众多案例结合在一起,突出以人为本简化操作,所以具有基本计算机知识的人都会操作本项目。

因此操作可行性也没有问题。

(3)技术可行性:

技术可行性指的是对于搭建框架的可行性,以及有更优秀的技术出现时系统的技术更新换代的纳新性如何,开发时间成本费用比如何。

现有的springboot技术能够迎合所有电子商务系统的搭建。开发这个农田灌溉设备管理系统的时候我采用了springboot+MYSQL用以运行整体程序。

综上所述技术可行性也没有问题。

(4)法律可行性:

从开发者角度来看,springboot和MYSQL是网上开源且免费的,在知识产权方面不会产生任何法律纠纷。

从用户使用角度来看,只要不再系统上贩卖违禁品,对系统做出条约协议,杜绝非法支付即可。

综上所述法律可行性也没有问题。

2.2系统流程分析

业务流程是用一些特定的符合和线条来进行演示用户在使用系统时的过程,在进行系统分析的时候,业务流程可以帮助开发人员更好的理解业务,发现错误,完善系统。

2.2.1 数据增加流程

用户成功登入系统后能够实现增加数据的操作,增加数据的编号是特定的,系统生成,用户不能随意填写,除了编号以外,其他增加信息用户自己填写,填写后的信息经过系统验证,验证合法通过就显示增加数据成功了,相反的话,就没有增加成功,图2-1显示的就是在增加数据时的流程。

 

图2-1  数据增加流程图

2.2.2 数据修改流程

数据修改时的流程和上面介绍的数据增加时的流程差不多,如图2-2所示。

 

图2-2  数据修改流程图

2.2.3 数据删除流程

如果系统里面存在一些没有用的数据的话相关的管理人员还可以对这些数据进行删除,图2-3就是数据删除时的流程图。

 

 

图2-3  数据删除流程图

2.3 系统功能分析

2.3.1 功能性分析

按照农田灌溉设备管理系统的角色,我划分为了管理员管理模块这一大部分。

管理员管理模块:

(1)用户管理:管理员可以对管理员信息进行管控。

(2)设备管理:管理员在后台可以对农田灌溉设备管理系统中显示的设备信息进行增删改查。

(3)设备入库管理:管理员可以对农田灌溉设备管理系统设备入库进行管控。

(4)设备出库管理:在“设备出库”这一菜单下,可以对管理人员操作的设备出库进行管控。

(5)运行参数管理:管理员在可以对农田灌溉设备管理系统中显示的运行参数信息进行增删改查。

(6)检修维护管理:管理员在可以对农田灌溉设备管理系统中显示的检修维护信息进行增删改查。

2.3.2 非功能性分析

 农田灌溉设备管理系统的非功能性需求比如 农田灌溉设备管理系统的安全性怎么样,可靠性怎么样,性能怎么样,可拓展性怎么样等。具体可以表示在如下3-1表格中:

3-1 农田灌溉设备管理系统非功能需求表

安全性

主要指 农田灌溉设备管理系统数据库的安装,数据库的使用和密码的设定必须合乎规范。

可靠性

可靠性是指 农田灌溉设备管理系统能够安装用户的指示进行操作,经过测试,可靠性90%以上。

性能

性能是影响 农田灌溉设备管理系统占据市场的必要条件,所以性能最好要佳才好。

可扩展性

比如数据库预留多个属性,比如接口的使用等确保了系统的非功能性需求。

易用性

用户只要跟着 农田灌溉设备管理系统 的页面展示内容进行操作,就可以了。

可维护性

 农田灌溉设备管理系统 开发的可维护性是非常重要的,经过测试,可维护性没有问题

2.4 系统用例分析

web后台管理上的管理员是维护整个农田灌溉设备管理系统中所有数据信息的。管理员角色用例如图2-3所示。

 

图2-3农田灌溉设备管理系统管理员角色用例图

2.5本章小结

本章主要通过对农田灌溉设备管理系统的可行性分析、流程分析、功能需求分析、系统用例分析,确定整个农田灌溉设备管理系统要实现的功能。同时也为农田灌溉设备管理系统的代码实现和测试提供了标准。

3  农田灌溉设备管理系统 总体设计

本章主要讨论的内容包括农田灌溉设备管理系统的功能模块设计、数据库系统设计。

3.1 系统架构设计

本 农田灌溉设备管理系统从架构上分为三层:表现层(UI)、业务逻辑层(BLL)以及数据层(DL)。

图3-1 农田灌溉设备管理系统系统架构设计图

 

表现层(UI):又称UI层,主要完成本 农田灌溉设备管理系统的UI交互功能,一个良好的UI可以打打提高用户的用户体验,增强用户使用本 农田灌溉设备管理系统 时的舒适度。UI的界面设计也要适应不同版本的 农田灌溉设备管理系统 以及不同尺寸的分辨率,以做到良好的兼容性。UI交互功能要求合理,用户进行交互操作时必须要得到与之相符的交互结果,这就要求表现层要与业务逻辑层进行良好的对接。

业务逻辑层(BLL):主要完成本 农田灌溉设备管理系统 的数据处理功能。用户从表现层传输过来的数据经过业务逻辑层进行处理交付给数据层,系统从数据层读取的数据经过业务逻辑层进行处理交付给表现层。

数据层(DL):由于本 农田灌溉设备管理系统 的数据是放在服务端的mysql数据库中,因此本属于服务层的部分可以直接整合在业务逻辑层中,所以数据层中只有数据库,其主要完成本 农田灌溉设备管理系统 的数据存储和管理功能。

3.2 系统功能模块设计

3.2.1整体功能模块设计

在上一章节中主要对系统的功能性需求和非功能性需求进行分析,并且根据需求分析了本农田灌溉设备管理系统中的用例。那么接下来就要开始对本农田灌溉设备管理系统的架构、主要功能和数据库开始进行设计。农田灌溉设备管理系统根据前面章节的需求分析得出,其总体设计模块图如图3-2所示。

图3-2  农田灌溉设备管理系统功能模块图

 

3.2.2设备管理模块设计

后台管理者能够实现对后台设备管理增删改查操作,设备管理模块结构图如下图:

 

图3-3设备管理模块结构图

3.2.3检修维护管理模块设计

后台管理者能够实现对后台检修维护管理增删改查操作,检修维护管理模块结构图如下图:

 

图3-4检修维护管理模块结构图

3.3 数据库设计

数据库设计一般包括需求分析、概念模型设计、数据库表建立三大过程,其中需求分析前面章节已经阐述,概念模型设计有概念模型和逻辑结构设计两部分。

3.3.1 数据库概念结构设计

下面是整个农田灌溉设备管理系统中主要的数据库表总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关系图

3.3.2 数据库逻辑结构设计

通过上一小节中 农田灌溉设备管理系统中总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农田灌溉设备管理系统 详细设计与实现

 农田灌溉设备管理系统 的详细设计与实现主要是根据前面的 农田灌溉设备管理系统 的需求分析和 农田灌溉设备管理系统 的总体设计来设计页面并实现业务逻辑。主要从 农田灌溉设备管理系统 界面实现、业务逻辑实现这两部分进行介

4.1登录模块的实现

系统的登录窗口是用户的入口,用户只有在登录成功后才可以进入访问。通过在登录提交表单,后台处理判断是否为合法用户,进行页面跳转,进入系统中去。

登录合法性判断过程:用户输入账号和密码后,系统首先确定输入输入数据合法性,然后在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, "账号或密码不正确");

        }

}

4.2管理员管理模块

管理员在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;

    }

4.3设备管理模块

添加设备信息时,输入必填字段后,表现层的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 "";

    }

4.6个人资料模块

用户点击登录填写账号信息登录后,会切换内容为“某某用户欢迎您”和历史订单,并给出注销链接。当用户登录成功后会将个人信息保存在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系统测试

5.1系统测试的目的

系统开发到了最后一个阶段那就是系统测试,系统测试对软件的开发其实是非常有必要的。因为没什么系统一经开发出来就可能会尽善尽美,再厉害的系统开发工程师也会在系统开发的时候出现纰漏,系统测试能够较好的改正一些bug,为后期系统的维护性提供很好的支持。通过系统测试,开发人员也可以建立自己对系统的信心,为后期的系统版本的跟新提供支持。

5.2 系统测试用例

系统测试包括:设备展示功能测试、设备添加、设备搜索、密码修改功能测试,如表5-1、5-2、5-3、5-4所示:

设备查看功能测试:

表5-1 设备查看功能测试表

用例名称

设备查看

目的

测试设备查看功能

前提

用户登录

测试流程

点击设备列表

预期结果

可以查看到所有设备信息

实际结果

实际结果与预期结果一致

管理员添加设备界面测试:

表5-2管理员添加设备界面测试表

用例名称

设备发布测试用例

目的

测试设备发布功能

前提

用户正常登录情况下

测试流程

1)点击设备信息管理就,然后点击添加后并填写信息。

2)点击进行提交。

预期结果

提交以后,页面首页会显示新的设备信息 

实际结果

实际结果与预期结果一致

设备搜索功能测试:

表5-3设备搜索功能测试表

用例名称

设备搜索测试

目的

测试设备搜索功能

前提

测试流程

1)在搜索框填入搜索关键字。

2)点击搜索按钮。

预期结果

页面显示包含有搜索关键字的设备

实际结果

实际结果与预期结果一致

密码修改功能测试:

表5-4密码修改功能测试表

用例名称

密码修改测试用例

目的

测试管理员密码修改功能

前提

管理员用户正常登录情况下

测试流程

1)管理员密码修改并完成填写。

2)点击进行提交。

预期结果

使用新的密码可以登录

实际结果

实际结果与预期结果一致

5.3 系统测试结果

通过编写 农田灌溉设备管理系统的测试用例,已经检测完毕设备查看模块、设备添加模块、设备搜索模块、密码修改功能测试,通过这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.

致  谢

逝者如斯夫,不舍昼夜。转眼间,大用户用户活便已经接近尾声,人面对着离别与结束,总是充满着不舍与茫然,我亦如此,仍记得那年秋天,我迫不及待的提前一天到了学校,面对学校巍峨的大门,我心里充满了期待:这里,就是我新生活的起点吗?那天,阳光明媚,学校的欢迎仪式很热烈,我面对着一个个对着我微笑的同学,仿佛一缕缕阳光透过胸口照进了我心里,同时,在那天我认识可爱的室友,我们携手共同度过了这难忘的两年。如今,我望着这篇论文的致谢,不禁又要问自己:现在,我们就要说再见了吗?

感慨莫名,不知所言。遥想当初刚来学校的时候,心里总是想着工科学校会过于板正,会缺乏一些柔情,当时心里甚至有一点点排斥,但是随着我对学校的慢慢认识与了解,我才认识到了她的美丽,她的柔情,并且慢慢的喜欢上了这个校园,但是时间太快了,快到我还没有好好体会她的美丽便要离开了,但是她带给我的回忆,永远不会离开我,也许真正离开那天我的眼里会满含泪水,我不是因为难过,我只是想将她的样子映在我的泪水里,刻在我的心里。最后,感谢我的老师们,是你们教授了我们知识与做人的道理;感谢我的室友们,是你们陪伴了我如此之久;感谢每位关心与支持我的人。

少年,追风赶月莫停留,平荒尽处是春山。

免费领取项目源码,请关注点赞+私聊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/62630.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

强的离谱!阿里人用五个模块讲明白了SpringCloud,已开源!

微服务 作为一名Java程序员如果你对微服务不了解&#xff0c;就会在学习或者使用的过程中觉得有点“晕”。微服务是一种面向服务的软件架构模式&#xff01; 我们常说&#xff0c;架构设计的核心是满足降本增效。该怎么理解&#xff1f; 举个例子&#xff0c;微服务架构之所…

简单学校网页设计作业 静态HTML校园博客主页 DW大学网站模板下载 大学生简单我的学校网页作品代码 个人网页制作 学生个人网页设计作业

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

[附源码]计算机毕业设计JAVA疫苗接种管理系统

[附源码]计算机毕业设计JAVA疫苗接种管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

AIGC的一些材料

概念和前景 先看亚马逊AWS给AIGC的定义。 AIGC 是什么_亚马逊云科技 AIGC 解决方案 它有多个模态分支&#xff0c;但大同小异。 Diffusion预训练成本降低6.5倍&#xff0c;微调硬件成本降低7倍&#xff01;Colossal-AI完整开源方案低成本加速AIGC产业落地 背景 1.01亿美元融资…

Java项目:SSM电器商城系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录…

低功耗局域网通信硬件之lora——sx1262-sx1276硬件设计开发

1.lora简介 LoRa是semtech公司开发的一种低功耗局域网无线标准&#xff0c;其名称“LoRa”是远距离无线电&#xff08;Long Range Radio&#xff09;&#xff0c;它最大特点就是在同样的功耗条件下比其他无线方式传播的距离更远&#xff0c;实现了低功耗和远距离的统一&#x…

浅谈ES标准的演变

ECMAScript从1997年第一版诞生依赖&#xff0c;经过无数人的“踩坑”和“填坑”&#xff0c;到现在&#xff0c;ES12呼之欲出。那么我们不妨讨论一下ES的发展历程&#xff0c;看它如何统一江湖&#xff0c;看它“曲折”而又令人期待的发展之路。 最近分析typescript&#xff0c…

双机互备是什么意思?双机互备就是双机热备吗?

看到不少小伙伴在问&#xff0c;双机互备是什么意思&#xff1f;双机互备就是双机热备吗&#xff1f;今天我们就来一起简单了解了解吧&#xff01; 双机互备是什么意思&#xff1f;双机互备就是双机热备吗&#xff1f; 双机互备是指在双机热备的基础上&#xff0c;两个相对独…

【AI数学】余弦相似性(含python实现)

Cosine Similarity&#xff0c;即余弦相似度&#xff0c;又叫余弦相似性。是一个中学数学的概念&#xff0c;即用两个向量之间的夹角余弦值代表这两个向量之间的相似度。 Cosine Similarity虽然简单&#xff0c;但广泛应用在AI模型中&#xff0c;比如CLIP计算图像embedding和文…

【KCP】UDP可靠性传输

1 如何做到可靠性传输 ◼ ACK机制 ◼ 重传机制 ◼ 序号机制 3 2 1 -》2 3 1 ◼ 重排机制 2 3 1 ->3 2 1 ◼ 窗口机制 Tcp不用我们管 可靠性udp 5种机制都需要用户层处理 2 UDP与TCP&#xff0c;我们如何选择 3 UDP如何可靠&#xff0c;KCP协议在哪些方面有优势 以10%-20%…

Java人事管理系统oa人力人事办公(含源码+论文+答辩PPT等)

项目功能简介: 该项目采用技术JSP、Struts2、MyBatis、dwr、Tomcat服务器、MySQL数据库、项目含有源码、配套开发软件、软件安装教程、项目发布教程以及代码讲解教程 【项目使用技术&#xff1a;】Struts2MyBatisdwrjqueryjscss等技术 【技术特色】 文件上传&#xff1a; Strut…

Android依赖注入与Hilt的使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 基础知识 一、依赖注入是什么&#xff1f; 二.如果依赖注入这么简单&#xff0c;为什么需要专门开发一个框架&#xff1f; 三.安卓的依赖注入框架Dagger与Hilt 四.…

[附源码]计算机毕业设计基于Springboot甜品购物网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

如何恢复文件夹隐藏文件?超实用的2种技巧来了

案例&#xff1a;电脑中毒&#xff0c;文件夹数据自动隐藏&#xff0c;现在全都找不到了怎么办&#xff1f;——在日常办公使用电脑过程当中&#xff0c;总会遇到这样那样的问题&#xff0c;比如文件夹数据隐藏问题&#xff0c;当我们需要这些数据时如何恢复正常呢&#xff1f;…

java计算机毕业设计ssm图书馆管理系统z3z90(附源码、数据库)

java计算机毕业设计ssm图书馆管理系统z3z90&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;…

[附源码]计算机毕业设计基于SpringBoot的疫苗接种管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

算法leetcode|19. 删除链表的倒数第 N 个结点(rust重拳出击)

文章目录19. 删除链表的倒数第 N 个结点&#xff1a;样例 1&#xff1a;样例 2&#xff1a;样例 3&#xff1a;提示&#xff1a;原题传送门&#xff1a;分析题解rustgocpythonjava19. 删除链表的倒数第 N 个结点&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结…

专享策略No.3 | 商品截面交易策略

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 『正文』 ˇ 大家好&#xff0c;2022松鼠俱乐部临近收官。前面发布了专享策略01V3 | 小短波策略&#xff0c;专享策略No.2 | 套利策略-自动换仓-出场加速。今天我们交付第三个专享策略&#xff1a;商品…

C语言—详解库函数中常用的字符串函数

C语言中对字符和字符串的处理很是频繁&#xff0c;但是C语言本身是没有字符串类型的&#xff0c;字符串通常放在 常量字符串中或者字符数组中。字符串常量适用于那些对它不做修改的字符串函数。本篇文章为大家详解八个常用的字符串操作函数&#xff0c;同时我们尝试模拟实现该函…

OpenCV入门(C++/Python)-使用OpenCV裁剪图像(四)

裁剪是为了从图像中删除所有不需要的物体或区域。甚至突出显示图像的特定功能。 使用OpenCV裁剪没有特定的功能&#xff0c;NumPy数组切片是工作。读取的每个图像都存储在2D数组中&#xff08;对于每个颜色通道&#xff09;。只需指定要裁剪区域的高度和宽度&#xff08;以像素…