A-计算机毕业设计定制:23324基于区域链技术的医疗应用管理 (免费领源码)可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C# 、C++、python、数据可视化、大数据、全套文案

摘 要

随着信息技术的快速发展,基于区块链技术的应用正在逐渐扩展到各个领域,其中包括医疗行业。传统的医疗管理系统存在许多问题,例如数据安全性、数据隐私性、信息共享等方面的挑战。而区块链技术的去中心化、不可篡改以及数据共享的特性,为医疗应用管理系统提供了一种新的解决方案。因此,基于区块链技术的医疗应用管理的系统设计与实现具有重要的研究意义。

本文通过市场调研,根据实际要求决定采用Java开发语言,通过Springboot框架使用MySQL数据库,基于区块链技术进行开发医疗应用管理系统,该系统的实现可以有效解决传统医疗管理系统所面临的问题。通过系统能够提供更高的数据安全性和隐私性,保护用户的医疗信息不被篡改或泄露,同时,可以促进用户、医生与医院之间的合作与协作,增强交流交互,提高医疗服务的质量和效率。

关键词:医疗应用管理;区域链技术;Springboot;Java


ABSTRACT

With the rapid development of information technology, applications based on blockchain technology are gradually expanding to various fields, including the medical industry. Traditional medical management systems face many challenges, such as data security, data privacy, and information sharing. The decentralization, immutability, and data sharing characteristics of blockchain technology provide a new solution for medical application management systems. Therefore, the design and implementation of a medical application management system based on blockchain technology is of great research significance.

This article conducts market research and decides to use Java development language according to actual requirements. Using the Springboot framework and MySQL database, a medical application management system is developed based on blockchain technology. The implementation of this system can effectively solve the problems faced by traditional medical management systems. The system can provide higher data security and privacy, protect user medical information from tampering or leakage, promote cooperation and collaboration between users, doctors, and hospitals, enhance communication and interaction, and improve the quality and efficiency of medical services.

Key words:Medical application management; Regional chain technology; Springboot; Java


目 录

1绪  论

1.1研究背景与意义

1.2国内外研究现状

1.3开发工具介绍

1.3.1Java编程语言

1.3.2MySQL数据库

1.3.3区块链技术

1.3.4Springboot框架

2需求分析

2.1系统概述

2.2系统功能需求

2.3系统性能需求

2.4可行性分析

2.5开发环境

3总体设计

3.1系统架构设计

3.2功能模块设计

3.3数据库设计

4详细设计及实现

4.1注册模块的实现

4.2登录模块的实现

4.3用户模块的实现

4.4后台管理模块的实现

4.5数据库连接

5系统测试

5.1测试任务及目的

5.2测试计划

5.3测试用例

5.4测试结论

结 论

谢 辞

参考文献

附 录

1绪  论

1.1研究背景与意义

随着信息技术的快速发展,基于区块链技术的应用正在逐渐扩展到各个领域,其中包括医疗行业。智能技术的发展不仅改变了工程和制造业,也改变了医疗系统。智能技术的发展使得实时处理大型数据集变得愈快愈好,同时,区块链技术的使用也使得治疗方案的比较和诊疗意见的自动化成为可能,患者和医疗服务提供者之间的交流也变得更加透明。

医疗数据需要高度的安全性和隐私性。医疗记录的安全性对于保护数据不受安全漏洞和犯罪活动的影响变得越来越重要。传统的医疗管理系统存在许多问题,例如数据安全性、数据隐私性、信息共享等方面的挑战。而区块链技术的去中心化、不可篡改以及数据共享的特性,为医疗应用管理系统提供了一种新的解决方案。因此,基于区块链技术的医疗应用管理的系统设计与实现具有重要的研究意义。

“互联网+医疗”为医疗领域事务管理和业务开展提供了丰富便捷的手段和技术,本文通过市场调研,根据实际要求决定采用Java开发语言,通过Springboot框架使用MySQL数据库,基于区块链技术进行开发医疗应用管理,该系统的实现可以有效解决传统医疗管理系统所面临的问题。通过系统能够提供更高的数据安全性和隐私性,保护用户的医疗信息不被篡改或泄露,同时,可以促进用户、医生与医院之间的合作与协作,增强交流交互,提高医疗服务的质量和效率。此外,区块链技术在医保结算管理和费用结算管理方面也具有潜在的应用价值。

 因此,设计与实现基于区块链技术的医疗应用管理系统对于提升医疗行业的信息化水平和服务质量具有重要的意义。

1.2国内外研究现状

目前,基于区块链技术的医疗应用管理系统的研究和应用已经引起了广泛的关注和讨论,在国内外都取得了一些重要的研究成果。

在国际上,许多国家和地区都在积极探索基于区块链技术的医疗应用管理系统。例如,美国的一些研究机构和医疗机构已开始尝试使用区块链技术来管理患者的医疗信息和数据,以提高数据的安全性和隐私性。同时,一些欧洲国家也在开展相关研究,通过建立基于区块链的电子健康档案系统,实现医疗信息的共享和交互。

在国内,也有一些研究机构和医疗机构在研究基于区块链技术的医疗应用管理系统。例如,某些医疗大数据平台利用区块链技术确保数据的真实性和可信度,为医疗机构和患者提供安全的数据交换和共享平台。此外,一些医院还在实践基于区块链的电子病历系统,实现医疗数据的安全存储和共享。

总体而言,基于区块链技术的医疗应用管理系统的研究和实践在国内外正处于起步阶段。虽然还存在许多挑战和问题需要解决,例如数据隐私保护、智能合约的设计和实施等,但是区块链技术为医疗行业提供了一种新的解决方案,有望在未来推动医疗信息化的发展,提升医疗服务的质量和效率。

1.3开发工具介绍

1.3.1Java编程语言

Java是一种流行的编程语言,能够面向对象的高级编程语言,具有简单、可移植、安全和高性能等特点,在软件开发领域广泛应用。其可移植性得益于Java虚拟机(JVM),使得Java程序可以在不同平台上运行,只需编写一次代码。Java注重安全性,提供了字节码验证、异常处理和访问控制等安全机制,确保程序的稳定和安全,能够帮助开发者轻松构建可靠、可移植和安全的应用程序。

1.3.2MySQL数据库

MySQL是一个开源的关系型数据库管理系统(RDBMS),它是目前世界上最流行的数据库之一。MySQL由瑞典公司MySQL AB开发,并于2000年正式发布。它被广泛应用于各种规模的应用程序,从小型个人项目到大型企业级应用程序。由于MySQL具有灵活性、可靠性和性能优势,它在各种场景下都得到广泛应用,包括网站、企业级应用程序、移动应用程序、数据分析和物联网等。MySQL可以使用关系模型来组织数据,并使用结构化查询语言(SQL)进行数据库管理和数据操作;运行在多个操作系统上,包括Windows、Linux、MacOS等;支持横向和纵向扩展,可以通过添加更多的服务器节点或增加硬件资源来处理更大规模的数据和负载。

1.3.3区块链技术

区块链(Block Chain)本质上是一个去中心化的分布式数据库,能实现数据信息的分布式记录与分布式存储。狭义的区块链是一种按照时间顺序将数据区块以链条方式组合成特定数据结构,以密码学方式保证不可篡改和不可伪造的去中心化共享总账,能够安全存储简单的、有先后关系的、能在系统内验证的数据。广义的区块链技术则是利用加密链式区块结构来验证与存储数据、利用分布式节点共识算法生成和更新数据,利用自动化智能合约脚本代码来编程和操作数据的一种全新的去中心化基础架构与分布式计算范式。

区块链技术根据实际应用场景和需求具有公共链、联盟链和私有链三种应用模式。公共链是完全去中心化的区块链,无官方组织及管理机构,无中心服务器,参与的组织机构按照系统规则自由接入网络、不受控制,机构间基于共识机制幵展工作。联盟链则是部分去中心化的区块链,由若干机构联合发起,介于公有链和私有链之间,取舍两者权利和义务的分配,并对分布式账本的访问做一定的访问控制,适用于多个实体构成的组织或联盟。私有链则是完全中心化的区块链,其写入权限由中心机构控制,读取权限可视需求有选择性地对外开放,适用于特定机构的内部数据管理与审计等。区块链具有防篡改、去中心化、不可逆和智能合约等极具价值的特性,对于当前医疗领域存在的行业痛点,区块链技术可以解决医疗领域所面临的信任问题、降低协调成本、减轻中心计算压力,实现资源共享,提供更多的可能性。

1.3.4Springboot框架

Spring Boot是一个基于Spring的开源框架,它通过简化配置和快速启动内嵌式服务器,帮助开发人员快速搭建基于Spring的应用程序。Spring Boot引入了“约定优于配置”的理念,提供了许多开箱即用的功能和插件,使得开发者能够更加专注于业务逻辑的开发,而不用花费太多精力在配置上。并且能够通过自动配置和约定优于配置的原则,大大简化了应用程序的配置过程,支持内嵌式的服务器,例如Tomcat、Jetty等,可以快速启动和运行应用程序,方便开发和部署。


2需求分析

2.1系统概述

本医疗应用管理首先根据使用该网站的用户的角色和用户需求划分为普通用户,医生用户,管理员三大模块。

其中普通用户模块主要实现普通用户的注册登录,并具有首页、交流论坛、通知公告、健康资讯、医生信息、我的账户、个人中心(个人首页、紧急医疗、医疗咨询、预约挂号、就诊信息、服务评价、医保结算、费用结算、健康档案、收藏)等功能。

普通用户角色的用例展示如图2-1所示。

图2-1 普通用户角色用例图

医生用户模块主要实现用户的注册登录,并具有首页、交流论坛、通知公告、健康资讯、医生信息、我的账户、个人中心(个人首页、医生信息、紧急医疗、医疗咨询、预约挂号、就诊信息、服务评价、药品信息、健康档案、收藏)等功能。

医生用户角色的用例展示如图2-2所示。

图2-2 医生用户角色用例图

管理员模块主要负责管理系统信息数据和维护系统正常运行,具有后台首页、系统用户、医生信息管理、紧急医疗管理、医疗咨询管理、预约挂号管理、就诊信息管理、服务评价管理、医保结算管理、费用结算管理、药品信息管理、健康档案管理、排班信息管理、系统管理、通知公告管理、资源管理等工鞥,可以对信息进行新增、修改、删除、查询等操作,同时可以对自己账号的个人信息和密码进行管理。

管理员角色的用例展示如图2-3所示。

图2-3 管理员角色用例图

2.2系统功能需求

根据医疗应用管理功能需求分析,主要划分为了普通用户模块、医生用户和管理员模块这三大模块。具体如下:

普通用户模块:

  1. 注册登录:游客可以通过注册成为系统用户,使用账号密码可进行登录,使用系统功能。
  2. 首页:可查看轮播图和使用系统其他功能。
  3. 交流论坛:可查看所有交流论坛消息,支持局部搜索,点击可查看详情,可点击进行发布内容操作,并进行点赞、收藏和评论。
  4. 通知公告:可查看包括关于我们、联系方式、网站介绍等管理员发布的所有通知公告,点击可查看详情。
  5. 健康资讯:可查看所有健康资讯信息,支持局部、筛选、排序搜索,热门文章推荐,点击可查看详情,进行点赞、收藏和评论。
  6. 医生信息:可查看所有医生信息,支持医生姓名、排序搜索,点击可查看详情,进行点赞、收藏和评论,并可点击咨询、挂号操作。
  7. 我的账户:对个人资料进行管理,包括修改密码和修改资料(头像、昵称、邮箱、用户姓名、用户性别)。
  8. 个人中心:可对个人首页、紧急医疗、医疗咨询、预约挂号、就诊信息、服务评价、医保结算、费用结算、健康档案、收藏等信息进行管控。例如,可查看紧急医疗、医疗咨询、预约挂号、就诊信息、服务评价、医保结算、费用结算、健康档案、收藏等详情信息内容,此外还可以进行添加紧急医疗信息,填写服务评价,在费用结算中支付自己的费用等操作。

医生用户模块:

  1. 注册登录:医生可以通过注册成为系统用户,使用账号密码可进行登录,使用系统功能。
  2. 首页:可查看轮播图和使用系统其他功能。
  3. 交流论坛:可查看所有交流论坛消息,支持局部搜索,点击可查看详情,可点击进行发布内容操作,并进行点赞、收藏和评论。
  4. 通知公告:可查看包括关于我们、联系方式、网站介绍等管理员发布的所有通知公告,点击可查看详情。
  5. 健康资讯:可查看所有健康资讯信息,支持局部、筛选、排序搜索,热门文章推荐,点击可查看详情,进行点赞、收藏和评论。
  6. 医生信息:可查看所有医生信息,支持医生姓名、排序搜索,点击可查看详情,进行点赞、收藏信息。
  7. 我的账户:对个人资料进行管理,包括修改密码和修改资料(头像、昵称、邮箱、用户姓名、用户性别)。
  8. 个人中心:可对个人首页、医生信息、紧急医疗、医疗咨询、预约挂号、就诊信息、服务评价、药品信息、健康档案、收藏等信息进行管控。例如,可查看人首页、医生信息、紧急医疗、医疗咨询、预约挂号、就诊信息、服务评价、药品信息、健康档案、收藏等的详信息情内容,此外还可以对医疗咨询进行回复,审核预约挂号和紧急医疗信息,添加就诊信息等。

管理员模块:

  1. 登录:管理员账号密码由系统直接生成,可以随时进入到系统中,使用系统各项管理操作,同时还可以对个人信息和修改密码进行管控。
  2. 系统用户:可对普通用户、医生用户和管理员进行管控,包括进行增删改查操作,点击可查看详情,医生用户账号信息由管理员添加
  3. 医生信息管理:可查看所有医生信息,进行增改删查操作,支持医生姓名搜索,点击可查看详情
  4. 紧急医疗管理:可查看所有紧急医疗信息,进行增改删查操作,支持用户姓名、审核状态搜索,点击可查看详情,进行审核
  5. 医疗咨询管理:可查看所有医疗咨询信息,进行查询和删除操作,支持用户姓名、医生姓名搜索,点击可查看详情
  6. 预约挂号管理: 可查看所有预约挂号信息,进行查询和删除操作,支持用户姓名、医生姓名搜索,点击可查看详情,并可点击就诊,填写并提交就诊信息
  7. 就诊信息管理:可查看所有就诊信息信息,进行查询和删除操作,支持用户姓名、医生姓名搜索,点击可查看详情,并可点击评价和医保,查看评价和医保信息
  8. 服务评价管理:可查看所有服务评价信息,进行查询和删除操作,支持用户姓名、医生姓名搜索,点击可查看详情
  9. 医保结算管理:可查看所有医保结算信息,进行查询和删除操作,支持用户姓名、审核状态搜索,点击可查看详情,进行审核,并可点击费用,进行添加费用信息
  10. 费用结算管理:可查看所有费用结算信息,进行增改删查操作,支持用户姓名、审核状态搜索,点击可查看详情
  11. 药品信息管理:可查看所有药品信息,进行增改删查操作,支持药品名称搜索,点击可查看详情
  12. 健康档案管理:可查看所有健康档案信息,进行增改删查操作,支持用户姓名搜索,点击可查看详情
  13. 排班信息管理:可查看所有排班信息,进行增改删查操作,支持排班时间搜索,点击可查看详情和查看评论
  14. 系统管理:可对首页的轮播图进行管理,进行增删改查操作,支持标题搜索,可点击查看详情
  15. 通知公告管理:可对通知公告进行管理,进行增删改查操作,支持标题搜索,可点击查看详情
  16. 资源管理:可对健康资讯和资讯分类进行管理,进行增删改查操作,健康资讯支持标题、标签、分类搜索,可点击查看详情和查看评论;资讯分类支持类型名称搜索,可点击查看详情
  17. 交流管理:可对交流论坛和论坛分类进行管理,进行增删改查操作,交流论坛支持标题、标签、分类搜索,可点击查看详情和查看评论;交流论坛分类类型名称搜索,可点击查看详情。

2.3系统性能需求

系统性能需求是指对一个系统的性能需求进行分析和定义的过程。在进行性能需求分析时,因此医疗应用管理的设计与实现主要需要考虑以下几个方面的性能需求:

响应时间:响应时间是指系统在接收到请求后,作出响应的时间。根据具体的业务需求和用户体验要求,可以确定系统在不同场景下的响应时间要求。

吞吐量:吞吐量是指系统在一定时间内处理的事务或请求的数量。根据业务需求和用户量的估计,可以确定系统需要支持的最大吞吐量。

并发用户数:并发用户数是指系统在同时使用的用户数量。根据预期的用户量和并发访问需求,可以确定系统需要支持的最大并发用户数。

可扩展性:可扩展性是指系统在面对用户量增加或并发访问需求增加时,能否通过增加硬件资源或调整系统架构来满足需求。根据预期的用户增长和扩展计划,可以确定系统需要具备的可扩展性要求。

故障处理能力:系统对故障的处理能力是指在出现错误或故障时,系统能够快速、准确地识别、定位并处理故障的能力。根据业务的重要性和对故障处理的要求,可以确定系统需要具备的故障处理能力。

安全性:系统在性能需求分析中,也需考虑安全方面的需求,如数据的保密性、完整性和可用性等。根据具体的安全需求和合规要求,可以确定系统需要满足的安全性需求。

通过对这些性能需求进行详细分析和定义,可以为医疗应用管理的设计和开发提供指导,确保系统在满足预期的性能需求的同时,具备良好的性能和可靠性。

2.4可行性分析

2.4.1技术可行性

医疗应用管理选择根据实际要求决定采用Java开发语言,通过Springboot框架使用MySQL数据库,基于区块链技术来实现系统的功能需求,来支持医疗应用管理。具备界面友好、操作简单、数据安全、系统稳定可扩展,并通过计算机来编写代码和设计页面,和使用Tomcat服务器,来保证相应硬件设备的稳定性和扩展性。区块链具有防篡改、去中心化、不可逆和智能合约等极具价值的特性,对于当前医疗领域存在的行业痛点,区块链技术可以解决医疗领域所面临的信任问题、降低协调成本、减轻中心计算压力,实现资源共享,提供更多的可能性。同时,所使用的开发工具都能够从网上免费下载,费用低且可行,能够节省开发成本。此外,开发团队只要具备Web开发经验和相关领域知识,就能够能够高效地进行系统设计与开发。所以从技术角度分析具有可行性。

2.4.2运行可行性

基于区域链技术的医疗应用管理在系统开发阶段进行充分的测试和调试工作,因此确保系统在正式投入使用时各个运行阶段过程都能够正常运行;该平台稳定高和可靠强,能够避免出现系统崩溃或数据丢失等问题。另外,考虑到未来平台可能会有更多的用户和交易量,医疗应用管理还具备良好的可扩展性和数据安全性,能够方便地进行水平扩展或功能扩展,实现医疗应用管理需求。同时,使用者只要具备一定的电脑知识即可使用普通电脑运行进入医疗应用管理,使用系统功能。所以从运行角度分析具有可行性。

2.5开发环境

为了更好的实现系统功能,医疗应用管理根据实际要求,选择常见的Windows、Linux、MacOS等操作系统,采用Java开发语言,通过Springboot框架使用MySQL数据库,基于区块链技术进行设计与实现。


3总体设计

3.1系统架构设计

系统主要的数据访问方式是:通过浏览器页面用户可以进入系统,系统可以自动对用户向服务器发送的请求进行处理,处理请求是在系统后台中进行的,用户在浏览器页面上进行相应操作,就能够看到服务端传递的处理结果。 基于springboot的小说网站系统主要分为视图-模型-控制三层架构设计。在视图层中,主要是操作在服务器端向客户端反馈并显示的数据,在模型层中,主要处理相关的业务逻辑、数据整合等,最后的控制层它介于视图和模型之间,主要是调整两层之间的关系,最终落实数据的传递。

系统架构图如下图所示。

图4-1 系统架构图

3.2功能模块设计

3.2.1前台功能模块设计

系统设计的目的是分析系统包括的所有功能结构,为开发人员设计开发和实现系统做好准备工作。经过前期的需求调查、分析和整理之后,确定的总体需求主要包括多个模块,系统整体角色分普通用户、医生用户和管理员,其中管理员是最高权限拥有者。系统功能结构图如下图所示。

图3-2 功能模块图

3.3数据库设计

3.3.1概念模型

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

根据前面的数据流程图,结合系统的功能模块设计,设计出符合系统的各信息实体。下面是整个基于区域链技术的医疗应用管理主要的数据库表总E-R实体关系图。

图3-3 数据库总体E-R图

3.3.2数据表

通过上一小节中医疗应用管理中总E-R关系图上得出一共需要创建很多个数据表。

在此我主要罗列几个主要的数据库表结构设计。

表3-1 regular_users (普通用户)

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

regular_users_id

int

10

0

N

Y

普通用户ID

2

user_name

varchar

64

0

Y

N

用户姓名

3

user_gender

varchar

64

0

Y

N

用户性别

4

contact_information

varchar

64

0

Y

N

联系方式

5

examine_state

varchar

16

0

N

N

已通过

审核状态

6

user_id

int

10

0

N

N

0

用户ID

7

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

8

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间

表3-2 doctor_users (医生用户)

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

doctor_users_id

int

10

0

N

Y

医生用户ID

2

doctors_name

varchar

64

0

Y

N

医生姓名

3

doctors_gender

varchar

64

0

Y

N

医生性别

4

contact_information

varchar

64

0

Y

N

联系方式

5

examine_state

varchar

16

0

N

N

已通过

审核状态

6

user_id

int

10

0

N

N

0

用户ID

7

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

8

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间

表3-3 doctor (医生信息)

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

doctor_id

int

10

0

N

Y

医生信息ID

续表

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

2

doctor_users

int

10

0

Y

N

0

医生用户

3

doctors_name

varchar

64

0

Y

N

医生姓名

4

doctors_photo

varchar

255

0

Y

N

医生照片

5

working_hours

varchar

64

0

Y

N

上班时间

6

doctors_expertise

varchar

64

0

Y

N

医生专长

7

doctor_qualification

varchar

64

0

Y

N

医生资质

8

employment_time

varchar

64

0

Y

N

从业时间

9

doctor_introduction

text

65535

0

Y

N

医生简介

10

hits

int

10

0

N

N

0

点击数

11

praise_len

int

10

0

N

N

0

点赞数

12

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

13

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间

表3-4 drug_information (药品信息)

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

drug_information_id

int

10

0

N

Y

药品信息ID

2

drug_name

varchar

64

0

Y

N

药品名称

3

drug_images

varchar

255

0

Y

N

药品图片

4

drug_number

varchar

64

0

Y

N

药品编号

5

drug_inventory

int

10

0

Y

N

0

药品库存

6

drug_expiration_date

date

10

0

Y

N

药品有效期

7

drug_effects

text

65535

0

Y

N

药品作用

8

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

9

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间

表3-4 emergency_medical_care (紧急医疗)

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

emergency_medical_care_id

int

10

0

N

Y

紧急医疗ID

续表

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

2

regular_users

int

10

0

Y

N

0

普通用户

3

user_name

varchar

64

0

Y

N

用户姓名

4

help_seeking_time

datetime

19

0

Y

N

求助时间

5

help_location

varchar

64

0

Y

N

求助地点

6

patient_situation

text

65535

0

Y

N

患者情况

7

examine_state

varchar

16

0

N

N

未审核

审核状态

8

examine_reply

varchar

16

0

Y

N

审核回复

9

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

10

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间

表3-6 have_an_appointment_with_a_doctor (预约挂号)

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

have_an_appointment_with_a_doctor_id

int

10

0

N

Y

预约挂号ID

2

regular_users

int

10

0

Y

N

0

普通用户

3

user_name

varchar

64

0

Y

N

用户姓名

4

doctor_users

int

10

0

Y

N

0

医生用户

5

doctors_name

varchar

64

0

Y

N

医生姓名

6

appointment_time

datetime

19

0

Y

N

预约时间

7

appointment_content

text

65535

0

Y

N

预约内容

8

examine_state

varchar

16

0

N

N

未审核

审核状态

9

examine_reply

varchar

16

0

Y

N

审核回复

10

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

11

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间

表3-7 health_records (健康档案)

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

health_records_id

int

10

0

N

Y

健康档案ID

2

regular_users

int

10

0

Y

N

0

普通用户

3

user_name

varchar

64

0

Y

N

用户姓名

4

user_blood_pressure

int

10

0

Y

N

0

用户血压

5

disease_history

varchar

64

0

Y

N

疾病史

6

medical_history

varchar

64

0

Y

N

药物史

7

health_condition

text

65535

0

Y

N

健康状况

8

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

9

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间

表3-8 medical_consultation (医疗咨询)

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

medical_consultation_id

int

10

0

N

Y

医疗咨询ID

续表

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

2

regular_users

int

10

0

Y

N

0

普通用户

3

user_name

varchar

64

0

Y

N

用户姓名

4

doctor_users

int

10

0

Y

N

0

医生用户

5

doctors_name

varchar

64

0

Y

N

医生姓名

6

consultation_content

text

65535

0

Y

N

咨询内容

7

reply_content

text

65535

0

Y

N

回复内容

8

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

9

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间

表3-9 medical_insurance_settlement (医保结算)

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

medical_insurance_settlement_id

int

10

0

N

Y

医保结算ID

2

regular_users

int

10

0

Y

N

0

普通用户

续表

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

3

user_name

varchar

64

0

Y

N

用户姓名

4

medical_insurance_type

varchar

64

0

Y

N

医保类型

5

total_expenses

varchar

64

0

Y

N

费用合计

6

declaration_time

datetime

19

0

Y

N

申报时间

7

examine_state

varchar

16

0

N

N

未审核

审核状态

8

examine_reply

varchar

16

0

Y

N

审核回复

9

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

10

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间

表3-10 cost_settlement (费用结算)

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

cost_settlement_id

int

10

0

N

Y

费用结算ID

续表

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

2

regular_users

int

10

0

Y

N

0

普通用户

3

user_name

varchar

64

0

Y

N

用户姓名

4

total_expenses

int

10

0

Y

N

0

费用合计

5

medical_insurance_reimbursement

int

10

0

Y

N

0

医保报销

6

actual_expenses

varchar

64

0

Y

N

实际费用

7

pay_state

varchar

16

0

N

N

未支付

支付状态

8

pay_type

varchar

16

0

Y

N

支付类型: 微信、支付宝、网银

9

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

10

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间


4详细设计及实现

4.1注册模块的实现

普通用户和医生用户需要进行注册才能拥有系统账号用户在填写数据的时候必须与注册页面上的验证相匹配否则会注册失败,注册页面的表单验证是通过JavaScript进行验证的,用户名的长度必须在6到18之间,邮箱必须带有@符号,密码和密码确认必须相同,你输入的密码,系统会根据你输入密码的强度给出指定的值,电话号码和身份证号码必须要求输入格式与生活相符合,当你前台验证通过的时候你点击注册,表单会将你输入的值通过name值传递给后台并保存到数据库中。

用户注册流程图如下图所示。

图4-1 用户注册流程图

用户注册界面如下图所示。

图4-2 用户注册界面

4.2登录模块的实现

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

登录合法性判断过程:用户输入账号和密码后,系统首先确定输入输入数据合法性,然后在login.Java页面发送登录请求,调用src下的mainctrl类的dopost方法来验证。

用户登录模块的IPO如下所示:

输入:用户名和密码。

处理:

1)检测用户输入的账号、密码是否正确及在数据库已对应存在。

2)从数据库中提取记录,并储存在本地的session中(timeout默认=30min)。

3)根据用户名,将其显示在系统首页上。

输出:是否成功的信息。

登录流程图如下所示。

图4-3 登录流程图

用户登录界面如下所示。

图4-4 用户登录界面

4.3用户模块的实现

4.3.1前台首页模块

普通用户和医生用户登录登录进入系统前台首页界面,可查看轮播图、网站公告、幼教新闻等信息,可使用系统其他功能。这里以普通用户的首页界面为例。

普通用户首页沟通交流界面如下图所示。

图4-4 普通用户首页界面

4.3.2交流论坛模块

普通用户和医生用户点击“交流论坛”可查看所有交流论坛消息,支持局部搜索,点击可查看详情,可点击进行发布内容操作,并进行点赞、收藏和评论。这里以医生用户的交流论坛界面为例。

医生用户交流论坛界面如下图所示。

图4-5 医生用户交流论坛界面

4.3.3医生信息模块

普通用户和医生用户点击“医生信息”这一按钮,可查看所有医生信息,支持医生姓名、排序搜索,点击可查看详情,进行点赞、收藏和评论,并且普通用户还可点击咨询、挂号操作。这里以普通用户的医生信息界面为例。

普通用户咨询、挂号操作流程图如下所示。

图5-6 普通用户医生咨询和预约挂号流程图

普通用户医生信息界面如下图所示。

图4-7 普通用户医生信息详情界面

4.3.4普通用户个人中心模块

普通用户可对个人首页、紧急医疗、医疗咨询、预约挂号、就诊信息、服务评价、医保结算、费用结算、健康档案、收藏等信息进行管控。例如,可查看紧急医疗、医疗咨询、预约挂号、就诊信息、服务评价、医保结算、费用结算、健康档案、收藏等详情信息内容,此外还可以进行添加紧急医疗信息,填写服务评价,在费用结算中支付自己的费用等操作。界面如下图所示。

图4-8 普通用户个人中心界面

4.3.5医生用户个人中心模块

医生用户点击“个人中心”这一按钮,可对个人首页、医生信息、预约记录、收藏等信息进行管控。点击“医生信息”,可管理自己发布的医生信息,包括进行增改删查操作,支持教师姓名、课程主题搜索,可点击查看包括发布账号、教师姓名、课程主题、视频文件、发布时间、详情说明等详情信息;点击“预约记录”,可管理自己的预约记录,包括进行查询和删除操作,支持用户姓名、联系方式、预约时间、审核状态搜索,可点击查看包括预约账号、用户姓名、联系方式、预约内容、审核状态、审核回复等详情信息,并进行审核;点击“收藏”,可管理包括幼教新闻、医生信息等所有收藏信息,进行查看和删除操作,点击某一篇可进行查看详情信息。界面如下图所示。

图4-9 医生用户个人中心界面

4.4后台管理模块的实现

4.4.1系统用户模块

可对普通用户、医生用户和管理员进行管控,包括进行增删改查操作,点击可查看详情,医生用户账号信息由管理员添加。界面如下图所示。

图4-10 添加医生用户界面

4.4.2医生信息管理模块

可查看所有医生信息,进行增改删查操作,支持医生姓名搜索,点击可查看详情。界面如下图所示。

图4-11 医生信息管理界面

4.4.3紧急医疗管理模块

可查看所有紧急医疗信息,进行增改删查操作,支持用户姓名、审核状态搜索,点击可查看详情,进行审核。界面如下图所示。

图4-12 紧急医疗管理详情界面

4.4.4医疗咨询管理模块

可查看所有医疗咨询信息,进行查询和删除操作,支持用户姓名、医生姓名搜索,点击可查看详情。界面如下图所示。

图4-13 医疗咨询管理界面

4.4.5预约挂号管理模块

 可查看所有预约挂号信息,进行查询和删除操作,支持用户姓名、医生姓名搜索,点击可查看详情,并可点击就诊,填写并提交就诊信息。界面如下图所示。

图4-14 预约挂号管理界面

4.4.6服务评价管理模块

可查看所有服务评价信息,进行查询和删除操作,支持用户姓名、医生姓名搜索,点击可查看详情。界面如下图所示。

图4-15 服务评价管理界面

4.4.7医保结算管理模块

可查看所有医保结算信息,进行查询和删除操作,支持用户姓名、审核状态搜索,点击可查看详情,进行审核,并可点击费用,进行添加费用信息。界面如下图所示。

图4-16 医保结算管理界面

4.4.8健康档案管理模块

可查看所有健康档案信息,进行增改删查操作,支持用户姓名搜索,点击可查看详情。界面如下图所示。

图4-17 健康档案管理详情界面

4.5数据库连接

数据库连接是指应用程序与数据库之间建立的连接,通过该连接可以进行数据的读取、写入和修改操作。JDBC连接:JDBC是Java语言访问数据库的标准API。通过JDBC连接,可以使用Java程序访关系型数据库MySQL。使用JDBC连接数据库的主要步骤包括加载数据库驱动、建立连接、创建Statement对象、执行SQL语句、处理结果。从Springboot架构的原理可知,二手汽车推荐系统分析系统的各大模块的实现均需要对数据库的数据进行操作,具体包括查询数据、写入数据、更新数据和删除数据。

数据库流程图如下图所示。

图4-28 数据库查询流程图

数据库配置文件关键代码如下:

db = SQLAlchemy()

app = Springboot(__name__, static_folder='static')

# 数据库链接配置

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@127.0.0.1:3306/projectxxxxx'

app.secret_key = 'v&#prqo7t*(!ktb+8r=+83@#_$n1pg_xig$j=6v^r3#$i)wx87'

db.init_app(app)

app.config['UPLOAD_FOLDER'] = 'static/upload'


5系统测试

5.1测试任务及目的

测试是为了发现在开发的程序中所存在的问题,测试这一工作是非常艰巨的,而又是非常困难的,这一部分在程序的设计中占有很大比例,可以说一个程序的开发工作量要是占据了百分至六十,那么剩下的百分之四十必然是测试这一部分,甚至更高。所有的软件上线之前,都应该进行充足的测试之后才能保证上线后不会Bug频发,或者是功能不满足需求等问题的发生。下面分别从单元测试,功能测试和用例测试来对系统进行测试以保证系统的稳定性和可靠性。

软件测试和开发过程有着密切的联系,它们都需要遵循严格的管理学原则,以确保软件的可靠性和可用性。因此,为了验证医疗应用管理的有效性,我们需要对其各个功能模块的运行情况和性能进行严格的检查和验证。一旦检查结果出现问题,我们将立即采取措施,并尽快纠正,从而为用户提供更加优质的服务。

5.2测试计划

测试计划是软件测试过程中的一个关键文档,用于指导测试活动的执行。它提供了测试范围、测试目标、测试策略、测试任务、测试资源和时间安排等信息,以确保测试工作可以按照既定的计划进行。

对于医疗应用管理的设计与实现,以下是具体的测试计划:

简要介绍测试计划的目的和背景,以及所涉及的软件系统或模块的概述。明确测试的目的,例如验证系统的功能正确性、性能测试、安全性测试等。明确测试的范围,包括被测系统的模块、功能和性能指标等。定义测试方法和技术,包括黑盒测试、白盒测试、集成测试、回归测试等。列出具体的测试任务和测试活动,包括测试用例设计、测试环境搭建、测试数据准备、测试执行和缺陷管理等。明确测试所需的人员、设备、工具和环境等资源,并进行资源分配和安排。制定测试的时间表和计划安排,包括测试开始时间、结束时间、里程碑和关键节点等。识别可能的测试风险和问题,并提供相应的风险管理策略和措施。定义缺陷报告、缺陷分类、缺陷优先级和缺陷解决流程等。定义何时结束测试,在什么条件下可以发布软件。

5.3测试用例

5.3.1登录模块测试用例

管理员、普通用户、医生用户登录后才能使用全部系统功能。下表是系统登录功能测试用例,检测了用户名和密码的不同的输入情况,观察系统的响应情况。得出该功能达到了设计目标。

表5-1 系统登录功能测试用例

用例名称

用户登录系统

目的

测试用户通过正确的用户名和密码可否登录功能

前提

未登录的情况下

测试流程

1) 进入登录页面

2) 输入正确的用户名和密码

预期结果

用户名和密码正确的时候,跳转到登录成功界面,反之则显示错误信息,提示重新输入

实际结果

实际结果与预期结果一致

5.3.2注册模块测试用例

用户需要经过普通用户系统账号,才能够进行登录。下表是注册功能测试用例,检测了各种数据的输入情况,观察系统的响应情况。得出该功能达到了设计目标。

表5-2 注册功能测试用例

用例名称

用户注册系统

目的

测试用户通过正确的输入用户名、密码以及个人信息进行账号注册

前提

未拥有系统账号

测试流程

1) 进入注册页面

2) 输入正确的注册信息

预期结果

注册信息正确的时候,跳转到登录成功界面,反之则显示错误信息,提示重新输入(医生用户注册信息还需要管理员审核)

实际结果

实际结果与预期结果一致

5.3.3创建数据模块测试用例

在系统中,创建功能也是基础功能之一,因此创建功能的测试很有代表性。在此章节主要列举在创建时各种情况下系统结果的测试。由于系统涉及创建功能操作过多,因此将多处统称创建功能。

表5-4 创建数据功能测试用例

用例名称

系统使用者进行创建数据

目的

测试系统使用者通过正确输入信息进行创建数据

前提

登录的情况下

测试流程

1) 系统使用者进入系统页面,进行创建数据

2) 输入正确的数据信息

预期结果

数据信息输入正确的时候,提示创建数据成功,反之则显示错误信息,提示重新输入,创建数据失败

实际结果

实际结果与预期结果一致

5.3.4修改数据模块测试用例

在系统中,修改功能是系统主要实现功能,因此修改功能的测试很有代表性。在此章节主要列举在修改时各种情况下系统结果的测试。由于系统涉及修改功能操作过多,因此将多处数据表记录修改和状态修改统称修改功能。

表5-4 修改数据功能测试用例

用例名称

系统使用者进行修改数据

目的

测试系统使用者对可修改的数据项进行修改通过正确输入信息进行修改数据

前提

登录的情况下

测试流程

1) 系统使用者进入系统页面,进行修改数据

2) 输入正确的数据信息

预期结果

数据信息输入正确的时候,提示修改数据成功,反之则显示错误信息,提示重新输入,修改数据失败

实际结果

实际结果与预期结果一致

5.3.5查询数据模块测试用例

在系统中,查询功能是使用系统使用最多也是最基础的功能,因此查询功能的测试很有代表性。在此章节主要列举在查询时各种情况下系统结果的测试。。

表5-5 查询数据功能测试用例

用例名称

系统使用者进行查询数据

目的

测试系统使用者对可查询的数据项输入正确信息进行查询数据

前提

登录的情况下

测试流程

1) 系统使用者进入系统页面,进行查询数据

2) 全部查询以及输入关键词查询

预期结果

数据信息输入正确的时候,提示查询数据成功,反之则显示错误信息,提示重新输入,查询数据失败

实际结果

实际结果与预期结果一致

5.3.6删除数据模块测试用例

在系统中,删除功能是使用系统使用最多也是最基础的功能,因此删除功能的测试很有代表性。在此章节主要列举在删除时各种情况下系统结果的测试。。

表5-6 删除数据功能测试用例

用例名称

系统使用者进行删除数据

目的

测试系统使用者对可删除的数据项进行删除

前提

登录的情况下

测试流程

1) 系统使用者进入系统页面,进行删除数据

2) 选择数据进行删除

预期结果

选择可删除的数据删除,提示删除数据成功,反之则删除数据失败

实际结果

实际结果与预期结果一致

5.4测试结论

在本次测试的过程主要针对用户登录和注册,及所有功能下的添加操作,修改操作、查询操作和删除操作进行测试,并以真实数据一一进行相关功能项目的输入,涵盖了所有的功能、模块或需求,按照计划进行了全面的测试,最终能够保证每个项目涉及的功能都是能够正常运行,对发现的缺陷的进行修改完善,因此能够保证本次设计的,已实现的功能能够正常运行并且相关数据库的信息也同样保证正确。


结 论

在对医疗应用管理进行设计与开发时,我们选通过市场调研,根据用户需求和实际要求选择采用Java开发语言,通过Springboot框架使用MySQL数据库,基于区块链技术,来构建一个便捷、高效的医疗应用管理。通过系统能够提供更高的数据安全性和隐私性,保护用户的医疗信息不被篡改或泄露;增强用户之间的交流交互,通过系统可以搜索和浏览医疗应用相关信息,并实现在线咨询、挂号、支付等操作,提高医疗服务的质量和效率。

在系统的开发过程中,我们充分利用了Springboot框架的优势,如自动配置、快速开发等特点,加快了项目的迭代和部署速度;通过Springboot提供的丰富的生态系统,我们引入了一些常用的第三方库和组件,增强了系统的功能和性能。同时,充分利用区块链防篡改、去中心化、不可逆和智能合约等极具价值的特性,对于解决当前医疗领域存在的行业痛点,提高信任度、降低协调成本、减轻中心计算压力,实现资源共享,提供更多的可能性。并且还实现平台系统界面的用户友好性,同时响应式设计让本系统适配各种屏幕大小和设备,能够支持多种语言。

此外,由于受到了技术水平的限制,在有限的时间,只能够将系统功能模拟时的功能实现,在许多功能方面仍然存在很大的弊端,而这些弊端需要不断的测试,不断的总结,不断的改进。

因此,医疗应用管理仍有进一步的改进空间。在未来系统运行中,我们可以继续优化系统的用户界面和提升交互体验,使系统界面和体验更加直观友好。还可以引入更多的智能化技术,提升用户的个性化体验,以及提升管理效率和服务水平。


 辞

时间过得飞快,马上就要毕业了,学生活在这个时候即将划上一个句号,但是对于我的人生道路来说,这仅仅是一个逗号,我将面对的是又一次征程的开始。

回忆过去,许许多多的事情浮现在脑海:刚上大学时欢乐心情和兴奋的场景还历历在目。一切都是那么新鲜,那么富有吸引力。有快乐也有艰辛,有收获也有失落。衷心感谢信息学院所有支持帮助过我的老师,谢谢你们多年来的关心和爱护。同窗的友情同样难忘,你们与我共同走过了人生中不平凡的道路,给我留下了值得珍藏的美好记忆。

最后,我要特别感谢指导论文设计的老师。本论文是在他的悉心指导和热情帮助下完成的,老师认真负责的工作态度,严谨的治学精神和精深的理论水平都使我受益匪浅。老师无论在理论上还是在实践中,都给予我很大的帮助,使我专业技能的应用水平得到很大提高,这对于我以后的工作和学习都有益处。值此论文完成之际,特别向老师表示衷心的感谢和崇高的敬意,谢谢他细心而又耐心地辅导,使得我得以顺利的完成毕业设计开发工作,同时也要感谢其他帮助过我的老师和同学,他们在我成长过程中给予了我很大的帮助,在此一并表示感谢。


参考文献

  1. 马绍阳,王伟东,韩斌倩等.基于Spring Boot+Vue的智能远程医疗平台的设计与实现[J].网络安全技术与应用,2024,(01):55-57.
  2. 黄娟.基于SpringBoot和Vue.js的医院数据提取管理平台的设计与实现[J].信息与电脑(理论版),2023,35(22):91-93.
  3. 屈晓,周挺,吴楷等.一种SpringBoot基于嵌入式设备的辅助医疗App的设计与实现[J].电脑知识与技术,2023,19(29):55-58+66.DOI:10.14004/j.cnki.ckt.2023.1534.
  4. 傅唯佳,冯瑞,葛小玲等.基于区块链技术的儿科区域医疗数据共享平台建设[J].中国医疗器械信息,2023,29(17):47-51+110.DOI:10.15971/j.cnki.cmdi.2023.17.004.
  5. 杨志俊,侯江华.基于SpringBoot的智慧养老系统设计[J].无线互联科技,2023,20(17):87-89.
  6. 朱江峰,沈祥,汪磊等.区域电力能源云储能交易区块链技术研究[J].电子设计工程,2023,31(16):157-161.DOI:10.14022/j.issn1674-6236.2023.16.033.
  7. 王隽.区块链技术在长三角区域交通运输从业人员信息共享中的应用[J].中国产经,2023,(13):167-169.
  8. 倪文轩,高深甚.基于区块链技术在区域医联体建设中的探索[C]//全科医疗质量控制联盟.首届全国全科医疗质量论坛论文摘要集.上海市第十人民医院;上海申康医院发展中心;,2023:1.DOI:10.26914/c.cnkihy.2023.024114.
  9. 方敬东.医院医疗设备维修管理系统的设计[J].现代仪器与医疗,2023,29(02):67-76.
  10. 徐海燕.JAVA编程在计算机应用软件中的应用特征与技术[J].电子技术与软件工程,2023,(03):29-32.
  11. 李洪涛,秦善春.区域医联体模式下应用区块链技术开展慢病管理的发展策略研究[J].中国数字医学,2023,18(01):112-118.
  12. 胡安琪.区块链技术视角下公共图书馆区域协同发展路径研究——以长三角地区公共图书馆联盟为例[J].图书馆研究与工作,2022,(11):35-40.
  13. 石娜娜.运用区块链技术促进区域农产品品牌建设研究[J].农村经济与科技,2022,33(07):65-67+84.
  14. 王曼维,杨荻,李岩等.基于SpringBoot框架的智慧医疗问诊系统设计与实现[J].中国医学装备,2022,19(03):133-136.
  15. 贺莹.区域链技术在高校兼职服务平台中的应用[J].黑龙江科学,2022,13(03):40-41.
  16. 颜丽萍.区块链技术在网络安全等级保护区域的应用研究[J].信息与电脑(理论版),2022,34(02):193-196.
  17. 骆亮.基于区块链技术的区域经济信息共享系统设计[J].微型电脑应用,2021,37(03):140-143.
  18. 马传宸.智慧医疗服务平台后端服务模块的设计与实现[D].南京大学,2020.DOI:10.27235/d.cnki.gnjiu.2020.002424.
  19. 姜文啸.基于区域链技术的城市智慧教育平台构建探讨[J].中国教育信息化,2020,(09):30-32.
  20. 卫荣,钱步月,兰欣等.基于区块链技术的区域医疗数据安全共享问题研究[J].中国卫生信息管理杂志,2020,17(02):136-140+150.


 录

附录A:《软件程序源代码》

连接数据库的文件在Resources 文件夹下的application.yml文件,代码如下:

server:

  port: 5000

  servlet:

    context-path: /api

spring:

  mvc:

    static-path-pattern: /upload/**

  resources:

    static-locations: file:此处填写地址/project93355/server/src/main/resources/static

datasource:    

jdbc:mysql://127.0.0.1:3306/projectxxxxx?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8

    username: root

    password: root

    driver-class-name: com.mysql.cj.jdbc.Driver

    type: com.alibaba.druid.pool.DruidDataSource

  jackson:

    property-naming-strategy: CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES

    default-property-inclusion: ALWAYS

    time-zone: GMT+8

    date-format: yyyy-MM-dd HH:mm:ss

  servlet:

    multipart:

      max-file-size: 500MB

      max-request-size: 500MB

  redis:

    host: 127.0.0.1

    port: 6379

    password:

    database: 2

    lettuce:

      pool:

        max-idle: 30

        min-idle: 10

        max-active: 30

        max-wait: 10000

mybatis-plus:

  mapper-locations: classpath*:mapper/*.xml

  type-aliases-package: com.project.demo.entity

  configuration:

    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

    use-column-label: true

    map-underscore-to-camel-case: false

    lazy-loading-enabled: true

    aggressive-lazy-loading: false

use-generated-keys: true

项目启动文件Application.java,代码如下:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

@EnableJpaRepositories

@MapperScan("com.project.demo.dao")

public class Application {

    public static void main(String[] args) {

        SpringApplication.run(Application.class,args);

    }

}

登陆拦截管理器,在config文件夹下的WebAppConfig.java文件,代码如下:

package com.project.demo.config;

@Configuration

@Slf4j

public class WebAppConfig implements WebMvcConfigurer {

    @Override

    public void addInterceptors(InterceptorRegistry registry) {

        //登录拦截的管理器

        InterceptorRegistration registration = registry.addInterceptor(loginInterceptor());

        //拦截的地址

        registration.addPathPatterns("/**");

        //根据需要拦截,一般设置所有地址拦截,放行公共连接

    }

    @Bean

    public LoginInterceptor loginInterceptor(){

        return new LoginInterceptor();

    }

}

登陆接受管理器,在interceptor文件夹下的LoginInterceptor.java文件,控制请求头代码如下:

package com.project.demo.interceptor;

@Slf4j

public class LoginInterceptor implements HandlerInterceptor {

    private String tokenName = "x-auth-token";

    @Override

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String token = request.getHeader(this.tokenName);

        setHeader(request, response);

        log.info("[请求接口] - {} , [请求类型] - {}",request.getRequestURL().toString(),request.getMethod());

        if (request.getRequestURL().toString().contains("/api/user/login")){

            return true;

        }

        else if (request.getRequestURL().toString().contains("/api/user/state")){

            return true;

        }

        else if (request.getRequestURL().toString().contains("/api/user/register")){

            return true;

        }

    }

    @Override

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {

        //更新token

    }

    @Override

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }

    private void failure(HttpServletRequest request, HttpServletResponse response) throws IOException {

        response.setHeader("Content-type", "application/json;charset=UTF-8");

        response.setStatus(401);

        response.sendRedirect("https://www.baidu.com");

    }

    private void setHeader(HttpServletRequest request, HttpServletResponse response) {

        //跨域的header设置

        response.setHeader("Access-control-Allow-Origin", request.getHeader("Origin"));

        response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH");

        response.setHeader("Access-Control-Allow-Credentials", "true");

        response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));

        response.setHeader("Access-Control-Max-Age", "1800");

        //防止乱码,适用于传输JSON数据

        response.setHeader("Content-Type", "application/json;charset=UTF-8");

        response.setStatus(HttpStatus.OK.value());

    }

}

组装sql语句,在constant文件夹下的FindConfig.java文件,代码如下:

package com.project.demo.constant;

public class FindConfig {

    public static String PAGE = "page";

    public static String SIZE = "size";

    public static String LIKE = "like";

    public static String ORDER_BY = "orderby";

    public static String FIELD = "field";

    public static String GROUP_BY = "groupby";

    public static String MIN_ = "_min";

    public static String MAX_ = "_max";

    public static String SQLHWERE = "sqlwhere";

}

项目采用三层架构controller(每一个实体对应一个controller),entity(项目表实体),service

,Controller 均继承自BaseController,注入两个对象,一个是实体类(以Auth为例),另一个是其AuthService:

@RestController

@RequestMapping("auth")

public class AuthController extends BaseController<Auth, AuthService> {

    /**

     * 服务对象

     */

    @Autowired

    public AuthController(AuthService service) {

        setService(service);

    }

}

Controller用于spring控制请求的地址

新增一条数据,通过post传入一个json对象,然后经过request.getReader(),最后经过readBody()转成一个Map,含有String和Object,key用的是字段名,Object存放数据,最终得到Map,insert用拼装sql,读取body,组装成一个insert对象,runCountSql()语句,代码如下:

    @PostMapping("/add")

    @Transactional

    public Map<String, Object> add(HttpServletRequest request) throws IOException {

        service.insert(service.readBody(request.getReader()));

        return success(1);

    }

public Map<String, Object> addMap(Map<String,Object> map){

    service.insert(map);

     return success(1);

 }

修改一个数据,原理与add基本一致,不同点在于通过readConfig()读取关键字,以及通过readQuery()获取URL后面?指定位置的标识,转成Map对象后,执行update操作,同样通过拼接的sql语句执行,执行过程读取query,toWhereSql()语句完成数据库操作,body为修改对象的值,代码如下:

    @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);

    }

删除一条数据,通过readQuery(),获取URL后面的对象地址,删除FROM具体的table,query删除查询FindConfig语句,代码如下:

    @RequestMapping(value = "/del")

    @Transactional

    public Map<String, Object> del(HttpServletRequest request) {

        service.delete(service.readQuery(request), service.readConfig(request));

        return success(1);

    }

    public void delete(Map<String,String> query,Map<String,String> config){

        QueryWrapper wrapper = new QueryWrapper<E>();

        toWhereWrapper(query, "0".equals(config.get(FindConfig.GROUP_BY)),wrapper);

        baseMapper.delete(wrapper);

        log.info("[{}] - 删除操作:{}",wrapper.getSqlSelect());

    }

通过请求的参数获取一条数据,通过readQuery(),获取URL后面的对象地址,查询FindConfig语句,select筛选Map对象,FIELD为查询字段,未传输的情况下传入“*”,代码如下:

    @RequestMapping("/get_obj")

    public Map<String, Object> obj(HttpServletRequest request) {

        List resultList = service.selectBaseList(service.select(service.readQuery(request), service.readConfig(request)));

        if (resultList.size() > 0) {

            JSONObject jsonObject = new JSONObject();

            jsonObject.put("obj",resultList.get(0));

            return success(jsonObject);

        } else {

            return success(null);

        }

    }

通过请求的参数获取列表数据,代码如下:

    @RequestMapping("/get_list")

    public Map<String, Object> getList(HttpServletRequest request) {

        Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));

        return success(map);

    }

获取某个组下面的数量,代码如下:

    @RequestMapping(value = {"/count_group", "/count"})

    public Map<String, Object> count(HttpServletRequest request) {

        Integer value= service.selectSqlToInteger(service.groupCount(service.readQuery(request), service.readConfig(request)));

        return success(value);

    }

获取某个组下面的总计值,代码如下:

    @RequestMapping(value = {"/sum_group", "/sum"})

    public Map<String, Object> sum(HttpServletRequest request) {

        Integer value = service.selectSqlToInteger(service.sum(service.readQuery(request), service.readConfig(request)));

        return success(value);

    }

图片/文件/视频等的上传方法通过MultipartFile,代码如下:

   @PostMapping("/upload")

    public Map<String, Object> upload(@RequestParam("file") MultipartFile file) {

        log.info("进入方法");

        if (file.isEmpty()) {

            return error(30000, "没有选择文件");

        }

        try {

            //判断有没路径,没有则创建

            String filePath = System.getProperty("user.dir") + "/src/main/resources/static/";

            File targetDir = new File(filePath);

            if (!targetDir.exists() && !targetDir.isDirectory()) {

                if (targetDir.mkdirs()) {

                    log.info("创建目录成功");

                } else {

                    log.error("创建目录失败");

                }

            }

            String fileName = file.getOriginalFilename();

            File dest = new File(filePath + fileName);

            log.info("文件路径:{}", dest.getPath());

            log.info("文件名:{}", dest.getName());

            file.transferTo(dest);

            JSONObject jsonObject = new JSONObject();

            jsonObject.put("url", "/api/upload/" + fileName);

            return success(jsonObject);

        } catch (IOException e) {

            log.info("上传失败:{}", e.getMessage());

        }

        return error(30000, "上传失败");

    }

注册页UserController.java,传入user对象,并将"user_id"、 "state"、 "user_group"、"login_time"、"phone"、"phone_state"、 "username"、"nickname"、"password"、"email"、"email_state"、"avatar"、"create_time"输入,重点是 "username"、"nickname"、"password"必须输入,通过获取username,数据库查询是否有该用户,如果存在,则提示“用户已存在”,否则执行将UserId置为空(数据库表中该字段已设置自动递增),代码如下:

    /**

     * 注册

     * @param user

     * @return

     */

    @PostMapping("register")

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

        // 查询用户

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

        Map<String,Object> map = JSON.parseObject(JSON.toJSONString(user));

        query.put("username",user.getUsername());

        List list = service.selectBaseList(service.select(query, new HashMap<>()));

        if (list.size()>0){

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

        }

        map.put("password",service.encryption(String.valueOf(map.get("password"))));

        service.insert(map);

        return success(1);

}     

注册页password则使用了MD5加密,代码如下:

    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;

}

登录页,首先传入"username"、"email"、"phone"、"password",用户可通过用户名、邮箱、手机号进行登陆,通过判断resultList来确定查询结果,然后执行查询用户组UserGroup,用户组里面不存在,依然报“用户不存在”,执行完以上代码,最后涉及到用户带有“审核”的,会查询examine_state(用户的审核状态),数据库表user_group中含有source_table和source_field进行查询,以上步骤完成,对输入的密码进行存储Token到数据库,匹对账号和密码,数据库中的AccessToken为令牌,用于身份认证,其代码如下:

 /**

     * 登录

     * @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.selectBaseList(service.select(map, new HashMap<>()));

        }

        else if(email != null && "".equals(email) == false){

            map.put("email", email);

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

        }

        else if(phone != null && "".equals(phone) == false){

            map.put("phone", phone);

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

        }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.selectBaseList(userGroupService.select(groupMap, new HashMap<>()));

        if (groupList.size()<1){

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

        }

        UserGroup userGroup = (UserGroup) groupList.get(0);

        //查询用户审核状态

        if (!StringUtils.isEmpty(userGroup.getSourceTable())){

            String res = service.selectExamineState(userGroup.getSourceTable(),byUsername.getUserId());

            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());

            Duration duration = Duration.ofSeconds(7200L);

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

            // 返回用户信息

            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, "账号或密码不正确");

        }

    }

找回密码,接收用户输入的用户名、密码、验证码,并进行条件判断,代码如下:

    /**

     * 找回密码

     * @param form

     * @return

     */

    @PostMapping("forget_password")

    public Map<String, Object> forgetPassword(@RequestBody User form,HttpServletRequest request) {

        JSONObject ret = new JSONObject();

        String username = form.getUsername();

        String code = form.getCode();

        String password = form.getPassword();

        // 判断条件

        if(code == null || code.length() == 0){

            return error(30000, "验证码不能为空");

        }

        if(username == null || username.length() == 0){

            return error(30000, "用户名不能为空");

        }

        if(password == null || password.length() == 0){

            return error(30000, "密码不能为空");

        }

        // 查询用户

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

        query.put("username",username);

        List list = service.selectBaseList(service.select(query, service.readConfig(request)));

        if (list.size() > 0) {

            User o = (User) list.get(0);

            JSONObject query2 = new JSONObject();

            JSONObject form2 = new JSONObject();

            // 修改用户密码

            query2.put("user_id",o.getUserId());

            form2.put("password",service.encryption(password));

            service.update(query, service.readConfig(request), form2);

            return success(1);

        }

        return error(70000,"用户不存在");

    }

修改密码,通过请求data,获取旧密码,并将新密码重新赋值,期间都是需要通过加密,代码如下:

    /**

     * 修改密码

     * @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));

        int count = service.selectBaseCount(service.count(query, service.readConfig(request)));

        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,"密码修改失败!");

    }

免费领取项目源码,请关注❤点赞收藏并私信博主,谢谢-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值