小型医院医疗设备管理系统bootpf
@TOC
springboot456小型医院医疗设备管理系统bootpf
第1章 绪论
1.1 课题背景
互联网历经多年的发展,在其理论体系和技术层面已经趋于完善,并广泛渗透到社会生活的方方面面。通过网络实现信息传播的各种渠道与手段逐渐成熟起来,并结合现代信息技术工具为人们提供了便捷的服务手段。因此,在各个行业领域中都开始重视并积极采用互联网及相关的软件系统来管理信息资源,在提升自身竞争力的同时实现了资源的有效配置与优化配置目标。针对当前设备信息化管理中存在的诸多问题——如混乱不堪的信息状态、操作失误率较高、信息安全防护不足以及工作强度较大等问题——经过深入分析与考量后发现,在现有条件下最为有效的解决方案就是采用一款现代化的医疗设备管理系统——这种系统不仅可以实现对设备信息化数据的实时处理功能,并且能够大幅缩短设备信息化管理流程的时间长度以及提高其规范化程度;同时还有助于减少工作负担并降低相关管理工作的人力与资金投入成本;因此这款医疗设备管理系统无疑成为实现设备信息化管理环节中的关键性工具之一,并且对管理者而言具有重要的价值与意义
1.2 课题意义
当今信息技术种类日益繁多且容量不断扩大,这标志着进入了全新的信息时代.近年来,计算机技术在速度上取得了突飞猛进的发展,而且在软件开发技术方面也达到了高度成熟的水平.由此可见,贯穿于生活的各个角落只要有信息化管理需求,都会有相应的技术支持.相比手工操作的信息处理方式,采用计算机化的处理手段具有保密性强、效率高、存储空间大以及成本低等显著优势.对于实施设备信息化管理而言,构建小型医院医疗设备信息化管理系统能够实现科学规范的信息管理.
总之,在实际中使用小型医院医疗设备管理系统,其意义如下:
第一点:小型医院医疗设备管理系统的实际运用有助于管理人员能够在短时间内快速处理日常的信息处理任务
第二点:通过优化系统页面的排版布局,可以让系统内容更加清晰易懂,并且用户能够随心所欲地浏览页面信息以及便捷地使用系统所提供的各项功能。
第三点:可以实现信息管理计算机化;
第四点:可以降低信息管理成本;
1.3 研究内容
在构建小型医院医疗设备管理系统的过程中,不仅需要技术支持这一重要保障措施,还需投入大量的人力资源以开展深入的理论研究.本文旨在系统介绍小型医院医疗设备管理系统的相关知识,并 will detail the following main topics:
本节旨在阐述小型医院医疗设备管理系统的研究背景及其重要意义,并为读者提供对该系统的基本理解。
阐述开发小型医院医疗设备管理系统的项目时,需重点关注所需的基础环境的搭建.这不仅涵盖技术支撑和工具配置的完善.
在本部分中:阐述用户对小型医疗机构医疗设备管理系统功能指标的需求以及对其性能指标的技术实现需求
第四部分:介绍数据库的设计方案,以及根据功能要求设计的功能结构;
第五部分:介绍通过编码最终实现的系统功能运行效果;
第六部分:阐述系统的功能评估过程,全面检验系统的各项性能指标,并迅速处理可能出现的故障,最终确保系统达到预期状态。
第2章 开发环境与技术
小型医院医疗设备管理系统的编码实现需要建立必要的前提条件,并采用相关技术手段完成;下面将详细介绍小型医院医疗设备管理系统所涉及的技术与工具。
2.1 MYSQL数据库
本课题开发的应用程序在数据操作方面具有不确定性,并且频繁变化。由于无法将数据直接存入文档中,在保证安全性的同时实现应用程序功能存在挑战。如果希望实现应用程序所需的数据存储功能,则不得不面对专业数据库存储软件的选择问题。结合个人学习经验及操作习惯进行考虑后发现 MySQL 数据库凭借其小巧精悍的特点成为最佳选择!
2.2 vue技术
当动态网站刚刚兴起时
2.3 Spring Boot框架
Spring Boot源自Pivotal团队提供的全新开源框架¹,其设计初衷是通过简化配置过程来辅助开发者高效搭建及运行新的Spring应用²。该框架采用了独特的方法进行配置设置³,从而避免了开发者需要手动定义标准化配置文件的习惯。正是通过这种方式实现目标,在快速应用开发领域中迅速崛起成为行业领军者。
Spring Boot 采用了 Spring 4.0 的设计理念,在继承 Spring 框架原有优势的同时,进一步优化了应用部署与开发流程。此外 Spring Boot 通过整合多种框架成功地解决了版本兼容性和引用稳定性等常见问题。
在SpringBoot框架中拥有两个关键策略:开箱即用与约定优于配置(Convention over Configuration)。开箱即用(Outofbox),也被称为"自动部署"机制,则是在开发过程中无需手动配置对象生命周期的状态。具体而言,在MAVEN项目的pom文件中加入相应的依赖项,并利用对应的注解替代传统的XML配置文件以管理对象生命周期。这种设计使得开发者能够避免繁琐的配置工作以及依赖管理任务的负担,并能将更多精力投入到核心业务逻辑的设计与实现中。而约定优于配置(Convention over Configuration)则是一种由SpringBoot自身提供的设计范式,在此架构下目标结构由开发者通过代码明确定义而非预先指定参数或属性值来实现系统功能的设计理念。尽管这一特点会降低一部分灵活性并增加代码调试难度的同时也会减少开发人员需要做出的重要决策数量以及冗余的XML配置内容同时还能自动化编译测试与打包等操作流程从而显著提升了开发效率与代码维护性
Spring Boot应用系统开发模板的基本架构设计从 frontend 至 backend 展开说明:前端常用模板引擎主要有 Freemarker 和 Thymeleaf 两种常见类型;它们均基于 Java 语言编写,并负责将静态 HTML、CSS 等内容动态化渲染输出;这种分离使得界面设计与业务逻辑实现更加独立;与此同时前端还会集成 Bootstrap、AngularJS 和 jQuery 等流行组件库;网络传输采用 JSON 而非 XML 格式,并提供 RESTful API 服务接口;当数据传输至服务器时,SpringMVC 框架负责接收并处理相关请求;在数据访问层主要部署 Hibernate、MyBatis 和 JPA 等主流持久层框架;数据库推荐使用 MySQL 作为存储解决方案;建议选用 IntelliJ IDEA 作为主要开发工具。
第3章 系统分析
针对即将要开发的系统,在项目初期就要做好前期规划与评估工作,并将其作为整个软件工程过程中不可或缺的重要步骤来对待。在对系统的进行全面评估的过程中,则需要涵盖的主要内容包括项目可行性的评估、对其功能需求以及运行效率的技术评估等问题。
3.1 可行性分析
在严格对需要建设的项目进行投资之前,一个至关重要步骤是不可忽视的,即可行性分析.它主要依据当前技术和经济等指标来评估工程系统的可行性,在投资决策中常被采用的一种科学方法用于论证项目.
3.1.1 技术可行性
当前技术已发展至成熟阶段,在线获取开发操作指南以及经过规范化处理的模块化代码等信息都可为开发者提供参考依据;此外,在线获取开发工具的操作规范以及经过规范化处理的模块化代码等信息都可为开发者提供参考依据;此外,在线获取开发工具的操作规范以及经过规范化处理的模块化代码等信息都可为开发者提供参考依据
3.1.2 经济可行性
在本系统开发过程中需配置所需的软环境,在线即可免费下载安装相关的软件包。所需硬件设备性能要求不高,在网咖及校园机房内的普通电脑均可满足基本需求。因此从经济角度来看,在小规模医院中实施医疗设备管理系统具备可行性
3.1.3 操作可行性
小型医院医疗设备管理系统的开发基于用户的使用习惯,在界面设计上具有一致性,并同时拥有良好的导航功能。因此,熟悉操作电脑的人群都可以轻松操作小型医院医疗设备管理系统。
总之,从上述的论证来看,本系统可以开发。
3.2 系统流程
流程图这种工具能够清晰地展示系统内部的操作逻辑,并且有助于用户更有效地理解整个系统的运行机制。
3.2.1 操作流程
进入本系统需访员提交身份认证信息;经身份认证符合条件的访员方可获得存取权限;请参考下图查看详细操作流程;操作人员应按登录界面提示准确填写相关参数;当所有认证程序完成时,请访员输入必要信息以便获取相应服务内容

图3.1 操作流程图
3.2.2 登录流程
本系统的登录模块的具体流程如图所示。该系统会对访问者输入的各种验证信息逐一审查,并根据实际情况进行评估。当系统接收到录入错误的信息时(例如账号不符、密码错误等情况),将向用户提供相应的反馈提示以供纠正。最终所有输入均符合标准后,则认为用户已成功登录

图3.2 登录流程图
3.2.3 删除信息流程
在长期运行过程中,本系统会生成大量无价值的数据信息。为了避免资源浪费和数据混乱,必须定期进行数据清理工作。具体的操作流程已附于下图。首先需要选定需要清除的具体数据对象,并通过反复核对相关数据信息以确保准确性。在此基础上操作前,请确保所有标记均为最终确认状态;否则可能导致重要数据丢失或误删现象的发生。特别提示,在执行删除操作时,请确保所选中的标记均为最终确认状态;否则可能会出现无法恢复的情况或者导致系统出现异常行为。

图3.3 删除信息流程图
3.2.4 添加信息流程
该系统的主要功能是展示信息并提供各项服务。其中一者即为数据添加功能。具体情况可见于下图。使操作者能够在信息录入页面输入相关数据;当这些数据经检验符合标准后,在指定页面上即可显示出相关结果。

图3.4 添加信息流程图
3.3 性能需求
完成需求分析工作,涵盖根据用户实际需求设计功能模块,并全面进行性能指标的需求评估。因此,在对系统进行全面设计开发时,一方面需要明确系统的功能性要求,另一方面还需要关注系统的性能指标。
随后将对系统的性能指标进行评估,并对以下几点进行深入探讨:界面友好度、系统的时间响应特性和运行效率、系统的可靠性和稳定性。
(1)时间特性需求:系统在接收和处理数据时均需满足特定的时间约束条件;这也反映了系统的固有时间特性特征。通常情况下会对数据处理所需的时间进行详细分析;同时会设定针对请求的响应时长;并且在满负荷运行状态下系统的容差范围数值也需要在设计阶段予以充分考虑和确定
(2)界面友好性:在满足基本功能性的同时,在设计人机交互界面时还需注重用户的使用习惯,并涵盖以下几方面:包括界面布局规划、对界面色调的选择和色彩搭配等细节处理。旨在让经过简明培训后的用户能够独立操作系统各项功能。
(3)系统可靠性:对新手来说,一个常见问题就是开发设计的系统因人为操作失误导致系统崩溃,在某些情况下也可能引发电脑完全停止运行。这表明这类容错性不足的系统在可靠性方面存在明显缺陷,并不适合作为日常处理信息的可靠平台使用。在设计过程中需综合考虑模块化和结构化设计理念,并根据具体需求采取相应的优化措施以提升系统的稳定性。对于时效性要求较高的系统,则需要结合冗余技术和多层次保护机制来进一步增强系统的可靠性。
第4章 系统设计
一个精心打造的现代信息管理系统具备高度丰富性,在界面美观和功能性方面也体现出极强的用户体验感。因此为增强其整体吸引力、吸引更多访客进入平台并延长他们在平台上的停留时间,则表明该信息管理系统的设计方案较为科学合理。
4.1 设计原则
本系统的开发必须遵循一定的系统设计原则。为了实现开发系统的高质量、功能全面且完善的特性。便于简便的操作。从而最大限度地满足使用者的需求。除基础性的易于操作性之外还需要安全性和准确性作为核心的设计准则
第一条设计理念:以便捷性为核心。在开发过程中需确保系统功能模块全面且功能完善。各接口的设计要做到友好性和直观的操作体验。在使用过程中需保证用户能够快速上手并完成基本操作。对数据处理流程进行优化以提升效率,并通过设置合理的提示信息来提升用户体验。此外,在开发阶段需考虑系统的可扩展性和维护性要求以确保长期稳定运行
第二条设计要点是关于安全性的要求。该系统在登录功能中实施身份认证流程,在此过程中会对不同访客的身份信息进行审查。当访客提供相关凭证时,系统将调用预设的安全验证程序来对比 incoming data。成功通过比对的访客将被允许进入预先定义的功能区。这种机制有助于防止非授权用户的未经授权的数据获取行为发生。
第三个设计原则:准确性原则。为了确保用户提交的数据具有准确性与可靠性,在系统开发过程中应充分考虑数据验证机制的设计。为此建议采用预设错误提示功能,并在系统界面中提供详细的错误信息解析功能。这将有助于指导用户识别并修正数据中的各类错误问题,并保证最终提交的信息符合规范要求。例如,在设置密码时规定密码长度不低于6位字符的同时还应规定数据类型不能全部为数字形式以避免潜在的安全漏洞
4.2 功能结构设计
基于先前对管理员功能的分析,在此基础上规划并执行后续的设计工作,并将展示所设计的管理员结构图(见下图)。该模块将实现管理员对设备信息的增删改查操作

4.3 数据库设计
在开发系统的过程中,必须先进行数据库的设计.该数据库存储了大量相关数据.这些数据按照特定的方式进行了组织管理.目前 databases能够广泛应用于各种应用程序的原因在于其最优的数据存储方式.尽管 databases 提供了高效的信息存储服务,但它们与应用程序之间依然保持着较高的独立性.总结而言, databases经过长期的发展,已经从默默无闻到如今的广泛应用,其技术和理论基础也日益完善.
(1)下图是设备维修实体和其具备的属性。

设备维修实体属性图
(2)下图是设备报损实体和其具备的属性。

设备报损实体属性图
(3)下图是领导实体和其具备的属性。

领导实体属性图
(4)下图是设备出入库房实体和其具备的属性。

设备出入库房实体属性图
(5)下图是库房实体和其具备的属性。

库房实体属性图
(6)下图是设备采购实体和其具备的属性。

设备采购实体属性图
(7)下图是质量检测登记实体和其具备的属性。

质量检测登记实体属性图
(8)下图是设备转科实体和其具备的属性。

设备转科实体属性图
(9)下图是公告资讯实体和其具备的属性。

公告资讯实体属性图
(10)下图是设备实体和其具备的属性。

设备实体属性图
(11)下图是科室职员实体和其具备的属性。

科室职员实体属性图
4.3.2 数据库物理设计
本数据库属于关系型数据库体系,在这种体系中,默认地采用的是基于二维表格的模型。不言而喻的是,在这种体系中,默认地采用的是基于二维表格的模型。这也使得二维表的结构设计变得尤为重要。在进行相关设计时,则需要我们对这些基本概念有清晰的认识:首先我们需要了解什么是"关系"?其次则是"元组"的本质特征是什么?再之是"属性"所代表的具体意义是什么?另外还需要明确"域"的基本功能是什么?最后则是如何正确运用"关键字"来实现数据完整性管理的要求?下面将较为详细地阐述以下五个核心概念:'关系'、'元组'、'属性'、'域'以及'关键字'各自的定义与作用。
关系:相当于数据库中的一张数据表;每个表格都有一个名称;每个关系都有自己的名称;也就是它的名称。
元组:元组就是数据表中的一行记录;
属性:属性就是数据表中的字段,也就是数据表中的一列;
域:域就是对数据表中属性的取值进行限定;
关键字:关键字就是数据表中的主键;
在掌握了表结构设计的基本概念之后,在数据库中需要先创建数据模型并根据之前绘制好的E-R图来规划和完成各数据表的详细设计工作,并给每个数据表命名。下面将展示设计结果的具体方案。
表4.1设备采购表
| 序号 | 列名 | 数据类型 | 说明 | 允许空 |
|---|---|---|---|---|
| 1 | Id | Int | id | 否 |
| 2 | shebei_id | Integer | 设备 | 是 |
| 3 | yonghu_id | Integer | 科室职员 | 是 |
| 4 | caigoujihua_number | Integer | 采购数量 | 是 |
| 5 | caigoujihua_text | String | 备注 | 是 |
| 6 | caigoujihua_yesno_types | Integer | 申请状态 | 是 |
| 7 | caigoujihua_yesno_text | String | 申请结果 | 是 |
| 8 | insert_time | Date | 录入时间 | 是 |
| 9 | create_time | Date | 创建时间 | 是 |
表4.2字典表
| 序号 | 列名 | 数据类型 | 说明 | 允许空 |
|---|---|---|---|---|
| 1 | Id | Int | id | 否 |
| 2 | dic_code | String | 字段 | 是 |
| 3 | dic_name | String | 字段名 | 是 |
| 4 | code_index | Integer | 编码 | 是 |
| 5 | index_name | String | 编码名字 | 是 |
| 6 | super_id | Integer | 父字段id | 是 |
| 7 | beizhu | String | 备注 | 是 |
| 8 | create_time | Date | 创建时间 | 是 |
表4.3库房表
| 序号 | 列名 | 数据类型 | 说明 | 允许空 |
|---|---|---|---|---|
| 1 | Id | Int | id | 否 |
| 2 | kufang_uuid_number | String | 库房编号 | 是 |
| 3 | kufang_name | String | 库房名称 | 是 |
| 4 | kufang_types | Integer | 库房类型 | 是 |
| 5 | kufang_address | String | 库房地址 | 是 |
| 6 | kufang_content | String | 库房介绍 | 是 |
| 7 | kufang_delete | Integer | 逻辑删除 | 是 |
| 8 | insert_time | Date | 录入时间 | 是 |
| 9 | create_time | Date | 创建时间 | 是 |
表4.4领导表
| 序号 | 列名 | 数据类型 | 说明 | 允许空 |
|---|---|---|---|---|
| 1 | Id | Int | id | 否 |
| 2 | lingdao_name | String | 领导名称 | 是 |
| 3 | lingdao_phone | String | 领导手机号 | 是 |
| 4 | lingdao_id_number | String | 领导身份证号 | 是 |
| 5 | lingdao_photo | String | 领导头像 | 是 |
| 6 | lingdao_email | String | 领导邮箱 | 是 |
| 7 | lingdao_delete | Integer | 逻辑删除 | 是 |
| 8 | insert_time | Date | 添加时间 | 是 |
| 9 | create_time | Date | 创建时间 | 是 |
表4.5公告资讯表
| 序号 | 列名 | 数据类型 | 说明 | 允许空 |
|---|---|---|---|---|
| 1 | Id | Int | id | 否 |
| 2 | news_name | String | 公告标题 | 是 |
| 3 | news_types | Integer | 公告类型 | 是 |
| 4 | news_photo | String | 公告图片 | 是 |
| 5 | insert_time | Date | 添加时间 | 是 |
| 6 | news_content | String | 公告详情 | 是 |
| 7 | create_time | Date | 创建时间 | 是 |
表4.6设备表
| 序号 | 列名 | 数据类型 | 说明 | 允许空 |
|---|---|---|---|---|
| 1 | Id | Int | id | 否 |
| 2 | shebei_uuid_number | String | 设备编号 | 是 |
| 3 | shebei_name | String | 设备名称 | 是 |
| 4 | shebei_types | Integer | 设备类型 | 是 |
| 5 | shebei_kucun_number | Integer | 设备库存 | 是 |
| 6 | kufang_id | Integer | 库房 | 是 |
| 7 | keshi_types | Integer | 所在科室 | 是 |
| 8 | shebei_content | String | 设备介绍 | 是 |
| 9 | shangxia_types | Integer | 是否上架 | 是 |
| 10 | shebei_delete | Integer | 逻辑删除 | 是 |
| 11 | insert_time | Date | 录入时间 | 是 |
| 12 | create_time | Date | 创建时间 | 是 |
表4.7设备出入库房表
| 序号 | 列名 | 数据类型 | 说明 | 允许空 |
|---|---|---|---|---|
| 1 | Id | Int | id | 否 |
| 2 | shebei_id | Integer | 设备 | 是 |
| 3 | yonghu_id | Integer | 科室职员 | 是 |
| 4 | shebeichuruku_types | Integer | 出入库类型 | 是 |
| 5 | shebeichuruku_number | Integer | 出入库数量 | 是 |
| 6 | shebeichuruku_text | String | 备注 | 是 |
| 7 | shebeichuruku_yesno_types | Integer | 申请状态 | 是 |
| 8 | shebeichuruku_yesno_text | String | 申请结果 | 是 |
| 9 | insert_time | Date | 录入时间 | 是 |
| 10 | create_time | Date | 创建时间 | 是 |
表4.8设备转科表
| 序号 | 列名 | 数据类型 | 说明 | 允许空 |
|---|---|---|---|---|
| 1 | Id | Int | id | 否 |
| 2 | shebei_id | Integer | 设备 | 是 |
| 3 | yonghu_id | Integer | 科室职员 | 是 |
| 4 | keshi_types | Integer | 要转的科室 | 是 |
| 5 | shebeizhuanke_text | String | 备注 | 是 |
| 6 | shebeizhuanke_yesno_types | Integer | 申请状态 | 是 |
| 7 | shebeizhuanke_yesno_text | String | 申请结果 | 是 |
| 8 | insert_time | Date | 录入时间 | 是 |
| 9 | create_time | Date | 创建时间 | 是 |
表4.9设备报损表
| 序号 | 列名 | 数据类型 | 说明 | 允许空 |
|---|---|---|---|---|
| 1 | Id | Int | id | 否 |
| 2 | shebei_id | Integer | 设备 | 是 |
| 3 | yonghu_id | Integer | 科室职员 | 是 |
| 4 | shebiebaosun_number | Integer | 报损数量 | 是 |
| 5 | shebiebaosun_text | String | 备注 | 是 |
| 6 | shebiebaosun_yesno_types | Integer | 申请状态 | 是 |
| 7 | shebiebaosun_yesno_text | String | 申请结果 | 是 |
| 8 | insert_time | Date | 录入时间 | 是 |
| 9 | create_time | Date | 创建时间 | 是 |
表4.10质量检测登记表
| 序号 | 列名 | 数据类型 | 说明 | 允许空 |
|---|---|---|---|---|
| 1 | Id | Int | id | 否 |
| 2 | shebei_id | Integer | 设备 | 是 |
| 3 | yonghu_id | Integer | 科室职员 | 是 |
| 4 | shebiejiance_number | Integer | 质量检测登记数量 | 是 |
| 5 | shebiejiance_text | String | 备注 | 是 |
| 6 | shebiejiance_yesno_types | Integer | 申请状态 | 是 |
| 7 | shebiejiance_yesno_text | String | 申请结果 | 是 |
| 8 | insert_time | Date | 录入时间 | 是 |
| 9 | create_time | Date | 创建时间 | 是 |
表4.11设备维修表
| 序号 | 列名 | 数据类型 | 说明 | 允许空 |
|---|---|---|---|---|
| 1 | Id | Int | id | 否 |
| 2 | shebei_id | Integer | 设备 | 是 |
| 3 | yonghu_id | Integer | 科室职员 | 是 |
| 4 | shebieweixiu_number | Integer | 维修数量 | 是 |
| 5 | shebieweixiu_text | String | 备注 | 是 |
| 6 | shebieweixiu_yesno_types | Integer | 申请状态 | 是 |
| 7 | shebieweixiu_yesno_text | String | 申请结果 | 是 |
| 8 | insert_time | Date | 录入时间 | 是 |
| 9 | create_time | Date | 创建时间 | 是 |
表4.12科室职员表
| 序号 | 列名 | 数据类型 | 说明 | 允许空 |
|---|---|---|---|---|
| 1 | Id | Int | id | 否 |
| 2 | yonghu_name | String | 职员名称 | 是 |
| 3 | yonghu_phone | String | 职员手机号 | 是 |
| 4 | yonghu_id_number | String | 职员身份证号 | 是 |
| 5 | yonghu_photo | String | 职员头像 | 是 |
| 6 | keshi_types | Integer | 科室 | 是 |
| 7 | yonghu_email | String | 职员邮箱 | 是 |
| 8 | yonghu_delete | Integer | 逻辑删除 | 是 |
| 9 | insert_time | Date | 添加时间 | 是 |
| 10 | create_time | Date | 创建时间 | 是 |
表4.13管理员表
| 序号 | 列名 | 数据类型 | 说明 | 允许空 |
|---|---|---|---|---|
| 1 | Id | Int | id | 否 |
| 2 | username | String | 医院名 | 是 |
| 3 | password | String | 密码 | 是 |
| 4 | role | String | 角色 | 是 |
| 5 | addtime | Date | 新增时间 | 是 |
5.1职员信息管理
如图5-1所示的是员工信息管理界面,在此界面中管理员能够执行以下操作:进行员工记录查询与管理;支持删除员工记录、更新员工资料以及新增员工作为选项。
还进行了对用户名称的模糊查询的条件

图5.1 职员信息管理页面
5.2 设备信息管理
如图5-2所示的是设备信息管理界面,在线编辑器提供了多种功能选项:首先支持查看已发布的信息数据;其次允许更新现有设备记录;此外还具备将特定资源标记为失效状态的能力;操作者还可以直接删除不再有效的资源;同时系统内置了针对设备名称的模糊检索以及按类型筛选等功能

图5.2 设备信息管理页面
5.3库房信息管理
如图5.3所示的是库房信息管理界面,该界面为管理员提供了多种功能:支持基于库存数据的筛选操作,并且能够增建、更新以及核对库存记录等基本管理任务。

图5.3 库房信息管理页面
5.1公告信息管理
如图5.4所示的是公告信息管理页面。该页面旨在为管理员提供一系列功能选项:包括但不限于新增公告内容、对现有公告进行编辑以及检索所需公告等。

图5.4 公告信息管理页面
ShebeizhuankeController.java
package com.controller;
import java.io.File;
import java.math.BigDecimal;
import java.net.URL;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
import org.springframework.beans.BeanUtils;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.service.TokenService;
import com.utils.*;
import java.lang.reflect.InvocationTargetException;
import com.service.DictionaryService;
import org.apache.commons.lang3.StringUtils;
import com.annotation.IgnoreAuth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.*;
import com.entity.view.*;
import com.service.*;
import com.utils.PageUtils;
import com.utils.R;
import com.alibaba.fastjson.*;
/** * 设备转科
* 后端接口
* @author
* @email
*/
@RestController
@Controller
@RequestMapping("/shebeizhuanke")
public class ShebeizhuankeController {
private static final Logger logger = LoggerFactory.getLogger(ShebeizhuankeController.class);
private static final String TABLE_NAME = "shebeizhuanke";
@Autowired
private ShebeizhuankeService shebeizhuankeService;
@Autowired
private TokenService tokenService;
@Autowired
private CaigoujihuaService caigoujihuaService;//设备采购
@Autowired
private DictionaryService dictionaryService;//字典
@Autowired
private KufangService kufangService;//库房
@Autowired
private LingdaoService lingdaoService;//领导
@Autowired
private NewsService newsService;//公告资讯
@Autowired
private ShebeiService shebeiService;//设备
@Autowired
private ShebeichurukuService shebeichurukuService;//设备出入库房
@Autowired
private ShebiebaosunService shebiebaosunService;//设备报损
@Autowired
private ShebiejianceService shebiejianceService;//质量检测登记
@Autowired
private ShebieweixiuService shebieweixiuService;//设备维修
@Autowired
private YonghuService yonghuService;//科室职员
@Autowired
private UsersService usersService;//管理员
/** * 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永不会进入");
else if("科室职员".equals(role))
params.put("yonghuId",request.getSession().getAttribute("userId"));
else if("领导".equals(role))
params.put("lingdaoId",request.getSession().getAttribute("userId"));
CommonUtil.checkMap(params);
PageUtils page = shebeizhuankeService.queryPage(params);
//字典表数据转换
List<ShebeizhuankeView> list =(List<ShebeizhuankeView>)page.getList();
for(ShebeizhuankeView c:list){
//修改对应字典表字段
dictionaryService.dictionaryConvert(c, request);
}
return R.ok().put("data", page);
}
/** * 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id, HttpServletRequest request){
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
ShebeizhuankeEntity shebeizhuanke = shebeizhuankeService.selectById(id);
if(shebeizhuanke !=null){
//entity转view
ShebeizhuankeView view = new ShebeizhuankeView();
BeanUtils.copyProperties( shebeizhuanke , view );//把实体数据重构到view中
//级联表 设备
//级联表
ShebeiEntity shebei = shebeiService.selectById(shebeizhuanke.getShebeiId());
if(shebei != null){
BeanUtils.copyProperties( shebei , view ,new String[]{ "id", "createTime", "insertTime", "updateTime", "yonghuId"});//把级联的数据添加到view中,并排除id和创建时间字段,当前表的级联注册表
view.setShebeiId(shebei.getId());
}
//级联表 科室职员
//级联表
YonghuEntity yonghu = yonghuService.selectById(shebeizhuanke.getYonghuId());
if(yonghu != null){
BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime", "yonghuId"});//把级联的数据添加到view中,并排除id和创建时间字段,当前表的级联注册表
view.setYonghuId(yonghu.getId());
}
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/** * 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody ShebeizhuankeEntity shebeizhuanke, HttpServletRequest request){
logger.debug("save方法:,,Controller:{},,shebeizhuanke:{}",this.getClass().getName(),shebeizhuanke.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永远不会进入");
else if("科室职员".equals(role))
shebeizhuanke.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
ShebeiEntity shebeiEntity = shebeiService.selectById(shebeizhuanke.getShebeiId());
if(shebeiEntity.getKeshiTypes() == shebeizhuanke.getKeshiTypes()){
return R.error("当前科室和要转的科室不能为同一个");
}
Wrapper<ShebeizhuankeEntity> queryWrapper = new EntityWrapper<ShebeizhuankeEntity>()
.eq("shebei_id", shebeizhuanke.getShebeiId())
.eq("yonghu_id", shebeizhuanke.getYonghuId())
.eq("keshi_types", shebeizhuanke.getKeshiTypes())
.in("shebeizhuanke_yesno_types", new Integer[]{1,2})
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
ShebeizhuankeEntity shebeizhuankeEntity = shebeizhuankeService.selectOne(queryWrapper);
if(shebeizhuankeEntity==null){
shebeizhuanke.setShebeizhuankeYesnoTypes(1);
shebeizhuanke.setInsertTime(new Date());
shebeizhuanke.setCreateTime(new Date());
shebeizhuankeService.insert(shebeizhuanke);
return R.ok();
}else {
if(shebeizhuankeEntity.getShebeizhuankeYesnoTypes()==1)
return R.error(511,"有相同的待审核的数据");
else if(shebeizhuankeEntity.getShebeizhuankeYesnoTypes()==2)
return R.error(511,"有相同的审核通过的数据");
else
return R.error(511,"表中有相同数据");
}
}
/** * 后端修改
*/
@RequestMapping("/update")
public R update(@RequestBody ShebeizhuankeEntity shebeizhuanke, HttpServletRequest request) throws NoSuchFieldException, ClassNotFoundException, IllegalAccessException, InstantiationException {
logger.debug("update方法:,,Controller:{},,shebeizhuanke:{}",this.getClass().getName(),shebeizhuanke.toString());
ShebeizhuankeEntity oldShebeizhuankeEntity = shebeizhuankeService.selectById(shebeizhuanke.getId());//查询原先数据
String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");
// else if("科室职员".equals(role))
// shebeizhuanke.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
shebeizhuankeService.updateById(shebeizhuanke);//根据id更新
return R.ok();
}
/** * 审核
*/
@RequestMapping("/shenhe")
public R shenhe(@RequestBody ShebeizhuankeEntity shebeizhuankeEntity, HttpServletRequest request){
logger.debug("shenhe方法:,,Controller:{},,shebeizhuankeEntity:{}",this.getClass().getName(),shebeizhuankeEntity.toString());
ShebeizhuankeEntity oldShebeizhuanke = shebeizhuankeService.selectById(shebeizhuankeEntity.getId());//查询原先数据
if(shebeizhuankeEntity.getShebeizhuankeYesnoTypes() == 2){//通过
ShebeiEntity shebeiEntity = new ShebeiEntity();
shebeiEntity.setId(oldShebeizhuanke.getShebeiId());
shebeiEntity.setKeshiTypes(oldShebeizhuanke.getKeshiTypes());
shebeiService.updateById(shebeiEntity);
}
shebeizhuankeService.updateById(shebeizhuankeEntity);//审核
return R.ok();
}
/** * 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids, HttpServletRequest request){
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
List<ShebeizhuankeEntity> oldShebeizhuankeList =shebeizhuankeService.selectBatchIds(Arrays.asList(ids));//要删除的数据
shebeizhuankeService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/** * 批量上传
*/
@RequestMapping("/batchInsert")
public R save( String fileName, HttpServletRequest request){
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
List<ShebeizhuankeEntity> shebeizhuankeList = new ArrayList<>();//上传的东西
Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
Date date = new Date();
int lastIndexOf = fileName.lastIndexOf(".");
if(lastIndexOf == -1){
return R.error(511,"该文件没有后缀");
}else{
String suffix = fileName.substring(lastIndexOf);
if(!".xls".equals(suffix)){
return R.error(511,"只支持后缀为xls的excel文件");
}else{
URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径
File file = new File(resource.getFile());
if(!file.exists()){
return R.error(511,"找不到上传文件,请联系管理员");
}else{
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
dataList.remove(0);//删除第一行,因为第一行是提示
for(List<String> data:dataList){
//循环
ShebeizhuankeEntity shebeizhuankeEntity = new ShebeizhuankeEntity();
// shebeizhuankeEntity.setShebeiId(Integer.valueOf(data.get(0))); //设备 要改的
// shebeizhuankeEntity.setYonghuId(Integer.valueOf(data.get(0))); //科室职员 要改的
// shebeizhuankeEntity.setKeshiTypes(Integer.valueOf(data.get(0))); //要转的科室 要改的
// shebeizhuankeEntity.setShebeizhuankeText(data.get(0)); //备注 要改的
// shebeizhuankeEntity.setShebeizhuankeYesnoTypes(Integer.valueOf(data.get(0))); //申请状态 要改的
// shebeizhuankeEntity.setShebeizhuankeYesnoText(data.get(0)); //申请结果 要改的
// shebeizhuankeEntity.setInsertTime(date);//时间
// shebeizhuankeEntity.setCreateTime(date);//时间
shebeizhuankeList.add(shebeizhuankeEntity);
//把要查询是否重复的字段放入map中
}
//查询是否重复
shebeizhuankeService.insertBatch(shebeizhuankeList);
return R.ok();
}
}
}
}catch (Exception e){
e.printStackTrace();
return R.error(511,"批量插入数据异常,请联系管理员");
}
}
}
ShebiebaosunServiceImpl.java
package com.service.impl;
import com.utils.StringUtil;
import com.service.DictionaryService;
import com.utils.ClazzDiff;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.*;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import com.utils.PageUtils;
import com.utils.Query;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import com.dao.ShebiebaosunDao;
import com.entity.ShebiebaosunEntity;
import com.service.ShebiebaosunService;
import com.entity.view.ShebiebaosunView;
/** * 设备报损 服务实现类
*/
@Service("shebiebaosunService")
@Transactional
public class ShebiebaosunServiceImpl extends ServiceImpl<ShebiebaosunDao, ShebiebaosunEntity> implements ShebiebaosunService {
@Override
public PageUtils queryPage(Map<String,Object> params) {
Page<ShebiebaosunView> page =new Query<ShebiebaosunView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,params));
return new PageUtils(page);
}
}
BaiduUtil.java
package com.utils;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONObject;
/** * @author yangliyuan
* @version 创建时间:2020年2月7日 下午9:37:05
* 类说明 :
*/
public class BaiduUtil {
/** * 根据经纬度获得省市区信息
* @param lon 纬度
* @param lat 经度
* @param coordtype 经纬度坐标系
* @return
*/
public static Map<String, String> getCityByLonLat(String key, String lng, String lat) {
String location = lat + "," + lng;
try {
//拼装url
String url = "http://api.map.baidu.com/reverse_geocoding/v3/?ak="+key+"&output=json&coordtype=wgs84ll&location="+location;
String result = HttpClientUtils.doGet(url);
JSONObject o = new JSONObject(result);
Map<String, String> area = new HashMap<>();
area.put("province", o.getJSONObject("result").getJSONObject("addressComponent").getString("province"));
area.put("city", o.getJSONObject("result").getJSONObject("addressComponent").getString("city"));
area.put("district", o.getJSONObject("result").getJSONObject("addressComponent").getString("district"));
area.put("street", o.getJSONObject("result").getJSONObject("addressComponent").getString("street"));
return area;
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
/** * 获取API访问token
* 该token有一定的有效期,需要自行管理,当失效时需重新获取.
* @param ak - 百度云官网获取的 API Key
* @param sk - 百度云官网获取的 Securet Key
* @return assess_token
*/
public static String getAuth(String ak, String sk) {
// 获取token地址
String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
String getAccessTokenUrl = authHost
// 1. grant_type为固定参数
+ "grant_type=client_credentials"
// 2. 官网获取的 API Key
+ "&client_id=" + ak
// 3. 官网获取的 Secret Key
+ "&client_secret=" + sk;
try {
URL realUrl = new URL(getAccessTokenUrl);
// 打开和URL之间的连接
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
connection.setRequestMethod("GET");
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.err.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String result = "";
String line;
while ((line = in.readLine()) != null) {
result += line;
}
/** * 返回结果示例
*/
System.err.println("result:" + result);
org.json.JSONObject jsonObject = new org.json.JSONObject(result);
String access_token = jsonObject.getString("access_token");
return access_token;
} catch (Exception e) {
System.err.printf("获取token失败!");
e.printStackTrace(System.err);
}
return null;
}
}
声明
本博客覆盖多样化的学术与教育领域。
涵盖个人自学、技术开发与设计实践的产品。
仅作为参考资料提供;旨在为研究人员深入分析与系统研究相关的材料。
