唐紀權(quán) 劉濤 張輝
摘要:隨著寬帶無線接入技術(shù)的普及和智能終端硬件性能的不斷提高,人們迫切希望利用移動設(shè)備方便地從互聯(lián)網(wǎng)獲取信息和服務(wù)。課題針對南京邦德骨科醫(yī)院的實際需求,以骨科患者為服務(wù)對象,采用B/S與C/S的混合架構(gòu),設(shè)計并開發(fā)了面向Android平臺的專家預(yù)約系統(tǒng)。實現(xiàn)了新聞更新、路線導(dǎo)航、檔案存儲、預(yù)約掛號等功能,并在不同的設(shè)備上安裝并測試通過。在方便患者的同時,提高了醫(yī)院的知名度、導(dǎo)醫(yī)的辦事效率,具有較好的實用價值。
關(guān)鍵詞:醫(yī)院專家預(yù)約;Android;數(shù)據(jù)庫;服務(wù)器;客戶端
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2014)36-8666-03
目前,各類基于Web的預(yù)約系統(tǒng)已不能滿足用戶需求,開發(fā)手機客戶端成了一個必然的趨勢。針對南京邦德骨科醫(yī)院實際需求。設(shè)計并開發(fā)專家預(yù)約系統(tǒng),實現(xiàn)新聞更新、路線導(dǎo)航、檔案存儲、預(yù)約掛號等功能,讓患者可以通過預(yù)約系統(tǒng)把準確地搜索到醫(yī)院地址、交通路線和快速撥號預(yù)約。在具備傳統(tǒng)Web專家預(yù)約掛號系統(tǒng)的已有功能的同時,增添了手持設(shè)備特有的定位功能。
1 Android應(yīng)用的構(gòu)成和工作流程
Android應(yīng)用程序一般由Activity、IntentReceiver、Service、ContentProvider四部分組成,具體使用時需要在配置文件AndroidManifest.xml中進行參數(shù)配置。Android應(yīng)用的構(gòu)成和工作流程如圖1所示。
2 系統(tǒng)的解決方案
通過GPRS/3G網(wǎng)絡(luò),將需要的數(shù)據(jù)請求傳送到專家預(yù)約系統(tǒng)服務(wù)器端。服務(wù)器端程序通過數(shù)據(jù)協(xié)議接口與存儲管理系統(tǒng)數(shù)據(jù)通訊,將手機客戶端的數(shù)據(jù)請求傳遞給存儲管理系統(tǒng)??蛻舳说玫筋A(yù)約服務(wù)器數(shù)據(jù)流后,按要求顯示獲得的數(shù)據(jù)。由此,構(gòu)建基于Android的南京邦德骨科醫(yī)院專家預(yù)約系統(tǒng)解決方案,系統(tǒng)功能結(jié)構(gòu)如圖2所示。
3 系統(tǒng)功能總體設(shè)計
系統(tǒng)設(shè)置了三種用戶:專家、系統(tǒng)管理員、病人,專家和系統(tǒng)管理員可以在系統(tǒng)運行時間內(nèi),登錄的專家預(yù)約系統(tǒng)后臺網(wǎng)站。專家可以查看病人預(yù)約信息,負責(zé)病人的檔案添加,與病人在線文字對話。管理員可以導(dǎo)入、添加、修改部分數(shù)據(jù)信息,包括醫(yī)院動態(tài)、骨科專家、特色診療、個人檔案、疾病導(dǎo)航、在線咨詢、就醫(yī)指南等。病人可以瀏覽系統(tǒng)的可視信息資源,注冊個人檔案帳號,對預(yù)約信息進行添加和修改。
4 系統(tǒng)設(shè)計
4.1 業(yè)務(wù)流程圖
業(yè)務(wù)流程主要從系統(tǒng)的管理和用戶的使用這兩個方面來介紹。用戶使用分為Web客戶端和Android客戶端兩個部分,系統(tǒng)管理分為總的后臺系統(tǒng)管理和后臺Web端管理。專家預(yù)約系統(tǒng)的業(yè)務(wù)流程如圖3所示。
圖3 專家預(yù)約系統(tǒng)業(yè)務(wù)流程圖
4.2 數(shù)據(jù)庫設(shè)計
系統(tǒng)使用My SQL設(shè)計數(shù)據(jù)庫,主要有9張表:功能管理信息表、登錄信息表、疾病導(dǎo)航表、新聞更新表、專家信息表、個人檔案信息表、預(yù)約掛號信息表、后臺角色信息表、各級管理員信息表。
5 客戶端功能設(shè)計
采用MVC(模型-視圖-控制器)模式,模型負責(zé)整個解決方案的業(yè)務(wù)邏輯實現(xiàn),底層的數(shù)據(jù)庫也由模型訪問和操作;視圖負責(zé)系統(tǒng)向用戶的展示,主要由HTML及JSP等完成;控制器負責(zé)用戶界面和業(yè)務(wù)邏輯層的通信控制,一方面解釋來自用戶界面的輸入,識別用戶動作(如點擊按鈕等),調(diào)用相應(yīng)模型中的方法,另一方面處理來自模型的事件和返回的執(zhí)行結(jié)果,調(diào)用適當(dāng)?shù)囊晥D顯示給用戶,控制器主要由Servlet完成。
5.1 UI設(shè)計
系統(tǒng)主界面為滿足病人需求,通過友好、智能、方便的導(dǎo)航界面向用戶展示系統(tǒng)的各項功能。主界面使用線性布局,每個功能模塊通過圖標+名稱的方式展現(xiàn)。在res\layout\路徑下創(chuàng)建mainscreen.xml布局文件,采用GridView控件布局9個功能模塊,2個EditText控件實現(xiàn)個人檔案模塊的登錄,使用Button按鈕實現(xiàn)登錄及重置功能。主界面UI設(shè)計如圖4所示。
主界面作為導(dǎo)航菜單,在完成布局后,還要實現(xiàn)界面的跳轉(zhuǎn)。在Src路徑下建立MainActivity.java文件,通過setContentView(R.layout.mainscreen)語句將其與布局文件聯(lián)系起來,為布局文件中的控件設(shè)置監(jiān)聽事件,完成界面之間的跳轉(zhuǎn)。跳轉(zhuǎn)導(dǎo)航代碼如下所示:
Intent introduct = new Intent(MainActivity.this, IntroductActivity.class);
startActivity(introduct);//跳轉(zhuǎn)到醫(yī)院簡介的Activity
break;
case 1: //醫(yī)院動態(tài)
…… //跳轉(zhuǎn)到醫(yī)院動態(tài)界面
break;
case 2: //骨科專家
…… //跳轉(zhuǎn)到骨科專家界面
break;
case 3: //特色診療
…… //跳轉(zhuǎn)到特色診療界面
break;
……
}
}
Activity中的任務(wù)是與用戶交互的一組Activity集合,Activity會被按打開順序安排在一個堆棧里。系統(tǒng)中含有多個Activity,其中會有一個在啟動的時候第一個呈現(xiàn)給用戶。
5.2 鏈接服務(wù)器請求
系統(tǒng)需要在客戶端和醫(yī)療應(yīng)用服務(wù)器之間進行通信信息交互,實現(xiàn)數(shù)據(jù)交換和Android客戶端結(jié)果的返回。
Android 要訪問遠程MySQL數(shù)據(jù)庫,先要利用HTTP協(xié)議發(fā)送Request 請求給后臺Web服務(wù)器,Web服務(wù)器端JAVA根據(jù)請求訪問MySQL數(shù)據(jù)庫服務(wù)器,并把讀取的數(shù)據(jù)庫內(nèi)容封裝或?qū)蛻舳说捻憫?yīng)封裝成JSON格式,通過HTTP協(xié)議回傳給Android終端,Android終端再對JSON解析,并進行相關(guān)的UI 處理,該過程如圖5所示[7]。
圖5 基于JSON的數(shù)據(jù)交換過程
5.3 服務(wù)端功能設(shè)計
1) 表現(xiàn)層:使用JSP頁面用于顯示系統(tǒng)界面與用戶交互,項目下的Content目錄用于存放相應(yīng)的JSP文件,CSS文件夾用于存放樣式文件,Img文件夾用于存放項目圖片。
2) 模型層:用JavaBean作為模型,在項目下的Entity文件夾下。用于抽象現(xiàn)實工作中的種種問題,例如專家添加、信息更新等問題。
3) 控制層:使用Struts2作為控制層,Struts2的Action是用來控制調(diào)用哪個頁面的,以及怎么獲取數(shù)據(jù)[8]。在項目下的Web文件夾下以Action結(jié)尾的JAVA文件命名保存。
6 系統(tǒng)實現(xiàn)
6.1 系統(tǒng)服務(wù)端功能的實現(xiàn)
6.1.1對數(shù)據(jù)庫操作
try{
// 調(diào)用JdbcUtils類的getConnection方法連接數(shù)據(jù)庫
conn=JdbcUtils.getConnection();
// 添加數(shù)據(jù)庫的sql語句
String sql="insert into t_profile(id,tel,ke,doctor,name,sex,age,unit,address,diagnosis,opinion,data) values(?,?,?,?,?,?,?,?,?,?,?)"; // 拼接數(shù)據(jù)庫查詢語句
pstm=conn.prepareStatement(sql);
pstm.setInt(1, profile.getId()); //設(shè)置id
pstm.setString(2,profile.getKe()); //設(shè)置科目
pstm.setString(3, profile.getDoctor()); //設(shè)置醫(yī)生
……
pstm.executeUpdate(); //提交pstm對象
}catch(Exception e){
e.printStackTrace();
}finally{
try {
JdbcUtils.release(rs, pstm, conn); //關(guān)閉數(shù)據(jù)庫連接
} catch (Exception e) {
e.printStackTrace(); //打印錯誤信息
}}}
6.1.2 Struts2的配置文件Struts.xml
<!—使用通配符的方式配置Action跳轉(zhuǎn)路徑—>
<!—傳統(tǒng)json格式的數(shù)據(jù)—>
6.2系統(tǒng)客戶端功能的實現(xiàn)
6.2.1系統(tǒng)開始界面實現(xiàn)
Android生成屏幕有三種方式:xml配置生成,通過用戶界面接口生成,直接用代碼生成。根據(jù)MVC原則,UI應(yīng)該與程序邏輯相分離。因此,系統(tǒng)在XML中定義UI結(jié)構(gòu)。此外,一個程序從一個屏幕方案調(diào)整到另一個采用Android應(yīng)用程序的基礎(chǔ)功能單元Activity(android.app.Activity類中的一個對象)實現(xiàn)。復(fù)雜操作在線程中完成,代碼如下所示:
class MyThread implements Runnable {
@Override
public void run() {
service = new UpdataInfoService(SplashActivity.this);
try {
Thread.sleep(2000); //進程休眠2秒
UpdataInfo updataInfo = service.getUpdataInfo(R.string.updataurl);
Message msg = new Message(); //定義數(shù)據(jù)封裝包
Bundle bundle = new Bundle(); //定義數(shù)據(jù)結(jié)構(gòu)
bundle.putSerializable("updataInfo", updataInfo);
msg.setData(bundle);
Message msg = Message.obtain();
msg.obj = updataInfo;
SplashActivity.this.myHandler.sendMessage(msg);
}
…
};
6.2.2 加載文件類
在UI線程中創(chuàng)建一個Handler(處理后臺進程返回數(shù)據(jù)),負責(zé)處理和綁定到該Handler的線程中的Message(存儲bundle等數(shù)據(jù)格式)。每一個Handler都必須關(guān)聯(lián)一個Looper(不停循環(huán)的遍歷隊列將符合條件的Message一個個的拿出來交給handler進行處理),并且兩者是一一對應(yīng)的。Looper負責(zé)從其內(nèi)部的MessageQueue(存儲從后臺進程中拋回的和當(dāng)前handler綁定的message一個隊列)中拿出一個個Message給Handler進行處理。系統(tǒng)Handler在UI線程中實現(xiàn),經(jīng)過Handler、Message機制,最終返回到UI線程中。
……
URL url = new URL(path); //獲取服務(wù)器路徑
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET"); //以get方式連接服務(wù)器
conn.setConnectTimeout(5000); //連接超時時間為5秒
if(conn.getResponseCode() == 200){ //判斷是否成功連接
int total = conn.getContentLength(); //得到連接字符數(shù)量
pd.setMax(total);
InputStream is = conn.getInputStream();//得到輸入流
File file = new File(filepath); //下載路徑
FileOutputStream fos = new FileOutputStream(file);//得到輸出流
byte[] buffer = new byte[1024];
int len = 0;
int process = 0;
while((len=is.read(buffer)) != -1){ //循環(huán)輸出
fos.write(buffer, 0, len);
process+=len;
pd.setProgress(process);
Thread.sleep(50); //讓線程睡眠
} ……
}
7 結(jié)束語
通過分析傳統(tǒng)Web端專家預(yù)約系統(tǒng)的運營方式,總結(jié)其中的不足,設(shè)計并開發(fā)基于移動智能客戶端的專家預(yù)約系統(tǒng),彌補了傳統(tǒng)Web應(yīng)用的眾多限制。能夠滿足人們的生活習(xí)慣和應(yīng)用需求,具有較好的應(yīng)用前景。
參考文獻:
[1] ZHANG Hong.Study on Management System for Agricultural Sci-tech Achievement Transformation Funding Project[J].Asian Agricultural Research,2013(1).
[2] Wu Hong, Li Yulong.Analysis of an Evaporator-condenser-separated Mechanical Vapor Compression System [J].Journal of Thermal Science,2013(2).
[3] LIU HouLin,WANG Kai.Experimental investigation of the unsteady flow in a double-blade centrifugal pump impeller[J]. Science China(Technological Sciences,2013(4).
[4] 聞剛.淺論視覺傳達效能在手機UI設(shè)計中的應(yīng)用[J].劍南文學(xué):經(jīng)典教苑,2013(2).
[5] 田智文.手機UI界面設(shè)計的人性設(shè)計[J].藝術(shù)科技,2013(10).
[6] 裴佳迪,馬超,孫仁貴.Android應(yīng)用開發(fā)全程實錄[M].北京:人民郵電出版社,2012.
[7] 龔成瑩,邢敬宏.基于JSON的Android移動終端與PHP及MySQL數(shù)據(jù)通信[J].工業(yè)儀表與自動化裝置,2013(1).
[8] 吳大勇,鄭紫微.基于Android平臺的訪問權(quán)限機制優(yōu)化方案[J].計算機工程,2013(5).endprint
msg.obj = updataInfo;
SplashActivity.this.myHandler.sendMessage(msg);
}
…
};
6.2.2 加載文件類
在UI線程中創(chuàng)建一個Handler(處理后臺進程返回數(shù)據(jù)),負責(zé)處理和綁定到該Handler的線程中的Message(存儲bundle等數(shù)據(jù)格式)。每一個Handler都必須關(guān)聯(lián)一個Looper(不停循環(huán)的遍歷隊列將符合條件的Message一個個的拿出來交給handler進行處理),并且兩者是一一對應(yīng)的。Looper負責(zé)從其內(nèi)部的MessageQueue(存儲從后臺進程中拋回的和當(dāng)前handler綁定的message一個隊列)中拿出一個個Message給Handler進行處理。系統(tǒng)Handler在UI線程中實現(xiàn),經(jīng)過Handler、Message機制,最終返回到UI線程中。
……
URL url = new URL(path); //獲取服務(wù)器路徑
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET"); //以get方式連接服務(wù)器
conn.setConnectTimeout(5000); //連接超時時間為5秒
if(conn.getResponseCode() == 200){ //判斷是否成功連接
int total = conn.getContentLength(); //得到連接字符數(shù)量
pd.setMax(total);
InputStream is = conn.getInputStream();//得到輸入流
File file = new File(filepath); //下載路徑
FileOutputStream fos = new FileOutputStream(file);//得到輸出流
byte[] buffer = new byte[1024];
int len = 0;
int process = 0;
while((len=is.read(buffer)) != -1){ //循環(huán)輸出
fos.write(buffer, 0, len);
process+=len;
pd.setProgress(process);
Thread.sleep(50); //讓線程睡眠
} ……
}
7 結(jié)束語
通過分析傳統(tǒng)Web端專家預(yù)約系統(tǒng)的運營方式,總結(jié)其中的不足,設(shè)計并開發(fā)基于移動智能客戶端的專家預(yù)約系統(tǒng),彌補了傳統(tǒng)Web應(yīng)用的眾多限制。能夠滿足人們的生活習(xí)慣和應(yīng)用需求,具有較好的應(yīng)用前景。
參考文獻:
[1] ZHANG Hong.Study on Management System for Agricultural Sci-tech Achievement Transformation Funding Project[J].Asian Agricultural Research,2013(1).
[2] Wu Hong, Li Yulong.Analysis of an Evaporator-condenser-separated Mechanical Vapor Compression System [J].Journal of Thermal Science,2013(2).
[3] LIU HouLin,WANG Kai.Experimental investigation of the unsteady flow in a double-blade centrifugal pump impeller[J]. Science China(Technological Sciences,2013(4).
[4] 聞剛.淺論視覺傳達效能在手機UI設(shè)計中的應(yīng)用[J].劍南文學(xué):經(jīng)典教苑,2013(2).
[5] 田智文.手機UI界面設(shè)計的人性設(shè)計[J].藝術(shù)科技,2013(10).
[6] 裴佳迪,馬超,孫仁貴.Android應(yīng)用開發(fā)全程實錄[M].北京:人民郵電出版社,2012.
[7] 龔成瑩,邢敬宏.基于JSON的Android移動終端與PHP及MySQL數(shù)據(jù)通信[J].工業(yè)儀表與自動化裝置,2013(1).
[8] 吳大勇,鄭紫微.基于Android平臺的訪問權(quán)限機制優(yōu)化方案[J].計算機工程,2013(5).endprint
msg.obj = updataInfo;
SplashActivity.this.myHandler.sendMessage(msg);
}
…
};
6.2.2 加載文件類
在UI線程中創(chuàng)建一個Handler(處理后臺進程返回數(shù)據(jù)),負責(zé)處理和綁定到該Handler的線程中的Message(存儲bundle等數(shù)據(jù)格式)。每一個Handler都必須關(guān)聯(lián)一個Looper(不停循環(huán)的遍歷隊列將符合條件的Message一個個的拿出來交給handler進行處理),并且兩者是一一對應(yīng)的。Looper負責(zé)從其內(nèi)部的MessageQueue(存儲從后臺進程中拋回的和當(dāng)前handler綁定的message一個隊列)中拿出一個個Message給Handler進行處理。系統(tǒng)Handler在UI線程中實現(xiàn),經(jīng)過Handler、Message機制,最終返回到UI線程中。
……
URL url = new URL(path); //獲取服務(wù)器路徑
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET"); //以get方式連接服務(wù)器
conn.setConnectTimeout(5000); //連接超時時間為5秒
if(conn.getResponseCode() == 200){ //判斷是否成功連接
int total = conn.getContentLength(); //得到連接字符數(shù)量
pd.setMax(total);
InputStream is = conn.getInputStream();//得到輸入流
File file = new File(filepath); //下載路徑
FileOutputStream fos = new FileOutputStream(file);//得到輸出流
byte[] buffer = new byte[1024];
int len = 0;
int process = 0;
while((len=is.read(buffer)) != -1){ //循環(huán)輸出
fos.write(buffer, 0, len);
process+=len;
pd.setProgress(process);
Thread.sleep(50); //讓線程睡眠
} ……
}
7 結(jié)束語
通過分析傳統(tǒng)Web端專家預(yù)約系統(tǒng)的運營方式,總結(jié)其中的不足,設(shè)計并開發(fā)基于移動智能客戶端的專家預(yù)約系統(tǒng),彌補了傳統(tǒng)Web應(yīng)用的眾多限制。能夠滿足人們的生活習(xí)慣和應(yīng)用需求,具有較好的應(yīng)用前景。
參考文獻:
[1] ZHANG Hong.Study on Management System for Agricultural Sci-tech Achievement Transformation Funding Project[J].Asian Agricultural Research,2013(1).
[2] Wu Hong, Li Yulong.Analysis of an Evaporator-condenser-separated Mechanical Vapor Compression System [J].Journal of Thermal Science,2013(2).
[3] LIU HouLin,WANG Kai.Experimental investigation of the unsteady flow in a double-blade centrifugal pump impeller[J]. Science China(Technological Sciences,2013(4).
[4] 聞剛.淺論視覺傳達效能在手機UI設(shè)計中的應(yīng)用[J].劍南文學(xué):經(jīng)典教苑,2013(2).
[5] 田智文.手機UI界面設(shè)計的人性設(shè)計[J].藝術(shù)科技,2013(10).
[6] 裴佳迪,馬超,孫仁貴.Android應(yīng)用開發(fā)全程實錄[M].北京:人民郵電出版社,2012.
[7] 龔成瑩,邢敬宏.基于JSON的Android移動終端與PHP及MySQL數(shù)據(jù)通信[J].工業(yè)儀表與自動化裝置,2013(1).
[8] 吳大勇,鄭紫微.基于Android平臺的訪問權(quán)限機制優(yōu)化方案[J].計算機工程,2013(5).endprint