@TOC
springboot571基于协同过滤算法的私人诊所管理系统_6t4o8--论文
绪 论
1.1研究背景
自改革开放以来,国内的基础网络设施的不断进步和终端电子设备的高度普及,互联网用户规模越来越大[1]。现在人们越来越离不开计算机网络、互联网所带来的好处了,如今各式各样的系统已广泛应用,不同于以往传统的管理方式了,只有跟上时代的发展才能不会被淘汰掉,所以将传统的线下管理带到线上去实施,能够很大程度的提升管理效率,好处也有很多,能够整体提升新时代的背景之下新的样貌,更加朝气蓬勃。基于以上情况,私人诊所管理系统逐渐出现在人们视野之中,私人诊所已成为人们生活中不可缺少的一部分,同时也将成为今后发展中很有潜力的增长点。
1.2系统开发目的与意义
1.2.1 开发目的
开发一套协同过滤推荐算法的私人诊所管理系统可以让管理者在有限的时间内对私人诊所信息做出相应的调整,对私人诊所的一切信息往最好的一面进行优化管理,达到事半功倍的效用。
在最原始的私人诊所管理方式中,人们通过纸质用手写来记录私人诊所的动作,利用这种方式有着特别大的弊端,比如重复记录,漏记等。针对这种情况,开发一个私人诊所管理系统,帮助私人诊所进行管理。当前国内开发的线上管理系统还不是那么全面,并且都是基于智能手机进行搭建的系统,因此开发一个私人诊所管理系统也是有必要的,系统能够满足管理者在上面对个人中心,患者管理,医生管理,科室管理,出诊医生管理,预约挂号管理,预约取消管理,病历信息管理,药品信息管理,处方开具管理,留言板管理,系统管理等功能进行管理,打造一个更好更便利的私人诊所管理系统。
1.2.2 开发意义
协同过滤推荐算法的私人诊所管理系统可以说真正的打破了以往手工记录的固有模式,使想关工作人员对系统进行有效操作,打破了最原始只能在通过录像查看私人诊所信息的限制。用户只要在有网络的地方,利用手机或计算机可以随时随地查看私人诊所信息,修改个人信息和登录密码等;节约了用户的时间。
私人诊所管理系统还拥有功能强大的信息查询系统,它就像一个指明灯,直接将你指定的所需要的信息呈现有眼前,解决了你在查询中的尴尬[5],所以开发此系统意义重大;
1.3研究现状
如今在这高速发展的新时代,无论是在国内还是在国外,发展的势头突飞猛进,在经济领域也是一片光明。在这种背景下,互联网市场将成为了人类文明争夺的一种方针。于是无论是国内还是国外一些企事业单位都把目光投向了互联网这块市场,了解互联网的人数越来越多,具备一些网络意识的人将十分普遍。在这种互联网大浪潮的不断冲刷下,各种各样的系统被开发出来。计算机技术无论是在国内还是在国外都应用普遍,使计算机这一新型工具成为人们耳熟能详、妇孺皆知的新技术。计算机和互联网的广泛应用,让国与国之间的距离变"近"了,这个庞大的群体中。互联网发展也存在一些差距,我国近些年的互联网发展迅速,跻身于世界前列。
本系统采用B/S架构、采用的数据库是MySQL,使用JAVA技术开发。该系统的开发方式无论在国内还是国外都比较常见,而且开发完成后使用普遍,可以给系统用户提供大量的便利[3]。该系统在国内外前景较为良好。
2系统关键技术及工具简介
2.1协同过滤算法介绍
协同过滤算法(Collaborative Filtering) 是比较经典常用的推荐算法,它是一种完全依赖用户和物品之间行为关系的推荐算法。我们从它的名字"协同过滤"中,也可以窥探到它背后的原理,就是 "协同大家的反馈、评价和意见,一起对海量的信息进行过滤,从中筛选出用户可能感兴趣的信息"。
2.2Java语言
Java语言正式诞生于1995年,是由SUN公司开发研制的OAK语言发展而来的。Java语言继承了OAK语言可跨系统运行的特点,融合了面向对象编程的风格,JAVA以其独有的开放性、跨系统性和面向网络的交互性席卷全球,以其安全性、易用性和开发周期短的特点,迅速从最初的编程语言发展成为全球第一大软件开发系统.广受时下程序开发人员的好评[3]。后来又为了丰富Java语言的用途,提高生产力,将它进行设计和改造,以满足更多地开发和应用场景。经过改造后,它可以满足移动端开发,桌面应用开发和企业级应用开发。Java语言还为用户提供了丰富的类库,在掌握它的特性后,学习特定的工具包,就可以满足很多场景的开发。现在来看,Java语言在这三种系统的应用开发中,都占据了举足轻重的地位。
与其他语言相比,Java语言具有很多的优点,Java语言简单比较容易理解,有c语言的基础很容易就可以学会,中文和英文的学习资源也比较多,而且Java语言经过许多年的沉淀发展,逐渐演变出很多成熟的框架技术。企业还还可以封装自己的框架,让开发变得简单。它还具有跨系统性较其他语言这一个最大的优势,这意味着它只需要一次编译就可以运行在其他系统上。
2.3Mysql数据库
没有数据库就没有Web系统,Mysql数据库是数据库中比较常用的,这都是源于它的特点。
(1)Mysql是相比于Oracle更轻量、更简洁便于使用,在服务部署方面相对复杂度低,更利于毕设系统的开发[18]。
(2)Mysql是免费开源的,对个人开发系统很友好。
(3)Mysql占用空间内存比较小,发行版安装后不到100兆。
(4)Mysql可以使用Sql语言进行调用,学习成本较低。
(5)Mysql可支持互联网站数据共享也支持数据安全设置,防止数据泄露。
(6)Mysql运行到各种版本的操作系统中无论是服务器上,还是我们开发用的笔记本上。
(7)Mysql运行速度很快。
2.4springboot框架
Spring Boot是由Pivotal商家提供的轻量级框架,其"开箱即用"及"约定优于配置"的策略可以使开发者全身心的投入到业务逻辑代码的编写中,极大地提高了软件开发项目的效率。相比于Spring框架而言,Spring Boot框架更加能够节省程序员配置XML的时间,Spring Boot项目允许开发者使用它的所有模块和开发功能,此外, Spring Boot内置了服务器,简化了开发者启用服务器的整体流程,Spring Boot还可以自动适配不同类型的数据库以满足用户快速连接后台数据库管理的需求,这极大地方便了用户快速搭建应用程序的实现过程。 2014年4月,Spring Boot 1.0.0发布,截止到2022年2月,发布的Spring Boot版本为Spring Boot 3.0.0-M1。在系统的设计与开发中,为了能够快速搭建软件后台服务的开发环境,从技术实现的难度以及系统开发的成本两个方面考虑,Spring Boot框架能够使开发者更关注系统功能的业务逻辑代码实现,可采用Spring Boot框架搭建系统为前端提供数据服务。因此,本案例项目后台开发选择Spring Boot框架。
2.5 Eclipse
Eclipse 是由Java语言作为基础开发的工具,并且全部代码都是开源,并支持组件集成。Eclipse本质其实是一个开源的框架和一组服务,以组件的形式,构成我们的开发工具。Eclipse自身自带标准的插件集,包括 Java 开发工具[8]。
2.6 B/S架构
B/S结构就是指系统客户端与服务器分离,客户端通过浏览器访问服务端进行操作。
B/S结构目前广泛应用于绝大部分系统搭建中,这种结构摒弃C/S结构客户端服务端不分离的缺点,具有更多的优势:
(1)跨系统性:B/S的标准由标准化组织确立,适用于绝大多数的系统搭建,通用于应用之间。
(2)低维护成本:客户端和服务器端分离,减轻了两端的压力,尤其是客户端,对客户端设备,硬件、软件要求都比较低,并且系统需要升级或维护时,只需要在服务器端升级或维护就可以,使相应的费用减少。
3 系统需求分析
需求分析在系统开发中有着十分重要的作用。软件项目凭借软件工程的思想和步骤可以大大的提高开发效率,缩短软件开发周期,保证了软件项目的质量。需求分析作为软件工程方法中的一步是至关重要的[6]。软件需求工程是一门分析并记录软件需求的学科。需求分析简单的来说就是用户需要什么,系统需要什么,对此进行问题的列举,等级的排列,需要缜密的思分析和大量的调研[7]。
3.1系统整体分析及设计原则
对于私人诊所管理系统的搭建来说,系统分析首先要着眼于整体,对于分析一定要先分析整体,再分析部分。在私人诊所管理系统中,整体要满足的就是人们通过系统进行私人诊所信息管理的需求,同时系统还需要后台管理人员对私人诊所管理系统的后台进行维护。
本系统采取了一系列的设计原则,主要目的是为了系统的功能设计,还有管理人员在后期对系统维护时的方便,以及使用户能够简易的操作。最重要的设计原则包括:简单性、针对性、实用性、一致性、先进性。
(1)简单性:在该系统中功能模块实现的同时,让用户操作起来简单明了,很快找到所需资源是最直接的目的。
(2)针对性:该系统是根据设计需求为导向来开发私人诊所管理系统的设计,所以针对性较强。
(3)实用性:该设计能够满足私人诊所管理系统的实际的功能需求,能够在实际中让用户真正使用到,具有实际的应用价值。
(4)一致性:网站整体的页面布局,在不同的界面之间,img里的图片的放置位置以及大小都应该有严格的一致性。变量命名规则应该具有统一性。
(5)先进性:本系统采用java作为开发语言、SpringBoot框架、MySQL作为系统数据库,它们被软件设计者们广泛使用。
3.2系统可行性分析
3.2.1 经济可行性分析
由于开发本系统主要是为了测试自身的专业和设计能力,基本不考虑经济效益和后来的发展方向,只注重自身水平和设计能力的提高,并且对自身经济的要求也不高,只要有一台普通电脑就可以了,所以不需要考虑经济问题。
3.2.2 技术可行性分析
系统主要采用JAVA技术进行设计, 系统基于B/S架构模式,有针对性地解决了架C/S构安装麻烦不便维护等一系列问题。因为本系统是采用MySQL数据库和B/S结构进行设计的一个小型网站,所以应用程序和数据库更是缺一不可,要想使用该程序,必须保证功能完整,操作简单且直观易懂的特点[9]。数据库的建立,对整体的完整和数据安全两方面必须得到保证。我们可以采用JAVA进行优化,加密函数,建立密库,这样可以有效的阻止在传输数据信息的过程中不易出现泄密状况,可以提高安全等级。在加密的同时我们可以开启JAVA安全模式,针对一些被执行命令和可以被使用的函数进行限制来提高系统的安全性[3]。在早期,我已将JAVA的基本知识有了深度的理解,并对MySQL进行了解。对软件工程测试、UML等相关课程大概了解和学习过,通过掌握这些课程有了一定的系统开发、检验和辨别。采用JAVA以及MySQL结合起来开发该系统,必定是可行的并且是高效的[13]。
3.2.3 操作可行性分析
系统的登录界面和业务逻辑简洁明了,采用一般的界面窗口来登录界面,整个系统更加人性化,用户操作更加简洁方便。本系统在操作和管理上比较容易,还具有很好的交互性等特点,在操作上是非常简单的。因此,本系统可以进行设计开发。通过电脑进行访问操作,用户一定能够很快就会对系统熟悉,尤其对老年群体,稍微简单了解下本系统,就能很快上手。
3.3 系统用例分析
协同过滤推荐算法的私人诊所管理系统综合网络空间开发设计要求。目的是将将传统管理方式转换为在网上管理,完成私人诊所信息管理的方便快捷、安全性高、交易规范做了保障,目标明确。私人诊所管理系统可以将功能划分为管理员功能,患者功能和医生功能。
(1)、管理员关键功能包含个人中心,患者管理,医生管理,科室管理,出诊医生管理,预约挂号管理,预约取消管理,病历信息管理,药品信息管理,处方开具管理,留言板管理,系统管理等进行管理。管理员用例如下:
图3-1 管理员用例图
(2)、患者关键功能包含出诊医生,公告信息,留言板,后台管理,个人中心等进行管理。患者用例如下:
图3-2 患者用例图
(3)、医生关键功能包含个人中心,出诊医生管理,预约挂号管理,预约取消管理,病历信息管理,药品信息管理,处方开具管理等进行管理。医生用例如下:
图3-3 医生用例图
3.4系统流程分析
登录模块有许多规则,这些规则是用来限制用户权限的,用户进入系统前要进行登录,登录成功后方可对相关权限的操作。登录流程如下所示。
图3-4系统登录流程图
添加新用户的流程是先查询新用户名是否已存在,如已有该用户名,需重拟用户名并同时输入新用户的其它信息,添加新用户到数据库时会先验证数据是否完整,信息都正确且完整时,返回并刷新用户列表;信息不正确时,会返回输入信息的那一步。该流程如图3-5所示。
图3-5添加新用户流程图
4 系统设计
4.1 系统架构设计
整个系统采用B/S结构,用户可在浏览器中完成和整个系统的交互。
用户在私人诊所管理系统的浏览器界面进行的操作,浏览器操作传到服务器端,服务器端调用后台数据库,反馈给浏览器端。
系统架构如图4-1所示:
图4-1 系统架构图
4.2 系统整体设计
私人诊所管理系统实现患者,管理员和医生登录,查询信息,修改个人信息等。所有功能都通过与后台服务器的数据交互来完成的。具体的软件功能结构图如图4-2所示:
图4-2 系统功能结构图
4.3 系统数据库设计
对于私人诊所管理系统而言,数据库中最核心的数据就是私人诊所信息,并且有许多其他关联数据都储存于数据库中。随着时间推移,将发布大量信息于本系统中,届时数据库中也将蕴藏海量数据。一个优秀的数据库设计方案能在保证系统能够高效处理大量数据的同时保证系统的安全性。因此,在私人诊所管理系统设计方案中将数据库的设计摆在重要位置,将数据库设计视为系统设计的重要内容。
4.3.1 E-R模型设计
在私人诊所管理系统的数据库设计中,系统E-R模型的设计可以展示数据库中各种实体信息和他们之间的关系,将私人诊所管理系统的E-R模型研究好后,数据库中数据表的建立也会比较容易。
根据功能需求来对系统的e-r图来进行分解得到几种实体,以下为部分实体---关系模型。
用户实体属性图如下:
图4-3用户实体属性图
公告信息实体属性图如下:
图4-4公告信息实体属性图
留言板实体属性图如下:
图4-5留言板实体属性图
医生实体属性所示:
图4-6医生实体属性图
药品信息实体属性所示:
图4-7药品信息实体属性图
4.3.2表设计
Mysql将数据保存在不同的表中,极大地提高了数据调取灵活性。私人诊所管理系统的具体表结构如以下表所示:
表4-1:处方开具
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
chufangbianhao | varchar | 200 | 处方编号 | ||
huanzhezhanghao | varchar | 200 | 患者账号 | ||
huanzhexingming | varchar | 200 | 患者姓名 | ||
xingbie | varchar | 200 | 性别 | ||
yaopinmingcheng | varchar | 200 | 药品名称 | ||
danjia | float | 单价 | |||
shuliang | int | 数量 | |||
zongjine | float | 总金额 | |||
chufangxiangqing | longtext | 4294967295 | 处方详情 | ||
kaijushijian | datetime | 开具时间 | |||
yishengzhanghao | varchar | 200 | 医生账号 | ||
yishengxingming | varchar | 200 | 医生姓名 | ||
ispay | varchar | 200 | 是否支付 | 未支付 |
表4-2:用户表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
username | varchar | 100 | 用户名 | ||
password | varchar | 100 | 密码 | ||
role | varchar | 100 | 角色 | 管理员 | |
addtime | timestamp | 新增时间 | CURRENT_TIMESTAMP |
表4-3:token表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
userid | bigint | 用户id | |||
username | varchar | 100 | 用户名 | ||
tablename | varchar | 100 | 表名 | ||
role | varchar | 100 | 角色 | ||
token | varchar | 200 | 密码 | ||
addtime | timestamp | 新增时间 | CURRENT_TIMESTAMP | ||
expiratedtime | timestamp | 过期时间 | CURRENT_TIMESTAMP |
表4-4:收藏表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
userid | bigint | 用户id | |||
refid | bigint | 商品id | |||
tablename | varchar | 200 | 表名 | ||
name | varchar | 200 | 名称 | ||
picture | longtext | 4294967295 | 图片 | ||
type | varchar | 200 | 类型(1:收藏,21:赞,22:踩,31:竞拍参与,41:关注) | 1 | |
inteltype | varchar | 200 | 推荐类型 | ||
remark | varchar | 200 | 备注 |
表4-5:公告信息
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
title | varchar | 200 | 标题 | ||
introduction | longtext | 4294967295 | 简介 | ||
picture | longtext | 4294967295 | 图片 | ||
content | longtext | 4294967295 | 内容 |
表4-6:留言板
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
userid | bigint | 留言人id | |||
username | varchar | 200 | 用户名 | ||
avatarurl | longtext | 4294967295 | 头像 | ||
content | longtext | 4294967295 | 留言内容 | ||
cpicture | longtext | 4294967295 | 留言图片 | ||
reply | longtext | 4294967295 | 回复内容 | ||
rpicture | longtext | 4294967295 | 回复图片 |
表4-7:配置文件
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
name | varchar | 100 | 配置参数名称 | ||
value | varchar | 100 | 配置参数值 |
表4-8:预约挂号
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
yuyuebianhao | varchar | 200 | 预约编号 | ||
yishengzhanghao | varchar | 200 | 医生账号 | ||
yishengxingming | varchar | 200 | 医生姓名 | ||
zhicheng | varchar | 200 | 职称 | ||
keshi | varchar | 200 | 科室 | ||
guahaoleixing | varchar | 200 | 挂号类型 | ||
guahaofei | int | 挂号费 | |||
guahaoshu | int | 挂号数 | |||
chuzhenriqi | varchar | 200 | 出诊日期 | ||
yuyueshijian | datetime | 预约时间 | |||
huanzhezhanghao | varchar | 200 | 患者账号 | ||
huanzhexingming | varchar | 200 | 患者姓名 | ||
shoujihaoma | varchar | 200 | 手机号码 | ||
sfsh | varchar | 200 | 是否审核 | 待审核 | |
shhf | longtext | 4294967295 | 审核回复 | ||
ispay | varchar | 200 | 是否支付 | 未支付 |
表4-9:出诊医生
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
yishengzhanghao | varchar | 200 | 医生账号 | ||
touxiang | longtext | 4294967295 | 头像 | ||
xingbie | varchar | 200 | 性别 | ||
yishengxingming | varchar | 200 | 医生姓名 | ||
zhicheng | varchar | 200 | 职称 | ||
keshi | varchar | 200 | 科室 | ||
guahaoleixing | varchar | 200 | 挂号类型 | ||
guahaoshu | int | 挂号数 | |||
guahaofei | int | 挂号费 | |||
shangbanshijian | varchar | 200 | 上班时间 | ||
chuzhenriqi | date | 出诊日期 | |||
clicktime | datetime | 最近点击时间 |
表4-10:医生
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
yishengzhanghao | varchar | 200 | 医生账号 | ||
mima | varchar | 200 | 密码 | ||
touxiang | longtext | 4294967295 | 头像 | ||
yishengxingming | varchar | 200 | 医生姓名 | ||
xingbie | varchar | 200 | 性别 | ||
shoujihaoma | varchar | 200 | 手机号码 | ||
keshi | varchar | 200 | 科室 | ||
zhicheng | varchar | 200 | 职称 |
表4-11:药品信息
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
yaopinmingcheng | varchar | 200 | 药品名称 | ||
yaopintupian | longtext | 4294967295 | 药品图片 | ||
baozhiqi | varchar | 200 | 保质期 | ||
jixing | varchar | 200 | 剂型 | ||
yaopinshuoming | longtext | 4294967295 | 药品说明 | ||
shengchanchangjia | varchar | 200 | 生产厂家 | ||
guige | varchar | 200 | 规格 | ||
danjia | float | 单价 | |||
shuliang | int | 数量 |
表4-12:病历信息
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
binglibianhao | varchar | 200 | 病历编号 | ||
huanzhezhanghao | varchar | 200 | 患者账号 | ||
huanzhexingming | varchar | 200 | 患者姓名 | ||
zhenduanneirong | longtext | 4294967295 | 诊断内容 | ||
zhenduanjieguo | longtext | 4294967295 | 诊断结果 | ||
binglimiaoshu | longtext | 4294967295 | 病历描述 | ||
yizhuxinxi | longtext | 4294967295 | 医嘱信息 | ||
binglibaogao | longtext | 4294967295 | 病例报告 | ||
jiuzhenshijian | datetime | 就诊时间 | |||
yishengzhanghao | varchar | 200 | 医生账号 | ||
yishengxingming | varchar | 200 | 医生姓名 |
表4-13:预约取消
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
yuyuebianhao | varchar | 200 | 预约编号 | ||
yishengzhanghao | varchar | 200 | 医生账号 | ||
yishengxingming | varchar | 200 | 医生姓名 | ||
zhicheng | varchar | 200 | 职称 | ||
keshi | varchar | 200 | 科室 | ||
guahaofei | int | 挂号费 | |||
chuzhenriqi | varchar | 200 | 出诊日期 | ||
quxiaoyuanyin | varchar | 200 | 取消原因 | ||
quxiaoshijian | datetime | 取消时间 | |||
huanzhezhanghao | varchar | 200 | 患者账号 | ||
huanzhexingming | varchar | 200 | 患者姓名 | ||
shoujihaoma | varchar | 200 | 手机号码 | ||
crossuserid | bigint | 跨表用户id | |||
crossrefid | bigint | 跨表主键id | |||
sfsh | varchar | 200 | 是否审核 | 待审核 | |
shhf | longtext | 4294967295 | 审核回复 |
表4-14:科室
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
keshi | varchar | 200 | 科室 |
表4-15:患者
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
huanzhezhanghao | varchar | 200 | 患者账号 | ||
mima | varchar | 200 | 密码 | ||
huanzhexingming | varchar | 200 | 患者姓名 | ||
touxiang | longtext | 4294967295 | 头像 | ||
xingbie | varchar | 200 | 性别 | ||
shoujihaoma | varchar | 200 | 手机号码 | ||
shenfenzhenghao | varchar | 200 | 身份证号 | ||
huanzhezhuzhi | varchar | 200 | 患者住址 |
5 系统实现
5.1系统功能实现
当人们打开系统的网址后,首先看到的就是首页界面。在这里,人们能够看到私人诊所管理系统的导航条。系统首页界面如图5-1所示:
图5-1 系统首页界面
系统注册:在系统注册页面输入用户注册信息进行注册操作;系统注册页面如图如图5-2所示:
图5-2系统注册页面
出诊医生:在出诊医生页面的输入栏中输入医生姓名,选择挂号类型和出诊日期进行查询;可以查看出诊医生详细信息,还可以进行收藏或预约挂号操作;出诊医生页面如图5-3所示:
图5-3出诊医生详细页面
公告信息:在公告信息页面的输入栏中输入标题进行查询;可以查看公告详细信息;公告信息页面如图5-4所示:
图5-4公告详细页面
个人中心:在个人中心页面通过填写个人详细信息进行信息更新操作,还可以对我的收藏进行详细操作;如图5-5所示:
图5-5个人中心界面
5.2后台模块实现
后台登录,在登录页面选择需要登录的角色,在正确输入用户名和密码后,进入操作系统进行操作;如图5-6所示。
图5-6后台登录界面
5.2.1管理员功能实现
管理员进入主页面,主要功能包括对个人中心,患者管理,医生管理,科室管理,出诊医生管理,预约挂号管理,预约取消管理,病历信息管理,药品信息管理,处方开具管理,留言板管理,系统管理等进行操作。管理员主页面如图5-7所示:
图5-7 管理员主界面
管理员点击患者管理。在患者页面输入患者账号和患者姓名进行查询,新增或删除患者列表,并根据需要对患者详情信息进行详情,修改或删除操作;如图5-8所示:
图5-8患者管理界面
管理员点击医生管理。在医生页面输入医生姓名进行查询,新增或删除医生列表,并根据需要对医生详情信息进行详情,修改或删除操作;如图5-9所示:
图5-9医生管理界面
管理员点击出诊医生管理。在出诊医生页面输入医生姓名,选择挂号类型和出诊日期进行查询,新增或删除出诊医生列表,并根据需要对出诊医生详情信息进行详情,修改或删除操作;如图5-10所示:
图5-10出诊医生管理界面
管理员点击病历信息管理。在病历信息页面输入病历编号,患者姓名和医生姓名进行查询或删除病历信息列表,并根据需要对病历详细信息进行详情,修改或删除操作,如图5-11所示:
图5-11病历信息管理界面
管理员点击药品信息管理。在药品信息页面输入药品名称,选择剂型和生产厂家进行查询,新增或删除药品信息列表,并根据需要对药品详细信息进行详情,修改或删除操作,如图5-12所示:
图5-12药品信息管理界面
5.2.2患者功能实现
患者进入主页面,主要功能包括对个人中心,预约挂号管理,预约取消管理,病历信息管理,处方开具管理等进行操作。患者主页面如图5-13所示:
图5-13 患者主界面
5.2.3医生功能实现
医生进入主页面,主要功能包括对个人中心,出诊医生管理,预约挂号管理,预约取消管理,病历信息管理,药品信息管理,处方开具管理等进行操作。医生主页面如图5-14所示:
图5-14 医生主界面
MessagesController.java
package com.controller;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;
import com.entity.MessagesEntity;
import com.entity.view.MessagesView;
import com.service.MessagesService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.CommonUtil;
import java.io.IOException;
/**
* 留言板
* 后端接口
* @author
* @email
* @date 2023-04-13 12:28:46
*/
@RestController
@RequestMapping("/messages")
public class MessagesController {
@Autowired
private MessagesService messagesService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,MessagesEntity messages,
HttpServletRequest request){
if(!request.getSession().getAttribute("role").toString().equals("管理员")) {
messages.setUserid((Long)request.getSession().getAttribute("userId"));
}
EntityWrapper<MessagesEntity> ew = new EntityWrapper<MessagesEntity>();
PageUtils page = messagesService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, messages), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,MessagesEntity messages,
HttpServletRequest request){
EntityWrapper<MessagesEntity> ew = new EntityWrapper<MessagesEntity>();
PageUtils page = messagesService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, messages), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( MessagesEntity messages){
EntityWrapper<MessagesEntity> ew = new EntityWrapper<MessagesEntity>();
ew.allEq(MPUtil.allEQMapPre( messages, "messages"));
return R.ok().put("data", messagesService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(MessagesEntity messages){
EntityWrapper< MessagesEntity> ew = new EntityWrapper< MessagesEntity>();
ew.allEq(MPUtil.allEQMapPre( messages, "messages"));
MessagesView messagesView = messagesService.selectView(ew);
return R.ok("查询留言板成功").put("data", messagesView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
MessagesEntity messages = messagesService.selectById(id);
return R.ok().put("data", messages);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
MessagesEntity messages = messagesService.selectById(id);
return R.ok().put("data", messages);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody MessagesEntity messages, HttpServletRequest request){
messages.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(messages);
messagesService.insert(messages);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody MessagesEntity messages, HttpServletRequest request){
messages.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(messages);
messagesService.insert(messages);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
@Transactional
public R update(@RequestBody MessagesEntity messages, HttpServletRequest request){
//ValidatorUtils.validateEntity(messages);
messagesService.updateById(messages);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
messagesService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 提醒接口
*/
@RequestMapping("/remind/{columnName}/{type}")
public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request,
@PathVariable("type") String type,@RequestParam Map<String, Object> map) {
map.put("column", columnName);
map.put("type", type);
if(type.equals("2")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
Date remindStartDate = null;
Date remindEndDate = null;
if(map.get("remindstart")!=null) {
Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindStart);
remindStartDate = c.getTime();
map.put("remindstart", sdf.format(remindStartDate));
}
if(map.get("remindend")!=null) {
Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindEnd);
remindEndDate = c.getTime();
map.put("remindend", sdf.format(remindEndDate));
}
}
Wrapper<MessagesEntity> wrapper = new EntityWrapper<MessagesEntity>();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
int count = messagesService.selectCount(wrapper);
return R.ok().put("count", count);
}
}
MessagesServiceImpl.java
package com.service.impl;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.List;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.utils.PageUtils;
import com.utils.Query;
import com.dao.MessagesDao;
import com.entity.MessagesEntity;
import com.service.MessagesService;
import com.entity.vo.MessagesVO;
import com.entity.view.MessagesView;
@Service("messagesService")
public class MessagesServiceImpl extends ServiceImpl<MessagesDao, MessagesEntity> implements MessagesService {
@Override
public PageUtils queryPage(Map<String, Object> params) {
Page<MessagesEntity> page = this.selectPage(
new Query<MessagesEntity>(params).getPage(),
new EntityWrapper<MessagesEntity>()
);
return new PageUtils(page);
}
@Override
public PageUtils queryPage(Map<String, Object> params, Wrapper<MessagesEntity> wrapper) {
Page<MessagesView> page =new Query<MessagesView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,wrapper));
PageUtils pageUtil = new PageUtils(page);
return pageUtil;
}
@Override
public List<MessagesVO> selectListVO(Wrapper<MessagesEntity> wrapper) {
return baseMapper.selectListVO(wrapper);
}
@Override
public MessagesVO selectVO(Wrapper<MessagesEntity> wrapper) {
return baseMapper.selectVO(wrapper);
}
@Override
public List<MessagesView> selectListView(Wrapper<MessagesEntity> wrapper) {
return baseMapper.selectListView(wrapper);
}
@Override
public MessagesView selectView(Wrapper<MessagesEntity> wrapper) {
return baseMapper.selectView(wrapper);
}
}
YuyueguahaoController.java
package com.controller;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;
import com.entity.YuyueguahaoEntity;
import com.entity.view.YuyueguahaoView;
import com.service.YuyueguahaoService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.CommonUtil;
import java.io.IOException;
/**
* 预约挂号
* 后端接口
* @author
* @email
* @date 2023-04-13 12:28:46
*/
@RestController
@RequestMapping("/yuyueguahao")
public class YuyueguahaoController {
@Autowired
private YuyueguahaoService yuyueguahaoService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,YuyueguahaoEntity yuyueguahao,
HttpServletRequest request){
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yisheng")) {
yuyueguahao.setYishengzhanghao((String)request.getSession().getAttribute("username"));
}
if(tableName.equals("huanzhe")) {
yuyueguahao.setHuanzhezhanghao((String)request.getSession().getAttribute("username"));
}
EntityWrapper<YuyueguahaoEntity> ew = new EntityWrapper<YuyueguahaoEntity>();
PageUtils page = yuyueguahaoService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, yuyueguahao), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,YuyueguahaoEntity yuyueguahao,
HttpServletRequest request){
EntityWrapper<YuyueguahaoEntity> ew = new EntityWrapper<YuyueguahaoEntity>();
PageUtils page = yuyueguahaoService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, yuyueguahao), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( YuyueguahaoEntity yuyueguahao){
EntityWrapper<YuyueguahaoEntity> ew = new EntityWrapper<YuyueguahaoEntity>();
ew.allEq(MPUtil.allEQMapPre( yuyueguahao, "yuyueguahao"));
return R.ok().put("data", yuyueguahaoService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(YuyueguahaoEntity yuyueguahao){
EntityWrapper< YuyueguahaoEntity> ew = new EntityWrapper< YuyueguahaoEntity>();
ew.allEq(MPUtil.allEQMapPre( yuyueguahao, "yuyueguahao"));
YuyueguahaoView yuyueguahaoView = yuyueguahaoService.selectView(ew);
return R.ok("查询预约挂号成功").put("data", yuyueguahaoView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
YuyueguahaoEntity yuyueguahao = yuyueguahaoService.selectById(id);
return R.ok().put("data", yuyueguahao);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
YuyueguahaoEntity yuyueguahao = yuyueguahaoService.selectById(id);
return R.ok().put("data", yuyueguahao);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody YuyueguahaoEntity yuyueguahao, HttpServletRequest request){
yuyueguahao.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(yuyueguahao);
yuyueguahaoService.insert(yuyueguahao);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody YuyueguahaoEntity yuyueguahao, HttpServletRequest request){
yuyueguahao.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(yuyueguahao);
yuyueguahaoService.insert(yuyueguahao);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
@Transactional
public R update(@RequestBody YuyueguahaoEntity yuyueguahao, HttpServletRequest request){
//ValidatorUtils.validateEntity(yuyueguahao);
yuyueguahaoService.updateById(yuyueguahao);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
yuyueguahaoService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 提醒接口
*/
@RequestMapping("/remind/{columnName}/{type}")
public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request,
@PathVariable("type") String type,@RequestParam Map<String, Object> map) {
map.put("column", columnName);
map.put("type", type);
if(type.equals("2")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
Date remindStartDate = null;
Date remindEndDate = null;
if(map.get("remindstart")!=null) {
Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindStart);
remindStartDate = c.getTime();
map.put("remindstart", sdf.format(remindStartDate));
}
if(map.get("remindend")!=null) {
Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindEnd);
remindEndDate = c.getTime();
map.put("remindend", sdf.format(remindEndDate));
}
}
Wrapper<YuyueguahaoEntity> wrapper = new EntityWrapper<YuyueguahaoEntity>();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yisheng")) {
wrapper.eq("yishengzhanghao", (String)request.getSession().getAttribute("username"));
}
if(tableName.equals("huanzhe")) {
wrapper.eq("huanzhezhanghao", (String)request.getSession().getAttribute("username"));
}
int count = yuyueguahaoService.selectCount(wrapper);
return R.ok().put("count", count);
}
/**
* (按值统计)
*/
@RequestMapping("/value/{xColumnName}/{yColumnName}")
public R value(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName,HttpServletRequest request) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("xColumn", xColumnName);
params.put("yColumn", yColumnName);
EntityWrapper<YuyueguahaoEntity> ew = new EntityWrapper<YuyueguahaoEntity>();
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yisheng")) {
ew.eq("yishengzhanghao", (String)request.getSession().getAttribute("username"));
}
if(tableName.equals("huanzhe")) {
ew.eq("huanzhezhanghao", (String)request.getSession().getAttribute("username"));
}
List<Map<String, Object>> result = yuyueguahaoService.selectValue(params, ew);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for(Map<String, Object> m : result) {
for(String k : m.keySet()) {
if(m.get(k) instanceof Date) {
m.put(k, sdf.format((Date)m.get(k)));
}
}
}
return R.ok().put("data", result);
}
/**
* (按值统计)时间统计类型
*/
@RequestMapping("/value/{xColumnName}/{yColumnName}/{timeStatType}")
public R valueDay(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName, @PathVariable("timeStatType") String timeStatType,HttpServletRequest request) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("xColumn", xColumnName);
params.put("yColumn", yColumnName);
params.put("timeStatType", timeStatType);
EntityWrapper<YuyueguahaoEntity> ew = new EntityWrapper<YuyueguahaoEntity>();
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yisheng")) {
ew.eq("yishengzhanghao", (String)request.getSession().getAttribute("username"));
}
if(tableName.equals("huanzhe")) {
ew.eq("huanzhezhanghao", (String)request.getSession().getAttribute("username"));
}
List<Map<String, Object>> result = yuyueguahaoService.selectTimeStatValue(params, ew);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for(Map<String, Object> m : result) {
for(String k : m.keySet()) {
if(m.get(k) instanceof Date) {
m.put(k, sdf.format((Date)m.get(k)));
}
}
}
return R.ok().put("data", result);
}
/**
* 分组统计
*/
@RequestMapping("/group/{columnName}")
public R group(@PathVariable("columnName") String columnName,HttpServletRequest request) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("column", columnName);
EntityWrapper<YuyueguahaoEntity> ew = new EntityWrapper<YuyueguahaoEntity>();
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yisheng")) {
ew.eq("yishengzhanghao", (String)request.getSession().getAttribute("username"));
}
if(tableName.equals("huanzhe")) {
ew.eq("huanzhezhanghao", (String)request.getSession().getAttribute("username"));
}
List<Map<String, Object>> result = yuyueguahaoService.selectGroup(params, ew);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for(Map<String, Object> m : result) {
for(String k : m.keySet()) {
if(m.get(k) instanceof Date) {
m.put(k, sdf.format((Date)m.get(k)));
}
}
}
return R.ok().put("data", result);
}
}
storage.js
const storage = {
set(key, value) {
localStorage.setItem(key, JSON.stringify(value));
},
get(key) {
return localStorage.getItem(key)?localStorage.getItem(key).replace('"','').replace('"',''):"";
},
getObj(key) {
return localStorage.getItem(key)?JSON.parse(localStorage.getItem(key)):null;
},
remove(key) {
localStorage.removeItem(key);
},
clear() {
localStorage.clear();
}
}
export default storage;