版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
基于JSP的網(wǎng)上處方跟蹤系統(tǒng)(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)
基于JSP的網(wǎng)上處方跟蹤系統(tǒng)(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)長沙理工大學《軟件工程綜合課程設(shè)計》報告基于JSP的網(wǎng)上處方跟蹤系統(tǒng)專業(yè):軟件工程班級:姓名:報告日期:2016年6月30日目錄1背景與意義?1。1背景與現(xiàn)狀 1。2趨勢與前景?1。3工作基礎(chǔ)、條件與優(yōu)勢 2需求分析?2.1功能與性能需求 2.2其它需求 3內(nèi)容和目標 3.1主要內(nèi)容 3.2預(yù)期目標?4技術(shù)路線 4.1總體功能 4。2運行平臺具 4。2.1網(wǎng)絡(luò)環(huán)境?4.2.2設(shè)備情況 4.2。3支撐軟件?4。3程序語言與開發(fā)工具 4.4關(guān)鍵技術(shù)?5進度計劃 6條件、假定和限制?7系統(tǒng)設(shè)計與原型UI(或系統(tǒng)設(shè)計與實現(xiàn)) 7.1數(shù)據(jù)庫表設(shè)計 7.2關(guān)鍵算法與實現(xiàn)技術(shù) 7。3主要原型UI(或主要功能實現(xiàn))?7.4測試方案與測試用例 7。5安裝與運行情況 7.5。1安裝與配置 7。5.2運行情況圖 8總結(jié)?參考文獻?附件:主要功能的源代碼1背景與意義1。1背景與現(xiàn)狀隨著互聯(lián)網(wǎng)不斷的發(fā)展,計算機已經(jīng)深入到了各行各業(yè),計算機不再局限于對科學技術(shù)的研究,當今時代,計算機可以決解大部分的具體問題,而且有利于人們的控制,這大大方便了人們的需求。當今的中小型醫(yī)院中一般還沒有全面采用信息技術(shù)來進行管理,所以建議一套計算機輔助經(jīng)營管理系統(tǒng)是必不可少的。本系統(tǒng)是專門為處方專門設(shè)計的,我們知道,傳統(tǒng)的記錄使用手工的方式來記錄數(shù)據(jù),但是如果用手工的方式記錄數(shù)據(jù),如果數(shù)據(jù)量很大,那么結(jié)果往往就很容易出錯;而且,隨著時間的積累,數(shù)據(jù)變得越來越多,且容易丟失,傳統(tǒng)的手工管理極大的浪費了人力和財力,不能滿足醫(yī)師和醫(yī)院之間的需求。?總的來說,使用一個高效率的系統(tǒng)來處理這些繁雜的流程是必須的,所以我們有必要建立一個處方跟蹤系統(tǒng)來處理這一系列的問題,讓醫(yī)師可以通過系統(tǒng)方便的記錄病史癥狀,開處方,查閱歷史處方,保存。通過這樣,這些數(shù)據(jù)能被即使、準確、有效的處理。這不僅可以提高工作效率還可以確保信息的安全和準確。1。2趨勢與前景目前,國內(nèi)的大多數(shù)醫(yī)院均不同程度的將計算機技術(shù)應(yīng)用于醫(yī)院管理.該系統(tǒng)對軟件沒有太高的要求,市場上已存在各式各樣的軟件足以滿足各方面的要求.但是不同軟件之間由于需求的不一致或者是根據(jù)不同的政策標準難以實現(xiàn)軟件統(tǒng)一化,現(xiàn)在醫(yī)療行業(yè)飛速發(fā)展,國家政策不斷的推陳出新也使軟件的開發(fā)出現(xiàn)多樣化,模塊的多樣化造成了維護原有系統(tǒng)上的困難,傳統(tǒng)的軟件業(yè)務(wù)有的已經(jīng)也不符合當今的要求,所以開發(fā)一款符合當今社會需求的軟件是有必要的。1。3工作基礎(chǔ)、條件和優(yōu)勢(1)技術(shù)可行性該系統(tǒng)對軟件沒有太高的要求,但是開發(fā)人員必須具有該軟件開發(fā)的專業(yè)知識,已經(jīng)開發(fā)過相關(guān)的醫(yī)學管理系統(tǒng),在熟悉業(yè)務(wù)的情況下進行開發(fā),完善更多的功能業(yè)務(wù)。(2)經(jīng)濟可行性該軟件的開發(fā)成本較低,在有前人開發(fā)的經(jīng)驗中開發(fā)風險小,系統(tǒng)投入運行后會給醫(yī)院帶來可觀的經(jīng)濟效益:一方面提高了工作效率,增加了市場競爭力。另一方面,所需要的人員減少也提高了經(jīng)濟效益.(3)人才設(shè)備可行性對于針對醫(yī)療行業(yè)軟件開發(fā)的人員是相當多的,在設(shè)備方面同樣比較容易進行,所以在人才設(shè)備上是可行的。2需求分析2。1功能和性能需求功能需求:處方管理系統(tǒng)的構(gòu)建是以醫(yī)師處方為中心,實時錄入病人信息,開處方,生成處方,進行數(shù)據(jù)的統(tǒng)計,簡化了傳統(tǒng)處方信息處理的過程。本系統(tǒng)的重點是跟蹤處方的信息數(shù)據(jù)并處理數(shù)據(jù),處理數(shù)據(jù)時相關(guān)的數(shù)據(jù)對象有如下有以下:(1)系統(tǒng)跟蹤每位顧客的以下信息:?顧客姓名、電話號碼、出生日期、承保公司、保險號、處方歷史記錄(2)每位顧客的服藥史將記錄下列每次處方信息:?由藥房給出的唯一的處方ID號、處方開出的藥物、開處方的醫(yī)生姓名和電話號碼、處方日期、處方終止日期、有效購藥次數(shù)、配藥“單位”數(shù)量(此處的“單位”可能是片、匙和毫升等-—-見后面關(guān)于藥品的討論)、如果有其它替代品,是否可以向顧客提供替代品。(3)對于藥房存貨的每種藥品,系統(tǒng)應(yīng)跟蹤的如下:?藥品名稱,藥品“單位”(片、匙和毫升等),哪些其它藥品可以作為另一種這種藥品的替代品,服用藥品可能引起的副作用。(4)系統(tǒng)所支持的查詢功能:服藥史,即給定顧客的所有處方歷史記錄—根據(jù)顧客的要求提供的報告,某種給定藥品的副作用報告,隨處方一起提供某種給定藥品的可替換藥品列表一份給定處方是否還有購藥許可:即,是否還可以憑處方購藥,以及處方是否已經(jīng)過期。性能需求:?(1)時間特性要求?服務(wù)器啟動時間不超過1分鐘;系統(tǒng)響應(yīng)時間:用戶在使用軟件的過程中對各個功能模塊中的鼠標點擊、鍵盤輸入等操作響應(yīng)的時間不操作1秒。?(2)數(shù)據(jù)精度 要按照嚴格的數(shù)據(jù)格式輸入,對符合數(shù)據(jù)格式要求的輸入進行提示。?(3)服務(wù)器并發(fā)和可伸縮性?軟件應(yīng)采用界面層、應(yīng)用程、數(shù)據(jù)層三層架構(gòu),若以后用戶數(shù)量增多,只需要增加應(yīng)用層的服務(wù)器數(shù)量,實現(xiàn)可裁減、可擴充和可移植等不同方面的要求.采用模塊化的應(yīng)用軟件結(jié)構(gòu),確保系統(tǒng)可以靈活的擴充其業(yè)務(wù)功能,并可與其他業(yè)務(wù)系統(tǒng)進行無縫連接。 (4)系統(tǒng)安全性 數(shù)據(jù)庫設(shè)計闡明使用何種方式保證系統(tǒng)的安全.2.2其它需求可靠性和可用性需求:出錯處理需求:接口需求:Mysql、Soap、約束需求:暫無逆向需求:暫無將來可能的需求:3內(nèi)容和目標3.1主要內(nèi)容(1)用戶信息維護,實現(xiàn)用戶信息的錄入、查詢、修改以及刪除等功能。(2)處方信息處理,針對不同的用戶記錄用戶的處方信息,其中處方信息中記錄處方開出的藥物、開處方的醫(yī)生姓名和電話號碼、處方日期、處方終止日期、有效購藥次數(shù)、配藥“單位”數(shù)量(此處的“單位”可能是片、匙和毫升等-——見后面關(guān)于藥品的討論)、如果有其它替代品,是否可以向顧客提供替代品等信息,并可對該處方進行修改以及刪除等操作.(3)處方歷史查詢,查詢所有的處方信息,或者根據(jù)用戶的信息模糊查詢到該用戶的處方信息。(4)處方藥物信息處理,藥方根據(jù)處方信息處理藥物并確認處理。3.2預(yù)期目標系統(tǒng)必須根據(jù)需求實現(xiàn)核心業(yè)務(wù)上的需求內(nèi)容,系統(tǒng)必須嚴格按照說明書上來開發(fā),最終的系統(tǒng)必須達到需求說明書上的要求,實現(xiàn)一個可靠的、易用的處方跟蹤系統(tǒng),該系統(tǒng)實現(xiàn)了對用戶信息、處方信息的一體化處理。4技術(shù)路線4。1總體功能圖4。-1—1總體功能結(jié)構(gòu)圖圖4.—1-3系統(tǒng)數(shù)據(jù)流圖4.2運行平臺4。2。1網(wǎng)絡(luò)環(huán)境局域網(wǎng)網(wǎng)絡(luò)環(huán)境以及私有的IP地址該局域網(wǎng)的網(wǎng)拓撲結(jié)構(gòu)如圖4-2-1-1所示:圖4-2—1-1網(wǎng)絡(luò)拓撲圖4。2.2設(shè)備情況服務(wù)器端:處理器主頻1000MHz內(nèi)存容量64GB主機型號與數(shù)量PA—8800/2外存容量16GB設(shè)備型號與數(shù)量惠普9000rp7420/2輸入及輸出設(shè)備型號與數(shù)量L455有線多媒體鍵盤/1、S22B360HW顯示器/1、N215鼠標/1數(shù)據(jù)通信設(shè)備型號與數(shù)量交換機華為S1724G/1其他專用硬件設(shè)備與數(shù)量無客戶端:處理器主頻不限定設(shè)備的型號與數(shù)量不限定主機型號與數(shù)量不限定外存容量不限定設(shè)備型號與數(shù)量無輸入及輸出設(shè)備型號與數(shù)量交換機華為S1724G/1數(shù)據(jù)通信設(shè)備型號與數(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項目管理工具4。4關(guān)鍵技術(shù)(1)HTML5WebSocketAPI客戶端與服務(wù)器端進行全雙工通訊,WebSocket的出現(xiàn)是基于Web應(yīng)用的實時性需要而產(chǎn)生的,它允許客戶端和服務(wù)器在任意時刻互相推送消息。WebSocket是下一代客戶端-服務(wù)器異步通訊的方法,它本事上任然是一個基于TCP的協(xié)議,它使用ws或wss協(xié)議,可用于任意的客戶端和服務(wù)器。為了建立一個WebSocket連接,客戶端瀏覽器首先要向服務(wù)器發(fā)起一個HTTP請求,這個請求和通常的HTTP請求不同,包含了一些附加頭信息,其中附加頭信息”Upgrade:WebSocket”(”Upgrade:WebSocket"表示這是一個特殊的HTTP請求,請求的目的就是要將客戶端和服務(wù)器端的通訊協(xié)議從HTTP協(xié)議升級到WebSocket協(xié)議。)表明這是一個申請協(xié)議升級的HTTP請求,服務(wù)器端解析這些附加的頭信息然后產(chǎn)生應(yīng)答信息返回給客戶端,客戶端和服務(wù)器端的WebSocket連接就建立起來了,雙方就可以通過這個連接通道自由的傳遞信息,并且這個連接會持續(xù)存在直到客戶端或者服務(wù)器端的某一方主動的關(guān)閉連接。它的通訊方式如下:圖4-4—1客戶端和服務(wù)器websocket通訊。圖4-4—1客戶端和服務(wù)器websocket通訊(2)HighChats一套由純Javascript寫的表現(xiàn)層框架,它提供曲線、面積、柱形圖、條形圖、餅圖、散點圖、區(qū)域范圍圖、氣泡、漏斗等等一系列的圖形表現(xiàn)形式。HighChars不需要像Flash和Java那樣需要插件才可以運行,而且運行速度快,它是輕量級的JavaScript腳本,它使用的是json數(shù)據(jù)格式,數(shù)據(jù)傳輸更加方便,而且它的數(shù)據(jù)是在客戶端解析的,減輕了服務(wù)器的壓力,所以它比JFreeChart更方便(JFreeChart是JAVA平臺上的一個開放的圖表繪制類庫。它完全使用JAVA語言編寫在我看來JFreeChart有點笨重了,而且它生成的圖形也比HighChart少,并且好像是收費的)。另外HighCharts還有很好的兼容性,能夠完美支持當前大多數(shù)瀏覽器。(3)SpringDataJPA提供了一整套數(shù)據(jù)訪問層(DAO)的解決方案,致力于減少數(shù)據(jù)訪問層的開發(fā)量,并支持云服務(wù)的開源框架。SpringData作為SpringSource的其中一個父項目,旨在統(tǒng)一和簡化對各類型持久化存儲,而不拘泥于是關(guān)系型數(shù)據(jù)庫還是NoSQL數(shù)據(jù)存儲.無論是哪種持久化存儲,數(shù)據(jù)訪問對象(或稱作為DAO,即DataAccessObjects)通常都會提供對單一域?qū)ο蟮腃RUD(創(chuàng)建、讀取、更新、刪除)操作、查詢方法、排序和分頁方法等。SpringData則提供了基于這些層面的統(tǒng)一接口(Repository、CrudRepository、PagingAndSortingRepository、JpaRepository)以及對持久化存儲的實現(xiàn)。JPA(JavaPersistenceAPI,Java持久化API)是sun提出的一個對象持久化規(guī)范,各JavaEE應(yīng)用服務(wù)器自主選擇實現(xiàn),JPA的底層實現(xiàn)是一些流行的開源ORM(對象關(guān)系映射)框架(如Hibernat(yī)e、OpenJPA、TopLink、Ibat(yī)is等等),因此JPA其實也就是java實體對象和關(guān)系型數(shù)據(jù)庫建立起映射關(guān)系,通過面向?qū)ο缶幊痰乃枷氩僮麝P(guān)系型數(shù)據(jù)庫的規(guī)范。JPA,定義了對象-關(guān)系映射以及實體對象持久化的標準接口.如下圖:圖4-4-2JPA在應(yīng)用程序中的位置:圖4-4—2JPA在應(yīng)用程序中的位置SpringDataJpa是SpringData對JPA提供的一套解決方案。SpringDataJpa實現(xiàn)了大部分的持久層的邏輯代碼,你需要做的只是聲明持久層的接口,其他的都交給SpringDat(yī)aJpa完成。SpringDataJpa中Repository是一個空接口,CrudRepository:繼承Repository,實現(xiàn)了一組CRUD相關(guān)的方法,PagingAndSortingRepository:繼承CrudRepository,實現(xiàn)了一組分頁排序相關(guān)的方法,JpaRepository:繼承PagingAndSortingRepository,實現(xiàn)一組JPA規(guī)范相關(guān)的方法。相關(guān)技術(shù)方案參考SpringData實戰(zhàn)的書籍[2]。SpringDataJpa提供的接口如下圖4-4-3SpringDat(yī)aJpa提供的接口圖:圖4—4-3SpringDataJpa提供的接口圖(4)SpringMVC,SpringWebMVC是一種基于Java的實現(xiàn)了WebMVC設(shè)計模式的請求驅(qū)動類型的輕量級Web框架,即使用了MVC架構(gòu)模式的思想,將web層進行職責解耦,基于請求驅(qū)動指的就是使用請求—響應(yīng)模型,框架的目的就是幫助我們簡化開發(fā),SpringWebMVC也是要簡化我們?nèi)粘eb開發(fā)的。它的請求處理流程圖如下:圖4—4—2springMVC請求處理流程圖前端控制器首先接收到用戶的請求,前端控制器根據(jù)接收的請求信息把請求委托給頁面控制器來處理。處理器接收請求后調(diào)用相應(yīng)的業(yè)務(wù)對象處理請求,如果有數(shù)據(jù)庫操作會向數(shù)據(jù)庫請求數(shù)據(jù),并返回一個模型視圖(一般是ModelAndView),返回的模型經(jīng)過視圖解析器把,模型數(shù)據(jù)解析到頁面中并返回給客戶端。SpringMVC充分對模型、視圖、控制器進行充分的解耦,并利用SpringIOC的功能更加方便管理。相關(guān)技術(shù)方案參考SpringMVC學習指南的書籍[1]。(5)REST風格URL,REST架構(gòu)風格是全新的針對Web應(yīng)用的開發(fā)風格,是當今世界最成功的互聯(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é)議的,任何對資源的操作行為都是通過Http協(xié)議來實現(xiàn)。以往的Web開發(fā)大多數(shù)用的都是Http協(xié)議中的GET和POST方法,對其他方法很少使用,這實際上是因為對Http協(xié)議認識片面的理解造成的。Http不僅僅是一個簡單的運載數(shù)據(jù)的協(xié)議,而是一個具有豐富內(nèi)涵的網(wǎng)絡(luò)軟件的協(xié)議。他不僅僅能對互聯(lián)網(wǎng)資源進行唯一定位,而且還能告訴我們?nèi)绾螌υ撡Y源進行操作。Http把對一個資源的操作限制在4個方法以內(nèi):GET,POST,PUT和DELETE,這正是對資源CRUD操作的實現(xiàn)。由于資源和URI是一一對應(yīng)的,執(zhí)行這些操作的時候URI是沒有變化的,這和以往的Web開發(fā)有很大的區(qū)別.正由于這一點,極大的簡化了Web開發(fā),也使得URI可以被設(shè)計成更為直觀的反映資源的結(jié)構(gòu),這種URI的設(shè)計被稱作RESTful的URI.基于RESTURL風格的請求方式如下:圖4-4-2基于RESTURL風格的請求5進度計劃說明本項目的進度要求,參照軟件工程的三個時期中的八個階段時間安排問題定義3日可行性分析2日需求分析5日總體設(shè)計5日詳細設(shè)計10日編碼和單元測試15日綜合測試5日軟件維護5日操作培訓3日驗收測試2日項目驗收2日總計為57天6條件、假定和限制(1)建議開發(fā)軟件開發(fā)投入的時間:兩個月(2)經(jīng)費來源及限制:由需求方提供(3)軟件的預(yù)期壽命:兩年(4)網(wǎng)絡(luò)環(huán)境:局域網(wǎng)(5)運行環(huán)境:mysql5。1,JavaRuntimeEnviroment1.7及以上版本(6)客戶端環(huán)境:InternetExplorer8。0及以上的版本(7)硬件設(shè)備:處理器InterPentinm3或者更高,內(nèi)存至少256M以上,硬盤至少2G(8)平臺:linuxredhat5.6以上,內(nèi)核版本kernel-2.6.18—238.el5(9)法律和政策:遵守相關(guān)的法律法規(guī),以保護用戶的隱私為前提開發(fā)軟件7系統(tǒng)設(shè)計與原型UI(或系統(tǒng)設(shè)計與實現(xiàn))7.1數(shù)據(jù)庫表設(shè)計數(shù)據(jù)庫名:Prescription數(shù)據(jù)庫管理者賬號:root密碼:root賬號操作權(quán)限:CREATE、DROP、DELETE、INSERT、UPDATE、SELECT、ALTERUser表:記錄用戶的基本信息。表User(用戶表)用于保存用戶的基本信息字段名數(shù)據(jù)類型長度主鍵描述IdInt11是用戶編號NameVarchar64否用戶姓名TelephoneVarchar20否電話號碼BirthdayData10否出生日期insurance_companyVarchar32否承保公司Policy_numberVarchar64否保單號表7-1-1User表Department表:部門表,醫(yī)師所屬部門。表Department(部門表)用于保存醫(yī)師的部門字段名數(shù)據(jù)類型長度主鍵描述IdInt11是部門編號NameVarchar64否部門名稱表7—1—2Department表Position表:醫(yī)師所屬職位.表Position(職位表)用于保存醫(yī)師的職位信息字段名數(shù)據(jù)類型長度主鍵描述IdInt11是職位編號NameVarchar64否職位名稱表7-1—3Department表Doctor表:醫(yī)師基本信息,包括兩個外鍵,表示醫(yī)師所屬的部門和職位。表Doctor(醫(yī)師表)用于保存醫(yī)師的基本信息字段名數(shù)據(jù)類型長度主鍵描述IdInt11是醫(yī)師編號NameVarchar64否醫(yī)師姓名TelephoneVarchar20否電話號碼DidInt11否醫(yī)師所屬部門PidInt11否醫(yī)師所屬職位表7—1-4Doctor表Prescription表:處方信息表,記錄處方基本信息以及兩個外鍵,一個是該處方所屬的用戶,另一個是處方所屬醫(yī)師。表Prescription(處方信息表)用于保存處方的基本信息字段名數(shù)據(jù)類型長度主鍵描述IdInt11是處方編號UidInt11否該處方所屬用戶DidInt11否該處方所屬醫(yī)師BeginDat(yī)eDate16否處方日期EndDateDat(yī)e16否處方終止日期CrawlAgainstInt4否再次抓藥的次數(shù)表7-1-5Prescription表PrescriptionDetail表:處方詳細信息表,記錄一個處方中多個處方詳細信息記錄,兩個外鍵,一個表示該處方詳細所屬的處方,另一個表示該處方詳細中具體的藥物信息。表PrescriptionDetail(處方詳細信息表)用于保存處方的具體的信息字段名數(shù)據(jù)類型長度主鍵描述IdInt11是處方詳細編號CountInt4否數(shù)量CanuseString16否是否可用替代藥品Take_methodString255否服用的方式UnitString16否單位MidInt11否藥物的編號PidInt11否處方的編號表7-1-6PrescriptionDetail表Medicine表:記錄藥物的基本信息。表Medicine(藥物信息表)用于保存藥物的信息字段名數(shù)據(jù)類型長度主鍵描述IdInt11是藥物的編號NameString64否藥物的名稱SideeffectString255否副作用表7-1-7Medicine表Subtitute表:藥物可替代的藥品表,每個藥物如果有可替代的藥物,那么該藥物將會維持一份藥物替代表,其中兩個字段都是外間,一個是指向具體的某個藥物,另外一個是指向可替代藥物的id編號。表Subtitute(藥物替代表)用于保存藥物的可替代藥物的信息字段名數(shù)據(jù)類型長度主鍵描述M_idInt11是藥物的編號S_idInt11是藥物的標號表7-1-8Subtitute表數(shù)據(jù)庫總體UML如下圖7—1-9數(shù)據(jù)庫UML圖7—1—9數(shù)據(jù)庫UML數(shù)據(jù)庫設(shè)計相關(guān)技術(shù)方案參考據(jù)庫設(shè)計與關(guān)系理論[4]與數(shù)據(jù)庫設(shè)計與應(yīng)用開發(fā)實踐[5].無,由于使用了springdatajpa操作數(shù)據(jù)庫,springdatajpa簡化了數(shù)據(jù)庫訪問的操作.7。2關(guān)鍵算法與實現(xiàn)技術(shù)1。系統(tǒng)難點:添加一個處方信息可一次性提交多個處方詳細信息(相當于每次開藥方包含多種藥物,每種藥物的數(shù)量也不一致),每個處方詳細信息中又包含了基本信息以及藥品對象。為了解決該問題,每次選擇和填好一種藥物后都實用ajax保存到服務(wù)器上的session中,當然,在服務(wù)器上建立了兩個類來暫時存放這些數(shù)據(jù),分別是PrescriptionDetailOperat(yī)or和PrescriptionOperator兩個類。classPrescriptionDetailOperat(yī)or{?privacount;//每個藥品的數(shù)量 privateStringunit;//每個藥品的單位?privateMedicinemedicine;//該藥品的對象?privateStringtakeMethod;//服用方法?privateStringcanuse;//是否可以實用替代藥品 //省略getter和setter方法}classPrescriptionOperator{ //聲明一個map來保存多個PrescriptionDetailOperator?qū)ο?,實用藥品的id作為主鍵?privat(yī)eMap<Integer,PrescriptionDetailOperator>map= ??newLinkedHashMap<Integer,PrescriptionDetailOperator〉();?publicCollection<PrescriptionDetailOperator>getPreDetail(){ ?returnmap.values();?} //每次添加的時候都檢查是否存在藥物,存在則在原來的數(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); }?}?//可以移除處方詳細信息?publicvoidremovePreDetail(Integerpid){??if(map。containsKey(pid)){ ?? ?map。remove(pid);? }?}}前臺使用ajax發(fā)送數(shù)據(jù)保存到服務(wù)器端:varpdid;//保存處方詳細的idvar$tmp;//用于保存當前刪除的對象的引用//保存更新處方詳細信息functionsaveDetail(item){?varpdid=$(item)。attr(”lang”)。trim();//處方詳細唯一編號?var$count;//數(shù)量?varcanuse;//是否可用替代藥品?varunit;//實用藥品單位 vartake_method;//服用方法 //遍歷找到一個處方詳細的信息 $(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('請輸入正確的數(shù)字,該數(shù)字不能小于1!’,2000,false); ?$count.val("1")。focus(); return; } //發(fā)送ajax保存處方詳細信息?$.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(’刪除失敗,請檢查服務(wù)器或網(wǎng)絡(luò)狀態(tài)!',2000,false);}?}, error:function(){$。tooltip('刪除失敗,請檢查服務(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表查詢用戶對象fromUseruwhereconcat(u.name,u。birthday,u.telephone,u.insuranceCompany,u。policyNumber)likeCONCAT('%’,:search,'%');(HQL語法)(3).根據(jù)不同的年齡段統(tǒng)計用戶的數(shù)量selectcount(*),left(birthday,4)fromusergroupbyleft(birthday,4);(4).查詢所有用戶的出生年份,月份,日期分布selectleft(birthday,4),substring(birthday,6,2),substring(birthday,9,2)fromuser;3.核心算法:(1)WebSocket存儲和分發(fā)消息代碼,基于WebSocket服務(wù)器與客戶端通訊的問題,醫(yī)師每添加一條處方記錄或者對處方記錄執(zhí)行刪除修改等操作時會及時通知客戶端服務(wù)器數(shù)據(jù)狀態(tài)的改變并及時更新獲取最新的數(shù)據(jù)。針對以上的問題,我首先針對需要及時處理消息的頁面與服務(wù)器建立WebSocket連接,服務(wù)器端使用一個Map保存客戶端的連接,如下:privatestaticMap〈String,Session〉sessions=newHashMap<String,Session>();,每次請求時就根據(jù)session的id進行存儲,對每個醫(yī)師處方信息操作的頁面每個在頁面初始化時都與服務(wù)器(與上面處理的請求是同一個)也建立一個WebScoket連接(多個WebSocket連接到同一個請求),醫(yī)師每次操作成功時立即就發(fā)送WebScoket消息到服務(wù)器,服務(wù)器根據(jù)接受到的消息遍歷Map中客戶端中的多個連接循環(huán)發(fā)送消息到客戶端,客戶端根據(jù)接受到的消息以根據(jù)消息的內(nèi)容重新請求服務(wù)器上的數(shù)據(jù)。7.3主要原型UI(或主要功能實現(xiàn))(1)系統(tǒng)登錄和主界面圖7—3-1系統(tǒng)登錄界面功能作用:實現(xiàn)醫(yī)師的登錄功能圖7—3-2系統(tǒng)主界面功能作用:介紹系統(tǒng)以及顯示不同年齡或者部門人數(shù)占有的比率(2)用戶信息管理圖7-3-3所有用戶的基本信息功能作用:實用highcharts像是所有的用戶信息,可進行搜索圖7-3-4分頁顯示用戶信息以及操作功能作用:對用戶信息進行分頁處理以及顯示操作圖7-3—5彈出層顯示可編輯的用戶修改(3)處方信息管理功能作用:實現(xiàn)對用戶信息的修改圖7-3-6添加處方信息功能作用:實現(xiàn)添加處方信息圖7-3—7彈出層選擇藥品功能作用:實現(xiàn)添加處方信息中具體的一個藥品圖7-3-8可搜索藥品功能作用:實現(xiàn)藥品的搜索圖7—3-8添加多個藥品功能作用:實用ajax保存數(shù)據(jù),一次性可添加多個藥品的信息,即一個處方中可添加多個藥品信息,每個藥品信息中有不同的單位,數(shù)量,服用方式和是否可用替代的藥品。(3)處方記錄管理圖7-3-9處方歷史記錄的顯示功能作用:實用時間軸顯示每個用戶開過的處方記錄,該記錄上記錄正醫(yī)師的姓名和電話,以及每個處方中多個處方詳細信息,如果該藥品是可實用替代藥品,則列出可替代藥品的藥品名稱.圖7-3-9處方信息的修改界面功能作用:每個處方信息中都有多個處方詳細,即每個處方中有多個藥品信息,在該頁面中可對每個藥品進行修改和刪除。圖7—3-10彈出確認刪除的模態(tài)框(4)用戶處方查詢圖7-3—11查詢所有處方記錄圖7-3-12實用關(guān)鍵字姓名搜索圖7—3-13實用關(guān)鍵字出生年份搜索圖7-3-14實用關(guān)鍵字電話號碼搜索(5)取藥信息查詢管理圖7—3—15實用承保單號唯一搜索圖7-3—16藥物管理主頁功能作用:使用WebSocket實時處理處方數(shù)據(jù),顯示登記的處方信息。圖7-3—16藥物處理(6)系統(tǒng)出錯管理圖7-3-16處理404錯誤頁面圖7-3-17處理500錯誤頁面7.4測試方案與測試用例制定測試計劃:(1)確定測試需求(2)制定測試策略(3)建立測試通過準則(4)確定資源和進度(5)評審測試計劃(6)更新測試計劃設(shè)計測試:設(shè)計測試用例針對每一個測試需求,確定其需要的測試用例對每個測試用例,確定其輸入的預(yù)期結(jié)果確定測試用例文檔的測試環(huán)境配置對測試用例進行評審開發(fā)測試過程根據(jù)界面原型為每一個測試用例定義詳細的測試步驟為每一個格式步驟定義詳細的測試結(jié)果驗證方法為測試用例準備輸入數(shù)據(jù)在實施測試時對測試過程進行更改1.單元測試首先在項目開發(fā)中使用單元測試,如:Junit、SpringJUnit4ClassRunner進行單元測試,按照測試過程手工執(zhí)行單元測試或運行測試腳本自動執(zhí)行單元測試,如下:@RunWith(SpringJUnit4ClassRunner。class)@ContextConfiguration(locations={"applicationContext.xml"})@Transactional@TransactionConfiguration(transactionManager="transactionManager”)publicclassTestModule{@Testpublicvoidtest(){}}2.集成測試:使用回歸測試方法,對軟件的新版本測試時,驗證是否解決了軟件缺陷,而且保證以前所有運行正常的功能依舊保持正常,而不會影響本次的修改。按照測試過程手工執(zhí)行集成測試或運行測試腳本自動執(zhí)行集成測試將集成測試結(jié)果作詳細記錄,并評審測試結(jié)果對修改后的工作版本執(zhí)行回歸測試,或者對增量集成后的版本執(zhí)行回歸測試2。驗收測試:以用戶為主,前提是已經(jīng)通過系統(tǒng)測試的軟件系統(tǒng),根據(jù)需求規(guī)格說明書或者概要設(shè)計文檔驗證需求的合理性和正確性,包括文檔資料是否完整、正確,人機界面和其他方面(如,可移植性、兼容性、錯誤回復(fù)能力和可維護性等)是否令用戶滿意.7.5安裝與運行情況(1)JDK1.7首先系統(tǒng)必須有JRE的支持,為了能夠完成在該環(huán)境下的編譯,最好能夠安裝下完整的JDK環(huán)境,JDK選用1.7或者更高的版本。(2)Maven3.3或更高的版本,本系統(tǒng)添加對Maven的支持,方便在不同類型的機器上完成編譯工作。(3)MYSQL5。1或更高的版本,與系統(tǒng)集成.(4)WEB服務(wù)器,Tomcat17.0或更高的版本,為了支持WebSocket,Tomcat只有在7.0或者更高的版本中才添加了對WebScoket的支持。7。5.1安裝與配置描述服務(wù)器端運行環(huán)境的配置情況,包括:安裝與初始化數(shù)據(jù)庫、安裝與配置服務(wù)器安裝、安裝支撐軟件、配置系統(tǒng)運行參數(shù),等等。1.JDK環(huán)境配置:(1)如果系統(tǒng)中存在JDK1。7或更高的版本則這一步可以省略,可以實用java-version查看當前系統(tǒng)JDK的版本,如下圖所示。首先到Oracle官網(wǎng)下載下載JDK,官網(wǎng)地址如下:www。oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html,假設(shè)當前的文件名稱為jdk-7u67-linux-x64.tar.gz,進入到該文件的目錄下。?(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,這個是系統(tǒng)核心文件,對所有的用戶都起作用,你需要以root用戶才能修改,實用命令sudo—i,提示輸入密碼,輸入密碼,當前用戶變?yōu)椋騩ot用戶,實用命令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)運行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)軟件解壓,進入到該文件的目錄,使用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)修改本地倉庫地址,進入到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,實用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)實用命令tar-zxvfapache—tomcat-7.0.70-deploye.tar.gz-Cpat(yī)h,path同上?(3)同樣的,你也可以把tomcat下的bin目錄添加到profile全局域中,進入到bin目錄下執(zhí)行./startup。sh并在瀏覽器中查看,如下:?5.項目編譯與項目放置及服務(wù)器啟動?(1)文件信息修改,數(shù)據(jù)庫ip,用戶名以及密碼的修改,項目文件接下的src/main/resources下,找到dperties,其中jdbc。user=root//用戶名?jdbc.password=root//密碼 jdbc。jdbcUrl=jdbc:mysql:///url地址,修改為當前服務(wù)器的ip地址 進入項目的主目錄,本系統(tǒng)的PrescriptionTrackSystem下,執(zhí)行mvnclean命令清除舊版本的編譯文件。?(2)實用mvncomplier進行編譯下,如果你是首次進行編譯,那么系統(tǒng)將會下載pom.xml中需要的jar文件進行一起編譯,這將需要一定的時間.?編譯完成 (3)運行命令mvnpackage進行項目的打包工作,打包過的項目可以直接移植到tomcat中直接運行。(4)在當前文件夾下的target文件夾下可以找到PrescriptionTrackSystem.war(5)把上圖中的PrescriptionTrackSystem.war放置在Tomcat目錄下的webapps目錄下,進入Tomcat文件夾下的bin文件夾,執(zhí)行./startup.sh文件啟動服務(wù)器。(6)訪問ip+/PrescriptionTrackSystem/login.html可以訪問到如下內(nèi)容:7.5。2運行情況圖圖7—5-2—1所有用戶的基本信息功能作用:查詢在庫的所有用戶的信息記錄。圖7-5-2—2分頁顯示用戶信息以及操作功能作用:對用戶信息進行分頁處理以及顯示操作,并可對用戶進行一定的操作。圖7-5—2—3彈出層顯示可編輯的用戶修改功能作用:實現(xiàn)對用戶信息的修改。圖7-5-2-4添加處方信息功能作用:實現(xiàn)添加處方信息。圖7-5-2-5彈出層選擇藥品功能作用:實現(xiàn)添加處方信息中具體的一個藥品及一些額外信息。圖7-5-2—6可搜索藥品功能作用:實現(xiàn)藥品的搜索。圖7—5—2-7添加多個藥品功能作用:實用ajax保存數(shù)據(jù),一次性可添加多個藥品的信息,即一個處方中可添加多個藥品信息,每個藥品信息中有不同的單位,數(shù)量,服用方式和是否可用替代的藥品。圖7—5—2-8處方歷史記錄的顯示功能作用:實用時間軸顯示每個用戶開過的處方記錄,該記錄上記錄正醫(yī)師的姓名和電話,以及每個處方中多個處方詳細信息,如果該藥品是可實用替代藥品,則列出可替代藥品的藥品名稱。圖7-5-2—9處方信息的修改界面功能作用:每個處方信息中都有多個處方詳細,即每個處方中有多個藥品信息,在該頁面中可對每個藥品進行修改和刪除。圖7—5—2—10查詢所有處方記錄功能作用:查詢在庫的所有的處方記錄。圖7-5—2-11實用關(guān)鍵字搜索圖7-5-2—12藥物管理主頁功能作用:使用WebSocket實時處理處方數(shù)據(jù),顯示登記的處方信息。圖7-3-16藥物處理8總結(jié)本項目實現(xiàn)了需求中的大部分內(nèi)容,實現(xiàn)對用戶信息和處方信息維護等等一系列的功能,本項目的難點主要是數(shù)據(jù)結(jié)構(gòu)比較復(fù)雜,表與表之間的關(guān)系比較復(fù)雜,處理起來比較麻煩,由于本人的設(shè)計水平有限,實現(xiàn)的功能比較簡單,還有一些功能沒有具體實現(xiàn),比如權(quán)限的管理,整套系統(tǒng)對WebSocket的支持,沒有用戶方面的操作.另外,遺憾的是本項目默認的藥物的數(shù)據(jù)量是不大的,確切的說應(yīng)該對這些藥物進行分類或者分藥房管理,如果藥物數(shù)據(jù)量太大的話執(zhí)行起來是比較耗時間的。還有一點就是本項目沒有考慮到系統(tǒng)的并發(fā)性,沒有考慮到多個醫(yī)師處理同一個處方信息的情況,當然這種情況可以添加權(quán)限來進行管理。參考資料PaulDeck著,SpringMVC學習指南。美:人民郵電出版社,20015MarkPollack,SpringData實戰(zhàn).美:人民郵電出版社,2014C.J。Date,數(shù)據(jù)庫設(shè)計與關(guān)系理論.北京,機械工業(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。實體對象(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)//保單號?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)?privateDateenddate;//處方終止日期?@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;//該處方詳細所屬的處方 @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號查詢處方記錄 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〉{ //更新處方詳細信息 @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ù)承保公司計算用戶的數(shù)量 ?@Query("selectcount(*),insuranceCompanyfromUserugroupbyu。insuranceCompany")?publicList〈Object[]〉countUser();?//根據(jù)不同的年齡段統(tǒng)計用戶的數(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ù)用戶的電話號碼判斷是否存在?@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)@ServicepublicclassDoctorServiceextendsBaseServiceImpl<Doctor〉{?@Autowired privat(yī)eDoctorRepositorydoctorDao;?@Override publicDoctorfind(Doctort){? returndoctorDao.findByNameAndPassword(t。getName(),t.getPassword());?}}(4)@ServicepublicclassMedicineServiceexte
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版旅游服務(wù)貨款擔保合同范本3篇
- 2025年食堂食品安全監(jiān)督服務(wù)合同3篇
- 2025版二零二五苗木種植與城市綠化工程合作合同3篇
- 2025年高科技產(chǎn)品外貿(mào)經(jīng)銷代理合同范本3篇
- 2025年食堂蔬菜定制化種植合作合同3篇
- 云母制品在醫(yī)療器械中的應(yīng)用探索考核試卷
- 二零二五年度木門安裝與室內(nèi)智能家居系統(tǒng)集成合同4篇
- 2025版學校宿管員招聘、培訓與薪酬合同3篇
- 2025版國務(wù)院辦公廳事業(yè)單位教師聘用合同細則3篇
- 2025年倉庫貨物存儲及保管合同
- GB/T 45120-2024道路車輛48 V供電電壓電氣要求及試驗
- 春節(jié)文化常識單選題100道及答案
- 12123交管學法減分考試題及答案
- 24年追覓在線測評28題及答案
- 魚菜共生課件
- 《陸上風電場工程概算定額》NBT 31010-2019
- 初中物理八年級下冊《動能和勢能》教學課件
- 高考滿分作文常見結(jié)構(gòu)
- 心肌梗死診療指南
- 原油脫硫技術(shù)
- GB/T 2518-2019連續(xù)熱鍍鋅和鋅合金鍍層鋼板及鋼帶
評論
0/150
提交評論