版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第10章綜合應(yīng)用實(shí)例——圖書(shū)管理系統(tǒng)10.1項(xiàng)目功能概述10.2數(shù)據(jù)庫(kù)設(shè)計(jì)10.3架構(gòu)設(shè)計(jì)10.4Web表現(xiàn)層設(shè)計(jì)10.5業(yè)務(wù)邏輯層設(shè)計(jì)10.6代碼實(shí)現(xiàn)10.7本章小結(jié)習(xí)題10
10.1項(xiàng)目功能概述
本章綜合運(yùn)用前面各章所介紹的知識(shí)設(shè)計(jì)一個(gè)圖書(shū)管理系統(tǒng)。圖書(shū)館的信息化管理從最初對(duì)業(yè)務(wù)管理實(shí)行信息化管理發(fā)展到對(duì)圖書(shū)館各個(gè)業(yè)務(wù)流程進(jìn)行系統(tǒng)化和網(wǎng)絡(luò)化管理,并建立大規(guī)模的以個(gè)體文獻(xiàn)目錄聯(lián)機(jī)查詢?yōu)橹鞯馁Y源共享系統(tǒng)。本章僅介紹與讀者和圖書(shū)相關(guān)的一些基本功能及其設(shè)計(jì)實(shí)現(xiàn)。一個(gè)圖書(shū)管理系統(tǒng)包含管理員模塊和讀者模塊。管理員模塊負(fù)責(zé)維護(hù)讀者信息、圖書(shū)信息和圖書(shū)流通信息。其中,讀者信息管理主要供管理員錄入和修改讀者檔案以及維護(hù)讀者的借書(shū)證狀態(tài);圖書(shū)信息管理主要維護(hù)圖書(shū)檔案的錄入、修改以及設(shè)置圖書(shū)狀態(tài);圖書(shū)流通管理主要維護(hù)圖書(shū)的借閱與歸還。讀者模塊供讀者使用,讀者可以查詢自己的個(gè)人信息、圖書(shū)信息及圖書(shū)借閱信息,并能在規(guī)定的續(xù)借次數(shù)內(nèi)進(jìn)行圖書(shū)續(xù)借。
根據(jù)以上的分析可以設(shè)計(jì)出圖書(shū)管理系統(tǒng)的主要功能模塊圖,如圖10-1所示。圖10-1圖書(shū)管理系統(tǒng)功能模塊劃分
10.2數(shù)?據(jù)?庫(kù)?設(shè)?計(jì)
一個(gè)圖書(shū)管理系統(tǒng)中包含多張表,分別存儲(chǔ)相應(yīng)子功能的數(shù)據(jù),其中“讀者信息”表和“圖書(shū)信息”表是關(guān)鍵表,用于存儲(chǔ)讀者信息和圖書(shū)信息。圖書(shū)管理系統(tǒng)實(shí)際上就是對(duì)讀者信息和圖書(shū)信息進(jìn)行管理。圖書(shū)管理系統(tǒng)中與讀者和圖書(shū)最相關(guān)的兩個(gè)流程是圖書(shū)借閱流程和圖書(shū)歸還流程。10.2.1圖書(shū)管理系統(tǒng)E-R圖
圖書(shū)管理系統(tǒng)中關(guān)鍵實(shí)體的E-R圖如圖10-2所示。圖10-2圖書(shū)管理系統(tǒng)E-R圖10.2.2圖書(shū)管理系統(tǒng)中的相關(guān)表
1.圖書(shū)信息表
圖書(shū)信息表books存儲(chǔ)圖書(shū)的主要信息,如表10-1所示。表10-1圖書(shū)信息表books
2.讀者信息表
讀者信息表users存儲(chǔ)讀者的主要信息,如表10-2所示。表10-2讀者信息表users
3.圖書(shū)借閱表
圖書(shū)借閱表bookborrow記錄讀者借閱圖書(shū)的信息,如表10-3所示。表10-3圖書(shū)借閱表bookborrow
4.圖書(shū)歸還表
圖書(shū)歸還表bookreturn記錄讀者還書(shū)的信息,如表10-4所示。表10-4圖書(shū)歸還表bookreturn
10.3架構(gòu)設(shè)計(jì)
本節(jié)討論圖書(shū)管理系統(tǒng)的系統(tǒng)流程和軟件的架構(gòu)模型。
10.3.1系統(tǒng)流程
圖書(shū)管理系統(tǒng)的系統(tǒng)流程如圖10-3所示。管理員可以直接管理讀者信息和圖書(shū)信息,并通過(guò)讀者和圖書(shū)之間的借閱關(guān)系管理圖書(shū)的流通過(guò)程。圖10-3系統(tǒng)流程圖10.3.2架構(gòu)模型
圖書(shū)管理系統(tǒng)采用構(gòu)建于B/S模式上的三層體系結(jié)構(gòu)來(lái)實(shí)現(xiàn)。第一層為Web表現(xiàn),第二層為業(yè)務(wù)邏輯層,第三層為數(shù)據(jù)資源層。Web表現(xiàn)層使用JavaScript腳本、HTML語(yǔ)言、樣式轉(zhuǎn)換語(yǔ)言XSLT和層疊樣式語(yǔ)言CSS構(gòu)建系統(tǒng)各功能頁(yè)面,用戶通過(guò)操作功能界面實(shí)現(xiàn)和底層的數(shù)據(jù)交互。業(yè)務(wù)邏輯層是Web表現(xiàn)層和數(shù)據(jù)資源層的中間橋梁,負(fù)責(zé)接收表現(xiàn)層遞交過(guò)來(lái)的數(shù)據(jù),并對(duì)數(shù)據(jù)依據(jù)業(yè)務(wù)需求進(jìn)行邏輯處理,將處理后的結(jié)果遞交給下一層次處理。數(shù)據(jù)資源層是后臺(tái)的數(shù)據(jù)庫(kù),負(fù)責(zé)接收并存儲(chǔ)邏輯層遞交來(lái)的數(shù)據(jù)。
Web服務(wù)器使用微軟的IIS構(gòu)建,業(yè)務(wù)邏輯層運(yùn)行于Web服務(wù)器上。為達(dá)到較好的用戶體驗(yàn)和較高的數(shù)據(jù)傳輸效率,客戶端和服務(wù)器采用異步數(shù)據(jù)交互方式(即AJAX技術(shù))??蛻舳讼蚍?wù)器發(fā)送HTTP請(qǐng)求,服務(wù)器以XML文檔形式響應(yīng)客戶端請(qǐng)求,請(qǐng)求與響應(yīng)的過(guò)程異步進(jìn)行??蛻舳巳〉肵ML數(shù)據(jù)后,使用JavaScript、HTML和CSS重新構(gòu)建局部頁(yè)面,而不刷新整個(gè)頁(yè)面,或使用客戶端的XSL文檔對(duì)象轉(zhuǎn)換XML數(shù)據(jù),局部更新頁(yè)面。
10.4Web表現(xiàn)層設(shè)計(jì)
本節(jié)設(shè)計(jì)圖書(shū)管理系統(tǒng)的主要功能頁(yè)面。
10.4.1讀者信息管理
讀者信息管理的Web表現(xiàn)層頁(yè)面由讀者信息添加頁(yè)面、讀者信息查詢和更新頁(yè)面組成,如圖10-4和圖10-5所示。圖10-4所示的讀者信息添加頁(yè)面負(fù)責(zé)將讀者在頁(yè)面上輸入的讀者信息添加到數(shù)據(jù)庫(kù)。頁(yè)面的上部為功能操作區(qū),功能操作區(qū)的下面是信息錄入?yún)^(qū)。在圖10-5所示的讀者信息查詢和更新頁(yè)面中的上半部分輸入讀者借書(shū)證號(hào),單擊“查詢”按鈕,讀者信息將出現(xiàn)在下半部分的信息顯示區(qū),可以修改顯示區(qū)的信息,修改完畢,單擊“更新”按鈕將修改后的數(shù)據(jù)保存到數(shù)據(jù)庫(kù)。圖10-4添加讀者信息頁(yè)面圖10-5查詢和更新讀者信息頁(yè)面10.4.2圖書(shū)信息管理
圖書(shū)信息維護(hù)頁(yè)面由圖10-6所示的添加圖書(shū)信息和圖10-7所示的查詢和更新圖書(shū)信息兩個(gè)頁(yè)面組成。頁(yè)面功能區(qū)劃分與讀者信息管理的頁(yè)面劃分類似。頁(yè)面的頂部為功能操作區(qū),可以查詢、添加、更新圖書(shū)信息;頁(yè)面的下半部分為圖書(shū)信息的編輯區(qū),可以添加圖書(shū)信息和修改圖書(shū)信息。圖10-6添加圖書(shū)信息頁(yè)面圖10-7查詢和更新圖書(shū)信息頁(yè)面10.4.3借書(shū)管理
圖書(shū)借閱管理頁(yè)面如圖10-8所示。頁(yè)面分為上、下兩個(gè)部分。上半部分左邊為讀者借書(shū)信息的統(tǒng)計(jì)區(qū),上半部分右邊為待借圖書(shū)的簡(jiǎn)要信息顯示區(qū)。下半部分的空白區(qū)為讀者已借圖書(shū)信息的顯示區(qū)。圖10-8圖書(shū)借閱頁(yè)面10.4.4還書(shū)管理
圖書(shū)歸還管理頁(yè)面如圖10-9所示。頁(yè)面分為上、下兩個(gè)部分。上半部分為功能區(qū)和待還圖書(shū)信息顯示區(qū),包括待還圖書(shū)信息查詢和還書(shū)操作,以及依據(jù)讀者借書(shū)證號(hào)查詢讀者應(yīng)還圖書(shū)信息。下半部分的空白區(qū)顯示讀者應(yīng)還圖書(shū)。圖10-9圖書(shū)歸還頁(yè)面10.4.5圖書(shū)查詢
圖書(shū)信息查詢頁(yè)面如圖10-10所示。頁(yè)面分為上、下兩個(gè)區(qū)域。上半?yún)^(qū)域?yàn)楣δ軈^(qū)域,可以依據(jù)檢索類型和檢索模式查詢圖書(shū),查詢的結(jié)果顯示在頁(yè)面下半部分的空白區(qū)。圖10-10圖書(shū)信息查詢頁(yè)面10.4.6圖書(shū)續(xù)借
圖書(shū)續(xù)借頁(yè)面如圖10-11所示,其劃分模式與圖書(shū)信息查詢頁(yè)面的劃分模式類似。上半部分為功能輸入?yún)^(qū),讀者輸入借書(shū)證號(hào)和密碼登錄系統(tǒng),讀者應(yīng)還圖書(shū)信息將顯示在頁(yè)面下半部分的空白區(qū)。針對(duì)具體的圖書(shū)狀態(tài),可以進(jìn)行續(xù)借操作。圖10-11圖書(shū)續(xù)借頁(yè)面
10.5業(yè)務(wù)邏輯層設(shè)計(jì)
本章中的圖書(shū)管理系統(tǒng)是一個(gè)簡(jiǎn)單的圖書(shū)管理系統(tǒng)。信息維護(hù)在設(shè)計(jì)時(shí)主要考慮讀者信息維護(hù)和圖書(shū)信息維護(hù)。流通管理在設(shè)計(jì)時(shí)僅考慮了圖書(shū)管理中最主要的模塊“圖書(shū)借閱模塊”、“圖書(shū)歸還模塊”和“圖書(shū)續(xù)借模塊”的設(shè)計(jì)。讀者信息維護(hù)和圖書(shū)信息維護(hù)模塊業(yè)務(wù)流程相對(duì)簡(jiǎn)單,流通管理涉及到的業(yè)務(wù)流程相對(duì)復(fù)雜,本節(jié)將對(duì)流通管理的三個(gè)主要模塊的業(yè)務(wù)流程進(jìn)行分析。10.5.1圖書(shū)借閱
圖書(shū)借閱模塊主要管理讀者借閱圖書(shū)的過(guò)程以及記錄讀者借閱圖書(shū)的信息。圖書(shū)借閱的業(yè)務(wù)流程描述如下:
(1)輸入借書(shū)證號(hào),判斷借書(shū)證是否掛失。若借書(shū)證掛失,則流程結(jié)束;若借書(shū)證未掛失,則顯示讀者已借圖書(shū)信息和讀者借書(shū)統(tǒng)計(jì)信息。
(2)輸入圖書(shū)代碼,顯示待借圖書(shū)簡(jiǎn)要信息,執(zhí)行圖書(shū)“借出”操作。如果讀者“未還圖書(shū)數(shù)量”大于“借書(shū)上限”,或者超期圖書(shū)數(shù)量大于0,或者圖書(shū)狀態(tài)為“借出”或“掛失”,則禁止執(zhí)行圖書(shū)“借出”操作;否則允許操作。
(3)“借出”操作執(zhí)行下列事務(wù):向圖書(shū)借閱表中添加借閱記錄,修改圖書(shū)信息表中圖書(shū)狀態(tài)為“借出”,并將圖書(shū)累計(jì)借出次數(shù)加1。
(4)“借出”事務(wù)執(zhí)行完畢,借書(shū)流程結(jié)束。
圖書(shū)借閱流程如圖10-12所示。圖10-12圖書(shū)借閱業(yè)務(wù)流程10.5.2圖書(shū)歸還
圖書(shū)歸還模塊主要負(fù)責(zé)記錄讀者還書(shū)記錄,并修改圖書(shū)是否歸還的狀態(tài),以便歸還的圖書(shū)可以進(jìn)入流通領(lǐng)域的下一次借閱過(guò)程。圖書(shū)歸還的業(yè)務(wù)流程描述如下:
(1)輸入借書(shū)證號(hào)可以顯示讀者所有應(yīng)還圖書(shū)信息。輸入圖書(shū)代碼顯示與該代碼相對(duì)應(yīng)的圖書(shū)信息,并顯示讀者信息和讀者圖書(shū)借閱信息。
(2)通過(guò)下列事務(wù)執(zhí)行“還書(shū)”操作:在圖書(shū)歸還表中添加一條讀者還書(shū)記錄,修改圖書(shū)借閱表中圖書(shū)狀態(tài)為“已還”,修改圖書(shū)信息表中圖書(shū)狀態(tài)為“可借”。
(3)歸還事務(wù)執(zhí)行完畢,還書(shū)流程結(jié)束。
圖書(shū)歸還流程如圖10-13所示。圖10-13圖書(shū)歸還業(yè)務(wù)流程10.5.3圖書(shū)續(xù)借
當(dāng)讀者借閱的圖書(shū)沒(méi)有過(guò)期,并且續(xù)借次數(shù)沒(méi)有超過(guò)規(guī)定的續(xù)借次數(shù)時(shí),可以在網(wǎng)上對(duì)圖書(shū)直接進(jìn)行續(xù)借,而不必去圖書(shū)館辦理續(xù)借手續(xù)。圖書(shū)續(xù)借流程描述如下:
(1)讀者輸入借書(shū)證號(hào)和密碼,顯示讀者應(yīng)還圖書(shū)信息。執(zhí)行圖書(shū)續(xù)借操作,如果當(dāng)前日期大于圖書(shū)借閱表中應(yīng)還日期(即超期),或者借閱次數(shù)超過(guò)規(guī)定次數(shù),則禁止圖書(shū)續(xù)借
操作。
(2)如果圖書(shū)續(xù)借操作滿足操作條件,則執(zhí)行如下的續(xù)借事務(wù):圖書(shū)續(xù)借表中的借閱次數(shù)加1,圖書(shū)歸還表中應(yīng)還日期加設(shè)定的天數(shù)(如允許續(xù)借30天)。
(3)圖書(shū)續(xù)借事務(wù)執(zhí)行完畢,續(xù)借流程結(jié)束。
圖書(shū)續(xù)借流程如圖10-14所示。圖10-14圖書(shū)續(xù)借業(yè)務(wù)流程
10.6代碼實(shí)現(xiàn)
本節(jié)主要討論圖書(shū)管理系統(tǒng)客戶端和服務(wù)器端的代碼實(shí)現(xiàn),并給出主要代碼的分析。
10.6.1XML文檔結(jié)構(gòu)設(shè)計(jì)
客戶端與服務(wù)器端的數(shù)據(jù)交互以XML文檔形式進(jìn)行,為方便客戶端和服務(wù)器端的處理,對(duì)客戶端發(fā)送的XML文檔結(jié)構(gòu)和服務(wù)返回的XML文檔結(jié)構(gòu)做了約定。
1.客戶端發(fā)送的XML結(jié)構(gòu)
客戶端的XML文檔為一層結(jié)構(gòu),根元素名稱約定為<root>,除最后一個(gè)子元素命名為<flag>外,其余子元素以數(shù)據(jù)庫(kù)字段命名。<flag>元素封裝了數(shù)據(jù)的處理標(biāo)識(shí)位,以數(shù)字字符作為標(biāo)識(shí)位:“1”表示查詢數(shù)據(jù)庫(kù)數(shù)據(jù)記錄,“2”表示向數(shù)據(jù)庫(kù)添加數(shù)據(jù)記錄,“3”表示修改數(shù)據(jù)庫(kù)數(shù)據(jù)記錄,“4”表示刪除數(shù)據(jù)庫(kù)記錄。
案例說(shuō)明:本案例演示查詢讀者借書(shū)證號(hào)為“102800401”的未還圖書(shū)記錄,客戶端的XML文檔可以描述為如下的結(jié)構(gòu)。01<?xmlversion='1.0'encoding='utf-8'?>
02<root>
03<userNum><![CDATA[102800401]]></userNum>
04<flag><![CDATA[1]]></flag>
05</root>案例分析:第03行使用描述借書(shū)證號(hào)的數(shù)據(jù)字段“userNum”作為XML元素的名稱封裝讀者的借書(shū)證號(hào)“102800401”,第04行封裝了后臺(tái)數(shù)據(jù)的操作要求,查詢數(shù)據(jù)庫(kù)。為減少出錯(cuò),所有數(shù)據(jù)均使用字符數(shù)據(jù)段封裝。
2.服務(wù)器端返回的XML文檔結(jié)構(gòu)
當(dāng)查詢的結(jié)果集需返回給客戶端時(shí),約定服務(wù)器端的XML文檔結(jié)構(gòu)為兩層結(jié)構(gòu)。根元素為<root>,第二層子元素為<row>,第三層子元素以數(shù)據(jù)庫(kù)字段封裝字段對(duì)應(yīng)的內(nèi)容。
案例說(shuō)明:本案例演示服務(wù)器端返回借書(shū)證號(hào)為“102800401”的讀者未還圖書(shū)的XML文檔。01<?xmlversion='1.0'encoding='utf-8'?>
02<root>
03<row>
04<bookNum><![CDATA[10539402]]></bookNum>
05<callNum><![CDATA[TP393.092/1460]]></callNum>
06<bookname><![CDATA[精通ASP.NET2.0的Web2.0應(yīng)用]]></bookname>07<author><![CDATA[鄭耀東編著]]></author>
08<borrowDate><![CDATA[2008-2-3]]></borrowDate>
09<limitDate><![CDATA[2008-5-3]]></limitDate>
10</row>
11<row>
12<bookNum><![CDATA[10526798]]></bookNum>
13<callNum><![CDATA[TP312/3548]]></callNum>14<bookname><![CDATA[XML實(shí)踐教程]]></bookname>
15<author><![CDATA[張銀鶴,張秋香,孫膺等編著]]></author>
16<borrowDate><![CDATA[2008-5-4]]></borrowDate>
17<limitDate><![CDATA[2008-8-4]]></limitDate>
18</row>
19</root>案例分析:底層元素名稱為數(shù)據(jù)庫(kù)字段——bookNum(借書(shū)證號(hào))、callNum(索書(shū)號(hào))、bookname(書(shū)名)、author(作者)、borrowDate(借閱日期)、limitDate(應(yīng)還日期)。
從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)構(gòu)造服務(wù)器端的XML文檔可以通過(guò)使用如下案例中的公共模塊來(lái)實(shí)現(xiàn)。
案例說(shuō)明:本案例演示依據(jù)記錄集構(gòu)造XML文檔的公共模塊?!皉s”為服務(wù)器端查詢數(shù)據(jù)庫(kù)返回的記錄集。模塊名稱:makeXML
01functionmakeXML(rs)
02{//根據(jù)數(shù)據(jù)庫(kù)查詢的記錄集構(gòu)造XML文檔
03varxmlstr="";
04while(!rs.EOF)
05{
06xmlstr=xmlstr+"<row>";
07for(vari=0;i<rs.fields.count;i++)
08{09varfld=rs.fields;//獲取記錄集中字段對(duì)象
10xmlstr=xmlstr+"<"+fld(i).name+">
<![CDATA["+fld(i).value+"]]></"+fld(i).name+">";
11}
12xmlstr=xmlstr+"</row>";
13rs.MoveNext();14}
15xmlstr="<?xmlversion='1.0'encoding='utf-8'?><root>"+xmlstr+"</root>";
16returnxmlstr;
17}案例分析:第07行至第11行構(gòu)造最底層的元素字段,該元素字段封裝了數(shù)據(jù)。第06行和第12行構(gòu)造第二層的元素<row>。第15行構(gòu)造XML聲明和根元素<root>。10.6.2數(shù)據(jù)資源層的代碼實(shí)現(xiàn)
數(shù)據(jù)資源層的代碼負(fù)責(zé)與數(shù)據(jù)庫(kù)的交互,根據(jù)客戶端的請(qǐng)求對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,通過(guò)以下幾個(gè)功能模塊來(lái)實(shí)現(xiàn)。
1.創(chuàng)建數(shù)據(jù)庫(kù)連接
案例說(shuō)明:本模塊負(fù)責(zé)創(chuàng)建數(shù)據(jù)庫(kù)連接,數(shù)據(jù)庫(kù)連接成功,返回連接對(duì)象供使用,否則返回空值。模塊名稱:open_db
01functionopen_db()
02{
03try{
04varconn=Server.CreateObject("ADODB.Connection");
05conn.Open("driver={SQLServer};database=Books_DB;server=localhost;uid=sa;pwd=");
06returnconn;
07}
08catch(e){returnnull;}
09}
2.查詢數(shù)據(jù)庫(kù)并返回記錄集
案例說(shuō)明:本模塊負(fù)責(zé)查詢數(shù)據(jù)庫(kù),并返回記錄集。參數(shù)“sql”為查詢數(shù)據(jù)庫(kù)的select語(yǔ)句,由業(yè)務(wù)邏輯層構(gòu)造。模塊名稱:return_rs
01functionreturn_rs(sql)
02{
03varrs=null;
04varconn=open_db(); //創(chuàng)建數(shù)據(jù)庫(kù)連接
05if(conn!=null)
06{
07try{08varcmd=Server.CreateObject("ADODB.Command");
09cmd.ActiveConnection=conn;
10cmd.CommandText=sql;
11rs=cmd.Execute(); //執(zhí)行查詢操作,并返回記錄集
12}
13catch(e){rs=null;} //異常返回空記錄集
14}
15returnrs;
16}
3.操作數(shù)據(jù)庫(kù)不返回記錄集
案例說(shuō)明:本模塊依據(jù)insert、update、delete語(yǔ)句操作數(shù)據(jù)庫(kù),不返回記錄集,返回是否成功的bool值。模塊名稱:return_bool
01functionreturn_bool(sql)
02{
03varret=false;
04varconn=open_db();
05if(conn!=null)
06{
07try{
08varcmd=Server.CreateObject("ADODB.Command");
09cmd.ActiveConnection=conn;10cmd.CommandText=sql;
11cmd.Execute();
12ret=true;//操作成功返回true
13}
14catch(e){ret=false;}//操作失敗返回false
15}
16returnret;
17}
4.多表關(guān)聯(lián)操作的事務(wù)處理
案例說(shuō)明:本模塊演示多表聯(lián)動(dòng)操作的事務(wù)處理。array_sqlString為包含多條sql語(yǔ)句序列的數(shù)組。模塊名稱:return_trans
01functionreturn_trans(array_sqlString)
02{
03varresult=false;
04varconn=open_db();//創(chuàng)建數(shù)據(jù)庫(kù)連接
05if(conn!=null)
06{
07try{
08conn.BeginTrans; //事務(wù)開(kāi)始
09for(iinarray_sqlString){
10conn.execute(array_sqlString[i]);//執(zhí)行sql語(yǔ)句11}
12conn.CommitTrans; //執(zhí)行事務(wù)提交
13result=true;
14}
15catch(e){
16conn.RollbackTrans; //出錯(cuò)回滾
17result=false;
18}
19}
20returnresult;
21}案例分析:當(dāng)進(jìn)行借書(shū)和還書(shū)操作時(shí)涉及多個(gè)表的關(guān)聯(lián)操作,為確保多表的操作不出錯(cuò),需進(jìn)行事務(wù)處理。當(dāng)所有操作成功時(shí),操作才能完成;只要有一個(gè)操作失敗,所有操作便都要取消。10.6.3客戶端與服務(wù)器異步數(shù)據(jù)傳輸邏輯
客戶端與服務(wù)器端數(shù)據(jù)傳輸采用異步方式進(jìn)行,客戶端以post方式向服務(wù)器端發(fā)送數(shù)據(jù)。
案例說(shuō)明:本案例演示客戶端向服務(wù)器端以post方式發(fā)送異步請(qǐng)求。模塊名稱:send_request_post
01functionsend_request_post(url,str){//初始化、指定處理函數(shù)、發(fā)送請(qǐng)求的函數(shù)
02//開(kāi)始初始化XMLHttpRequest對(duì)象
03if(window.XMLHttpRequest){//Mozilla瀏覽器
04try{
05http_request=newXMLHttpRequest();
06if(http_request.overrideMimeType){//設(shè)置Mime類別07http_request.overrideMimeType("text/xml");
08}
09}catch(e){http_request=false;}
10}
11elseif(window.ActiveXObject){//IE瀏覽器
12try{
13http_request=newActiveXObject("Msxml2.XMLHTTP");
14}catch(e){
15try{16http_request=newActiveXObject("Microsoft.XMLHTTP");
17}catch(e){http_request=false;}
18}
19}
20if(!http_request){//異常,創(chuàng)建對(duì)象實(shí)例失敗
21window.alert("不能創(chuàng)建XMLHttpRequest對(duì)象實(shí)例.");
22returnfalse;
23}24http_request.onreadystatechange=processRequest;
//響應(yīng)函數(shù)
25//確定發(fā)送請(qǐng)求的方式和url以及是否同步執(zhí)行下段代碼
26http_request.open("Post",url,true);
27http_request.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded");
28http_request.send(str); //發(fā)送異步請(qǐng)求
29}10.6.4服務(wù)器端的調(diào)度邏輯
服務(wù)器端的處理通過(guò)調(diào)度邏輯來(lái)完成。調(diào)度邏輯根據(jù)操作數(shù)據(jù)庫(kù)的標(biāo)識(shí)符選擇操作數(shù)據(jù)庫(kù)的方式。圖書(shū)管理系統(tǒng)中讀者信息維護(hù)、圖書(shū)維護(hù)、圖書(shū)借閱、圖書(shū)歸還等主要模塊都有單獨(dú)的調(diào)度邏輯。案例說(shuō)明:本案例演示各模塊調(diào)度邏輯的工作流程。
01<%@Language="JScript"%>
02<!--#includefile="book_public.js"--> //封裝了數(shù)據(jù)庫(kù)的操作函數(shù)
03<%
04varXMLDom=Server.CreateObject("Microsoft.XMLDOM");
05XMLDom.load(Request);
06//讀取數(shù)據(jù)庫(kù)操作符標(biāo)識(shí)位07varflag=XMLDom.documentElement.lastChild.text;
08Response.ContentType="text/xml";
09Response.Charset="gb2312";
10switch(flag)
11{
12case"1"://查詢操作
13//此處添加查詢并以XML文檔形式返回結(jié)果的函數(shù)14break;
15case"2"://插入操作
16//此處添加向數(shù)據(jù)插入數(shù)據(jù)的函數(shù)
17break;
18case"3"://更新操作
19//此處添加更新數(shù)據(jù)庫(kù)的函數(shù)
20break;
21case"4"://刪除操作
22//此處添加刪除數(shù)據(jù)庫(kù)記錄的函數(shù)23break;
24default://
25Response.Write("-1");
26}
27XMLDom=null;
28%>案例分析:第02行引入外部文件“book_public.js”,該文件包含了業(yè)務(wù)邏輯層主要功能模塊的代碼實(shí)現(xiàn),這些模塊供第10行至第23行的調(diào)度邏輯調(diào)用。第04行和第05行創(chuàng)建一個(gè)DOM對(duì)象,并將客戶端發(fā)送過(guò)來(lái)的XML文檔加載到DOM中。第07行讀取數(shù)據(jù)處理標(biāo)識(shí)位賦值給變量flag,供第10行的switch語(yǔ)句使用。第08行和第09行設(shè)置服務(wù)器向客戶端返回支持中文編碼的XML文檔。10.6.5業(yè)務(wù)邏輯層主要模塊代碼實(shí)現(xiàn)
業(yè)務(wù)邏輯層的主要模塊有讀者信息維護(hù)、圖書(shū)信息維護(hù)、圖書(shū)借閱、圖書(shū)歸還、圖書(shū)續(xù)借、圖書(shū)檢索等模塊,本節(jié)主要討論讀者信息維護(hù)模塊、圖書(shū)借閱模塊和圖書(shū)歸還模塊的代碼實(shí)現(xiàn),其余模塊作為課后習(xí)題形式給出。
1.讀者信息維護(hù)
讀者信息維護(hù)包括讀者信息添加、查詢和更新。下面首先討論讀者信息的添加。
函數(shù)userInsert()收集客戶端的讀者信息,并向服務(wù)器端的處理程序userHandle.asp發(fā)HTTP請(qǐng)求,處理程序userHandle.asp是10.6.4中描述的調(diào)度邏輯。函數(shù)userInsert()第12行的MakeUserXML()函數(shù)負(fù)責(zé)將客戶端的讀者信息拼裝成XML文檔,并發(fā)送給服務(wù)器。
案例說(shuō)明:本模塊演示客戶端向服務(wù)器端發(fā)送包含讀者信息的XML文檔。模塊名稱:userInsert
01functionuserInsert()
02{
03varobjUserNum=document.getElementById("userNum");
04if(objUserNum.value=="")
05{
06alert("借書(shū)證號(hào)不能為空!");
07}08else
09{
10varurl=window.location.toString();
11url=url.replace(/userInsertHTMLPage.htm/,"userHandle.asp");
12send_request_post(url,MakeUserXML());//
13}
14}函數(shù)MakeUserXML()創(chuàng)建包含讀者信息的XML文檔,代碼如下。第15行<flag>元素封裝了處理標(biāo)識(shí)位“2”,表示向數(shù)據(jù)庫(kù)添加讀者信息。
案例說(shuō)明:本模塊演示獲取客戶端頁(yè)面讀者信息構(gòu)造包含數(shù)據(jù)處理標(biāo)識(shí)位的XML文檔。模塊名稱:MakeUserXML
01functionMakeUserXML()
02{
03varxmlstr="";
04xmlstr=xmlstr+"<userNum>
<![CDATA["+document.getElementById("userNum").value+"]]></userNum>";
05xmlstr=xmlstr+"<username>
<![CDATA["+document.getElementById("username").value+"]]></username>";06xmlstr=xmlstr+"<gender>
<![CDATA["+document.getElementById("gender").value+"]]></gender>";
07xmlstr=xmlstr+"<usertype>
<![CDATA["+document.getElementById("usertype").value+"]]></usertype>";
08xmlstr=xmlstr+"<restrictNum>
<![CDATA["+document.getElementById("restrictNum").value+"]]></restrictNum>";09xmlstr=xmlstr+"<classID>
<![CDATA["+document.getElementById("classID").value+"]]></classID>";
10xmlstr=xmlstr+"<cardname>
<![CDATA["+document.getElementById("cardname").value+"]]></cardname>";
11xmlstr=xmlstr+"<cardId>
<![CDATA["+document.getElementById("cardId").value+"]]></cardId>";12xmlstr=xmlstr+"<department>
<![CDATA["+document.getElementById("department").value+"]]></department>";
13xmlstr=xmlstr+"<telephone>
<![CDATA["+document.getElementById("telephone").value+"]]></telephone>";
14xmlstr=xmlstr+"<email>
<![CDATA["+document.getElementById("email").value+"]]></email>";15xmlstr=xmlstr+"<flag><![CDATA[2]]></flag>"
16xmlstr="<?xmlversion='1.0'encoding='utf-8'?><root>"+xmlstr+"</root>";
17returnxmlstr;
18}處理程序userHandle.asp讀取客戶端發(fā)送過(guò)來(lái)的XML文檔,并根據(jù)數(shù)據(jù)處理標(biāo)識(shí)位執(zhí)行向數(shù)據(jù)庫(kù)插入數(shù)據(jù)的操作。
添加讀者信息到數(shù)據(jù)庫(kù):
return_bool(insertUser(XMLDom))
其中,函數(shù)insertUser構(gòu)建向數(shù)據(jù)庫(kù)插入數(shù)據(jù)的sql語(yǔ)句;參數(shù)XMLDom是包含讀者信息的XML對(duì)象,用于構(gòu)造Insert語(yǔ)句。函數(shù)insertUser的返回值為構(gòu)造好的Insert語(yǔ)句。將返回的sql語(yǔ)句作為參數(shù),調(diào)用數(shù)據(jù)資源層的函數(shù)模塊return_bool實(shí)現(xiàn)讀者數(shù)據(jù)添加到數(shù)據(jù)庫(kù)的操作。下面討論讀者信息的查詢和更新。
根據(jù)讀者的借書(shū)證號(hào)查詢讀者信息。客戶端在構(gòu)造包含借書(shū)證號(hào)的請(qǐng)求XML文檔時(shí),數(shù)據(jù)處理標(biāo)識(shí)位為“1”,服務(wù)器端收到請(qǐng)求文檔,讀取標(biāo)識(shí)位,根據(jù)數(shù)據(jù)處理標(biāo)識(shí)位調(diào)用查詢模塊,獲得指定讀者的信息,并以XML文檔形式返回給客戶端??蛻舳说捻憫?yīng)函數(shù)解析收到的XML文檔,將XML文檔中數(shù)據(jù)與頁(yè)面表單項(xiàng)綁定,實(shí)現(xiàn)數(shù)據(jù)查詢和編輯。
案例說(shuō)明:本模塊為客戶端的響應(yīng)函數(shù),當(dāng)服務(wù)器端返回的數(shù)據(jù)下載到客戶端時(shí)觸發(fā)該函數(shù),處理返回的信息。模塊名稱:processRequest
01functionprocessRequest()
02{//響應(yīng)查詢讀者信息的事件,讀者信息以XML形式返回
03if((http_request.readyState==4)&&(http_request.status==200))
04{
05varxmlText=http_request.responseText;
06if(!xmlText){
07returnalert("你查找的讀者不存在!");
08}09//建立XMLDOM對(duì)象,接收服務(wù)器端返回的XML文檔
10varXMLDom=newActiveXObject(“Microsoft.XMLDOM”);
11XMLDom.async=false;//設(shè)置為同步方式獲取數(shù)據(jù)
12XMLDom.loadXML(xmlText); //將XML文檔加載到XMLDom對(duì)象中
13binduser(XMLDom);//將返回的讀者信息綁定到頁(yè)面表單項(xiàng)
14}
15}解析XMLDom,將XMLDom中節(jié)點(diǎn)封裝的數(shù)據(jù)與頁(yè)面表單對(duì)應(yīng)項(xiàng)綁定,綁定的處理函數(shù)binduser()描述如下:01functionbinduser(XMLDom)
02{
03document.getElementById("username").value=
XMLDom.documentElement.firstChild.childNodes[2].text;
04document.getElementById("gender").value=
XMLDom.documentElement.firstChild.childNodes[3].text;
05document.getElementById("usertype").value=
XMLDom.documentElement.firstChild.childNodes[4].text;06document.getElementById("restrictNum").value=
XMLDom.documentElement.firstChild.childNodes[5].text;
07document.getElementById("classID").value=
XMLDom.documentElement.firstChild.childNodes[6].text;
08document.getElementById("cardname").value=
XMLDom.documentElement.firstChild.childNodes[7].text;
09document.getElementById("cardId").value=
XMLDom.documentElement.firstChild.childNodes[8].text;10document.getElementById("department").value=
XMLDom.documentElement.firstChild.childNodes[9].text;
11document.getElementById("telephone").value=
XMLDom.documentElement.firstChild.childNodes[10].text;
12document.getElementById("email").value=
XMLDom.documentElement.firstChild.childNodes[11].text;13varuserstatus=
((XMLDom.documentElement.firstChild.childNodes[12].text=="true")?true:false);
14document.getElementById("userstatus").checked=userstatus;
15}客戶端的數(shù)據(jù)編輯完成后,重新生成XML請(qǐng)求文檔,數(shù)據(jù)處理標(biāo)識(shí)也為“3”,服務(wù)器接收到XML文檔后根據(jù)數(shù)據(jù)處理標(biāo)識(shí)位調(diào)用更新處理函數(shù)構(gòu)造update語(yǔ)句,并將數(shù)據(jù)更新到數(shù)據(jù)庫(kù)。
圖書(shū)信息維護(hù)模塊的實(shí)現(xiàn)過(guò)程與讀者信息維護(hù)模塊的實(shí)現(xiàn)過(guò)程類似,這里不再重復(fù)。
2.圖書(shū)借閱
首先要根據(jù)讀者借書(shū)證號(hào)檢查讀者未還圖書(shū)數(shù)量和超期圖書(shū)數(shù)量,如果讀者未還圖書(shū)數(shù)量超過(guò)最大借書(shū)數(shù)量或有過(guò)期圖書(shū),則不能借書(shū)。統(tǒng)計(jì)未還圖書(shū)數(shù)量和超期圖書(shū)數(shù)量的函數(shù)如下:
案例說(shuō)明:根據(jù)讀者Id統(tǒng)計(jì)讀者未還圖書(shū)數(shù)量。圖書(shū)借閱表(bookborrow)中圖書(shū)狀態(tài)為“1”(borrowstatus='1')的圖書(shū)是未還圖書(shū)。模塊名稱:notReturnBooks
01functionnotReturnBooks(userId)
02{
03varresult=null;
04varsqlstr="selectcount(bookId)asnotReturnBooksfrom[bookborrow]where
[userId]=cast('"+userId+"'asint)and[borrowstatus]='1'";
05varrs=return_rs(sqlstr);
06if(rs!=null&&!rs.EOF){result=makeXML(rs);}
07returnresult;
08}案例分析:模塊notReturnBooks的第04行構(gòu)造統(tǒng)計(jì)讀者未還圖書(shū)的sql語(yǔ)句,第05行調(diào)用數(shù)據(jù)資源層return_rs模塊查詢讀者未還圖書(shū)量。第06行調(diào)用函數(shù)makeXML(rs)將返回的記錄集轉(zhuǎn)換為XML文檔。
案例說(shuō)明:根據(jù)讀者Id統(tǒng)計(jì)讀者超期圖書(shū)數(shù)量,當(dāng)前日期超過(guò)圖書(shū)應(yīng)還日期則圖書(shū)過(guò)期。模塊名稱:overdueBooks
01functionoverdueBooks(userId)
02{
03varresult=null;
04varsqlstr="selectcount([bookId])asoverdueBooksfrom[bookborrow]where[userId]=cast('"+userId+"'asint)and[borrowstatus]='1'and(datediff(day,getDate(),[limitDate])<0)";
05varrs=return_rs(sqlstr);
06if(rs!=null&&!rs.EOF){result=makeXML(rs);}
07returnresult;
08}需借閱的圖書(shū)信息根據(jù)圖書(shū)的編碼從數(shù)據(jù)庫(kù)讀取。當(dāng)滿足借閱條件時(shí)可以執(zhí)行圖書(shū)的借閱過(guò)程。
案例說(shuō)明:本案例演示圖書(shū)借閱事務(wù)處理模塊,第22行調(diào)用數(shù)據(jù)資源層的事務(wù)處理模塊return_trans完成借書(shū)過(guò)程涉及到的多表關(guān)聯(lián)操作。模塊名稱:borrowBook
01functionborrowBook(userId,bookId)
02{
03vararray_sqlString=newArray();
04vardate=newDate();
05//設(shè)置借書(shū)時(shí)間
06varborrowDate=date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate();
07date.setMonth(date.getMonth()+3); //每本圖書(shū)限借3個(gè)月08//設(shè)置還書(shū)時(shí)間
09varlimitDate=date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate();
10varborrowregistrar=Session("username"); //從session中獲取管理員用戶名
11//構(gòu)造添加借書(shū)記錄的sql語(yǔ)句12varinser_bookborrow="insertinto[bookborrow]([bookId],[userId],"+"[borrowDate],[limitDate],[renewNum],"+"[borrowStatus],[borrowregistrar])values('"+bookId+"','"+userId+"','"+borrowDate+"','"+limitDate+"','1','1','"+borrowregistrar+"')";
13//構(gòu)造修改圖書(shū)信息表圖書(shū)狀態(tài)的sql語(yǔ)句(借出狀態(tài)為'2')
14varupdate_bookstatus="update[books]set[bookstatus]='2',[borrowNum]=cast([borrowNum]asint)+1where[bookId]='"+bookId+"'";15//將兩天sql語(yǔ)句追加到array_sqlString數(shù)組中
16array_sqlString[0]=inser_bookborrow;
17array_sqlString[1]=update_bookstatus;
18
19//檢測(cè)讀者所借圖書(shū)是否已被借出,已被借出則不能借閱
20if(checkBookStatus(bookId)){return"-1";}21//圖書(shū)未被借出,則執(zhí)行圖書(shū)借閱事務(wù),并返回讀者借閱圖書(shū)結(jié)果集
22if(return_trans(array_sqlString)) {returnback_borrowedbook(userId);}
23return"-1"; //借閱不成功
24}服務(wù)器端向客戶端返回XML文檔有三種情況:第一種是返回讀者基本信息和未還圖書(shū)數(shù)量以及超期圖書(shū)數(shù)量的統(tǒng)計(jì)信息;第二種是返回讀者將要借閱的圖書(shū)信息;第三種是返回讀者未還的所有圖書(shū)信息的列表。依據(jù)這三種情況客戶端的響應(yīng)函數(shù)要分別進(jìn)行處理。響應(yīng)函數(shù)的結(jié)構(gòu)如下:
案例說(shuō)明:本模塊響應(yīng)服務(wù)器的反饋處理,當(dāng)XML文檔反饋到客戶端后,處理程序根據(jù)預(yù)先約定的XML文檔中關(guān)鍵位置的關(guān)鍵元素名稱決定做何處理。模塊名稱:processRequest
01functionprocessRequest()
02{
03if((http_request.readyState==4)&&(http_request.status==200))
04{
05varxmlText=http_request.responseText;
06//建立XMLDOM對(duì)象,接收服務(wù)器端返回的XML文檔07varXMLDom=newActiveXObject("Microsoft.XMLDOM");
08XMLDom.async=false;//設(shè)置為同步方式獲取數(shù)據(jù)
09XMLDom.loadXML(xmlText);
10varfld_flag=XMLDom.documentElement.firstChild.childNodes[1].nodeName;
11switch(fld_flag)12{
13case"userNum": //處理反饋的讀者信息和讀者借書(shū)統(tǒng)計(jì)信息
14bindUser(XMLDom);
15getUserBooks(document.getElementById("userId").value);
16break;
17case"bookNum": //處理反饋的將要借閱的圖書(shū)信息18bindBook(XMLDom);
19break;
20case"borrowId": //處理讀者所有未還圖書(shū)的信息
21bindBorrowBook(XMLDom);
22break;
23}
24}
25}案例分析:第14行和第18行的XML元素綁定到頁(yè)面表單的過(guò)程在這里不再描述,方法在“讀者信息維護(hù)”模塊的分析中已經(jīng)做了討論。第21行的綁定處理將在后面的分析中
討論。
第15行當(dāng)讀者信息、讀者未還圖書(shū)量和過(guò)期圖書(shū)量的統(tǒng)計(jì)信息綁定到客戶端的頁(yè)面后,根據(jù)讀者Id去服務(wù)器端取讀者所有未還圖書(shū)的詳細(xì)信息。函數(shù)getUserBooks向服務(wù)器發(fā)
請(qǐng)求。案例說(shuō)明:向服務(wù)器請(qǐng)求讀者未還圖書(shū)信息。
模塊名稱:getUserBooks
01functiongetUserBooks(userId)
02{
03varurl=window.location.toString();
04url=url.replace(/borrowHTMLPage.htm/,"borrowHandle.asp");
05send_request_post(url,MakeNotReturnBooksXML(userId));
06}案例說(shuō)明:本模塊演示構(gòu)造請(qǐng)求讀者未還圖書(shū)信息的XML文檔,包含讀者Id和處理標(biāo)識(shí)“1”。模塊名稱:MakeNotReturnBooksXML
01functionMakeNotReturnBooksXML(userId)
02{
03varxmlstr="";
04xmlstr=xmlstr+"<userId><![CDATA["+userId+"]]></userId>";
05xmlstr=xmlstr+"<flag><![CDATA[1]]></flag>"
06xmlstr="<?xmlversion='1.0'encoding='utf-8'?><root>"+xmlstr+"</root>";
07returnxmlstr;
08}案例說(shuō)明:綁定讀者未還圖書(shū)的信息。
模塊名稱:bindBorrowBook
01functionbindBorrowBook(XMLDom)
02{
03//定義數(shù)據(jù)文檔對(duì)象XSLDom,加載XSL樣式文檔
04varXSLDom=document.getElementById("xslds").XMLDocument;
05//啟用XSL轉(zhuǎn)換,并將轉(zhuǎn)換的結(jié)果顯示在層checkResult中
06document.getElementById("borrowDiv").innerHTML=XMLDom.transformNode(XSLDom);
07}案例分析:模塊bindBorrowBook第04行獲取客戶端的數(shù)據(jù)島對(duì)象,數(shù)據(jù)島對(duì)象中保存了XML的轉(zhuǎn)換文檔XSL。第06行啟用XSL將包含未還圖書(shū)信息的XML文檔轉(zhuǎn)換為HTML文檔,并輸出到層對(duì)象borrowDiv中,以列表形式呈現(xiàn)在客戶端的頁(yè)面中。XSL轉(zhuǎn)換文檔的結(jié)構(gòu)如下:
01<?xmlversion="1.0"encoding="UTF-8"?>
02<xsl:stylesheetversion="1.0"xmlns:xsl="/1999/XSL/Transform">
03<xsl:templatematch="/">
04<tablestyle="font-size:10pt;font-family:宋體;width:620px;margin:2px;">
05<theadalign="left">06<th>編號(hào)</th>
07<th>標(biāo)題</th>
08
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 護(hù)理輪轉(zhuǎn)中期考核
- 馬克筆爆米花課件
- 2026屆新高考化學(xué)沖刺復(fù)習(xí)-晶體結(jié)構(gòu)分析與計(jì)算
- 食品安全高溫期間培訓(xùn)課件
- 基層醫(yī)療機(jī)構(gòu)慢病管理服務(wù)定價(jià)策略
- 西南大學(xué)附中2026屆高二上數(shù)學(xué)期末教學(xué)質(zhì)量檢測(cè)試題含解析
- 基于3D建模的腹腔鏡手術(shù)虛擬仿真系統(tǒng)開(kāi)發(fā)
- 國(guó)際遠(yuǎn)程醫(yī)療不良事件報(bào)告經(jīng)驗(yàn)借鑒與本土化
- 國(guó)際醫(yī)療合作中的醫(yī)療服務(wù)輸出質(zhì)量評(píng)價(jià)標(biāo)準(zhǔn)
- 2026屆江西省于都實(shí)驗(yàn)中學(xué)高二生物第一學(xué)期期末統(tǒng)考試題含解析
- 開(kāi)曼群島公司法2024版中文譯本(含2024年修訂主要內(nèi)容)
- 貴陽(yáng)市普通中學(xué)2023-2024學(xué)年度高一第一學(xué)期數(shù)學(xué)期末監(jiān)測(cè)考試試卷
- 湘教 八下 數(shù)學(xué) 第2章《平行四邊形的判定》課件
- 骨科技能操作流程及評(píng)分標(biāo)準(zhǔn)
- 控制區(qū)人員通行證件考試1附有答案
- 2016-2023年北京財(cái)貿(mào)職業(yè)學(xué)院高職單招(英語(yǔ)/數(shù)學(xué)/語(yǔ)文)筆試歷年參考題庫(kù)含答案解析
- 《思想道德與法治》
- 滬教版生物科學(xué)八年級(jí)上冊(cè)重點(diǎn)知識(shí)點(diǎn)總結(jié)
- 汽車(chē)美容裝潢工(四級(jí))職業(yè)資格考試題庫(kù)-下(判斷題匯總)
- 焊縫的圖示法
- 2020年云南省中考英語(yǔ)試卷真題及答案詳解(含作文范文)
評(píng)論
0/150
提交評(píng)論