首页 电子病历管理系统的设计

电子病历管理系统的设计

举报
开通vip

电子病历管理系统的设计 本科毕业设计(论文) 题目名称: 医院电子病历系统的设计 专业年级: 计算机科学与技术(工) 10级 学生姓名: 秦武华 班级学号: 1班17 号 指导教师: 孙海 二○一四 年 六 月 六 日 摘 要 本文介绍了一个基于B/S结构开发的电子病历管理系统,该系统能够实现计算机对病...

电子病历管理系统的设计
本科毕业 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 (论文) 题目名称: 医院电子病历系统的设计 专业年级: 计算机科学与技术(工) 10级 学生姓名: 秦武华 班级学号: 1班17 号 指导教师: 孙海 二○一四 年 六 月 六 日 摘 要 本文介绍了一个基于B/S结构开发的电子病历管理系统,该系统能够实现计算机对病历的录入和管理,采用了面向对象的分析方法和设计思想,使用JavaWeb技术实现系统的功能。开发工具采用MyEclipse2013和Tomcat6.0,后台选用Oracle数据库,比较完整的实现了一个电子病历管理系统所具备的功能。该系统采用MVC模式开发,首先从用户界面中获取数据,然后通过逻辑请求调用实体类、业务类以及DAO类中相关的业务方法来进行数据处理,最后将数据返回给用户界面层。用户界面层在该系统中以JSP和HTML来予以实现,用户可以在界面上进行相应的输入输出操作;实体类、业务类和DAO类组成系统的模型层,该层主要负责实现用户的业务需求;而所有的控制器在该系统中以Servlet来予以实现。整个系统分为医务人员和管理员两大模块,医务人员模块实现了对病人和病历的相关管理功能;管理员模块实现了对医生、科室和密码的相关管理功能。 关键词:JavaWeb;MVC;Tomcat6.0;Oracle;电子病历 Abstract This paper introduces a electronic medical record management system based on B/S structure, the system can realize the input and management of medical record by computer, the analysis method and object oriented design, using technology of JavaWeb to realize the function of system. Using MyEclipse2013 and Tomcat6.0 as the development tools, and choosing the Oracle database as the backstage, the function of electronic medical records management system can be realized. The system adopts MVC model development, first get the data from the user interface, and then through the logical request call entity class, business class and the DAO class related business methods for data processing, the data is returned to the user interface layer. Using the JSP and HTML as the User interface layer in the system, the interface for input and output operation can be used by users; the entity class, business class and the DAO class are collectively referred to as the system's model layer, the layer is mainly responsible for the implementation of the business needs of users; and all the controller in the system with Servlet to realize. The whole system is divided into medical personnel module and administrator module two big modules, medical personnel module for the patient and the medical record management function; administrator module for the doctors, departments and password management functions. Key words: JavaWeb; MVC; Tomcat6.0; Oracle; medical record 目 录 I摘 要 IIabstract I目 录 1第1章 绪论 11.1 选题背景 11.2 选题目的 21.3 选题意义 21.4 课题应解决的主要问题 21.5 指导思想 41.6 国内外动态 5第2章 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 论证 52.1 系统可行性分析 52.1.1 经济可行性分析 52.1.2 技术可行性分析 62.1.3 法律可行性 62.1.4 运行、操作可行性分析 62.2 方案分析 62.2.1 方案分类 62.2.2 方案比较 82.2.3 方案选择 9第3章 需求分析 93.1 系统用户分析 103.2 功能需求分析 103.2.1 系统的用例图设计 113.2.2 系统类图分析 133.3 运行环境规定 133.3.1 用户界面 133.3.2 设备要求 133.4 性能需求 143.4.1 性能 143.4.2 可扩展性 143.4.3 可用性 143.4.4 易用性 143.4.5 安全性 15第4章 过程论述 154.1 系统概要设计 154.1.1 功能的独立性和模块化 154.1.2 三层结构设计思想 164.1.3 系统模块的功能设计 174.1.4 数据库设计 224.2 详细设计及实现 224.2.1 设计视图层 234.2.2 设计控制层 244.2.3 设计对象模型 244.2.4 设计数据访问层 254.2.5 创建数据库与连接数据库 284.2.6 登录模块 314.2.7 管理员模块 344.2.8 医务人员模块 404.2.9 强制登录验证 414.2.10 安全退出 42第5章 系统测试 425.1 白盒测试 425.1.1 安全测试 425.1.2 白盒测试过程 445.2 黑盒测试 455.3 测试结果 46结 论 47致 谢 48参考文献 49附 录 第1章 绪论 1.1 选题背景 随着我国医疗卫生事业的迅速发展,医学科学的不断进步,医学模式的转变和群众医疗观念的逐步改变,我国的医疗管理的难度加大,对医疗管理的要求更高。而且当今计算机信息和网络通信技术的深入发展为提高医院管理水平创造了良好的条件,医院信息管理网络系统也因此逐渐在我国各级医院中逐步推广应用。 过去开发医院信息系统,往往是从各个子系统的不同角度来管理病人信息的不同部分。随着系统规模的扩大,功能越来越复杂,要从整体把系统的集成与数据的共享,同时兼顾未来的扩充与发展,从而对系统的设计要求也越来越高。为了避免新开发的系统不断修修补补甚至推到重来,必须将病历信息作为一个独立与具体应用系统的整体来研究,以实现计算机化的病历也就是电子病历。因此,电子病历是从更深层次上保证医院信息系统长期稳定发展的基础。 电子病历管理系统的设计可以实现用计算机来对病历的管理,给医生、病人以及医院的管理员提供了便捷。同时,医生可以根据自己的角色操作不同的权限,简化了患者的看病流程,方便了各个科室医务人员的相互协作与信息共享。 由此可见,设计一个电子病历的管理系统,可以加强医院的一些医疗制度的管理,使其变得更加 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 化和智能化。因此,本次毕业设计中我选择的题目是“医院电子病历系统的设计”。 1.2 选题目的 伴随着时代的步伐,我们踏进了21世纪这个高度信息化的互联网时代,这句话毫不夸张的说明了互联网在我们日常生活中作用。当然,医院的管理方面也讲大量运用到互联网技术,而且当今计算机信息和网络通信技术的深入发展为提高医院管理水平创造了良好的条件,医院信息管理网络系统也因此逐渐在我国各级医院中逐步推广应用。所以,电子病历管理系统的设计可以为医院的管理提供更良好的服务。 本系统主要采用JavaWeb技术,主要包括JSP、Servlet等技术的开发,同时加入了MYBATIS框架技术。系统主要模拟的是软件工程的设计思想,严格按照各个步骤完成系统的各个方面的设计,研究内容主要包括:病人、医生、科室、病历和用户等。各个用户可以根据自己的角色操作不同的功能来实现对病历的管理。四年的大学生活,学习了很多的专业知识,为了能够将这些专业知识运用到实际生活中来,毕业之后能够更好地适应社会的需要,所以本次设计选题考虑的题目更接近于社会,让自己的综合素质得到提高,从而使自己能够和社会顺利接轨。 1.3 选题意义 电子病历设计具有重大的社会、经济意义。 第一,电子病历的应用是势在必行的。 从我国的现实情况看,医疗体制改革目的是降低医疗成本,提高医疗质量。电子病历(EMR)在近几年来受到空前的关注,很多地方开始争先恐后的建设以电子病历为核心的卫生信息平台。相关研究认为,目前EMR软件正处于成长期。而且传统的病历模式所发挥的作用是有限的,所以应用电子病历势在必行。 第二,电子病历能够为社会带来更优质的服务。 传统病历内容是自由文本形式,字迹可能不清,内容可能不完整,意思可能模糊不清;同时保存分散,难以查找,容易丢失;并且,科学分析时需要转抄,容易出现潜在错误。 电子病历有关病人的健康和医护情况完整的、集成的信息体现形式。它的内容更加充分,病历的书写更加规范,不易出错,减轻书写强度,在效率方面有很大的提高。同时电子病历保存更加简单,而且查询方便。可以协助医院提高工作效率,从而为社会带来更优质的服务。 1.4 课题应解决的主要问题 本系统主要使用了JSP、Servlet等相关技术,开发了一个基于中小型医院的电子病历管理系统。后台数据库采用Oracle,以Windows为操作平台,能够有效的对医院的病历进行管理。同时界面简洁友好、快速实用且查询方便。 用户方面主要分为管理员和医务人员,根据自己所具备的不同权限来实现相关的操作。承担其自己的工作职责。 管理员方面主要负责医院内部的相关管理,主要包括对医生的管理以及对科室的管理操作。同时,为了提高医院管理的安全性,管理员可以对医院内部进行加密管理,并且定期更新,为医院提供一个更安全的管理环境。 医务人员方面根据自己不同的科室进行不同的操作,可以实现对病人个人信息的管理,主要包括信息录入,以及对录入完的信息修改、查询和删除操作。同时可以给信息录入完成的病人填写病历,并且实现对病历的修改、查询和归档操作。如果需要,可以根据不同条件查询相应的病历,对病历进行打印操作。医院门诊病历一般保存年限为15-20年,所以,医务人员需要对这些达到年限的病历进行删除。 1.5 指导思想 本次毕业设计的电子病历管理系统具有以下特点: (1) 系统采用B/S结构开发 B/S(Browser/Server)结构即浏览器和服务器结构[1]。它是随着Internet技术的兴起而对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。通过这种结构开发,可以使系统变得更加方便、快捷和高效。 (2) 系统采用MVC设计模式 MVC设计模式,对应的分别是模型层(Model),负责实现业务和数据;视图层(View),负责实现输入/输出界面;控制层(Controller),主要负责从视图层获取数据,调用模型层来实现业务和数据,最后跳转到视图层[2]。所以,在整个MVC模式中,Web 用户向服务器提交的所有请求都由控制器接管。接受到请求之后,控制器负责决定应该调用哪个模型来进行处理;然后模型根据用户请求进行相应的业务逻辑处理,并返回数据;最后控制器调用相应的视图来格式化模型返回的数据,并通过视图呈现给用户。运用MVC模式,可以将业务处理和显示分离,强迫将应用分为模型、视图和控制器,使开发者必须考虑应用的额外复杂度,所以用这样的模式开发出来一个电子病历管理系统更具有可扩展性[2]。 (3) 安全性设计 系统中设计了一个医院密码,该密码由管理员进行更新管理。而医院内部的医务人员登陆时需要提供该医院密码加上自己的登录用户名和登录密码才能登录获取自己的操作权限,这样就可以保证该系统是医院内部人员在使用,进一步的提高了该系统的安全性能。 (4) 面向对象设计 系统中将医生、科室、病人、病历等都封装成了java中的实体类,并且实体类之间具有相互的关联关系,如:一个科室对应多个病人,他们的关系属于一对多的关系;而一个病人对应一张病历,他们就属于一对一的关系。同时每个实体类都有对应的数据访问类,可以直接访问数据库中的数据,从而提高了对数据库操作的安全性和程序的可扩展性。 (5) 系统前台采用JavaWeb技术 系统的前台主要采用JavaWeb技术。首先,用户通过访问客户端(IE、谷歌、火狐等浏览器)访问JSP页面,选择自己要实现的某项业务,将其提交给服务器;然后,服务器接受到请求之后,通过Servlet实现逻辑判断,调用具体的业务方法来实现具体的业务;最后,服务器将这些业务的数据响应给客户端,通过JSP页面反馈给用户[1]。如:管理员通过浏览器客户端在地址栏输入相应的访问该系统的管理员登录地址(http://localhost:8888/EMRManager/login/login.jsp)。登录成功后,选择自己需要操作的业务来实现具体的功能。同时医务人员也需要通在浏览器地址栏输入相应的访问该系统的医务人员登录地址(http://localhost:8888/EMRManager/login/doctorlogin.jsp)。登录成功后,选择自己需要操作的业务来实现具体的功能。工作原理图如图1-1: 图1-1 工作原理图 1.6 国内外动态 国外动态:美国是全世界医疗信息技术最发达的国家,他们研究的电子病历架构是根据HIMSS的电子病历模型,主要由临床数据仓库(CDR)、临床决策支持系统(CDSS)、受控医学词汇表(CMV)、计算机化的医嘱系统(CPOE)、药品管理系统(EMAR)、临床文档应用程序、以及企业级的病人主索引(Enterprise Master Patient Index, EMPI)等组成;在国外的一些做法是:比如,美国,由医疗对应的政府部门牵头,统一制定电子病历认证标准,必须符合标准的厂商才允许从事医疗机构的电子病历实施,同时,对实施符合“有效性应用”(meaningful use)的医院进行奖励和补贴,基于HL7标准的电子病历系统得到了非常广泛的应用。 国内动态:目前电子病历在国内兴起,EMR软件正处于成长期。电子病历有这样一些基本的进化过程,从传统的纸质病历、病历的电子化、结构化电子病历、具有安全的医疗过程管理能力的电子病历[3]。当前国内医院使用电子病历主要用来电子贮存、查询、统计、数据交换等管理。目前区域性病历数据交换和共享仍是一个未解决的问题。电子病历在国内的应用层次仍然较低,主要由于缺少法律和政策支持、安全管理不到位,电子病历市场有待更进一步开发。业内人士认为,目前电子病历产品不够成熟,目前的产品只满足基本业务,尚没有大规模、成熟的临床路径、决策支持的高级应用,对应产品也在完善和开发中。 第2章 方案论证 2.1 系统可行性分析 开发任何一个基于计算机的系统都会受到时间和资源的限制。因此,开发方在接受客户的项目之前,必须根据客户可能提供的时间和资源等条件进行可行性研究。可行性研究工作要在初步的需求定义之后进行。其主要任务不是研究如何解决问题,而是用最小的代价在最短的时间内确定该项目是否值得去解决,是否存在可行性研究方案,即在系统层面上论证系统开发的可行性。 2.1.1 经济可行性分析 开发一个基于计算机的系统主要是为了获取较好的经济效益和社会效益。因此对待开发系统的经济可行性论证是很重要的内容。首先,本次毕业设计的系统是由学生自己研究开发,所选用开发工具为MyEclipse2013,语言为面向对象的Java语言。数据库方面选用的是系统自带的Oracle,所以不存在软件上的经费,同时由于是个人开发,没有地点环境的限制,设备方面为自己的笔记本电脑,所以也不存在环境和设备方面的开发费用。而当软件开发成功后,可以给医院的管理方面提供很大的便捷,能够带来很大的经济效益,所以经济上是可行的。 2.1.2 技术可行性分析 技术可行性是可行性研究的关键内容。由于系统分析和定义过程与系统技术可行性评估过程同时进行,此时系统的功能、性能和目标的不确定性会给技术可行性论证带来许多困难。因此,技术可行性研究室非常重要的内容。 为了弥补我技术上的不足,在假期我参加了一次java方面的实训,主要研究的课程有J2SE、J2EE、Oracle、JSP、Servlet、HTML和JS等方面的内容。下面简单介绍下这些技术的作用。 (1) J2SE是Java语言的基础部分,基础是做好每一件事情的开始,毕业设计需要用一种专业的语言来进行开发,因为我选择了Java语言作为开发语言,所以我巩固了J2SE这部分基础知识。 (2) J2EE是Java语言的企业版,主要用于分布式网络程序的开发,对WEB开发很有用。 (3) Oracle是以高级结构化查询语言(SQL)为基础的大型关系数据库,通俗地讲它是用方便逻辑管理的语言操纵大量有规律数据的集合。是目前最流行的客户端/服务器CLIENT/SERVER)体系结构的数据库之一[4]。而我也准备毕业以后从事相关的开发,所以选择Oracle作为本次毕业设计的数据库。 (4) HTML是一种超文本标记语言,通过网页的形式将内容显示给用户[5]。通过该技术可以将其与JSP技术结合,从而做成界面,提供用户输入输出。 (5) JS是一种基于对象和事件驱动并且具有安全性能的脚本语言,可以用来向HTML页面添加交互行为,比如登录的安全验证等。该种语言通常被直接嵌入HTML页面中,这样能够加强系统界面的交互[6]。 (6) Servlet技术则是实现逻辑判断,通过界面的输入等操作,对其进行逻辑处理,然后调用相关的数据处理方法,然后实现判断,最后跳转到相应的界面显示给用户。所以该技术对业务的逻辑判断是不可缺少的。 通过学习这些内容,加上大学期间的专业知识,以及上网查询相关的资料,那么开发一个基于中小型医院的电子病历管理系统是完全可行的。 2.1.3 法律可行性 本系统的开发和使用不会侵犯他人的合法权益,严格参照《中华人民共和国计算机软件保护条例》的有关条款进行开发,所以也不会触犯到国家的法律法规。通过这两方面的论述可以确定本系统属于合法软件,所以该系统的开发在法律上是可行的。 2.1.4 运行、操作可行性分析 本系统的运行操作在中小型医院可以的到有效的实施,能够为医生管理病历方面提高很大的便捷,并且本系统不会与原有的其他系统相互矛盾,系统的操作规程和医院的常规操作流程完全符合,所以在运行、操作方面也是可行的。 2.2 方案分析 2.2.1 方案分类 方案一:开发技术选用JavaWeb技术,JSP+Servlet+Oracle10g技术,结构采用B/S模式。 方案二:开发技术选用微软的ASP技术+SqlServer2005,结构采用B/S模式。 方案三:开发技术选java+ SqlServer2005,结构采用C/S模式。 2.2.2 方案比较 1.JSP和ASP技术比较 从结构上来看,JSP和ASP在结构上类似,都是以双引号作为标记符,不同的是标记符里面代码。ASP为JavaScript或VBScript脚本,而JSP为Java代码。JSP将网页的表现形式和服务器端的代码逻辑分开[7]。作为服务器进程的JSP页面,首先被转换成Servlet(一种在服务器上运行的java程序)。Servlet支持HTTP协议的请求和响应。当JSP被转换成纯Java代码,多个用户同时请求一个JSP页面时,应用实例化线程来响应请求。这些线程由WEB服务器进程来管理,和ASP的线程管理器功能类似。同CGI为每个请求创建一个进程的模式比较,这种方式效率高的多。 从性能和平台无关性来看,与C++、VB等语言比较,Java被看作是个效率不太高的语言,但它以牺牲效率换来了平台无关性使Java可以在大多数操作系统上运行而不需要重新编译--许多人愿意为此而付出代价。Java的编译代码是一种字节代码,在运行时由操作系统上的一个Java Virtual Machine(JVM)虚拟机解释。字节代码可以在所有平台上迁移,而不需要任何改动。交叉平台编程倾向于采用所有操作系统的“最小公分母”,尤其是使用图形化界面时(Servlet不需要任何图形界面)。Servlet比传统的java程序(Applets, java app)要快,因为它们在服务器端运行,不需要加载沉重的GUI(HTML的GUI是非常少的)。另外,Servlet的字节代码只有在客户请求时才执行,所以尽管当首次调用Servlet时会有几秒钟的加载时间,但后续的请求相应非常迅速,因为服务器已经缓存了运行的Servlet。当前的JSP服务器,都带有java 即时编译器(JIT),因此,JSP的执行比每次都要解释执行的ASP代码要快,尤其是在代码中存在循环操作时,JSP的速度要快1到2个数量级。 再从连接数据库方面来看,ASP使用ODBC通过ADO连接数据库,而Java通过一个叫JDBC的技术联接数据库。目标数据库需要一个JDBC驱动程序--一个数据库与Java的接口,使得Java可以用标准的方式访问数据库。JDBC不使用服务器端的数据源。只要有JDBC驱动程序,Java就可以访问数据库了。如果一个特定的数据库没有JDBC驱动程序,而只有ODBC驱动程序,Java提供一个JDBC-ODBC桥来将JDBC调用转化为ODBC调用。所有的Java编译器都带有一个免费的JDBC-ODBC桥。理论上,桥可以访问任何常见的数据库产品。 综上所述,采用JSP技术优越性上会更好。 2.Oracle数据库和SQL Server数据库比较 随着信息技术的飞速发展,数据处理不仅在数量上要求越来越大,而且在质量上也要求越来越高。Oracle数据库在大多数企业中受到广泛使用,而SQL Server数据库也因为和Windows的联系,在企业中的使用也是非常广泛。 操作系统的稳定对数据库来说是十分紧要的,在数据库可操作平台上,Oracle可在所有主流平台上运行,Oracle数据库采用开放的策略目标,它使得客户可以选择一种最适合他们特定需要的解决方案。客户可以利用很多种第三方应用程序、工具。对开发商来说是很大的支持。而SQL Server却只能在Windows上运行了,这个就显得比较单调了,但SQL Sever在Window平台上的表现,和Windows操作系统的整体结合程度,使用方便性,和Microsoft开发平台的整合性都比Oracle强的很多。但Windows操作系统的稳定性及可靠性大家是有目共睹的,再说Microsoft公司的策略目标是将客户都锁定到Windows平台的环境当中,只有随着Windows性能的改善,SQL Server才能进一步提高。从操作平台这点上Oracle是完全优胜于SQL Server的了。 SQL Server 2005是一个具备完全Web支持的数据库产品,提供了可扩展标记语言核心支持以及Internet上和防火墙外进行查询的能力,具有可伸缩性、灵活性、扩充性好,而且价格便宜等特点,而Oracle则有着可靠安全性,速度比SQL Server快上百倍,但其价格在实施中却比SQL Server它高出了几百倍。 综上所述,Oracle和SQL Server各自有自己的优势,也有各自的不足。但Oracle除了在价格上比较昂贵之外,别的优势都比SQL Server更明显。 3.B/S和C/S模式比较 (1) C/S模式是一种两层结构的系统,第一层在客户机上安装了客户机应用程序,第二层在服务器上安装服务器管理程序。在C/S模式的工作过程中,客户机程序发出请求,服务器程序接收并且处理客户机程序提出的请求,然后返回结果。C/S模式具有以下特点: 1) C/S模式将应用与服务分离,系统具有稳定性和灵活性; 2) C/S模式配备的是点对点的结构模式,适用于局域网,有可靠的安全性; 3) 由于客户端实现与服务器端的直接连接,没有中间环节,因此响应速度快; 4) 在C/S模式中,作为客户机的计算机都要安装客户机程序,一旦软件系统升级,每台客户机都要安装客户机程序,系统升级和维护较为复杂。 (2) B/S模式,即浏览器/服务器模式,是一种从传统的两层C/S模式发展起来的新的网络结构模式,其本质是三层结构的C/S模式。在用户的计算机上安装浏览器软件,在服务器上存放数据并且安装服务应用程序,服务器有WWW服务器和文件服务器等。用户通过浏览器访问服务器,进行信息浏览、文件传输和电子邮件等服务。B/S模式具有以下特点: 1) 系统开发、维护、升级方便,每当服务器应用程序升级时,只要在服务器上升级服务应用程序即可,用户计算机上的浏览器软件不需要修改,系统开发和升级维护方便; 2) B/S模式具有很强的开放性,在B/S模式下,用户通过通用的浏览器进行访问,系统开放性好; 3) B/S模式的结构易于扩展,由于Web的平台无关性,B/S模式的结构可以任意扩展,可以从包含一台服务器和几个用户的小型系统扩展成为拥有成千上万个用户的大型系统; 4) 用户使用方便,B/S模式的应用软件都是基于Web浏览器的,而Web浏览器的界面是类似的。所以,用户使用起来就更加方便。 从开发模式上来看B/S模式更加灵活,更加方便,所以开发上选用B/S模式会给用户带来更方便的体验。 2.2.3 方案选择 通过以上资料的对比,方案一中的JSP技术比ASP技术更加优越,同时B/S模式的开发也能更加方便、灵活,而数据库方面,Oracle数据库除了在价格上比较昂贵之外,别的优势都比较明显,通过这些资料的显示结果,并结合实际的开发现状和掌握的相关知识掌,最终选择方案一作为本次毕业设计的开发方案。 第3章 需求分析 3.1 系统用户分析 在系统中根据用户不同的操作权限分为了管理员和医务人员两大类,同时医务人员又细分为门诊医生和前台医生。而对于系统的参与者还有一个病人,整个系统就是围绕病人,对其进行写病历,到病历的一些管理,并且可以对需要输出的病历进行打印输出。整个系统的顶级流图如图3.1所示。 管理员: 负责科室管理、医生管理和以及医院的密码管理操作。科室的管理包括科室的创建以及对已有科室的更新和删除操作;医生管理包括医生注册,以及医生信息的更新操作。而密码管理包括整个医院的医院密码的查询与更新,同时管理自己的管理员密码的更新操作。 门诊医生: 负责给病人写病历,以及对本科室的病历的查询和修改操作,同时,对信息无误的病历进行归档操作。 前台医生: 负责录入病人的信息,并对病人信息进行管理,包括查询、修改和删除操作,同时,对归档完成的病历,可以进行查询和打印的操作,并且,如果病历年限大于15年,可以对这些病历进行删除操作。 3.2 功能需求分析 3.2.1 系统的用例图设计 首先管理员登录系统,然后可以进行医生管理、科室管理和密码管理三种操作。医生管理是对本医院相关的医生进行查询修改,以及信息录入的操作;科室管理是对医院已有的科室进行查看和管理,包括修改信息,新建科室和删除科室等功能;密码管理是对整个医院的密码进行查询和定期更新操作,同时也可以修改自己的管理员密码。操作用例图如图3-2所示。 门诊医生登录系统后,可以选择病人管理、病历管理和密码管理操作。病人管理是给该科室就诊的病人填写病历;病历管理是对填写好的病历进行修改、查看操作,并且对没有错误的病历进行归档操作;密码管理是对自己的登录密码进行修改操作。操作用例图如图3-3所示。 如图3-4所示,前台医生登录系统后,可以选择病人管理、病历管理和密码管理操作。病人管理包括将病人信息录入并选择科别,并且可以信息录入完成的病人信息进行查询、修改和删除;病历管理是对已经归档的病历进行查询,可以根据不同的条件选择不同的查询方式,同时对查询出来的病历进行打印输出操作,如果病历年限超过了15年,那么可以对这些病历进行删除操作;密码管理是将自己的登录密码进行修改操作。操作用例图如图3-5所示。 3.2.2 系统类图分析 实体类中分为医生、科室、病人和病历四类,医生和科室之间的关联关系是1个科室对应0到多个医生,病人和科室的关联关系是1个科室对应0到多个病人,而医生和病历间的管理关系是1个医生对应1张病历,病人和病历的关系是1个病人对应1张病历,医生和病人间就通过病历联系在一起,1个医生可以对应0到多个病人,而1个病人只能对应1个医生,通过病历,能够更好的将这种关系实现出来,实体类之间的类图如图3-4所示。 同时系统采用的是JDBC项目开发的分层步骤,分为数据访问层(DAO)、业务层(service)和表示层(view),表示层调用业务层的方法实现某个功能,而业务层调用数据访问层的方法实现具体业务,数据访问层则是负责访问数据库,实现数据的添加、删除、修改和查询。其中的数据访问层和业务层的类图如图3-5所示。 3.3 运行环境规定 3.3.1 用户界面 该系统采用JavaWeb技术的开发,用JSP作为用户界面,提供给用户的是以浏览器方式访问的客户端,界面风格简洁友好,适合大多数用浏览器上网操作的人群,以大众操作的方式给以用户操作,同时能够方便用户对病历的查询,给用户提供快捷使用的界面。 3.3.2 设备要求 该系统采用B/S结构开发,以MVC模式来实现界面,模型和控制器之间的跳转,同时以MyEclipse2013作为开发工具,TOMCAT6.0作为服务器,数据库采用Oracle,因此,环境需求必须满足这些软件的需求。 (1) 硬件环境 根据目前的开发环境,拟定该系统采用PC机一台作为终端机(客户端和服务器在同一台计算机上)。 PC机的基本要求如下: 处理器(CPU):酷睿i5 3500 @ 3.40GHz 主板:NEC L4A-3 芯片组:英特尔 i915PM/GM 03 内存:2 GB ( 尔必达 DDR2 800MHz ) 硬盘:西数 WDC WD2500BEVT-22ZCT0 ( 500 GB / 5400 转/分 ) 显卡:ATI Mobility Radeon HD 4500/5100 Series ( 512 MB / 精英 ) (2) 软件环境 该系统的开发为JavaWeb开发,所以会运用到相关的开发工具和对应的数据库来予以实现具体软件环境需求如下: 操作系统:Windows XP/Windows 7 Java编译环境:JDK1.6.0.10 Web服务器:Tomcat6.0 开发工具:MyEclipse2013 数据库:Oracle 10g 3.4 性能需求 该系统作为医院电子病历管理系统,负责提供给医院一个简单快捷的管理病历的系统软件。那么,在性能上就必须满足一定的用户需求才能达到该系统的特点。 3.4.1 性能 系统是面向用户所开发的,用户在使用时,必须达到相应的效率才能体现出该系统的优越性。首先,该系统可以使用局域网来进行访问,这样就不会因网络信号的质量来限制用户的访问传输率;其次,系统中采用分页查询技术,考虑到医院的信息量比较大,那么如果从总表中查询数据,访问那么速率将会受到极大的限制,而采用分页查询,的话每次取出的数据就是固定的条数,这样就减少了查询的时间,从而提高了服务器的响应效率;最后,该系统采用连接池技术,就是在访问数据库时不许要创建连接,直接从连接池里取出连接对象进行连接操作,这样可以减少创建连接的时间,这时加上一个ThreadLocal对象将访问用户的线程和对应的连接绑定到一起,使多用户并发访问互不影响,这样就实现了医院里多个医生同时访问该系统的功能,并且数据互不影响,同时数据还能实现共享。 3.4.2 可扩展性 该系统是一个电子病历管理系统,着重突出了病历的管理方面,而门诊,配药等功能只是简单的实现或者没有予以实现,那么这些地方就可以和门诊系统和药品管理系统等系统结合,加以扩展,实现为一个完整的医院管理系统。所以该系统具备有效的扩展空间,具有可扩展性。 3.4.3 可用性 在正常使用该系统的情况下,可以确保使用过程正确有效的执行,并且通过事务控制,把一套完整的操作作为一个事务,如果某个操作遇到突发事件,如断电等导致操作失败,那么事务将回滚到操作前,保证数据的完整性,避免在使用过程中发生各种异常情况而造成重大的损失。 3.4.4 易用性 该系统是以网页客户端的形式予以访问,只要用户会浏览网页就会操作该系统,界面简洁并且友好,能够为查询等相关操作提供方便,对于医院来说,运用该系统管理病历比传统方式管理病历更加优越,能够为医务人员节省大量的时间,所以该系统是非常实用的。 3.4.5 安全性 该系统采用密码验证登录功能,同时,设定了一条医院密码,该密码有管理员负责管理,可以定期更新,该医院的医务人员登录时需要提供该密码才能够登录。该系统加入了强制登录验证,如果用户登录后半小时内没有操作,那么该用户请求服务器的Session Id会失效,那么这时该用户还要操作里面的内容时,会自动跳转到登录界面,如果用户退出后点浏览器的后退操作又回到退出前的操作界面,再次操作时也将会跳转到登录界面强制用户登录,所以该系统在保护用户内部数据时是相当安全的。 第4章 过程论述 4.1 系统概要设计 系统概要设计又称为总体设计。首先对于开发一个电子病历管理系统,开发方法采用面向对象的设计方法,并采用MVC模式的三层结构的开发,是功能具有独立性和模块化。 4.1.1 功能的独立性和模块化 JSP技术是在HTML的基础上嵌入了java代码。两种标记混杂在一起,在一定程度上给开发带来了方便。但是,混杂在一起也容易导致开发人员出错,而且出错后调试程序比较复杂,不容易用工具设置断点来检测。三层结构设计使用Servlet专注进行逻辑判断,控制页面跳转,JSP专注进行页面显示,而数据逻辑层只负责数据处理,这样最大限度的提高了开发效率。 同时,系统将复杂操作的各个功能独立分割出来,作为各个小模块予以实现,在需要用到特定功能的地方通过调用小模块实现的方法即可,这样避免了代码的冗余,同时提高了代码的复用性。更重要的是使整个系统的层次机构更加的清晰,为以后功能模块的增加提供能方便。 4.1.2 三层结构设计思想 该系统采用“用户界面-业务处理层-数据访问层”的三层结构设计,三层结构具体实现就是将整个设计分为:表示层(UI)、业务层(BLL)、数据访问层(DAL)。划分层次的目的是使各层之间的调用具有高类聚的特点,同时降低了代码之间的耦合性。 表示层(UI):用于提供用户输入和输出的界面,通过逻辑判断,显示给用户。 业务层(BLL):用于实现用户的具体业务功能。 数据访问层(DAL):用于实现对数据库中数据的添加、删除、修改和查询。工作原理如图4-1所示。 4.1.3 系统模块的功能设计 (1) 管理员模块 管理员模块分为三个大的操作,包括医生管理、科室管理和密码管理,医生管理分为医生注册、医生修改和医生查询操作,医生注册即是将医生的信息录入到数据库中并为其给定登录账号名和密码;医生修改就是将录入信息有误的医生信息进行修改,医生查询就是查看医生的详细信息。科室管理分为新建科室、查询科室、修改科室和删除科室。新建科室是将建好科室的信息录入数据库 (2) 医务人员模块 医务人员模块分为门诊医生和前台医生,门诊医生可操作的功能为病人管理、病历管理和密码管理。病人管理是给科室为该科别的病人写病历;病历管理就是将写好病历的信息进行修改和查询,同时对填写无误的病历进行归档操作,归档后,将无法进行修改操作;密码管理则是对自己密码进行更改,修改后,将返回登录界面重新登录。前台医生可操作的功能也有病人管理、病历管理和密码管理。其中病人管理是将病人的信息添加到数据库,并且为该病人选科别,同时对录入完信息的病人可以进行修改,查询和删除操作;病历管理包括通过身份信息或者是医疗保险卡号码查询对应病历,并且可以通过病人需要将其打印,这里所管理的病历都是已经归档了的病历;密码管理则是对自己密码进行更改,修改后,也将返回登录界面重新登录。 具体实现如图4-2所示。 4.1.4 数据库设计 电子病历管理系统是一个以数据库应用系统,该系统所操作的信息数据都将保存于数据库中,在数据库应用系统的开发过程中数据库的设计是尤其重要的。通过对数据库的设计来实现各种业务的需求。 (1) 数据库概念结构设计: 该设计阶段是在需求分析的基础上,设计出各种对象的实体,该实体能够满足用户的各种功能需求,拟定各个实体之间的关系,分清楚这些关系有助于后期的逻辑结构的设计。 该阶段不需要考虑所采用的数据库管理系统、操作系统类型和PC机器类型等问题,该阶段可用工具有很大。采用最多的分析方式为E-R图[8],加上别的许多计算机的辅助工具进行辅助设计,下面将用E-R图的方法进行该系统的数据库概念结构设计。 E-R图中有: 实体:用方框来表示,方框里面为实体的名称。 实体的各个属性:用椭圆来表示,椭圆里面为属性的名称。 实体间的联系:用菱形来表示,菱形里面为联系的名称。 同时用实线将实体,属性和联系连接起来。具体实现见图4-3所示。 各个实体都具有自己的属性,见4-4到4-9所示。 (2) 数据库逻辑结构设计: 根据该系统的需求,需要建立以下数据库表。 1) 管理员表:用于存放管理员登录用户名和密码的相关数据。 2) 科室表:用于存放医院已有科室的信息,包括科室电话等。 3) 医院密码表:用于存放医院密码。 4) 医生表:用于存放医院医生的信息,包括科室信息和登录信息等。 5) 病人表:用于存放病人的信息,包括选择的科别。 6) 病历表:用于存放病历信息。 同时为了功能需求,需要创建一张拷贝病人和病历信息的表,表中字段和病人表以及病历表中的字段完全一致,拷贝的目的是为了更好地保存,并将病人表和病历表中相关的数据删除,保证数据的可靠性,以及实现数据的归档。实现拷贝后的数据不允许更改,只能查阅。根据表格的设想,设计出对应的表格。 如表4-1所示为管理员表,用于存放管理员登录用户名和密码的相关数据。 表4-1  管理员表 Field Type Not Null pk Default Comment username varchar2 (10) No yes 用户名 password Varchar2 (15) No 密码 如表4-2所示为科室表,用于存放医院已有科室的信息,包括科室电话等。 表4-2 科室表 Field Type Not Null pk Default Comment cid number(7) No yes 科室编号 cname Varchar2 (20) No 科室名 createtime date No sysdate 创立时间 cphone Varchar2 (13) No 科室电话 如表4-3所示为医院密码表:用于存放医院密码。 表4-3 医院密码表 Field Type Not Null pk Default Comment passid number(7) No yes 密码编号 pass Varchar2 (10) No 医院密码 如表4-4所示为医生表:用于存放医生的信息。同时,表中的字段cid对应科室表中的cid,表示该医生所工作的科室是为对应的科室,也就是科室表中的cid和医生表中的cid是一一对应的,一个科室有多个医生,通过该字段进行连接则可以从中表现出来。 表4-4 医生表 Field Type Not Null pk Default Comment doid number(7) No yes 医生编号 doname Varchar2 (20) No 医生姓名 doage number(2) No 医生年龄 dosex char(1) No 医生性别 doidno Varchar2 (11) No 医生省份证号 domobile Varchar2 (15) No 医生电话 doemail Varchar2 (30) No 医生邮箱 doedu Varchar2 (20) No 医生学历 doismarried char (1) No 医生婚否 docountry Varchar2 (20) No 医生籍贯 cid Number(7) No 医生科室号 username Varchar2 (10) No 医生用户名 password Varchar2 (15) No 医生密码 如表4-5所示为病人表:用于存放病人的信息。同时,表中的字段cid对应科室表中的cid,表示该病人所对应的科别,也就是科室表中的cid和病人表中的cid是一一对应的,一个科室有多个病人,通过该字段进行连接则可以从中表现出来。 表4-5 病人表 Field Type Not Null pk Default Comment pid number(7) No yes 病人编号 pname Varchar2 (20) No 病人姓名 page number(2) No 病人年龄 psex char(1) No 病人性别 pemrno Varchar2 (10) No 医疗保险卡号码 nation Varchar2 (20) No 民族 pcountry Varchar2 (20) No 籍贯 pmobile Varchar2 (11) No 病人电话 ismarried char (1) No 婚否 idno Varchar2 (18) No 身份证号 address Varchar2(100) No 家庭住址 cid Number(7) No 科别号码 如表4-6所示为病历表:用于存放病历的信息。同时,表中拥有对应的外字段pid和doid分别对应病人表中的病人编号和医生表中的医生编号,将某个医生为某个病人写的某张病历联系到了一起。 表4-6 病历表 Field Type Not Null pk Default Comment medid number(7) No yes 病历号 pid number(7) No 病人编号 mhistory Varchar2(100) No 病史 symptom Varchar2(100) No 症状 preason Varchar2(500) No 病情描述 doid number(7) No 诊断医生编号 ttime date No sysdate 诊断时间 chufang Varchar2(500) No 处方 yizhu Varchar2(500) No 医嘱 4.2 详细设计及实现 4.2.1 设计视图层 系统的视图层采用的是一组JSP和HTML结合的页面,通过JS、JSTL和EL表达式的方式把数据提供给用户操作。本系统界面设计采用了模块化处理,把多个页面共有部分继承一个模块,例如将页面分为top、center两部分,而center又分为left和right两部分。这样,在开发的时候就不用每张页面都重复的写相同的部分,只需要在主页中改变right部分的显示即可,极大的提高了开发效率。 (1) 管理员模块的主要页面如下 主页(main.html):主页是登录系统成功后显示的界面。 top(top.jsp):所有页面共有的top部分,通过就来显示该界面。 center(center.html):所有页面共有的center部分,通过来显示该界面。 登录页(login.jsp):管理员通过该页面进行登录操作。 医生管理(showDoctor.jsp):显示出医院所有的医生,并可以对其进行查看和修改等操作。 医生注册(addDoctor.jsp):将医生的信息录入进入数据库,同时给医生注册登录账号和密码。 科室管理(showCategory.jsp):显示出所有的科室信息,并可以对齐进行查看、修改和删除操作。 新建科室(addCategory.jsp):将新建立的科室信息录入到数据库中进行管理。 密码管理(showPass.jsp):显示出医院密码,可以对其进行修改操作。 修改管理员密码(updateManagerPassword.jsp):修改管理员的登录密码。 (2) 医务人员模块的主要页面如下 登录页(doctorlogin.jsp):医务人员进行登录操作的界面。 病人管理(showPatient.jsp):查询出所有信息登记完成的病人,对其进行删除、修改和查看。 病历管理(showMed1.jsp):显示出已经归档的病历,对其进行查询、打印操作。 病历删除(selectMedPass.jsp):查询出达到15年以上的病历,让医生进行删除操作。 病历归档(showMedByCname.jsp):显示出某个科室已经填写无误的病历,可以对齐进行归档操作。 病历修改(updateMed.jsp):对填写有误的病历进行修改操作。 写病历(addMed.jsp):医生对本科室的病人进行添加病历的操作。 密码修改(updateDoctorPass.jsp):修改医生的登录密码。 4.2.2 设计控制层 根据该系统所要实现的功能,通过Servlet进行逻辑控制,界面上的每个功能操作对应了一个Servlet控制器,该控制器首先通过调用业务层方法,进行判断是否满足功能,如果满足则调到操作成功的界面显示给用户,如果失败则跳转到失败页面提示用户操作失败。 在web.xml配置文件中配置好相关的Servlet类和相应的映射,部分代码如下: … This is the description of my J2EE component This is the display name of my J2EE component ManagerLoginActionServlet com.qwh.bysj.emr.servlet.login.ManagerLoginActionServlet This is the description of my J2EE component This is the display name of my J2EE component ShowDoctorActionServlet com.qwh.bysj.emr.servlet.manager.ShowDoctorActionServlet ManagerLoginActionServlet /servlet/ManagerLoginActionServlet ShowDoctorActionServlet /manager/ShowDoctorActionServlet … 每一个界面都需要使用到中的URL地址,而每一个对应一个映射。 4.2.3 设计对象模型 根据之前对该系统的描述,就可以很容易的理解该系统中所建立的对象模型,通过MyEclipse可以自动生成对应的实体类,所有实体类存放com.qwh.bysj.emr.entity包中,各个类的描述如下: (1) Category类:科室类。 (2) Doctor类:医生类。 (3) Med类:病历类。 (4) Pass类:医院密码类。 (5) Patient类:病人类。 (6) Users类:管理员用户类。 每一个实体类都对应着数据库中的一张表,同时病人类和病历类还对应着相应的拷贝信息表。 4.2.4 设计数据访问层 数据访问层采用了两种获取连接对象的方式,使用的连接对象为Connection和SqlSession。具体实现是Connection连接对象是针对于表连接操作的,内部采用TOMCAT连接池。而SqlSession为MyBatis框架给我们提供的连接。根据数据库重的表和实体类之间的关系,多数据访问层(DAO)进行代码的编写操作。 业务层会调用数据访问层中定义好的方法来进行数据的添加、删除、查询和修改操作,并且实现对应的功能。 数据访问层定义采用接口的方式,这样可以使我们在换了另一种数据库之后,只需要修改DAO层接口的实现方法,别的地方都可以按原来的方式进行调用,DAO层对应的实现类和接口(或映射文件)见表4-7所示。 表4-7 DAO层的接口和实现类以及实体类关系表 实体类 数据库访问接口 接口实现类或映射文件 Category CategoryDao category-mapper.xml Doctor DoctorDao DoctorDaoImpl Med MedDao MedDaoImpl Patient PatientDao PatientDaoImpl Pass PassDao pass-mapper.xml Users UsersDao users-mapper.xml 4.2.5 创建数据库与连接数据库 (1) 在系统上安装Oracle 10g版。 (2) 启动Oracle中的相关服务,打开Oracle访问主页http://127.0.0.1:8080/apex登录管理员账号,并创建一个新的账号qinwh用于该系统的开发账号,密码为qinwh。 (3) 在数据库中创建所有需要用到的数据表 (4) 在项目的com.qwh.bysj.emr.util包中编写用于连接数据库的工具类。 代码如下: …… public class JdbcUtilPool { private static final ThreadLocal tl=new ThreadLocal(); /** * 方法的描述 : 获取连接 * @return Connection连接 * @throws Exception */ public static Connection getConnection()throws Exception{ Connection conn=tl.get(); if(conn==null){ // 获取JNDI的默认context Context ctx = new InitialContext(); // 根据给定目录和名称获取数据源 Object obj = ctx.lookup("java:comp/env/jdbc/qinwh"); DataSource ds = (DataSource)obj; // 获取连接 conn = ds.getConnection(); tl.set(conn); } return conn; } /** * * 方法的描述 : 断开连接 * @param rs * @param stm * @param conn * @throws Exception */ public static void release(ResultSet rs,Statement stm,Connection conn)throws Exception{ if(rs!=null) rs.close(); if(stm!=null) stm.close(); if(conn!=null){ conn.close(); tl.remove(); } } } 在TOMCAT的conf目录下编写context.xml文件,相关代码如下: 同时采用的MyBatis框架技术,需要在com.qwh.bysj.emr.util包中编写用于创建连接的SqlSession工具,部分代码如下: public class SqlSessionUtil { private static SqlSessionFactory ssf=null; private static ThreadLocal tl=new ThreadLocal(); static{ try { Reader resources=Resources.getResourceAsReader("com/qwh/bysj/emr/conf/mybatis-config.xml"); ssf=new SqlSessionFactoryBuilder().build(resources); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); throw new ExceptionInInitializerError(e); } } /** * * 方法的描述 : 获取sqlsession * @return * @throws Exception */ public static SqlSession getSqlsession()throws Exception{ SqlSession ss=tl.get(); if(ss==null){ ss=ssf.openSession(); tl.set(ss); } return ss; } /** * * 方法的描述 : 释放sqlsession * @param ss */ public static void close(SqlSession ss){ if(ss!=null){ ss.close(); tl.remove(); } } } 同时,在com.qwh.bysj.emr.conf包下创建mybatis-config.xml配置文件,部分代码如下 4.2.6 登录模块 系统登录界面分为管理员登录和医务人员登录模块,医务人员登录需要提供自己的用户名和密码并加上医院密码才能登录,而管理员只需要提供用户名和密码登录,两个界面可以实现超链接跳转,具体实现见图4-10(管理员登录模块)和4-11(医务人员登录模块)。 管理员登录实现的主要代码如下: try { EMRservice mms=new EMRserviceImpl(); Users users = mms.queryUsers(); if(!users.getUsername().equals(username)){ req.setAttribute("loginError","用户名不存在" ); //回登录界面 req.getRequestDispatcher("/login/login.jsp").forward(req, res); }else{ if(users.getPassword().equals(password)){ HttpSession session=req.getSession(true); session.setAttribute("myloginusers", users); //跳转到管理员界面 res.sendRedirect(super.getServletContext().getContextPath()+"/manager/main.html"); } else{ req.setAttribute("loginError","登录密码错误" ); req.getRequestDispatcher("/login/login.jsp").forward(req, res); //回登录界面 } } } catch (Exception e) { e.printStackTrace(); } 医务人员登录实现的主要代码如下: try { EMRservice mms=new EMRserviceImpl(); Pass pass2 = mms.selectPass(); Doctor doctor = mms.selectDoctorByUsername(username); System.out.println(doctor); if(pass2.getPass().equals(pass)){ if(doctor==null){ req.setAttribute("loginError", "用户名不存在,登陆失败"); //跳转 req.getRequestDispatcher("/login/doctorlogin.jsp").forward(req, res); } else{ if(doctor.getPassword().equals(password)){ HttpSession session = req.getSession(true); session.setAttribute("myloginDoctor",doctor ); System.out.println("-------------------"); res.sendRedirect(super.getServletContext().getContextPath()+"/doctor/main.html"); } else{ req.setAttribute("loginError", "密码错误,登陆失败"); req.getRequestDispatcher("/login/doctorlogin.jsp").forward(req, res); } } } else{ req.setAttribute("loginError", "医院密码输入错误,登录失败"); //跳转登录界面 req.getRequestDispatcher("/login/doctorlogin.jsp").forward(req, res); } } catch (Exception e) { e.printStackTrace(); } 4.2.7 管理员模块 管理员模块分为医生管理、科室管理和密码管理三个功能。 (1) 医生管理 医生管理里面有两个超链接,分别为显示全部医生和医生注册两个功能。 首先介绍显示全部医生功能,如图4-12所示。 查询出医院所有的医生信息,并且可以对信息进行查看和修改。点击张三医生的查看,则显示出该医生的详细信息,包括登录用户名,如图4-13所示 其次介绍医生注册界面,它是将医生的信息录入到数据库中,点击医生注册,界面跳转如图4-14所示。 (2) 科室管理 科室管理分为新建科室和显示所有存在的科室两个功能。 新建科室,是将新增加的科室信息添加到数据库中,如图4-15所示。 显示所有科室是将医院所有科室信息列出来,让用户可以对其进行修改和删除操作。如图4-16所示。 (3) 密码管理 密码管理是对医院密码以及管理员自己的密码进行管理,查询医院密码,你可以获得医院的密码信息,而修改医院密码,需要输入固定的10位密码,并且修改是需要输入两次新密码,如果两次输入错误,则将不予修改,如图4-17和4-18所示所示。 相关的验证代码如下: 修改管理员密码,也将通过验证,同时还将验证原密码是否输入正确,修改成功后将返回登录界面,修改界面如图4-19所示. 修改成功后,将删除该账号连接服务器的session,使session失效,需要重新登录,验证的关键代码如下: try { EMRservice mms=new EMRserviceImpl(); Users users = mms.queryUsers(); if(!users.getPassword().equals(pass)){ throw new Exception("旧密码不正确"); } else mms.changeUsers(pass1); HttpSession session=req.getSession(true); session.removeAttribute("users"); session.invalidate(); res.sendRedirect("/EMRManager/login/login.jsp"); } catch (Exception e) { e.printStackTrace(); req.setAttribute("updateError", "旧密码不正确"); req.getRequestDispatcher("/manager/updateManagerPassword.jsp").forward(req, res); } 4.2.8 医务人员模块 医务人员模块中,医务人员在进行登录时会进行判断,如果对应科室为前台登记,那么将会跳转到前台登记界面操作,如果属于别的科室,那么就跳转到门诊医生界面。该处使用来进行验证。下面将进行分开介绍两种界面的具体实现。 (1) 前台医生模块 前台医生登录后分为3个具体功能,主要包括病人管理、病历管理和密码管理。 首先病人管理是对病人的信息进行录入、删除、修改和查看操作。对应的操作为病人信息登记和管理登记病人两个模块,进入病人信息登记后将出现如图4-20的界面。 管理登记病人界面,是将所有登记完信息的病人显示到页面,按照后登记的显示在最前面,医生可以对病人有误的信息进行查看、修改和删除操作,具体操作界面如图4-21所示。 其次病历管理模块,该模块所管理的病历都是已经确认无误,并进行归档后的病历,该病历不可以进行删除操作,主要分为查看所有病历、条件查询病历和管理过期病历三个功能。 查看所有病历是针对不知道用户信息的盲目查询,该处可以通过下拉列表根据科室来进行查看,并且,可以对查询到的病历进行打印。具体操作界面如图4-22所示。 同时点击打印界面,会提示下载,选择下载会下载到一份该病人的word模板病历。Word页面具体内容如图4-23所示。 条件查询病历分为病人姓名、病人身份证和医保卡号三种查询方式,可以输入一项,也可以输入多项条件,并且条件可以输入部分条件进行模糊查询。操作界面如图4-24所示。 多个条件查询出的结果也可以进行打印操作。 管理过期病历室是对年限超过15年的病历进行管理,为了避免数据库存入大量的数据,医生可以对这部分病历进行删除操作,具体操作界面如图4-25所示。 最后,密码管理中是修改医生的登录密码,修改时也将验证旧密码是否正确,同时修改成功后将跳转到登录界面。 (2) 门诊医生模块 门诊医生操作模块也分为病人管理、病历管理和密码管理操作。 首先,病人管理模块中可以显示本科室送就诊的病人信息,可以对就诊病人添加病历,对于添加完病历的病人信息将不会在就诊病人队列中存在,而添加完成的病历将保存到病历表中。具体功能如图4-26所示,添加病历界面如图4-27所示。 添加完病历,将会删除原来病人表中的该条 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 ,并把该病人信息复制到另一张无法修改的表中保存。具体实现代码如下: try { EMRservice mms=new EMRserviceImpl(); Med med=new Med(); med.setPatient(mms.selectPatientByPid(Integer.parseInt(pid))); med.setMhistory(mhistory); med.setSymptom(symptom); med.setPreason(preason); HttpSession session = req.getSession(true); Object obj = session.getAttribute("myloginDoctor"); Doctor doctor=(Doctor) obj; med.setDoctor(doctor); med.setChufang(chufang); med.setYizhu(yizhu); med.setTtime(new SimpleDateFormat("yyyy-MM-dd").parse(ttime)); System.out.println(med.getDoctor()); System.out.println(med.getPatient()); mms.insertMed(med); mms.insertPatient1(mms.selectPatientByPid(Integer.parseInt(pid))); mms.deletePatient(Integer.parseInt(pid)); res.sendRedirect("/EMRManager/doctor/ShowPatientByCnameActionServlet"); } catch (Exception e) { req.setAttribute("addmederror", "添加失败"); req.getRequestDispatcher("/doctor/AddMedQueryActionServlet?pid="+pid+"").forward(req, res); } 其次是病历管理功能模块,该功能模块是针对于本科室的病历进行管理操作,也就是医生写好了病历将会自动添加到这个模块中来,具体操作界面如图4-28所示。 如图所示,可以对这些病历进行查看详情,该功能是将该病人的病历以标准的病历模板的形式显示给用户,如果发现该病例上的信息有误,那么我们可以执行修改操作,将需要修改的信息修改完成后,确定该病历无误,那么医生可以在复选框中选中该条记录,点击病历归档操作,将数据归档到数据库中的病历复制信息表,并将该条记录从病历表中删除,实现归档后的病历无法更改的操作,该功能模块的主要实现代码如下: try { EMRservice mms=new EMRserviceImpl(); for (int i = 0; i < str.length; i++) { Med med = mms.selectMedById(Integer.parseInt(str[i])); mms.insertMed1(med); mms.deleteMed(med.getMedid()); } res.sendRedirect("/EMRManager/doctor/ShowMedByCnameActionServlet"); } catch (Exception e) { e.printStackTrace(); } 最后密码管理中也是修改医生自己的登录密码,修改时也将验证旧密码是否正确,同时修改成功后将跳转到登录界面。 4.2.9 强制登录验证 强制登录功能是为了保证用户失去了操作权限之后,系统将强制用户进行登录操作,该功能主要以过滤器来实现,具体实现是系统首先检测客户端与服务器所建立的session id是否还有效,如果无效,那么服务器将自动跳转到登录界面,不让用户有操作权限,以管理员用户为例,具体实现代码如下: public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req=(HttpServletRequest) request; HttpServletResponse res=(HttpServletResponse) response; HttpSession session = req.getSession(); Object obj = session.getAttribute("myloginusers"); if(obj==null){ res.sendRedirect("/EMRManager/login/login.jsp"); }else { chain.doFilter(request, response); } } 该代码为判断用户是否有效,无效则跳转到登录界面,同时需要一个过滤器的配置文件,即在web.xml中加入如下代码: ManagerLoginFilter com.qwh.bysj.emr.servlet.filter.ManagerLoginFilter ManagerLoginFilter /manager/* 4.2.10 安全退出 安全退出功能,是用户点击退出功能后,系统将会将该用户访问服务器的连接断开,并将该用户的session删除,结合强制登录功能,将返回登录界面,从而不让该用户拥有操作权限,这样可以保证该系统的安全性。以管理员用户为例,该部分的具体实现代码如下: protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { HttpSession session=req.getSession(true); session.removeAttribute("myloginusers"); session.invalidate(); res.sendRedirect("/EMRManager/login/login.jsp"); } 第5章 系统测试 软件测试是对软件规格说明、软件设计和编码的最全面也是最后的审查。通过软件测试,可以发现软件中绝大部分潜伏的错误,从而大大的提高了软件产品的正确性、可靠性,进而可显著提高产品质量。 软件测试常用的方法分为静态测试和动态测试两种。静态测试是采用人工检测和计算机辅助静态分析方法对程序进行检测;动态测试是指事先设计好一组用例,然后通过运行程序来发现错误,其方式有两种,即黑盒测试和白盒测试。 5.1 白盒测试 软件的白盒测试是对软件的过程性细节做细致的检查。这种方法是将测试对象看作是一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序的所有所以逻辑路径进行测试。通过在不同的点检查程序的状态,确定实际的状态是否与预期的状态一致。因此白盒测试又称为结合测试或逻辑驱动测试。该系统在逻辑结构上较为复杂,进行穷尽的测试不符合现实。基本测试路径方法可以较好的解决这类问题,它的主要思想是根据软件详细设计的过程性描述和源代码中的流程控制求出程序中的环形复杂度量,然后以此度量确定程序的基本路径集合,并由此导出一组测试用例来覆盖该集合中的每一个独立路径,从而可以保证每条语句至少执行一次。 5.1.1 安全测试 安全测试中主要是验证系统对非法入侵者的防范能力,我们采取各种加密手段,如增加医院密码,医务人员需要验证自己的用户名和用户密码以及医院密码同时验证成功才能获取操作权限。同时安全退出和强制登录两个功能模块的设计,只要该用户失去了操作权限,那么将会返回到登录界面,使该用户无法继续操作该系统的功能。所以,整个系统的安全性能是很高的,通过安全测试证实了该系统中安全设计模块的功能可以达到预期目的。 5.1.2 白盒测试过程 利用白盒测试中的基本路径测试法对登录模块进行测试。 (1) 根据详细设计我们可以导出该系统在登录模块的程序流程图以及登录过程的流图。 1) 登录模块程序流程图如图5-1所示。 2) 登录过程流图如图5-2所示。 (2) 根据流图确定环形复杂度量V(G)。可以用三种方法求出V(G)的值。 1) V(G)=E-N+2=5-5+2=2,其中E为流图中的边数,N为节点数。 2) V(G)=2(个区域)。 3) V(G)=P+1=1+1=2,其中P为谓词节点的个数。 (3) 确定基本路径集合(即独立路径集合)。条独立的路径是指,和其他的独立路径相比,至少引入一个新处理语句或一个新判断的程序通路。在(2)中求出的V(G)值正好等于该程序的独立路径的条数。于是可以确定2条独立的路径: 路径1:1—2—3—4—5 路径2:1—2—…—3—4—5 (4) 为每一条独立的路径各设计一组测试用例,以便强迫程序沿着该路径至少执行一次 1) 路径1的测试用例 输入正确的用户名,密码。 期望结果:进入登录成功页面。 2) 路径2的测试用例 输入错误的用户名,密码。 期望结果:进入登录页面,提示错误,要求重新输入。 5.2 黑盒测试 软件的黑盒测试意味着测试要在软件的接口处进行。这种方法是把测试对象看着一个黑盒子,测试人员完全不用考虑程序内部逻辑和内部特性,只依据程序的需求规格 说明书 房屋状态说明书下载罗氏说明书下载焊机说明书下载罗氏说明书下载GGD说明书下载 检查程序的功能是否符合它的功能说明。因此黑盒测试又叫做功能测试或数据驱动测试。黑盒测试主要是为了发现以下几类错误: (1) 是否有不正确或遗漏的功能? (2) 在接口上,输入是否正确的接受?能否输出正确的结果? (3) 是否有数据结构或外部信息(例如数据文件)访问错误? (4) 性能上是否能够满足要求? (5) 是否有初始化或终止性错误? 在黑盒测试过程中,因为假设系统程序为不可见所以测试要在系统外部进行,下面具体介绍黑盒测试的过程: (1) 划分等价类并编号,结构如表5-1所示: 表 5‑1 等价类表 输入等价类 有效等价类 无效等价类 用户名 eq \o\ac(○,1)一到十长度的字符串 eq \o\ac(○,2)空字符 eq \o\ac(○,3)超过十长度的字符串 用户密码 eq \o\ac(○,4)六到十五长度的字符串 eq \o\ac(○,5)空字符 eq \o\ac(○,6)超过十五长度的字符串 eq \o\ac(○,7)不到六个长度的字符串 (2) 设计测试用例,以便覆盖所有有效等价类。测试用户名为“admin”用户密码为“123456”,测试数据有效,覆盖的有效等价类 eq \o\ac(○,1)、 eq \o\ac(○,4)。 (3) 为每一个无效等价类设计一个测试用例 测试用户名:“”用户密码:“12345”,测试数据无效,覆盖的无效等价类 eq \o\ac(○,2)、 eq \o\ac(○,7)。 测试用户名:“adminadmin1”用户密码:“”,测试数据无效,覆盖的无效等价类 eq \o\ac(○,3)、 eq \o\ac(○,5)。 测试用户名:“”用户密码:“”,测试数据无效,覆盖的无效等价类 eq \o\ac(○,2)、 eq \o\ac(○,5)。 测试用户名:“adminadmin1用户 密码:“1234567890987654”,测试数据无效,覆盖的无效等价类 eq \o\ac(○,3)、 eq \o\ac(○,6)。 测试用户名:“adminadmin1用户 密码:“12345”,测试数据无效,覆盖的无效等价类 eq \o\ac(○,3)、 eq \o\ac(○,7)。 测试用户名:“”密码:“1234567890987654” 测试数据无效,覆盖的无效等价类 eq \o\ac(○,2)、 eq \o\ac(○,6)。 测试用户名:“”密码:“123456” 测试数据无效,覆盖的无效等价类 eq \o\ac(○,2)。 测试用户名:“adminadmin1”密码:“123456” 测试数据无效,覆盖的无效等价类 eq \o\ac(○,3)。 测试用户名:“admin”密码:“” 测试数据无效,覆盖的无效等价类 eq \o\ac(○,5)。 测试用户名:“admin”密码:“1234567890987654” 测试数据无效,覆盖的无效等价类 eq \o\ac(○,6)。 测试用户名:“admin”密码:“12345” 测试数据无效,覆盖的无效等价类 eq \o\ac(○,7)。 5.3 测试结果 该系统通过多方面的测试,在测试过程中,面对着各种已知或未知的错误,都需要我们动手去调试,通过不断的调试与更改,将错误排除,最终达到了测试的目的,同时软件的各个功能都能正常运行,所以本次测试很成功 结 论 在本次毕业设计中,我以中小型医院为例设计了一个电子病历管理系统,在整个设计过程中,对很多东西有了新的认识和了解,认识问题和解决问题都有了本质上的改变,特别是对于MVC开发模式的认识和掌握,对于我在未来的软件开发中有了熟练的开发模式,专业技能方面得到了很大的提高。 MVC模式开发,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。这样各个部分分开后,就可以专注于一层的具体开发,在视图层,我将所有的界面都通过该层来显示,同时,该部分功能模块只用来做界面,提供给用户进行输入输出操作;在模型层,将所有的数据与数据库连接操作归纳为一起,并以实体的形式对应数据库中的表,比如数据库中的医生表和病人表在程序代码中以医生类和病人类来表示,实体类中的属性对应数据库中的表的字段,同时增加每张表的添加、修改、删除和查询的方法,并通过业务需求写出对应的业务方法;在控制器层只需要做逻辑判断,判断该操作是否成功或者失败,成功将跳转到成功界面,而失败则跳转到失败界面。每层的工作相互独立,这样在功能维护上也很方便,有利于添加功能,使程序更具有可扩展性。 本次毕业设计,完成了老师布置的任务书上的内容,以一个中小型医院为例设计一个电子病历管理系统,能实现病历的计算机录入和管理,界面简洁友好、快速实用和查询方便。系统有基础数据、新增病例、病历管理、病例查询等模块,可根据需要输出病例等文档报表,整个系统以B/S结构实现。 由于个人经验与能力的不足,系统在实现技术上还有很多不尽人意的地方,比如刚开始准备使用SSH框架技术做开发,但由于时间紧迫,要在规定时间内学习SSH并完成这次毕业设计是不大可能的,所以最后采用了MyBatis这个小型框架来做弥补,同时在界面美观方面有一定的不足,这些问题都是需要有充足的时间去修改和美化的,所以,这些问题有待于进一步的美化和完善。 通过这次毕业设计,使我增长了许多的专业知识,对于未来在软件行业的发展奠定了一定的基础,我会运用在此过程中得到的技术和学习方法不断的提高自己,让自己不断的在实践中成长,更好的适应软件开发这个行业。 致 谢 毕业设计是我们在大学的最后学习阶段,非常感谢我的指导教师孙海老师,整个过程从论文选题、项目开发、功能修改、论文写作、初稿修改到最终定稿,都是在老师的悉心指导下逐步完成。为了知道我完成整个毕业设计工作,孙海老师放弃了自己的休息时间,上网帮我查阅关于电子病历的相关资料,给予我功能需求上的指导等,他这种无私奉献的敬业精神令人钦佩。在这次毕业设计中,运用到了很多课外的技术,例如JSP、Servlet和JDBC技术等,对于一个刚要走出社会的我来说,经验尚且不足,在此过程中,多亏了同学们和导师的指导,从而让我学会了这些课外的知识,所以,在此我向孙海老师致以我诚挚的谢意。同时也向那些知道我的导师和同学表示衷心的感谢。 同时,对于我们刚学完大学的知识,学习的东西很杂,也很乱,需要进行综合的整理才能实际运用,而且也有很多课外知识需要自己去学习和研究,但这些问题都不会太大,因为在大学期间,所有的任课老师对我们都高度负责,他们不但教会了我们专业的基础知识,而且也教会了我们各种学习的方法,所以在这里我也衷心的感谢我所有的任课老师。 参考文献 [1] 徐建波,周新莲著. Web设计原理与编程技术[M]. 湖南:中南大学出版社,2005,20-39. [2] 罗维,张华.MVC程序设计[M].中国水利水电出版社,2013.5,128-197. [3] 吴晓慧,吴鹏. 医院门诊收费系统的设计与实现 [J]. 电脑知识与技术, 2006.29,24-27. [4] [美]Thomas Kyte著. Oracle Database 9i/10g/11g编程艺术:深入数据库体系结构[M].人民邮电出版社,2011.1,215-279. [5] 飞思科技产品开发中心著. JSP数据库开发实例精粹[M]. 北京:电子工业出版社,2005,27-50. [6] 飞思科技产品开发中心著. JSP应用开发详解[M]. 北京:电子工业出版社,2002,236-258. [7] 耿祥义, 张跃平. JSP基础教程[M]. 北京:清华大学出版社. 2009,58-59. [8] 郑人杰等. 实用软件工程[M]. 清华大学出版社, 1997.2,56-89. [9] 陈君英,章雅杰. 护理电子病历系统的设计与应用[J]. 中华医院管理杂志, 2007.6,419-421. [10] 萨师煊,王珊. 数据库基础概论[M]. 高等教育出版社,2006.5,41-128. [11] Abraham Silberschatz. DATABASE SYSTEM CONCEPTS(Fourth Edition)[M].高等教育出版社,2002.4. [12] Kenneth C.Laudon. MANAGEMENT INFORMATION SYSTEMS(Sixth Edition)[M]. 高等教育出版社,2001.3. [13] Kevin Duffey,Vikram Goyal. Professional JSP Site Design[M]. Publishing House of Electronics Industry,2002.2. [14] Hans Bergsten. JavaServer Pages_2nd Edition[M]. O'Reilly, 2002.7. [15] Soren Lauesen. Software Requirements Styles and Techniques[M]. Publishing House of Electronics Industry,2002.8. 附 录 1. 系统包结构图 系统包结构分为工具包com.qwh.bysj.emr.util,实体类包com.qwh.bysj.emr.entity,配置文件包com.qwh.bysj.emr.conf,以及DAO层、Service层和Servlet层,具体实现见附图-1所示。 2. 关键代码 (1) 添加病历 package com.qwh.bysj.emr.servlet.doctor; import java.io.IOException; import java.text.SimpleDateFormat; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.qwh.bysj.emr.entity.Doctor; import com.qwh.bysj.emr.entity.Med; import com.qwh.bysj.emr.service.EMRservice; import com.qwh.bysj.emr.service.impl.EMRserviceImpl; public class AddMedActionServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); String pid = req.getParameter("pid"); String mhistory = req.getParameter("mhistory"); String ttime = req.getParameter("ttime"); String symptom = req.getParameter("selCity"); String preason = req.getParameter("preason"); String chufang = req.getParameter("chufang"); String yizhu = req.getParameter("yizhu"); try { EMRservice mms=new EMRserviceImpl(); Med med=new Med(); med.setPatient(mms.selectPatientByPid(Integer.parseInt(pid))); med.setMhistory(mhistory); med.setSymptom(symptom); med.setPreason(preason); HttpSession session = req.getSession(true); Object obj = session.getAttribute("myloginDoctor"); Doctor doctor=(Doctor) obj; med.setDoctor(doctor); med.setChufang(chufang); med.setYizhu(yizhu); med.setTtime(new SimpleDateFormat("yyyy-MM-dd").parse(ttime)); System.out.println(med.getDoctor()); System.out.println(med.getPatient()); mms.insertMed(med); mms.insertPatient1(mms.selectPatientByPid(Integer.parseInt(pid))); mms.deletePatient(Integer.parseInt(pid)); res.sendRedirect("/EMRManager/doctor/ShowPatientByCnameActionServlet"); } catch (Exception e) { req.setAttribute("addmederror", "添加失败"); req.getRequestDispatcher("/doctor/AddMedQueryActionServlet?pid="+pid+"").forward(req, res); } } } (2) 修改病历 package com.qwh.bysj.emr.servlet.doctor; import java.io.IOException; import java.text.SimpleDateFormat; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.qwh.bysj.emr.entity.Med; import com.qwh.bysj.emr.service.EMRservice; import com.qwh.bysj.emr.service.impl.EMRserviceImpl; public class UpdateMedActionServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); String medid = req.getParameter("medid"); String mhistory = req.getParameter("mhistory"); String symptom = req.getParameter("selCity"); String preason = req.getParameter("preason"); String chufang = req.getParameter("chufang"); String yizhu = req.getParameter("yizhu"); try { EMRservice mms=new EMRserviceImpl(); Med med = mms.selectMedById(Integer.parseInt(medid)); if(mhistory!=null){ med.setMhistory(mhistory); } if(symptom!=null){ med.setSymptom(symptom); } if(preason!=null){ med.setPreason(preason); } if(chufang!=null){ med.setChufang(chufang); } if(yizhu!=null){ med.setYizhu(yizhu); } mms.updateMed(med); res.sendRedirect("/EMRManager/doctor/ShowMedByCnameActionServlet"); } catch (Exception e) { e.printStackTrace(); req.setAttribute("updatemederror", "修改失败"); req.getRequestDispatcher("/doctor/UpdateMedQueryActionServlet?medid="+medid+"").forward(req, res); } } } (3) 查询病历 package com.qwh.bysj.emr.servlet.doctor; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.qwh.bysj.emr.entity.Med; import com.qwh.bysj.emr.service.EMRservice; import com.qwh.bysj.emr.service.impl.EMRserviceImpl; public class SelectMedMoreActionServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); String pname = req.getParameter("pname1"); String idno = req.getParameter("idno1"); String pemrno = req.getParameter("pemrno1"); System.out.println(pname); System.out.println(idno); System.out.println(pemrno); String page = req.getParameter("page"); if(page!=null&&pname==null){ HttpSession session = req.getSession(); Object obj = session.getAttribute("pppname"); pname=(String) obj; } Integer pageNo=null; if(page==null){ pageNo=1; } else pageNo=Integer.valueOf(page); try { EMRservice mms= new EMRserviceImpl(); if((pname!=null||pname!="")&&(idno==""||idno==null)&&(pemrno==""||pemrno==null)){ List list = mms.selectMed1ByPname(pname, pageNo, 5); req.setAttribute("myListMed", list); Integer max = mms.SelectMed1CountByPname(pname); req.setAttribute("pppname", pname); System.out.println("..............................."); req.getRequestDispatcher("/doctor/selectMedMore.jsp?max="+max+"&page="+pageNo+"").forward(req, res); } if((idno!=null||idno!="")&&(pname==""||pname==null)&&(pemrno==""||pemrno==null)){ List list = mms.selectMed1ByIdno(idno, pageNo, 5); req.setAttribute("myListMed", list); Integer max = mms.SelectMed1CountByIdno(idno); req.getRequestDispatcher("/doctor/selectMedMore.jsp?max="+max+"&page="+pageNo+"&idno="+idno+"").forward(req, res); } if((pemrno!=null||pemrno!="")&&(pname==""||pname==null)&&(idno==""||idno==null)){ List list = mms.selectMed1Bypemrno(pemrno, pageNo, 5); req.setAttribute("myListMed", list); Integer max = mms.SelectMed1CountBypemrno(pemrno); req.getRequestDispatcher("/doctor/selectMedMore.jsp?max="+max+"&page="+pageNo+"&pemrno="+pemrno+"").forward(req, res); } if((pname!=null||pname!="")&&(idno!=""||idno!=null)&&(pemrno==""||pemrno==null)){ List list = mms.SelectMed1ByPnameidno(pname, idno, pageNo, 5); req.setAttribute("myListMed", list); Integer max = mms.SelectMed1CountByPnameidno(pname, idno); req.getRequestDispatcher("/doctor/selectMedMore.jsp?max="+max+"&page="+pageNo+"&idno="+idno+"").forward(req, res); } if((pname!=null||pname!="")&&(idno==""||idno==null)&&(pemrno!=""||pemrno!=null)){ List list = mms.SelectMed1ByPnamepermno(pname, pemrno, pageNo, 5); req.setAttribute("myListMed", list); Integer max = mms.SelectMed1CountByPnamepermno(pname, pemrno); req.getRequestDispatcher("/doctor/selectMedMore.jsp?max="+max+"&page="+pageNo+"&pemrno="+pemrno+"").forward(req, res); } if((pname==null||pname=="")&&(idno!=""||idno!=null)&&(pemrno!=""||pemrno!=null)){ List list = mms.SelectMed1Byidnopermno(idno, pemrno, pageNo, 5); req.setAttribute("myListMed", list); Integer max = mms.SelectMed1CountByidnopermno(idno, pemrno); req.getRequestDispatcher("/doctor/selectMedMore.jsp?max="+max+"&page="+pageNo+"&pemrno="+pemrno+"&idno="+idno+"").forward(req, res); } else{ List list = mms.SelectMed1Bypnameidnopermno(pname, idno, pemrno, pageNo, 5); req.setAttribute("myListMed", list); Integer max = mms.SelectMed1CountBypnameidnopermno(pname, idno, pemrno); req.getRequestDispatcher("/doctor/selectMedMore.jsp?max="+max+"&page="+pageNo+"&pemrno="+pemrno+"&idno="+idno+"").forward(req, res); } } catch (Exception e) { e.printStackTrace(); } } } (4) 删除病历 package com.qwh.bysj.emr.servlet.doctor; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.qwh.bysj.emr.entity.Med; import com.qwh.bysj.emr.service.EMRservice; import com.qwh.bysj.emr.service.impl.EMRserviceImpl; public class DeleteMed1ActionServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); String[] str = req.getParameterValues("medids"); try { EMRservice mms=new EMRserviceImpl(); for (int i = 0; i < str.length; i++) { Med med = mms.selectMed1ById(Integer.parseInt(str[i])); mms.deletePatient1(med.getPatient().getPid()); mms.deleteMed1(med.getMedid()); } res.sendRedirect("/EMRManager/doctor/SelectMedPassActionServlet"); } catch (Exception e) { e.printStackTrace(); } } } (5) 病历归档 package com.qwh.bysj.emr.servlet.doctor; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.qwh.bysj.emr.entity.Med; import com.qwh.bysj.emr.service.EMRservice; import com.qwh.bysj.emr.service.impl.EMRserviceImpl; public class GuidangMedActionServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { req.setCharacterEncoding("gbk"); String[] str = req.getParameterValues("medids"); try { EMRservice mms=new EMRserviceImpl(); for (int i = 0; i < str.length; i++) { Med med = mms.selectMedById(Integer.parseInt(str[i])); mms.insertMed1(med); mms.deleteMed(med.getMedid()); } res.sendRedirect("/EMRManager/doctor/ShowMedByCnameActionServlet"); } catch (Exception e) { e.printStackTrace(); } } } (6) 病历输出的模板jsp <%@page import="com.qwh.bysj.emr.entity.Med"%> <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ page contentType="application/msword; charset=utf-8" %> <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <%@page import="java.text.SimpleDateFormat"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% Object obj=request.getAttribute("myMed"); Med med=(Med)obj; String name1=med.getPatient().getPname()+"病人的电子病历.doc"; String name=new String(name1.getBytes("gb2312"),"ISO-8859-1"); %> <%response.setHeader("Content-Disposition", "attachment;filename="+name); %>

门(急)诊病历


病人姓名:${myMed.patient.pname }   科别:${myMed.doctor.category.cname }    病症:${myMed.symptom }   

   姓    名:${myMed.patient.pname }                  家庭住址:${myMed.patient.address }

   性    别:                      联系电话:${myMed.patient.pmobile }

   年    龄:${myMed.patient.page }                      科    别:${myMed.doctor.category.cname }

   婚    姻:已婚未婚                    诊断医生:${myMed.doctor.doname }

   民    族:${myMed.patient.nation }                    诊断时间:

   籍    贯:${myMed.patient.pcountory }                    过敏史:${myMed.mhistory }

病情描述:${myMed.preason }
诊断处方:${myMed.chufang }
医嘱:${myMed.yizhu }
操作命令 图3-2 管理员操作用例图 病历 病历信息 病人 管理员 维护 电子病历管理系统 图4-3 系统功能E-R图 n n 1 1 1 1 1 1 1 1 n 1 1 修改 个人密码 修改 个人密码 病历 病人 数据结果 数据访问方法 业务对象 业务方法 数据访问层 实现对数据库中数据的添加、删除、修改和查询 业务层 实现用户需要的各种业务功能 表示层 JSP实现界面输入输出,Servlet实现页面跳转。 图3-5 业务调用时的类图 图3-4 实体类之间的类图 图3-3 前台医生操作用例图 图3-3 门诊医生操作用例图 管理 医务人员 管理 管理 管理 医院密码 医务人员 管理 科室 管理员 图4-2 系统功能模块图 图4-1 三层结构工作原理图 医生管理 病历管理 病人管理 管理员 医务人员 密码管理 门诊医生 前台医生 病人管理 病历管理 密码管理 电子病历 管理系统 科室管理 密码管理 n Users 图4-4 管理员用户属性图 Username Password 图5-2 登录过程流图 附图-1 系统包结构图 图4-27 添加病历界面 图4-28 管理本科室病历界面 图4-26 显示就诊病人界面 图4-25 管理过期病历界面 图4-24 条件查询病历界面 图4-23 生成word模板病历图 图4-21 管理登记病人界面 图4-20 病人信息登记界面 图4-19 修改管理员密码界面 图4-18 修改医院密码验证固定位数界面 图4-17 修改医院密码验证界面 图4-17 修改医院密码验证一致性界面 图4-22 查看所有病历界面图 图4-16 显示所有科室界面 图4-15 新建科室界面 图4-14 医生注册界面 图4-13 显示医生详细信息界面 图4-12 显示全部医生界面 图4-11 医务人员登录界面 图4-10 管理员登录界面 图4-9 医生属性图 name age sex idno mobile email edu ismarried country category username password id Doctor 图4-8 病历属性图 yizhu chufang treattime doctor reason symptom history Med id patient 图4-7 科室属性图 phone createtimee id name Category 图4-6 医院密码属性图 pass passid Users 图4-5 病人属性图 category address idno ismarried mobile country nation emrno sex name age id Patient 图5-1 登录模块程序流程图 否 是 开始 登录成功 用户名密码是否正确 登录 结束 数 据 库 服务器 客户端 医务人员 管理员 医务人员 图3-1 顶级数据流图 病 人 信息 病历信息 文档病历 PAGE 1
本文档为【电子病历管理系统的设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥11.9 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
不系舟红枫
从教近30年,经验丰富,教学水平较高
格式:doc
大小:1MB
软件:Word
页数:64
分类:建筑/施工
上传时间:2019-01-22
浏览量:33