版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
本章要求:第15章課程設(shè)計——圖書館管理系統(tǒng)圖書館管理系統(tǒng)的設(shè)計目的圖書館管理系統(tǒng)的開發(fā)環(huán)境要求圖書館管理系統(tǒng)的功能結(jié)構(gòu)及系統(tǒng)流程圖書館管理系統(tǒng)的數(shù)據(jù)庫設(shè)計主要功能模塊的界面設(shè)計主要功能模塊的關(guān)鍵代碼圖書館管理系統(tǒng)的調(diào)試運行本章要求:第15章課程設(shè)計——圖書館管理系統(tǒng)圖書館管理系統(tǒng)主要內(nèi)容1.課程設(shè)計目的2.功能描述3.總體設(shè)計4.數(shù)據(jù)庫設(shè)計5.實現(xiàn)過程6.調(diào)試運行7.課程設(shè)計總結(jié)第15章課程設(shè)計——圖書館管理系統(tǒng)主要內(nèi)容1.課程設(shè)計目的第15章課程設(shè)計——圖書館管理系統(tǒng)15.1課程設(shè)計目的本章提供了“圖書館管理系統(tǒng)”作為這一學(xué)期的課程設(shè)計之一,本次課程設(shè)計旨在提升學(xué)生的動手能力,加強大家對專業(yè)理論知識的理解和實際應(yīng)用。本次課程設(shè)計的主要目的如下:加深對面向?qū)ο蟪绦蛟O(shè)計思想的理解,能對網(wǎng)站功能進行分析,并設(shè)計合理的類結(jié)構(gòu)。掌握JSP網(wǎng)站的基本開發(fā)流程。掌握JDBC技術(shù)在實際開發(fā)中的應(yīng)用。掌握Servlet技術(shù)在實際開發(fā)中的應(yīng)用。掌握JSP經(jīng)典設(shè)計模式中Model2的開發(fā)流程。提供網(wǎng)站的開發(fā)能力,能夠運用合理的控制流程編寫高效的代碼。培養(yǎng)分析問題、解決實際問題的能力。15.1課程設(shè)計目的本章提供了“圖書館管理系統(tǒng)”15.2功能描述圖書館管理系統(tǒng)是一個小型的圖書館管理系統(tǒng),該系統(tǒng)的主要功能如下:美觀友好的操作界面,能保證系統(tǒng)的易用性。管理圖書類型信息、圖書信息和書架信息等功能。讀者類型和讀者檔案管理功能??梢詫崿F(xiàn)圖書的借閱、續(xù)借和歸還功能。提供查看圖書借閱排行榜功能。具有借閱到期提醒功能。查詢圖書借閱信息。圖書檔案查詢功能。15.2功能描述圖書館管理系統(tǒng)是一個小型的圖書館管理系統(tǒng)15.3.1構(gòu)建開發(fā)環(huán)境15.3.2網(wǎng)站功能結(jié)構(gòu)15.3.3系統(tǒng)流程圖15.3總體設(shè)計15.3.1構(gòu)建開發(fā)環(huán)境15.3總體設(shè)計圖書館管理系統(tǒng)的開發(fā)環(huán)境具體要求如下:開發(fā)平臺:WindowsXP(SP2)/WindowsServer2003(SP2)/Windows7。開發(fā)技術(shù):JSP+Servlet+HTML5+JavaScript。后臺數(shù)據(jù)庫:MySQL。Java開發(fā)包:JavaSEDevelopmentKET(JDK)version7Update3。Web服務(wù)器:Tomcat7.0.27。瀏覽器:IE9.0以上版本、Firefox等。分辨率:最佳效果1024×768像素。15.3.1構(gòu)建開發(fā)環(huán)境圖書館管理系統(tǒng)的開發(fā)環(huán)境具體要求如下:15.3.1構(gòu)建開在圖書館管理系統(tǒng)中主要包含6大功能模塊,分別為系統(tǒng)設(shè)置模塊、讀者管理模塊、圖書管理模塊、圖書借還模塊、系統(tǒng)查詢模塊和更改口令模塊,它們的具體介紹如下:系統(tǒng)設(shè)置:用來對系統(tǒng)的一些基礎(chǔ)參數(shù)進行設(shè)置,主要包括圖書管理信息、管理員設(shè)置、參數(shù)設(shè)置、書架設(shè)置等。讀者管理:用來對讀者類型和讀者檔案進行管理,主要包括讀者類型管理和讀者檔案管理等。圖書管理:用來對圖書類型和圖書檔案進行管理,主要包括圖書類型設(shè)置和圖書檔案管理等。圖書借還:用來實現(xiàn)圖書的借閱、續(xù)借和歸還,主要包括圖書借閱、圖書續(xù)借、圖書歸還等。系統(tǒng)查詢:用來實現(xiàn)圖書和借閱信息的查詢,主要包括圖書檔案查詢、圖書借閱查詢、借閱到期提醒等。更改口令:主要用于修改登錄管理員的密碼。15.3.2網(wǎng)站功能結(jié)構(gòu)在圖書館管理系統(tǒng)中主要包含6大功能模塊,分別為系統(tǒng)設(shè)圖書館管理系統(tǒng)的功能結(jié)構(gòu)圖如圖15-1所示。圖15-1圖書館管理系統(tǒng)的功能結(jié)構(gòu)圖圖書館管理系統(tǒng)的功能結(jié)構(gòu)圖如圖15-1所示。圖書館管理系統(tǒng)的系統(tǒng)流程如圖15-2所示。圖15-2圖書館管理系統(tǒng)的系統(tǒng)流程圖15.3.3系統(tǒng)流程圖圖書館管理系統(tǒng)的系統(tǒng)流程如圖15-2所示。15.3.3系統(tǒng)流15.4數(shù)據(jù)庫設(shè)15.4.1實體圖15.4.2數(shù)據(jù)表設(shè)計15.4數(shù)據(jù)庫設(shè)15.4.1實體圖根據(jù)對系統(tǒng)所做的需求分析,規(guī)劃出本系統(tǒng)中使用的數(shù)據(jù)庫實體分別為圖書檔案實體、讀者檔案實體、圖書借閱實體、圖書歸還實體和管理員實體。下面將介紹幾個關(guān)鍵實體的實體圖。圖書檔案實體圖書檔案實體包括編號、條形碼、書名、類型、作者、譯者、出版社、價格、頁碼、書架、庫存總量、錄入時間、操作員和是否刪除等屬性。其中“是否刪除屬性”用于標(biāo)記圖書是否被刪除,由于圖書館中的圖書信息不可以被隨意刪除,所以即使當(dāng)某種圖書不能再借閱,而需要刪除其檔案信息時,也只能采用設(shè)置刪除標(biāo)記的方法。圖書檔案實體的實體圖如圖15-3所示。圖15-3圖書檔案實體圖15.4.1實體圖根據(jù)對系統(tǒng)所做的需求分析,規(guī)劃出本系統(tǒng)中使用的數(shù)據(jù)庫讀者檔案實體讀者檔案實體包括編號、姓名、性別、條形碼、職業(yè)、出生日期、有效證件、證件號碼、電話、電子郵件、登記日期、操作員、類型和備注等屬性。讀者檔案實體的實體圖如圖15-4所示。圖15-4讀者檔案實體圖讀者檔案實體借閱檔案實體借閱檔案實體包括編號、讀者編號、圖書編號、借書時間、應(yīng)還時間、操作員和是否歸還等屬性。借閱檔案實體的實體圖如圖15-5所示。圖15-5借閱檔案實體圖借閱檔案實體歸還檔案實體歸還檔案實體包括編號、讀者編號、圖書編號、歸還時間和操作員等屬性。借閱檔案實體的實體圖如圖15-6所示。圖15-6歸還檔案實體圖歸還檔案實體結(jié)合實際情況及對用戶需求的分析,圖書館管理系統(tǒng)的db_library數(shù)據(jù)庫中需要創(chuàng)建如圖15-7所示的12張數(shù)據(jù)表。圖15-7db_library數(shù)據(jù)庫所包含的數(shù)據(jù)表15.4.2數(shù)據(jù)表設(shè)計結(jié)合實際情況及對用戶需求的分析,圖書館管理系統(tǒng)的db_lib下面將給出這些數(shù)據(jù)表的結(jié)構(gòu)及說明。tb_manager(管理員信息表)管理員信息表主要用來保存管理員信息。表tb_manager的結(jié)構(gòu)如表15-1所示。表15-1 表tb_manager的結(jié)構(gòu)及說明字段名數(shù)據(jù)類型是否為空是否主鍵默認值描述idINT(10)UnsignedNoYesID(自動編號)nameVARCHAR(30)YesNULL管理員名稱pwdVARCHAR(30)YesNULL密碼下面將給出這些數(shù)據(jù)表的結(jié)構(gòu)及說明。字段名數(shù)據(jù)類tb_purview(權(quán)限表)權(quán)限表主要用來保存管理員的權(quán)限信息,該表中的id字段與管理員信息表(tb_manager)中的id字段相關(guān)聯(lián)。表tb_purview的結(jié)構(gòu)如表15-2所示。表15-2 表tb_purview的結(jié)構(gòu)及說明字段名數(shù)據(jù)類型是否為空是否主鍵默認值描述idINT(11)NoYes0管理員ID號syssetTINYINT(1)Yes0系統(tǒng)設(shè)置readersetTINYINT(1)Yes0讀者管理booksetTINYINT(1)Yes0圖書管理borrowbackTINYINT(1)Yes0圖書借還sysqueryTINYINT(1)Yes0系統(tǒng)查詢tb_purview(權(quán)限表)字段名數(shù)據(jù)類型是tb_bookinfo(圖書信息表)圖書信息表主要用來保存圖書信息。表tb_bookinfo的結(jié)構(gòu)如表15-3所示。表15-3 表tb_bookinfo的結(jié)構(gòu)及說明字段名數(shù)據(jù)類型是否為空是否主鍵默認值描述barcodeVARCHAR(30)YesNULL條形碼booknameVARCHAR(70)YesNULL書名typeidINT(10)unsignedYesNULL類型authorVARCHAR(30)YesNULL作者translatorVARCHAR(30)YesNULL譯者ISBNVARCHAR(20)YesNULL出版社priceFLOAT(8,2)YesNULL價格pageINT(10)UnsignedYesNULL頁碼bookcaseINT(10)UnsignedYesNULL書架inTimeDATEYesNULL錄入時間operatorVARCHAR(30)YesNULL操作員TINYINT(1)Yes0是否刪除idINT(11)NoYesID(自動編號)tb_bookinfo(圖書信息表)字段名數(shù)據(jù)類tb_parameter(參數(shù)設(shè)置表)參數(shù)設(shè)置表主要用來保存辦證費及書證的有效期限等信息。表tb_parameter的結(jié)構(gòu)如表15-4所示。表15-4 表tb_parameter的結(jié)構(gòu)及說明字段名數(shù)據(jù)類型是否為空是否主鍵默認值描述idINT(10)UnsignedNoYesID(自動編號)costINT(10)UnsignedYesNULL辦證費validityINT(10)UnsignedYesNULL有效期限tb_parameter(參數(shù)設(shè)置表)字段名數(shù)據(jù)tb_booktype(圖書類型表)圖書類型表主要用來保存圖書類型信息。表tb_booktype的結(jié)構(gòu)如表15-5所示。表15-5 表tb_booktype的結(jié)構(gòu)及說明字段名數(shù)據(jù)類型是否為空是否主鍵默認值描述idINT(10)UnsignedNoYesID(自動編號)typenameVARCHAR(30)YesNULL類型名稱daysINT(10)UnsignedYesNULL可借天數(shù)tb_booktype(圖書類型表)字段名數(shù)據(jù)類tb_bookcase(書架信息表)書架信息表主要用來保存書架信息。表tb_bookcase的結(jié)構(gòu)如表15-6所示。表15-6 表tb_bookcase的結(jié)構(gòu)及說明字段名數(shù)據(jù)類型是否為空是否主鍵默認值描述idINT(10)UnsignedNoYesID(自動編號)nameVARCHAR(30)YesNULL書架名稱tb_bookcase(書架信息表)字段名數(shù)據(jù)類tb_borrow(圖書借閱信息表)圖書借閱信息表主要用來保存圖書借閱信息。表tb_borrow的結(jié)構(gòu)如表15-7所示。表15-7 表tb_borrow的結(jié)構(gòu)及說明字段名數(shù)據(jù)類型是否為空是否主鍵默認值描述idINT(10)UnsignedNoYesID(自動編號)readeridINT(10)UnsignedYesNULL讀者編號bookidINT(10)YesNULL圖書編號borrowTimeDATEYesNULL借書時間backtimeDATEYesNULL應(yīng)還時間operatorVARCHAR(30)YesNULL操作員ifbackTINYTIN(1)Yes0是否歸還tb_borrow(圖書借閱信息表)字段名數(shù)據(jù)類tb_giveback(圖書歸還信息表)圖書歸還信息表主要用來保存圖書歸還信息。表tb_giveback的結(jié)構(gòu)如表15-8所示。表15-8 表tb_giveback的結(jié)構(gòu)及說明字段名數(shù)據(jù)類型是否為空是否主鍵默認值描述idINT(10)UnsignedNoYesID(自動編號)readeridINT(11)YesNULL讀者編號bookidINT(11)YesNULL圖書編號backTimeDATEYesNULL歸還時間operatorVARCHAR(30)YesNULL操作員tb_giveback(圖書歸還信息表)字段名數(shù)據(jù)tb_readertype(讀者類型信息表)讀者類型信息表主要用來保存讀者類型信息。表tb_readertype的結(jié)構(gòu)如表15-9所示。表15-9 表tb_readertype的結(jié)構(gòu)及說明字段名數(shù)據(jù)類型是否為空是否主鍵默認值描述idINT(10)UnsignedNoYesID(自動編號)nameVARCHAR(50)YesNULL名稱numberINT(4)YesNULL可借數(shù)量tb_readertype(讀者類型信息表)字段名數(shù)tb_reader(讀者信息表)讀者信息表主要用來保存讀者信息。表tb_reader的結(jié)構(gòu)如表15-10所示。表15-10 表tb_reader的結(jié)構(gòu)及說明字段名數(shù)據(jù)類型是否為空是否主鍵默認值描述idINT(10)UnsignedNoYesID(自動編號)nameVARCHAR(20)YesNULL姓名sexVARCHAR(4)YesNULL性別barcodeVARCHAR(30)YesNULL條形碼vocationVARCHAR(50)YesNULL職業(yè)birthdayDATEYesNULL出生日期paperTypeVARCHAR(10)YesNULL有效證件paperNOVARCHAR(20)YesNULL證件號碼telVARCHAR(20)YesNULL電話emailVARCHAR(100)YesNULL電子郵件createDateDATEYesNULL登記日期operatorVARCHAR(30)YesNULL操作員remarkTEXTYesNULL備注typeidINT(11)YesNULL類型tb_reader(讀者信息表)字段名數(shù)據(jù)類型tb_library(圖書館信息表)圖書館信息表主要用來保存圖書館信息。表tb_library的結(jié)構(gòu)如表15-11所示。表15-11 表tb_library的結(jié)構(gòu)及說明字段名數(shù)據(jù)類型是否為空是否主鍵默認值描述idINT(10)UnsignedNoYesID(自動編號)librarynameVARCHAR(50)YesNULL圖書館名稱curatorVARCHAR(10)YesNULL館長telVARCHAR(20)YesNULL聯(lián)系電話addressVARCHAR(100)YesNULL聯(lián)系地址emailVARCHAR(100)YesNULL聯(lián)系郵箱urlVARCHAR(100)YesNULL圖書館網(wǎng)址createDateDATEYesNULL建館時間introduceTEXTYesNULL圖書館簡介tb_library(圖書館信息表)字段名數(shù)據(jù)類tb_publishing(出版社信息表)出版社信息表主要用來保存出版社信息。表tb_publishing的結(jié)構(gòu)如表15-12所示。表15-12 表tb_publishing的結(jié)構(gòu)及說明字段名數(shù)據(jù)類型是否為空是否主鍵默認值描述ISBNVARCHAR(20)NoYesISBN號pubnameVARCHAR(30)YesNULL出版社名稱tb_publishing(出版社信息表)字段名數(shù)15.5實現(xiàn)過程15.5.1系統(tǒng)登錄設(shè)計15.5.2主界面設(shè)計15.5.3圖書借閱設(shè)計15.5.4圖書續(xù)借設(shè)計15.5.5圖書歸還設(shè)計15.5實現(xiàn)過程15.5.1系統(tǒng)登錄設(shè)計系統(tǒng)登錄是進入圖書館管理系統(tǒng)的入口。在運行本系統(tǒng)后,首先進入的是系統(tǒng)登錄頁面,在該頁面中,系統(tǒng)管理員可以通過輸入正確的管理員名稱和密碼登錄到系統(tǒng),當(dāng)用戶未輸入管理員名稱或密碼時,系統(tǒng)會通過JavaScript進行判斷,并給予提示信息。系統(tǒng)登錄的運行結(jié)果如圖15-8所示。圖15-8系統(tǒng)登錄的設(shè)計結(jié)果15.5.1系統(tǒng)登錄設(shè)計系統(tǒng)登錄是進入圖書館管理系統(tǒng)的入口。在運行本系統(tǒng)后,1.界面設(shè)計系統(tǒng)登錄頁面主要用于收集管理員的輸入信息及通過自定義的JavaScript函數(shù)驗證輸入信息是否為空,該頁面中所涉及到的表單元素如表15-13所示。表15-13 系統(tǒng)登錄頁面所涉及的表單元素名稱元素類型重要屬性含義form1formmethod="post"action="manager?action=login"管理員登錄表單nametextsize="25"管理員名稱pwdpasswordsize="25"管理員密碼Submitsubmitvalue="確定"onclick="returncheck(form1)"“確定”按鈕Submit3resetvalue="重置"“重置”按鈕Submit2buttonvalue="關(guān)閉"onClick="window.close();"“關(guān)閉”按鈕1.界面設(shè)計名稱元素類型重要屬性含編寫自定義的JavaScript函數(shù),用于判斷管理員名稱和密碼是否為空。代碼如下:<scriptlanguage="javascript">functioncheck(form){ if(.value==""){ //判斷管理員名稱是否為空 alert("請輸入管理員名稱!");.focus();returnfalse; } if(form.pwd.value==""){ //判斷密碼是否為空 alert("請輸入密碼!");form.pwd.focus();returnfalse; } }</script>編寫自定義的JavaScript函數(shù),用于判斷管理員名稱和密2.關(guān)鍵代碼在實現(xiàn)系統(tǒng)登錄時,主要是如何在Servlet中獲取提交的登錄信息,以及驗證輸入的管理員信息是否合法,如果合法則將將頁面重定向到系統(tǒng)主界面,否則給出提示信息。這時將涉及到以下兩個方法。//在Servlet中編寫的方法,用于獲取提交的登錄信息,以及調(diào)用DAO方法驗證登錄信息,//并根據(jù)驗證結(jié)果做出相應(yīng)的處理publicvoidmanagerLogin(HttpServletRequestrequest, HttpServletResponseresponse)throwsServletException,IOException{ ManagerFormmanagerForm=newManagerForm();//實例化managerForm類 managerForm.setName(request.getParameter("name"));//獲取管理員名稱并設(shè)置name屬性 managerForm.setPwd(request.getParameter("pwd"));//獲取管理員密碼并設(shè)置pwd屬性 //調(diào)用ManagerDAO類的checkManager()方法 intret=managerDAO.checkManager(managerForm); if(ret==1){ /**********將登錄到系統(tǒng)的管理員名稱保存到session中***************************/HttpSessionsession=request.getSession();session.setAttribute("manager",managerForm.getName());/***********************************************************************/ //轉(zhuǎn)到系統(tǒng)主界面 request.getRequestDispatcher("main.jsp").forward(request,response); }else{ request.setAttribute("error","您輸入的管理員名稱或密碼錯誤!"); request.getRequestDispatcher("error.jsp") .forward(request,response);//轉(zhuǎn)到錯誤提示頁 }}2.關(guān)鍵代碼publicintcheckManager(ManagerFormmanagerForm){ intflag=0; //標(biāo)記變量,值為0時表示不成功,值為1時表示成功 //連接SQL語句,并過濾管理員名稱中的危險字符 Stringsql="SELECT*FROMtb_managerwherename='" +ChStr.filterStr(managerForm.getName())+"'"; ResultSetrs=conn.executeQuery(sql); try{ if(rs.next()){ //獲取輸入的密碼并過濾輸入字符串中的危險字符 Stringpwd=ChStr.filterStr(managerForm.getPwd()); if(pwd.equals(rs.getString(3))){ flag=1; //表示驗證成功 }else{ flag=0; //表示驗證不成功 } }else{ flag=0; //表示驗證不成功 } }catch(SQLExceptionex){ flag=0; //表示驗證不成功 }finally{ conn.close(); //關(guān)閉數(shù)據(jù)庫連接 } returnflag;}publicintcheckManager(Manage在實現(xiàn)系統(tǒng)登錄時,從網(wǎng)站安全的角度考慮,僅僅上面介紹的系統(tǒng)登錄頁面并不能有效的保存系統(tǒng)的安全,一旦系統(tǒng)主界面的地址被他人獲得,就可以通過在地址欄中輸入系統(tǒng)的主界面地址而直接進入到系統(tǒng)中。這時,我們可以在每個頁面的頂端添加以下驗證用戶是否登錄的代碼。<%Stringmanager=(String)session.getAttribute("manager");if(manager==null||"".equals(manager)){ //驗證用戶是否登錄 response.sendRedirect("login.jsp"); //重定向網(wǎng)頁到login.jsp頁}%>這樣,當(dāng)系統(tǒng)調(diào)用每個頁面時,都會判斷session變量manager是否存在,如果不存在,將頁面重定向到系統(tǒng)登錄頁面。在實現(xiàn)系統(tǒng)登錄時,從網(wǎng)站安全的角度考慮,僅僅上面介紹管理員通過“系統(tǒng)登錄”模塊的驗證后,可以登錄到圖書館管理系統(tǒng)的主界面。系統(tǒng)主界面主要包括Banner信息欄、導(dǎo)航欄、排行榜和版權(quán)信息4部分。其中,導(dǎo)航欄中的功能菜單將根據(jù)登錄管理員的權(quán)限進行顯示。例如,系統(tǒng)管理員mr登錄后,將擁有整個系統(tǒng)的全部功能,因為它是超級管理員。主界面的設(shè)計效果如圖15-9所示。圖15-9主界面的設(shè)計效果15.5.2主界面設(shè)計管理員通過“系統(tǒng)登錄”模塊的驗證后,可以登錄到圖書館
1.界面設(shè)計在如圖15-9所示的主界面中,Banner信息欄、導(dǎo)航欄和版權(quán)信息,并不是僅存在于主界面中,其他功能模塊的子界面中也需要包括這些部分。因此,可以將這幾個部分分別保存在單獨的文件中,這樣,在需要放置相應(yīng)功能時只需包含這些文件即可,主界面的布局如圖15-10所示。圖15-10主界面的布局1.界面設(shè)計應(yīng)用<%@include%>指令包含文件的方法進行主界面布局的代碼如下:<%@includefile="banner.jsp"%><%@includefile="navigation.jsp"%><section><divstyle="text-align:right;padding-right:10px;height:30px;"class="word_orange">當(dāng)前位置:首頁>>> </div><divstyle="height:57px;clear:both"><!--顯示圖書借閱排行榜--><imgsrc="Images/main_booksort.gif"height="57px"></div><divstyle="height:300px;padding-left:20px;">… <!--此處省略了顯示圖書借閱排行的代碼--></div></section><%@includefile="copyright.jsp"%>在上面的代碼中,第一行的代碼,用于應(yīng)用<%@include%>指令包含banner.jsp文件,該文件用于顯示Banner信息及當(dāng)前登錄管理員;第二行的代碼,用于應(yīng)用<%@include%>指令包含navigation.jsp文件,該文件用于顯示當(dāng)前系統(tǒng)時間及系統(tǒng)導(dǎo)航菜單;最后一行的代碼,用于應(yīng)用<%@include%>指令包含copyright.jsp文件,該文件用于顯示版權(quán)信息。應(yīng)用<%@include%>指令包含文件的方法進行主界面2.關(guān)鍵代碼在實現(xiàn)主界面時,需要顯示圖書借閱排行榜,所以需要編寫DAO方法從數(shù)據(jù)庫中統(tǒng)計出借閱排行數(shù)據(jù),并保存到Collection集合中。從數(shù)據(jù)庫中統(tǒng)計借閱排行數(shù)據(jù)的關(guān)鍵代碼如下:publicCollection<BorrowForm>bookBorrowSort(){Stringsql="select*from(SELECTbookid,count(bookid)asdegreeFROM"+ "tb_borrowgroupbybookid)asborrjoin(selectb.*,asbookcaseName"+ ",p.pubname,t.typenamefromtb_bookinfobleftjointb_bookcase"+ "conb.bookcase=c.idjointb_publishingponb.ISBN=p.ISBNjoin"+ "tb_booktypetonb.typeid=t.idwhereb.del=0)"+ "asbookonborr.bookid=book.idorderbyborr.degreedesclimit10";Collection<BorrowForm>coll=newArrayList<>(); //創(chuàng)建并實例化Collection對象BorrowFormform=null; //聲明BorrowForm對象ResultSetrs=conn.executeQuery(sql); //執(zhí)行查詢語句try{while(rs.next()){form=newBorrowForm(); //實例化BorrowForm對象form.setBookId(rs.getInt(1)); //獲取圖書IDform.setDegree(rs.getInt(2)); //獲取借閱次數(shù)form.setBookBarcode(rs.getString(3)); //獲取圖書條形碼form.setBookName(rs.getString(4)); //獲取圖書名稱form.setAuthor(rs.getString(6)); //獲取作者form.setPrice(Float.valueOf(rs.getString(9))); //獲取定價form.setBookcaseName(rs.getString(16)); //獲取書架名稱form.setPubName(rs.getString(17)); //獲取出版社form.setBookType(rs.getString(18)); //獲取圖書類型coll.add(form); //保存到Collection集合中}2.關(guān)鍵代碼管理員登錄后,選擇“圖書借還/圖書借閱”命令,進入到圖書借閱頁面,在該頁面中的“讀者條形碼”文本框中輸入讀者的條形碼(如:20120224000001)后,單擊“確定”按鈕,系統(tǒng)會自動檢索出該讀者的基本信息和未歸還的借閱圖書信息。如果找到對應(yīng)的讀者信息,就將其顯示在頁面中,此時輸入圖書的條形碼或圖書名稱后,單擊“確定”按鈕,借閱指定的圖書,圖書借閱頁面的運行結(jié)果如圖15-11所示。圖15-11圖書借閱頁面15.5.3圖書借閱設(shè)計管理員登錄后,選擇“圖書借還/圖書借閱”命令,進入到1.界面設(shè)計圖書借閱頁面總體上可以分為兩個部分:一部分用于查詢并顯示讀者信息;另一部分用于顯示讀者的借閱信息和添加讀者借閱信息。圖書借閱頁面在Dreamweaver中的設(shè)計效果如圖15-12所示圖15-12在Dreamweaver中圖書借閱頁面的設(shè)計效果1.界面設(shè)計由于系統(tǒng)要求一個讀者只能同時借閱一定數(shù)量的圖書,并且該數(shù)量由讀者類型表tb_readerType中的可借數(shù)量number決定,所以這里編寫了自定義的JavaScript函數(shù)checkbook(),用于判斷當(dāng)前選擇的讀者是否還可以借閱新的圖書,同時該函數(shù)還具有判斷是否輸入圖書條形碼或圖書名稱的功能,代碼如下:<scripttype="text/javascript">functioncheckbook(form){ if(form.barcode.value==""){ //判斷是否輸入讀者條形碼 alert("請輸入讀者條形碼!");form.barcode.focus();return; } if(form.inputkey.value==""){ //判斷查詢關(guān)鍵字是否為空 alert("請輸入查詢關(guān)鍵字!");form.inputkey.focus();return; } if(form.number.value-form.borrowNumber.value<=0){ //判斷是否可以再借閱其他圖書 alert("您不能再借閱其他圖書了!");return; } form.submit(); //提交表單}</script>說明:在JavaScript中比較兩個數(shù)值型文本框的值時,不使用運算符“==”,而是將這兩個值相減,再判斷其結(jié)果。由于系統(tǒng)要求一個讀者只能同時借閱一定數(shù)量的圖書,并且2.關(guān)鍵代碼在實現(xiàn)圖書借閱時,需要編寫Servlet方法,用于實現(xiàn)圖書借閱。實現(xiàn)圖書借閱的方法bookborrow()的具體代碼如下://編寫Servlet方法,實現(xiàn)圖書借閱privatevoidbookborrow(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{
//查詢讀者信息
readerForm.setBarcode(request.getParameter("barcode")); //獲取讀者條形碼 //根據(jù)讀者條形碼獲取讀者信息
ReaderFormreader=(ReaderForm)readerDAO.queryM(readerForm);request.setAttribute("readerinfo",reader); //保存讀者信息到request中//查詢讀者的借閱信息request.setAttribute("borrowinfo",borrowDAO.borrowinfo(request.getParameter("barcode"))); //完成借閱Stringf=request.getParameter("f"); //獲取查詢條件Stringkey=request.getParameter("inputkey"); //獲取輸入的關(guān)鍵字if(key!=null&&!key.equals("")){ //判斷是否有符合條件的圖書Stringoperator=request.getParameter("operator");BookFormbookForm=bookDAO.queryB(f,key); //根據(jù)查詢條件獲取圖書信息if(bookForm!=null){intret=borrowDAO.insertBorrow(reader,bookDAO.queryB(f,key),operator); //保存圖書借閱信息if(ret==1){request.setAttribute("bar",request.getParameter("barcode"));request.getRequestDispatcher("bookBorrow_ok.jsp").forward(request,response);2.關(guān)鍵代碼
}else{ //保存提示信息到request中request.setAttribute("error","添加借閱信息失敗!"); //轉(zhuǎn)到錯誤提示頁request.getRequestDispatcher("error.jsp").forward(request,response);}}else{request.setAttribute("error","沒有該圖書!"); //保存提示信息到request中 //轉(zhuǎn)到錯誤提示頁request.getRequestDispatcher("error.jsp").forward(request,response);}}else{ request.getRequestDispatcher("bookBorrow.jsp").forward(request,response);}}}else{在實現(xiàn)圖書借閱的方法中,還需要調(diào)用ReaderDAO類的queryM()方法、BorrowDAO類的borrowinfo()方法、BookDAO類的queryB()方法和BorrowDAO類的insertBorrow()方法,具體代碼如下://ReaderDAO類的queryM()方法,用于查詢讀者信息publicReaderFormqueryM(ReaderFormreaderForm){ ReaderFormreaderForm1=null; Stringsql=""; if(readerForm.getId()!=null){ //根據(jù)讀者ID查詢讀者信息 sql="selectr.*,astypename,t.numberfromtb_readerrleftjointb_readerTypetonr.typeid=t.idwherer.id="+readerForm.getId()+""; }elseif(readerForm.getBarcode()!=null){//根據(jù)讀者條形碼查詢讀者信息 sql="selectr.*,astypename,t.numberfromtb_readerrleftjointb_readerTypetonr.typeid=t.idwherer.barcode="+readerForm.getBarcode()+""; } ResultSetrs=conn.executeQuery(sql); //執(zhí)行查詢語句 Stringbirthday=""; try{在實現(xiàn)圖書借閱的方法中,還需要調(diào)用ReaderDAOwhile(rs.next()){ readerForm1=newReaderForm(); readerForm1.setId(Integer.valueOf(rs.getString(1))); //獲取讀者ID readerForm1.setName(rs.getString(2)); //獲取讀者姓名 readerForm1.setSex(rs.getString(3)); //獲取讀者性別 readerForm1.setBarcode(rs.getString(4)); //獲取讀者條形碼 readerForm1.setVocation(rs.getString(5)); //獲取職業(yè) birthday=rs.getString(6); //獲取生日 readerForm1.setBirthday(birthday==null?"":birthday); readerForm1.setPaperType(rs.getString(7)); //獲取證件類型 readerForm1.setPaperNO(rs.getString(8)); //獲取證件號碼 readerForm1.setTel(rs.getString(9));//獲取聯(lián)系電話 readerForm1.setEmail(rs.getString(10));//獲取E-mail地址 readerForm1.setCreateDate(rs.getString(11));//獲取創(chuàng)建日期 readerForm1.setOperator(rs.getString(12)); //獲取操作員 readerForm1.setRemark(rs.getString(13));//獲取備注 readerForm1.setTypeid(rs.getInt(14));//獲取讀者類型ID readerForm1.setTypename(rs.getString(15)); //獲取讀者類型名稱 readerForm1.setNumber(rs.getInt(16)); //獲取可借數(shù)量}catch(SQLExceptionex){ } conn.close();//關(guān)閉數(shù)據(jù)庫連接 returnreaderForm1;}//BorrowDAO類的borrowinfo()方法,用于查詢借閱信息while(rs.next()){publicCollection<BorrowForm>borrowinfo(Stringstr){Stringsql="selectborr.*,book.bookname,book.price,pub.pubname,"+ "bookcasename,r.barcodefrom(select*fromtb_borrow"+ "whereifback=0)asborrleftjointb_bookinfobookonborr.bookid"+ "=book.idjointb_publishingpubonbook.isbn=pub.isbnjoin"+ "tb_bookcasebsonbook.bookcase=bs.idjointb_readerron"+ "borr.readerid=r.idwherer.barcode='"+str+"'";ResultSetrs=conn.executeQuery(sql);//執(zhí)行查詢語句Collection<BorrowForm>coll=newArrayList<>();BorrowFormform=null;try{while(rs.next()){form=newBorrowForm();form.setId(Integer.valueOf(rs.getInt(1))); //獲取ID號form.setBorrowTime(rs.getString(4)); //獲取借閱時間form.setBackTime(rs.getString(5)); //獲取歸還時間form.setBookName(rs.getString(8)); //獲取圖書名稱form.setPrice(Float.valueOf(rs.getFloat(9))); //獲取定價form.setPubName(rs.getString(10)); //獲取出版社form.setBookcaseName(rs.getString(11)); //獲取書價名稱coll.add(form); //添加借閱信息到Collection集合中}publicCollection<BorrowForm>catch(SQLExceptionex){System.out.println("借閱信息:"+ex.getMessage()); //輸出異常信息}conn.close(); //關(guān)閉數(shù)據(jù)庫連接returncoll;}//BookDAO類的queryB()方法,用于查詢圖書信息publicBookFormqueryB(Stringf,Stringkey){BookFormbookForm=null;Stringsql="selectb.*,asbookcaseName,p.pubnameaspublishing,t.typename"+ "fromtb_bookinfobleftjointb_bookcaseconb.bookcase=c.idjoin"+ "tb_publishingponb.ISBN=p.ISBNjointb_booktypeton"+ "b.typeid=t.idwhereb."+f+"='"+key+"'"; //查詢圖書信息的SQL語句ResultSetrs=conn.executeQuery(sql); //執(zhí)行查詢語句try{if(rs.next()){bookForm=newBookForm();bookForm.setBarcode(rs.getString(1)); //獲取圖書條形碼bookForm.setBookName(rs.getString(2)); //獲取圖書名稱bookForm.setTypeId(rs.getInt(3)); //獲取圖書類型IDcatch(SQLExceptionex){bookForm.setAuthor(rs.getString(4)); //獲取作者bookForm.setTranslator(rs.getString(5)); //獲取譯者bookForm.setIsbn(rs.getString(6)); //獲取圖書的ISBN號bookForm.setPrice(Float.valueOf(rs.getString(7)));//此處必須進行類型轉(zhuǎn)換bookForm.setPage(rs.getInt(8)); //獲取頁碼bookForm.setBookcaseid(rs.getInt(9)); //獲取書架IDbookForm.setInTime(rs.getString(10)); //獲取入庫時間bookForm.setOperator(rs.getString(11)); //獲取操作員bookForm.setDel(rs.getInt(12)); //獲取是否刪除bookForm.setId(Integer.valueOf(rs.getString(13)));//獲取圖書ID號bookForm.setBookcaseName(rs.getString(14)); //獲取書架名稱bookForm.setPublishing(rs.getString(15)); //獲取出版社bookForm.setTypeName(rs.getString(16)); //獲取類型名稱}}catch(SQLExceptionex){}conn.close(); //關(guān)閉數(shù)據(jù)庫連接returnbookForm;}//BorrowDAO類的insertBorrow()方法,用于保存圖書借閱信息bookForm.setAuthor(rs.getStripublicintinsertBorrow(ReaderFormreaderForm,BookFormbookForm, Stringoperator){ Stringsql1="selectt.daysfromtb_bookinfobleftjointb_booktypeton" +"b.typeid=t.idwhereb.id="+bookForm.getId()+"";//獲取可借天數(shù)的SQL語句 ResultSetrs=conn.executeQuery(sql1); //執(zhí)行SQL語句 intdays=0; try{ if(rs.next()){ days=rs.getInt(1); //獲取可借天數(shù) } }catch(SQLExceptionex){ } //計算歸還時間 Calendarcalendar=Calendar.getInstance(); //獲取系統(tǒng)日期 SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-dd"); java.sql.Datedate=java.sql.Date.valueOf(format.format(calendar .getTime()));//借書日期 calendar.add(calendar.DAY_OF_YEAR,days); //加上可借天數(shù) java.sql.DatebackTime=java.sql.Date.valueOf(format.format(calendar .getTime()));//歸還日期 Stringsql="Insertintotb_borrow(readerid,bookid,borrowTime,backTime,"+"operator)values("+readerForm.getId()+","+bookForm.getId() +",'"+date+"','"+backTime+"','"+operator+"')"; intfalg=conn.executeUpdate(sql); //執(zhí)行更新語句conn.close(); //關(guān)閉數(shù)據(jù)庫連接 returnfalg;publicintinsertBorrow(Reader管理員登錄后,選擇“圖書借還”/“圖書續(xù)借”命令,進入到圖書續(xù)借頁面,在該頁面中的“讀者條形碼”文本框中輸入讀者的條形碼(如20120224000001)后,單擊“確定”按鈕,系統(tǒng)會自動檢索出該讀者的基本信息和未歸還的借閱圖書信息。如果找到對應(yīng)的讀者信息,則將其顯示在頁面中,此時單擊“續(xù)借”超鏈接,即可續(xù)借指定圖書(即將該圖書的歸還時間延長到指定日期,該日期由續(xù)借日期加上該書的可借天數(shù)計算得出)。圖書續(xù)借頁面的運行結(jié)果如圖15-13所示。圖15-13圖書續(xù)借頁面15.5.4圖書續(xù)借設(shè)計管理員登錄后,選擇“圖書借還”/“圖書續(xù)借”命令,進1.界面設(shè)計圖書續(xù)借頁面的設(shè)計方法同圖書借閱頁面類似,所不同的是,在圖書續(xù)借頁面中沒有添加借閱圖書的功能,而是添加了“續(xù)借”超鏈接。圖書續(xù)借頁面在Dreamweaver中的設(shè)計效果如圖15-14所示。圖15-14在Dreamweaver中的圖書續(xù)借頁面的設(shè)計效果在單擊“續(xù)借”超鏈接時,還需要將讀者條形碼和借閱ID號一起傳遞到圖書續(xù)借的Servlet控制類中,代碼如下:<ahref="borrow?action=bookrenew&barcode=<%=barcode%>&id=<%=id%>">續(xù)借</a>1.界面設(shè)計2.關(guān)鍵代碼實現(xiàn)圖書續(xù)借功能與圖書借閱類似,所不同的是實現(xiàn)圖書續(xù)借的方法bookrenew()和保存圖書續(xù)借信息的方法renew()。這兩個方法的關(guān)鍵代碼如下://圖書續(xù)借的方法bookrenew()privatevoidbookrenew(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{//查詢讀者信息readerForm.setBarcode(request.getParameter("barcode")); //獲取讀者條形碼 //根據(jù)讀者條形碼查詢讀者信息ReaderFormreader=(ReaderForm)readerDAO.queryM(readerForm); request.setAttribute("readerinfo",reader);//查詢讀者的借閱信息request.setAttribute("borrowinfo",borrowDAO.borrowinfo(request.getParameter("barcode")));if(request.getParameter("id")!=null){intid=Integer.parseInt(request.getParameter("id"));if(id>0){ //執(zhí)行繼借操作intret=borrowDAO.renew(id);if(ret==0){request.setAttribute("error","圖書繼借失敗!");request.getRequestDispatcher("error.jsp").forward(request,response);}else{2.關(guān)鍵代碼request.setAttribute("bar",request.getParameter("barcode"));request.getRequestDispatcher("bookRenew_ok.jsp").forward(request,response);}}}else{ request.getRequestDispatcher(“bookRenew.jsp”).forward(request,response);//保存圖書續(xù)借信息的方法renew()publicintrenew(intid){//根據(jù)借閱ID查詢圖書ID的SQL語句Stringsql0="SELECTbookidFROMtb_borrowWHEREid="+id+""; ResultSetrs1=conn.executeQuery(sql0); //執(zhí)行查詢語句intflag=0;try{if(rs1.next()){ //獲取可借天數(shù)Stringsql1="selectt.daysfromtb_bookinfobleftjoin"+ "tb_booktypetonb.typeid=t.idwhereb.id=" +rs1.getInt(1)+""; //獲取可借天數(shù)的SQL語句ResultSetrs=conn.executeQuery(sql1); //執(zhí)行查詢語句intdays=0;try{if(rs.next()){days=rs.getInt(1); //獲取可借天數(shù)}}catch(SQLExceptionex){//計算歸還時間request.setAttribute("bar",rCalendarcalendar=Calendar.getInstance(); //獲取系統(tǒng)日期SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-dd");//設(shè)置日期格式//借書日期java.sql.Datedate=java.sql.Date.valueOf(format.format(calendar.getTime()));calendar.add(calendar.DAY_OF_YEAR,days); //加上可借天數(shù)java.sql.DatebackTime=java.sql.Date.valueOf(format.format(calendar.getTime()));//歸還日期Stringsql="UPDATEtb_borrowSETbacktime='"+backTime+"'whereid="+id+""; //更新歸還時間完成續(xù)借flag=conn.executeUpdate(sql); //執(zhí)行更新語句}}catch(Exceptionex1){}conn.close(); //關(guān)閉數(shù)據(jù)庫連接returnflag;}Calendarcalendar=Calendar.ge管理員登錄后,選擇“圖書借還”/“圖書歸還”命令,進入到圖書歸還頁面,在該頁面中的“讀者條形碼”文本框中輸入讀者的條形碼(如:20120224000001)后,單擊“確定”按鈕,系統(tǒng)會自動檢索出該讀者的基本信息和未歸還的借閱圖書信息。如果找到對應(yīng)的讀者信息,則將其顯示在頁面中,此時單擊“歸還”超鏈接,即可將指定圖書歸還。圖書歸還頁面的運行結(jié)果如圖15-15所示圖15-15圖書歸還頁面15.5.5圖書歸還設(shè)計管理員登錄后,選擇“圖書借還”/“圖書歸還”命令,進1.界面設(shè)計圖書歸還頁面的設(shè)計方法同圖書續(xù)借頁面類似,所不同的是,將圖書續(xù)借頁面中的“續(xù)借”超鏈接轉(zhuǎn)化為“歸還”超鏈接。在單擊“歸還”超鏈接時,也需要將讀者條形碼、借閱ID號和操作員一同傳遞到圖書歸還的Servlet控制類中,代碼如下:<ahref="borrow?action=bookback&barcode=<%=barcode%>&id=<%=id%>&operator=<%=manager%>">歸還</a>2.關(guān)鍵代碼實現(xiàn)圖書歸還與實現(xiàn)圖書續(xù)借類似,所不同的是實現(xiàn)圖書歸還的方法bookback()和執(zhí)行歸還操作的方法back()。下面分別介紹這兩個方法。實現(xiàn)圖書歸還的方法bookback()實現(xiàn)圖書歸還的方法bookback()與實現(xiàn)圖書續(xù)借的方法bookrenew()基本相同,所不同的是如果從頁面中傳遞的借閱ID號大于0,則調(diào)用BorrowDAO類的back()方法執(zhí)行圖書歸還操作,并且需要獲取頁面中傳遞的操作員信息。圖書歸還的方法bookback()的關(guān)鍵代碼如下:intid=Integer.parseInt(request.getParameter("id"));Stringoperator=request.getParameter("operator"); //獲取頁面中傳遞的操作員信息if(id>0){//執(zhí)行歸還操作intret=borrowDAO.back(id,operator); //調(diào)用back()方法執(zhí)行圖書歸還操作… //此處省略了其他代碼}1.界面設(shè)計執(zhí)行歸還操作的方法back()執(zhí)行歸還操作的方法back()的具體代碼如下:publicintback(intid,Stringoperator){//根據(jù)借閱ID獲取讀者ID和圖書IDStringsql0="SELECTreaderid,bookidFROMtb_borrowWHEREid="+id+"";ResultSetrs1=conn.executeQuery(sql0); //執(zhí)行查詢語句intflag=0;try{if(rs1.next()){ Calendarcalendar=Calendar.getInstance();//獲取系統(tǒng)日期SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-dd");java.sql.Datedate=java.sql.Date.valueOf(format.format(calendar.getTime()));//還書日期intreaderid=rs1.getInt(1); //獲取讀者IDintbookid=rs1.getInt(2); //獲取圖書IDStringsql1="INSERTINTOtb_giveback(readerid,bookid,backTime"+ ",o
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度智慧農(nóng)業(yè)科技園招標(biāo)文件編制及論文創(chuàng)新研究合同4篇
- 2025年度石油設(shè)備買賣合同范本4篇
- 二零二五年度高性能地板磚研發(fā)、生產(chǎn)與銷售合作協(xié)議3篇
- 2025年水電站經(jīng)營權(quán)整體轉(zhuǎn)讓協(xié)議3篇
- 二零二五年度電梯加裝工程驗收與后期維保合同3篇
- 二零二五年度市政道路綠化帶維護合同4篇
- 2025年燃氣設(shè)備安裝與維修服務(wù)承包合同范本3篇
- 隧道襯砌施工技術(shù)方案
- 二零二五版智能辦公空間裝修與系統(tǒng)集成服務(wù)合同2篇
- 2025版鋁合金門窗智能鎖具研發(fā)與銷售合作協(xié)議4篇
- 施工現(xiàn)場水電費協(xié)議
- SH/T 3046-2024 石油化工立式圓筒形鋼制焊接儲罐設(shè)計規(guī)范(正式版)
- 2024年海口市選調(diào)生考試(行政職業(yè)能力測驗)綜合能力測試題及答案1套
- 六年級數(shù)學(xué)質(zhì)量分析及改進措施
- 一年級下冊數(shù)學(xué)口算題卡打印
- 真人cs基于信號發(fā)射的激光武器設(shè)計
- 【閱讀提升】部編版語文五年級下冊第三單元閱讀要素解析 類文閱讀課外閱讀過關(guān)(含答案)
- 四年級上冊遞等式計算練習(xí)200題及答案
- 法院后勤部門述職報告
- 2024年國信證券招聘筆試參考題庫附帶答案詳解
- 道醫(yī)館可行性報告
評論
0/150
提交評論