摘要
伴随着高等教育规模的不断扩大以及科研活动的不断深入,高校实验室的开放程度和使用频率也越来越大。传统的以人工为主的人事管理方式,在处理预约、设备流转、故障报修等事务的时候,存在着流程不透明、数据孤立、资源冲突等问题,管理效率不能满足实际需要。智慧实验室综合管理系统创建目的在于借助信息化手段对实验室资源加以整合,从而规范业务流程。本系统以Spring Boot为后端开发框架,使用Vue.js进行前端页面的设计,使用MySQL做数据的存储工作,RBAC模型用来实现多角色的权限控制。系统由学生用户、实验教师、管理员三个部分组成,有新闻资讯浏览、实验室预约、实验设备使用和归还、故障上报、维修记录等几个功能。经过系统的测试后发现各个功能模块运行正常,数据交换准确,可以很好地减少管理过程中的人为差错和重复劳动。该系统给高校实验室精细化、智能化管理提供一个完整的解决方案。
关键词:智慧实验室;Spring Boot;Vue;MySQL;实验室预约
Abstract
With the continuous expansion of higher education and the deepening of scientific research activities, the openness and use frequency of university laboratories have also been rising gradually. The old way of operating manually has some problems: there is no clear path for operation, it is scattered, and resources such as appointment management, equipment allocation, fault notification, etc., are often lacking; therefore, it cannot meet the high demands for management efficiency by enterprises today. The construction of the smart laboratory comprehensive management system will organise lab resources and standardise business processes with the help of information technology. Based on the above analysis, a backend service will be constructed with Spring Boot, Vue will be used for the front end, MySQL will be the database of data storage, and an RBAC model will be employed for multi-role permission management. The three kinds of roles in the system are student users, experimental teachers and administrators, and they have different functions, such as viewing news, booking laboratories, using and returning experimental equipment, reporting faults, managing maintenance records, etc. After the system has been tested, all the functions work normally and the data is accurate; thus, many times doing the same things and making mistakes can be avoided. All of the above technical support has been provided for the improvement and intelligent management of university laboratories.
Key words:Smart Laboratory;Spring Boot;Vue;MySQL;Laboratory Reservation
第一章 绪论
1.1 研究背景与意义
高校实验室是实践教学和科学研究的基地,管理的好坏直接关系到教学质量、科研效率。传统的实验室管理大多依靠人工登记和纸质记录,存在信息传递、资源调配、过程追踪等各方面的缺陷。随着高校扩招和科研项目增多,实验室使用频率不断上升,资源冲突、设备闲置和维护滞后等问题也越来越严重。信息化大潮促使各行各业的管理模式发生改变,高校实验室管理也要朝着数字化、智能化的方向发展[1]。建立一个包含实验室预约、设备管理、故障报修等各项功能的综合管理系统,已经成为提高管理效率的迫切需要[2]。运用系统化的办法整合资源、改善流程,可以给师生赋予便捷的服务途径,也能给予管理者数据支撑和决策参照[3]。
本系统的开发和实现有很强的实际应用价值。系统把实验室预约、设备使用、故障维修这些业务流程搬到线上,削减人工干预的环节,缩减信息传递出错的可能性。学生可以在线查看实验室的状态并进行预约,教师可以实时审核申请并管理设备,管理员可以得到全局的数据监控以及配置的能力。RBAC权限模型的加入保证各个角色只能对被授权的功能进行操作,从而提高系统的安全性以及操作的规范性。系统运行之后,实验室资源利用率提高,行政管理人员工作负担减轻,业务数据可以追溯、可以统计。该系统成功实施之后,可以给同类型高校提供可以借鉴的参考范式。
1.2 国内外研究现状
国内学者在实验室管理系统的方面做了大量的研究工作,取得了比较成熟的研究成果。王小明等提出工作流系统带权角色和周期时间访问控制模型,把时间维度加入到角色访问控制当中,给实验室预约时段管理赋予了理论支撑[4]。李秋敬等人的研究对象是时间约束下的角色访问控制模型,创建出适合于周期性资源调度环境的角色访问控制框架,给实验室各个时间段开放权限设置提供借鉴[5]。胡继方等人利用微服务架构设计出一个高校实验室管理系统,并把实验室管理功能拆分成各个独立的服务模块来提高系统的可扩展性、可维护性[6]。王波等人的研究提出了一个以移动终端为基础的计算机实验教学平台,把实验教学资源同移动端操作联系起来,扩大了实验室管理的应用范围[7]。国内对于角色权限理论以及系统实现方面都取得了进步,但是对于实验室设备全生命周期管理以及故障报修和维修跟踪的闭环处理还存在着欠缺。本系统在整合实验室预约、设备使用、故障维修、报废申请等各方面功能的基础上,创建起一个包含设备从投入使用到报废退出的全部流程的管理系统。
国外实验室管理研究开始得比较早,在访问控制模型以及安全管理框架方面取得了丰富的研究成果。Ferraiolo和Kuhn在学术会议上对角色访问控制的基本概念进行了系统的阐述,为这一领域的发展打下了基础[8]。Sandhu等人提出了一个经典的RBAC模型体系,把角色继承、约束条件等概念放在一个统一的框架里,给权限管理系统的设计提供理论基础[9]。Sandhu等人在NIST报告中对角色访问控制标准模型进行了进一步的完善,给出了角色和权限之间的映射关系[10]。Cong等人的研究显示,生物安全二级实验室的管理合规性可以通过实证的方法来考察,从而找到影响实验室管理效率的因素[11]。Verma等人提出了用离散小波变换、奇异值分解来实现三重水印技术,用它来实现医学图像访问控制[12]。国外的研究对于访问控制理论的探究比较深刻,而在系统实现上更侧重于安全机制的设计。本系统参考中外研究成果中关于角色划分的思想以及权限控制的方法,根据实验室管理的实际需要来设计出适合学生、教师、管理员这三种角色的功能体系。
1.3 主要研究内容
本文以智慧实验室综合管理系统的设计与实现为研究对象,对整个过程包括需求分析、系统设计、系统实现、系统测试都进行了完整的描述。首先对高校实验室管理现实困境进行梳理,确定系统建设目标和核心功能边界。系统技术选择为Spring Boot后端框架、Vue前端框架和MySQL数据库,用前后端分离的结构提高开发效率和系统的可维护性。在需求分析阶段,确定学生用户、实验教师、管理员这三个角色,分别对他们的功能需求进行梳理,并画出用例图。系统设计阶段完成架构设计、功能结构划分、核心业务流程建模和数据库概念模型、逻辑模型的设计。根据RBAC模型来创建权限控制机制,保证不同的用户只能对被授权的资源进行访问。实现阶段完成各个功能模块的代码编写以及界面设计,包含实验室预约、设备使用记录、故障上报、维修登记等主要业务。系统测试阶段选择五个有代表性的功能进行用例测试,检验系统的功能完整性以及数据一致性。最终成果为一个功能齐全、使用方便、权限分明的智慧实验室综合管理平台。
第二章 相关技术介绍
2.1 Spring Boot框架
Spring Boot是基于Spring框架的一种快速开发框架,用自动配置、起步依赖简化了应用程序的搭建和部署。框架里面嵌入了Tomcat、Jetty等Servlet容器,开发出的应用程序可以直接打包成可执行的JAR文件来运行。智慧实验室综合管理系统中Spring Boot是主要的后端业务逻辑执行者。系统控制器层收到前端发出的HTTP请求之后,会调用服务层来对实验室预约、设备使用、故障登记等业务规则进行校验和处理,并且会与MySQL数据库的数据访问层进行交互。Spring Boot的依赖注入机制很好地管理了各个层之间组件的协作关系,降低模块之间的耦合程度,有利于系统的功能拓展和维护[13]。
2.2 Vue框架
Vue是渐进式JavaScript框架,用以创建用户界面,它使用响应式数据绑定以及组件化开发的方式来提高前端开发效率并改善代码可维护性。框架的主要库是视图层,用虚拟DOM技术完成高效页面更新渲染。智慧实验室综合管理系统中,Vue主要用作前端页面的搭建和交互逻辑的实现。系统把实验室信息展示、预约表单填写、设备列表查询等页面分成独立的Vue组件,组件内部控制自身数据的状态和事件的响应。用户发起预约申请或者设备查询请求的时候,Vue组件会利用axios库去发起异步请求,接收到响应数据之后再动态地更新页面内容,从而防止出现因为页面全屏刷新而造成的体验中断情况。Vue路由管理器对不同的功能页面之间的切换跳转进行控制,给单页面应用提供流畅的导航体验[14]。
2.3 MySQL数据库
MySQL为关系型数据库管理系统,稳定可靠、查询速度快、支持结构化查询语言。数据库用表格的形式来组织数据,表之间用主键和外键建立起联系,保证数据的唯一性和完整性。智慧实验室综合管理系统的MySQL主要是对数据进行持久化的存储。系统创建了实验室信息表、实验室预约表、实验设备表、设备使用表、故障信息表、维修记录表、报废信息表等主要的数据表,用来保存相应的业务实体信息。用户所作的预约申请、设备使用登记、故障上报等操作,最后都会变成对数据库表中记录的插入、更新或者查询。数据库事务机制保证了预约审核和状态更新、设备使用和数量变更等有关联的操作是原子的,不能出错[15]。
2.4 前后端分离架构
前后端分离是把用户界面展示和业务逻辑处理解耦的一种架构模式。前端做页面渲染和用户交互,后端提供数据接口和服务,两者之间用HTTP协议以JSON格式进行数据交互。智慧实验室综合管理系统中,前端的Vue应用独立运行在浏览器里,后端的Spring Boot应用部署在服务器上。用户访问实验室信息页面的时候,前端向后端发出获取实验室列表的API请求,后端查询数据库得到JSON数据,前端解析数据之后再渲染成表格或者卡片的形式。用户提交预约申请的时候,前端将表单数据封装成JSON对象,然后通过接口传送给后端,后端对数据进行校验和入库操作,最后返回处理结果。前后端分离的组织形式使得前端开发与后端开发可以同时进行,前端修改不会影响到后端服务,后端服务升级也不会影响到前端功能。接口契约的规范化设计提高了系统的可维护性,也为之后移动端接入留有扩展余地[16]。
第三章 系统分析
3.1 功能需求分析
3.1.1 学生用户功能需求
学生用户是系统功能的主要使用者,用系统完成实验室和设备全过程的操作。学生只有在注册登录之后才能使用系统的功能模块,登录后可以浏览新闻资讯的内容、查看系统发布的公告信息。实验室信息模块中学生可以检索实验室列表并查看详细信息,选择目标实验室之后提交预约申请。预约申请提交之后,学生可以在取消预约模块中发起取消操作。使用记录模块可以查看学生本人已使用过的实验室的使用历史。实验设备模块中学生可以查询设备详情并进行使用登记,设备使用模块显示本人正在使用的设备列表,设备归还模块用于提交设备归还申请。当设备出现故障的时候,学生可以向故障信息模块提交故障信息,在维修记录模块上查看维修处理进度。学生用户用例图如图3-1所示。
图3-1学生用户用例图
3.1.2 实验教师用户功能需求
实验教师用户是对实验室资源进行管理、学生预约审核的人。教师登录系统后可以维护自己所负责的实验室信息,查看实验室的基本档案。实验室预约模块显示学生提交的预约申请列表,教师可以对申请进行审核通过或者驳回的操作,填写审核意见。取消预约模块是针对学生提出的预约取消申请进行处理,教师审核通过后才可以取消。实验设备模块可以查看教师所管辖的设备信息和状态。报废信息模块中教师可以选中需要报废的设备,填写报废申请理由后提交报废申请到管理员处进行审核。实验教师用户用例图如图3-2所示。
图3-2实验教师用户用例图
3.1.3 管理员功能需求
管理员拥有系统的全部配置及管理权限。时间信息管理模块设置预约时段,实验室信息管理模块可以添加、删除、修改和查询实验室数据。实验室预约和取消预约管理模块对所有的预约记录进行监控,处理异常情况。使用记录管理模块查看实验室使用日志,实验设备管理模块维护设备档案。设备使用及归还管理模块对设备的流转状态进行跟踪,故障信息和维修记录管理模块协调维修工作。报废信息管理模块审核设备报废申请,系统管理模块设置轮播图等前端展示内容。管理员用户用例图如图3-3所示。
图3-3管理员用户用例图
3.2 可行性分析
3.2.1 技术可行性
本系统使用的是Spring Boot、Vue和MySQL这三种技术相结合的方式,这三个技术都是成熟并且被广泛使用的开源技术。Spring Boot提供完整的后端开发生态,支持快速构建RESTful服务。Vue框架文档完善,社区活跃,开发效率较高。MySQL数据库性能稳定,可以满足实验室管理场景下数据存储、查询的要求。经过很多项目检验的技术栈的开发风险是可以控制的。
3.2.2 操作可行性
系统界面设计按照用户的操作习惯,学生用户、实验教师、管理员三个角色的功能入口明显。核心业务流程实验室预约、设备使用和归还都是用表单填写和按钮点击来完成的,操作路径简单。用户不需要经过专业的培训就可以在很短的时间内学会使用方法,系统上线之后推广的阻力小。
3.2.3 经济可行性
系统开发所用的技术栈都是开源框架,不需要购买商业软件许可。开发环境可以使用个人计算机来搭建,硬件投入成本低。系统上线之后部署在现有的校园网络环境之中,不需要另外购买专用服务器。实验室日常维护工作是由实验室管理人员兼职完成的,没有专职人员成本。
第四章 系统设计
4.1 系统架构设计
本系统使用前后端分离的分层架构,把系统分为用户界面层、应用服务层、数据持久层和系统支持层。用户界面层使用Vue框架来实现数据展示和用户操作的采集。应用服务层使用Spring Boot框架来实现业务逻辑、权限验证以及请求分发。数据持久层用JPA和MySQL数据库交互来完成数据存取操作。系统支持层给RBAC权限模型、文件上传等基础服务提供支持[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 数据库设计
4.4.1 概念模型设计
概念模型是现实世界数据特征到数据库逻辑结构的中间环节,用实体联系图来可视化表达。对实验室管理业务进行分析,主要的数据实体有学生用户、实验教师、实验室信息、实验室预约、取消预约、使用记录、实验设备、设备使用、设备归还、故障信息。上述实体之间存在着明确的业务联系,学生和预约之间是一对多的提交关系,实验室和预约之间是一对多的被预约关系。通过把实体、属性以及它们之间的联系进行抽象,得到一个独立于具体的数据库管理系统之外的数据结构视图。根据以上分析,绘制反映本系统全域数据结构的E-R图,为后面逻辑模型的设计提供依据[18]。全局E-R模型如图4-8所示。
图4-8全局ER图
根据系统分析,系统的主要实体有:学生用户、实验教师、实验室信息、实验室预约、取消预约、使用记录、实验设备、设备使用、设备归还、故障信息,各个实体具体的属性如下图所示。
(1)学生用户主要包括学生用户id、学生姓名、学生学号等属性。如图4-9所示。
图4-9学生用户属性图
(2)实验教师主要包括实验教师id、教师姓名、教师工号等属性。如图4-10所示。
图4-10实验教师属性图
(3)实验室信息主要包括实验室信息id、实验室编号、实验室名称、实验室位置等属性。如图4-11所示。
图4-11实验室信息属性图
(4)实验室预约主要包括实验室预约id、预约单号、预约日期、预约时段等属性。如图4-12所示。
图4-12实验室预约属性图
(5)取消预约主要包括取消预约id、预约单号、取消原因、审核状态等属性。如图4-13所示。
图4-13取消预约属性图
(6)使用记录主要包括使用记录id、预约单号、使用时长、使用信息等属性。如图4-14所示。
图4-14使用记录属性图
(7)实验设备主要包括实验设备id、设备编号、设备名称、设备型号等属性。如图4-15所示。
图4-15实验设备属性图
(8)设备使用主要包括设备使用id、使用时间、使用数量、使用记录等属性。如图4-16所示。
图4-16设备使用属性图
(9)设备归还主要包括设备归还id、归还时间、归还说明等属性。如图4-17所示。
图4-17设备归还属性图
(10)故障信息主要包括故障信息id、故障标题、上报日期、上报内容等属性。如图4-18所示。
图4-18故障信息属性图
4.4.2 数据库表设计
数据库逻辑设计阶段把概念模型中的实体转换成关系数据库中的表结构,对各个表的字段名、数据类型以及约束条件进行定义[19]。本系统的业务核心表有实验室预约表、实验设备表、故障信息表等。实验室预约表用来存学生预约申请记录,实验设备表存设备档案和状态信息,故障信息表存设备故障上报详情。
(1)实验室预约表主要是用来存储学生提交的实验室预约申请记录。主要包括预约单号、学生姓名、预约日期、预约时段、审核状态等字段。如表4-1所示。
表4-1实验室预约表
| 序号 | 字段名 | 数据类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | laboratory_reservation_id | int | 11 | 实验室预约ID |
| 2 | reservation_order_number | varchar | 64 | 预约单号 |
| 3 | student_name | varchar | 64 | 学生姓名 |
| 4 | appointment_date | date | - | 预约日期 |
| 5 | appointment_time_slot | varchar | 64 | 预约时段 |
| 6 | resight_status | varchar | 64 | 审核状态 |
(2)实验设备表主要是用来存储实验室设备的基本信息与状态。主要包括设备编号、设备名称、设备型号、设备状态、负责教师等字段。如表4-2所示。
表4-2实验设备表
| 序号 | 字段名 | 数据类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | experimental_equipment_id | int | 11 | 实验设备ID |
| 2 | equipment_no | varchar | 64 | 设备编号 |
| 3 | equipment_name | varchar | 64 | 设备名称 |
| 4 | equipment_model | varchar | 64 | 设备型号 |
| 5 | device_status | varchar | 64 | 设备状态 |
| 6 | responsible_teacher | int | 11 | 负责教师 |
(3)故障信息表主要是用来存储学生上报的设备故障记录。主要包括设备编号、设备名称、故障标题、上报日期、上报内容等字段。如表4-3所示。
表4-3故障信息表
| 序号 | 字段名 | 数据类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | fault_information_id | int | 11 | 故障信息ID |
| 2 | equipment_no | varchar | 64 | 设备编号 |
| 3 | equipment_name | varchar | 64 | 设备名称 |
| 4 | fault_title | varchar | 64 | 故障标题 |
| 5 | reporting_date | date | - | 上报日期 |
| 6 | reporting_content | text | - | 上报内容 |
(4)实验室信息表主要是用来存储实验室的基础档案数据。主要包括实验室编号、实验室名称、实验室位置、使用状态、实验室容量等字段。如表4-4所示。
表4-4实验室信息表
| 序号 | 字段名 | 数据类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | laboratory_information_id | int | 11 | 实验室信息ID |
| 2 | laboratory_number | varchar | 64 | 实验室编号 |
| 3 | laboratory_name | varchar | 64 | 实验室名称 |
| 4 | laboratory_location | varchar | 64 | 实验室位置 |
| 5 | usage_status | varchar | 64 | 使用状态 |
| 6 | laboratory_capacity | varchar | 64 | 实验室容量 |
(5)设备使用表主要是用来记录学生使用设备的详细情况。主要包括设备编号、设备名称、使用时间、使用数量、使用记录等字段。如表4-5所示。
表4-5设备使用表
| 序号 | 字段名 | 数据类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | device_usage_id | int | 11 | 设备使用ID |
| 2 | equipment_no | varchar | 64 | 设备编号 |
| 3 | equipment_name | varchar | 64 | 设备名称 |
| 4 | usage_time | datetime | - | 使用时间 |
| 5 | quantity_used | double | 8 | 使用数量 |
| 6 | usage_log | text | - | 使用记录 |
(6)设备归还表主要是用来存储学生归还设备的记录。主要包括设备编号、设备名称、使用时间、归还时间、归还说明等字段。如表4-6所示。
表4-6设备归还表
| 序号 | 字段名 | 数据类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | equipment_return_id | int | 11 | 设备归还ID |
| 2 | equipment_no | varchar | 64 | 设备编号 |
| 3 | equipment_name | varchar | 64 | 设备名称 |
| 4 | usage_time | datetime | - | 使用时间 |
| 5 | return_time | datetime | - | 归还时间 |
| 6 | return_instructions | text | - | 归还说明 |
(7)维修记录表主要是用来存储设备维修的详细记录。主要包括设备编号、设备名称、故障标题、维修时长、维护频次、维修记录等字段。如表4-7所示。
表4-7维修记录表
| 序号 | 字段名 | 数据类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | maintenance_records_id | int | 11 | 维修记录ID |
| 2 | equipment_no | varchar | 64 | 设备编号 |
| 3 | equipment_name | varchar | 64 | 设备名称 |
| 4 | fault_title | varchar | 64 | 故障标题 |
| 5 | repair_duration | double | 8 | 维修时长 |
| 6 | maintenance_records | text | - | 维修记录 |
(8)取消预约表主要是用来存储学生取消预约的申请记录。主要包括预约单号、取消原因、审核状态、审核回复等字段。如表4-8所示。
表4-8取消预约表
| 序号 | 字段名 | 数据类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | cancel_appointment_id | int | 11 | 取消预约ID |
| 2 | reservation_order_number | varchar | 64 | 预约单号 |
| 3 | reason_for_cancellation | text | - | 取消原因 |
| 4 | examine_state | varchar | 16 | 审核状态 |
| 5 | examine_reply | varchar | 255 | 审核回复 |
(9)使用记录表主要是用来存储实验室使用后的记录数据。主要包括预约单号、使用时长、使用信息等字段。如表4-9所示。
表4-9使用记录表
| 序号 | 字段名 | 数据类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | usage_log_id | int | 11 | 使用记录ID |
| 2 | reservation_order_number | varchar | 64 | 预约单号 |
| 3 | usage_duration | double | 8 | 使用时长 |
| 4 | information_usage | text | - | 使用信息 |
(10)报废信息表主要是用来存储设备报废的申请记录。主要包括设备编号、设备名称、报废日期、报废数量、审核状态等字段。如表4-10所示。
表4-10报废信息表
| 序号 | 字段名 | 数据类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | scrap_information_id | int | 11 | 报废信息ID |
| 2 | equipment_no | varchar | 64 | 设备编号 |
| 3 | equipment_name | varchar | 64 | 设备名称 |
| 4 | scrap_date | date | - | 报废日期 |
| 5 | scrapped_quantity | double | 8 | 报废数量 |
| 6 | examine_state | varchar | 16 | 审核状态 |
第五章 系统实现
5.1 学生用户功能实现
5.1.1 登录注册功能实现
学生用户通过UserController中的login方法完成身份验证,该方法接收用户名与密码后调用RsaUtils进行密码解密,随后查询数据库验证用户凭证。register方法用于新用户注册,检查用户名唯一性后插入用户记录。登录注册界面如图5-1所示。
图5-1/ 图5-2登录注册界面
核心代码实现如下:
@PostMapping("login")
public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
String username = data.get("username");
String password = data.get("password");
password = RsaUtils.decryptByPrivateKey(password);
List resultList = service.selectBaseList(service.select(map, new HashMap<>()));
User byUsername = (User) resultList.get(0);
5.1.2 新闻资讯功能实现
新闻资讯功能通过ArticleController中的get_list方法获取文章列表数据,该方法接收查询参数后调用selectToPage方法完成分页查询。ArticleController中的add方法用于管理员新增资讯,set方法用于修改资讯内容。新闻资讯界面如图5-2所示。
图5-3新闻资讯界面
核心代码实现如下:
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = this.service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
5.1.3 实验室信息功能实现
实验室信息功能通过LaboratoryInformationController中的get_list方法实现实验室数据的分页展示,该方法从请求中读取查询条件并调用服务层完成数据检索。LaboratoryInformationController中的add和set方法分别用于实验室信息的添加与修改操作,del方法用于删除实验室记录。实验室信息界面如图5-3所示。
图5-4实验室信息界面
核心代码实现如下:
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = this.service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
5.1.4 实验设备功能实现
实验设备功能由ExperimentalEquipmentController中的get_list方法提供设备列表查询,支持按设备名称与状态进行筛选。用户点击设备时通过get_obj方法获取单条设备详情,包含设备编号、型号及负责教师等信息。实验设备界面如图5-4所示。
图5-5实验设备界面
核心代码实现如下:
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = this.service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
@RequestMapping("/get_obj")
public Map<String, Object> obj(HttpServletRequest request) {
List resultList = service.selectBaseList(service.select(service.readQuery(request), config));
5.1.5 实验室预约功能实现
实验室预约功能通过LaboratoryReservationController中的add方法实现预约申请提交,该方法从请求参数中提取实验室编号、预约日期及预约时段后插入预约记录。预约记录的状态初始设置为待审核,学生可通过get_list方法查看自己的预约历史。实验室预约界面如图5-5所示。
图5-6实验室预约界面
核心代码实现如下:
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
Map<String,Object> paramMap = service.readBody(request.getReader());
LaboratoryReservation laboratory_reservation = new LaboratoryReservation();
laboratory_reservation.setAppointment_date(paramMap.get("appointment_date")==null?null:String.valueOf(paramMap.get("appointment_date")));
this.addEntity(laboratory_reservation);
5.1.6 取消预约功能实现
取消预约功能由CancelAppointmentController中的add方法实现取消申请提交,学生填写取消原因后系统生成取消记录。该方法检查预约单号的唯一性,并将审核状态设置为未审核。教师审核通过后预约资源被释放。取消预约界面如图5-6所示。
图5-7取消预约界面
核心代码实现如下:
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
Map<String,Object> paramMap = service.readBody(request.getReader());
CancelAppointment cancel_appointment = new CancelAppointment();
cancel_appointment.setReservation_order_number(paramMap.get("reservation_order_number")==null?null:String.valueOf(paramMap.get("reservation_order_number")));
cancel_appointment.setReason_for_cancellation(paramMap.get("reason_for_cancellation")==null?null:String.valueOf(paramMap.get("reason_for_cancellation")));
5.1.7 使用记录功能实现
使用记录功能通过UsageLogController中的get_list方法展示学生已完成预约并实际使用的实验室记录。每条记录包含实验室名称、预约时段及使用时长。UsageLogController中的add方法在使用完成后自动生成使用记录。使用记录界面如图5-7所示。
图5-8使用记录界面
核心代码实现如下:
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = this.service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
UsageLog usage_log = new UsageLog();
5.1.8 设备使用功能实现
设备使用功能通过DeviceUsageController中的add方法实现设备借用登记,该方法在插入使用记录后执行库存扣减操作。系统先查询设备库存是否充足,充足时更新experimental_equipment表中的设备数量并记录使用日志。设备使用界面如图5-8所示。
图5-9设备使用界面
核心代码实现如下:
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
this.addEntity(device_usage);
String sql = "SELECT MAX(device_usage_id) AS max FROM device_usage";
Integer max = service.selectBaseCount(sql);
sql = "UPDATE experimental_equipment INNER JOIN device_usage ON experimental_equipment.equipment_no=device_usage.equipment_no SET experimental_equipment.number_of_devices = experimental_equipment.number_of_devices - device_usage.quantity_used WHERE device_usage.device_usage_id="+max;
5.1.9 设备归还功能实现
设备归还功能由EquipmentReturnController中的add方法完成,学生提交归还申请后系统增加设备库存数量。该方法先插入归还记录,然后执行更新语句将设备数量恢复至借出前的状态,记录归还时间与归还说明。设备归还界面如图5-9所示。
图5-10设备归还界面
核心代码实现如下:
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
this.addEntity(equipment_return);
String sql = "SELECT MAX(equipment_return_id) AS max FROM equipment_return";
Integer max = service.selectBaseCount(sql);
sql = "UPDATE experimental_equipment INNER JOIN equipment_return ON experimental_equipment.equipment_no=equipment_return.equipment_no SET experimental_equipment.number_of_devices = experimental_equipment.number_of_devices + equipment_return.quantity_used WHERE equipment_return.equipment_return_id="+max;
5.1.10 故障信息功能实现
故障信息功能通过FaultInformationController中的add方法实现故障上报,学生填写故障标题及上报内容后系统记录上报日期并累加上报次数。该方法强制校验上报次数字段不能为空,故障信息保存后供教师查看并安排维修。故障信息界面如图5-10所示。
图5-11故障信息界面
核心代码实现如下:
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
FaultInformation fault_information = new FaultInformation();
fault_information.setFault_title(paramMap.get("fault_title")==null?null:String.valueOf(paramMap.get("fault_title")));
fault_information.setReporting_date(paramMap.get("reporting_date")==null?null:String.valueOf(paramMap.get("reporting_date")));
if (fault_information.getNumber_of_reports()== null || fault_information.getNumber_of_reports().trim().isEmpty()){
throw new IllegalArgumentException("上报次数不能为空");
}
5.1.11 维修记录功能实现
维修记录功能由MaintenanceRecordsController中的add方法实现维修信息登记,教师填写维修时长与维护频次后生成维修记录。该方法从故障信息表中关联设备编号与故障标题,维修记录保存后更新故障处理状态。维修记录界面如图5-11所示。
图5-12维修记录界面
核心代码实现如下:
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
MaintenanceRecords maintenance_records = new MaintenanceRecords();
maintenance_records.setEquipment_no(paramMap.get("equipment_no")==null?null:String.valueOf(paramMap.get("equipment_no")));
maintenance_records.setFault_title(paramMap.get("fault_title")==null?null:String.valueOf(paramMap.get("fault_title")));
maintenance_records.setRepair_duration(paramMap.get("repair_duration")==null?null:Double.valueOf(String.valueOf(paramMap.get("repair_duration"))));
this.addEntity(maintenance_records);
5.2 实验教师功能实现
5.2.1 实验室信息功能实现
实验教师通过LaboratoryInformationController中的get_list方法查看所负责实验室的信息列表,支持按实验室名称与使用状态进行筛选。教师可通过get_obj方法获取单个实验室的详细信息,包括位置、容量及开放时间。实验室信息界面如图5-12所示。
图5-13实验室信息界面
核心代码实现如下:
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = this.service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
@RequestMapping("/get_obj")
public Map<String, Object> obj(HttpServletRequest request) {
List resultList = service.selectBaseList(service.select(service.readQuery(request), config));
return success(jsonObject);
5.2.2 实验室预约功能实现
实验教师通过LaboratoryReservationController中的set方法对学生的预约申请进行审核处理,该方法接收审核状态与审核回复参数后更新预约记录。教师可查看待审核列表,选择通过或驳回操作。实验室预约界面如图5-13所示。
图5-14实验室预约界面
核心代码实现如下:
@PostMapping("/set")
@Transactional
public Map<String, Object> set(HttpServletRequest request) throws IOException {
Map<String,String> queryMap = service.readQuery(request);
Map<String,Object> paramMap = service.readBody(request.getReader());
laboratory_reservation.setResight_status(paramMap.get("resight_status")==null?null:String.valueOf(paramMap.get("resight_status")));
laboratory_reservation.setResight_response(paramMap.get("resight_response")==null?null:String.valueOf(paramMap.get("resight_response")));
this.setEntity(queryMap,configMap,laboratory_reservation);
5.2.3 取消预约功能实现
取消预约功能由CancelAppointmentController中的update_examine_state方法实现审核处理,教师传入记录ID与新的审核状态后更新取消申请。该方法校验状态合法性后调用setEntity保存审核结果。取消预约界面如图5-14所示。
图5-15取消预约界面
核心代码实现如下:
@GetMapping("/update_examine_state")
public String updateExamineState(Long id, String newState) throws IOException {
if (!newState.equals("未审核") && !newState.equals("已通过") && !newState.equals("未通过")) {
return "非法的审核状态";
}
CancelAppointment cancel_appointment = service.findOne(queryMap);
cancel_appointment.setExamine_state(newState);
this.setEntity(queryMap,new HashMap<>(),cancel_appointment);
5.2.4 实验设备功能实现
实验教师通过ExperimentalEquipmentController中的get_list方法查看所负责实验室的设备列表,包含设备编号、名称、型号及当前状态。教师可通过get_obj方法查看设备详情,包括购置日期与设备备注。实验设备界面如图5-15所示。
图5-16实验设备界面
核心代码实现如下:
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = this.service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
@RequestMapping("/get_obj")
public Map<String, Object> obj(HttpServletRequest request) {
List resultList = service.selectBaseList(service.select(service.readQuery(request), config));
return success(jsonObject);
5.2.5 报废信息功能实现
报废信息功能通过ScrapInformationController中的add方法实现报废申请提交,教师填写报废日期与报废数量后生成申请记录。该方法校验设备数量是否充足,充足时扣减设备库存并将审核状态设置为未审核。报废信息界面如图5-16所示。
图5-17报废信息界面
核心代码实现如下:
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
ScrapInformation scrap_information = new ScrapInformation();
scrap_information.setScrap_date(paramMap.get("scrap_date")==null?null:String.valueOf(paramMap.get("scrap_date")));
scrap_information.setScrapped_quantity(paramMap.get("scrapped_quantity")==null?null:Double.valueOf(String.valueOf(paramMap.get("scrapped_quantity"))));
this.addEntity(scrap_information);
String sql = "UPDATE experimental_equipment INNER JOIN scrap_information ON experimental_equipment.equipment_no=scrap_information.equipment_no SET experimental_equipment.number_of_devices = experimental_equipment.number_of_devices - scrap_information.scrapped_quantity";
5.3 管理员功能实现
5.3.1 时间信息管理功能实现
管理员通过TimeInformationController中的add和set方法管理可预约时段,add方法新增时段记录,set方法修改已有时段。del方法用于删除不再使用的时段,get_list方法供管理员查看所有时段配置。时间信息管理界面如图5-17所示。
图5-18时间信息管理界面
核心代码实现如下:
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
TimeInformation time_information = new TimeInformation();
time_information.setAppointment_time_slot(paramMap.get("appointment_time_slot")==null?null:String.valueOf(paramMap.get("appointment_time_slot")));
this.addEntity(time_information);
}
@PostMapping("/set")
@Transactional
public Map<String, Object> set(HttpServletRequest request) throws IOException {
this.setEntity(queryMap,configMap,time_information);
5.3.2 实验室信息管理功能实现
实验室信息管理由LaboratoryInformationController中的add、set、del方法提供完整增删改查功能,add方法校验实验室编号唯一性后插入记录。管理员可通过get_list方法分页查看所有实验室,set方法更新实验室状态与容量信息。实验室信息管理界面如图5-18所示。
图5-19实验室信息管理界面
核心代码实现如下:
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
LaboratoryInformation laboratory_information = new LaboratoryInformation();
laboratory_information.setLaboratory_number(paramMap.get("laboratory_number")==null?null:String.valueOf(paramMap.get("laboratory_number")));
if (listlaboratory_number.size()>0){
return error(30000, "字段实验室编号内容不能重复");
}
this.addEntity(laboratory_information);
5.3.3 实验室预约管理功能实现
管理员通过LaboratoryReservationController中的get_list方法查看所有预约记录,支持按实验室名称与预约时段筛选。set方法用于管理员干预异常预约,可修改预约状态或审核回复。实验室预约管理界面如图5-19所示。
图5-20实验室预约管理界面
核心代码实现如下:
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = this.service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
@PostMapping("/set")
@Transactional
public Map<String, Object> set(HttpServletRequest request) throws IOException {
this.setEntity(queryMap,configMap,laboratory_reservation);
return success(1);
5.3.4 取消预约管理功能实现
取消预约管理功能由CancelAppointmentController中的get_list方法实现取消申请的分页查询,管理员可查看所有学生的取消申请记录。update_examine_state方法用于处理取消申请的审核。取消预约管理界面如图5-20所示。
图5-21取消预约管理界面
核心代码实现如下:
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = this.service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
@GetMapping("/update_examine_state")
public String updateExamineState(Long id, String newState) throws IOException {
CancelAppointment cancel_appointment = service.findOne(queryMap);
cancel_appointment.setExamine_state(newState);
this.setEntity(queryMap,new HashMap<>(),cancel_appointment);
5.3.5 使用记录管理功能实现
使用记录管理通过UsageLogController中的get_list方法展示所有实验室使用记录,管理员可按实验室名称与预约时段进行筛选查询。get_obj方法用于查看单条使用记录的详细信息。使用记录管理界面如图5-21所示。
图5-22使用记录管理界面
核心代码实现如下:
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = this.service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
@RequestMapping("/get_obj")
public Map<String, Object> obj(HttpServletRequest request) {
List resultList = service.selectBaseList(service.select(service.readQuery(request), config));
return success(jsonObject);
5.3.6 实验设备管理功能实现
实验设备管理由ExperimentalEquipmentController中的add、set、del方法实现设备档案的完整管理,add方法校验设备编号唯一性后插入记录。管理员可通过get_list方法分页查看设备列表,set方法更新设备状态与库存数量。实验设备管理界面如图5-22所示。
图5-23实验设备管理界面
核心代码实现如下:
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
ExperimentalEquipment experimental_equipment = new ExperimentalEquipment();
experimental_equipment.setEquipment_no(paramMap.get("equipment_no")==null?null:String.valueOf(paramMap.get("equipment_no")));
if (listequipment_no.size()>0){
return error(30000, "字段设备编号内容不能重复");
}
this.addEntity(experimental_equipment);
5.3.7 设备使用管理功能实现
设备使用管理通过DeviceUsageController中的get_list方法查看所有设备使用记录,管理员可追踪设备的借用情况。get_obj方法用于查看单条使用记录的详细信息,包括使用时间与使用数量。设备使用管理界面如图5-23所示。
图5-24设备使用管理界面
核心代码实现如下:
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = this.service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
@RequestMapping("/get_obj")
public Map<String, Object> obj(HttpServletRequest request) {
List resultList = service.selectBaseList(service.select(service.readQuery(request), config));
return success(jsonObject);
5.3.8 设备归还管理功能实现
设备归还管理由EquipmentReturnController中的get_list方法提供归还记录的分页查询,管理员可查看所有学生的设备归还情况。get_obj方法用于查看单条归还记录的详细说明。设备归还管理界面如图5-24所示。
图5-25设备归还管理界面
核心代码实现如下:
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = this.service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
@RequestMapping("/get_obj")
public Map<String, Object> obj(HttpServletRequest request) {
List resultList = service.selectBaseList(service.select(service.readQuery(request), config));
return success(jsonObject);
5.3.9 故障信息管理功能实现
管理员通过FaultInformationController中的get_list方法查看所有故障上报记录,支持按设备名称与故障标题筛选。get_obj方法用于查看单条故障的详细上报内容,以便安排维修。故障信息管理界面如图5-25所示。
图5-26故障信息管理界面
核心代码实现如下:
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = this.service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
@RequestMapping("/get_obj")
public Map<String, Object> obj(HttpServletRequest request) {
List resultList = service.selectBaseList(service.select(service.readQuery(request), config));
return success(jsonObject);
5.3.10 维修记录管理功能实现
维修记录管理由MaintenanceRecordsController中的get_list方法实现维修记录的分页展示,管理员可查看所有设备的维修历史。add方法用于新维修记录的登记,关联故障信息表中的设备编号。维修记录管理界面如图5-26所示。
图5-27维修记录管理界面
核心代码实现如下:
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = this.service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
MaintenanceRecords maintenance_records = new MaintenanceRecords();
maintenance_records.setMaintenance_records(paramMap.get("maintenance_records")==null?null:String.valueOf(paramMap.get("maintenance_records")));
this.addEntity(maintenance_records);
5.3.11 报废信息管理功能实现
报废信息管理功能通过ScrapInformationController中的get_list方法查看所有报废申请记录,管理员可使用update_examine_state方法审核申请。审核通过后系统自动扣减设备数量,驳回则保持原有库存。报废信息管理界面如图5-27所示。
图5-28报废信息管理界面
核心代码实现如下:
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = this.service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
@GetMapping("/update_examine_state")
public String updateExamineState(Long id, String newState) throws IOException {
ScrapInformation scrap_information = service.findOne(queryMap);
scrap_information.setExamine_state(newState);
this.setEntity(queryMap,new HashMap<>(),scrap_information);
5.3.12 系统管理功能实现
系统管理功能由SlidesController中的add、set、del方法实现轮播图的配置管理,管理员可上传轮播图片并设置跳转链接。get_list方法用于轮播图列表的分页查询,前端通过该接口获取展示数据。系统管理界面如图5-28所示。
图5-29系统管理界面
核心代码实现如下:
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
Slides slides = JSON.parseObject(JSON.toJSONString(service.readBody(request.getReader())),Slides.class);
if (slides.getTitle()== null || slides.getTitle().trim().isEmpty()){
throw new IllegalArgumentException("标题不能为空");
}
this.addEntity(slides);
}
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = this.service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
第六章 系统测试
6.1 测试目的
系统测试是检验智慧实验室综合管理系统各个功能模块的实现是否符合需求分析阶段所确定的业务规则的过程。对测试过程加以检查,看实验室预约冲突检测逻辑是否正确,对设备使用和归还过程中库存数量的变动情况做出判断,保证故障上报、维修登记等模块数据传递是否完整。经过测试得出系统存在界面交互响应异常、数据校验规则漏项、权限控制漏洞等问题,为系统优化提供依据。测试结果会成为系统是否达到上线交付标准的评判依据[20]。
6.2 测试方法
系统测试采用黑盒测试法,按照功能需求文档中给出的输入输出标准设计测试用例。测试环境在本地开发环境中创建,数据库用独立测试库来避免污染生产数据。对测试执行的三种角色,即学生用户、实验教师和管理员的操作路径做测试执行的覆盖工作,正向路径测试、负向路径测试。正向流程验证用户按照规范操作时系统是否能做出正确的反应,异常情况测试模拟用户输入非法数据或者跳过必要的步骤时系统是否具备容错能力。测试时记录实际输出和预期结果的不同,把缺陷归类并加以修复。
6.3 测试内容
(1)实验室预约功能测试如表6-1所示。
表6-1实验室预约测试用例表
| 测试内容 | 测试步骤 | 预期结果 | 实际结果 |
|---|---|---|---|
| 正常预约 | 选择空闲时段提交申请 | 生成待审核预约记录 | 符合预期 |
| 时段冲突 | 选择已被占用的时段 | 提示时段不可用 | 符合预期 |
| 未登录预约 | 未登录状态下发起预约 | 跳转至登录页面 | 符合预期 |
(2)设备使用功能测试如表6-2所示。
表6-2设备使用测试用例表
| 测试内容 | 测试步骤 | 预期结果 | 实际结果 |
|---|---|---|---|
| 正常借用 | 填写使用信息后提交 | 设备数量减1 | 符合预期 |
| 数量超限 | 使用数量超过库存 | 提示数量不足 | 符合预期 |
| 重复借用 | 已借出未归还再次借用 | 允许再次借用不同设备 | 符合预期 |
(3)故障上报功能测试如表6-3所示。
表6-3故障上报测试用例表
| 测试内容 | 测试步骤 | 预期结果 | 实际结果 |
|---|---|---|---|
| 正常上报 | 填写故障信息后提交 | 生成故障记录 | 符合预期 |
| 必填校验 | 不填写故障标题提交 | 提示标题不能为空 | 符合预期 |
| 上报次数 | 同一设备多次上报 | 上报次数累加 | 符合预期 |
(4)预约审核功能测试如表6-4所示。
表6-4预约审核测试用例表
| 测试内容 | 测试步骤 | 预期结果 | 实际结果 |
|---|---|---|---|
| 通过审核 | 教师点击通过按钮 | 预约状态变更为已通过 | 符合预期 |
| 驳回申请 | 教师点击驳回按钮 | 预约状态变更为已驳回 | 符合预期 |
| 已处理记录 | 对已审核记录重复操作 | 操作无效 | 符合预期 |
(5)报废审核功能测试如表6-5所示。
表6-5报废审核测试用例表
| 测试内容 | 测试步骤 | 预期结果 | 实际结果 |
|---|---|---|---|
| 通过审核 | 管理员确认报废申请 | 设备数量扣减 | 符合预期 |
| 驳回审核 | 管理员驳回申请 | 设备数量不变 | 符合预期 |
| 数量校验 | 报废数量超过库存 | 驳回申请 | 符合预期 |
测试结论
经过实验室预约、设备使用、故障上报、预约审核、报废审核这五个主要功能模块的测试执行之后,系统的各个测试场景的实际输出都和预期的结果保持一致。实验室预约模块可以正确检测时段冲突并产生待审核记录,设备使用模块可以准确扣减库存并记录使用日志,故障上报模块可以正常生成故障记录并累加上报次数。预约审核、报废审核模块的操作响应正确,状态变更、数据更新都符合业务规则的设计要求。测试过程中没有发现阻塞性缺陷或者数据不一致的问题,系统功能的完整性以及数据的准确性达到了预期的目标。
总结
本文完成了基于角色访问控制的智慧实验室综合管理系统的设计和实现工作。系统使用Spring Boot作为后端框架、Vue作为前端框架、MySQL作为数据库、前后端分离的架构。在权限控制上,本系统用RBAC模型做主要的实现方式,建立用户、角色、权限三者之间的联系来达到系统功能访问控制的目的。系统包含学生、实验教师、管理员这三个角色所有的业务需求。
工作总结有如下内容,完成系统需求分析,识别出三类角色的功能需求并画出用例图。进行系统架构设计、功能结构设计、数据库设计。学生端有预约实验室、使用设备、上报故障等十个功能模块。实现了实验教师对实验室信息的管理、预约审核、报废申请这五个功能模块。管理员可以进行系统管理员设置、监控、审核处理等各种各样的功能。对系统进行测试用例设计与测试。
系统存在的不足有设备使用模块没有设置超期未归还自动提醒的功能,数据统计分析维度比较单一。前端界面移动端设备适配性不好。系统没有消息通知功能,用户不能及时知道审核结果的变更。
后续改进方向有在系统中增加逾期未归还设备的自动催还提醒功能,设计数据可视化仪表盘来呈现实验室使用率和设备故障率的排名情况。对前端响应式布局进行优化来适应移动端访问,并且可以实现实时消息推送功能。
参考文献
[1] 穆晓丽.高校实验室管理系统的功能分析与设计[J].信息记录材料,2023,24(08):232-234.
[2] 王以伍,舒晖.基于SpringBoot+Vue前后端分离的高校实验室预约管理系统的设计与实现[J].现代计算机,2023,29(01):114-117.
[3] 黄建,卿斯汉,温红子。带时间特性的角色访问控制[J].软件学报,2003,14 (11):1944-1954.
[4] 王小明,赵宗涛,郝克刚。工作流系统带权角色与周期时间访问控制模型[J].软件学报,2003,14 (11):1841-1848.
[5] 李秋敬,刘广亮,谢圣献,等。基于时间约束的角色访问控制模型研究[J].计算机技术与发展,2009,19 (8):162-165.
[6] 胡继方,倪倩,梅佳琪,等.基于微服务的高校实验室管理系统的设计与实现[J].现代信息科技,2024,8(24):77-81.
[7] 王波,张胜礼.基于移动终端的计算机实验教学平台设计[J].兴义民族师范学院学报,2023,(06):78-84+91.
[8] Ferraiolo D F, Kuhn D R. Role-Based Access Controls [C]. Proceedings of the 15th National Computer Security Conference, 1992.
[9] Sandhu R S, Coyne E J, Feinstein H L, Youman C E. Role-Based Access Control Models [J]. IEEE Computer, 1996.
[10] Sandhu R, Ferraiolo D, Kuhn R. The NIST Model for Role-Based Access Control: Towards a Unified Standard [R]. 2000.
[11] Cong Y ,Li J ,Lou D , et al. Analysis of compliance issues and influencing factors in the management of BSL-2 laboratories for pathogenic microorganisms in Lishui, China[J].Frontiers in Bioengineering and Biotechnology,2025,131637056-1637056.
[12] Verma S ,Bhatele M ,Waoo A A . Advanced security framework for DICOM images using triple watermarking with DWT and SVD for role-based access control[J].Next Research,2025,2(3):100524-100524.
[13] 孙鑫.详解Spring Boot[M].北京:电子工业出版社,2022:528.
[14] 陈承欢.Vue.js基础与应用开发实战[M].北京:人民邮电出版社,2022:318.
[15] 舒蕾,刘均.MySQL数据库应用与维护项目式教程[M].北京:人民邮电出版社,2023:476.
[16] 何受倩,吴道君,曾昊.Java程序设计教程[M].北京:中国铁道出版社,2024:306.
[17] 张海藩,牟永敏。软件工程导论[M].北京:清华大学出版社,2013.
[18] 王珊,萨师煊。数据库系统概论[M].北京:高等教育出版社,2014.
[19] 张基温。信息系统安全原理与应用[M].北京:电子工业出版社,2012.
[20] 王红刚,谢秉贤,王征风.软件工程理论与实践[M].西安:西北大学出版社,2024:262.
致谢
本论文从选题到最终完成,经历了需求分析、系统设计、编码实现到测试验证的完整过程。在课题研究期间,指导教师在论文框架确定与技术路线选择上给出了诸多建议,对系统功能设计的完整性提出了严格要求。实验室管理教师提供了实际业务场景中的管理痛点与操作习惯反馈,使系统功能更贴合使用需求。
家人在这段时间给予的支持成为完成论文的重要支撑,生活中的理解与包容使得能够集中精力投入研究与开发工作。同学之间在技术选型与问题排查过程中的交流,帮助解决了开发中遇到的多个技术难点。能够将课堂所学理论知识应用到实际系统开发中,是一次宝贵的综合锻炼。
回顾整个研究过程,从最初的问题界定到最终的系统成型,每一步都加深了对软件工程理论与Web开发技术的理解。系统的完成不是终点,未来将继续改进系统存在的不足,不断优化用户体验与功能完整性。


被折叠的 条评论
为什么被折叠?



