版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第10章綜合應(yīng)用實例——圖書管理系統(tǒng)10.1項目功能概述10.2數(shù)據(jù)庫設(shè)計10.3架構(gòu)設(shè)計10.4Web表現(xiàn)層設(shè)計10.5業(yè)務(wù)邏輯層設(shè)計10.6代碼實現(xiàn)10.7本章小結(jié)習(xí)題10
10.1項目功能概述
本章綜合運用前面各章所介紹的知識設(shè)計一個圖書管理系統(tǒng)。圖書館的信息化管理從最初對業(yè)務(wù)管理實行信息化管理發(fā)展到對圖書館各個業(yè)務(wù)流程進(jìn)行系統(tǒng)化和網(wǎng)絡(luò)化管理,并建立大規(guī)模的以個體文獻(xiàn)目錄聯(lián)機(jī)查詢?yōu)橹鞯馁Y源共享系統(tǒng)。本章僅介紹與讀者和圖書相關(guān)的一些基本功能及其設(shè)計實現(xiàn)。一個圖書管理系統(tǒng)包含管理員模塊和讀者模塊。管理員模塊負(fù)責(zé)維護(hù)讀者信息、圖書信息和圖書流通信息。其中,讀者信息管理主要供管理員錄入和修改讀者檔案以及維護(hù)讀者的借書證狀態(tài);圖書信息管理主要維護(hù)圖書檔案的錄入、修改以及設(shè)置圖書狀態(tài);圖書流通管理主要維護(hù)圖書的借閱與歸還。讀者模塊供讀者使用,讀者可以查詢自己的個人信息、圖書信息及圖書借閱信息,并能在規(guī)定的續(xù)借次數(shù)內(nèi)進(jìn)行圖書續(xù)借。
根據(jù)以上的分析可以設(shè)計出圖書管理系統(tǒng)的主要功能模塊圖,如圖10-1所示。圖10-1圖書管理系統(tǒng)功能模塊劃分
10.2數(shù)?據(jù)?庫?設(shè)?計
一個圖書管理系統(tǒng)中包含多張表,分別存儲相應(yīng)子功能的數(shù)據(jù),其中“讀者信息”表和“圖書信息”表是關(guān)鍵表,用于存儲讀者信息和圖書信息。圖書管理系統(tǒng)實際上就是對讀者信息和圖書信息進(jìn)行管理。圖書管理系統(tǒng)中與讀者和圖書最相關(guān)的兩個流程是圖書借閱流程和圖書歸還流程。10.2.1圖書管理系統(tǒng)E-R圖
圖書管理系統(tǒng)中關(guān)鍵實體的E-R圖如圖10-2所示。圖10-2圖書管理系統(tǒng)E-R圖10.2.2圖書管理系統(tǒng)中的相關(guān)表
1.圖書信息表
圖書信息表books存儲圖書的主要信息,如表10-1所示。表10-1圖書信息表books
2.讀者信息表
讀者信息表users存儲讀者的主要信息,如表10-2所示。表10-2讀者信息表users
3.圖書借閱表
圖書借閱表bookborrow記錄讀者借閱圖書的信息,如表10-3所示。表10-3圖書借閱表bookborrow
4.圖書歸還表
圖書歸還表bookreturn記錄讀者還書的信息,如表10-4所示。表10-4圖書歸還表bookreturn
10.3架構(gòu)設(shè)計
本節(jié)討論圖書管理系統(tǒng)的系統(tǒng)流程和軟件的架構(gòu)模型。
10.3.1系統(tǒng)流程
圖書管理系統(tǒng)的系統(tǒng)流程如圖10-3所示。管理員可以直接管理讀者信息和圖書信息,并通過讀者和圖書之間的借閱關(guān)系管理圖書的流通過程。圖10-3系統(tǒng)流程圖10.3.2架構(gòu)模型
圖書管理系統(tǒng)采用構(gòu)建于B/S模式上的三層體系結(jié)構(gòu)來實現(xiàn)。第一層為Web表現(xiàn),第二層為業(yè)務(wù)邏輯層,第三層為數(shù)據(jù)資源層。Web表現(xiàn)層使用JavaScript腳本、HTML語言、樣式轉(zhuǎn)換語言XSLT和層疊樣式語言CSS構(gòu)建系統(tǒng)各功能頁面,用戶通過操作功能界面實現(xiàn)和底層的數(shù)據(jù)交互。業(yè)務(wù)邏輯層是Web表現(xiàn)層和數(shù)據(jù)資源層的中間橋梁,負(fù)責(zé)接收表現(xiàn)層遞交過來的數(shù)據(jù),并對數(shù)據(jù)依據(jù)業(yè)務(wù)需求進(jìn)行邏輯處理,將處理后的結(jié)果遞交給下一層次處理。數(shù)據(jù)資源層是后臺的數(shù)據(jù)庫,負(fù)責(zé)接收并存儲邏輯層遞交來的數(shù)據(jù)。
Web服務(wù)器使用微軟的IIS構(gòu)建,業(yè)務(wù)邏輯層運行于Web服務(wù)器上。為達(dá)到較好的用戶體驗和較高的數(shù)據(jù)傳輸效率,客戶端和服務(wù)器采用異步數(shù)據(jù)交互方式(即AJAX技術(shù))??蛻舳讼蚍?wù)器發(fā)送HTTP請求,服務(wù)器以XML文檔形式響應(yīng)客戶端請求,請求與響應(yīng)的過程異步進(jìn)行。客戶端取得XML數(shù)據(jù)后,使用JavaScript、HTML和CSS重新構(gòu)建局部頁面,而不刷新整個頁面,或使用客戶端的XSL文檔對象轉(zhuǎn)換XML數(shù)據(jù),局部更新頁面。
10.4Web表現(xiàn)層設(shè)計
本節(jié)設(shè)計圖書管理系統(tǒng)的主要功能頁面。
10.4.1讀者信息管理
讀者信息管理的Web表現(xiàn)層頁面由讀者信息添加頁面、讀者信息查詢和更新頁面組成,如圖10-4和圖10-5所示。圖10-4所示的讀者信息添加頁面負(fù)責(zé)將讀者在頁面上輸入的讀者信息添加到數(shù)據(jù)庫。頁面的上部為功能操作區(qū),功能操作區(qū)的下面是信息錄入?yún)^(qū)。在圖10-5所示的讀者信息查詢和更新頁面中的上半部分輸入讀者借書證號,單擊“查詢”按鈕,讀者信息將出現(xiàn)在下半部分的信息顯示區(qū),可以修改顯示區(qū)的信息,修改完畢,單擊“更新”按鈕將修改后的數(shù)據(jù)保存到數(shù)據(jù)庫。圖10-4添加讀者信息頁面圖10-5查詢和更新讀者信息頁面10.4.2圖書信息管理
圖書信息維護(hù)頁面由圖10-6所示的添加圖書信息和圖10-7所示的查詢和更新圖書信息兩個頁面組成。頁面功能區(qū)劃分與讀者信息管理的頁面劃分類似。頁面的頂部為功能操作區(qū),可以查詢、添加、更新圖書信息;頁面的下半部分為圖書信息的編輯區(qū),可以添加圖書信息和修改圖書信息。圖10-6添加圖書信息頁面圖10-7查詢和更新圖書信息頁面10.4.3借書管理
圖書借閱管理頁面如圖10-8所示。頁面分為上、下兩個部分。上半部分左邊為讀者借書信息的統(tǒng)計區(qū),上半部分右邊為待借圖書的簡要信息顯示區(qū)。下半部分的空白區(qū)為讀者已借圖書信息的顯示區(qū)。圖10-8圖書借閱頁面10.4.4還書管理
圖書歸還管理頁面如圖10-9所示。頁面分為上、下兩個部分。上半部分為功能區(qū)和待還圖書信息顯示區(qū),包括待還圖書信息查詢和還書操作,以及依據(jù)讀者借書證號查詢讀者應(yīng)還圖書信息。下半部分的空白區(qū)顯示讀者應(yīng)還圖書。圖10-9圖書歸還頁面10.4.5圖書查詢
圖書信息查詢頁面如圖10-10所示。頁面分為上、下兩個區(qū)域。上半?yún)^(qū)域為功能區(qū)域,可以依據(jù)檢索類型和檢索模式查詢圖書,查詢的結(jié)果顯示在頁面下半部分的空白區(qū)。圖10-10圖書信息查詢頁面10.4.6圖書續(xù)借
圖書續(xù)借頁面如圖10-11所示,其劃分模式與圖書信息查詢頁面的劃分模式類似。上半部分為功能輸入?yún)^(qū),讀者輸入借書證號和密碼登錄系統(tǒng),讀者應(yīng)還圖書信息將顯示在頁面下半部分的空白區(qū)。針對具體的圖書狀態(tài),可以進(jìn)行續(xù)借操作。圖10-11圖書續(xù)借頁面
10.5業(yè)務(wù)邏輯層設(shè)計
本章中的圖書管理系統(tǒng)是一個簡單的圖書管理系統(tǒng)。信息維護(hù)在設(shè)計時主要考慮讀者信息維護(hù)和圖書信息維護(hù)。流通管理在設(shè)計時僅考慮了圖書管理中最主要的模塊“圖書借閱模塊”、“圖書歸還模塊”和“圖書續(xù)借模塊”的設(shè)計。讀者信息維護(hù)和圖書信息維護(hù)模塊業(yè)務(wù)流程相對簡單,流通管理涉及到的業(yè)務(wù)流程相對復(fù)雜,本節(jié)將對流通管理的三個主要模塊的業(yè)務(wù)流程進(jìn)行分析。10.5.1圖書借閱
圖書借閱模塊主要管理讀者借閱圖書的過程以及記錄讀者借閱圖書的信息。圖書借閱的業(yè)務(wù)流程描述如下:
(1)輸入借書證號,判斷借書證是否掛失。若借書證掛失,則流程結(jié)束;若借書證未掛失,則顯示讀者已借圖書信息和讀者借書統(tǒng)計信息。
(2)輸入圖書代碼,顯示待借圖書簡要信息,執(zhí)行圖書“借出”操作。如果讀者“未還圖書數(shù)量”大于“借書上限”,或者超期圖書數(shù)量大于0,或者圖書狀態(tài)為“借出”或“掛失”,則禁止執(zhí)行圖書“借出”操作;否則允許操作。
(3)“借出”操作執(zhí)行下列事務(wù):向圖書借閱表中添加借閱記錄,修改圖書信息表中圖書狀態(tài)為“借出”,并將圖書累計借出次數(shù)加1。
(4)“借出”事務(wù)執(zhí)行完畢,借書流程結(jié)束。
圖書借閱流程如圖10-12所示。圖10-12圖書借閱業(yè)務(wù)流程10.5.2圖書歸還
圖書歸還模塊主要負(fù)責(zé)記錄讀者還書記錄,并修改圖書是否歸還的狀態(tài),以便歸還的圖書可以進(jìn)入流通領(lǐng)域的下一次借閱過程。圖書歸還的業(yè)務(wù)流程描述如下:
(1)輸入借書證號可以顯示讀者所有應(yīng)還圖書信息。輸入圖書代碼顯示與該代碼相對應(yīng)的圖書信息,并顯示讀者信息和讀者圖書借閱信息。
(2)通過下列事務(wù)執(zhí)行“還書”操作:在圖書歸還表中添加一條讀者還書記錄,修改圖書借閱表中圖書狀態(tài)為“已還”,修改圖書信息表中圖書狀態(tài)為“可借”。
(3)歸還事務(wù)執(zhí)行完畢,還書流程結(jié)束。
圖書歸還流程如圖10-13所示。圖10-13圖書歸還業(yè)務(wù)流程10.5.3圖書續(xù)借
當(dāng)讀者借閱的圖書沒有過期,并且續(xù)借次數(shù)沒有超過規(guī)定的續(xù)借次數(shù)時,可以在網(wǎng)上對圖書直接進(jìn)行續(xù)借,而不必去圖書館辦理續(xù)借手續(xù)。圖書續(xù)借流程描述如下:
(1)讀者輸入借書證號和密碼,顯示讀者應(yīng)還圖書信息。執(zhí)行圖書續(xù)借操作,如果當(dāng)前日期大于圖書借閱表中應(yīng)還日期(即超期),或者借閱次數(shù)超過規(guī)定次數(shù),則禁止圖書續(xù)借
操作。
(2)如果圖書續(xù)借操作滿足操作條件,則執(zhí)行如下的續(xù)借事務(wù):圖書續(xù)借表中的借閱次數(shù)加1,圖書歸還表中應(yīng)還日期加設(shè)定的天數(shù)(如允許續(xù)借30天)。
(3)圖書續(xù)借事務(wù)執(zhí)行完畢,續(xù)借流程結(jié)束。
圖書續(xù)借流程如圖10-14所示。圖10-14圖書續(xù)借業(yè)務(wù)流程
10.6代碼實現(xiàn)
本節(jié)主要討論圖書管理系統(tǒng)客戶端和服務(wù)器端的代碼實現(xiàn),并給出主要代碼的分析。
10.6.1XML文檔結(jié)構(gòu)設(shè)計
客戶端與服務(wù)器端的數(shù)據(jù)交互以XML文檔形式進(jìn)行,為方便客戶端和服務(wù)器端的處理,對客戶端發(fā)送的XML文檔結(jié)構(gòu)和服務(wù)返回的XML文檔結(jié)構(gòu)做了約定。
1.客戶端發(fā)送的XML結(jié)構(gòu)
客戶端的XML文檔為一層結(jié)構(gòu),根元素名稱約定為<root>,除最后一個子元素命名為<flag>外,其余子元素以數(shù)據(jù)庫字段命名。<flag>元素封裝了數(shù)據(jù)的處理標(biāo)識位,以數(shù)字字符作為標(biāo)識位:“1”表示查詢數(shù)據(jù)庫數(shù)據(jù)記錄,“2”表示向數(shù)據(jù)庫添加數(shù)據(jù)記錄,“3”表示修改數(shù)據(jù)庫數(shù)據(jù)記錄,“4”表示刪除數(shù)據(jù)庫記錄。
案例說明:本案例演示查詢讀者借書證號為“102800401”的未還圖書記錄,客戶端的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ù)據(jù)字段“userNum”作為XML元素的名稱封裝讀者的借書證號“102800401”,第04行封裝了后臺數(shù)據(jù)的操作要求,查詢數(shù)據(jù)庫。為減少出錯,所有數(shù)據(jù)均使用字符數(shù)據(jù)段封裝。
2.服務(wù)器端返回的XML文檔結(jié)構(gòu)
當(dāng)查詢的結(jié)果集需返回給客戶端時,約定服務(wù)器端的XML文檔結(jié)構(gòu)為兩層結(jié)構(gòu)。根元素為<root>,第二層子元素為<row>,第三層子元素以數(shù)據(jù)庫字段封裝字段對應(yīng)的內(nèi)容。
案例說明:本案例演示服務(wù)器端返回借書證號為“102800401”的讀者未還圖書的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實踐教程]]></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ù)庫字段——bookNum(借書證號)、callNum(索書號)、bookname(書名)、author(作者)、borrowDate(借閱日期)、limitDate(應(yīng)還日期)。
從數(shù)據(jù)庫獲取數(shù)據(jù)構(gòu)造服務(wù)器端的XML文檔可以通過使用如下案例中的公共模塊來實現(xiàn)。
案例說明:本案例演示依據(jù)記錄集構(gòu)造XML文檔的公共模塊?!皉s”為服務(wù)器端查詢數(shù)據(jù)庫返回的記錄集。模塊名稱:makeXML
01functionmakeXML(rs)
02{//根據(jù)數(shù)據(jù)庫查詢的記錄集構(gòu)造XML文檔
03varxmlstr="";
04while(!rs.EOF)
05{
06xmlstr=xmlstr+"<row>";
07for(vari=0;i<rs.fields.count;i++)
08{09varfld=rs.fields;//獲取記錄集中字段對象
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ù)資源層的代碼實現(xiàn)
數(shù)據(jù)資源層的代碼負(fù)責(zé)與數(shù)據(jù)庫的交互,根據(jù)客戶端的請求對數(shù)據(jù)庫進(jìn)行操作,通過以下幾個功能模塊來實現(xiàn)。
1.創(chuàng)建數(shù)據(jù)庫連接
案例說明:本模塊負(fù)責(zé)創(chuàng)建數(shù)據(jù)庫連接,數(shù)據(jù)庫連接成功,返回連接對象供使用,否則返回空值。模塊名稱: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ù)庫并返回記錄集
案例說明:本模塊負(fù)責(zé)查詢數(shù)據(jù)庫,并返回記錄集。參數(shù)“sql”為查詢數(shù)據(jù)庫的select語句,由業(yè)務(wù)邏輯層構(gòu)造。模塊名稱:return_rs
01functionreturn_rs(sql)
02{
03varrs=null;
04varconn=open_db(); //創(chuàng)建數(shù)據(jù)庫連接
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ù)庫不返回記錄集
案例說明:本模塊依據(jù)insert、update、delete語句操作數(shù)據(jù)庫,不返回記錄集,返回是否成功的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ù)處理
案例說明:本模塊演示多表聯(lián)動操作的事務(wù)處理。array_sqlString為包含多條sql語句序列的數(shù)組。模塊名稱:return_trans
01functionreturn_trans(array_sqlString)
02{
03varresult=false;
04varconn=open_db();//創(chuàng)建數(shù)據(jù)庫連接
05if(conn!=null)
06{
07try{
08conn.BeginTrans; //事務(wù)開始
09for(iinarray_sqlString){
10conn.execute(array_sqlString[i]);//執(zhí)行sql語句11}
12conn.CommitTrans; //執(zhí)行事務(wù)提交
13result=true;
14}
15catch(e){
16conn.RollbackTrans; //出錯回滾
17result=false;
18}
19}
20returnresult;
21}案例分析:當(dāng)進(jìn)行借書和還書操作時涉及多個表的關(guān)聯(lián)操作,為確保多表的操作不出錯,需進(jìn)行事務(wù)處理。當(dāng)所有操作成功時,操作才能完成;只要有一個操作失敗,所有操作便都要取消。10.6.3客戶端與服務(wù)器異步數(shù)據(jù)傳輸邏輯
客戶端與服務(wù)器端數(shù)據(jù)傳輸采用異步方式進(jìn)行,客戶端以post方式向服務(wù)器端發(fā)送數(shù)據(jù)。
案例說明:本案例演示客戶端向服務(wù)器端以post方式發(fā)送異步請求。模塊名稱:send_request_post
01functionsend_request_post(url,str){//初始化、指定處理函數(shù)、發(fā)送請求的函數(shù)
02//開始初始化XMLHttpRequest對象
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)建對象實例失敗
21window.alert("不能創(chuàng)建XMLHttpRequest對象實例.");
22returnfalse;
23}24http_request.onreadystatechange=processRequest;
//響應(yīng)函數(shù)
25//確定發(fā)送請求的方式和url以及是否同步執(zhí)行下段代碼
26http_request.open("Post",url,true);
27http_request.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded");
28http_request.send(str); //發(fā)送異步請求
29}10.6.4服務(wù)器端的調(diào)度邏輯
服務(wù)器端的處理通過調(diào)度邏輯來完成。調(diào)度邏輯根據(jù)操作數(shù)據(jù)庫的標(biāo)識符選擇操作數(shù)據(jù)庫的方式。圖書管理系統(tǒng)中讀者信息維護(hù)、圖書維護(hù)、圖書借閱、圖書歸還等主要模塊都有單獨的調(diào)度邏輯。案例說明:本案例演示各模塊調(diào)度邏輯的工作流程。
01<%@Language="JScript"%>
02<!--#includefile="book_public.js"--> //封裝了數(shù)據(jù)庫的操作函數(shù)
03<%
04varXMLDom=Server.CreateObject("Microsoft.XMLDOM");
05XMLDom.load(Request);
06//讀取數(shù)據(jù)庫操作符標(biāo)識位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ù)庫的函數(shù)
20break;
21case"4"://刪除操作
22//此處添加刪除數(shù)據(jù)庫記錄的函數(shù)23break;
24default://
25Response.Write("-1");
26}
27XMLDom=null;
28%>案例分析:第02行引入外部文件“book_public.js”,該文件包含了業(yè)務(wù)邏輯層主要功能模塊的代碼實現(xiàn),這些模塊供第10行至第23行的調(diào)度邏輯調(diào)用。第04行和第05行創(chuàng)建一個DOM對象,并將客戶端發(fā)送過來的XML文檔加載到DOM中。第07行讀取數(shù)據(jù)處理標(biāo)識位賦值給變量flag,供第10行的switch語句使用。第08行和第09行設(shè)置服務(wù)器向客戶端返回支持中文編碼的XML文檔。10.6.5業(yè)務(wù)邏輯層主要模塊代碼實現(xiàn)
業(yè)務(wù)邏輯層的主要模塊有讀者信息維護(hù)、圖書信息維護(hù)、圖書借閱、圖書歸還、圖書續(xù)借、圖書檢索等模塊,本節(jié)主要討論讀者信息維護(hù)模塊、圖書借閱模塊和圖書歸還模塊的代碼實現(xiàn),其余模塊作為課后習(xí)題形式給出。
1.讀者信息維護(hù)
讀者信息維護(hù)包括讀者信息添加、查詢和更新。下面首先討論讀者信息的添加。
函數(shù)userInsert()收集客戶端的讀者信息,并向服務(wù)器端的處理程序userHandle.asp發(fā)HTTP請求,處理程序userHandle.asp是10.6.4中描述的調(diào)度邏輯。函數(shù)userInsert()第12行的MakeUserXML()函數(shù)負(fù)責(zé)將客戶端的讀者信息拼裝成XML文檔,并發(fā)送給服務(wù)器。
案例說明:本模塊演示客戶端向服務(wù)器端發(fā)送包含讀者信息的XML文檔。模塊名稱:userInsert
01functionuserInsert()
02{
03varobjUserNum=document.getElementById("userNum");
04if(objUserNum.value=="")
05{
06alert("借書證號不能為空!");
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)識位“2”,表示向數(shù)據(jù)庫添加讀者信息。
案例說明:本模塊演示獲取客戶端頁面讀者信息構(gòu)造包含數(shù)據(jù)處理標(biāo)識位的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ā)送過來的XML文檔,并根據(jù)數(shù)據(jù)處理標(biāo)識位執(zhí)行向數(shù)據(jù)庫插入數(shù)據(jù)的操作。
添加讀者信息到數(shù)據(jù)庫:
return_bool(insertUser(XMLDom))
其中,函數(shù)insertUser構(gòu)建向數(shù)據(jù)庫插入數(shù)據(jù)的sql語句;參數(shù)XMLDom是包含讀者信息的XML對象,用于構(gòu)造Insert語句。函數(shù)insertUser的返回值為構(gòu)造好的Insert語句。將返回的sql語句作為參數(shù),調(diào)用數(shù)據(jù)資源層的函數(shù)模塊return_bool實現(xiàn)讀者數(shù)據(jù)添加到數(shù)據(jù)庫的操作。下面討論讀者信息的查詢和更新。
根據(jù)讀者的借書證號查詢讀者信息??蛻舳嗽跇?gòu)造包含借書證號的請求XML文檔時,數(shù)據(jù)處理標(biāo)識位為“1”,服務(wù)器端收到請求文檔,讀取標(biāo)識位,根據(jù)數(shù)據(jù)處理標(biāo)識位調(diào)用查詢模塊,獲得指定讀者的信息,并以XML文檔形式返回給客戶端??蛻舳说捻憫?yīng)函數(shù)解析收到的XML文檔,將XML文檔中數(shù)據(jù)與頁面表單項綁定,實現(xiàn)數(shù)據(jù)查詢和編輯。
案例說明:本模塊為客戶端的響應(yīng)函數(shù),當(dāng)服務(wù)器端返回的數(shù)據(jù)下載到客戶端時觸發(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對象,接收服務(wù)器端返回的XML文檔
10varXMLDom=newActiveXObject(“Microsoft.XMLDOM”);
11XMLDom.async=false;//設(shè)置為同步方式獲取數(shù)據(jù)
12XMLDom.loadXML(xmlText); //將XML文檔加載到XMLDom對象中
13binduser(XMLDom);//將返回的讀者信息綁定到頁面表單項
14}
15}解析XMLDom,將XMLDom中節(jié)點封裝的數(shù)據(jù)與頁面表單對應(yī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請求文檔,數(shù)據(jù)處理標(biāo)識也為“3”,服務(wù)器接收到XML文檔后根據(jù)數(shù)據(jù)處理標(biāo)識位調(diào)用更新處理函數(shù)構(gòu)造update語句,并將數(shù)據(jù)更新到數(shù)據(jù)庫。
圖書信息維護(hù)模塊的實現(xiàn)過程與讀者信息維護(hù)模塊的實現(xiàn)過程類似,這里不再重復(fù)。
2.圖書借閱
首先要根據(jù)讀者借書證號檢查讀者未還圖書數(shù)量和超期圖書數(shù)量,如果讀者未還圖書數(shù)量超過最大借書數(shù)量或有過期圖書,則不能借書。統(tǒng)計未還圖書數(shù)量和超期圖書數(shù)量的函數(shù)如下:
案例說明:根據(jù)讀者Id統(tǒng)計讀者未還圖書數(shù)量。圖書借閱表(bookborrow)中圖書狀態(tài)為“1”(borrowstatus='1')的圖書是未還圖書。模塊名稱: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)計讀者未還圖書的sql語句,第05行調(diào)用數(shù)據(jù)資源層return_rs模塊查詢讀者未還圖書量。第06行調(diào)用函數(shù)makeXML(rs)將返回的記錄集轉(zhuǎn)換為XML文檔。
案例說明:根據(jù)讀者Id統(tǒng)計讀者超期圖書數(shù)量,當(dāng)前日期超過圖書應(yīng)還日期則圖書過期。模塊名稱: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}需借閱的圖書信息根據(jù)圖書的編碼從數(shù)據(jù)庫讀取。當(dāng)滿足借閱條件時可以執(zhí)行圖書的借閱過程。
案例說明:本案例演示圖書借閱事務(wù)處理模塊,第22行調(diào)用數(shù)據(jù)資源層的事務(wù)處理模塊return_trans完成借書過程涉及到的多表關(guān)聯(lián)操作。模塊名稱:borrowBook
01functionborrowBook(userId,bookId)
02{
03vararray_sqlString=newArray();
04vardate=newDate();
05//設(shè)置借書時間
06varborrowDate=date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate();
07date.setMonth(date.getMonth()+3); //每本圖書限借3個月08//設(shè)置還書時間
09varlimitDate=date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate();
10varborrowregistrar=Session("username"); //從session中獲取管理員用戶名
11//構(gòu)造添加借書記錄的sql語句12varinser_bookborrow="insertinto[bookborrow]([bookId],[userId],"+"[borrowDate],[limitDate],[renewNum],"+"[borrowStatus],[borrowregistrar])values('"+bookId+"','"+userId+"','"+borrowDate+"','"+limitDate+"','1','1','"+borrowregistrar+"')";
13//構(gòu)造修改圖書信息表圖書狀態(tài)的sql語句(借出狀態(tài)為'2')
14varupdate_bookstatus="update[books]set[bookstatus]='2',[borrowNum]=cast([borrowNum]asint)+1where[bookId]='"+bookId+"'";15//將兩天sql語句追加到array_sqlString數(shù)組中
16array_sqlString[0]=inser_bookborrow;
17array_sqlString[1]=update_bookstatus;
18
19//檢測讀者所借圖書是否已被借出,已被借出則不能借閱
20if(checkBookStatus(bookId)){return"-1";}21//圖書未被借出,則執(zhí)行圖書借閱事務(wù),并返回讀者借閱圖書結(jié)果集
22if(return_trans(array_sqlString)) {returnback_borrowedbook(userId);}
23return"-1"; //借閱不成功
24}服務(wù)器端向客戶端返回XML文檔有三種情況:第一種是返回讀者基本信息和未還圖書數(shù)量以及超期圖書數(shù)量的統(tǒng)計信息;第二種是返回讀者將要借閱的圖書信息;第三種是返回讀者未還的所有圖書信息的列表。依據(jù)這三種情況客戶端的響應(yīng)函數(shù)要分別進(jìn)行處理。響應(yīng)函數(shù)的結(jié)構(gòu)如下:
案例說明:本模塊響應(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對象,接收服務(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": //處理反饋的讀者信息和讀者借書統(tǒng)計信息
14bindUser(XMLDom);
15getUserBooks(document.getElementById("userId").value);
16break;
17case"bookNum": //處理反饋的將要借閱的圖書信息18bindBook(XMLDom);
19break;
20case"borrowId": //處理讀者所有未還圖書的信息
21bindBorrowBook(XMLDom);
22break;
23}
24}
25}案例分析:第14行和第18行的XML元素綁定到頁面表單的過程在這里不再描述,方法在“讀者信息維護(hù)”模塊的分析中已經(jīng)做了討論。第21行的綁定處理將在后面的分析中
討論。
第15行當(dāng)讀者信息、讀者未還圖書量和過期圖書量的統(tǒng)計信息綁定到客戶端的頁面后,根據(jù)讀者Id去服務(wù)器端取讀者所有未還圖書的詳細(xì)信息。函數(shù)getUserBooks向服務(wù)器發(fā)
請求。案例說明:向服務(wù)器請求讀者未還圖書信息。
模塊名稱:getUserBooks
01functiongetUserBooks(userId)
02{
03varurl=window.location.toString();
04url=url.replace(/borrowHTMLPage.htm/,"borrowHandle.asp");
05send_request_post(url,MakeNotReturnBooksXML(userId));
06}案例說明:本模塊演示構(gòu)造請求讀者未還圖書信息的XML文檔,包含讀者Id和處理標(biāo)識“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}案例說明:綁定讀者未還圖書的信息。
模塊名稱:bindBorrowBook
01functionbindBorrowBook(XMLDom)
02{
03//定義數(shù)據(jù)文檔對象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ù)島對象,數(shù)據(jù)島對象中保存了XML的轉(zhuǎn)換文檔XSL。第06行啟用XSL將包含未還圖書信息的XML文檔轉(zhuǎn)換為HTML文檔,并輸出到層對象borrowDiv中,以列表形式呈現(xiàn)在客戶端的頁面中。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>編號</th>
07<th>標(biāo)題</th>
08
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 車站裝修批蕩施工協(xié)議
- 防腐施工應(yīng)急預(yù)案合同
- 互聯(lián)網(wǎng)項目招投標(biāo)合同注意事項
- 化工行業(yè)招待費管理新方法
- 花藝助理勞動合同注意事項
- 供水供電收費管理:發(fā)票管理辦法
- 食品飲料輸送管道施工
- 2025版空置房屋閑置資源盤活利用合作開發(fā)合同3篇
- 臨時辦學(xué)場所租賃合同
- 2025版二零二五年度新能源充電樁建設(shè)與運營合同3篇
- 2024年四級品酒師資格認(rèn)證考試題庫(濃縮400題)
- 國家電投《新能源電站單位千瓦造價標(biāo)準(zhǔn)值(2024)》
- 2024年云南高中學(xué)業(yè)水平合格考?xì)v史試卷真題(含答案詳解)
- 電影攝影及特殊拍攝技術(shù)(上海電影藝術(shù)職業(yè)學(xué)院)知到智慧樹答案
- 山東省臨沂市2023-2024學(xué)年高二上學(xué)期期末考試政治試題 含答案
- 東北三省精準(zhǔn)教學(xué)2024-2025學(xué)年高三上學(xué)期12月聯(lián)考數(shù)學(xué)試卷
- 醫(yī)院廉潔購銷合同
- 車間設(shè)備線路安裝方案
- 2024年汽車修理工職業(yè)技能考試練習(xí)題(含答案)
- 鄉(xiāng)村振興課件模板
- 專題11 名著閱讀之《童年》(考題猜想)(期中真題速遞20題)(含答案解析)
評論
0/150
提交評論