ASP医院管理系统—病历管理系统的设计与实现
病历管理系统是医院管理系统的重要组成,该系统的开发主要包括后台数据库的建立以及前台应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的数据库,而对于后者则要求具有齐全完善的应用程序功能,友好人性化的操作界面。该系统采用现代的办公自动化理念,面向中小型医院,实现无纸化办公,确保医疗单位在病历保管实现高效办公,规范管理。
本文主要介绍了病理管理系统的设计开发与实现的全部过程。并运用功能结构图、数据库关系图和E-R图等对核心模块的设计过程进行了详细的说明。病历管理系统整体基于B/S(浏览器/服务器)模式,后台数据库选用SQL Server 2000,使用ASP嵌入HTML语言来设计实现。实现了病历在保管中的周期过程,完成了从患者的注册到患者的出院等一系列病历流程。简化了繁琐的手工操作,规范化整个病历处理流程,使得病历的流转更方便快捷。
近几年,随着医院的规模不断扩大,用原来的只靠人管理病历的方法已不合时宜。目前我国医院的信息处理基本上还停留在手工方式,劳动强度大且工作效率低,医务人员和管理人员的大量时间都消耗在事务性工作上;病案、临床检验、病理检查等许多宝贵的数据资料的检索十分费事甚至难以实现;对这些资料深入的统计分析手工方式无法进行,不能充分为医学科研利用。
随着计算机应用日益广泛;各行各业对生产管理的自动化、信息化、系统化的要求也不断提高;因而,降低劳动强度、提高劳动效率也就必然促使了医院中电子病历的使用。
电子病历是一个很复杂的项目,国际上有很多国家都要建健康档案,就是想把病历电子化。美国在新奥尔良由于飓风影响导致了大致有50、60万人的医学档案,这些病历都是由纸质的,在社区的诊所或者区域的医院保存,这些人的医学档案丢失,包括当地的州政府认为这是一个巨大的事故。从这件事反过来认识到建立病历电子化的紧迫性和重要性,因为电子病历的存放、利用会更加安全。联邦政府也成立了建立电子病历的委员会,提出了三个基本的原则。第一,要分级保密,可能有些是及其保密的,有些可以为公众共享,这是关于安全私密性的原则。第二,更新的保真性,建立电子病历的静态环境以后会有些变化,包括临床诊断和治疗在这个电子病历应该有记录,至少应该知道是谁诊断的,是什么医生在什么场合下做的修改。 第三,必须具有相当方便容易让人访问,不能有一些政策的堡垒,只要是经过授权的,无论是职业的医师、有关方面需要访问的话应该能够得到这个病历。
电子病历将提高医院各项工作的效率和质量,促进医学科研、教学;减轻各类事务性工作的劳动强度,使他们腾出更多的精力和时间来服务于病人。电子病历与纸病历相比,最显著的优点就是对信息数据的共享和反复利用。病人看病不需要携带病历,只需提供自己的姓名、病历号或其他信息,医生通过计算机即可得到该病人所有信息。本系统以B/S(Browser/Server)模式作为基本结构,所有程序和数据库存放在服务器上,浏览器端只需安装操作系统和浏览器即可,系统由用户浏览器、Web 服务器二个层次组成,体现了其开发维护简单性的特点。
2系统开发环境与技术的分析
2.1系统需要解决的主要问题
该管理系统面向的主要对象是医院,所以系统管理方面,应该有添加不同等级的管理人员和医务人员并针对不同的用户设置不同的权限,密码管理员能添加医务人员并修改添加人员的密码,同时管理人员只能修改自己的密码。在病历管理页面中病历管理员可以查看所有医务人员的病历录入信息,但是不能修改其中的录入信息。普通医务人员可以通过管理员分配的用户名和密码登录系统,由于权限的设置他们可以看见管理设置栏目但是无法进行操作。医生录入的病历信息只能由自己所看见,并且可以修改,在列表中是无法看见其他医生所录入的病历信息,很好的保证了病人的隐私权利。
2.2系统运行环境
为了保证系统运行的效率和可靠性,系统服务器端应具有较高的软硬件配置,客户端的要求不是很高。此应用程序可广泛运行于国际互联网即英特网,也可适用于内部的局域网。其运行要求如下:
硬件环境:
CPU:Inter奔腾2.0GHZ以上
内存:256MB以上
硬盘:20G以上
软件环境:Windows 2000 Server SP4(含IIS 5.1),Microsoft SQL Server
客户端配置
硬件环境:
CPU:Inter赛扬2.0GHZ以上
内存:128MB以上
硬盘:1G以上
软件环境:Windows 2000/NT/XP/2003 ,IE6.0
2.3相关技术介绍
ASP:全称是Active server pages,是微软推出的应用与Web应用程序开发的技术 ,被描述为“一个服务器的脚本环境,在这里可以生成和运行动态的、交互的、高性能的Web服务应用程序”,他不是一种编程语言,也不是一种开发工具,而是一种强大的技术框架。
JavaScript:是一种嵌入在HTML文件中的脚本语言,它是基于对象和事件驱动的,能对诸如鼠标单击、表单输入、页面浏览等用户事件做出反应并进行处理。
SQL(Structured Query Language): 结构化查询语言,是关系数据库的标准语言,通过几个命令,就可以实现定义、查询、更新和控制功能。在ASP 中对后台数据库进行查询、添加、删除和更新等操作所采用的就是SQL 语言。数据查询基本命令是SELECT,SELECT 语句用于对数据库进行查询并返回符合查询条件的数据。在查询语句中使用SQL库函数,可以实现在查询的过程中同时对某属性上的值进行统计分析。
在ASP中常用的就是表单数据的传输和接收,表单数据的传输有POST与GET两种方法,比较常用的是POST,例如常用表单头部为:
<FORM NAME="regform"METHOD="post" ACTION="addmanagerok.asp">
这里的method说明了传输数据的方法,当表单提交时可以用<%Request.form(“表单元素名”)%>或<%Request(“表单元素名”)%>来获取数据;若把传输ASP的方法改成GET,那只需要将method改成GET即可,这时除了用上面的两种方法接受数据时,<%Request.QueryString(“表单元素名”)%>也可以接受GET方法传输的数据。POST和GET两者最大的差异在于,POST方法的数据传输较为隐蔽,不会将传输传递的信息显示在浏览的网址后,而GET方法则会将传递的信息显示在浏览的网址后。
还较常用的有Session对象,该对象是建立WEB服务器同客户端的联系,并维持这一联系,其实是一个管理会话的对象,不仅可以保持管理会话,而且在此会话中可以为此次会话存储特定用户会话所需的属于自己的个性化信息,当用户在应用程序的Web页面跳转时,Session对象中的所有这些变量不会丢失直到会话过期或被放弃后,但是如果浏览器的Cookie被禁用,将不会发生作用。
3病历管理系统设计分析
3.1病历管理系统概述
病历管理系统主要完成患者的信息输入和病历的查看等相关操作,并实现医生对患者信息的快速查看。本设计主要完成了四个方面的内容,其作用如下:
1)系统管理。在本部分,根据管理员的权限的不同,不同的管理员可以执行不同的任务,病历管理员可以修改病例,而密码管理员只能修改用户的密码,并可以对其个人资料进行修改和操作,进行权限的设置,主要目的是为了是权利分散化。
2)患者个人信息管理。医生首先看到的是已存在的且是该医生诊断过的患者信息,并可以查看,也可以进行修改当天的患者信息但是不能删除。医生通过这样的方式确定在以前的诊断中有无该患者,当录入完成后该病人的信息则进入病人信息库以供医生对其进一步的诊断。
3) 患者病历管理。当患者的个人信息进库后,即可以进行此步的操作,由医生详细填入该病人的病情,并根据病人以前的病史作出自己的判断并保存在服务器数据库,在完成录入后,会自动跳往病历管理首页,并显现出已被自己诊断过的病人。同样,医生在此步骤中不具有删除权限。
3.1.1病历管理流程图
病历管理流程图如图3-1所示。
3.2数据库设计
E-R(Eneity-Relationship Approach)图是最常用的概念模型表示方法,也是数据库的核心和基础,它是按用户的观点来对数据和信息建模,依据概念模型设计应具的特点,真实性、易理解性、易修改性、易转换性。如图3-3所示。
3.2.2病历管理系统数据库各表详细设计
对于病历管理系统,要应用到的数据库表有:
Disease 患者病历表
Manage_user 在职人员信息表
User 患者个人信息表
Zhiwei 医院职位信息
各表详细信息如下:
表3-1 患者病历表
字段名 | 数据类型 | 长度 | 是否允许为空 | 字段描述 |
Id | int | 4 | 否 | 自动编号ID(主键) |
Username | nvarchar | 10 | 否 | 姓名 |
Riqi | nvarchar | 50 | 是 | 住院日期 |
Jibing | nvarchar | 50 | 是 | 诊断疾病 |
Chuyuan | nvarchar | 10 | 是 | 出院结果 |
zid | int | 4 | 是 | 住院号 |
bid | int | 4 | 是 | 病床号 |
zhiliao | ntext | 16 | 是 | 治疗经过 |
zhusu | nvarchar | 50 | 是 | 主诉 |
xbs | ntext | 16 | 是 | 现病史 |
jws | ntext | 16 | 是 | 既往史 |
xthg | ntext | 16 | 是 | 系统回顾 |
hunyins | nvarchar | 50 | 是 | 婚姻史 |
tgjc | ntext | 16 | 是 | 体格检查 |
fzjc | ntext | 16 | 是 | 辅助检查 |
note | ntext | 16 | 是 | 其他 |
author | nvarchar | 20 | 否 | 医生ID |
Shanchu | Int | 4 | 是 | 删除确认列(1为删除) |
在患者病历表中保存的是在所有在医院中看病的患者患病信息,其中用户编号是用户在病历中的唯一标识,是不重复的,同时用户名在该系统中也是不能重复的,这样在病历比较多的情况下仍然能通过编号迅速的查找到病历信息,并且将编号指定为主健。同时设置了用户名和医生ID不能为空,这是因为这些是病历当中最关键的部分,是病历存在的关键。 Shanchu字段名是不会在该系统中显示出来的。
表3-2 在职人员信息表
字段名 | 数据类型 | 长度 | 是否允许为空 | 字段描述 |
ID | int | 4 | 否 | 自动编号(主键) |
M_username | varchar | 50 | 是 | 登陆名 |
M_password | varchar | 50 | 是 | 密码 |
M_realname | varchar | 50 | 是 | 真实姓名 |
M_sex | varchar | 50 | 是 | 性别(1为男性) |
M_tel | varchar | 50 | 是 | 联系电话 |
M_email | varchar | 50 | 是 | 电子邮件 |
M_address | varchar | 50 | 是 | 住址 |
M_zip | varchar | 50 | 是 | 邮编 |
M_purview | int | 4 | 是 | 权限 |
在职人员信息表中保存有本医院所有在职员工的基本信息,用户编号设置为主健。在该表中保存的有在职人员的个人基本信息和所拥有的权限。
表3-3 患者个人信息表
字段名 | 数据类型 | 长度 | 是否允许为空 | 字段描述 |
id | int | 4 | 否 | 自动编号(主键) |
Username | nvarchar | 20 | 是 | 用户名 |
Password | int | 4 | 是 | 密码 |
cname | nvarchar | 10 | 是 | 姓名 |
Age | Int | 4 | 是 | 年龄 |
Sex | Int | 4 | 是 | 性别 |
zhiye | Nvarchar | 50 | 是 | 职业 |
Hunyin | Int | 4 | 是 | 婚姻 |
Minzu | Nvarchar | 5 | 是 | 民族 |
Jiguan | Nvarchar | 10 | 是 | 籍贯 |
Address | Nvarchar | 50 | 是 | 现住址 |
Phone | Nvarchar | 20 | 是 | 联系电话 |
guomin | Nvarchar | 80 | 是 | 过敏史 |
shenfenzheng | varchar | 50 | 否 | 身份证 |
Dis | Nvarchar | 50 | 是 | 重要疾病 |
updatetime | Datetime | 8 | 是 | 日期 |
Note | Ntext | 16 | 是 | 其他 |
author | nvarchar | 20 | 是 | 输入病历的医生编号 |
患者个人信息表是这个系统中的一个很关键的信息数据库表,因为病历的所有信息均是围绕着这张表展开,除了用户编号外,还有很关键的用户的身份证信息是不能为空的,因为用户真实姓名如果相同,只有用身份证确认病历的归属。Author字段名是不会在该系统中显示出来。
表3-4 医院职位信息
字段名 | 数据类型 | 长度 | 是否允许为空 | 字段描述 |
id | Int | 4 | 否 | 自动编号(主键) |
Daima | Int | 4 | 是 | 职位代码 |
shuoming | varchar | 50 | 是 | 职位说明 |
该表主要说明系统中各登陆人员的级别以及所处的职位。同样设置Id为主健。
3.3数据库的连接
根据系统功能的设计要求及功能模块的划分,本系统用SQL Server 2000 建立数据库,其中包括管理员数据表,病人信息数据表和病人患病情况信息表等数据表。在整个系统开发的过程中,数据库连接是必不可少的,是公用的,可以把这部分单独拿出来,做成一个函数,需要的时候调用这个函数就可以了。在ASP中同数据联系的主要是ADO,对数据库进行操作处理,要让ADO对象能够存取数据库,最重要的东西就是OLEDB驱动程序或ODBC驱动程序,ADO才能够进行存取。本设计采用了ODBC数据库连接方式,首先要建立同数据源的连接,利用了ADO的Connection建立同数据库的联系。建立ADODB.Connection,使用此对象的Open方法打开数据库。其主要代码如下所示:
<%
dim Conn
sub DB_Connect(sDBConnect)
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open sDBConnect
end sub%>
<%const strconn="DSN=biling_asp;uid=sa;pwd=;database=biling"%>
我们将这段代码单独封装在一个名为config. Asp和_lib.asp的文件中,当某动态网页中需要向数据库读取或者存取数据时,将以下代码
<!--#include file="lib.asp" -->
<!--#include file="conn.asp" -->
包含在该页面的前面,既可以实现与数据库建立连接。
4病历管理系统的实现
4.1管理员管理模块
在整个系统中。首先要写的是管理员模块,因为负责整个登陆权限的控制,管理员模块包含3个模块,其中有些功能是相辅相成的。
4.1.1用户登陆
前面在数据库表创建时已经创建好了用户信息表,数据库中的m_username和m_password字段用来验证用户身份的,有了这两项就可以较容易的写出验证用户登陆的程序了,首先看用户登陆的界面,如图4-1所示。
我们将这个页面命名为default.asp,页面中“用户名”和“密码”内容均为必填项目。验证用户身份的程序如下所示。
Call DB_Connect(strconn)
sql = "select * from [Manage_User] where m_UserName='" & sname & "' And m_PassWord='"&spwd&"'" ‘在表Manage_user中查询用户身份是否存在。
Set rs = conn.Execute(sql) ’执行这个SQL语句,同时返回一个包含了查询信息的记录集
I f Not rs.EOF = True Then
Session("Name") = rs("m_realName")
Session("vip") = rs("m_purview")’读取权限判断值,并保存在session中
rs.Close
Set rs = Nothing
Call DB_Disconnect
Response.Redirect"/bingli/manage.asp"
Response.end
Else
msg="您输入了错误的用户名或口令!"
rs.Close
Set rs = Nothing
Call DB_Disconnect
End If
I f Not rs.EOF = True Then这一句判断用户信息是否存在,EOF和BOF是数据查询记录集的属性,他们分别表示最后一条记录和第一条记录的前面,在最后个纪录前是真的则该用户存在。在验证成功后则可以进入管理页面了,否则会弹出“您输入了错误的用户名或口令!”的对话框,这时请重新输入正确的用户名或密码。
4.1.2管理员添加用户
涉及到用户的添加,会想到用户信息的验证。当用户以管理员身份登录后,点击“管理员管理”后,管理员即可以查看所有在职人员的信息,并可以进行一系列符合权限的活动,如删除和修改密码。如图4-2
在本设计中所用的Respone、Request、Session以及Server都是ASP内建对象,不必经过任何的设置就可以直接使用,但除了这些对象以外,例如使用Server.CreateObject("adodb.recordset")对象,则必须通过Server对象的CreateObject对象来建立和使用。其语法格式为:Server.CreateObject("Component Name")来建立。但是通过这样的创建的对象具有页作用域,也就是说,在当前ASP页处理完成后,服务器将破坏这些对象。如果要创建有会话或应用程序作用域的对象,可以使用<Object>标志并设置Session的属性,较常用的方法如下:
<%set session(“ad”)%=Server.CreateObject(“mswc.adrotator”) >
需要注意的是不能创建与内建对象同名的对象实例,否则将返回错误。添加用户程序中,最主要的是向据库中写入信息的,在这里将用到与数据库有关的对象-------Recordset 。在ADO中的Connection、Recordest及Command对象中,以Recordest对象最重要,是存取数据库中必不可少的部分,把表单中的数据插入到数据库中有3种方法:
1)直接使用SQL语句。其优点是速度快,不消耗资源;缺点是字段较多时不易排错。
2)使用Recordest对象。其优点是代码容易阅读,容易排错;缺点是消耗系统资源。
3)先准备好“字段名称数组”及“字段值数组”,然后利用AddNew 字段名数组 字段值数组将数据记录写入数据库。
前两种方法在本设计中均被使用,其中第二种方法最直接的反映出数据库插入的数值,比较容易排错。在第一种方法中的Values后面的值要一一对应,如果该值为空,可以不填写,但表示分隔的“’”号不能省略。
本设计中添加用户的核心程序如下所示:
If msg=”” then
If Instr(username,"=")>0 or Instr(username,"%")>0 or Instr(username,chr(32))>0 or Instr(username,"?")>0 or Instr(username,"&")>0 or Instr(username,";")>0 or Instr(username,",")>0 or Instr(username,"'")>0 or Instr(username,",")>0 or Instr(username,chr(34))>0 or Instr(username,chr(9))>0 or Instr(username,"")>0 or Instr(username,"$")>0 Then
msg="用户名包含非法字符!"
end if
end If
sql="select count(*) from [manage_user] where (m_username='" & username & "' or m_email='" & email & "') "’连接数据库
set rs=Conn.execute(sql)
if rs(0)>0 then ‘返回用户名或邮箱相同的记录个数以进行判断
msg="用户名或邮箱已存在!"
end if
rs.close’最快的关闭Recordset对象
set rs=nothing’将不用的对象进行释放
if msg="" then
sql="insert into [manage_user] (m_username, m_password, m_realname, m_Sex, m_tel, m_email, m_address, m_zip, m_purview) "
sql= sql & " values('"&username&"','"&userPwd&"','" &realname&"','" &rdoSex& "','"&tel& "','" &email& "','"&address&"','"&zip& "','"&purview&"')"
Conn.execute(sql)
end if
在添加用户的时候对用户名进行了一长窜的判断,用了Vbscript中的Instr()函数,它的作用是返回某字符串在另一字符串中第一次出现的位子。如Instr(username,"%"),在该表达式中username代表了接受搜索的字符串表达式,“%”代表要搜索的字符串表达式。如果在username中找到了“%”,则将会返回“%”的具体位于第几个字符上,没有找到则返回0,所以这里进行了判断是否大于0来确认用户名中是否包含有字符。
其主要目的是判断的哪些字符不能在用户名中存在,因为这些符号如果不能被数据库很好的处理,数据库则会将有关的东西反馈到用户端,危害系统的安全性。所以要避免一些特殊字符的输入。
4.1.3 管理员删除用户
管理员在进行日常维护时,首要的工作是确保本系统所使用的人是唯一的,医院进行的人员调动会影响系统的安全性,所以管理员的日常工作是根据上级人事主管的文件进行用户的删除,以保证只有本院的医务人员才能进入本系统查看和修改病历。主要代码如下所示:
<%call DB_Connect(strconn)
id=request("id")
sql="delete from [manage_user] where id=" & id
Conn.execute(sql)
call DB_DisConnect
response.redirect "manage_admin.asp">%
在表名Manage_user上面加上方括号是因为Manage_user表可能是一个系统表,打上方括号才不会和系统有冲突,保证系统的兼容性。
4.2患者管理模块
患者管理模块基本功能时录入患者个人基本信息及有无患病史,为医生的进一步判断达4下基础。该模块主要有3个部分组成。
4.2.1 患者基本信息的录入
患者在就医过程中,第一步应该是登记自己的个人信息,在这里称为注册。信息的录入对时间的准确性要求很搞,因为如果出现医疗纠纷,那么患者的就诊时间会直接影响到医院是否为该患者在指定的时间中诊断过。因为医院中的电脑属于统一配置,统一管理,不能用自己的电脑登录医院病历系统并且不能自行修改时间,所以所有的时间均是以本机时间作为为患者诊断时间进行登录的直接保存在user表中updatetime中。
在医生和病人数量教多时,为了便于快速的区分患者是在哪位医生看病的,以及能只显示该医生的诊断记录,在添加患者个人基本信息时候把用户登录时的seisson<”name”>的值写入患者个人信息user表中的author字段,在管理患者界面中则可以显示该医生已诊断的人数和详细的资料。代码如下所示。
<input type="hidden" name="author" value="<%=session("name")%>">’在医生输入病历时纪录病人所属医生
添加患者信息时候,为了保证能迅速和准确的联系到患者本人,其个人基本信息是必须完全填写的,包括身份证信息,住址和电话等等,在这个页面医生可以填写病人的基本资料,如图4-3。
为了保证数据的准确性,在添加患者信息时候先用javascript 进行初步判断信息是否填写完和填写是否标准,比如电话、姓名、住址等。在后台用SQL语句保证用户名和身份证没有重复。后台程序如下所示:
<%call DB_Connect(strconn)
if founderr=false then
dim sqlReg,rsReg,rs
sqlReg="select * from [User] where shenfenzheng='" & shenfenzheng & "'or username='"& username &"'"
set rsReg=server.createobject("adodb.recordset")
rsReg.open sqlReg,conn,1,3
if not(rsReg.bof and rsReg.eof) then’判断数据集中有无记录
founderr=true
errmsg=errmsg & "<br><li>你注册的身份证已经存在!</li>"
else
sql="insert into [user] (username, password, cname, age, sex, zhiye,hunyin,minzu,jiguan,address,phone,guomin,dis,updatetime,note,author) "
sql= sql & " values('"&username&"','"&password&"','" &cname&"','" &age&"','"&sex&"','"&zhiye&"','"&hunyin&"','"&minzu&"','"&jiguan&"','"&address&"','"&phone&"','"&guomin&"','"&shenfenzheng&"','"&dis&"','"&updatetime&"','"¬e&"','"&author&"')"
Conn.execute(sql)
founderr=false
end if
rsReg.close
set rsReg=nothing
end if %>
4.2.2 患者管理的删除和修改
医生在患者管理页面可以看到经过自己诊断过的患者个人信息或是已经在医生那里登记过的患者信息,医生可以查看患者的详细信息。如果该患者有病历的则可以直接转入病历页面,本部分所实现的主要功能是帮助医生统计当日患病信息,以便于医院在药物采购时有依据。在该页面中如果是管理员查看,则可以查看所有医生的病人信息,若不是则只能查看当前医生添加的用户信息。
在患者管理的页面,可以看到病人的基本信息,比如重要疾病和联系电话,其主要目的是方便医生浏览以往的病人资料,做到病人的回访,如图4-4。
代码如下:
<%
dim rs,sql
Call DB_Connect(strconn)
if session("vip")="3" then
sql="select * from [User] order by ID desc"
else
sql="select * from [User] where author='"&session("name")&"' order by ID desc"
end if
Set rs=Server.CreateObject("Adodb.RecordSet")
rs.open sql,conn,1,1
…………………(省略代码)
if not rs.eof then
do while not rs.eof
rs.movenext
loop
end if
rs.Close
set rs=Nothing
Call DB_Disconnect
%>
当患者没有病历的时候可以删除患者的个人信息,但是要经过判断,有病历的情况下是不允许删除的。患者信息删除代码如下所示:
msg=""
ID=trim(Request("ID"))
Call DB_Connect(strconn)
set rs=server.createobject("adodb.recordset")
sql="select * from [User] where ID=" & Clng(ID)
rs.open sql,conn,3,3
if count(conn.execute("select cname from disease where cname= "& rs("cname")))>1 then
msg="该用户有病历,不能被删除!"
end if
if ID<>"" then
rs("author")=session("name") or session("vip")="3" then
rs.delete
rs.update
set rs=nothing
conn.close
response.redirect "usermanage.asp"
else
response.redirect "Manage.asp"
end if
end if
rs.Close
Set rs = Nothing
Call DB_Disconnect
response.redirect "UserManage.asp"
%>
在以上程序中使用了Cing()函数,该函数的主要作用是将一个表达式转换为整数以方便计算。
4.3病历管理
病历的管理是整个系统的核心组成部分,病历管理部分是系统中权限限制较多的部分。
4.3.1病历的添加
病历的添加是在患者将个人基本信息输入在User表中为基础的,不会出现有病人的病历但没有病人基本信息的情况,所以这里用到了下拉列表菜单选项,病历的添加涉及到病人的以前患病信息,比如诊断的疾病,既往史和患病史等等,有了这些信息医生才能在治疗过程中准确的运用正确的治疗手段。
病历的添加关系着病人的患病信息是否如实的加入数据库中,病历作为医院最重要的信息应该填写完整和准确,所以添入的信息是最复杂的,包括现在所患信息,治疗的经过和自己称述的不舒服的现象。如图4-5所示。
图4-5中下拉菜单列表代码如下:
<% set rsuser=Server.CreateObject("Adodb.recordset")
sqluser="select cname from [user] where author= '" & session( "name") & "' order by id desc"
rsuser.open sqluser,conn,1,3%>
<select name="cname">
<% do while not rsuser.eof %>
<option><%=rsUser("cname")%></option>
<% rsuser.movenext
loop
rsuser.close
set rsuser=nothing %>
</select>
病历添加的代码如下所示:
<%Call DB_Connect(strconn)
Set rs = Server.CreateObject("ADODB.Recordset")
sql="select * from disease "
rs.open sql,conn,1,3
rs.addnew’这一行为加入一个记录,如果漏掉,就会改以前的记录了。
rs("username")=username
rs("riqi")=riqi
rs("jibing")=jibing
rs("chuyuan")=chuyuan
…………(省略代码)
rs.update’将更新写入数据库中
rs.close’关闭Recordest对象
set re=nothing’将不用的对象从内存中释放
response.redirect "Manage_dis.asp"
end if
%>
4.3.2病历的管理
病历的管理是本系统的重点,主要实现了病历的查看和病理的删除。医生个人的病人病历信息将出现在这个页面中,医生可以在该页面查看病例,但是一定病历被保存则不能修改,修改和删除病例需要授权。如图4-6。
分页的代码如下:
<%const MaxPerPage=20
dim strFileName,rs,sqltext,i,sql
dim totalPut,CurrentPage,TotalPages
strFileName="manage_dis.asp"
if request("page")<>"" then
currentPage=cint(request("page"))
else
currentPage=1
end if%>
<%if rs.eof and rs.bof then
response.write "目前共有 0 个注册用户"
else
totalPut=rs.recordcount
if currentpage<1 then
currentpage=1
end if
if (currentpage-1)*MaxPerPage>totalput then
if (totalPut mod MaxPerPage)=0 then
currentpage= totalPut \ MaxPerPage
else
currentpage= totalPut \ MaxPerPage + 1
end if
end if
if currentPage=1 then
showpage strFileName,totalput,MaxPerPage,true,true,"个用户"
showContent
showpage strFileName,totalput,MaxPerPage,true,true,"个用户"
else
if (currentPage-1)*MaxPerPage<totalPut then
rs.move (currentPage-1)*MaxPerPage
dim bookmark
bookmark=rs.bookmark
showpage strFileName,totalput,MaxPerPage,true,true,"个用户"
showContent
showpage strFileName,totalput,MaxPerPage,true,true,"个用户"
else
currentPage=1
showpage strFileName,totalput,MaxPerPage,true,true,"个用户"
showContent
showpage strFileName,totalput,MaxPerPage,true,true,"个用户"
end if
end if
end if%>
为了提高页面读取速度,不能将所有的病历罗列在一页上显示,而是将其分成多页显示,每页显示一定数目的病历树,分页主要有两种方法:
1)将数据库中所有符合查询条件的记录一次性读入Recordest中,并存放在内存中,然后同过ADO Recordest对象所提供的专门分页处理的属性——PageSize(页大小)、PageCount(页数目)、AbsolutePage(绝对页)来管理分页处理。
2)根据客户指示,每次分别从符合查询条件的记录中将规定的记录数目显示出来。
这里采用的是第一种方法。AbsolutePage属性指示当前记录所在的页,用PageSize属性将Recordest对象逻辑划分为一系列的页,每一页的记录数都等于PageSize;BookMark属性指示唯一标识Recordest对象中的当前记录的书签,或者将Recordest对象的当前记录设置为有效书签标识的记录,若要保存当前记录的书签,将Bookmark属性的值分配给一个变量;MaxRecords属性指示由查询由查询返回给Recordet的最大记录数目,该属性在Recordet关闭时为读写,在Recordet打开是为只读。PageSize属性指示Recordet中一页包含的记录数目,默认值为10,可以一次查看一定数量的记录。
4.3.3病历的删除
由于病历的特殊性,所以病历的删除有着严格的权限管理,在整个系统中病历的删除和恢复都是由专人负责,没有权限则会出现图4-7的提示,删除后将会提示图4-8的提示且操作行为将会被系统记录。
其代码如下所示。
<%
dim sql,id,msg,rs,sqltext,username
msg=""
id=request("id")
if session("vip")<>3 then
msg="你没有删除的权限,请与系统管理员联系"
else
Call DB_Connect(strconn)
sql="update [disease] set shanchu=1 where id=" & id
Conn.execute(sql)
msg="记录已被删除,该行为已被系统记录。"
call DB_DisConnect
end if
%>
病历的删除必然有病历的恢复,病例的恢复和删除是不同的人所执行的,如果删除和恢复在一起,将在人事管理方面引起严重的后果。在病历查看页面管理员可以选择恢复病历或者是彻底的删除病历。如图4-9。
恢复病历的主要代码如下所示。
<%
dim sql,id,msg,rs,sqltext,username
msg=""
id=request("id")
if session("vip")<>3 then
msg="没有权限恢复,请与管理员恢复!"
else
Call DB_Connect(strconn)
sql="update [disease] set shanchu=0 where id=" & id
Conn.execute(sql)
msg="记录已被成功恢复!"
call DB_DisConnect
end if
%>
经过试用,基本满足在经常业务的需要,实现了在线患者信息管理,患者信息录入等功能,系统性能良好,工作正常,具有较强的可移植性,可维护性和安全性。本系统也有一些不尽人意的地方,如录入的病历的安全性问题未能得到很好的解决,部分的界面也比较粗糙,这些都有待今后的完善。
相关文章:

ASP医院管理系统—病历管理系统的设计与实现
病历管理系统是医院管理系统的重要组成,该系统的开发主要包括后台数据库的建立以及前台应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的数据库,而对于后者则要求具有齐全完善的应用程序功能,友好人性化的操作界面。该系统采用现代的办公自动化…...
【蓝桥杯】动态规划(dp)入门!| 入门动态规划的正确方式! ——学习笔记
目录 最暴力的dfs --> 记忆化搜索 ---> 递推(dp) 记忆化搜索 暴力dfs 记录答案 递推的公式 dfs 向下递归的公式 递推数组的初始值 递归的边界 动态规划(dp)入门 | 这tm才是入门动态规划的正确方式! | dfs记忆化搜索 | 全体起立!!_哔哩哔哩_bilibili 大佬教学视频…...

元宇宙与网络安全
元宇宙是一种虚拟现实空间,用户可以在计算机生成的环境中进行互动。元宇宙的应用范围很广,比如房地产,医疗,教育,军事,游戏等等。它提供了更具沉浸感的体验,更好地现实生活整合,以及…...
Pod控制器之hpa
简述 HPA全称HorizontalPodAutoscaler Pod水平自动扩缩容,Kubernetes控制器HPA是一种用于自动调整Pod数量的控制器。它可以根据资源使用情况自动增加或减少Pod的数量,以确保应用程序的高可用性和性能。HPA可以根据CPU使用率或自定义指标来进行调整&…...

发现一个白嫖GPT4.0的方法!真的是完胜3.5!
大家好,我是五竹。 先说个基本的科普,最近被问的人都嘛了。 1、ChatGPT账号只有两种:普通账号和plus账号。 2、普通账号升级到plus账号,需要绑定国外的支付方式,每个月大概130左右!plus账号更稳!更快&am…...

数据结构之第四章、ArrayList和顺序表
一、线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是…...

webase全家桶搭建教程过程记录+bug解决
前置条件 Ubuntu20 基础环境搭建 检查Java java -version 检查mysql(Ubuntu部署MySQL) mysql --version 在装MySQL的时候发现了一个问题 就是不管怎么sudo mysql_secure_installation,,第二步设置密码就是不对,解…...
openEuler Linux 部署 HadoopHA
openEuler Linux 部署 HadoopHA 升级操作系统和软件 yum -y update升级后建议重启 安装常用软件 yum -y install gcc gcc-c autoconf automake cmake make rsync vim man zip unzip net-tools zlib zlib-devel openssl openssl-devel pcre-devel tcpdump lrzsz tar wget修改…...
React-Hooks----useEffect()
文章目录前言用法前言 useEffect() 是 React 中最常用的 Hook 之一,它可以让函数组件拥有类似于类组件中 componentDidMount、componentDidUpdate 和 componentWillUnmount 生命周期函数的功能。 用法 useEffect() 接受两个参数 第一个参数是一个函数,…...
JavaWeb基础-汇总
SSM框架课程汇总01-MySQL基础02-MySQL高级03-JDBC04-JDBC练习05-Maven&Mybatis基础06-Mybatis练习07-JavaScript08-Web概述09-HTTP10-Tomcat11-Servlet12-Request&Response13-用户注册登录案例14-JSP15-JSP案例16-会话技术17-用户登录注册案例18-Filter19-Listener&…...

Niuke:JZ36.二叉树与双向链表
文章目录Niuke:JZ36.二叉树与双向链表题目描述示例思路分析代码实现Niuke:JZ36.二叉树与双向链表 题目描述 描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示 注意: 1.要求不能创建任何新的结点,只…...
javaScript---读懂promise、async/await
一、Promise Promise 是一个 Es 6 提供的类,目的是更加优雅地书写复杂的异步任务。可以解决嵌套式的回调地域问题,Promise 将嵌套格式的代码变成了顺序格式的代码。 //回调地域 setTimeout(function () {console.log("红灯");setTimeout(function () {console.lo…...

【Linux】TCP编程流程
TCP编程流程 socket()创建套接字,套接字TCP协议选择流式服务SOCK_STREAM。 bind()指定套接字使用的IP地址和端口。IP地址是自己主机地址,端口为一个16位的整形值。 listen()方法创建监听队列。监听队列分为存放未完成三次握手的连接和完成三次握手的连…...

SuperMap iDesktop 下载安装,生成本地瓦片,以及发布本地瓦片服务
SuperMap iDesktop 是插件式桌面GIS软件,提供基础版、标准版、专业版和高级版四个版本,具备二三维一体化的数据处理、制图、分析、海图、二三维标绘等功能,支持对在线地图服务的无缝访问及云端资源的协同共享,可用于空间数据的生产…...

【ONE·Data || 常见排序说明】
总言 数据结构基础:排序相关内容。 文章目录总言1、基本介绍2、插入排序2.1、直接插入排序:InsertSort2.1.1、单趟2.1.2、总趟2.2、希尔排序(缩小增量排序):ShellSort2.2.1、预排序1.0:单组分别排序2.…...

本节作业之跟随鼠标的天使、模拟京东按键输入内容、模拟京东快递单号查询
本节作业之跟随鼠标的天使、模拟京东按键输入内容、模拟京东快递单号查询1 跟随鼠标的天使2 模拟京东按键输入内容3 模拟京东快递单号查询1 跟随鼠标的天使 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><met…...

ChatGPT 被大面积封号,到底发生什么了?
意大利数据保护机表示 OpenAI 公司不但非法收集大量意大利用户个人数据,没有设立检查 ChatGPT 用户年龄的机制。 ChatGPT 似乎正在遭遇一场滑铁卢。 3月31日, 大量用户在社交平台吐槽,自己花钱开通的 ChatGPT 账户已经无法登录,更…...

教你精通JavaSE语法之第十一章、认识异常
一、异常的概念与体系结构 1.1异常的概念 在Java中,将程序执行过程中发生的不正常行为称为异常。比如之前写代码时经常遇到的: 1.算术异常 System.out.println(10 / 0); // 执行结果 Exception in thread "main" java.lang.ArithmeticExcep…...
display、visibility、opacity隐藏元素的区别
display、visibility、opacity隐藏元素的区别 display: none 事件监听:无法进行DOM事件监听。 元素从网页中消失,并且不占据位置再次从网页中出现会引起重排 进而引起重绘继承:不会被子元素继承,因为子元素也不被渲染。 visib…...

Linux Shell 实现一键部署tomcat10+java13
tomcat 前言 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

Copilot for Xcode (iOS的 AI辅助编程)
Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot,它能根据上下文补全代码,快速生成常用…...

数据挖掘是什么?数据挖掘技术有哪些?
目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...