基于JSP的網(wǎng)上處方跟蹤系統(tǒng)(完整資料)_第1頁
基于JSP的網(wǎng)上處方跟蹤系統(tǒng)(完整資料)_第2頁
基于JSP的網(wǎng)上處方跟蹤系統(tǒng)(完整資料)_第3頁
基于JSP的網(wǎng)上處方跟蹤系統(tǒng)(完整資料)_第4頁
基于JSP的網(wǎng)上處方跟蹤系統(tǒng)(完整資料)_第5頁
已閱讀5頁,還剩143頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

基于JSP的網(wǎng)上處方跟蹤系統(tǒng)(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)

基于JSP的網(wǎng)上處方跟蹤系統(tǒng)(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)長(zhǎng)沙理工大學(xué)《軟件工程綜合課程設(shè)計(jì)》報(bào)告基于JSP的網(wǎng)上處方跟蹤系統(tǒng)專業(yè):軟件工程班級(jí):姓名:報(bào)告日期:2016年6月30日目錄1背景與意義?1。1背景與現(xiàn)狀 1。2趨勢(shì)與前景?1。3工作基礎(chǔ)、條件與優(yōu)勢(shì) 2需求分析?2.1功能與性能需求 2.2其它需求 3內(nèi)容和目標(biāo) 3.1主要內(nèi)容 3.2預(yù)期目標(biāo)?4技術(shù)路線 4.1總體功能 4。2運(yùn)行平臺(tái)具 4。2.1網(wǎng)絡(luò)環(huán)境?4.2.2設(shè)備情況 4.2。3支撐軟件?4。3程序語言與開發(fā)工具 4.4關(guān)鍵技術(shù)?5進(jìn)度計(jì)劃 6條件、假定和限制?7系統(tǒng)設(shè)計(jì)與原型UI(或系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)) 7.1數(shù)據(jù)庫表設(shè)計(jì) 7.2關(guān)鍵算法與實(shí)現(xiàn)技術(shù) 7。3主要原型UI(或主要功能實(shí)現(xiàn))?7.4測(cè)試方案與測(cè)試用例 7。5安裝與運(yùn)行情況 7.5。1安裝與配置 7。5.2運(yùn)行情況圖 8總結(jié)?參考文獻(xiàn)?附件:主要功能的源代碼1背景與意義1。1背景與現(xiàn)狀隨著互聯(lián)網(wǎng)不斷的發(fā)展,計(jì)算機(jī)已經(jīng)深入到了各行各業(yè),計(jì)算機(jī)不再局限于對(duì)科學(xué)技術(shù)的研究,當(dāng)今時(shí)代,計(jì)算機(jī)可以決解大部分的具體問題,而且有利于人們的控制,這大大方便了人們的需求。當(dāng)今的中小型醫(yī)院中一般還沒有全面采用信息技術(shù)來進(jìn)行管理,所以建議一套計(jì)算機(jī)輔助經(jīng)營管理系統(tǒng)是必不可少的。本系統(tǒng)是專門為處方專門設(shè)計(jì)的,我們知道,傳統(tǒng)的記錄使用手工的方式來記錄數(shù)據(jù),但是如果用手工的方式記錄數(shù)據(jù),如果數(shù)據(jù)量很大,那么結(jié)果往往就很容易出錯(cuò);而且,隨著時(shí)間的積累,數(shù)據(jù)變得越來越多,且容易丟失,傳統(tǒng)的手工管理極大的浪費(fèi)了人力和財(cái)力,不能滿足醫(yī)師和醫(yī)院之間的需求。?總的來說,使用一個(gè)高效率的系統(tǒng)來處理這些繁雜的流程是必須的,所以我們有必要建立一個(gè)處方跟蹤系統(tǒng)來處理這一系列的問題,讓醫(yī)師可以通過系統(tǒng)方便的記錄病史癥狀,開處方,查閱歷史處方,保存。通過這樣,這些數(shù)據(jù)能被即使、準(zhǔn)確、有效的處理。這不僅可以提高工作效率還可以確保信息的安全和準(zhǔn)確。1。2趨勢(shì)與前景目前,國內(nèi)的大多數(shù)醫(yī)院均不同程度的將計(jì)算機(jī)技術(shù)應(yīng)用于醫(yī)院管理.該系統(tǒng)對(duì)軟件沒有太高的要求,市場(chǎng)上已存在各式各樣的軟件足以滿足各方面的要求.但是不同軟件之間由于需求的不一致或者是根據(jù)不同的政策標(biāo)準(zhǔn)難以實(shí)現(xiàn)軟件統(tǒng)一化,現(xiàn)在醫(yī)療行業(yè)飛速發(fā)展,國家政策不斷的推陳出新也使軟件的開發(fā)出現(xiàn)多樣化,模塊的多樣化造成了維護(hù)原有系統(tǒng)上的困難,傳統(tǒng)的軟件業(yè)務(wù)有的已經(jīng)也不符合當(dāng)今的要求,所以開發(fā)一款符合當(dāng)今社會(huì)需求的軟件是有必要的。1。3工作基礎(chǔ)、條件和優(yōu)勢(shì)(1)技術(shù)可行性該系統(tǒng)對(duì)軟件沒有太高的要求,但是開發(fā)人員必須具有該軟件開發(fā)的專業(yè)知識(shí),已經(jīng)開發(fā)過相關(guān)的醫(yī)學(xué)管理系統(tǒng),在熟悉業(yè)務(wù)的情況下進(jìn)行開發(fā),完善更多的功能業(yè)務(wù)。(2)經(jīng)濟(jì)可行性該軟件的開發(fā)成本較低,在有前人開發(fā)的經(jīng)驗(yàn)中開發(fā)風(fēng)險(xiǎn)小,系統(tǒng)投入運(yùn)行后會(huì)給醫(yī)院帶來可觀的經(jīng)濟(jì)效益:一方面提高了工作效率,增加了市場(chǎng)競(jìng)爭(zhēng)力。另一方面,所需要的人員減少也提高了經(jīng)濟(jì)效益.(3)人才設(shè)備可行性對(duì)于針對(duì)醫(yī)療行業(yè)軟件開發(fā)的人員是相當(dāng)多的,在設(shè)備方面同樣比較容易進(jìn)行,所以在人才設(shè)備上是可行的。2需求分析2。1功能和性能需求功能需求:處方管理系統(tǒng)的構(gòu)建是以醫(yī)師處方為中心,實(shí)時(shí)錄入病人信息,開處方,生成處方,進(jìn)行數(shù)據(jù)的統(tǒng)計(jì),簡(jiǎn)化了傳統(tǒng)處方信息處理的過程。本系統(tǒng)的重點(diǎn)是跟蹤處方的信息數(shù)據(jù)并處理數(shù)據(jù),處理數(shù)據(jù)時(shí)相關(guān)的數(shù)據(jù)對(duì)象有如下有以下:(1)系統(tǒng)跟蹤每位顧客的以下信息:?顧客姓名、電話號(hào)碼、出生日期、承保公司、保險(xiǎn)號(hào)、處方歷史記錄(2)每位顧客的服藥史將記錄下列每次處方信息:?由藥房給出的唯一的處方ID號(hào)、處方開出的藥物、開處方的醫(yī)生姓名和電話號(hào)碼、處方日期、處方終止日期、有效購藥次數(shù)、配藥“單位”數(shù)量(此處的“單位”可能是片、匙和毫升等-—-見后面關(guān)于藥品的討論)、如果有其它替代品,是否可以向顧客提供替代品。(3)對(duì)于藥房存貨的每種藥品,系統(tǒng)應(yīng)跟蹤的如下:?藥品名稱,藥品“單位”(片、匙和毫升等),哪些其它藥品可以作為另一種這種藥品的替代品,服用藥品可能引起的副作用。(4)系統(tǒng)所支持的查詢功能:服藥史,即給定顧客的所有處方歷史記錄—根據(jù)顧客的要求提供的報(bào)告,某種給定藥品的副作用報(bào)告,隨處方一起提供某種給定藥品的可替換藥品列表一份給定處方是否還有購藥許可:即,是否還可以憑處方購藥,以及處方是否已經(jīng)過期。性能需求:?(1)時(shí)間特性要求?服務(wù)器啟動(dòng)時(shí)間不超過1分鐘;系統(tǒng)響應(yīng)時(shí)間:用戶在使用軟件的過程中對(duì)各個(gè)功能模塊中的鼠標(biāo)點(diǎn)擊、鍵盤輸入等操作響應(yīng)的時(shí)間不操作1秒。?(2)數(shù)據(jù)精度 要按照嚴(yán)格的數(shù)據(jù)格式輸入,對(duì)符合數(shù)據(jù)格式要求的輸入進(jìn)行提示。?(3)服務(wù)器并發(fā)和可伸縮性?軟件應(yīng)采用界面層、應(yīng)用程、數(shù)據(jù)層三層架構(gòu),若以后用戶數(shù)量增多,只需要增加應(yīng)用層的服務(wù)器數(shù)量,實(shí)現(xiàn)可裁減、可擴(kuò)充和可移植等不同方面的要求.采用模塊化的應(yīng)用軟件結(jié)構(gòu),確保系統(tǒng)可以靈活的擴(kuò)充其業(yè)務(wù)功能,并可與其他業(yè)務(wù)系統(tǒng)進(jìn)行無縫連接。 (4)系統(tǒng)安全性 數(shù)據(jù)庫設(shè)計(jì)闡明使用何種方式保證系統(tǒng)的安全.2.2其它需求可靠性和可用性需求:出錯(cuò)處理需求:接口需求:Mysql、Soap、約束需求:暫無逆向需求:暫無將來可能的需求:3內(nèi)容和目標(biāo)3.1主要內(nèi)容(1)用戶信息維護(hù),實(shí)現(xiàn)用戶信息的錄入、查詢、修改以及刪除等功能。(2)處方信息處理,針對(duì)不同的用戶記錄用戶的處方信息,其中處方信息中記錄處方開出的藥物、開處方的醫(yī)生姓名和電話號(hào)碼、處方日期、處方終止日期、有效購藥次數(shù)、配藥“單位”數(shù)量(此處的“單位”可能是片、匙和毫升等-——見后面關(guān)于藥品的討論)、如果有其它替代品,是否可以向顧客提供替代品等信息,并可對(duì)該處方進(jìn)行修改以及刪除等操作.(3)處方歷史查詢,查詢所有的處方信息,或者根據(jù)用戶的信息模糊查詢到該用戶的處方信息。(4)處方藥物信息處理,藥方根據(jù)處方信息處理藥物并確認(rèn)處理。3.2預(yù)期目標(biāo)系統(tǒng)必須根據(jù)需求實(shí)現(xiàn)核心業(yè)務(wù)上的需求內(nèi)容,系統(tǒng)必須嚴(yán)格按照說明書上來開發(fā),最終的系統(tǒng)必須達(dá)到需求說明書上的要求,實(shí)現(xiàn)一個(gè)可靠的、易用的處方跟蹤系統(tǒng),該系統(tǒng)實(shí)現(xiàn)了對(duì)用戶信息、處方信息的一體化處理。4技術(shù)路線4。1總體功能圖4。-1—1總體功能結(jié)構(gòu)圖圖4.—1-3系統(tǒng)數(shù)據(jù)流圖4.2運(yùn)行平臺(tái)4。2。1網(wǎng)絡(luò)環(huán)境局域網(wǎng)網(wǎng)絡(luò)環(huán)境以及私有的IP地址該局域網(wǎng)的網(wǎng)拓?fù)浣Y(jié)構(gòu)如圖4-2-1-1所示:圖4-2—1-1網(wǎng)絡(luò)拓?fù)鋱D4。2.2設(shè)備情況服務(wù)器端:處理器主頻1000MHz內(nèi)存容量64GB主機(jī)型號(hào)與數(shù)量PA—8800/2外存容量16GB設(shè)備型號(hào)與數(shù)量惠普9000rp7420/2輸入及輸出設(shè)備型號(hào)與數(shù)量L455有線多媒體鍵盤/1、S22B360HW顯示器/1、N215鼠標(biāo)/1數(shù)據(jù)通信設(shè)備型號(hào)與數(shù)量交換機(jī)華為S1724G/1其他專用硬件設(shè)備與數(shù)量無客戶端:處理器主頻不限定設(shè)備的型號(hào)與數(shù)量不限定主機(jī)型號(hào)與數(shù)量不限定外存容量不限定設(shè)備型號(hào)與數(shù)量無輸入及輸出設(shè)備型號(hào)與數(shù)量交換機(jī)華為S1724G/1數(shù)據(jù)通信設(shè)備型號(hào)與數(shù)量無其他專用硬件設(shè)備與數(shù)量無4。2.3支撐軟件支撐軟件軟件版本操作系統(tǒng)Linuxlinuxredhat5.6以上,內(nèi)核版本kernel—2.6.18-238。el5數(shù)據(jù)庫管理系統(tǒng)Mysql5.1Web服務(wù)器Tomcat(yī)7。0瀏覽器Chrome46.0。2490。86其他軟件JVM1.74.3程序語言與開發(fā)工具程序語言:HTML/CSS、JavaScript、Jquery、Java、Jsp、Jstl、Spring、SpringMVC、Hibernat(yī)e、SpringDataJpa、Mysql開發(fā)工具:SpringToolSuit3.7、Maven3.3、Mysql5.1、Tomcat7。0、JavaRuntimeEnviroment1.7、Git項(xiàng)目管理工具4。4關(guān)鍵技術(shù)(1)HTML5WebSocketAPI客戶端與服務(wù)器端進(jìn)行全雙工通訊,WebSocket的出現(xiàn)是基于Web應(yīng)用的實(shí)時(shí)性需要而產(chǎn)生的,它允許客戶端和服務(wù)器在任意時(shí)刻互相推送消息。WebSocket是下一代客戶端-服務(wù)器異步通訊的方法,它本事上任然是一個(gè)基于TCP的協(xié)議,它使用ws或wss協(xié)議,可用于任意的客戶端和服務(wù)器。為了建立一個(gè)WebSocket連接,客戶端瀏覽器首先要向服務(wù)器發(fā)起一個(gè)HTTP請(qǐng)求,這個(gè)請(qǐng)求和通常的HTTP請(qǐng)求不同,包含了一些附加頭信息,其中附加頭信息”Upgrade:WebSocket”(”Upgrade:WebSocket"表示這是一個(gè)特殊的HTTP請(qǐng)求,請(qǐng)求的目的就是要將客戶端和服務(wù)器端的通訊協(xié)議從HTTP協(xié)議升級(jí)到WebSocket協(xié)議。)表明這是一個(gè)申請(qǐng)協(xié)議升級(jí)的HTTP請(qǐng)求,服務(wù)器端解析這些附加的頭信息然后產(chǎn)生應(yīng)答信息返回給客戶端,客戶端和服務(wù)器端的WebSocket連接就建立起來了,雙方就可以通過這個(gè)連接通道自由的傳遞信息,并且這個(gè)連接會(huì)持續(xù)存在直到客戶端或者服務(wù)器端的某一方主動(dòng)的關(guān)閉連接。它的通訊方式如下:圖4-4—1客戶端和服務(wù)器websocket通訊。圖4-4—1客戶端和服務(wù)器websocket通訊(2)HighChats一套由純Javascript寫的表現(xiàn)層框架,它提供曲線、面積、柱形圖、條形圖、餅圖、散點(diǎn)圖、區(qū)域范圍圖、氣泡、漏斗等等一系列的圖形表現(xiàn)形式。HighChars不需要像Flash和Java那樣需要插件才可以運(yùn)行,而且運(yùn)行速度快,它是輕量級(jí)的JavaScript腳本,它使用的是json數(shù)據(jù)格式,數(shù)據(jù)傳輸更加方便,而且它的數(shù)據(jù)是在客戶端解析的,減輕了服務(wù)器的壓力,所以它比JFreeChart更方便(JFreeChart是JAVA平臺(tái)上的一個(gè)開放的圖表繪制類庫。它完全使用JAVA語言編寫在我看來JFree(cuò)Chart有點(diǎn)笨重了,而且它生成的圖形也比HighChart少,并且好像是收費(fèi)的)。另外HighCharts還有很好的兼容性,能夠完美支持當(dāng)前大多數(shù)瀏覽器。(3)SpringDataJPA提供了一整套數(shù)據(jù)訪問層(DAO)的解決方案,致力于減少數(shù)據(jù)訪問層的開發(fā)量,并支持云服務(wù)的開源框架。SpringData作為SpringSource的其中一個(gè)父項(xiàng)目,旨在統(tǒng)一和簡(jiǎn)化對(duì)各類型持久化存儲(chǔ),而不拘泥于是關(guān)系型數(shù)據(jù)庫還是NoSQL數(shù)據(jù)存儲(chǔ).無論是哪種持久化存儲(chǔ),數(shù)據(jù)訪問對(duì)象(或稱作為DAO,即DataAccessObjects)通常都會(huì)提供對(duì)單一域?qū)ο蟮腃RUD(創(chuàng)建、讀取、更新、刪除)操作、查詢方法、排序和分頁方法等。SpringData則提供了基于這些層面的統(tǒng)一接口(Repository、CrudRepository、PagingAndSortingRepository、JpaRepository)以及對(duì)持久化存儲(chǔ)的實(shí)現(xiàn)。JPA(JavaPersistenceAPI,Java持久化API)是sun提出的一個(gè)對(duì)象持久化規(guī)范,各JavaEE應(yīng)用服務(wù)器自主選擇實(shí)現(xiàn),JPA的底層實(shí)現(xiàn)是一些流行的開源ORM(對(duì)象關(guān)系映射)框架(如Hibernat(yī)e、OpenJPA、TopLink、Ibat(yī)is等等),因此JPA其實(shí)也就是java實(shí)體對(duì)象和關(guān)系型數(shù)據(jù)庫建立起映射關(guān)系,通過面向?qū)ο缶幊痰乃枷氩僮麝P(guān)系型數(shù)據(jù)庫的規(guī)范。JPA,定義了對(duì)象-關(guān)系映射以及實(shí)體對(duì)象持久化的標(biāo)準(zhǔn)接口.如下圖:圖4-4-2JPA在應(yīng)用程序中的位置:圖4-4—2JPA在應(yīng)用程序中的位置SpringDataJpa是SpringData對(duì)JPA提供的一套解決方案。SpringDataJpa實(shí)現(xiàn)了大部分的持久層的邏輯代碼,你需要做的只是聲明持久層的接口,其他的都交給SpringDat(yī)aJpa完成。SpringDataJpa中Repository是一個(gè)空接口,CrudRepository:繼承Repository,實(shí)現(xiàn)了一組CRUD相關(guān)的方法,PagingAndSortingRepository:繼承CrudRepository,實(shí)現(xiàn)了一組分頁排序相關(guān)的方法,JpaRepository:繼承PagingAndSortingRepository,實(shí)現(xiàn)一組JPA規(guī)范相關(guān)的方法。相關(guān)技術(shù)方案參考SpringData實(shí)戰(zhàn)的書籍[2]。SpringDataJpa提供的接口如下圖4-4-3SpringDat(yī)aJpa提供的接口圖:圖4—4-3SpringDataJpa提供的接口圖(4)SpringMVC,SpringWebMVC是一種基于Java的實(shí)現(xiàn)了WebMVC設(shè)計(jì)模式的請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí)Web框架,即使用了MVC架構(gòu)模式的思想,將web層進(jìn)行職責(zé)解耦,基于請(qǐng)求驅(qū)動(dòng)指的就是使用請(qǐng)求—響應(yīng)模型,框架的目的就是幫助我們簡(jiǎn)化開發(fā),SpringWebMVC也是要簡(jiǎn)化我們?nèi)粘eb開發(fā)的。它的請(qǐng)求處理流程圖如下:圖4—4—2springMVC請(qǐng)求處理流程圖前端控制器首先接收到用戶的請(qǐng)求,前端控制器根據(jù)接收的請(qǐng)求信息把請(qǐng)求委托給頁面控制器來處理。處理器接收請(qǐng)求后調(diào)用相應(yīng)的業(yè)務(wù)對(duì)象處理請(qǐng)求,如果有數(shù)據(jù)庫操作會(huì)向數(shù)據(jù)庫請(qǐng)求數(shù)據(jù),并返回一個(gè)模型視圖(一般是ModelAndView),返回的模型經(jīng)過視圖解析器把,模型數(shù)據(jù)解析到頁面中并返回給客戶端。SpringMVC充分對(duì)模型、視圖、控制器進(jìn)行充分的解耦,并利用SpringIOC的功能更加方便管理。相關(guān)技術(shù)方案參考SpringMVC學(xué)習(xí)指南的書籍[1]。(5)REST風(fēng)格URL,REST架構(gòu)風(fēng)格是全新的針對(duì)Web應(yīng)用的開發(fā)風(fēng)格,是當(dāng)今世界最成功的互聯(lián)網(wǎng)超媒體分布式系統(tǒng)架構(gòu),它使得人們真正理解了Http協(xié)議本來面貌.隨著REST架構(gòu)成為主流技術(shù),一種全新的互聯(lián)網(wǎng)網(wǎng)絡(luò)應(yīng)用開發(fā)的思維方式開始流行.REST是基于Http協(xié)議的,任何對(duì)資源的操作行為都是通過Http協(xié)議來實(shí)現(xiàn)。以往的Web開發(fā)大多數(shù)用的都是Http協(xié)議中的GET和POST方法,對(duì)其他方法很少使用,這實(shí)際上是因?yàn)閷?duì)Http協(xié)議認(rèn)識(shí)片面的理解造成的。Http不僅僅是一個(gè)簡(jiǎn)單的運(yùn)載數(shù)據(jù)的協(xié)議,而是一個(gè)具有豐富內(nèi)涵的網(wǎng)絡(luò)軟件的協(xié)議。他不僅僅能對(duì)互聯(lián)網(wǎng)資源進(jìn)行唯一定位,而且還能告訴我們?nèi)绾螌?duì)該資源進(jìn)行操作。Http把對(duì)一個(gè)資源的操作限制在4個(gè)方法以內(nèi):GET,POST,PUT和DELETE,這正是對(duì)資源CRUD操作的實(shí)現(xiàn)。由于資源和URI是一一對(duì)應(yīng)的,執(zhí)行這些操作的時(shí)候URI是沒有變化的,這和以往的Web開發(fā)有很大的區(qū)別.正由于這一點(diǎn),極大的簡(jiǎn)化了Web開發(fā),也使得URI可以被設(shè)計(jì)成更為直觀的反映資源的結(jié)構(gòu),這種URI的設(shè)計(jì)被稱作RESTful的URI.基于RESTURL風(fēng)格的請(qǐng)求方式如下:圖4-4-2基于RESTURL風(fēng)格的請(qǐng)求5進(jìn)度計(jì)劃說明本項(xiàng)目的進(jìn)度要求,參照軟件工程的三個(gè)時(shí)期中的八個(gè)階段時(shí)間安排問題定義3日可行性分析2日需求分析5日總體設(shè)計(jì)5日詳細(xì)設(shè)計(jì)10日編碼和單元測(cè)試15日綜合測(cè)試5日軟件維護(hù)5日操作培訓(xùn)3日驗(yàn)收測(cè)試2日項(xiàng)目驗(yàn)收2日總計(jì)為57天6條件、假定和限制(1)建議開發(fā)軟件開發(fā)投入的時(shí)間:兩個(gè)月(2)經(jīng)費(fèi)來源及限制:由需求方提供(3)軟件的預(yù)期壽命:兩年(4)網(wǎng)絡(luò)環(huán)境:局域網(wǎng)(5)運(yùn)行環(huán)境:mysql5。1,JavaRuntimeEnviroment1.7及以上版本(6)客戶端環(huán)境:InternetExplorer8。0及以上的版本(7)硬件設(shè)備:處理器InterPentinm3或者更高,內(nèi)存至少256M以上,硬盤至少2G(8)平臺(tái):linuxredhat5.6以上,內(nèi)核版本kernel-2.6.18—238.el5(9)法律和政策:遵守相關(guān)的法律法規(guī),以保護(hù)用戶的隱私為前提開發(fā)軟件7系統(tǒng)設(shè)計(jì)與原型UI(或系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn))7.1數(shù)據(jù)庫表設(shè)計(jì)數(shù)據(jù)庫名:Prescription數(shù)據(jù)庫管理者賬號(hào):root密碼:root賬號(hào)操作權(quán)限:CREATE、DROP、DELETE、INSERT、UPDATE、SELECT、ALTERUser表:記錄用戶的基本信息。表User(用戶表)用于保存用戶的基本信息字段名數(shù)據(jù)類型長(zhǎng)度主鍵描述IdInt11是用戶編號(hào)NameVarchar64否用戶姓名TelephoneVarchar20否電話號(hào)碼BirthdayData10否出生日期insurance_companyVarchar32否承保公司Policy_numberVarchar64否保單號(hào)表7-1-1User表Department表:部門表,醫(yī)師所屬部門。表Department(部門表)用于保存醫(yī)師的部門字段名數(shù)據(jù)類型長(zhǎng)度主鍵描述IdInt11是部門編號(hào)NameVarchar64否部門名稱表7—1—2Department表Position表:醫(yī)師所屬職位.表Position(職位表)用于保存醫(yī)師的職位信息字段名數(shù)據(jù)類型長(zhǎng)度主鍵描述IdInt11是職位編號(hào)NameVarchar64否職位名稱表7-1—3Department表Doctor表:醫(yī)師基本信息,包括兩個(gè)外鍵,表示醫(yī)師所屬的部門和職位。表Doctor(醫(yī)師表)用于保存醫(yī)師的基本信息字段名數(shù)據(jù)類型長(zhǎng)度主鍵描述IdInt11是醫(yī)師編號(hào)NameVarchar64否醫(yī)師姓名TelephoneVarchar20否電話號(hào)碼DidInt11否醫(yī)師所屬部門PidInt11否醫(yī)師所屬職位表7—1-4Doctor表Prescription表:處方信息表,記錄處方基本信息以及兩個(gè)外鍵,一個(gè)是該處方所屬的用戶,另一個(gè)是處方所屬醫(yī)師。表Prescription(處方信息表)用于保存處方的基本信息字段名數(shù)據(jù)類型長(zhǎng)度主鍵描述IdInt11是處方編號(hào)UidInt11否該處方所屬用戶DidInt11否該處方所屬醫(yī)師BeginDat(yī)eDate16否處方日期EndDateDat(yī)e16否處方終止日期CrawlAgainstInt4否再次抓藥的次數(shù)表7-1-5Prescription表PrescriptionDetail表:處方詳細(xì)信息表,記錄一個(gè)處方中多個(gè)處方詳細(xì)信息記錄,兩個(gè)外鍵,一個(gè)表示該處方詳細(xì)所屬的處方,另一個(gè)表示該處方詳細(xì)中具體的藥物信息。表PrescriptionDetail(處方詳細(xì)信息表)用于保存處方的具體的信息字段名數(shù)據(jù)類型長(zhǎng)度主鍵描述IdInt11是處方詳細(xì)編號(hào)CountInt4否數(shù)量CanuseString16否是否可用替代藥品Take_methodString255否服用的方式UnitString16否單位MidInt11否藥物的編號(hào)PidInt11否處方的編號(hào)表7-1-6PrescriptionDetail表Medicine表:記錄藥物的基本信息。表Medicine(藥物信息表)用于保存藥物的信息字段名數(shù)據(jù)類型長(zhǎng)度主鍵描述IdInt11是藥物的編號(hào)NameString64否藥物的名稱SideeffectString255否副作用表7-1-7Medicine表Subtitute表:藥物可替代的藥品表,每個(gè)藥物如果有可替代的藥物,那么該藥物將會(huì)維持一份藥物替代表,其中兩個(gè)字段都是外間,一個(gè)是指向具體的某個(gè)藥物,另外一個(gè)是指向可替代藥物的id編號(hào)。表Subtitute(藥物替代表)用于保存藥物的可替代藥物的信息字段名數(shù)據(jù)類型長(zhǎng)度主鍵描述M_idInt11是藥物的編號(hào)S_idInt11是藥物的標(biāo)號(hào)表7-1-8Subtitute表數(shù)據(jù)庫總體UML如下圖7—1-9數(shù)據(jù)庫UML圖7—1—9數(shù)據(jù)庫UML數(shù)據(jù)庫設(shè)計(jì)相關(guān)技術(shù)方案參考據(jù)庫設(shè)計(jì)與關(guān)系理論[4]與數(shù)據(jù)庫設(shè)計(jì)與應(yīng)用開發(fā)實(shí)踐[5].無,由于使用了springdatajpa操作數(shù)據(jù)庫,springdatajpa簡(jiǎn)化了數(shù)據(jù)庫訪問的操作.7。2關(guān)鍵算法與實(shí)現(xiàn)技術(shù)1。系統(tǒng)難點(diǎn):添加一個(gè)處方信息可一次性提交多個(gè)處方詳細(xì)信息(相當(dāng)于每次開藥方包含多種藥物,每種藥物的數(shù)量也不一致),每個(gè)處方詳細(xì)信息中又包含了基本信息以及藥品對(duì)象。為了解決該問題,每次選擇和填好一種藥物后都實(shí)用ajax保存到服務(wù)器上的session中,當(dāng)然,在服務(wù)器上建立了兩個(gè)類來暫時(shí)存放這些數(shù)據(jù),分別是PrescriptionDetailOperat(yī)or和PrescriptionOperator兩個(gè)類。classPrescriptionDetailOperat(yī)or{?privacount;//每個(gè)藥品的數(shù)量 privateStringunit;//每個(gè)藥品的單位?privateMedicinemedicine;//該藥品的對(duì)象?privateStringtakeMethod;//服用方法?privateStringcanuse;//是否可以實(shí)用替代藥品 //省略getter和setter方法}classPrescriptionOperator{ //聲明一個(gè)map來保存多個(gè)PrescriptionDetailOperator?qū)ο?,?shí)用藥品的id作為主鍵?privat(yī)eMap<Integer,PrescriptionDetailOperator>map= ??newLinkedHashMap<Integer,PrescriptionDetailOperator〉();?publicCollection<PrescriptionDetailOperator>getPreDetail(){ ?returnmap.values();?} //每次添加的時(shí)候都檢查是否存在藥物,存在則在原來的數(shù)量上增加 publicvoidaddPrescriptionDetail(PrescriptionDetailOperatorpreDetail){ ?Integerid=preDetail。getMedicine()。getId();? if(map。containsKey(id)){? ?PrescriptionDetailOperator_preDetail=map。get(id);???_preDetail。setCount(_preDetail.getCount()+preDetail。getCount()); }else{? map.put(id,preDetail); }?}?//可以移除處方詳細(xì)信息?publicvoidremovePreDetail(Integerpid){??if(map。containsKey(pid)){ ?? ?map。remove(pid);? }?}}前臺(tái)使用ajax發(fā)送數(shù)據(jù)保存到服務(wù)器端:varpdid;//保存處方詳細(xì)的idvar$tmp;//用于保存當(dāng)前刪除的對(duì)象的引用//保存更新處方詳細(xì)信息functionsaveDetail(item){?varpdid=$(item)。attr(”lang”)。trim();//處方詳細(xì)唯一編號(hào)?var$count;//數(shù)量?varcanuse;//是否可用替代藥品?varunit;//實(shí)用藥品單位 vartake_method;//服用方法 //遍歷找到一個(gè)處方詳細(xì)的信息 $(item)。parent()。parent()。find(".modal—body”).each(function(index){? $count=$(this).find(”#count");??canuse=$(this).find(”#canuse")。find("option:selected").val().trim();??unit=$(this).find("#unit”).val().trim(); take_method=$(this).find(”#take_method").val().trim();?}); if(!/^\+?[1-9][0-9]*$/.test($count.val().trim())){ ?$.tooltip('請(qǐng)輸入正確的數(shù)字,該數(shù)字不能小于1!’,2000,false); ?$count.val("1")。focus(); return; } //發(fā)送ajax保存處方詳細(xì)信息?$.ajax({type:”POST", data:{"id”:pdid,"count":$count。val().trim(),"canuse":canuse,"unit”:unit,”takemethod”:take_method},url:window.location.pathname.substring(0,25)+"saveUpdateDetail”,?success:function(data){?if(data){$.tooltip(’保存成功成功!’,2000,true);}else{$.tooltip(’刪除失敗,請(qǐng)檢查服務(wù)器或網(wǎng)絡(luò)狀態(tài)!',2000,false);}?}, error:function(){$。tooltip('刪除失敗,請(qǐng)檢查服務(wù)器或網(wǎng)絡(luò)狀態(tài)!',2000,false);}?});}2.關(guān)鍵SQL:(1)查詢存在處方數(shù)據(jù)的用戶以及處方的數(shù)量:Selectu。name,u.policy_number,u.telephone,u.insurance_company,u.uid,count(*)fromprescriptionpinnerjoinuseruwhereu。id=p.uidgroupbyp.uid;(2)。全表掃描user表查詢用戶對(duì)象fromUseruwhereconcat(u.name,u。birthday,u.telephone,u.insuranceCompany,u。policyNumber)likeCONCAT('%’,:search,'%');(HQL語法)(3).根據(jù)不同的年齡段統(tǒng)計(jì)用戶的數(shù)量selectcount(*),left(birthday,4)fromusergroupbyleft(birthday,4);(4).查詢所有用戶的出生年份,月份,日期分布selectleft(birthday,4),substring(birthday,6,2),substring(birthday,9,2)fromuser;3.核心算法:(1)WebSocket存儲(chǔ)和分發(fā)消息代碼,基于WebSocket服務(wù)器與客戶端通訊的問題,醫(yī)師每添加一條處方記錄或者對(duì)處方記錄執(zhí)行刪除修改等操作時(shí)會(huì)及時(shí)通知客戶端服務(wù)器數(shù)據(jù)狀態(tài)的改變并及時(shí)更新獲取最新的數(shù)據(jù)。針對(duì)以上的問題,我首先針對(duì)需要及時(shí)處理消息的頁面與服務(wù)器建立WebSocket連接,服務(wù)器端使用一個(gè)Map保存客戶端的連接,如下:privatestaticMap〈String,Session〉sessions=newHashMap<String,Session>();,每次請(qǐng)求時(shí)就根據(jù)session的id進(jìn)行存儲(chǔ),對(duì)每個(gè)醫(yī)師處方信息操作的頁面每個(gè)在頁面初始化時(shí)都與服務(wù)器(與上面處理的請(qǐng)求是同一個(gè))也建立一個(gè)WebScoket連接(多個(gè)WebSocket連接到同一個(gè)請(qǐng)求),醫(yī)師每次操作成功時(shí)立即就發(fā)送WebScoket消息到服務(wù)器,服務(wù)器根據(jù)接受到的消息遍歷Map中客戶端中的多個(gè)連接循環(huán)發(fā)送消息到客戶端,客戶端根據(jù)接受到的消息以根據(jù)消息的內(nèi)容重新請(qǐng)求服務(wù)器上的數(shù)據(jù)。7.3主要原型UI(或主要功能實(shí)現(xiàn))(1)系統(tǒng)登錄和主界面圖7—3-1系統(tǒng)登錄界面功能作用:實(shí)現(xiàn)醫(yī)師的登錄功能圖7—3-2系統(tǒng)主界面功能作用:介紹系統(tǒng)以及顯示不同年齡或者部門人數(shù)占有的比率(2)用戶信息管理圖7-3-3所有用戶的基本信息功能作用:實(shí)用highcharts像是所有的用戶信息,可進(jìn)行搜索圖7-3-4分頁顯示用戶信息以及操作功能作用:對(duì)用戶信息進(jìn)行分頁處理以及顯示操作圖7-3—5彈出層顯示可編輯的用戶修改(3)處方信息管理功能作用:實(shí)現(xiàn)對(duì)用戶信息的修改圖7-3-6添加處方信息功能作用:實(shí)現(xiàn)添加處方信息圖7-3—7彈出層選擇藥品功能作用:實(shí)現(xiàn)添加處方信息中具體的一個(gè)藥品圖7-3-8可搜索藥品功能作用:實(shí)現(xiàn)藥品的搜索圖7—3-8添加多個(gè)藥品功能作用:實(shí)用ajax保存數(shù)據(jù),一次性可添加多個(gè)藥品的信息,即一個(gè)處方中可添加多個(gè)藥品信息,每個(gè)藥品信息中有不同的單位,數(shù)量,服用方式和是否可用替代的藥品。(3)處方記錄管理圖7-3-9處方歷史記錄的顯示功能作用:實(shí)用時(shí)間軸顯示每個(gè)用戶開過的處方記錄,該記錄上記錄正醫(yī)師的姓名和電話,以及每個(gè)處方中多個(gè)處方詳細(xì)信息,如果該藥品是可實(shí)用替代藥品,則列出可替代藥品的藥品名稱.圖7-3-9處方信息的修改界面功能作用:每個(gè)處方信息中都有多個(gè)處方詳細(xì),即每個(gè)處方中有多個(gè)藥品信息,在該頁面中可對(duì)每個(gè)藥品進(jìn)行修改和刪除。圖7—3-10彈出確認(rèn)刪除的模態(tài)框(4)用戶處方查詢圖7-3—11查詢所有處方記錄圖7-3-12實(shí)用關(guān)鍵字姓名搜索圖7—3-13實(shí)用關(guān)鍵字出生年份搜索圖7-3-14實(shí)用關(guān)鍵字電話號(hào)碼搜索(5)取藥信息查詢管理圖7—3—15實(shí)用承保單號(hào)唯一搜索圖7-3—16藥物管理主頁功能作用:使用WebSocket實(shí)時(shí)處理處方數(shù)據(jù),顯示登記的處方信息。圖7-3—16藥物處理(6)系統(tǒng)出錯(cuò)管理圖7-3-16處理404錯(cuò)誤頁面圖7-3-17處理500錯(cuò)誤頁面7.4測(cè)試方案與測(cè)試用例制定測(cè)試計(jì)劃:(1)確定測(cè)試需求(2)制定測(cè)試策略(3)建立測(cè)試通過準(zhǔn)則(4)確定資源和進(jìn)度(5)評(píng)審測(cè)試計(jì)劃(6)更新測(cè)試計(jì)劃設(shè)計(jì)測(cè)試:設(shè)計(jì)測(cè)試用例針對(duì)每一個(gè)測(cè)試需求,確定其需要的測(cè)試用例對(duì)每個(gè)測(cè)試用例,確定其輸入的預(yù)期結(jié)果確定測(cè)試用例文檔的測(cè)試環(huán)境配置對(duì)測(cè)試用例進(jìn)行評(píng)審開發(fā)測(cè)試過程根據(jù)界面原型為每一個(gè)測(cè)試用例定義詳細(xì)的測(cè)試步驟為每一個(gè)格式步驟定義詳細(xì)的測(cè)試結(jié)果驗(yàn)證方法為測(cè)試用例準(zhǔn)備輸入數(shù)據(jù)在實(shí)施測(cè)試時(shí)對(duì)測(cè)試過程進(jìn)行更改1.單元測(cè)試首先在項(xiàng)目開發(fā)中使用單元測(cè)試,如:Junit、SpringJUnit4ClassRunner進(jìn)行單元測(cè)試,按照測(cè)試過程手工執(zhí)行單元測(cè)試或運(yùn)行測(cè)試腳本自動(dòng)執(zhí)行單元測(cè)試,如下:@RunWith(SpringJUnit4ClassRunner。class)@ContextConfiguration(locations={"applicationContext.xml"})@Transactional@TransactionConfiguration(transactionManager="transactionManager”)publicclassTestModule{@Testpublicvoidtest(){}}2.集成測(cè)試:使用回歸測(cè)試方法,對(duì)軟件的新版本測(cè)試時(shí),驗(yàn)證是否解決了軟件缺陷,而且保證以前所有運(yùn)行正常的功能依舊保持正常,而不會(huì)影響本次的修改。按照測(cè)試過程手工執(zhí)行集成測(cè)試或運(yùn)行測(cè)試腳本自動(dòng)執(zhí)行集成測(cè)試將集成測(cè)試結(jié)果作詳細(xì)記錄,并評(píng)審測(cè)試結(jié)果對(duì)修改后的工作版本執(zhí)行回歸測(cè)試,或者對(duì)增量集成后的版本執(zhí)行回歸測(cè)試2。驗(yàn)收測(cè)試:以用戶為主,前提是已經(jīng)通過系統(tǒng)測(cè)試的軟件系統(tǒng),根據(jù)需求規(guī)格說明書或者概要設(shè)計(jì)文檔驗(yàn)證需求的合理性和正確性,包括文檔資料是否完整、正確,人機(jī)界面和其他方面(如,可移植性、兼容性、錯(cuò)誤回復(fù)能力和可維護(hù)性等)是否令用戶滿意.7.5安裝與運(yùn)行情況(1)JDK1.7首先系統(tǒng)必須有JRE的支持,為了能夠完成在該環(huán)境下的編譯,最好能夠安裝下完整的JDK環(huán)境,JDK選用1.7或者更高的版本。(2)Maven3.3或更高的版本,本系統(tǒng)添加對(duì)Maven的支持,方便在不同類型的機(jī)器上完成編譯工作。(3)MYSQL5。1或更高的版本,與系統(tǒng)集成.(4)WEB服務(wù)器,Tomcat17.0或更高的版本,為了支持WebSocket,Tomcat只有在7.0或者更高的版本中才添加了對(duì)WebScoket的支持。7。5.1安裝與配置描述服務(wù)器端運(yùn)行環(huán)境的配置情況,包括:安裝與初始化數(shù)據(jù)庫、安裝與配置服務(wù)器安裝、安裝支撐軟件、配置系統(tǒng)運(yùn)行參數(shù),等等。1.JDK環(huán)境配置:(1)如果系統(tǒng)中存在JDK1。7或更高的版本則這一步可以省略,可以實(shí)用java-version查看當(dāng)前系統(tǒng)JDK的版本,如下圖所示。首先到Oracle官網(wǎng)下載下載JDK,官網(wǎng)地址如下:www。oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html,假設(shè)當(dāng)前的文件名稱為jdk-7u67-linux-x64.tar.gz,進(jìn)入到該文件的目錄下。?(2)使用命令tar—zxvfjdk-7u67-linux-x64。tar.gz-Cpath解壓到path路徑下,path為你想要放置JDK的本地位置,假設(shè)我放在/home/silence/software/jdk1。7.0_67就要執(zhí)行命令tar-zxvfjdk—7u67—linux-x64。tar。gz/home/silence/software/ (3)配置環(huán)境變量,在/etc/profile,這個(gè)是系統(tǒng)核心文件,對(duì)所有的用戶都起作用,你需要以root用戶才能修改,實(shí)用命令sudo—i,提示輸入密碼,輸入密碼,當(dāng)前用戶變?yōu)椋騩ot用戶,實(shí)用命令gedit/etc/profile打開profile文件,在該文件的末尾寫入 JAVA_HOME=/home/silence/software/jdk1。7。0_67?exportCLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib?exportJRE_HOME=${JAVA_HOME}/jre exportPATH=${JAVA_HOME}/bin:$PATH命令source/etc/profile使其立即生效,cat/etc/profile可以看到如下:?(4)運(yùn)行javac或者java命令可以看到即可?2.Maven安裝?(1)軟件下載,到apache官網(wǎng)地址http://apache。f/maven/maven—3/3。3.3/binaries/apache-maven—3。3。3-bin-tar-gz到本地目錄下。 (2)軟件解壓,進(jìn)入到該文件的目錄,使用tar-zxvfapache-maven-3.3.3—bin。tar.gz-Cpath解壓到path目錄下,假設(shè)我的地址為:/home/silence/software/maven3.3則使用tar—zxvfapache—maven-3。3。3-bin.tar.gz-Chome/silence/software/maven3.3 (3)環(huán)境變量配置,到gedit/etc/profile打開全局配置文件,在上面的JDK后添加上exportMAVEN_HOME=/home/silence/software/maven3.3,最后變?yōu)?(4)執(zhí)行命令mvn-v可以看見maven版本和jre版本(4)修改本地倉庫地址,進(jìn)入到maven目錄下的conf目錄,打開settings.xml,在<settingsxmlns="http://maven.apache。org/SETTINGS/1。0。0"xmlns:xsi="http://www.w3。org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache。org/SETTINGS/1.0.0http://maven。apache。org/xsd/settings—1。0.0.xsd">下添加〈localRepository>/home/silence/data/repository</localRepository>其中/home/silence/data/repository是本地文件夾路徑,用來存放第三方j(luò)ar包。 3。Mysql安裝?(1)mysql可以在線安裝,mysql服務(wù)器的安裝apt—getinstallmysql—server,安裝過程提示輸入root密碼 (2)mysql客戶端安裝apt-getinstallmysql-client (3)apt-getinstalllibmysqlclient-dev,實(shí)用mysql—uroot—p,輸入密碼,如下4.Tomcat安裝 (1)到apache官網(wǎng)地址下載Tomcat7,地址為:http://mirrors。cnn/apache/tomcat/tomcat-7/v7.0。70/bin/apache-tomcat(yī)-7。0.70-deploye.tar.gz?(2)實(shí)用命令tar-zxvfapache—tomcat-7.0.70-deploye.tar.gz-Cpat(yī)h,path同上?(3)同樣的,你也可以把tomcat下的bin目錄添加到profile全局域中,進(jìn)入到bin目錄下執(zhí)行./startup。sh并在瀏覽器中查看,如下:?5.項(xiàng)目編譯與項(xiàng)目放置及服務(wù)器啟動(dòng)?(1)文件信息修改,數(shù)據(jù)庫ip,用戶名以及密碼的修改,項(xiàng)目文件接下的src/main/resources下,找到dperties,其中jdbc。user=root//用戶名?jdbc.password=root//密碼 jdbc。jdbcUrl=jdbc:mysql:///url地址,修改為當(dāng)前服務(wù)器的ip地址 進(jìn)入項(xiàng)目的主目錄,本系統(tǒng)的PrescriptionTrackSystem下,執(zhí)行mvnclean命令清除舊版本的編譯文件。?(2)實(shí)用mvncomplier進(jìn)行編譯下,如果你是首次進(jìn)行編譯,那么系統(tǒng)將會(huì)下載pom.xml中需要的jar文件進(jìn)行一起編譯,這將需要一定的時(shí)間.?編譯完成 (3)運(yùn)行命令mvnpackage進(jìn)行項(xiàng)目的打包工作,打包過的項(xiàng)目可以直接移植到tomcat中直接運(yùn)行。(4)在當(dāng)前文件夾下的target文件夾下可以找到PrescriptionTrackSystem.war(5)把上圖中的PrescriptionTrackSystem.war放置在Tomcat目錄下的webapps目錄下,進(jìn)入Tomcat文件夾下的bin文件夾,執(zhí)行./startup.sh文件啟動(dòng)服務(wù)器。(6)訪問ip+/PrescriptionTrackSystem/login.html可以訪問到如下內(nèi)容:7.5。2運(yùn)行情況圖圖7—5-2—1所有用戶的基本信息功能作用:查詢?cè)趲斓乃杏脩舻男畔⒂涗?。圖7-5-2—2分頁顯示用戶信息以及操作功能作用:對(duì)用戶信息進(jìn)行分頁處理以及顯示操作,并可對(duì)用戶進(jìn)行一定的操作。圖7-5—2—3彈出層顯示可編輯的用戶修改功能作用:實(shí)現(xiàn)對(duì)用戶信息的修改。圖7-5-2-4添加處方信息功能作用:實(shí)現(xiàn)添加處方信息。圖7-5-2-5彈出層選擇藥品功能作用:實(shí)現(xiàn)添加處方信息中具體的一個(gè)藥品及一些額外信息。圖7-5-2—6可搜索藥品功能作用:實(shí)現(xiàn)藥品的搜索。圖7—5—2-7添加多個(gè)藥品功能作用:實(shí)用ajax保存數(shù)據(jù),一次性可添加多個(gè)藥品的信息,即一個(gè)處方中可添加多個(gè)藥品信息,每個(gè)藥品信息中有不同的單位,數(shù)量,服用方式和是否可用替代的藥品。圖7—5—2-8處方歷史記錄的顯示功能作用:實(shí)用時(shí)間軸顯示每個(gè)用戶開過的處方記錄,該記錄上記錄正醫(yī)師的姓名和電話,以及每個(gè)處方中多個(gè)處方詳細(xì)信息,如果該藥品是可實(shí)用替代藥品,則列出可替代藥品的藥品名稱。圖7-5-2—9處方信息的修改界面功能作用:每個(gè)處方信息中都有多個(gè)處方詳細(xì),即每個(gè)處方中有多個(gè)藥品信息,在該頁面中可對(duì)每個(gè)藥品進(jìn)行修改和刪除。圖7—5—2—10查詢所有處方記錄功能作用:查詢?cè)趲斓乃械奶幏接涗?。圖7-5—2-11實(shí)用關(guān)鍵字搜索圖7-5-2—12藥物管理主頁功能作用:使用WebSocket實(shí)時(shí)處理處方數(shù)據(jù),顯示登記的處方信息。圖7-3-16藥物處理8總結(jié)本項(xiàng)目實(shí)現(xiàn)了需求中的大部分內(nèi)容,實(shí)現(xiàn)對(duì)用戶信息和處方信息維護(hù)等等一系列的功能,本項(xiàng)目的難點(diǎn)主要是數(shù)據(jù)結(jié)構(gòu)比較復(fù)雜,表與表之間的關(guān)系比較復(fù)雜,處理起來比較麻煩,由于本人的設(shè)計(jì)水平有限,實(shí)現(xiàn)的功能比較簡(jiǎn)單,還有一些功能沒有具體實(shí)現(xiàn),比如權(quán)限的管理,整套系統(tǒng)對(duì)WebSocket的支持,沒有用戶方面的操作.另外,遺憾的是本項(xiàng)目默認(rèn)的藥物的數(shù)據(jù)量是不大的,確切的說應(yīng)該對(duì)這些藥物進(jìn)行分類或者分藥房管理,如果藥物數(shù)據(jù)量太大的話執(zhí)行起來是比較耗時(shí)間的。還有一點(diǎn)就是本項(xiàng)目沒有考慮到系統(tǒng)的并發(fā)性,沒有考慮到多個(gè)醫(yī)師處理同一個(gè)處方信息的情況,當(dāng)然這種情況可以添加權(quán)限來進(jìn)行管理。參考資料PaulDeck著,SpringMVC學(xué)習(xí)指南。美:人民郵電出版社,20015MarkPollack,SpringData實(shí)戰(zhàn).美:人民郵電出版社,2014C.J。Date,數(shù)據(jù)庫設(shè)計(jì)與關(guān)系理論.北京,機(jī)械工業(yè)出版社,2013SoftwareDocumentat(yī)ion。http://www。literatep/documentat(yī)ion.pdf,2001StrategiesforAgileSoftwareDevelopment.www.a(chǎn)gliemodeling.http://www。agilemodeling.com/essays/agileDocumentation.htm,2012附件(主要功能源代碼)1。實(shí)體對(duì)象(1)@Entity@Table(name=”user")publicclassUser{ @Id@GeneratedValue(strategy=GenerationType.AUTO)?privat(yī)eintid;//用戶id @Column(length=32) privateStringname;//用戶姓名 privateStringtelephone;//用戶電話@DateTimeFormat(pattern=”MM/dd/yyyy")//用戶出生日期 @Temporal(TemporalType.DATE) privateDatebirthday; @Column(length=32)//承保公司?privateStringinsuranceCompany;?@Column(length=32)//保單號(hào)?privat(yī)eStringpolicyNumber; @OneToMany(fetch=FetchType.LAZY,mappedBy="user",cascade=CascadeType.ALL)?privat(yī)eSet<Prescription>prescriptions;? publicSet<Prescription>getPrescriptions(){ returnprescriptions; }?//省略setter和getter}(2)@Table(name=”department")@EntitypublicclassDepartment{?@Id@Generat(yī)edValue(strategy=GenerationType.AUTO(shè))?privateintid; @Column(length=32,nullable=false) privateStringname;//部門的名字?@OneToMany(fetch=FetchType。LAZY,mappedBy="department",cascade=CascadeType.ALL)?privateSet〈Doctor>doctors=newHashSet<Doctor>();//該部門下的醫(yī)生//省略setter和getter}(3)@Table(name="position")@EntitypublicclassPosition{ @Id@GeneratedValue(strategy=GenerationType.AUTO) privateintid; @Column(length=32,nullable=false)?privateStringname;//職位的名稱?@OneToMany(fetch=FetchType.LAZY,mappedBy=”position”,cascade=CascadeType。ALL) @OrderBy(value=”idASC") privateSet<Doctor>doctors=newHashSet<Doctor〉();//該職位下的醫(yī)生//省略setter和getter}(4)@Entity@Table(name="doctor")publicclassDoctor{?@Id@GeneratedValue(strategy=GenerationType.AUTO)?privateintid;@Column(length=32,nullable=false)?privateStringname;//醫(yī)師姓名?@Column(length=32,nullable=false)?privateStringtelephone;//醫(yī)師電話@Column(length=32,nullable=false) privateStringpassword;//登錄密碼@ManyToOne(fetch=FetchType.EAGER,targetEntity=Department.class,optional=false) @JoinColumn(name="did")?privateDepartmentdepartment;//醫(yī)師所屬的部門 @ManyToOne(fetch=FetchType.EAGER,targetEntity=Position.class,optional=false)?@JoinColumn(name="pid")?privatePositionposition;//醫(yī)師的職位 @OneToMany(fetch=FetchType.LAZY,mappedBy=”doctor”,cascade=CascadeType.ALL) privateSet<Prescription>prescriptions;//該醫(yī)生的處方//省略setter和getter}(5)@Entity@Table(name="prescription")publicclassPrescription{?@Id@GeneratedValue(strategy=GenerationType.AUTO) privateintid; @DateTimeFormat(pattern="MM/dd/yyyy”) @Temporal(TemporalType。DATE)privateDatebegindate;//處方開始日期?@DateTimeFormat(pattern="MM/dd/yyyy”)?@Temporal(TemporalType.DATE)?privateDatee(cuò)nddate;//處方終止日期?@Column(length=4) privateintcrawlagainst;//有效抓要次數(shù)@ManyToOne(fetch=FetchType.LAZY,targetEntity=User.class,optional=false)?@JoinColumn(name=”uid") privateUseruser;//處方所屬用戶 @ManyToOne(fetch=FetchType.LAZY,targetEntity=Doctor。class,optional=false) @JoinColumn(name=”did") privateDoctordoctor;//處方所屬醫(yī)生?@OneToMany(fetch=FetchType。EAGER,mappedBy="prescription",cascade=CascadeType。ALL)?privateSet<PrescriptionDetail〉prescriptionDetails=newHashSet〈PrescriptionDetail〉();//省略setter和getter}(6)@Table(name="prescriptiondetail”)@EntitypublicclassPrescriptionDetail{?@Id@GeneratedValue(strategy=GenerationType.AUTO) privateintid;@Column(length=4,columnDefinition="INTdefault1”)?privat(yī)eintcount;//該藥的數(shù)量@Column(length=16) privat(yī)eStringunit;//該藥的單位 @Column(length=128,columnDefinition=”Stringdefault無建議的服用方式”) privateStringtakemethod;//服用方式?@Column(length=16,columnDefinition=”Stringdefault否") privateStringcanuse;//是否可用替代藥品?@ManyToOne(fetch=FetchType.LAZY,targetEntity=Prescription.class,optional=false)?@JoinColumn(name="pid")?privatePrescriptionprescription;//該處方詳細(xì)所屬的處方 @ManyToOne(fetch=FetchType。LAZY,targetEntity=Medicine.class,optional=false) @JoinColumn(name=”mid") privat(yī)eMedicinemedicine;//藥物信息//省略setter和getter}(7)@Entity@Table(name="medicine")publicclassMedicine{ @Id@GeneratedValue(strat(yī)egy=GenerationType.AUTO)?privat(yī)eintid;?@Column(length=64,nullable=false) privat(yī)eStringname;//藥物名稱?@Column(length=128)?privateStringsideeffect;//副作用?@OneToMany(fetch=FetchType.LAZY,mappedBy="medicine",cascade=CascadeType.ALL,targetEntity=PrescriptionDetail.class)?privateSet<PrescriptionDetail>prescriptionDetails=newHashSet〈PrescriptionDetail>();??@OneToMany(cascade=CascadeType.ALL,fetch=FetchType。LAZY) @JoinTable(name="subtitute",joinColumns={@JoinColumn(name="m_id”)},inverseJoinColumns ={@JoinColumn(name="s_id")}) privateSet〈Medicine>substitutes=newHashSet<Medicine〉();//可替代的藥品列表//省略setter和getter}2。數(shù)據(jù)訪問接口(1)DoctoryRepository@Repository(value="doctoryDao")@Transactional(readOnly=true)publicinterfaceDoctorRepositoryextendsJpaRepository<Doctor,Integer>{@Modifying@Query("updat(yī)eDoctordsetd.name=:name,d.telephone=:telephonewhered。id=:id")publicvoidupdate(@Param("name”)Stringname,@Param("telephone")Stringtelephone,@Param("id")Integerid); publicDoctorfindByNameAndPassword(Stringname,Stringpassword);}(2)MedicineRepository@Repository(value=”medicineDao")@Transactional(readOnly=true)publicinterfaceMedicineRepositoryextendsJpaRepository<Medicine,Integer>{}(3)PrescriptionRepository@Transactional@Repository("prescriptionDao”)publicinterfacePrescriptionRepositoryextendsJpaRepository<Prescription,Integer〉{ //根據(jù)用戶id號(hào)查詢處方記錄 publicList<Prescription〉findPrescriptionsByUserId(Integerid); @Query("fromPrescriptionpreorderbypre。idDESC”) publicList<Prescription>find(); //更新處方,減少處方可取次數(shù)?@Modifying @Query(value="updateprescriptionsetcrawlagainst=crawlagainst-1whereid=:id",nativeQuery=true)?publicvoiddecreasePrescription(@Param("id”)Integerid);?//更新處方信息 @Modifying @Query(value=”updatePrescriptionpresetpre.enddate=:enddate,pre.crawlagainst=:crawlagainstwherepre.id=:id”) publicvoidupdate(@Param("enddate”)Dat(yī)eenddate,@Param("crawlagainst")Integercrawlagainst,@Param(”id”)Integerid); @Query(value=”select,u。policy_number,u.telephone,u。insurance_company,count(*),u.idfromprescriptionpinnerjoinuseruwhereu.id=p。uidgroupbyp。uid",nat(yī)iveQuery=true)?publicList〈Object[]〉showUPrescriptionCount(); @Query(value="select*fromprescriptionorderbyiddesclimit1",nativeQuer=true) publicPrescriptionfindLastPrescription();}(4)PrescriptionDetailRepository@Repository(value="prescriptionDetailDao")publicinterfacePrescriptionDetailRepositoryextendsJpaRepository〈PrescriptionDetail,Integer〉{ //更新處方詳細(xì)信息 @Transactional@Modifying @Query(value=”updatePrescriptionDetaildetailsetdetail.count=:count,detail.unit=:unit,detail。takemethod=:takemethod,detail。canuse=:canusewheredetail.id=:id")?publicvoidupdateDetail(@Param("count”)Integercount,@Param("unit")Stringunit,@Param("takemethod”)Stringtakemethod,@Param(”canuse")Stringcanuse,@Param("id”)Integerid);}(5)UserRepository@Transactional@Repository("userDao”)publicinterfaceUserRepositoryextendsJpaRepository〈User,Integer>{?@Modifying @Query("updateUserusetu。name=:name,u。birthday=:birthday,u.telephone=:telephone,u.insuranceCompany=:insuranceCompany,u.policyNumber=:policyNumberwhereu.id=:id”) publicvoidupdate(@Param(”name")Stringname,@Param(”birthday")Datebirthday,@Param(”telephone”)Stringtelephone,@Param(”insuranceCompany")StringinsuranceCompany,@Param(”policyNumber")StringpolicyNumber,@Param("id")Integerid); //根據(jù)搜索關(guān)鍵字查詢用戶?@Query(”fromUseruwhereconcat(yī)(u。name,u.birthday,u。telephone,u。insuranceCompany,u。policyNumber)likeCONCAT('%',:search,’%')”)?publicList<User>findUserByAll(@Param("search")Stringsearch);//根據(jù)承保公司計(jì)算用戶的數(shù)量 ?@Query("selectcount(*),insuranceCompanyfromUserugroupbyu。insuranceCompany")?publicList〈Object[]〉countUser();?//根據(jù)不同的年齡段統(tǒng)計(jì)用戶的數(shù)量 @Query(value="selectcount(*),left(birthday,4)fromusergroupbyleft(birthday,4)”,nativeQuery=true)?publicList<Object[]〉findByAgeCount();?//查詢用戶的出生年份,月份,日期?@Query(value="selectleft(birthday,4),substring(birthday,6,2),substring(birthday,9,2)fromuser",nativeQuery=true) publicList<Object[]>findByYearMonthdayDay();?//根據(jù)用戶的電話號(hào)碼判斷是否存在?@Query(”fromUseruwhereu.telephone=:telephone")?publicUserexist(@Param("telephone")Stringtelephone);}3.業(yè)務(wù)層接口和類(1)publicinterfaceBaseService〈T〉{ publicvoidadd(Tt);?publicTsearch();?publicTfind(Integerid); publicList<T〉find(String[]Param); publicList〈T〉get(Integerid); publicTfind(Tt); publicList〈T>find(); publicvoiddelete(Tt);publicvoiddelete(Integerid);?publicList<Object[]>get(); publicList<Object[]>get(Tt); publicvoidupdate(Tt);publicvoidupdate(Integerid); publicLongcount();?publicList〈T〉findPage(intpage,intpageSize); publicTexist(Tt);}(2)publicclassBaseServiceImpl<T>implementsBaseService〈T〉{ @Autowired?privateJpaRepository〈T,Integer>dao; publicvoidadd(Tt){dao。save(t);} publicTfind(Integerid){returndao。findOne(id);}?publicTfind(Tt){returnnull;} publicList〈T>find(){returndao.findAll();}?publicvoiddelete(Tt){dao.delete(t);} publicvoiddelete(Integerid){dao。delete(id);}?publicvoidupdate(Tt){}?publicLongcount(){returndao。count();} publicList〈T>findPage(intpage,intpageSize){? if(page〈1){page=1;} if(pageSize<1){pageSize=16;}??Pageablepageable=newPageRequest(page-1,pageSize); ?returndao。findAll(pageable).getContent(); } publicList〈T>find(String[]Param){returnnull;}?publicList〈T>get(Integerid){returnnull;} publicList〈Object[]>get(){returnnull;} publicList<Object[]>get(Tt){returnnull;}?publicTexist(Tt){returnnull;}?publicTsearch(){returnnull;} publicvoidupdate(Integerid){}}(3)@ServicepublicclassDoctorServicee(cuò)xtendsBaseServiceImpl<Doctor〉{?@Autowired privat(yī)eDoctorRepositorydoctorDao;?@Override publicDoctorfind(Doctort){? returndoctorDao.findByNameAndPassword(t。getName(),t.getPassword());?}}(4)@ServicepublicclassMedicineServiceexte

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論