基于Android的医院预约挂号系统

更新时间:2024-03-28 20:55:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于Android的医院预约挂号系统

摘 要

医疗事业对于人们生活显得尤为重要,研究医疗信息服务中如何使用手机移动终端具有深刻的现实意义和广泛的应用价值。本文在基于 PC 的基础上进一步设计了基于Android 的医疗挂号信息系统。在实际设计中考虑到医患双方的功能需求存在很大差异,将系统划分为医生端系统和患者端子系统两部分。同时考虑到系统所需部分功能复杂不适于在移动终端运行,在系统设计时增加了 PC 机 Web 端子系统的设计。Android 客户端采用 C/S 结构模式,Web 管理端采用 B/S 结构模式。

本文 Android 客户端采用了 MVC 分层的设计模式、UI 界面设置技术和 JSON 进行通信,并封装了一个网络会话模型。系统功能主要包括病症查询、医院查询、挂号、专家查询、查看医生处方。通过二维码模块功能实现了可移动的信息录入与查询功能,简化了信息录入与查询环节的操作。使用 Apache 的 HttpClient 组件进行网络数据的获取,该组件模拟实现了 HTTP 通信协议,采用了轻量级数据格式 JSON 作为数据封装,在数据传输上降低资源开销、获得了较高的传输效率。提出了医疗云存储的方案,通过云存储文件功能,利用二维码对电子病历进行管理和再现, 提高了数据安全性和存储利用率。服务器端数据传输采用 JSON 格式,与 Android 移动终端共用同一后台处理程序,采用Struts2,Hibernate,Spring 技术,布局上通过 HTML,CSS 和 JavaScript 技术实现页面的设计。

实验及运行结果表明,本文所开发的基于 Android 的医疗挂号系统,在以 Android为平台的智能移动终端中运行稳定,在测试中达到了预期的效果,实现了可移动的信息录入与查询功能,解决了医疗双方的需求,给医患双方带来便利。

关键词: Android;医疗挂号系统;JSON;二维码;云存储;电子病历暨南大学硕士论文 基于 Android

平台医院医疗挂号系统

Based on the Android hospital appointment register system

design and implementation

Abstract

As medical service is important to our social life, mobile terminal are of profound practical significance meaning and high applicational value in medical service. The system of Android-based medical service is designed, on the basis of Web PC-based terminal . For thesake to solve the medical problem, the medical information system of Android-based is designed, the system is composed of Android client terminal system and Web PC-based terminal . Android client will employ C/S structure mode while B/S structure mode will be adopted to fit Web management.

The Android system employs MVC model coupled with the UI layout technology. The client and the server communicate by JSON.Then,we design the system functions.In order to reduce the information inputting and inquiry aspects of the operation, the two-dimensional code recognition technology is used in treatment services to quickly read the patient's entire medical record information. The network data access is through the Apache HttpClient component,which completes the HTTP communication protocol;data encapsulation uses JSON data format of lightweight. Then,we propose medical cloud storage solutions and use s two-dimensional code to manage and preserve electronic medical record,which realizing the data security and the high storage utilization.The page of the client is designed through technologies such as HTML, CSS and JavaScript in a Web terminal system, where data acquisition is still using the JSON format sharing the same spooler with Android client to achieve system optimization design.Struts2,Hibernate and Spring technology are also used in Web terminal.

Experiments and operating results show that the medical information system developed in this paper works stably and well in smart mobile devices based on Android platform. The test achieves the desired results realizing the information inputting and inquiry functions movably, which takes greatly convenience to both doctors and patients.

Keywords:Android;Medical Information System;Cloud Storage;JSON;two-dimensional

code; Electronic Medical Record

目 录

摘 要......................................................................I Abstract...................................................................II 第一章 绪 论...............................................................1 1.1 论文研究背景与意义.......................................................... 错误!未定义书签。 1.2 国内外发展现状................................. 错误!未定义书签。 1.3 本文所做工作................................... 错误!未定义书签。 1.4 本文结构安排.......................................... 错误!未定义书签。 第二章 可行性研究.........................................................20 2.1 技术可行性 ............................................................20 2.2 经济可行性 .............................................................. 2.3 操作可行性 .............................................................. 第三章 系统的相关技术及工具介绍.................... 错误!未定义书签。 3.1 浏览器/服务器结构 .............................. 错误!未定义书签。 3.2 Android的平台特性 .............................. 错误!未定义书签。 3.3 Android平台的架构 .............................. 错误!未定义书签。 3.4 客户端和服务端之间的通信原理 ................... 错误!未定义书签。 3.5 Android的构成和工作机制 ........................ 错误!未定义书签。 3.6 MVC模式 ........................................ 错误!未定义书签。 第四章 系统性能需求和框架设计...................... 错误!未定义书签。 4.1 性能需求分析 ................................... 错误!未定义书签。 4.2 系统总体架构 ................................... 错误!未定义书签。 4.3 系统功能总体设计 ............................... 错误!未定义书签。 4.4 数据库系统架构与技术选型 ....................... 错误!未定义书签。 4.5 网络架构设计 ................................... 错误!未定义书签。 4.6 医院云存储的解决方案 ........................... 错误!未定义书签。 4.7 数据库私密性 ................................... 错误!未定义书签。 4.8 系统数据库设计 ................................. 错误!未定义书签。 4.9 本章小结 ....................................... 错误!未定义书签。

第五章 医疗信息服务系统的设计与实现................ 错误!未定义书签。 5.1 系统开发环境搭建 ............................... 错误!未定义书签。 5.2 Android客户端功能实现 ......................... 错误!未定义书签。

5.3 服务端功能模块设计 ............................. 错误!未定义书签。 5.4 服务端逻辑实现 ................................. 错误!未定义书签。 5.5 通信与数据交换 ................................. 错误!未定义书签。 5.6 HDFS文件系统 .................................. 错误!未定义书签。 5.7 本章小结 ....................................... 错误!未定义书签。

第六章 系统主要模块实现与测试 .............................................XX 6.1 系统客户端功能的实现与测试 .............................................XX 6.2 测试分析 ...............................................................XX 6.3 本章小结 ....................................... 错误!未定义书签。

第七章 总结与展望................................. 错误!未定义书签。 7.1 总结 ........................................... 错误!未定义书签。 7.2 展望 ........................................... 错误!未定义书签。

参考文献...................................................................XX 附录............................................... 错误!未定义书签。 致谢.......................................................................XX

暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 3

1 绪论

1.1 研究背景

医疗问题一直是我国急需解决的问题之一,目前在医院就医时,病人需耗费大量时 间精力排队问诊,但医生实际的诊断时间相对较短,因而这种传统就医方式会造成病人 极大不便,而且对于初次就诊的病人来说,由于不熟悉医院的具体情况,更易陷入“病 急乱投医”的尴尬境地。伴随着科技的发展,有人提出采用现代化医疗管理软件辅助医 疗管理,这种模式能够有效的改善就医条件,从而开始受到越来越多的关注。 随着数字化时代的来临,中国的医疗建设也进入了一个改革发展的新阶段。医院在 提升医疗器械水平和医生的医疗技术的基础上,也开始关注病人的就诊条件,陆续地设 立了一些自动挂号的终端机和介绍医院医生信息的网站。但仅靠设立挂号终端机和信息 网站,并不能完全解决病人就医难的状况。在此背景下,本课题研究了一个基于移动终 端的医疗挂号系统,该系统针对就医难的问题,给出了全面的解决方案。通过对系统功 能进行设计,其主要包括病症查询、医院查询、挂号、专家查询、查看医生处方等功能, 患者可以通过子系统,以手机端信息浏览取代人工咨询模式,根据需求自行查询相关信 息。另外该系统还可通过二维码模块功能实现可移动的信息录入与查询功能,从而简化 患者病历信息的管理,以及信息录入与查询环节的操作。

随着中国联通 2009 年推出了 3G 移动网络通信后,中国的移动互联网建设进入了一 个高速发展的历史时期。截止到目前为止,中国移动,中国联通以及中国电信的 3G 网 络已覆盖了全国各主要一、二线城市,并正在向周边地区扩散。无线网络通信技术的发 展使移动设备如智能手机逐渐走进人们的生活。目前 Android 系统是作为智能手机其中

的一个操作系统,其市场占有率越来越大。因而本课题设计的医疗挂号系统选择在 Android 平台上进行开发,并在移动互联网的支撑下进行运行。

通过开发这套 Android 医疗挂号系统,将有效减少了病人候诊时间、提升医院工作 效率。本方案的提出将会有利于医疗事业的发展和完善,对未来医疗技术的完善起到一 个引领的作用。能提高医疗水平和效率、降低医疗开支,实现医疗资源共享,扩大医疗 范围,能够为更广大人民群众日益提供一项全新的医疗服务,提升人民的健康水平。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 4

1.2 研究现状

目前社会上医院的预约渠道如下: 表 1-1 挂号方式的比较

挂号方式 操作 费用和便利性

电话医疗登记册 通过各个医院的医疗登记册 和电子医疗本反馈意见,通过 致电热线登记医疗计划,由客 服完成预约

需要支付电话费,需要等待 通话接入时间

互联网预约 受年轻患者喜爱,是中年患者 也可以接受的方式,通过简单 的电脑网页浏览操作完成 免话费,相对快捷

移动互联网预订 通过下载手机软件,手机端即 可登陆

随时随地方便快捷

短信挂号预约 通过短信渠道将特定指令发 送到 SMS 预订中心并迅速 完成预订。

需要查询到短信的发送方 式,也比较快捷,但信息往 返回馈慢,反馈次数多

自助预约机预约 通过机器的录入和出票挂号 约下次就诊时间。

需要人工协助,要人手管理

目前的医疗信息管理系统仅是针对于医护人员开发的,忽视了患者对于便利性的需

求以及对医疗点和医生查询的重要性。过去的软件基于 PC 上,并没有充分体察病人的 需求。而医疗软件主要包括医疗百科全书系列产品、医疗咨询系列产品;其中,医疗百 科全书系列产品主要是提供一个医疗的数据库,里面记录一些病症对应的诊疗方法等, 一般为静态的数据,不能根据动态的数据进行更新,除非开发者进行更新,使用者主动 更新。

医疗咨询系列产品,提供一些专家的在线咨询方式,给用户提供具有互动性的咨询 方式,但是仍然存在很多问题,例如单纯的咨询不能够激发患者和医生的主动性,往往 使得咨询的结果偏差较大。 1.3 课题创新点

1、采用二维码模块功能实现了可移动的信息录入与查询功能,简化了患者病历信息 的管理以及信息录入与查询环节的操作,实现了医院快速读取患者病历信息的功能。 2、提出医疗云存储的方案,通过云存储文件功能,利用开源分布式框架 Hadoop 中

的分布式文件系统 HDFS,提出利用二维码对电子病历进行管理和再现的机制,使得数暨南大学硕士论文 基于 Android 平台医院医疗挂号系统

5

据存储利用率和负载均衡性问题得到了改善。

3、在客户端与服务器端的使用 JSON 封装数据,在数据传输上降低了资源开销、获 取高效率的传输效率。在系统设计中融合了服务器和客户端等多项技术。 1.4 本课题研究意义

本课题研发的医疗服务系统从技术方面有效地解决了我国数字医疗建设在移动互联 网和智能手机系统平台中数据交互问题以及数据容量升级问题,当今国内将移动互联网 和智能手机联合起来应用到医疗的实例并不多,本系统的开发为后人创建更好医疗服务 系统积累了一定的经验,同时可以根据本系统今后的运行数据分析出我国的医疗现状和 病人的医疗需求。

从现实角度分析,由本课题研发的医疗服务系统切实有效地解决了病人在看病时遇 到的各种问题。通过本系统病人可以根据自己的病情预约到相关领域的专家,可以获得 及时有效地治疗;通过本系统,病人只需在挂号时,医生给出的时间段内来医院就诊即 可,这样就避免了长时间的枯燥等待;同时医生根据本系统可以对病人的病情做一个初 步的了解,对错误就诊的病人,做到及时发现并引导其向其他相关医生就诊,有效提高 医患双方的工作效率。

各医院的加盟能有利于维系本系统作为统一的管理平台,便于对患者需求作进一步

的挖掘。结合云服务 Sass 的分布式文件平台搭建,为日后平台数据扩展做准备,通过对 本系统中的数据进行分析,即可以针对用户需要作出推荐,为用户带来了便利。 1.5 本论文主要工作

Android 操作系统是目前开源性和封装性良好的操作系统。本文利用 Android 的应用 技术,以实现基于 Android 平台的医疗挂号的软件的设计为目标,进行如下探究: 1.提出本课题的研究意义和所研发产品的使用价值。

2.分析医疗挂号软件需求,分别 Android 客户端和 Web 客户端和云服务器入手,利 用集成的开发工具插件进行系统的搭建环境;

3.做方案技术选型,了解用户之前平台的使用情况,基于分析医疗信息服务系统需 求来进行方案选型;

4.进行详细设计、连接数据库,通过 MySQL 和 apache tomcat 搭建和连接调试服务暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 6

器,通过 SQLyog community 建立可视化数据库连接工具,搭建数据库关系模型和进行 数据表的建立,对数据库安全性作出评估和管理方案的建议;

5.研究 HttpClient 协议接口,分析客户端和服务器端使用的网络协议,并实现客户端 和服务器端的通信交流。

6.建立测试环境和手机模拟器,通过服务器和客户端模拟器的双向调试完成本次测 试和错误排查;

7.使用本地服务器构建一个 SaaS 云,通过对加盟的医院授予不同级别的权限,利用 二维码对电子病历进行管理。 1.6 本论文结构安排

第一章绪论部分进行医疗信息服务系统的现状研究,介绍了如今 Android 的技术发 展,阐述国内外医疗信息服务系统的发展趋势及现有系统的设计特点,提出本系统设计 研究意图。概括阐述本文的主要工作和架构。

第二章主要阐述了 Android 平台的软件布局,研究系统开发用到的相关技术以及

Android 组建的运行机制,最后简单介绍开发中用到的 SPRING 框架和 HDFS 分布式文 件系统。

第三章对系统性能需求和框架进行整体设计,对技术进行选型。介绍所需要用到的 开发工具,进行软件的需求和总体架构。细化开发流程,完成客户端与服务器端系统功 能模块说明,并作出关键模块需求用例分析。

第四章介绍了服务器通信之间客户端通信机制,以及对系统功能进行实现。对本系

统的各个模块进行分析,并作出关键流程图。通过 JSON 对数据进行封装,在数据传输 中实现高效率的目的。

第五章作为软件测试部分,在测试用例和分析的基础上,输入几个合理的用例进行 结果分析,并对不合理的程序予以修正,完善系统的可靠性。对数据安全性作出可靠性 分析,并对数据库的管理安全作出几点建议。通过文件存储功能,利用二维码对电子病 历进行管理和再现做测试。

第六章对总结本论文的工作内容,并对以后的研究发展作出前瞻性分析。

附录附带了之前章节说明性的程序和连接服务器的请求程序。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 7

1.7 本章小结

通过对研究现状分析和对研究背景做出了总体的概述,提出了课题的工作要点。对 Android 客户端作和服务器端作出分析,并提到了提高系统存储容量和数据传输效率的 技术以及使用到的工具。通过系统规划,提出了一个符合现今发展需要的医疗信息系统 方案。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 8

2 系统的相关技术研究 2.1 Android 的平台特性

Android 是基于 C 语言和 JAVA 语言开发,同时具有可操作和移植性强的特点,是 一款兼容性良好的操作系统。JAVA[1-3]语言的特性是接口复用性好,而且代码易读,方 便程序间的调用。Android 的主要竞争力在于其广大的用户市场,使得其在开发过程中 能够接受及时的反馈。

Android 的[4-6]性能特点可以用几个特点来形容,开源、具有免费的开发服务环境、 界面丰富、系统可裁剪、应用程序框架支持应用组件的重用集成和继承、具有自主研发 的虚拟机且占用的内存和资源比较少、稳定性能优越、自带有 3D 和自定义 2D 图形库、 数据存储方式灵活的 SQLite、支持蓝牙等无线通信、3G 接入和公共网络 WIFI 接入、支 持罗盘技术、照相机和地理信息系统定位等、拥有强大的模拟器和调试工具、附加上[7] 内存检测后可以达到稳步进行应用程序开发。

Android 平台具有良好的平台开放性,能够为用户提供广泛的应用和服务与 Google 应用实现无缝结合。 2.2 Android 平台的架构 Android 的操作系统

Android 操作系统体系分为 4 层结构,从顶部到底部分别是应用层、应用程序框架 层、[9]核心类库和 Linux 内核(Linux 内核),其中在第三层还包括 Android 的运行环 境。如下图 2-1 所示,

Android 系统脱胎于 Linux,借助 Java 的 jvm 思想,形成了自己特色的操作系统, 现在描述其框架。Android 的操作系统可以分为四层框架模型,从顶层的自定义应用程 序层通过外部接口可以连接到应用框架层、继而是运行支撑层支撑着整个框架,起着承 上启下的作用,接下来便是内核层,它的存在使得二次开发无需再进行大的改动,关键 时候可以进行内核裁剪。框架图如下图 2-1 所示,

1、应用程序层里可以使用的包括了电话、浏览器、记事本等功能。

2、应用框架层内具有通知管理器、内容提供器和活动管理器。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 9

3、运行支撑层包含了一些库,其中有接口管理和媒体框架、SQLite 以及图形界面 的 OpenGLJES、WebKit 浏览器接口以及 libc 库等;

4、底层的内核层由 LINUX C 编写,具有各种驱动,包括蓝牙驱动、相机驱动库、 声音驱动、节电管理、USB 接口驱动、无线上网驱动和图形驱动等。 图 2-1 Android 系统的体系架构[3]

内核层具有 LINUX [8-10]内核,它的文件管理系统能实现文件的打开、复制、移动、 删除等操作,具有空间分配、内存管理、设置管理权限;网络通信模块能够针对 7 层模 型进行 ISO 前四层的接口分配并进行数据包传输等,通过提供面向无连接和面向连接的 单双工工作方式,对包进行投递;其中设备管理和节电管理,进行着 GPS 感应设备、触 摸屏、重力感应、温度感应、电池等管理设备的管理,对处理器和内存进行动态管理, 对线程进行时空调度,实现程序被 CPU 执行的最优方案。

对于运行支撑层,内核提供了一些支撑上层的库,并在软件运行过程中进行[11]底层 调用:提供了 SGL(2D 图形引擎)、FreeType(字体库)、Libc 标准 C 库和作为 Android 浏览器内核的 LibWebCore 和 3D 图形界面开发库 openGL。

Android 的库是用 C 和 C++编写的,通过 Android 的应用程序框架提供构建 Android

系统的库给开发人员调用,实现其功能。Davlik 通过 JNI 方式能够调用内核层和运行支暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 10

撑层的程序。其实质是一个 Android 虚拟机。通过库的调用可以实现附加功能,可以调 用的库有系统 C 库、SGL、3D 图形库等。 2.3 客户端和服务器之间的通信原理

套接字是通信的基石,是作为 TCP/IP 协议的网络通信的基本单位。它是网络通信

过程中端点的抽象表示,包含进行网络通信必须的五种信息: [11,12]协议、协议端口中的 本地进程、远程主机的 IP 地址、本地主机的 IP 地址面向进程的协议端口的链接、协议 端口中的本地进程。

应用层通过传输层进行数据通信时,TCP 会遇到同时为多个应用程序进程提供并发

服务的问题。多个 TCP 连接或多个应用程序进程有可能需要借助同一个 TCP 协议端口 传输数据。为了对不同的应用程序进程和连接进行区分,多数的计算机操作系统与

TCP/IP 协议[12]进行交互时应用程序是使用套接字连接。建立套接字连接至少要有一对 套接字,其中一个运行在客户端上,称为 ClientSocket,而另一个则运行在服务器端, 称为 ServerSocket。

服务器套接字连接过程: 服务器监控建立,

客户端请求和连接确认。 监视服务器:服务器端套接字

与客户端套接字在一个连接,实施实 时监测网络状态、等待状态等待客户 端的连接请求。

客户端请求:客户端请 求连接的套接字,其目 标是在服务器端的连接 套接字。

图 2-2 套接字连接过程

客户端与服务器连接过程如下:暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 11 :客户端请求连 接的套接字,其目标 是在服务器端的连接 套接字。

客户端套接字描述其本身要连

接到的服务器套接字,指出其端口和 地址的服务器端套接字,然后提交到 服务器端进行套接字连接请求; 对连接进行确认:客户 端与服务器端套接字在

聆听讯息时双方将正式 建立连接

图 2-3 客户端与服务器连接过程

在创建套接字连接时,可以对传输层协议进行指定,Socket 可以支持不同的传输层 协议(TCP 或 UDP),当使用 TCP 协议进行连接时,该 Socket 连接就是一个 TCP 连接。 由于套接字连接通常是一个 TCP 连接,以便建立一次连接的套接字时,各自准备直到这 两个当事方断开连接并将数据发送到对方为止。不过在实际网络应用中,完成从客户端 到服务器的通信过程往往需要穿过多个中间节点,如路由器、防火墙、网等等。 2.4Android 的构成和工作机制

Android 程序相互之间根据功能的不同,各自完成相应的任务,可以通过了解 Android 的接口对其进行开发,组件包括了[13]Activity、Service、Broadcast Receiver 与 Content Provider;

通过 Intent 在不同组建之间进行导航。而可视化的操作界面可通过调用 View 类进行 显示,如菜单下拉框、对话框等可以实现可视化操作选项。 2.4.1 Activity

Android 应用程序中通过多个 Activity 进行相互跳转,而 Activity 是 Android 的最基

本模块,每个 Activity 都有自己的生命周期,根据程序运行需要进行产生、运行或销毁,暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 12

通过 Android 系统对其生命周期进行维护,以及通过状态保存,恢复和数据传输(intent ) 的控制,这些就是每个活动(Activity)需要关注的事情。 表 2-1 Activity 有三种基本状态 Active 状态

处于屏幕前景,也就是当前task 的栈顶Activity 正处 于Active 状态,同 一时刻只能有一个Activity 处于 Active 状态 ;

Paused 状态 处于背景画面状态,将失去了焦点,但依然是活动 状态 ;

Stopped 状态 不可见,但始终保持所有的状态和内存信息 。 图 2-4 Activity 的生命周期 2.4.2 Service

Service 是和 Activity 基本差不多的 Android 组件,通过后台进行,还可以与别的进

程进行交互。Android 的 Service 没有界面,但他可以不终止地一直运行,当内存不足时, 可以杀死旧的进程来获得内存。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 13

图 2-5 Service 的生命周期 2.4.3 Broadcast Receiver

使用 Broadcast Receiver[10]接受和处理广播通知,部分的相应程序进行广播时会采用 Broadcast receiver 进行多播。当电量低时,都会产生广播通知 receiver。当用户数据下载 完成后会通知其他应用程序。所有的 receiver 都继承于[13]BroadcastReceive 这个父类。而 且可以通过他启动和提醒用户 NotificationManager 发送过来的 Notififications。应用程序 发送了多个消息,并相应会有关键消息。当多个重要且要求响应的消息发送过来,通过 Intent 查看可以启动多个 Broadcast Receiver 对 Intent 进行监听。 2.4.4 Content Provider

作为第三方数据服务方案提供器,他具有标准的数据访问接口。通过它可以起到在

应用程序共享数据的作用。Content Provider[14]支持 SQLite,并且可以对资料文件进行封 装压缩。 2.4.5 View

在 Android 用户界面中,分为三层,分别是 Activity,Window 和 Window Views,其

中 VIEW 用作为视图界面。

2.4.6 Android 的 Intent 暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 14

而 Intent 负责调配之前四种组件间的相互协同工作。Intent [15]主要是作为一个传递 中介的作用,专门为组件互相调用提供信息,实现调用者与被调用者之间的耦合关系。 通过 Intent 的实现,在传递中需要找到目标消费者,他们往往是另一个 Activity 的显式 匹配或是需要匹配几个值(Action、Category、Data/Type、Component)的隐式匹配;Intent 的组成包括组名、动作分类描述 Category、数据类型描述 Type、目标组件描述 Component 等,如下表:

表 2-2 Intent 的组成

Action 通常和特定的 Uri 组合使用

Category 它是对目标组件类型类别信息的描述 Type 数据类型描述

Component 目标组建描述 Data 该动作相关联数据 Extras 和 Flag 附加信息

Intent 存在的目的是要求做某事,而 intentfilter 则阐述了能够做什么,通过检查 Action 的 VIEW、PICK、MAIN(主程序入口点)对多个 Action 进行过滤,并且 Uri 联系 Data 进 行检查,是引向联系人的一个方法。当 Uri[16]数据匹配成功,则 Data 验证成功。多个 Category 可以联合检查。通过 Intent 功能可以实现启动同一个功能的另一个活动 , 例如 Activity 可以监听桌面的天气活动,当发布天气转阴时,进行相应的活动跳转。 2.4.7 Android 的 Bundle

基于 Bundle 传递单参数或者多参数都是消息传递的方法: Clear()清除此 Bundle 映射的数据备份; putExtras() 去除相应 Bunddle 中的数据; remove(String key)移除指定的 Key 值; hasFileDescriptions():指示是否包含任何捆绑打包文件描述符。

通过 putXX 可以使用内部哈希表类型来存放其数据的置入值。通过 getExtras()等去 除数据,也可以通过 Bundle 传递多参数。 2.5 云存储 SaaS 及 HDFS 软件即服务([13,28]

SaaS)是随着互联网技术的发展和应用软件的成熟,而在 21 世纪

开始兴起的一种完全创新的软件应用模式。它与“on-demand software”(按需软件),the 暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 15

application service provider(ASP,应用服务提供商),hosted software(托管软件)所具 有相似的含义。它是一种通过 Internet 提供软件的模式,厂商将应用软件统一部署在自 己的服务器上,客户可以根据自己实际需求,通过互联网向厂商定购所需的应用软件服 务,按定购的服务多少和时间长短向厂商支付费用,并通过互联网获得厂商提供的服务。 用户不用再购买软件,而改用向提供商租用基于 Web 的软件,来管理企业经营活动,且 无需对软件进行维护,服务提供商会全权管理和维护软件。有些软件厂商在向客户提供 互联网应用的同时,也提供软件的离线操作和本地数据存储,让用户随时随地都可以使 用其定购的软件和服务。对于许多小型企业来说,SaaS 是采用先进技术的最好途径,它 消除了企业购买、构建和维护基础设施和应用程序的需要。

在这种模式下,客户不再像传统模式那样花费大量投资用于硬件、软件、人员,而 只需要支出一定的租赁服务费用,通过互联网便可以享受到相应的硬件、软件和维护服 务,享有软件使用权和不断升级;公司上项目不用再像传统模式一样需要大量的时间用 于布置系统,多数经过简单的配置就可以使用。这是网络应用最具效益的营运模式。 云存储的好处: (1)数据的可移动性。(2)轻松维护个人应用程序和个人文件, (3)对设

备硬件要求较低,节省存储空间(4)云计算通过虚拟化的运用,可以把工作负载转移到空闲 或使用不足的系统(5) 节省电能,降低成本,运行企业级数据中心的节约。

HDFS[11,13](Hadoop Distributed File System)分布式文件系统是开源式 Hadoop 云 计算框架中的一个核心组件,它为大规模分布式数据处理提供很好的存储支持。传统文 件系统无法把大数据集(比如说 100TB)存储为单个文件,而 HDFS 可以轻松实现。 HDFS 被设计成能够在一个大集群中跨机器提供可靠的海量数据存储系统,该系统 还能实现负载均衡能力的优化。在 HDFS 文件系统中每个文件都是被分割成不定数量 的数据块,除了最后一个数据,其余的数据块的大小都一致,文件块的大小可以在配置 文件中修改。高容错是 HDFS 的一个特性,HDFS 通过备份数据块来实现实现系统容 错的功能,每个文件的数据块副本的数量可以通过配置文件修改来适应实际的应用环境。 2.6MVC 模式

在 android 程序中使用了 MVC 模式的技术。MVC 模式是为那些需要为同样的数据 提供多个视图的应用程序而设计的,它很好地实现了数据层与表示层的分离。对于界面

设计可变性的需求,MVC(Model-View-Controller)把交互系统的组成分解成模型、视暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 16

图、控制器三种部件。

视图部件把表示模型数据及逻辑关系和状态的信息以特定形式展示给用户。它从模 型获得显示信息,对于相同的信息可以有多个不同的显示形式和视图。

控制器部件[14]是处理用户与软件的交互操作的,其职责是控制提供模型中任何变化 的传播,确保用户界面和模型间的对应联系;它接收用户的输入,将输入反馈给模型, 进而实现对模型的计算控制,是使模型和视图协调工作的部件。

模型部件保存由视显示、由控制器控制的数据,它封装了问题的核心数据、逻辑和 功能的计算关系,独立于具体的界面表达和 I/O 操作。

模型、视图、控制器[15,16]的分离,使得一个模型可以具有多个显示视图。如果用户 通过某个视图的控制器改变了模型的数据,所有其他依赖于这些数据的视图都应反映这 些变化。因此,无论何时发生了何种数据变化,控制器都会讲变化通知所有的视图,导 致显示的更新。这实际上是一种模型的变化-传播机制。

模型、视图、控制器三者的关系与各自的主要功能如图 2-6 所示 模型

封装应用程序状态 响应状态查询 应用程序功能 通过视图改变 视图 解释模型 模型更新请求

发送用户输入给控制器 云寻控制器选择视图 控制器

定义应用程序行为

用户动作映射成模型更新 选择响应的视图 视图选择 状态查询 用户请求 通知查询

方法调用 事件 状态改变

图 2-6 MVC 模式

Android 提供了一个很好的实现这种经典 MVC 设计模式的类似环境。

视图(V)[15]:可以通过在 Activity(活动)中开发用户接口(丰富而又可以扩展的

视图 Views,可以用来构建应用程序,它包括列表 lists、网格 grids、文本框 text boxes、

按钮 buttons,甚至可嵌入 android 的 web 浏览器)来实现视图。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 17

上述空间组成的 XML 文件放在 res/layout/版面配置(layout)目录中,实现了数据 层与表示层的分离。 模型(M):模型通常对应 Android 应用系统的业务部分(.java),放在 src 目录中。 控制器(C)[16,18]:控制器的功能在 Intent(意图)、IntentFilter(意图过滤)、Broadcast Receiver 广播接收器、BroadcastIntent(广播意图)、Service(服务)、Notification(通知)、 Alarm(警告)及 SMS(短信)、电话等逻辑功能代码中实现,放在 src 目录、Android Manifest (程序清单)等中。

持久层[19]: Android 的持久层开发体现在 Android 的文件、SharedPreferences 存储 类、SQLite 数据库和 Android 的 ContentProvider(内容提供器)等中。 2.7Spring

Spring 是由 Rob Johnson 创建,为简化企业级系统开发而诞生[19,20]的开源框架。它 为企业级应用提供了一套全面的、从前端视图层到数据层的解决方案,它提供了很多原 来只有 EJB 能提供的功能(如声明式事务管理),却又无须运行在 EJB 容器上。

Spring 是一个轻量级的,实现了 AOP 功能的 IoC 容器,是一站式的,但又不是一个 全有或全无(all or nothing)的开源框架。它寄宿于进程,依赖 web 容器(Context Loader Listener)来启动。

所谓 AOP[21] (Aspect Oriented Program),即面向切面编程,它提供从另一角度来考虑 程序结构以完善面向对象编程(OOP),追求的是调用者和被调用者之间的解耦,它弥补 了面向对象编程在跨越模块行为上的不足。

IoC(Inversion of Control Containers) [23,24]控制反转,通过容器在实例化的阶段读取 xml 配置文件将需要实例化的类注入,而不是从容器中逐一查找相应的依赖类。控制权 [21]从应用代码中转到了外部容器,控制权的转移,即所谓反转。Spring [23,24]的优点有很 多,例如可以轻松的实现按接口编程,有统一的异常处理机制,可以获得业务逻辑层的

事务,通过 AOP 将分散的关注点提供给集中关注点,可测试,无侵略性的事务处理等。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 18

图 2-7 Spring 框架结构

Spring 框架如图 2-7 所示,有 7 个如下模块组成,用户可以自由选择所需要的模块: 1) 核心容器。核心容器[25]封装了 Spring 最基本的功能,其它的模块功能与应用都

是围绕此核心容器展开的。作为 Spring 框架的基础,它提供 IoC 与依赖注入 2 大功能。 该模块中有一个核心的类 BeanFactory,该类使用工厂模式来实现控制反转,可以创建和 分发各种类型的 Bean,实现了独立的系统配置以及不具依赖性的代码编写。

2) Spring 上下文。该模块是 BeanFactory 的扩展,增加了国际化、验证支持等功能, 还提供了众多企业级服务,诸如 JNDI 访问、EJB 集成等。

3) Spring AOP。面向切面 AOP(aspect-oriented programming),并不是 Spring 独有的, Spring 框架只是封装了符合 AOP Alliance 规范的实现。AOP[26]允许你将分散在系统中的 功能放到一个地方- 切面。在 Spring 中,既可以通过 XML 配置实现 AOP,可以通过注 解操作 SpringAOP。

4) Spring DAO。Spring 的 DAO 模块抽象了模式化的 JDBC 编写,提供了一致的编 程模式。通过 Template 做统一的增删改查操作。Spring 提供了一致的异常处理模式,这 些异常与特定的应用实现无关,在其它应用层中也不用强制捕获。 2.8 本章小结

本章概括讨论了手机操作系统的体系结构,展示了详细的底层开发逻辑和各个组件

的构成,详尽介绍了 Android 的开发机制和工作流程,并介绍了重要的 MVC 模式以及暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 19

本文用到的几个关键技术点。另外对云存储 Saas、分布式文件系统 HDFS 以及服务器的 Spring 框架进行了简单介绍。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 20

3 系统性能需求和框架设计 3.1 性能需求分析

通过对整个系统功能以及网络可行性分析,可大致确定设计方向,以及需重点解决 的问题。

医疗挂号系统旨在为客户提供各类服务信息以及与客户进行信息交互,因而对软件 和硬件平台提出了相应的几点要求:确保网络通畅,即能够很好地接入现有的运营商网 络;系统功能模块完善,基本实现用户操作功能;友好的界面设计,可以获得良好的操 作感。

网络需求主要包括接入与负载能力两方面。对于网络通信,曾经做过两种假设,一

种是在同一个无线网络中,通过 Android 手机终端获得局域网的信号,或者通过手机上 网,获得服务器接入。这两种模式都需要确保数据库的读取和安全性,故在接入网络时 应进行加密和用户验证,并且能够确保系统的实时访问性,超时则发出提醒和限制。系 统的网络负载能力是该系统的一大难题,过多的在线人数则会使负载提高,这是交换速 度下降的根源,而若在登录服务器时限制登录访问的用户数则可能很难确保紧急用户在 需要急诊时候的挂号和排队,因而需要提高用户界面负载能力的平衡性,在这里提出采 用 HDFS[21]提供的大容量存储以及负载均衡技术,其可通过多个服务器的平衡和划分能 够为服务器实施动态分配用户数,该技术由单一阈值策略或双阈值策略来实现;或者通 过驻留时间和阈值判定作出一个门限选择,作出动态分配算法。另外提议,在山区等通 信线路覆盖不到的地方,医疗移动主机可以采用 Ad Hoc 网络接入,该技术可由路由算 法来实现,建议利用[22]负载均衡的 Ad Hoc 网络路由协议来解决接入。

医疗挂号系统是为了简化医院的管理以及提高病人的就医效率,因而在功能设计上 应包含可移动的信息录入与查询功能、病症查询、医院查询、挂号、专家查询、查看医 生处方等功能,在设计这些功能模块时,考虑到实际应用操作问题,还应能够实现简单 操作化和界面交互性好等功能,以方便用户使用。

通过对整个系统功能以及网络可行性分析,可大致确定设计方向,以及需重点解决

的问题。此外,为了节约成本,不需要重建数据库,只需对原来的医疗系统的数据库进暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 21

行继承与改进,从治病便利性和医院需要尽可能完备的病人信息出发完善数据库维护工 作。

3.2 系统总体架构

1) Android 手机安装的医疗挂号信息系统,通过 GPRS/3G 网络,将需要的数据请 求提交到医疗信息服务器端。

2) 医疗信息服务器端程序通过数据协议接口与分布式存储管理系统数据通讯,将手 机客户端的数据请求传递给分布式的存储管理系统。

3)将医疗信息服务端程序请求的数据通过标准接口传递给医疗信息服务器,或者医 疗信息服务器主动获取分布式存储管理系统数据。

4) 医疗信息服务器将获取的数据和信息进行分析、处理并缓存后回传给医疗挂号手 机客户端。

5) 医疗挂号手机客户端得到医疗服务器数据流后,最后手机客户端程序按要求显示 获得的数据。

注:分布式存储管理系统数据和医疗信息服务器端在 PC 上作为一个整体而逻辑上

是可区分的系统在系统内对作业进行调度并完成数据的存储交互。 基站

多台便携电脑

调度系统应用服务器 数据库 数据库 平板电脑

Android智能手机 无线网关

图 3-1 系统总体架构图暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 22

3.3 系统功能总体设计 病人 查询信息 预约挂号 查询病历 处方 医生 系统 管理 人员

医疗信息服 务器 管理信息 互联网查询 互联网查询 extend extend

医疗挂号系统

图 3-2 基于 Android 医疗挂号系统用例图

在系统中,设置了三种用户分别是:系统管理员、医生、病人。而医生身份登录时 又设有不同权限,病人和医生可以在系统运行时间内,登录医疗信息系统管理网站。管 理员可以导入、添加、修改数据等操作,各个用户登录系统具体功能见图 3-1 系统总体 研发设计总结构图:

(1)病人可以通过登录网络进行科室症状咨询、医生查询、进行排号挂号、查询医 院的通知、查看医生的排诊时间。

(2)医生可以通过登录网络进行实现系统管理员授权下病人挂号记录的修改删除 等操作、专家简历更新、发布新闻、发布通知。

(3)系统的维护主要通过系统后台管理实现,系统管理员通过系统后台管理可以 实现以下功能: 信息管理

对网站的新闻、通知、留言、发布的管理以及修改与删除操作。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 23

添加删除挂号记录;对数据库备份; 用户管理:

1)对管理员的管理:添加删除管理员,修改管理员权限,重设管理员密码; 2)医生权限管理:对医生的新闻发布权限和简历更新权限进行限制管理; 3) 模拟登录:用户可以模拟医生或病人登陆医生或者病人界面。

数据库管理

对数据库进行不定时备份以及在数据出错时还原数据库。 医院挂号信息服务系统 系统管理员 医生 病人 添 加 删 除 挂 号 记 录 信 息 管 理 用 户 管 理

对 数 据 库 备 份 专 家 简 历 更 新 值 班 信 息

删 除 用 户 挂 号 记 录 发 布 通 知 ( 授 权 ) 发 布 新 闻 ( 授 权 ) 注 册

登 录 修 改 信 息 查 看 医 院 信 息 挂 号

图 3-3 角色功能设计 3.4 系统功能模块设计

在线登陆情况下通过调用服务器端提供的以下接口实现:用户登陆接口、获取用户 信息接口。

用户登录和注册主要是客户端与用户类之间的关系,建立如下的功能需求:

医生查询模块功能:查询科室和自己的挂号结果,查询医生基本信息如个人专长, 从而选择适合自己的医生;暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 24

医疗挂号模块功能:通过查询医生信息后,对科室进行选择,确定选择符合自己的 医生进行挂号,并完成相应手续;

取消预约模块功能:在规定的时间内到达不了指定就诊医室,则进行提前的取消挂 号操作;

排诊查询模块功能:查询医院的排诊表,选定自己的就诊时间。

二维码模块功能:通过扫描二维码进行用户登录,使得医院能快速定位病人病情, 简化医院信息录入和查询操作; 注册与修改 病人信息 病人数据库 添加与修改 处方咨询信息 用户表 信息交互

医生专长信息添 加

医院发布消息, 医生排班信息 评分信息 信息交互 挂号数据库 医院医生、 排班数据库 管理员

添加、删除 挂号记录 添加、删除 挂号信息 挂号反馈

图 3-4 需求分析总体结构图暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 25

医院挂号系统客户端

医生查询 排诊查询 医生挂号 取消预约 二维码查询 图 3-5 系统功能模块设计 3.4.1 用户登录验证功能分析

此模块提供了必要的用户登录及验证功能。用户可以通过此模块完成注册、登录功能。 其具体功能如图 3-6 所示: 用户 登录 注册 用户信息 用户登录

图 3-6 用户登陆用例图

3.4.2 医院挂号信息服务系统

医院挂号系统主要指医院门诊挂号系统,主要负责与医疗挂号系统完成数据交换, 提供医院基本信息、科室信息、专家信息、排班信息等基础数据,同时负责处理用户挂 号信息,处理用户看病信息等功能。 医院基本信息 用户挂号信息 医院挂号信息服务系统

科室信息 专家信息 排班信息

图 3-7 医院挂号信息服务系统功能设计

3.4.3 数据交换服务系统暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 26

数据交换服务[26,28]系统是本次系统建设的主要任务,主要负责医院医疗挂号后台服 务系统和手机端挂号的数据交换,数据交换通过访问数据库来实现,需要建立私有文

件,并访问系统资源 XML 文件等。本地的数据存储于设备的 SD 卡中,Android 允许对 文件进行一定权限授权访问。 3.4.4 BS 平台与 CS 平台的交互

本 Android 医疗挂号系统通过接口间数据传递,进行 BS 和 CS 间通信,实现挂号的即 时反馈,接口作为 BS 平台和 CS 平台以及服务器之间的连接。 B/S

网页医疗客户端 服务器 客户端 C/S 发送控制命令 获取信息

图 3-8 CS 融合 BS 模块架构框图

C/S(客户端/服务器)模式是本医疗挂号信息系统 Android 端的基本结构;PC 端通 过浏览器对后台服务器端进行控制,即实现 BS 模式,实现医疗数据管理功能。这两个 技术做到融合,达到同步更新数据库需求,并统一发送反馈。

而其中的 B/S(浏览器/服务器)模式是本医疗信息系统部分服务器端的基本结构, 也是其云服务器端的基本结构,采用该结构医生通过浏览器直接查看或操作电子病历系 统数据。与此同时本系统最终要实现基于云的电子病历存储系统,所以除了常见的数据

库服务器,还有一个云存储服务器用来保存诊断完毕的电子病历数据。暨南大学硕士论文 基于 Android 平台医院

医疗挂号系统 27

3.5 数据库系统架构与技术选型

通过使用 Apache 的 HttpClient 组件进行网络数据的获取,该组件模拟实现了 HTTP 通信协议,采用了轻量级数据格式 JSON 作为数据封装, Android 客户端使用 Java 语言编 写,服务器端通过使用云计算分布式存储及 SSH 框架技术进行构建。后台数据库则采用 了 Mysql 来实现。

医疗信息系统服务器端数据传输采用 JSON 格式,与 Android 移动终端共用同一后

台处理程序,采用 Struts2,Hibernate,Spring 技术,布局上通过 HTML,CSS 和 JavaScript 技术实现页面的设计。 J2EE服 务器 SSH Android 客户端 MYSQL 数据库

图 3-9 技术选型 3.6 网络架构设计 UI模块

Android组件 Contro模块 (BO层) Model模型对 象VO

组装XML格式 协议 传输 服务器 数据库

图 3-10 架构设计

为实现系统低耦合性和安全性的需求,如今构建的系统主要划分成三部分进行设计,暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 28

即医院医疗挂号后台服务系统、数据流交换系统和手机客户端挂号系统三个部分。 系统功能共有几大模块:网络会话模型模块、数据库持久化模块、业务处理模块、

和用户界面模块。网络模块使用 Apache 的 HttpClient 组件进行网络数据的获取,该组 件模拟实现了 HTTP 通信协议,采用了轻量级数据格式 JSON 作为数据封装;

KXmlParser 解释提供 Model 所需要的数据,组成 VO;数据库模块是将 Model 的 VO 数据持久化到数据库进行存储;业务处理模块负责进行进行调用 HttpClient 组件和将处 理好的数据展现在 UI 界面层。 3.7 医院云存储的解决方案

云存储是在云计算(cloudcomputing)概念上延伸和发展出来的一个新的概念,是指通 过集群应用、网格技术或分布式文件系统等功能,将网络中大量各种不同类型的存储设 备通过应用软件集合起来协同工作,共同对外提供数据存储和业务访问功能的一个系统。 通过把客户信息发送到云端存储,并查看处理,可以节省医院内部系统资源。 在瘦客户端计算体系结构,应用程序的处理被安排到远程服务器,而不是运行在本 地。用户输入转发到服务器,呈现的图像在中继中通过专用远程显示协议显示到用户的 设备。瘦客户端计算体系更便于维护并能减少资源的总占用率。与日益发展的云技术伴 随,瘦客户端体系结构的服务器端能够在云部署,因而使得其特点发挥淋漓尽致。通过

虚拟化技术,其灵活性、安全性和动态作用得以体现。我们能在客户端使用移动设备来 充分利用云技术。传统的瘦客户端体系结构具有平台依赖性。云环境下的系统能摆脱了 软件提供商的限制,最终为用户提供便利。所以我们建议用多平台的瘦客户端体系结构, 其中在云环境下使用[27,28]VNC(虚拟网络计算协议)。在这种体系结构中,用户将会受 益不少。其中,最终用户可以通过使用廉价的移动终端,享受不同平台的软件服务。与 此同时,软件提供商或开发人员可以获得更大的好处或者进行更大规模下载。 瘦客户端计算是指用户设备依赖于对远程服务器执行其计算任务的仅仅几分之一的 计算量。他们将为用户提供 GUI,同时大大降低总成本 (TCO) 尤其是相对于传统的与 PC 结合的胖客户端。在移动性方面,瘦客户端概念非常有前途。能使得用户访问移动设 备,同时避免了使用缺乏的资源来执行本地的应用程序。因为只有基本功能是需要在终 端处理外,其他程序可在高效率的云环境中进行处理计算。云计算包括共享服务器提供

的资源。而传输到计算机和其他设备上的软件处理和数据需求是具有弹性的。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 29

解决方案:

经过上文综合考虑云计算特性和发展趋势后,本 Saas 服务通过对私有云的控制,可 以为每个医院机构划分一块独立的资源,而各个医院之上又可以授予一个总医院管理信 息部总部权限,医院总部云具有较高的权限,可以调用每个相关的医院的云存储资料, 而每个医院的权限则相应较低。云存储数据库中的资料对应每个医院存在一个关系映射。 而医院数据中心包括医生门诊部和各体检中信通过连接到服务器,录入病人的最新医疗 数据,可以减少了重复录入率。对每位病人用户授予较高的权限,病人可以自由查看自 己的资料和数据,方便其在医院之间转诊治疗和医院之间的合作治疗,而无须再一次面 对重新体检和重复咨询的困扰,增强了用户体验和用户的便利性。

随着医院的加盟,患者数量的增多,电子病历数据越来越多,为了能够满足系统的 存储需求,系统采用云存储技术将经过初诊生成的电子病历保存到分布式环境中,从而 解决单机系统所遇到的存储空间瓶颈,并使系统的存储空间可以线性增长,保证系统的 扩展性。通过分析病历的数据以及 HDFS 分布式文件系统的特点,尝试通过构建基于分 布式的电子病历存储平台,它是最终病历系统保存数据的环境,也是后续诊断和科研的 资料库。

3.7 数据库私密性

系统实现中需要实现安全性,系统按照以下维护数据库的要求展开数据维护工作: (1)登录帐户配置

降低 SQL 注入攻击威胁的方法是使用最小特权账户连接到数据库。开发人员通过与 数据库管理员协商,确定应用程序登录需要访问的确切的存储过程和表,开发者会对登 录应用程序者的执行权限作出限制,只允许其对应用程序部署有的一组相应的有限存储 过程进行授权。对 SQL 账户和连接数据库的软件客户端的账户使用强密码。 (2)登录审核

对数据库登录尝试次数设置最大值,以保证及时发现账户密码攻击者。多次失败, 则锁定客户端当天的登录,遏止了其不良行为。 (3)网络上的数据私密性和完整性

本系统可以通过在数据库服务器端安装证书或者使用数据库 IPSec 加密通道,确保 不通过网络暴露登录凭据。使用数据库的 [29,30]

IPSec 或 SSL 通道来保护传入和传出数暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 30

据库的敏感的应用程序级数据。

(4)使用 MD5 算法加密需要存储的敏感数据

许多 Web 应用程序都在数据库中以某种形式存储敏感数据。如果攻击者设法针对 本数据库执行查询,则务必加密所有敏感数据项(如信用卡号)。尽可能避免存储敏感数 据。如果必须存储敏感数据,则需要对其进行加密。本系统现今使用了 MD5 算法,并

能撤换成 SHA 算法进行管理维护。

本系统使用 MD5 加密,加密存储敏感数据于数据库中。比如,需要加密用户名密码, 当用户进行验证时即进行加密。 protected byte[] encrypt(byte[] obj) ...{ try ...{

MessageDigest md5 = MessageDigest.getInstance(\md5.update(obj); return md5.digest();

} catch (NoSuchAlgorithmException e) ...{ e.printStackTrace(); } }

MD5 的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防

止被篡改 MD5 将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产 生了这个唯一的 MD5 信息摘要。如果在以后传播这个文件的过程中,无论文件的内容 发生了任何形式的改变(包括人为修改或者下载过程中线路不稳定引起的传输错误等), 只要你对这个文件重新计算 MD5 时就会发现信息摘要不相同,由此可以确定你得到的 只是一个不正确的文件。如果再有一个第三方的认证机构,用 MD5 还可以防止文件作 者的\抵赖\,这就是所谓的数字签名应用。 (5)保护网络上敏感数据的安全

通过网络传入和传出数据库服务器的敏感数据可能包括应用程序特定的数据或数据 库登录凭据。为了确保网络上的数据的私密性和完整性,使用平台级解决方案(如由安 全数据中心提供的解决方案,在服务器之间使用 IPSec 加密的通信通道),可以对应用 程序进行配置,以便与数据库建立 SSL 连接。

(6)基于数字证书的身份验证暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 31

通过使用数字证书方式,杜绝了单单使用用户名和密码方式进行用户登录验证被识 破的情况,并且不需要担心证书被破解或者截取。当用户选择使用数字证书登录应用程 序时,Web 应用程序端会对浏览器发出要求提供数字证书的请求,用户选取合适的证书 后,发送至服务器端。应用程序对其进行解析后,验证证书的办法日期和有效日期后, 对该用户进行认证和授权。 3.8 系统数据库设计

医疗信息系统数据库设计要求逻辑严谨、结构优良,具有独立性并易于维护,尽量 减少冗余。针对数据库设计,存在着几个范式:

数据库[30]第一范式(1NF)具有四个要求:(1)表中字段都是单一属性的,不可再分;(2) 每一行的记录都是没有重复的;(3)存在主属性,而且所有的属性都是依赖于主属性;(4) 所有的主属性都已经定义。

数据库 2NF(第二范式):如果关系模式 R(U,F)中的所有非主属性都完全依赖于任 意一个候选关键字,则称关系 R 是属于第二范式的。

数据库 3NF(第三范式):如果关系模式 R(U,F)中的所有非主属性对任何候选关键

字都不存在传递信赖,则称关系 R 是属于第三范式的。设计数据库需要满足如下原则: 根据客户人数可能庞大的特点,采用关系型数据库,该类数据库操作方便,易于理 解、扩展,冗余度低数据独立度高等优点。数据库设计必须标准规范。满足我们期望的 范式,基本满足第一~第三范式。 3.8.1 Android 数据的四种存储方式

Android 的五种存储数据的方式分别是[32] SharePreference 存储数据、SQLite 数据库

方式、Content Provider 存储数据和文件存储以及网络方式存储数据。

通过使用私有数据库把大部分数据进行私有化,并使用可视化操作数据库工具进行

图 4-7 医疗挂号时序图 发送挂号请求 发送挂号信息 询问是否要挂号 确认挂号

处理挂号信息并储存

给应用服务器返回挂号信息 发送挂号结果消息 返回挂号结果

建立客户端与数据库连接

Android界面端 Android客户端 挂号系统服务器 挂号系统服务器暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 43

通过此 Model 模型层传入数据库传送进来数据,作为一个中间层。再进入业务层进 行数据处理,以下进行分析: 4.2.3 客户端挂号功能实现

菜单为导航菜单,在完成布局后,还需要实现界面的跳转,这时需要在 scr 路径下

建立 Doctor.java 文件,通过 R.layout 文件语句将其与布局文件关联起来,通过对布局文 件中的控件设置监听事件,来完成界面间的跳转。进入客户端业务GetNumberActivity.java 进入可以实现获取挂号,实现取号和选取科室的作用, 控制器负责捕获请求,Intent 实现 跳转,并由模型层的 Activity 的进行数据处理: public class GetNumberActivity extends Activity{ //包 GetNumberActivity 继承自 Activity private Spinner spinner;

private TextView textView; //设置 textView 框 private Button okButton;

private String type = \外科\内容为外科

protected void onCreate(Bundle savedInstanceState) { //通过 Bundle 传值

super.onCreate(savedInstanceState);

setContentView(R.layout.getnumber); //保存挂号数字

spinner = (Spinner) findViewById(R.id.chooseOfficeSpinner); //选择科室按钮的对话框

okButton = (Button) findViewById(R.id.chooseOfficeInfoButton); //初始化 OK 按钮的对话框 ArrayAdapter arrayAdapter = new ArrayAdapter(this,

android.R.layout.simple_dropdown_item_1line,MyContants.classArray); //通过适配器进行传送数据 spinner.setAdapter(arrayAdapter);

spinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){ //设置监听器

public void onItemSelected(AdapterView arg0, View arg1, int arg2, long arg3) { //传入值

type = MyContants.classArray[arg2];

arg0.setVisibility(View.VISIBLE); //对其可视化 }

public void onNothingSelected(AdapterView arg0) { } });

okButton.setOnClickListener(new OnClickListener() { public void onClick(View v) {

Intent intent = new Intent(GetNumberActivity.this, DoctorActivity.class);

intent.putExtra(\

startActivity(intent); //启动活动进程暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 44 } }); } }

进入客户端的 GetNumberActivity.java 进入可以实现获取挂号,实现取号和选取科室 的作用。

虽然终端系统以信息查询功能为主,但是必要的数据添加也是必不可少的,尤其是 病历的填写是十分必要的,他需要医生每次对患者的病历多次记录,使用终端系统直接 对数据进行添加,可以大量减轻医生的工作负担。

当点击添加挂号按钮时,Android 向服务器发送 HTTP 请求,服务器接收请求后, 对其作出响应并将数据写入数据库,其中响应以 Json 字符串的方式返回给客户端。其 添加挂号的数据流程如下图所示: 通过HashMap 存储用户相应的 数据 传输用户 数据并保存 获取挂号信 息和用户信息

/查询确认是否有医 院排诊信息中该编号 的医生排诊信息 修改真实姓名

,为其设置修改的监听器 更新设置用户信 判断若修改用户 息 本人失败,则发 出提醒

通过INTENT传 输医院挂号的数 据

图 4-8 挂号数据流程暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 45

客户通过手机客户端通过验证登录信息,并取得挂号号数。

客户登录消息验证,登录成功的话则进入界面,并登记客户名字和信息;否则显示 连接错误。

客户端添加挂号和排号功能的程序代码见附录 3。 4.2.4 程序清单配置文件

当用户点击子功能模块后,由 Activity 类里直接在 AndroidManifest 里查找对应的 页面。

用户主界面 本地Android配置界面 查找对应的功能界面 图 4-9 主界面序列图

1. AndroidManifest.xml 介绍

每一个 Android 项目都包含一个程序清单[36-39]Manifest 文件-AndroidManifest.xml, 它存储在项目层次中的最底层。清单可以定义应用程序及其组件的结构和元数据。

它包含了组成应用程序的每一个组件(活动、服务、内容提供器和广播接收器)的节

点,并使用 Intent 过滤器和权限来确定这些组件之间以及这些组件和其他应用程序是如 何交互的。

AndroidManifest.xml 配置代码见附录 4。 4.2.5 信息查询功能设计

由于本系统是在移动终端上操作,所以对大量信息的录入会造成操作繁琐、不便利 等情况,而相对于信息的查询功能则基本不会受到限制,所以在系统中查询功能使用频 率很高,几乎每个模块都包含这一功能。尤其是在医生端病历查询部分的使用最为频繁。 以首程病历信息查询为例来详细介绍查询功能的具体实现过程。

当点击科室登录查询时,Android 向服务器发送 HTTP 请求,其中包括在查询模式

中提取到的患者的身份信息。服务器接收请求后,对数据进行检索,并将结果以 Json 字暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 46

符串的方式返回给客户端,客户端接受数据并以 [40] JSON Object 的方式,解析返回的字

符串,并在首程病历界面设置相应值。服务器端返回 Json 字符串的具体实现如下: public String findPatientById() throws Exception { JSONObject jsonObject = null;

//通过 bingrenjibenxinxiService 的 findById 方法,返回详细的病人基本信息 bingrenjibenxinxi= bingrenjibenxinxiService.findById(bingrenjibenxinxi.getId()); //把获取的病人基本信息对象组装成 Json 对象

jsonObject = DateJsonValueProcessor.obj2JsonObj(bingrenjibenxinxi); //获取 HttpServletResponse 对象,用于返回 json 对象

HttpServletResponse response = ServletActionContext.getResponse(); //设置 http 返回的字符编码,并打印 json 对象 response.setContentType(\response.getWriter().print(jsonObject.toString()); return null; }

4.2.6 客户端用户登录

到此为止一个 UI 布局和相应的动作类就完成,下面介绍一下其他类客户单用户登 录业务类开发。UI 布局与上面几节类似,在此不再赘述,仅介绍最关键的业务类。 客户登录消息验证,登录成功的话则进入界面,并登记客户名字和信息;否则显示

连接错误,用户界面的实现需要[42,43]XML 文件和 JAVA 代码设置跳转,通过 JAVA 语句 完成数据的获取和通过模型层进行业务的判断,而通过 UI 页面代码进行布局,最后通 过解析 XML 格式文件,显示到 Android 界面。

其中,进行客户端用户登录的程序分析,首先判断客户端服务器之间联网状态,通

过设置页面格式为 UTF-8 获取输入输出流,确定接收的用户名和密码的变量,判定客户 信息是否正确并作相应截取,若判断成功,则通过 Toast 返回一个注册成功界面。详细 代码,见附录 1(1)。 4.2.7 链接服务器请求

本系统需要在客户端和医疗应用服务器和平台服务器之间进行通信信息交互,之间暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 47

需要[37]数据交换和 Android 客户端结果的返回。

通过服务器的链接获取服务器的当下信息,输入用户名和登陆密码进行登陆,登陆

成功后获取更新消息。用户界面的实现需要 XML 文件和 JAVA 代码设置跳转,[44]通过 JAVA 对 JAVAScript 的传送到 Adroid 客户端完成页面登录,而对 HTML 页面代码进行布 局。通过包与包之间的跳转实现功能模块,并通过联网进行数据交换实现通信。

链接服务器的请求信息时,客户端向服务器端发送写入请求,服务器端写入数据, 并反馈写入成功与否的信息等。 详细代码见附录 1(2)。

4.2.8 医生添加病人挂号信息 其 JAVA 代码如下:

public class DoctorAddServlet extends HttpServlet { public DoctorAddServlet() { super(); //对超类进行加载 }

Doctor doctor = new Doctor(); //新建一个医生实体

DoctorDaoImpl doctordaoimpl = new DoctorDaoImpl(); //通过 DAO 对医生进行实例 化

String name = (String) request.getParameter(\输入医生名字 String info = (String) request.getParameter(\输入医生的信息

String type = (String) request.getParameter(\输入医生所擅长的科目类别 doctor.setName(name); //初始化医生名字 doctor.setInfo(info); //初始化医生的信息

doctor.setType(type); //初始化医生所擅长的科目类别 doctordaoimpl.save(doctor); //保存医生的资料 }

public void init() throws ServletException { //判定是否有抛出异常

}暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 48 }

4.2.9 二维码识别功能设计

在二维码识别[45-49]时主要是对移动终端设备摄像头的控制。首先是控制摄像头以固 定间隔不断截取图像,并对每次获取的图像进行解码操作,直到能够解码出图像中的信 息为止,最终得到二维码中的信息,实现患者身份的识别。在设计时首先定义 SFHCamera 类对摄像头进行控制,部分代码如下:

public void surfaceCreated(SurfaceHolder arg0) { mCamera = Camera.open(); //启动摄像头服务 try {

mCamera.setPreviewDisplay(holder); //设置预览 Log.e(\打印日志 } catch (IOException e) {

mCamera.release(); //当使用结束的时候,需要释放资源 mCamera = null; } }

当开启摄像头服务后,系统会自动找寻二维码图片中的三个焦点,实现自动对焦。

对焦成功后对图像进行截取,并调用 MultiFormatReader 类对图像进行解码,具体实现代码如下: //取得指定范围的帧的数据

PlanarCAMSource source = new PlanarCAMSource(data, width, height, dstLeft, dstTop, dstWidth, dstHeight); //取得灰度图

Bitmap mBitmap = source.renderCroppedGreyscaleBitmap(); //显示灰度图

imgView.setImageBitmap(mBitmap);

BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); //二维码的解码

MultiFormatReader reader = new MultiFormatReader();暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 49

4.3 服务器端功能模块设计

如图所示是挂号系统的服务器程序结构: 图 4-10 挂号系统的服务器程序结构

B/S(浏览器/服务器)模式是本 PC 端医疗信息系统的基本结构,采用该结构医生或 患者可以通过浏览器直接查看或操作电子病历系统数据。与此同时本系统除了要与 Android 客户端通信外,还要实现基于云的电子病历存储系统,所以除了常见的数据库 服务器,还有一个云存储服务器用来保存诊断完毕的电子病历数据。下面首先对模块进 行开发:

4.3.1 系统登录模块

当用户进入系统,需要进行系统登陆和用户口令验证。登录时要将相应数据递送到 后台处理,还要对前台进行显示。

类中分别含有 Login 和 LoginServlet 模块,Login 规定了跳转到固定的 Jsp 页面中, 规定了登录和信息传送的格式。

User user = userDaoImpl.loginCheck(userName, password); if (user != null){

String jsonString = GsonUtil.getGson().toJson(user); out.println(jsonString);

}暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 50 else {

out.println(\}

登录成功则是用 Gson 进行序列化后从服务器传送到数据库中,流程图如下图所示: 请输入名字和密 码

判定是否正确 正确则登 陆成功 传送至数据 库,更新登录 时间 yes 传值

若否则重新输入

图 4-11 用户登陆界面判定流程图 4.3.2 信息查询模块

医生、病人和管理员的应用需求各不一样。医生主要查询内容包括病人病历录入、 病人挂号查询、病人挂号、医疗新闻(医院通知、医生值班情况等);病人主要查询内容 包括:病人病历、病人身份证号、病人挂号、病人就诊情况、医疗新闻、医生就诊排班 等;排队挂号查询内容包括:病人病历、信息查询、医疗新闻。

系统在程序设计上,通过 com.hospital.servlet.userservlet 包实现信息查询功能。与排 队挂号查询功能与医生查询功能在程序设计上大致类似。 表 4-1 病人查询功能包结构 Activity 名称 功能描述

UserAddServlet 病人信息添加

UserDeleteServlet 病人信息删除查询 UserListServlet 病人队列查询

UserUpdateServlet 病人信息查询更新

当病人的需要进行信息添加时,可以通过系统的用户添加模块作以下判定,并验证

成功则打包,通过 Json 传送。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 51 病人信息添加 数据传输与反馈 是否合法名称 递交 存储数据 图 4-12 病人的信息添加 4.3.3 信息录入模块

病人在客户端通过手机录入,送到服务器的数据进行判断,再覆盖数据库信息,医

生在 PC 客户端可以删除挂号记录,管理员以管理员权限可以进行医生新信息的更新录 入。

病人病历情况、病人状况、病人处方是录入的一系列信息。 功能包名称 com.hospital.servlet.doctorservlet 表 4-2 医生查询功能包结构 类的名称 功能描述

DoctorAddServlet 医生录入病人信息模块 DoctorDeleteServlet 医生删除病人信息模块 DoctorAddServlet 医生录入病人信息模块 DoctorFindServlet 医生寻找病人信息模块 DoctorUpdateServlet 医生更新信息录入 4.3.4 信息查询与更新

信息查询与更新模块的两个主体为医生与病人。通过信息录入和更新进行病人端和 医生端资料的完善。通过管理员管理和医生录入,医生也可以通知医院录入。通过界面 更新医院信息。病人也可以通过本系统的进行挂号和取消挂号等,再通过服务器写入数 据库中,更新数据库信息。

系统在程序设计上,通过 com.hospital.servlet.doctorservlet 包实现医生信息发布功能。

通过医生增加或者删除挂号操作,如表 4-3 所示功能:暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 52

表 4-3 医生发布功能包结构 Activity 名称 功能描述

DoctorAddServlet 医生信息发布模块主界面 DoctorDeleteServlet 医生删除挂号

DoctorFindServlet 寻找专科医生信息发布 DoctorListServlet 医生排诊

DoctorUpdateServlet 医生信息更新 4.3.5 服务器端挂号系统的设计

基于 Android 的手机挂号系统设计是以用户实名认证为基础,为患者进行实名医疗 挂号,并需要预约支付挂号费用的过程。在患者客户端取号的过程中,录入信息并确认 登录,确认医疗挂号日子。医院获取病人挂号号码。 4.3.6 添加医生和相应排班的功能

通过以下程序可以实现添加医生和相应排班的作用,服务器候诊代码见附录 2(2) 4.3.7 服务器端个人实名认证功能

用户在医疗挂号开始之前必须完成用户注册和实名化。

通过接收客户端传来的客户的注册信息与服务器存储客户的注册信息进行匹配,符 合则完成登录,不符合则报提示出错信息。

通过继承 HTTPServlet 包可以实现用户添加功能。代码见附录 5 4.4 服务器端逻辑实现

系统的 Web 端采用 B/S 模式,方便管理员通过浏览器向网络上的服务器发出请求。 图 4-13 系统的 Web 端架构

控制器

(Controller) JSP、Sevlet 视图(View) JSP 用 户 Web 浏览器 Web 服务器 数据库 服务器

模型(Model) JaveBean

客户操作模块 网站管理模块 初始化 响应 请求 应答 调用

客户层 Web中间层 数据层暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 53

4.4.1 服务器系统的结构

1) 表现层。使用 JSP 页面用于显示界面与用户交互,项目下 content 目录用于存放 相应的 JSP 文件,css 文件夹用于存放样式文件,img 文件夹用于保存项目图片。 2) 模型层。用 JAVA BEAN 作为模型,在项目下的 entity 文件夹下。用于抽象现 实工作中的种种问题,例如医生添加、信息更新等问题。

3) 控制层。使用 Struts2 作为控制层,Struts2 的 Action 用来控制调用哪个页面,怎 么获取数据。在项目下的 web 文件下以 Action 结尾的 JAVA 文件命名保存。 3.5.1 系统多层分级设计

以下将根据之前的需求分析,按照 SSH 框架设计系统的具体框架。按照系统结构设 计,将医疗挂号系统分为以下 4 层:表示层,业务层,数据访问层、数据持久层。 1) 数据持久层

在医疗信息系统中,数据持久层[50]由 DAO(数据访问对象)组成。基于面向对象的思 想,通过 DAO 封装和抽象具体的实现细节。其优势在于,即使以后系统改变了存储模 式,或者使用其他的关系映射框架而不是 Hibernate,都不会对客户层和业务层产生影响。 在设计中,使用一个 POJO(Plain Old Java Object),即 Java Bean 形式的持久化类与数据 表对应,每一个类的对象对应一条数据记录,每一个类属性对应数据库中的一个字段, 同时每个类可以有一个唯一的 OID(Object Identifier,即对象标识符),该 OID 即数据库 表的主键。在使用 Hibernate 时,需要使用映射文件配置 Java 类与数据库表的信息与 关联关系。而在这个医疗信息管理系统中,使用了 SpringSide 的 HibernateDao。使用 SpringSide 的优势在于减少了配置文件的产生。一般情况下,一个 JavaBean 就要对应

一个 hbm.xml 文件。使用了 SpringSide 后,不需要写任何 hbm.xml 文件。只要写 Entity 即可,其他一切依靠 SpringSide 的自动扫描,在配置文件中加一句程序代码实现。 2) 数据访问层

该系统使用 DAO 进行数据库访问,在本医疗信息管理系统中,SpringSide 封装了 泛型 SimpleHibernateDao,封装 Hibernate 的 DAO 泛型基类,直接使用 Hibernate

API,该类也可在 Service 层中直接使用。在该类中具有通用的查找、增加、更新、删 除的方法,QBH 与 QBC 方法。SpringSide 还封装了 HibernateDAO类,该类继承了

HibernateDao,扩展了分页查询功能以及根据数据过滤条件函数。根据实际需要,还创暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 54

建了 HibernateDaoWrapper 类,增加一些通用的方法,包括根据查询条件得到排序后的

结 果 集 、 使 用 JDBC API 进 行 分 页 查 询 。 系 统 中 的 其 他 DAO 通 过 继 承 HibernateDaoWrapper,操作实体类访问数据库。该系统的业务逻辑层,由 Spring 框架 调用支持。系统的业务逻辑层统一封装在 Service 文件夹,Service 类通过调用 DAO 组 件处理业务逻辑。使用零配置文件-注入的方式指定 IoC 相关设置以及事务管理,在 XML 配置文件中配置 SessionFactory, Spring Security 等功能。 4) 表示层

在该系统的设计中,表示层使用 JSP 页面,在该页面中使用 Struts 的 taglib 标签、 S 标签和 Display 等标签来实现页面显示功能。使用 Struts2 的 ActionServlet 映射 Action,由指定的 Action 处理特定的业务逻辑并且根据处理结果(返回字符串)来决定具 体的相应页面。本系统自定义了基类 CrudActionSupport 继承 ActionSupport 类,该类 是典型的 CRUD Action 抽象基类,主要定义了对 Preparable,ModelDriven 接口的使用 和 CRUD 函数以及返回值的命名。同时通过 SpringSide 在 web.xml 中实现了 Action 的零配置,优化了代码结构缩短了开发时间。 4.4.2 查询组件 1)业务逻辑层

查询组件是所有应用程序不可缺少的功能,数据管理主要是提供查询所需编辑的数

据,如数据的修改和删除,都需使用查询组件功能。数据查询提供简便的数据获取通道,平 台开发了查询组件,以提高开发效率和程序质量。查询组件主要由数据显示和数据查询二 部分组成,数据显示就是把查询的数据以一定的格式显示在页面上,使用户直接获得查询 数据。数据查询开发人员根据要求,使用特定的方法(如 SQL 语句等)获取指定的数据。显 示 web 页面显示和控制采用的 Struts2 框架,所以查询的显示开发,采用了 Struts2 标签,开 发人员只需要引入查询标签即可完成查询报表的显示功能。考虑到查询的复杂性和易用 性,查询组件提供了统一的查询接口,开发人员可针对自己需求扩展和定制查询功能。查询 组件针对于系统的特性,考虑的开发人员获取数据的方式,查询组件实现二种查询方法: 1.Hibemate 查询:

平台数据层使用了 Hibemate 框架,所以数据查询使用了 Hibemate 实现查询,考虑到数

据查询的复杂性和 Hibemate 特性,查询组件实现了以下三种数据库查询方法,它们针对不暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 55

同难点和要求的查询,供开发人员选择: 2.实体查询(Criteria)

通过 Hibernate 提供的 eriteria 方法,实现通过 Hibemate 实体[35] (Entity),使用类属性过

滤条件设置,通过 Hibemate 自动转换成[36] SQL 语句,获得查询数据。该类方式使用比较简

单,但是对于比较复杂的查询就很难满足要求\主要针对简单的业务查询\3.HQL 语句查询

HQL[37]是 Hibemate 特有的查询语句,使用较难,可以适合比较难的实体对象查询。主 要针对复杂的业务查询。 4.SQL 语句查询

使用原生[38]SQL 语句,获得查询数据,使用时难,开发人员需要了解数据结构,适合比 较难的数据查询,可针对数据库结构和类型进行优化。主要针对复杂的[40]数据查询和分 析。

4.5 通信与数据交换

实现了 Android 客户端和服务器端后,接下来要实现服务器端与 Android 客户端通 信外,下面对通信模块进行阐述,通信是基于 HTTP 协议模型的。

通过网络七层模型进行网络数据传输,HTTP 网络的七层结构基本上都是封装和解

封装的过程,上层数据下来的时候就给他加特定的头,相当于装了个信封,就这样一层 层的装下来。下层的数据送到上层就一层层的剥离头(信封),直到最后没有信封得到最 终的数据为止。而其中的数据[41]

JSON 模拟了其七层封装过程,是数据封装的高效形式。 首先介绍 Android 通信的一般过程。

Android 需要通过网络访问后台的数据库进行查询、录入等操作。Android 有几种方

法来[42]访问网络,通过 Web 服务,如 HTTP 访问到网络系统的方法。使用[42]HttpUtil 工具类来获取 HttpRequest 和 HttpResponse 的对象,并可以发送 get 和 post 请求,并通 过访问方法返回信息。

客户端与服务器端实现数据的交换包括了客户端向服务器端提出查询请求,服务器

端反馈,客户端与服务器端通讯采用 HttpClient 进行,利用[43] Http 协议进行通讯,通讯 方式主要有两种,一种是 Http 协议的 GET 操作,另外一种是 Http 协议的 POST 操作, GET 操作主要是向服务器读取信息。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 56 开始

设置服务器地址 创建HttpClient对象 创建HttpGet对象

用HttpGet对象申请通信 通信是否结束? 结束

图 4-14 通信流程 GET 操作示例 具体实现如图 4-15 所示。

表 4-4 客户端访问网络实现形式 通过 URL 获得 HttpGet 对象 通过 URL 获得 HttpPost 对象

通过 HttpGet 获得 HttpResponse 对象

声明 Base URL 常量,通过 HttpPost 获得 HttpResponse 对象 通过 URL 发送 Post 请求,返回请求结果 通过 HttpPost 发送 get 请求,返回请求结果 通过 HttpPost 发送 post 请求,返回请求结果

下图 4-15 是本系统的数据访问流程:暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 57 通过URL获得 HttpGet对象 通过URL获得 HttpPost对象 通过HttpGet获 得HttpRespons e对象

通过HttpPost获 得HttpRespons e对象

声明Base URL 常量

通过URL发送

Post请求,返 回请求结果 通过HttpPost发 送get请求,返 回请求结果 通过HttpPost发 送post请求,返 回请求结果

图 4-15 数据访问流程 JSON 数据传输

JSON 传输数据的代码如下 public class JsonTest {

public static void main(String[] args) {

UserDaoImpl userDaoImpl = new UserDaoImpl();

List list = userDaoImpl.getAll(); //对用户进行存储在 List 类中 Gson jsonArray = new Gson();

String s = jsonArray.toJson(list); //转化格式

}暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 58 }

JSON 序列化与反序列化[51]序列化 (Serialization) 是指将对象状态转化为可以保持 或者传输的格式的过程。反序列化与序列化相反,将流转化为对象,来恢复原样。 结合序列化和反序列化,实现高效存储和传输目的。首先服务器直接生成 JavaScript 语句,客户端获取后直接用 eval 方法来获得这个对象。

Gson 与 JAVA Json 类库最大的不同在比较时可以发现,Gson 需要序列化后使用,其 实体类不需要使用 annotation 来标识需要序列化得字段,与此同时 Gson 又可以通过使用 annotation 来灵活配置需要序列化的字段。

传输速率是否高的决定性因素是数据封装性。Json 是模拟实现了整个 HTTP 协议过 程的封装方式。

通过[51]相关文献的实验比较,在与 JSON 在数据传输开销上是各种数据传输中最小 的,而且数据传输效率的减小带来了数据传输效率的提高。在对比实验中,JSON 的数 据传输开销与 FSV 相差不大,简洁的 JSON 代码形式表现得尤为明显,因此,JSON 和 传统的 XML 相比,具有优势,并同时优于 FSV,JSON 在数据效率上是一种理想的传输 方式。

JSON 传输数据的代码如下 package com.hospital.util; import com.google.gson.Gson; public class GsonUtil {

private static Gson gson = new Gson(); //对数据进行静态声明 public static Gson getGson(){ return gson; } }

具体的 Http 工具代码见附录 2(1)。 4.6 HDFS 文件系统

本系统要实现基于云的电子病历存储系统,所以除了常见的数据库以及服务器外,

还需要构建一个云存储服务器来保存诊断完毕的电子病历数据。下面对电子病历系统的暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 59

存储所用到的平台进行构建:

利用 HDFS 分布式文件系统可以实现电子病历的分布式存储与读取和负载均衡性能

的优化。HDFS [11,52]作为 Hadoop 三大组件之一,其需要运行在 Hadoop 上面。因此本 节将从 Hadoop 的搭建开始介绍,然后再搭建 HDFS 文件系统。 4.6.1 硬件及相关软件

Hadoop 框架可以搭建在任何安装 Linux 系统的机器上面,考虑到实验环境的限制 以及安装的简易性,本集群只由三台 PC 机器组成,每台实体机器上面需要都安装 YLMFOS 3.0 系统(该系统是 ubuntu 修改版),JDK1.6.0.29,以及 HADOOP-0.20.2 软 件框架。下表是三台电脑的基本信息: 表 4-5 三台 PC 基本信息 机器名 IP 作用

cloud1 192.168.1.121 NameNode、master、jobTracker cloud2 192.168.1.122 DataNode、slave、taskTracker cloud3 192.168.1.123 DataNode、slave、taskTracker 4.6.2 Hadoop 的安装

由于网上关于 Hadoop 的安装都是基于 RedHat、Ubuntu 等系统并无 YLMF OS 的过多信息,所以本小节将会对 Hadoop 的安装进行详述。 (1)YLMF OS 3.0 的安装

YLMF OS 是雨林木风公司自主开发的开源 Linux 系统,由 Ubuntu 演变而来,具 有安装简便、高稳定性、安全等优点。更多资料可参考 http://www.ylmf.org 官方网站。 安装该系统,就如同在安装普通软件一样,选择指定的安装目录即可。安装界面截图如 下:

(2)JDK 的安装

JDK 的 linux 安装可以到 Oracle 官网下载,这里不再累赘。下载的安装文件为

jdk-6u29-linux-i586.bin,根据笔者的经验建议大家把下载的文件统一放到一个文件夹下, 如 DOWNLOAD。下载完成后,进入到下载目录,安装 JDK。使用命令 chmod

u+x./jdk-6u29-linux-i586.bin,修改文件的权限。使用命令:./jdk-6u21-linux-i586.bin 解压 安装。安装完毕之后,需要设置环境变量,

gedit /etc/profile(如果没有安装 gedit,可以使用 apt-get install gedit 下

载安装)如下显示:暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 60

设置好之后,重启计算机。使用 java -version,查看当前 JDK 版本。 #set java environment

JAVA_HOME=/home/解压目录/jdk1.6.0_29 export JRE_HOME=/home/解压/jdk1.6.0_29/jre

export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

由于系统可能安装多个 JDK,或者说有不同版本的 JVM,我们需要手动设置各个 版本的优先等级。

下面举例设置 java,javac 命令的版本:

设置命令:update-alternatives --install /usr/bin/java java /usr/lib/jdk 安装目录/bin/java 999[此处数值越高优先级越高]

设 置 命 令 : update-alternatives --install /usr/bin/java javac /usr/lib/jdk 安装目录/bin/javac 999[此处数值越高优先级越高] 通过这样的设置,便可以使用 java、javac 等命令。 (3)Hadoop 框架的实现

为了统一管理,我们需要给计算机重命名,并设置相同的登录密码。本人设置的主

机名分别为:cloud1,cloud2,cloud3,读者可以根据自己的 需要设置好主机名,可以通过 命令:hostname cloud1 来设置主机名,但是通过这样的方式给主机命名,重启之后,设

置的主机名又会复原。所有我建议修改 gedit /etc/hostname 这个文件,把修应的主机名 修改过来。

修改/etc/hosts/文件,三台主机保持一致。本人的 hosts 文件内容如下所示: 127.0.0.1 localhost 192.168.121 cloud1 192.168.122 cloud2 192.168.123 cloud3

启动 ssh 服务,为了实现各个主机的无密码登录,我们需要利用 SSH 这个服务。 读者可以通过 apt-get install openssh-server 获得该软件,并启动相应的服务。 为了保证节点的通信是否正常,可以通过 PING 命令,先检查网络通信状态。首先暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 61

我们 cloud1 节点上面的控制台输入:ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa 命令,生成对 应的密钥和公钥,之后把 id_dsa.pub 追加到授权 key 里面。该命令是: cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys。此时,输入命令:ssh localhost 便可以实现无密码登录本机。

使用命令 scp id_dsa.pub cloud2@192.168.1.122:/存放目录,此处复制会提示输入登

录密码,第一输密码之后,把相应的文件拷贝到 cloud2 主机上面,然后在 cloud2 机器 上面,将上述拷贝的文件通过命令添加到 authroized_keys 中,命令如何 cat 上述存放 目录 id_dsa.pub >>~/.ssh/authroized_keys,这样的操作之后,便可以实现无密码登录,其 他节点也是执行同样的过程。这里不在累赘。

为了各个使 Hadoop 找到各节点,需要将防火墙关闭,使用命令 ufw disable,禁 用

防 火 墙 。 解 压 hadoop-0.20.2.tar.gz , 使 用 命 令 tar –zvxf hadoop-0.20.2.tar.gz , 解压之后设置环境变量。gedit /etc/profile ,添加如下信息: export HADOOP_HOME=/home/hadoop 存放目录/hadoop-0.20.2 export PATH=$HADOOP_HOME/bin:$PATH 4.6.3 建立电子病历的结构

XML 本身的特性决定它非常适合层次化的复杂数据的存储,其提供了层次化复杂数

据库存储方案,而云计算中的分布式存储提供了存储空间线性扩展、硬件设备管理方便、 数据冗余备份等好处。

本文在此模块主要是借鉴以往存在的系统,结合 XML 技术和关系型数据库,并运 用云存储技术对电子病历进行存储,对电子病历的医院系统设计模式提供一种参考。 数据存储的交互内容是电子病历,接下来对电子病历进行设计:

根据实际的电子病历,分析病历的逻辑结构,并建立电子病历的实体模型,病历模 板描述机制,创建电子病历的模板,通过电子病历模板解析引擎获取数据,最终在线生 成电子病历。

电子病历适合通过 XML 文档技术来表达,笔者通过一个病人样例说明 XML 描述 病历设计的具体方法,下图是本系统生成的一个 XML 电子病历样例: <电子病历>

<基本资料>暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 62

<姓名>芳芳

<病历号>45754548 <手机号>13087647192

<地址>梅里斯省建股路 33 号 <性别>女

<体重>65KG<体重> <部位>股静脉<部位>

<药物>低分子肝素<药物>

<首程日期>2012-12-10 4.7 本章小结

本章通过系统地细化功能实现设计,对输入输出端进行了讲解,通过详细的代码分 析以及实现服务器数据通信分析,阐明了模块之间的逻辑和活动的实现方式,并通过框 图对其流程进行说明。

针对 Android 客户端设计,主要是对系统进行 MVC 三层模型的布局和分析,并对

其进行 UI 界面设计。在 PC 端同样采用了 MVC 三层模型的布局和分析,具体是通过 SSH 框架来实现的。客户端和服务器端之间可通过 HttpClient 组件和 Json 数据格式进行数据 访问和通信。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 63

5 系统主要模块实现与测试

为确保系统在功能性、易用性、可靠性、可移植性和效率等方面满足用户的需求, 需 要使用到多种测试方法,对系统进行全面测试。常到的测试类型有: [52,53]黑盒测试、白盒

测试(单元测试,变量跟踪)、功能测试、系统测试、可用性测试等,下面分别对这些类型进 行简单介绍。

黑盒测试:不是基于内部设计和代码的任何知识,而是基于需求和功能性\

单元测试:运用 Android 的 junit3 单元测试工具对业务方法进行单个方法的运行,判断 方法的输入和输出是否正确。

变量跟踪:运用设置断点或在在 LogCat 上打印输出变量值的方式,跟踪变量参数的值 是否正确\

功能测试:用于测试应用系统的功能需求的黑盒测试方法。这类测试应由测试员做, 这并不意味着程序员在发布前不必检查他们的代码能否工作(自然他能用于测试的各个 阶段)。系统测试:基于系统整体需求说明书的黑盒类测试;应覆盖系统所有联合的部件。 可用性测试:

[54]对“用户友好性”的测试。显然这是主观的,且将取决于目标最终用

户或客户。用户面谈、调查、用户对话的录象和其他一些技术都可使用。程序员和测试 员通常都不宜作可用性测试员。 5.1 系统客户端功能的实现与测试

开发完成后,生成 APK 文件,本 Android 医疗挂号系统的大小是 7MB。然后我们 对系统进行测试。

通过对实验用例进行分析和测试,可以验证本软件的运行可靠性。

首先对验证登录作出初步测试,对管理员密码进行设置,启动软件程序,首次进入 界面进行注册或者登录选择,如图 5-1 所示。

用户通过手机输入用户名和密码,点击提交,待服务器验证完毕可进入功能主菜单。 否则继续停留在此界面。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 64

图 5- 1 病人患者注册界面 图 5- 2 病人患者登录界面

待病人打开应用,手机用户通过输入用户名称及密码,经合法验证后,登录客户端, 同时与服务器通信,存储新客户的登录信息;客户登录失败,则需要重新注册合法用户 名。

图 5-3 选择科室挂号界面 图 5-4 医院医生排诊表界面

病人可以选择查看医生值班日,选择科室和专业医师进行排队挂号就医。主界面采

用 Tab 页来实现,比较直观地看到自己需要的是那个功能。每个模块下有不同的功能,

通过 AndroidManifest 里进行配置,根据配置可控制跳转到不同的页面。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 65

图 5-5 医生查询界面 图 5-6 病人患者挂号界面

病人挂号系统主菜单的主要功能对应于医生用户 PC 端挂号医疗服务系统。而病人 客户端挂号医疗服务系统的界面选择主要有信息查询、选科室、排队取号以及退出四大 功能,

登录成功,则可以对系统的操作作出选择,进入主界面,可以查看医生的值班日和 擅长的科目。医生查询界面如图 5-5 所示。

病人挂号系统主菜单的主要功能是对应于医生 PC 端医疗信息服务系统的。通过查 看医生排诊值班表,以及科室医生推荐表,可以对适合自己病情的医生进行挂号。如图 5-6 所示。挂号成功,则有相应的记录。挂号的号码反映了病人的排号,即排在前面还 有多少位病人。

通过查看 5-7 医生排班界面可以选择合适的时间去就诊。当无法如期就诊时,则进

入图 5-8 删除挂号界面进行挂号删除操作。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 66

图 5-7 医生排班界面 图 5-8 删除挂号界面

在点击病历管理后,系统自动跳转进入查询模式界面,如图 5-9 所示。在该界面中 包含二维码识别和手工输入两部分。其中二维码识别功能只需对患者医疗卡上的二维码 图像进行扫描即可获取患者的病历信息,而手工录入模式则是对二维码识别模式的补充, 它在操作时需要人工录入患者的病历号,不如二维码识别快速、灵活,但是当没有二维 码或者摄像头损坏的情况下,该模式的实现,能够保证终端系统的正常运行。 每当读取患者的病历信息时都需要经过此界面对患者进行身份识别后,才能够进入

病历管理主界面对该名患者的病历信息进行操作。在测试时,点击“二维码识别”图标, 成功开启摄像头,扫描二维码图像,并获取到解码后的信息。点击“手工录入”图标, 在界面中输入患者编号,确认后成功进入下一级界面。当选取上述查询方式中的任意一 种识别到患者身份后,进入病历管理主界面,并且在界面的顶端显示的是由上一级查询 模式鉴别出的患者身份界面中的全部子模块所显示的数据均为该名患者的病历信息。测 试时,在图 5-9 所示的患者病历查询模式选择界面中点击“二维码识别”,在扫描二维 码图像后,得到解码后的结果,直接进入到患者病历主界面,当选择“手工输入”方式

时,同样可以直接进入到患者病历主界面。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 67

图 5-9 患者病历查询模式选择 图 5-10 二维码生成

对于每位患者初次进入医院中心开始治疗时都需要填写一张病历单,并且只填写一 次,针对于这一情况,选择在初次提交病历时自动生成每位患者的二维码图像。对于每 位患者二维码必须是唯一识别患者身份的象征,为了避免手工输入出现错误,在患者基 本信息表中添加字段,保证二维码唯一性。

因为病人的病历涉及到个人隐私,病人随身携带具有丢失的风险,需要 [52]二维码的 托管和备份。而通过百度网盘等工具可以上传病人的二维码,在使用时可以下载医院对 每个病人生成的二维码,既可以实现电子病历查询和管理,又具有安全性和灵活性。通 过上到云空间上下载生成的二维码,使用手机摄像头对二维码进行扫描,即可以登录用 户电子信息中心,查看用户个人资料以及电子病历。 5.2 系统服务器端功能的实现与测试

服务器端由于是较为后台的管理员权限系统,所以用户名是 admin,密码也是 admin, 如图所示

PC 客户端医疗信息服务系统的界面选择主要有信息查询、选科室、排队取号以及退 出四大功能。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 68

图 5-11 登陆医院挂号系统界面 登陆进入后的欢迎界面

图 5-12 欢迎使用医院挂号系统界面 点击添加医生,新增加医生信息

图 5-13 添加医生界面暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 69

新增了内科 aa 医生。

对于系统由调职或者离职的医生,在此也可以删除多余的 aa 医生。

对应病人挂号客户端,医生挂号服务器端界面可以供选择的选项有医生信息管理、 用户管理、排诊表管理、管理挂号表、退出系统。 查询医生情况,进入议事管理界面: 图 5-14 医生管理界面 点击用户管理:

图 5-15 用户管理界面

添加新用户:暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 70

图 5-16 添加用户界面 查询医生排诊值班表: 图 5-17 用户排诊表界面 删除病人用户操作:

图 5-18 排诊删除界面暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 71

图 5-19 排诊表添加记录界面

测试可以进行点击添加和删除用户操作,在医生端界面对排诊记录进行删除。 图 5-20 排诊表记录删除界面

本系统是基于客户端和服务端相结合的管理系统:在服务端主要采用了MVC模式

搭建了后台框架,在前端部分用了 HTML 语言 CSS 架构和 JavaScript[45]标记语言三项前 端技术;在客户端采用了 Android 网络编程和整体的手机端的界面布局技术的编程处理 技术;手机客户端和网站服务端之间是以 JSON 传输数据。

个性化自动推送界面是本系统的特色之一:当客户多次登录并形成对医生的评价后, 可以对医生进行个性化推荐功能,例如客户以往是张三医生负责服务会诊的,客户对该 医生其评价不错,则下次登录界面则自动推荐张三医生给该客户,并可以形成一个病人 好友圈子,通过朋友圈子对医生的评价来参考自己下次选择需要的医生,这对医生服务

的提高和病人的就诊都是有好处的。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 72

图 5-21 医生推荐信息

通过病人手动输入信息,在病人信息和病历上可以作出相应的查询,通过病人输入

账号,完成[47]信息的更新,或者提示医院管理员进行相应的更新,医疗系统可以在挂号 中,进入其他界面信息的浏览,可以实现病人的用户体验,同时可以对逾期未到的病人 挂号记录进行自动清空。

通过数据连接,对数据进行更新。作出了如下的模块的测试:

医生查询模块功能:查询科室和自己的挂号结果,查询医生基本信息如个人专长, 从而选择适合自己的医生;

医疗挂号模块功能:通过查询医生信息后,对科室进行选择,确定选择符合自己的 医生进行挂号,并完成相应手续;

取消预约模块功能:在规定的时间内到达不了指定就诊医室,则进行提前的取消挂 号操作;

排诊查询模块功能:查询医院的排诊表,选定自己的就诊时间。 电子病历页面测试

接下来对电子病历页面进行测试,点击用户管理,再次返回用户管理页面:暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 73

图 5-22 用户管理的病历查询界面

点击查看病历按钮进行病历查询: 图 5-23 用户电子病历管理查询界面

本测试表明病人电子病历能正常显示,并能实现录入操作。 5.3 测试分析

根据以上测试用例进行的系统功能性检测正常,符合用户需求分析过程中提出的流

程需求,流程运转稳定可靠;测试的系统各触发动作功能正常稳定,符合用户使用标准。 系统符合功能性测试验收规定。通过实际使用,确实本系统操作简单,流程明确,界面 友好,使用方便,在多用户使用情况下没有对现有网络带宽造成压力,对网络流量没有

造成影响。使用该系统实现挂号信息的自动化,从而进一步提高医院办公和病人的看病暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 74

效率。系统涵盖了需求分析的全部业务功能,并进行了很好的实现,满足了其需求,功 能稳定,运行效率较好。

界面测试表明,系统界面友好,能够顺利与用户进行交互,并提供了完备的系统运 行提示及信息提示;通过业务流程测试,完成了数据的全过程,并通过了数据的测试, 系统能够顺利处理医院信息管理的业务,表现出了良好的效率和稳定性,满足了系统可 靠性要求。 5.4 本章小结

(1)界面满足了用户体验的设计

界面分隔简单朴素,使用简便方便用户使用,充分利用 Android 框架中 XML layout 进行布局。 (2)功能实现

用户登录和注册主要是客户端与用户类之间的关系,建立如下的功能需求:

医生查询模块功能:查询科室和自己的挂号结果,查询医生基本信息如个人专长, 从而选择适合自己的医生;

医疗挂号模块功能:通过查询医生信息后,对科室进行选择,确定选择符合自己的 医生进行挂号,并完成相应手续;

取消预约模块功能:在规定的时间内到达不了指定就诊医室,则进行提前的取消挂 号操作;

排诊查询模块功能:查询医院的排诊表,选定自己的就诊时间。

二维码模块功能:通过扫描二维码进行用户登录,使得医院能快速定位病人病情, 简化医院信息录入和查询操作;

(3)后台代码设计建立良好的程序结构,合理分层做到高内聚低耦合,使得程序的维 护部署,以及适应需求的变化,更易于实现。 (4)查询功能

实现系统的简单查询功能,通过科室查询和医生查询能显示出医生的具体信息。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 75

6 总结与展望 6.1 总结

本文通过分析现有医疗系统的特点,总结现有医疗系统的不足,阐述了医疗信息系 统对人们生活的作用,提出了设计医疗信息挂号系统的必要性,同时,根据现在人们的 生活习惯,分析了现有的流行的客户端,论证了 Android 客户端使用的普遍性和方便性, 分析了基于 Android 的医疗挂号系统的实用性和社会价值。服务器端使用了开源分布式 框架 Hadoop 中的分布式文件系统 HDFS,可以实现对服务器数据进行分布式处理和管理 的功能。

根据人们对医疗信息系统的心理需求,本文设计了医疗信息系统的功能。对系统的 服务器端进行了详细设计,包括患者角色设计、管理员角色设计、医生角色设计、处方 设计、患者挂号信息设计。同时对客户端进行了功能涉及,主要包括用户登录和注册模

块详细设计、病症信息查询模块详细设计、挂号模块、医生信息模块查询等。

通过构建 Android 开发平台,实现了设计的功能。针对各个模块进行分析,本文具体 工作如下:

一、本文分析了 MVC 模式在 Android 的应用以及各层之间功能作用,采用 MVC 分

层的设计模式和 UI 界面设置技术和 JSON 进行通信,并封装了一个网络会话模型。对系 统功能进行设计,主要包括病症查询、医院查询、挂号、专家查询、查看医生处方等功 能。在患者端子系统,以手机端信息浏览取代人工咨询模式,患者可以根据需求自行查 询相关信息。该系统通过二维码模块功能实现了可移动的信息录入与查询功能。简化患 者病历信息的管理,简化信息录入与查询环节的操作。

二、为了提高数据传输效率,通过使用 Apache 的 HttpClient 组件进行网络数据的 获取,该组件模拟实现了 HTTP 通信协议;综合比较各种传输方式,采用了 JSON 数 据格式作为数据封装,在数据传输上降低资源开销、获得较高的传输效率。

三、针对数据安全性和存储利用率问题,提出医疗云存储的方案,通过云存储文件 功能,利用二维码对电子病历进行管理和再现。通过比较分析,得出数据库安全性的分 析和建议。 四、为了达到系统服务器存储率的提升和负载均衡能力的优化,利用了 Hadoop 提暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 76

供的 HDFS 分布式文件系统,在 3 台机器上面搭建一个实验条件下的云存储系统,为 电子病历的存取提供充足的存储空间。

六、在医疗信息系统服务器中数据传输仍采用 JSON 格式,与 Android 移动终端共 用同一后台处理程序,达到系统的最优化设计。其次,服务器端介绍了 SSH 技术及相 关其他技术的实现,如 Struts2,Hibernate,Spring 以及相关技术的工作原理、层次结构。 系统布局上通过 HTML,CSS 和 JavaScript 技术实现页面的设计。

实验及运行结果表明,本文所开发的基于 Android 的医疗挂号系统,在以 Android 为平台的智能移动终端中运行稳定,在测试中达到了预期的效果,实现了可移动的信息 录入与查询功能,解决了医疗双方的需求,给医患双方带来便利。 6.2 展望

目前,通过本系统基本架构的搭建和功能的细化开发,医疗挂号信息系统的移动平

台版已经开发完成。对于在 Android 平台上运行的系统,由于受设备及实验条件等限制, 系统仍然存在一些问题有待完善:

一、本 Android 医疗系统未来可以根据私人医生需要进行个性化定制。可以增加一 些模块,例如急诊救护模块和私人医生上门服务模块、医生留言模块等。

二、未来的医院信息系统可以结合医院之前的 OA 办公系统以及医疗设备采购系统 进行二次开发融合。一方面可以使数据库更加健全,通用性更高,另一方面可以使医院 管理人员、医生和病人在处理医疗问题上更加方便。

三、进一步完备系统的数据库,对医疗云服务器性能做评估测试,方便未来对数据 进行挖掘分析。另外,仍需进一步开发云存储系统的图片传输功能模块,方便医院对病 人的体检图片进行上传和下载。

四、在系统数据库授权方面,本系统做到的只是初步的授权。日后需要针对各个医 院和地区的加盟进行统一管理,对每家医院分配一个权限,通过对云存储的数据库进行 基于一定权限下的共享和数据分析,为多家医院同时提供信息管理服务,这样做便于患

者的转院治疗和医院之间的合作治疗。暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 77

参考文献

[1]赵虹, 鲁五一.一种基于 XML 的电子病历的数据存储策略[J]. 企业技术开发,2007, 26(4),25-27.

[2]袁远.基于 Android 平台端到端即时通信系统的分析与设计[D].北京邮电大学,2012.

[3]Sung,Wen-Tsai; Chiang,Yen-Chun,Improved Particle Swarm Optimization Algorithm for

Android Medical Care IOT using Modified Parameters[J]. Journal of medical systems, 36(6):51-63.

[4]墨菲,李雪飞,吴明辉. Android开发入门教程[M].人民邮电出版社,2010.

[5]王世江,余志龙,陈立勋,郑名杰.Google Android SDK 开发范例大全[M].人民邮电出版 社,2011.

[6]D.Axmark, A.Larsson, M.Widenius.MySQL5.0 Reference Manual[J]. Sweden: MySQLAB, 2006: 82-163.

[7]邓凡平.深入理解 Android[M].机械工业出版社.2011.

[8]吴亚峰,索依娜等.Android 核心技术与实例详解[M]北京.电子工业出版社,2010. [9]谷歌 Android 开发指南[EB/OL].http://mobile.51cto.com/android-325229_1.htm,2012. [10]熊清飞.商业银行 B-S 结构应用双层负载均衡设计及实现[D].吉林大学,2010.

[11]谷方舟.云计算环境中分布式文件系统的负载均衡问题研究[D].北京交通大学,2012. [12]夏敏捷,.Net 框架中基于 Socket 的网络通信[J].福建电脑,2006,11,153-154.

[13]张建勋,古志民,郑超.云计算研究进展综述[J].计算机应用研究,2010, 27(2):429-433. [14]Andrus, Jeremy;Nieh, Jason,Teaching Operating Systems Using Android[J].43rd ACM Technical Symposium on Computer Science Education, 2012,43(2):89-91.

[15]熊志军.Android 在高校学生信息服务系统中的应用研究[D].南昌大学,2010. [16]高凯.Android 智能手机软件开发教程[M].国防工业出版社,2011.

[17] 姚 星 星 , 刘 卫 国 .Android 的 架 构 与 应 用 开 发 研 究 [J]. 计 算 机 系 统 应 用 ,2008, 17(11):110-112.

[18]Android 的平台架构及特性.http://www.admin10000.com/DocuMent/177.html, [EB/OL]. [19]Craig Walls ,Ryan Breidenbach .Spring in Action[M].2006.

[20]陈天河.Struts Hibernate Spring 集成开发宝典[M].电子工业出版社,2007.暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 78

[21]刘壮.基于 Spring+Hibemate 的开发方法研究及实例[D]吉林大学,2005. [22]李梅.基于负载均衡的 Ad Hoc 网络路由协议研究[D].暨南大学,2012. [23]MattRaible,SpringLive[J].Sourcebeat,2005,28(6):22-24.

[24]Rod Johunson,Juergen Holler, Alet Arendson,Thomas Risberg,ColinSamPaleanu,蒋培 译,Spring 框架高级编程[M].机械工业出版社, 2006.

[25]Rod Johnson.Beans, Bean Factory and the Application[Z].

http://www.springframWork.org/docs/reference/beans/html/beans-factory-clss, 2007.

[26]James Rumbaugh,Ivar Jacobson,Grady Booch,统一建模语言参考手册-基本概念[M].北 京:人民邮电出版社,2000.

[27]Wei Tang,Jun-hyung,Multi-Platform Mobile Thin Client Architecture in Cloud Environment[J].SciVerse Sciencedirect,2012,499-504.

[28]吴万春,梁珂.基于 XML 的电子病历存储管理系统的实现[J].医疗设备信息, 2007, 22 (7):24-26.

[29]王珊,萨师煊.数据库系统概论[M].北京:高等教育出版社,2006.

[30]Payet, Etienne; Spoto, Fausto,Static analysis of Android programs[J] INFORMATION AND SOFTWARE TECHNOLOGY ,54(11):55-58.

[31]马志强.基于 Android 平台即时通信系统的设计与实现[D].北京交通大学,2009. [32]陈露.门诊预约挂号系统应用实践探析[J]医学信息学杂志.2012,33(4):141-147. [33] Justin Couch.Java2 宝典[M].电子工业出版社, 2001.

[34]周锦煌,黄穗.一个基于 XML的电子病历系统模型的设计[J]. 计算机工程与应用, 2004 (21):216-219.

[35] Android 应用的结构[EB/OL].http://oxen.javaeye.com/blog/142123, 2007. [36]王超,梅尔.Android 2 高级编程[M].清华大学出版社, 2010.

[37]段琳.深入剖析 Android Activity[J].中国新技术新产品, 2011,16(4):24-33.

[38]高彩丽,许黎民等.Android 应用开发范例精解[M]. 清华大学出版社, 2012.

[39] 刘 平 .Android 手 机 访 问 服 务 器 的 一 种 数 据 交 互 方 法 [J]. 电 子 设 计 工 程 , 2010:18(9),122-125.

[40]Go,on,j.Almquist,N.Cramer,An eficient,scalable content based messaging system[A].

Proceedings of the Seventh 1EEE International Enterprise Distributed Object Computing 暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 79

Conference, 2003:278—285.

[41]Yang,Design and Implementation of Forensic Systems for Android Devices based

on Cloud Computing[J].APPLIE MATHEMATICS INFORMATION SCIENCES, 2012,28-35. [42]刘甫迎,刘炎.Android 移动编程实用教程[M].电子工业出版社,2012. [43]杨明羽. Android 语法范例参考大全[M].电子工业出版社, 2012. [44]马越.Android 的平台架构及特性[D].中国地质大学, 2008.

[45]李杨,冯刚,李亮等.基于 Android 的多媒体应用开发与研究[J].计算机与现代 化,2011(4):149-152.

[46]郭秀才,滕旭.基于二维码的暂住证管理系统总体设计[J].电脑编程技巧与维 护,2011(8):44-45.

[47]杨军,刘艳,杜彦蕊.关于二维码的研究和应用[J].应用技术,2011,29(11):11-12.

[48]郝晓春.车辆购置税二维条码申报系统的研究与设计[D].呼和浩特:内蒙古大学,2009. [49]耿胜恩.面向移动设备的园林导游平台的设计与实现[D].南昌大学,2008. [50]Shintaro Okazaki.Perceived Ubiquity in Mobile Services[J]. SciVerse Sciencedirect,2012:1-14.

[51]高静,段会川.JSON 数据传输效率研究[J].计算机工程与设计,2011,32(7):2267-2269. [52]高彩丽,许黎民等.Android 应用开发范例精解[M].清华大学出版社, 2012.

[53]D.Axmark,A.Larsson,M.Widenius,et al.MySQL5.0 Reference Manual[J].Sweden: MySQLAB, 2006: 82-163.

[54]Ian Gonton,An efficient scalable content based messaging system[A].Proceedings of the Seventh 1EEE International Enterprise Distributed Object Computing Conference. 2003:278-285.暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 80 附录

1. Android 功能实现

1)医院端登录的详细代码:

public class RegisterActivity extends Activity{ private EditText userName; //输入名称 private EditText password; //输入密码

private EditText secondPassword; //输入二次登录密码确认 private EditText trueName; //输入客户真名 private Button register; //注册按钮 private Button back; //返回退出

private Map userInfo = new HashMap(); //通过 Map 类队用户信息进行存储

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.register);

userName = (EditText) findViewById(R.id.registerUserName); password = (EditText) findViewById(R.id.registerUserPassword);

secondPassword = (EditText) findViewById(R.id.registerUserSecondPassword); trueName = (EditText) findViewById(R.id.registerUserTrueName);

register = (Button) findViewById(R.id.register); //登录按钮 back = (Button) findViewById(R.id.registerBack); //返回按钮 register.setOnClickListener(new OnClickListener() { public void onClick(View v) { //保存按钮的客户信息 userInfo.put(%userInfo.put(\

userInfo.put(\secondPassword.getText().toString()); 暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 81

userInfo.put(\

if (userInfo.get(\ //判定客户信息是否正确并作相应截取 userInfo.get(\ userInfo.get(\

Toast.makeText(RegisterActivity.this, \请将信息输入完整!\return ; }

if (!userInfo.get(\

Toast.makeText(RegisterActivity.this, \密码和确认密码不一致!\return ; } else { try {

String result = HttpUtil.postRequest(MyContants.BASE_URL + \

if (result == null || \

Toast.makeText(RegisterActivity.this, \登陆失败!请检查输入信息 和网络连接!\

//\登陆失败!请检查输入信息和网络连接!\的提示 return ; } else { }

} catch (Exception e) {

Toast.makeText(RegisterActivity.this, \登陆失败!请检查网络连接!\ 2).show();暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 82

e.printStackTrace(); return ; }

Toast.makeText(RegisterActivity.this, \注册成功!\ //Toast 返回一个注册成功界面 RegisterActivity.this.finish(); } } });

back.setOnClickListener(new OnClickListener() { public void onClick(View v) {

RegisterActivity.this.finish(); //登录退出

} }); } }

2)登录联网与数据库的操作代码 public class DaoUtil {

static String driver = \获取数据库连接

static String dbUrl = \连接数据库并对本地网址进 行连接

static String dbUser = \static String dbPassword = \

public static Connection getConnection(){ Connection conn = null; try {

Class.forName(driver);

conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword); 暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 83

//存储相应用户信息 } catch (Exception e) { e.printStackTrace(); }

return conn; }

public static Statement getStatement(Connection conn){ try {

return conn.createStatement(); // 返回 Statement 信息 } catch (SQLException e) { e.printStackTrace(); return null; } } }

2. 信息查询请求实现

1)Http 工具代码的设计作为连接和通信的关键,代码如下: public class HttpUtil { // Get 方法

public static String getRequest(String url) throws Exception{ System.out.println(\使用了 get\

HttpClient httpClient = new DefaultHttpClient(); HttpGet get = new HttpGet(url); // 创建 Get 对象 HttpResponse httpResponse = httpClient.execute(get); if (httpResponse.getStatusLine().getStatusCode() == 200){ //如果服务器成功返回响应

System.out.println(\成功\暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 84

String result = EntityUtils.toString(httpResponse.getEntity()); // 获取响应字符串 return result; }

return null; }

public static String postRequest(String url, Map rawParams) throws Exception { HttpClient httpClient = new DefaultHttpClient();

HttpPost post = new HttpPost(url); //创建 HttpPost 对象 System.out.println(url);

List params = new ArrayList(); for (String key : rawParams.keySet()){ //封装请求

params.add(new BasicNameValuePair(key, rawParams.get(key))); }

//设置请求参数

post.setEntity(new UrlEncodedFormEntity(params,\System.out.println(\

HttpResponse httpResponse = httpClient.execute(post); //发送 Post 请求 System.out.println(\

if (httpResponse.getStatusLine().getStatusCode() == 200){ //设置通信数据和通信码

String result = EntityUtils.toString(httpResponse.getEntity()); return result; }

Return null; } }

客户端[48]连接服务器进行信息查询是系统建立的基础[48]。以医生服务系统里病人病暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 85

历信息查询为例,说明系统查询请求的实现方式。 2)添加医生和相应排班

首先客户端进入病历信息查询界面,输入查询条件,判断查询语句是否为空,如果 为空,则对话框提示“请输入身份信息字符串”,判断代码如下: private boolean validate(){

String no = myEditText.getText().toString(); //从信息输入框获得身份信息字符串 if(no==null ||no.equals(\ //非空验证

showAlert(); //对话框提示 return false; }

return true; }

经过非空验证后,系统通过输入身份信息查询相关信息,客户端向服务器端发送 病人病历

信息查询请求,并等待获得反馈信息,代码如下: //通过身份证号查询基本信息 private String query(String id){

String queryString = \为身份证号

String url = HttpUtil.BASE_URL+\连接服务端 return HttpUtil.queryStringForPost(url); //返回查询结果 }

在调用后台程序进行信息查询时,用于实现查询功能的 SQL 语句为: String sql = \“+

“from patientinfotbl where id=? \对客户信息进行连接成 SQL 语言 挂号代码设计

spinner = (Spinner) findViewById(R.id.chooseMedicalSpinner);

okButton = (Button) findViewById(R.id.chooseMedicalInfoButton);暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 86

ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line,MyContants.classArray); // 把客户信息连接起来

spinner.setAdapter(arrayAdapter);

spinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){

public void onItemSelected(AdapterView arg0, View arg1, int arg2, long arg3) { type = MyContants.classArray[arg2]; arg0.setVisibility(View.VISIBLE); }

public void onNothingSelected(AdapterView arg0) }

(3)info.xml 的 UI 设计 XML 代码

android:gravity=\android:background=\

android:layout_width=\暨南大学硕士论文 基于 Android 平台医院医疗挂号系统 87

android:layout_height=\

Top