劉 欣
(桂林信息科技學(xué)院,廣西 桂林 541004)
日益增長的健康需求會導(dǎo)致患者就醫(yī)次數(shù)的增加?;颊呙看尉歪t(yī)都會產(chǎn)生相應(yīng)的醫(yī)療信息數(shù)據(jù)。醫(yī)療信息包含個人就醫(yī)時病癥檢查、醫(yī)囑、藥物使用以及各種非文本形式的信息(如心電圖、核磁共振圖等)。這些信息都會在就醫(yī)時記錄在病歷本或者電子病歷上。但是,不同醫(yī)院并不能共享這些信息數(shù)據(jù),患者去不同的醫(yī)院,無法準確提供歷史就醫(yī)信息。同時,醫(yī)療記錄包含了大量的個人敏感信息,使用文本或者醫(yī)院電子病歷容易丟失或泄露個人隱私。而且,由于不同醫(yī)院的醫(yī)科重點不同,一個患者可能會針對不同的病情選擇不同醫(yī)院進行診療。不同醫(yī)院所記錄的醫(yī)療信息是不共享的,有可能造成因歷史病情不明確而引起誤診的情況。
隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,移動互聯(lián)網(wǎng)已經(jīng)完全融入人們的生活,給人們生活帶來了極大的便利。許多人出門只帶一部手機,就能滿足生活的各種需求。如果將醫(yī)療信息在手機上展示,用戶能夠隨時隨地查看,就醫(yī)時也可以方便提供給醫(yī)生,這將對醫(yī)療行業(yè)的發(fā)展產(chǎn)生一定的促進作用[1]。
近年來,區(qū)塊鏈技術(shù)的出現(xiàn)為許多行業(yè)帶來了新的可能。區(qū)塊鏈在我國的發(fā)展范圍比較廣,在身份驗證、跨境支付、溯源防偽、車聯(lián)網(wǎng)及版權(quán)保護等不同領(lǐng)域都有一定的應(yīng)用。區(qū)塊鏈具有去中心化、不可偽造、不可虛構(gòu)、不可篡改等特點,這些特點非常適用于醫(yī)療信息在真實、穩(wěn)定、安全方面的需求[2]。
移動醫(yī)療系統(tǒng)設(shè)計的主要目的是安全地儲存患者的醫(yī)療數(shù)據(jù),同時方便用戶查看病歷。本系統(tǒng)采用區(qū)塊鏈技術(shù)存儲患者數(shù)據(jù),依靠區(qū)塊鏈的不可篡改特性,保障數(shù)據(jù)安全。為方便患者和醫(yī)生的操作,本系統(tǒng)在區(qū)塊鏈的基礎(chǔ)上設(shè)計上層應(yīng)用,提供Web 頁面供醫(yī)生上傳病歷數(shù)據(jù)、發(fā)布醫(yī)療相關(guān)新聞等,提供移動App 端供患者查看病歷,并且提供病癥初步自查的功能。
本系統(tǒng)采用的技術(shù)架構(gòu)為Spring Boot+Mybatis-Plus+Kafka+Dubbo+MySQL+Maven+JetPack。
Spring Boot 本身并不是一門技術(shù),而是一個框架。它更快、更敏捷地集成Spring 開發(fā)所需要的各種配置,大大降低了Spting 入門的難度。
Kafka 是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng)。它可以解耦系統(tǒng)的各個模塊,使用消息隊列的方式進行數(shù)據(jù)通信,非常適用于大并發(fā)量、高負荷的系統(tǒng)工作。
MySQL 是輕量級的關(guān)系型數(shù)據(jù)庫。本系統(tǒng)使用MySQL 數(shù)據(jù)庫存儲醫(yī)療信息外的非關(guān)鍵性數(shù)據(jù),以減輕區(qū)塊鏈的負擔。
Maven 是用于構(gòu)建和管理Java 項目的工具,其主要作用是對于Jar 的引用和項目的構(gòu)建。開發(fā)者只需要在pom.xml 文件中聲明groupId,artifactId以及version 等信息,Maven 將自動下載配置好對應(yīng)版本的Jar 包。
Dubbo 是一個分布式服務(wù)框架,主要用于遠程通信,是目前主流的微服務(wù)框架。Zookeeper 是一個分布式的、開放源碼的分布式應(yīng)用程序,提供協(xié)調(diào)服務(wù)。它提供的服務(wù)包括配置維護、域名服務(wù)、分布式同步及組服務(wù)等。Zookeeper 適合作為Dubbo注冊中心發(fā)布服務(wù)。
Jetpack 是Google 官方發(fā)布的一個基于Android的組件架構(gòu)庫。它是一個由多個庫組成的套件,可幫助開發(fā)者遵循最佳做法,減少樣板代碼并編寫可在各種Android 版本和設(shè)備中一致運行的代碼,輕松地處理由Android 版本不一致和設(shè)備不同產(chǎn)生的差異性和兼容性問題[3]。此類庫包含界面導(dǎo)航、分頁、數(shù)據(jù)綁定、視圖綁定及生命周期等。Android Jetpack 用于管理各種煩瑣的操作進程,如后臺任務(wù)、導(dǎo)航及生命周期管理等。
本系統(tǒng)分為底層和應(yīng)用層兩部分。底層主要為區(qū)塊鏈部分,用于存儲重要的醫(yī)療數(shù)據(jù);應(yīng)用層主要為Web 系統(tǒng)和App,方便醫(yī)生上傳數(shù)據(jù),病人查看數(shù)據(jù)。
使用Merkle Tree 作為區(qū)塊鏈的數(shù)據(jù)結(jié)構(gòu),可以快速歸納和檢驗區(qū)塊數(shù)據(jù)的存在性和完整性。需要構(gòu)建出一顆二叉樹,將區(qū)塊中的消息作為二叉樹的葉節(jié)點,根節(jié)點存放樹的Hash 值。由此,只需檢驗根節(jié)點Hash 值是否匹配即可檢驗消息是否被篡改。
區(qū)塊鏈由多個區(qū)塊相互鏈接而成,數(shù)據(jù)主要存儲在區(qū)塊中,區(qū)塊鏈中的第一個區(qū)塊稱為創(chuàng)世區(qū)塊。所以,要完成區(qū)塊鏈的設(shè)計首先需要設(shè)計好區(qū)塊。區(qū)塊包含了區(qū)塊頭、區(qū)塊體、區(qū)塊Hash 值三部分。其中,區(qū)塊頭用來存放版本號、父區(qū)塊Hash 值等數(shù)據(jù),區(qū)塊體存放消息數(shù)組Merkle Tree,區(qū)塊Hash 值使用Pow 共識算法進行計算得出具體值[4]。區(qū)塊鏈使用時需要滿足消息傳輸功能,一方面需要與應(yīng)用層相互通信,另一方面區(qū)塊鏈網(wǎng)絡(luò)中其他節(jié)點發(fā)出請求時需要處理響應(yīng)請求。
基于區(qū)塊鏈技術(shù)設(shè)計醫(yī)療系統(tǒng),主要是為了保證數(shù)據(jù)的可靠性和安全性,使得查詢出的數(shù)據(jù)能夠被人信任,解決跨機構(gòu)的信任危機。區(qū)塊鏈處于系統(tǒng)底層部分,主要實現(xiàn)構(gòu)建與通信的功能。
應(yīng)用層分為Web 端與App 端。Web 端主要管理醫(yī)生信息、醫(yī)院科室信息以及病歷信息。App 端用于查看病歷信息、瀏覽新聞以及查看、修改個人信息等。
本系統(tǒng)設(shè)計出一套區(qū)塊結(jié)構(gòu)用來存儲數(shù)據(jù),同時也方便查詢數(shù)據(jù)。大體思路如下:首先設(shè)計出消息類Message 用來在Kafka 中傳遞和接收消息,再設(shè)計出節(jié)點類MessageNode 來存儲Message 數(shù)據(jù),根據(jù)多個MessageNode,構(gòu)建出一顆Merkle 樹,然后填充區(qū)塊,最后將區(qū)塊加到區(qū)塊鏈中。
本系統(tǒng)應(yīng)用層主要由用戶端App 和醫(yī)生端Web 管理后臺兩個部分組成。App 端包含注冊登錄、查看病歷、瀏覽新聞及管理個人信息等功能[5]。Web 端包含注冊登錄、新增病歷、病歷列表及發(fā)布新聞等功能。若Web 端賬號權(quán)限為管理員,則具有科室管理和醫(yī)生管理等權(quán)限。
醫(yī)生在應(yīng)用層上傳病歷信息,用戶或者醫(yī)生也可以在應(yīng)用層查看病歷信息,而病歷信息作為核心數(shù)據(jù),保存在區(qū)塊鏈層。由于應(yīng)用層與區(qū)塊鏈層分屬不同的服務(wù),無法像普通數(shù)據(jù)庫一樣對數(shù)據(jù)進行直接操作。本系統(tǒng)采用Kafka 和Dubbo 技術(shù)解決跨服務(wù)通信問題。為保證數(shù)據(jù)的安全性,本系統(tǒng)還采用了RSA 加密方式對傳輸?shù)男畔⑦M行加密。應(yīng)用層把加密信息通過Kafka 傳遞給區(qū)塊鏈,區(qū)塊鏈接收到信息后進行解密與校驗。應(yīng)用層需要查詢病歷信息時,使用Dubbo技術(shù)從區(qū)塊鏈中獲取數(shù)據(jù)。應(yīng)用層查詢病歷信息時的泳道圖如圖1 所示。
圖1 應(yīng)用層與區(qū)塊鏈病歷查詢泳道圖
系統(tǒng)會為醫(yī)院管理員提供專用的管理賬號,由管理員為醫(yī)院醫(yī)生創(chuàng)建個人賬號。醫(yī)生主要擁有新聞管理、病歷管理及個人信息模塊。管理員在此基礎(chǔ)上還擁有醫(yī)生管理和科室分類模塊。管理員登錄成功后的系統(tǒng)界面如圖2 所示。
圖2 管理員功能界面圖
4.1.1 新聞管理功能
新聞管理模塊主要用于醫(yī)生發(fā)布與醫(yī)療相關(guān)的信息,如某疾病的病理、養(yǎng)生知識及藥物使用規(guī)范等,主要用于宣傳醫(yī)療常識。醫(yī)生在新聞管理頁面可以編輯新聞標題,并使用富文本框編輯新聞內(nèi)容,編輯完成后提交到后臺數(shù)據(jù)庫。若用戶具有管理員權(quán)限,可以為新聞設(shè)置推薦,被推薦的新聞將在用戶App 中優(yōu)先展示。
4.1.2 病歷管理
病歷管理主要包括病歷列表和新增病歷兩個功能。
(1)病歷列表。醫(yī)生可以輸入患者的身份證號進行病歷查詢,查詢結(jié)果將以列表形式展現(xiàn)在頁面中。由于病歷信息存在于區(qū)塊鏈中,所以當頁面將數(shù)據(jù)提交給服務(wù)器時,服務(wù)器通過Dubbo 調(diào)用區(qū)塊鏈服務(wù),在區(qū)塊鏈中進行數(shù)據(jù)查詢,最終將查詢到的結(jié)果返回至應(yīng)用層進行展示。
(2)新增病歷。患者就醫(yī)會產(chǎn)生醫(yī)療信息,醫(yī)療信息由醫(yī)生導(dǎo)入到系統(tǒng)中。醫(yī)生需要將患者的身份證號與醫(yī)療信息進行綁定。新增病歷頁面包含病情標題、病情詳細描述,同時還能上傳圖片。由于病歷信息需要存儲于區(qū)塊鏈中,系統(tǒng)會將所有數(shù)據(jù)打包加密發(fā)送給Kafka。區(qū)塊鏈通過Kafka 接收信息,并對信息進行解密和驗證[6]。
4.1.3 醫(yī)生管理
醫(yī)生并不能直接注冊賬號,需要醫(yī)院管理員為其創(chuàng)建賬號。醫(yī)生管理模塊有醫(yī)生列表、新增醫(yī)生信息、修改醫(yī)生信息、刪除醫(yī)生信息等功能。醫(yī)生信息主要包含工號、所屬科室、賬號、密碼及身份證號等。
4.1.4 科室分類
每個醫(yī)院都會有不同的科室,科室分類主要用于管理醫(yī)院的科室。該模塊有科室列表、新增科室、修改科室及刪除科室等功能。
4.1.5 個人中心
用戶可以從主頁中的頭像處進入個人中心。個人中心包含工號、科室、身份證號等由管理員管理且不可更改的信息,同時包含頭像、姓名、手機號、郵箱及個人簽名等可以自主修改的信息。
系統(tǒng)提供基于Jetpack 框架開發(fā)的App 端。App 主頁主要分為搜索推薦區(qū)、功能區(qū)以及新聞區(qū)三部分。主體頁面使用RecyclerView 進行布局,其中搜索推薦區(qū)和功能區(qū)以HeadView 的形式嵌入滑動列表。功能區(qū)為了預(yù)留新功能位置,也設(shè)計為RecyclerView 的網(wǎng)格布局類型[7]。用戶可以在App端查看自己的病歷信息,同時可以瀏覽新聞、自查病癥。App 端主界面如圖3 所示。
圖3 App 主界面
4.2.1 注冊登錄
用戶可輸入賬號密碼進行注冊,系統(tǒng)將判斷此用戶是否存在。若用戶已存在則用Toast 消息告知用戶;若不存在,系統(tǒng)將提示用戶注冊成功,同時將注冊的賬號密碼攜帶跳轉(zhuǎn)至登錄頁面,并且自動填入輸入框。
用戶點擊登錄時,系統(tǒng)會判斷賬號密碼是否正確,若錯誤則給出提示;若正確,系統(tǒng)將記錄后臺返回的uid。用戶下次使用此App 時,系統(tǒng)將判斷uid是否被記錄,若有記錄則自動進入系統(tǒng),無需再次登錄。
4.2.2 新聞模塊
App 以輪播圖的形式展示醫(yī)院推薦的新聞,同時其余的新聞會以列表的形式放在頁面下方供用戶滑動查看。當用戶點擊新聞時會進入新聞詳情頁。
4.2.3 病歷查詢
用戶可以在此系統(tǒng)查詢自己的病歷,但是使用之前必須進入個人中心進行實名認證。查詢到病歷信息后,界面將病歷以列表的形式展示,用戶點擊列表項,可以展開詳細的病歷信息[8]。
4.2.4 病癥自查
用戶在搜索框中輸入關(guān)鍵字,系統(tǒng)將會在新聞中根據(jù)關(guān)鍵字進行模糊搜索。用戶可以查看搜索結(jié)果,對病癥有一個初步的判斷。
4.2.5 個人中心
用戶可以在個人中心設(shè)置自己的頭像、昵稱及手機號等信息,并且可以修改密碼。而且,用戶必須在此模塊進行實名認證,才能進行病歷查詢。
本文從數(shù)據(jù)安全、操作簡單、使用方便的角度出發(fā),為醫(yī)療體系建立一套可行性高的醫(yī)療數(shù)據(jù)存儲系統(tǒng)。醫(yī)療數(shù)據(jù)的安全、可靠是所有患者關(guān)注的重點。本系統(tǒng)利用區(qū)塊鏈的去中心化和不可篡改性,在很大程度上杜絕了人為修改醫(yī)療信息的可能性。