基于springboot智慧草场牛羊管理系统-计算机毕设【课程设计】50360

源码http://39.108.173.140:10001/products

基于springboot智慧草场牛羊管理系统

第一章 绪论

1.1 研究背景与意义

1.1.1 研究背景

  草场畜牧业正处在由粗放式经营向精细化管理转变的过程之中。传统的养殖方式中,牧畜的数量统计依靠人工清点,健康监测靠经验判断,环境调控没有数据支持,设备运行情况也不能及时了解。该种管理模式不能适应规模化养殖所带来的复杂程度提高,信息滞后造成决策失误会带来经济上的损失。物联网技术以及信息系统被引进到草场管理当中,给它带来了新的解决途径。胡智等人认为,智慧牧场用LoRa物联网技术建立的系统可以对牧场进行有效的监测,因此低功耗广域网适合于畜牧场的监控1。李志佳等通过智慧牧场管理系统实际应用发现,以数据为驱动的管理方式可以明显提高奶牛养殖的生产性能2。以上研究显示,信息技术同畜牧业的深度融合已经成为行业发展的主要趋向。开发一套专门用于草场牛羊管理的信息系统,把设备监控、牧畜追踪、环境感知、告警处置等业务环节纳入到一个统一平台上,这是技术发展的一种必然趋势,也是解决目前管理痛点的一种迫切需要。

1.1.2 研究意义

  本系统对于提高工作效率、优化资源配置有明显的作用。传统的纸质记录、口头传达方式存在信息传递慢、易出错的问题,而系统把业务操作变成数字化之后,信息传递的途径变短了。管理员可以在后台对用户的权限进行快速设置以及系统的参数进行修改,不需要逐个去操作各个业务模块。数据集中存储使得历史信息检索变得容易,减少重复录入的工作。从行业角度来说,该系统创建可以促使草场养殖标准化发展。不同的养殖场可以按照系统功能结构规范自身的管理流程,形成可以复制推广的信息化模板。系统中积累下来的设备运行数据、牧畜生长数据、环境变化数据可以用来支持之后的数据挖掘和决策优化工作,给行业提供有价值的研究样本。此种依照实际业务场景展开开发的系统模式,对于其它农业领域信息化创建也有着借鉴的价值。

1.2 国内外研究现状

1.2.1 国内现状

  国内有关智慧牧场的研究是从单个技术应用发展为综合管理平台的。早期的研究主要是对传感器数据采集、远程传输等基本功能的实现进行研究,剡宁等人设计的智慧牛舍养殖系统是该阶段技术特点的体现,利用物联网设备获取环境参数并传送到监控中心3。随着应用越来越深,研究者也把眼光从数据本身的价值挖掘和决策支持的研究上转移到了上面所述的方面上。许祯莹等对牛羊智慧养殖管理进行了研究,提出了一种包含饲喂、繁殖、健康管理等各个环节的综合方案4。党文婧用吸收能力理论来分析智慧牧场系统应用的效果,发现技术采纳过程中存在着组织学习的过程5。王与等人所设计的基于LoRa技术的溯源查询系统,把区块链的思想运用到畜产品追溯当中,从而完成了从养殖到餐桌全过程的信息记载工作6。张倩开发的牦牛牧场智慧管理平台就是地方特色畜牧品种信息化管理的一种尝试7。这些建立的研究一起促使国内智慧牧场领域由技术验证走向应用落地。

1.2.2 国外现状

  国外智慧农业发展是以平台化、生态化为特点的发展趋势。Simmons等人对温带牧场系统长期的观测研究发现,管理放牧策略会对土壤有机碳的积累产生可以量化的效应,该结论给牧场管理系统环境效益评价赋予了科学的根据8。Hong等人用雾计算架构创建了人工智能物联网环境下的智慧农场系统,把边缘计算节点加入到数据处理链路当中,削减了云端传输延迟9。Choi等人的研究显示,在智慧农场系统里种植的农作物可以被营养成分进行分析,从而证明了受控环境对于植物次生代谢产物的影响10。Jongho等人研制出一个面向智慧牧场的全混合日粮饲喂机器人自主系统,把自动化设备加入到养殖作业当中11。Gil等人的研究结果表明,在智慧农场中优化沼气燃料固体氧化物燃料电池的配置可以达到能源自给的目的12。国外的研究具有技术深挖的特点,由原来的单个功能实现发展为包含能源管理、自动化作业、环境影响评价等在内的综合方案。

1.3 主要研究内容

  本文的主要工作就是设计并实现一个草场牛羊管理系统。首先进行需求调研和分析,确定普通用户和管理员两种角色的功能边界,找出设备信息管理、牧畜信息管理、环境数据管理、告警记录管理等主要业务需求。在此基础上完成系统的总体架构设计,确定前端展示层、业务逻辑层、数据持久层三者之间的职责。数据库设计遵照规范化准则,创建起符合业务操作的表结构。编码实现阶段使用前后端分离的开发模式,后端用SpringBoot框架提供RESTful接口,前端用Vue框架构建用户界面。系统测试分为功能测试和流程测试,检验各个模块是否符合设计要求。本文主要研究业务逻辑的实现和用户交互的优化,不涉及底层物联网设备的硬件选择和通信协议的详细分析,相关内容属于硬件层面的工作。最终交付物有可以运行的系统程序、完整的数据库设计文档、详细的测试报告。

第二章 相关技术介绍

2.1 SpringBoot框架

  该框架是为了解决Spring生态系统对于简化配置的需要而产生的。传统的Spring应用开发要写大量的XML配置文件,项目搭建过程繁杂易出错。SpringBoot用约定优于配置的思想把常用的配置整合成起步依赖。框架内部嵌入了Servlet容器,将打包好的应用直接用Java命令启动。DispatcherServlet是处理用户请求的过滤器,它可以拦截用户的请求,然后分发到相应的控制器上。控制器方法执行完之后,视图解析器就会按照返回的逻辑名去寻找模板文件。框架有自动配置的功能,按照类路径中所包含的依赖库来自动推断出应该加载的配置类。数据访问层用JPA、MyBatis等ORM框架,利用接口完成对数据库的操作。该技术对于设备信息管理业务请求所进行的处理,会把前端传来的数据自动包装成Java对象。控制器层调用服务层的方法来完成业务逻辑处理之后,就会得到一个JSON格式的数据,这个数据会由HttpMessageConverter自动转换成HTTP响应体13。

2.2 Vue框架

  该前端框架使用MVVM设计模式,用数据驱动的方式更新页面视图。框架核心是响应式的,可以追踪到JavaScript对象的变化,从而触发视图的重新渲染。模板语法使用纯HTML,开发者用指令系统来声明式地把DOM元素绑定到底层数据上。组件系统把页面分成可以独立使用的单元,每一个组件都有模板、逻辑、样式。虚拟DOM技术减少直接操作真实DOM造成的性能开销,框架在内存里保存一棵节点树,用diff算法算出最小的更新集。路由管理使用的是Vue Router插件,当URL发生变化的时候,就会触发路由的匹配过程,然后调用对应的组件来完成渲染工作。Vuex给组件之间提供了一个集中的数据存储方式。牧畜信息管理界面14的表格数据和表单输入都是采用绑定到组件状态的方式来达到双向通信的目的。用户操作引起的数据变更,框架就会马上对视图进行更新。

2.3 MySQL数据库

  关系型数据库MySQL用表格的形式来组织数据,并且使用预定义的模式约束来保证存储结构的严谨性。数据库引擎层使用InnoDB和MyISAM等不同的存储方式,InnoDB有事务处理和外键约束的功能。查询处理包含解析、优化和执行这三个部分,解析器把SQL语句转成抽象语法树,优化器会比较不同索引路径的代价来挑选代价最小的执行计划。存储引擎使用B+树结构来组织索引数据,聚簇索引把数据行和主键值存在一起,辅助索引只保存主键值的副本。连接操作是在内存中创建哈希表或者使用嵌套循环算法来完成多表关联。事务管理遵守ACID原则,事务日志保存数据修改的操作,提交之后变更就会被持久化到磁盘上。设备状态及告警记录的存储备份要保证数据的一致性,数据库约束可以防止非法的数据写入。多用户并发访问时,行级锁机制可以减少由于锁竞争而造成的等待开销15。

2.4 MyBatis框架

  该持久层框架把SQL语句和Java代码分离开来进行管理。开发者将SQL定义在XML映射文件中,用命名空间和接口方法进行关联。框架启动的时候解析映射文件,用动态代理技术生成接口实现类。执行数据库操作时,SqlSession对象负责创建Statement并执行SQL。参数映射机制把Java对象的属性值填入SQL占位符中,结果映射机制把查询结果集转成Java对象。框架有两级缓存,一级缓存默认开启并且作用域是SqlSession级别。关联查询可以使用嵌套查询或者嵌套结果的方式进行,嵌套查询会执行多条SQL语句,嵌套结果则是一条连接查询得到所有的数据。环境数据查询统计场景中,框架可以支持开发者编写优化过的SQL语句来完成复杂的查询工作。延迟加载特性控制关联对象的加载时机,只有访问这个对象的时候才会执行额外的查询16。

第三章 系统分析

3.1 可行性分析

3.1.1 技术可行性

  系统使用SpringBoot框架构建后端服务,该框架内嵌了Tomcat容器,并且提供自动配置功能,从而简化了项目搭建的过程。前端采用Vue框架进行开发,使用组件化的方式使得界面的维护工作更加清楚。MySQL数据库可以满足业务数据的存储要求,InnoDB引擎可以实现事务的执行从而保证数据的一致性。前端使用HTTP协议调用后端接口,数据传输格式为JSON。以上技术栈在JavaWeb开发中已经有很多成功的案例,各个组件之间兼容性较好。开发环境使用的是IntelliJ IDEA集成工具,Navicat是数据库管理客户端,工具链完备成熟。现有的技术条件完全可以满足该系统从设计到实现的所有工作。

3.1.2 操作可行性

  系统针对两类用户群体来设计操作界面。普通用户从事日常业务数据的录入和查询工作,操作路径做了简化处理,主要功能入口放在导航栏显眼的位置。管理员用户负责系统配置、用户管理等事务,相应的操作界面采用表格加表单的布局方式。表单提交前做前端校验,不符合格式要求的数据会被拦截并给出提示。列表页面有搜索筛选组件,用户输入关键词就可以找到对应的记录。分页组件控制每页显示的数据量,防止过多的信息同时出现造成视觉负担。普通用户经过简单的培训就可以掌握基本的操作方法,管理员用户熟悉后台的管理流程之后就可以完成配置的工作。

3.1.3 经济可行性

  系统开发所需的软件工具均采用免费或社区版本,IntelliJ IDEA社区版、Visual Studio Code、MySQL Community Server、NavicatPremium试用版均可满足开发需求。开发人员可以用普通个人计算机进行编码、测试工作,不需要购买专门的服务器。系统部署阶段,SpringBoot打包得到的JAR文件可以直接运行在轻量级云服务器上,月租成本低。后续的运维工作是由现有的技术人员来完成,不需要再招聘专职人员。整体投入主要在开发阶段的人力成本上,运行期间的支出控制在合理的范围内,项目具有较好的经济效益。

3.2 功能需求分析

  UML用例图是用以描述系统的功能以及用户交互的一种建模工具,它用角色和用例之间的关系来表现系统在各种情况下所发生的行为。用例图可以清楚地表现出系统的边界,也可以看出外部的参与者和系统之间怎样相互作用。参与者代表不同的用户群体或者外部系统,用例体现系统所提供的一些功能或者服务。该图在需求分析阶段有很重要的作用,可以保证开发者不会漏掉重要的需求。用图形化的形式来表达用例图,有利于沟通和理解,给系统的设计和实现提供依据。本文将对系统按角色模块进行需求分析。

3.2.1 普通用户功能需求

  普通用户进入系统之后可以访问设备信息管理模块,查看设备列表并筛选出指定的设备,对设备的基本属性和运行参数进行补充或者修改。牧畜信息管理模块可以实现用户对牧畜进行档案录入、更新牧畜健康状况和位置信息、检索特定牧畜详细资料等功能。环境数据管理模块具有查询功能,用户可以按照时间段对采集到的数据进行筛选,从而得到温度、湿度等各项指标变化的趋势图。告警记录管理模块可以显示系统产生的告警记录,用户可以查看告警信息并跟踪处理进度。登录注册功能可以实现用户身份认证以及新账户创建的功能。普通用户用例图如下图3-1所示。

图3-1普通用户用例图

3.2.2 管理员功能需求

  管理员在普通用户的权限基础上又增加了系统用户管理权限。用户管理模块中管理员可以创建新账户、修改已有账户的角色权限、禁用异常账户的登录功能。设备信息管理模块中的管理员除了可以完成增删改查的操作之外,还可以对设备进行批量导入。牧畜信息管理模块可以管理员对牧畜的归属关系进行调整,也可以对牧畜档案进行合并或者拆分。环境数据管理模块有数据审核功能,管理员对采集的数据进行质量检查后标记为有效。告警记录管理模块中管理员可以对告警规则进行阈值的配置,并且可以设置不同的等级告警的处理程序。首页概览模块用图表的形式展示出设备的在线率、告警分布、牧畜存栏量等主要指标。管理员用例图如图3-2所示。

图3-2管理员用例图

3.3 非功能需求分析

  (1)可用性需求

  可用性上,系统需要有较好的响应速度,在高并发访问的情况下也可以保证界面的加载速度。系统应该支持多平台访问,保证各个终端的用户可以得到相同的使用体验。系统要给出明显的界面布局以及容易操作的交互逻辑,从而减少用户的使用难度。系统要不断改善性能并扩充功能,使整个周期内具有较好的可用性。

  (2)可靠性需求

  可靠性上要具有自动化容错功能,即局部故障发生的时候可以保证主要功能的正常运转。系统应该具有数据备份和恢复的功能,在出现异常的时候不会造成数据的丢失。系统应该具有冗余设计来保证服务的连续性。系统要具有运行监控、日志追踪的功能,可以对运行状态进行实时检测并找出问题。

  (3)安全性需求

  安全上系统要设置访问控制,保证各个角色的用户只能对本权限内的操作进行操作。系统应该有身份认证和数据加密的功能来保证传输、存储过程中的信息安全。系统要设置入侵检测和防护措施来减少可能的攻击风险。系统应该支持日志审计,保证操作行为可以追溯,满足合规性的要求。

第四章 系统设计

4.1 系统架构设计

  系统使用前后端分离的架构模式,该种方式把用户界面和业务逻辑分离开来,利于独立开发和部署。表现层用Vue框架创建的单页面应用来完成接收用户的输入以及渲染数据的任务。应用服务层使用SpringBoot框架来创建,控制器组件对HTTP请求进行处理,调用业务逻辑组件来进行数据的处理。数据持久层使用MyBatis框架同MySQL数据库进行交互,对业务数据进行存取。三层结构之间用接口进行通信,表现层调用服务层暴露的RESTful接口,服务层调用持久层定义的映射方法。业务数据在不同层次之间用DTO对象来传递,各个层次内部有各自独立的数据模型。皇甫大恩认为,该种分层结构可以有效地减少模块之间的耦合程度17。用户请求从浏览器发出之后,经过控制器解析到达服务层,服务层执行核心业务规则之后调用持久层,持久层完成数据库操作之后逐层返回处理结果。整个系统架构如图4-1所示。

图4-1系统架构图

4.2 系统结构功能设计

  该系统根据草场牛羊管理业务需求来创建功能模块。普通用户和管理员两个角色所具有的操作权限是不一样的。设备信息管理模块有设备档案管理、状态查询、参数设置等。牧畜信息管理模块有牧畜档案录入、健康监测记录和位置追踪这三种功能。环境数据管理模块有三个功能,即监测数据采集、历史记录查询、指标分析。告警记录管理模块有告警信息展示、处理进度追踪以及历史告警检索这三个主要部分。管理员还有系统用户管理的权限,可以创建账号、分发角色、修改权限。首页概览模块给管理员显示设备在线率、告警趋势、牧畜统计等主要指标。系统功能结构图如图4-2所示。

图4-2系统功能结构图

4.3 系统流程设计

4.3.1 系统总体业务流程设计

  用户通过浏览器访问系统登录页面,输入身份凭证后后端进行验证。验证通过的用户根据所选角色进入相应工作界面。普通用户在主页上可以查看到待处理的告警条目,然后点击进入各个业务模块进行日常操作。管理员登录之后先浏览首页概览,了解设备运行状况和告警发生次数,然后按照优先级顺序处理各种管理事务。用户完成操作之后就退出了系统,会话信息就被清除了。系统的总体业务流程图如图4-3所示。

图4-3系统总体业务流程图

4.3.2 设备信息管理流程设计

  用户进入设备管理模块后查看设备列表,系统从数据库加载设备数据并分页展示。用户提交筛选条件时,前端将参数发送到后端,后端动态构建查询语句返回匹配结果。用户选择新增操作弹出表单窗口,填写设备属性后提交保存。更新设备信息时系统加载原有数据至表单,用户修改后提交覆盖。设备信息管理流程如图4-4所示。

图4-4设备信息管理流程图

4.3.3 牧畜信息管理流程设计

  用户进入牧畜管理界面后,系统就会显示出牧畜档案列表,每一条记录都有耳标号码以及健康状况。用户在搜索框中输入关键词之后,系统会立刻对表格数据进行过滤,并且筛选的逻辑是在后台完成的。牧畜档案新增时要填种类、年龄、性别等基本属性,体重、温度数据分别独立录入。定位功能按照牧畜佩戴设备上报的经纬度数据在地图上标出位置点。牧畜信息管理流程如图4-5所示。

图4-5牧畜信息管理流程图

4.3.4 环境数据管理流程设计

  用户在环境数据模块选择采集区域与时间范围,系统根据筛选条件查询环境数据表。查询结果以表格形式展示温度、湿度、光照、氨气浓度等指标。用户点击某条记录可查看详细参数与采集备注。数据审核功能仅管理员可见,审核通过的数据会被标记为有效状态参与统计计算。环境数据管理流程如图4-6所示。

图4-6环境数据管理流程图

4.3.5 告警记录管理流程设计

  系统检测到异常数据后自动生成告警记录,写入告警日志表并标注未处理状态。用户进入告警模块时系统加载最新告警条目并按等级排序。用户点击处理按钮弹出方案填写窗口,提交处置记录后告警状态变更为已处理。历史告警查询功能支持按设备名称与时间范围筛选归档数据。告警记录管理流程如图4-7所示。

图4-7告警记录管理流程图

4.4 数据库设计

  数据库设计是在系统规划阶段,根据业务需求把现实世界中的实体、属性和关系抽象成数据模型的过程。设计者首先确定实体及其属性,确定主键和外键之间的关系,建立符合范式的逻辑结构;然后根据性能目标选择字段类型、索引方式、分区方案以及存储引擎等,得到可以直接部署的物理结构,保证数据的完整性、查询速度和未来扩展性**18**。

4.4.1 E-R图设计

  实体图是用图形化的方式表现业务要素以及它们之间的数据建模工具,在数据库设计阶段把需求转化为结构化的可视化表达。它用节点对应业务实体,边对应实体之间的关联关系,在节点内列出关键属性,直观地展现数据模型的全貌,方便快速识别冗余,理清依赖,给逻辑设计和物理实现提供清晰的蓝图。下面将给出系统全局实体图以及各个主要实体的属性图。

  设备信息实体主要包括设备信息编号、设备名称、设备编号、设备类型、设备状态、设备电量、安装位置、在线时间、详细参数、创建用户编号、创建时间、更新时间等。设备信息实体属性图如图4-8所示。

图4-8设备信息实体属性图

  牧畜信息实体主要包括牧畜信息编号、牧畜编号、牧畜种类、牧畜年龄、牧畜性别、牧畜体重、耳标号码、健康状况、活动量、实时温度、佩戴设备、当前位置、当前位置纬度、当前位置经度、牧畜备注、创建用户编号、创建时间、更新时间等。牧畜信息实体属性图如图4-9所示。

图4-9牧畜信息实体属性图

  环境数据实体主要包括环境数据编号、数据编号、采集区域、采集设备、环境温度、环境湿度、环境光照、土壤温度、土壤水分、氨气浓度、采集时间、采集备注、创建用户编号、创建时间、更新时间等。环境数据实体属性图如图4-10所示。

图4-10环境数据实体属性图

  告警记录实体主要包括告警记录编号、告警编号、告警设备、设备类型、告警等级、告警内容、发生时间、处理状态、处理方案、处理时间、关联环境、关联牧畜、创建用户编号、创建时间、更新时间等。告警记录实体属性图如图4-11所示。

图4-11告警记录实体属性图

  普通用户实体主要包括普通用户编号、用户编号、用户姓名、用户性别、联系电话、审核状态、创建用户编号、创建时间、更新时间等。普通用户实体属性图如图4-12所示。

图4-12普通用户实体属性图

  用户账户实体主要包括用户编号、用户名、密码、昵称、头像地址、手机号码、邮箱、手机认证状态、邮箱认证状态、账户状态、用户组、上次登录时间、创建时间、更新时间等。用户账户实体属性图如图4-13所示。

图4-13用户账户实体属性图

  系统E-R图如图4-14所示。

图4-14系统E-R图

4.4.2 数据库表设计

  数据库表设计就是按照业务需求确定数据库表的结构、字段类型和关系。经过规范化的设计,可以保证数据的完整性、一致性以及效率,而且不会产生重复的数据,为之后的数据查询、存储以及维护提供清晰的框架**19**。以下是系统的数据库表设计展示。

  1设备信息表主要是用来存储养殖场内各类监测设备的基本档案。主要包括设备名称、设备编号、设备类型、设备状态等字段。如表4-1所示。

表4-1设备信息表

序号 字段名 类型 长度 是否非空 是否主键 备注
1 device_information_id int 11 是 是 设备信息ID
2 device_name varchar 64 否 否 设备名称
3 device_number varchar 64 否 否 设备编号
4 device_type varchar 64 否 否 设备类型
5 device_status varchar 64 否 否 设备状态
6 device_battery_level double - 否 否 设备电量
7 installation_location varchar 64 否 否 安装位置
8 online_time datetime - 否 否 在线时间
9 specificsed_parameters text 65535 否 否 详细参数
10 create_by int 11 是 否 创建用户ID
11 create_time datetime - 是 否 创建时间
12 update_time timestamp - 是 否 更新时间

  牧畜信息表主要是用来存储牛羊个体档案与健康监测数据。主要包括牧畜编号、牧畜种类、牧畜年龄、牧畜性别、耳标号码等字段。如表4-2所示。

表4-2牧畜信息表

序号 字段名 类型 长度 是否非空 是否主键 备注
1 livestock_information_id int 11 是 是 牧畜信息ID
2 livestock_user_id varchar 64 否 否 牧畜编号
3 types_of_livestock varchar 64 否 否 牧畜种类
4 livestock_age varchar 64 否 否 牧畜年龄
5 livestock_gender varchar 64 否 否 牧畜性别
6 livestock_weight double - 否 否 牧畜体重
7 ear_tag_number varchar 64 否 否 耳标号码
8 health_status varchar 64 否 否 健康状况
9 activity_level varchar 64 否 否 活动量
10 real_time_temperature double - 否 否 实时温度
11 wearable_devices varchar 64 否 否 佩戴设备
12 location_address varchar 64 否 否 当前位置
13 location_lat varchar 64 否 否 当前位置纬度
14 location_lng varchar 64 否 否 当前位置经度
15 livestock_remarks text 65535 否 否 牧畜备注
16 create_by int 11 是 否 创建用户ID
17 create_time datetime - 是 否 创建时间
18 update_time timestamp - 是 否 更新时间

  环境数据表主要是用来存储传感器采集的养殖环境参数。主要包括采集区域、采集设备、环境温度、环境湿度、氨气浓度等字段。如表4-3所示。

表4-3环境数据表

序号 字段名 类型 长度 是否非空 是否主键 备注
1 environmental_data_id int 11 是 是 环境数据ID
2 data_number varchar 64 否 否 数据编号
3 acquisition_area varchar 64 否 否 采集区域
4 data_acquisition_device varchar 64 否 否 采集设备
5 ambient_temperature double - 否 否 环境温度
6 environmental_humuser_idity double - 否 否 环境湿度
7 ambient_light varchar 64 否 否 环境光照
8 soil_temperature double - 否 否 土壤温度
9 soil_moisture double - 否 否 土壤水分
10 ammonia_concentration double - 否 否 氨气浓度
11 storeup_time datetime - 否 否 采集时间
12 storeup_notes text 65535 否 否 采集备注
13 create_by int 11 是 否 创建用户ID
14 create_time datetime - 是 否 创建时间
15 update_time timestamp - 是 否 更新时间

  告警记录表主要是用来存储系统触发的异常事件与处置信息。主要包括告警编号、告警设备、告警等级、告警内容、处理状态等字段。如表4-4所示。

表4-4告警记录表

序号 字段名 类型 长度 是否非空 是否主键 备注
1 alarm_logs_id int 11 是 是 告警记录ID
2 alarm_number varchar 64 否 否 告警编号
3 alarm_equipment varchar 64 否 否 告警设备
4 device_type varchar 64 否 否 设备类型
5 alarm_level varchar 64 否 否 告警等级
6 alert_content text 65535 否 否 告警内容
7 time_of_occurrence datetime - 否 否 发生时间
8 processing_status varchar 64 否 否 处理状态
9 handling_plan text 65535 否 否 处理方案
10 processing_time datetime - 否 否 处理时间
11 associated_environment varchar 64 否 否 关联环境
12 associated_livestock varchar 64 否 否 关联牧畜
13 create_by int 11 是 否 创建用户ID
14 create_time datetime - 是 否 创建时间
15 update_time timestamp - 是 否 更新时间

  普通用户表主要是用来存储非管理员账户的个人档案信息。主要包括用户编号、用户姓名、用户性别、联系电话、审核状态等字段。如表4-5所示。

表4-5普通用户表

序号 字段名 类型 长度 是否非空 是否主键 备注
1 regular_user_id int 11 是 是 普通用户ID
2 user_id int 11 是 否 用户ID
3 user_name varchar 64 否 否 用户姓名
4 user_gender varchar 64 否 否 用户性别
5 contact_phone varchar 16 否 否 联系电话
6 examine_state varchar 16 是 否 审核状态
7 create_by int 11 是 否 创建用户ID
8 create_time datetime - 是 否 创建时间
9 update_time timestamp - 是 否 更新时间

  用户账户表主要是用来存储系统登录凭证与账户状态信息。主要包括用户名、密码、手机号码、邮箱、账户状态、用户组等字段。如表4-6所示。

表4-6用户账户表

序号 字段名 类型 长度 是否非空 是否主键 备注
1 user_id int 11 是 是 用户ID
2 username varchar 16 是 否 用户名
3 password varchar 64 是 否 密码
4 nickname varchar 16 否 否 昵称
5 avatar varchar 255 否 否 头像地址
6 phone varchar 11 否 否 手机号码
7 email varchar 64 否 否 邮箱
8 phone_state smallint - 是 否 手机认证
9 email_state smallint - 是 否 邮箱认证
10 state smallint - 是 否 账户状态
11 user_group varchar 32 否 否 所在用户组
12 login_time timestamp - 否 否 上次登录时间
13 create_time timestamp - 是 否 创建时间
14 update_time timestamp - 是 否 更新时间

第五章 系统实现

5.1 普通用户角色功能实现

5.1.1 登录注册功能

  用户登录请求由UserController中的login方法处理。该方法接收前端提交的用户名与密码,调用RsaUtils工具类对加密传输的密码进行解密。系统根据用户名查询用户表验证凭证合法性,验证通过后生成UUID格式的Token并存储至Redis缓存,同时设定2小时的有效期。注册功能由signUp方法实现,检查用户名唯一性后调用insert方法写入用户账户表。登录注册界面如图5-1所示。

图5-1登录注册界面

  核心代码实现如下:

复制代码
public Map<String, Object> login(@RequestBody Map<String, String> data,HttpServletRequesthttpServletRequest) {

String username =data.get("username");

String password =data.get("password");

password =RsaUtils.decryptByPrivateKey(password);

ListresultList=service.selectBaseList(service.select(map, new HashMap<>()));

UserbyUsername= (User)resultList.get(0);

accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));

redisTemplate.opsForValue().set(accessToken.getToken(),accessToken,duration);

5.1.2 设备信息管理功能

  设备信息的新增与修改操作由DeviceInformationController中的add与set方法完成。add方法读取请求体中的参数映射,移除空字符串字段后创建DeviceInformation实体对象,通过调用addEntity方法将数据持久化到数据库。set方法先解析查询条件与配置参数,再执行更新操作。系统使用@Transactional注解确保数据操作的事务完整性。设备信息管理界面如图5-2所示。

图5-2设备信息管理界面

  核心代码实现如下:

  @PostMapping("/add")

  @Transactional

  public Map<String, Object> add(HttpServletRequestrequest) throwsIOException{

  Map<String,Object>paramMap=service.readBody(request.getReader());

复制代码
DeviceInformationdevice_information= newDeviceInformation();

device_information.setDevice_number(paramMap.get("device_number")==null?null:String.valueOf(paramMap.get("device_number")));

device_information.setDevice_name(paramMap.get("device_name")==null?null:String.valueOf(paramMap.get("device_name")));

this.addEntity(device_information);

5.1.3 牧畜信息管理功能

  牧畜信息的新增由LivestockInformationController中的add方法承载。系统从HTTP请求中读取JSON参数,过滤空字符串值后构建LivestockInformation实体。该方法接收牧畜编号、耳标号码、种类、性别、年龄、体重、健康状况等字段数据,通过addEntity完成单条记录的插入操作。设置操作由set方法处理,根据查询条件定位目标记录并更新指定字段。牧畜信息管理界面如图5-3所示。

图5-3牧畜信息管理界面

  核心代码实现如下:

  @PostMapping("/add")

  @Transactional

  public Map<String, Object> add(HttpServletRequestrequest) throwsIOException{

  Map<String,Object>paramMap=service.readBody(request.getReader());

复制代码
LivestockInformationlivestock_information= newLivestockInformation();

livestock_information.setLivestock_user_id(paramMap.get("livestock_user_id")==null?null:String.valueOf(paramMap.get("livestock_user_id")));

livestock_information.setEar_tag_number(paramMap.get("ear_tag_number")==null?null:String.valueOf(paramMap.get("ear_tag_number")));

this.addEntity(livestock_information);

5.1.4 环境数据管理功能

  EnvironmentalDataController中的add方法用于环境监测数据的录入。该方法读取前端传递的采集区域、设备名称、温度、湿度、光照、氨气浓度、土壤参数等数据,生成EnvironmentalData实体对象。系统处理storeup_time时间字段时调用parseToTimestamp方法完成格式转换,将字符串时间解析为Timestamp类型后存入数据库。set方法支持对已有环境数据记录的修改操作。环境数据管理界面如图5-4所示。

图5-4环境数据管理界面

  核心代码实现如下:

  @PostMapping("/add")

  @Transactional

  public Map<String, Object> add(HttpServletRequestrequest) throwsIOException{

  Map<String,Object>paramMap=service.readBody(request.getReader());

复制代码
EnvironmentalDataenvironmental_data= newEnvironmentalData();

environmental_data.setData_number(paramMap.get("data_number")==null?null:String.valueOf(paramMap.get("data_number")));

environmental_data.setAmbient_temperature(paramMap.get("ambient_temperature")==null?null:Double.valueOf(String.valueOf(paramMap.get("ambient_temperature"))));

this.addEntity(environmental_data);

5.1.5 告警记录管理功能

  AlarmLogsController类提供了告警记录的创建与编辑接口。add方法接收告警编号、设备名称、设备类型、关联牧畜、关联环境、告警等级、告警内容、发生时间、处理状态等参数,构建AlarmLogs实体并执行插入操作。时间字段time_of_occurrence与processing_time经过格式转换后存储。set方法根据查询条件匹配告警记录,更新处理状态与处理方案字段。告警记录管理界面如图5-5所示。

图5-5告警记录管理界面

  核心代码实现如下:

  @PostMapping("/add")

  @Transactional

  public Map<String, Object> add(HttpServletRequestrequest) throwsIOException{

  Map<String,Object>paramMap=service.readBody(request.getReader());

复制代码
AlarmLogsalarm_logs= newAlarmLogs();

alarm_logs.setAlarm_number(paramMap.get("alarm_number")==null?null:String.valueOf(paramMap.get("alarm_number")));

alarm_logs.setAlarm_equipment(paramMap.get("alarm_equipment")==null?null:String.valueOf(paramMap.get("alarm_equipment")));

this.addEntity(alarm_logs);

5.2 管理员角色功能实现

5.2.1 系统用户管理功能

  普通用户的注册请求由UserController中的signUp方法处理。该方法接收用户名、密码等注册信息,查询用户表确认用户名未被占用后执行insert操作完成账户创建。管理员对普通用户信息的修改通过RegularUserController中的set方法实现,该方法解析查询条件定位用户记录,更新用户姓名、性别、联系电话等字段。系统用户管理界面如图5-6所示。

图5-6系统用户管理界面

  核心代码实现如下:

  @PostMapping("register")

  public Map<String, Object>signUp(@RequestBody User user) {

  Map<String, String> query = new HashMap<>();

复制代码
query.put("username",user.getUsername());

Listlist=service.selectBaseList(service.select(query, new HashMap&lt;&gt;()));

if (list.size()&gt;0){

return error(30000, "用户已存在");

  }

  service.insert(map);

5.2.2 设备信息管理功能

  管理员对设备信息的批量处理能力通过继承BaseController获得。设备信息新增由DeviceInformationController中的add方法完成,该方法将前端提交的设备编号、名称、类型、安装位置、状态、电量、在线时间、详细参数等字段封装为实体对象。修改操作由set方法执行,支持按条件筛选单条或多条记录进行字段更新。设备信息管理界面如图5-7所示。

图5-7设备信息管理界面

  核心代码实现如下:

  @PostMapping("/add")

  @Transactional

  public Map<String, Object> add(HttpServletRequestrequest) throwsIOException{

  Map<String,Object>paramMap=service.readBody(request.getReader());

复制代码
DeviceInformationdevice_information= newDeviceInformation();

device_information.setDevice_status(paramMap.get("device_status")==null?null:String.valueOf(paramMap.get("device_status")));

device_information.setDevice_battery_level(paramMap.get("device_battery_level")==null?null:Double.valueOf(String.valueOf(paramMap.get("device_battery_level"))));

this.addEntity(device_information);

5.2.3 牧畜信息管理功能

  管理员对牧畜档案的批量维护通过LivestockInformationController中的set方法实现。该方法接收查询条件定位需要修改的牧畜记录,更新健康状况、活动量、实时温度、佩戴设备、位置坐标等字段。新增操作由add方法完成,该方法将前端传递的牧畜基础信息封装为实体并写入数据库。两类操作均使用@Transactional注解保证数据一致性。牧畜信息管理界面如图5-8所示。

图5-8牧畜信息管理界面

  核心代码实现如下:

  @PostMapping("/set")

  @Transactional

  public Map<String, Object> set(HttpServletRequestrequest) throwsIOException{

  Map<String,String>queryMap=service.readQuery(request);

  Map<String,Object>paramMap=service.readBody(request.getReader());

复制代码
LivestockInformationlivestock_information= newLivestockInformation();

livestock_information.setHealth_status(paramMap.get("health_status")==null?null:String.valueOf(paramMap.get("health_status")));

livestock_information.setLocation_address(paramMap.get("location_address")==null?null:String.valueOf(paramMap.get("location_address")));

this.setEntity(queryMap,configMap,livestock_information);

5.2.4 环境数据管理功能

  环境监测数据的审核操作由EnvironmentalDataController中的set方法承载。管理员通过该方法筛选待审核的数据记录,修改数据的有效状态标记。add方法用于新增环境采集记录,接收采集区域、设备、各项环境指标参数。系统在处理时自动填充创建用户编号与创建时间,storeup_time字段的时间转换由parseToTimestamp完成。环境数据管理界面如图5-9所示。

图5-9环境数据管理界面

  核心代码实现如下:

  @PostMapping("/set")

  @Transactional

  public Map<String, Object> set(HttpServletRequestrequest) throwsIOException{

  Map<String,String>queryMap=service.readQuery(request);

  Map<String,Object>paramMap=service.readBody(request.getReader());

复制代码
EnvironmentalDataenvironmental_data= newEnvironmentalData();

environmental_data.setAmmonia_concentration(paramMap.get("ammonia_concentration")==null?null:Double.valueOf(String.valueOf(paramMap.get("ammonia_concentration"))));

environmental_data.setSoil_moisture(paramMap.get("soil_moisture")==null?null:Double.valueOf(String.valueOf(paramMap.get("soil_moisture"))));

this.setEntity(queryMap,configMap,environmental_data);

5.2.5 告警记录管理功能

  告警规则的阈值配置功能通过AlarmLogsController中的set方法间接实现。系统管理员调用该方法更新告警等级判定条件字段。告警记录的批量导出与历史检索功能依托BaseController提供的selectBaseList方法完成数据查询。add方法负责系统自动触发告警时的记录写入,该方法接收告警内容、关联设备、发生时间等信息。告警记录管理界面如图5-10所示。

图5-10告警记录管理界面

  核心代码实现如下:

  @PostMapping("/add")

  @Transactional

  public Map<String, Object> add(HttpServletRequestrequest) throwsIOException{

  Map<String,Object>paramMap=service.readBody(request.getReader());

复制代码
AlarmLogsalarm_logs= newAlarmLogs();

alarm_logs.setAlarm_level(paramMap.get("alarm_level")==null?null:String.valueOf(paramMap.get("alarm_level")));

alarm_logs.setProcessing_status(paramMap.get("processing_status")==null?null:String.valueOf(paramMap.get("processing_status")));

this.addEntity(alarm_logs);

5.2.6 首页概览功能

  首页概览的数据统计由多个查询接口协同完成。UserController中的state方法根据请求头携带的Token获取当前登录用户信息,验证登录态有效性。设备在线率、告警数量趋势、牧畜存栏量等统计数据通过各业务Service层的selectBaseList方法检索数据库获得。Redis缓存存储用户会话信息,避免频繁查询用户表。首页概览界面如图5-11所示。

图5-11首页概览界面

  核心代码实现如下:

复制代码
@GetMapping("state")

public Map&lt;String, Object&gt; state(HttpServletRequestrequest) {

String token =request.getHeader("x-auth-token");

IntegeruserId=tokenGetUserId(token);

  Map<String,String> query = new HashMap<>();

复制代码
query.put("user_id" ,String.valueOf(userId));

ListresultList=service.selectBaseList(service.select(query,config));

JSONObjectuser = JSONObject.parseObject(JSONObject.toJSONString(resultList.get(0)));

user.put("token",token);

return success(ret);

第六章 系统测试

6.1 测试目的

  系统测试就是检验智慧草场牛羊管理系统所实现的功能是否满足需求规格的要求。对测试过程中涉及的设备信息管理、牧畜信息管理、环境数据管理、告警记录管理和用户权限控制等主要业务模块做测试。通过执行预先设定好的测试用例来检验系统对合法输入能否产生预期结果,在接收到非法数据时能否给出合理的提示。边界值测试是对系统在极端情况下出现的异常行为进行测试的一种方法,也就是超长的字符串提交、数值超出规定范围等情况下的处理逻辑20。本次测试还会对用户的界面操作进行观察,保证交互行为符合用户心理预期。

6.2 测试方法

  本次测试使用黑盒测试法,把系统看作一个不透明的整体,测试用例完全按照需求规格说明书设计而没有考虑到内部实现的细节。功能测试检验各个模块是否实现了预定的功能,即设备信息的增加、修改、删除、查询等操作是否正常。场景测试模拟真实用户使用路径,从登录开始依次完成各个业务环节的检验,检验模块之间能否正常配合。边界值测试就是根据输入字段取值边界设计用例,检验系统对临界数据的处理能力。错误推测法根据测试人员的经验来推测可能会出现错误的情况,从而对系统在极端情况下表现进行验证。

6.3 测试内容

  1设备信息管理模块测试聚焦于设备档案的维护操作正确性。测试过程验证设备记录的录入、变更、移除及检索功能是否按照业务规则执行,确认设备状态字段在不同操作场景下的更新逻辑。设备信息管理测试如表6-1所示。

表6-1设备信息管理测试用例表

测试内容 测试步骤 预期结果 实际结果
设备录入 填写设备完整信息后提交 数据库新增对应记录 符合预期
信息变更 修改设备属性并保存 原有字段内容被覆盖 符合预期
设备移除 执行记录删除操作 指定记录不再出现 符合预期
条件检索 输入筛选条件进行查询 返回匹配的设备列表 符合预期

  牧畜信息管理模块测试重点验证牛羊个体档案的数据完整性。测试场景覆盖档案创建时必填字段的校验机制,健康状态变更时关联记录的处理方式,位置追踪功能的数据解析准确性。牧畜信息管理测试如表6-2所示。

表6-2牧畜信息管理测试用例表

测试内容 测试步骤 预期结果 实际结果
档案创建 填写牧畜基本信息后保存 档案记录生成成功 符合预期
健康更新 修改健康状况字段提交 变更内容持久化存储 符合预期
位置解析 触发定位数据刷新 坐标信息正确显示 符合预期
档案删除 移除指定牧畜记录 关联数据同步清理 符合预期

  环境数据管理模块测试关注监测数据的查询筛选与审核流转。测试验证按时间范围与采集区域组合检索的准确性,数据审核前后状态变化的合规性,异常数据标记流程的完整性。环境数据管理测试如表6-3所示。

表6-3环境数据管理测试用例表

测试内容 测试步骤 预期结果 实际结果
时段筛选 设置起止时间进行检索 仅展示时段内记录 符合预期
区域过滤 选择采集区域执行查询 返回该区域数据 符合预期
审核通过 管理员标记数据有效 记录状态发生变化 符合预期
异常标记 对可疑数据添加标记 标记字段更新成功 符合预期

  告警记录管理模块测试重点验证告警事件的触发呈现与处置闭环。测试场景包括告警生成后未处理状态的正确展示,处置方案提交后状态变更的及时性,历史告警按条件检索的准确性。告警记录管理测试如表6-4所示。

表6-4告警记录管理测试用例表

测试内容 测试步骤 预期结果 实际结果
告警展示 进入告警管理界面 未处理告警优先显示 符合预期
告警处置 填写处理方案并提交 告警状态转为已处理 符合预期
历史检索 按时间范围筛选归档数据 存放记录正确列出 符合预期
等级排序 按告警等级排列记录 高级别告警靠前 符合预期

  系统用户管理模块测试聚焦于账户权限的配置与控制。测试验证新用户创建后角色分配的正确性,账户禁用操作对登录权限的即时影响,审核流程中账户状态流转的合规性。系统用户管理测试如表6-5所示。

表6-5系统用户管理测试用例表

测试内容 测试步骤 预期结果 实际结果
账户创建 填写用户信息分配角色 新账户生成成功 符合预期
权限变更 修改账户所属角色组 操作权限相应变化 符合预期
账户禁用 执行账户禁用操作 该账户无法登录 符合预期
审核通过 管理员确认注册申请 账户状态变为可用 符合预期

  首页概览模块测试重点验证统计数据展示的准确性。测试场景包括设备在线率与离线设备数量的匹配关系,近期待处理告警条目的实时刷新,牧畜存栏量统计与数据库实际记录的对应性。首页概览测试如表6-6所示。

表6-6首页概览测试用例表

测试内容 测试步骤 预期结果 实际结果
设备统计 查看在线率图表数据 数值与设备表一致 符合预期
告警汇总 浏览未处理告警数量 计数与告警表匹配 符合预期
牧畜统计 查阅存栏量指标 数量与牧畜表相同 符合预期
趋势刷新 切换时间维度查看 图表数据相应更新 符合预期

  登录注册模块测试聚焦于身份验证的安全性。测试验证正确凭证与错误凭证提交后的不同响应结果,新用户注册时用户名的唯一性检查,密码加密存储后的不可逆性。登录注册测试如表6-7所示。

表6-7登录注册测试用例表

测试内容 测试步骤 预期结果 实际结果
合法登录 提交正确的用户名密码 成功进入系统主页 符合预期
非法登录 提交错误的密码信息 访问请求被拒绝 符合预期
新用户注册 填写未占用的用户名 账户记录创建成功 符合预期
重复注册 使用已存在的用户名 提示注册失败 符合预期

测试结论

  经过对设备信息管理、牧畜信息管理、环境数据管理、告警记录管理、系统用户管理、首页概览、登录注册这七个主要模块进行测试,各个模块的功能可以正常运行。设备信息管理的增删改查操作均可以正确执行,数据前后保持一致。牧畜信息管理位置解析和健康状态改变的功能有效。环境数据管理筛选、审核的过程正常,状态流转按照事先设定的规则进行。告警记录的处置操作可以即时改变状态字段。系统用户权限变更和账户禁用生效。首页概览展示出的数据同后台数据表的记录保持一致。登录注册的身份验证机制可以区分合法和非法的访问。全部测试用例实际结果都与预期结果相符,没有出现异常或者错误。

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

相关推荐
橘猫走江湖1 小时前
Vue 3 虚拟 DOM:作用、触发机制,以及怎样变成页面上的真实节点
前端·vue.js·dom
weixin_BYSJ19872 小时前
电竞先锋网站---附源码02032
java·vue.js·spring boot·python·django·tomcat·php
Lyra_Infra2 小时前
prod-bus 主机 CPU 异常故障排查与安全事件分析报告
后端·安全
程序员如山石2 小时前
再思考断言
后端
弦儿2 小时前
后端 Web 实战:登录认证(登录功能 + 会话技术 + JWT 令牌 + Filter/Interceptor)
后端
会编程的吕洞宾2 小时前
LangChain4j 流式输出实战:让 AI 回复像打字机一样逐字显示
java·开发语言·人工智能·后端
武子康2 小时前
CUDA OOM 不只是“显存不够”
人工智能·后端·agent
进击的丸子2 小时前
基于 ArcFace SDK 的跨平台人脸特征值下发、同步以及存储方案
后端·算法·代码规范
郑州光合科技余经理2 小时前
同城小程序开发:同一笔单在用户端和商家端各显示到哪
android·java·开发语言·前端·后端·uni-app·php