版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
ASP.NET圖書館管理系統(tǒng)文檔1.1開發(fā)背景伴隨現(xiàn)代圖書流通市場競爭愈演愈烈,怎樣以一個新管理方法提升圖書流通信息反饋速度、降低庫存占用、加緊資金周轉、提升工作效率,已經(jīng)成為圖書企業(yè)提升競爭力關鍵。信息技術發(fā)展給圖書企業(yè)管理帶來了新力量,經(jīng)過圖書館管理系統(tǒng)對圖書企業(yè)經(jīng)營運作全程管理,不僅使企業(yè)擺脫了人工管理所固有一系列弊端和問題,更關鍵是提升了工作效率,進而提升了企業(yè)經(jīng)濟效益。經(jīng)過管理系統(tǒng)對企業(yè)管理,為企業(yè)發(fā)展提供了大量、關鍵性數(shù)據(jù),企業(yè)依據(jù)這些數(shù)據(jù),能夠立即作出決議,進行調(diào)整,使之能夠愈加好地把握市場銷售規(guī)律,適應市場改變,在猛烈行業(yè)競爭中贏得一席之地。1.2需求分析長久以來,大家使用傳統(tǒng)人工方法管理圖書館日常業(yè)務,其操作步驟比較繁瑣。在借書時,讀者首先將要借書和借閱證交給工作人員,工作人員將每本書信息卡片和讀者借閱證放在一個小格欄里,然后在借閱證和每本書貼借閱條上填寫借閱信息。在還書時,讀者首先將要還書交給工作人員,工作人員依據(jù)圖書信息找到對應書卡和借閱證,并填寫對應還書信息。從上述描述中能夠發(fā)覺,傳統(tǒng)手工步驟存在著種種不足。首先處理借書、還書業(yè)務步驟效率很低;其次處理能力比較低,一段時間內(nèi),所能服務讀者人數(shù)只能是很有限。為此,圖書信息管理系統(tǒng)需要為企業(yè)處理上述問題,提供快速圖書信息檢索功效及快捷圖書借閱、歸還步驟。1.3系統(tǒng)設計1.3.1系統(tǒng)目標依據(jù)圖書館日常圖書管理工作需求和圖書借閱管理步驟,該系統(tǒng)實施后,應達成以下目標。●界面設計友好、美觀,數(shù)據(jù)存放安全、可靠?!窕A信息設置確保圖書信息和讀者信息分類管理?!駨姶蟛樵児πВ_保數(shù)據(jù)查詢靈活性?!駥崿F(xiàn)對圖書借閱、續(xù)借、歸還過程全程信息服務跟蹤。●設置讀者借閱和圖書借閱排行榜,為圖書館管理提供真實數(shù)據(jù)信息?!裉峁┙栝喌狡谔嵝压π?,使管理者能夠立即了解到期圖書借閱信息。●提供管理員修改自己密碼功效,確保系統(tǒng)安全性?!裉峁╈`活、方便權限設置功效,使整個系統(tǒng)管理分工明確?!癫扇∪藱C對話操作方法,方便管理員日常操作。●系統(tǒng)要最大程度地實現(xiàn)易維護性和易操作性。1.3.2業(yè)務步驟圖圖書館管理系統(tǒng)系統(tǒng)步驟圖1.1所表示。圖1.1系統(tǒng)步驟圖1.3.3系統(tǒng)功效結構依據(jù)圖書館管理系統(tǒng)特點,能夠將其分為系統(tǒng)設置、讀者管理、圖書管理、圖書借還、系統(tǒng)查詢等部分,其中各個部分及其包含具體功效模塊圖1.2所表示。圖1.2系統(tǒng)功效結構圖1.3.4系統(tǒng)預覽為使讀者對圖書館管理系統(tǒng)有初步了解,下面給出系統(tǒng)中多個頁面。系統(tǒng)登錄頁面圖1.3所表示,系統(tǒng)主頁圖1.4所表示。圖書借閱頁面圖1.5所表示,圖書歸還頁面圖1.6所表示。圖書管理頁面圖1.7所表示,圖書信息打印頁面圖1.8所表示。圖1.3系統(tǒng)登錄頁面圖1.4系統(tǒng)主頁圖1.5圖書借閱頁面圖1.6圖書歸還頁面圖1.7圖書管理頁面圖1.8圖書信息打印頁面1.3.5構建開發(fā)環(huán)境1.網(wǎng)站開發(fā)環(huán)境網(wǎng)站開發(fā)環(huán)境:MicrosoftVisualStudio集成開發(fā)環(huán)境。網(wǎng)站開發(fā)語言:ASP.NET+C#。網(wǎng)站后臺數(shù)據(jù)庫:SQLServer。開發(fā)環(huán)境運行平臺:WindowsXP(SP2)/Windows(SP4)/WindowsServer(SP1)服務器端操作系統(tǒng):WindowsServer(SP1)。Web服務器:Internet信息服務管理器。數(shù)據(jù)庫服務器:SQLServer。瀏覽器:速達。網(wǎng)站服務器運行環(huán)境:Microsoft.NETFrameworkSDKv2.0。用戶端瀏覽器:速達。分辨率:最好效果:1024x768像素。1.3.6數(shù)據(jù)庫設計本系統(tǒng)采取SQLServer數(shù)據(jù)庫,名稱為:db_tsrj,其中包含9張表。下面分別給出數(shù)據(jù)表概要說明、數(shù)據(jù)表E-R圖及關鍵數(shù)據(jù)表結構。1.數(shù)據(jù)庫概要說明從讀者角度出發(fā),為了使讀者對本系統(tǒng)數(shù)據(jù)庫中數(shù)據(jù)表有一個更清楚認識,我們設計了一個數(shù)據(jù)表樹形結構圖,圖1所表示,其中包含系統(tǒng)全部數(shù)據(jù)表。圖1.9數(shù)據(jù)庫并結構2.數(shù)據(jù)庫概要設計經(jīng)過對本系統(tǒng)需求分析、系統(tǒng)步驟設計和系統(tǒng)功效結構確實定,計劃出系統(tǒng)中使用數(shù)據(jù)庫實體對象,具體說明以下。只有系統(tǒng)分配用戶才能夠操作圖書館管理系統(tǒng),而用戶權限又各不相同。管理員權限設置信息實體E-R圖圖1.10所表示。圖1.10管理員權限設置信息實體E-R圖圖書借閱信息實體,用于存放全部圖書借閱情況信息,以正確地統(tǒng)計每本圖書借閱情況。圖書借閱信息實體E-R圖圖1.11所表示。圖書館對圖書分類,通常是將不一樣類型圖書分別放置在對應類型書架上。書架信息實體,用于存放圖書館中全部書架信息。書架信息實體ER圖圖1.12所表示。圖1.11圖書借閱信息實體E-R圖圖1.12書架信息實體E-R圖不一樣書,會有不一樣圖書信息。對這些信息進行具體統(tǒng)計,方便了圖書分類和查詢。圖書信息實體,用于存放全部圖書相關信息。圖書信息實體E-R圖圖1.13所表示。圖1.13圖書信息實體E-R圖圖書館中會有不一樣類型圖書,為了避免圖書歸類發(fā)生混亂,必需建立一個圖書類型信息實體,用于存放圖書類型信息。圖書類型信息實體E-R圖圖1.14所表示。圖1.14圖書類型信息實體E-R圖每個事物全部會有其本身歷史背景,圖書館也不例外。為了統(tǒng)計圖書館歷史背景及其相關信息,需要建立一個圖書館信息實體,用于存放和圖書館相關信息。圖書館信息實體E-R圖圖1.15所表示。圖1.15圖書館信息實體E-R圖當有讀者借閱圖書時,要對讀者各項信息進行統(tǒng)計,以方便歸還圖書和已借閱圖書歷史查詢。讀者信息實體,用于存放全部借閱圖書讀者信息。讀者信息實體E-R圖圖1.16所表示。圖1.16讀者信息實體E-R圖在讀者群體中,會有不一樣分類,比如借閱圖書讀者可能是老師、學生和一般市民等,所以對讀者人群進行有效分類是至關關鍵。讀者類型信息實體,用于存放讀者類型信息。讀者類型信息實體E-R圖圖1.17所表示。圖1.17讀者類型信息實體E-R圖當管理員登錄圖書館管理系統(tǒng)時,需要經(jīng)過登錄窗口驗證成功后才能進入系統(tǒng)主頁。管理員信息實體,用于存放管理員登錄名稱和登錄密碼。管理員信息信息實體E-R圖圖1.18所表示。圖1.18管理員信息信息實體E-R圖數(shù)據(jù)庫邏輯結構設計在設計完數(shù)據(jù)庫實體E-R圖以后,需要依據(jù)實體E-R圖設計數(shù)據(jù)表結構。下面給出關鍵數(shù)據(jù)表數(shù)據(jù)結構和用途?!駎b_admSet(管理員權限設置表)。表tb_admSet用于保留和管理員設置相關信息,該表結構如表1.1所表示。表1.1管理員權限設置表字段名數(shù)據(jù)類型長度是否關鍵描述userNamevarchar80否管理員名稱systemSetbit1否系統(tǒng)設置readerManagebit1否讀者管理bookManagebit1否圖書管理bookBorrowbit1否圖書借還systemSearchbit1否系統(tǒng)查詢●tb_bookBorrow(圖書借閱表)。表tb_bookBorrow用于保留全部已借閱圖書信息,該表結構如表1.2所表示。表1.2圖書借閱表字段名數(shù)據(jù)類型長度是否主鍵描述bookBarcodevarchar50否圖書條形碼bookNamevarchar20否圖書名稱borrowTimedatetime8否借閱日期returnTimedatetime8否應還日期readerBarCodevarchar50否讀者條形碼readerTimevarchar20否讀者姓名isReturnbit1否是否歸還●tb_bookcase(書架信息表)。表tb_bookcase用于保留書架具體信息,該表結構如表1.3所表示。字段名數(shù)據(jù)類型長度是否主鍵描述bookcaseIDint4是書架編號bookcaseNamevarchar80否書架名稱●tb_bookInfo(圖書信息表)。表tb_bookInfo用于保留和圖書相關全部信息,該表結構如表1.4所表示。字段名數(shù)據(jù)類型長度是否主鍵描述bookBarCodevarchar100是圖書條形碼bookNamevarchar100否圖書名稱bookTypeint4否圖書類型bookcaseint4否書架類型bookConcernvarchar100否出版社名稱authorvarchar80否作者名稱pricemoney8否圖書價格borrowSumint4否借閱次數(shù)●tb_bookType(圖書類型信息表)。表tb_bookType用于保留圖書類型信息,該表結構如表1.5所表示。字段名數(shù)據(jù)類型長度是否主鍵描述typeIDint4否圖書類型編號typeNamevarchar5否類型名稱borrowDayint10否可借天數(shù)●tb_library(圖書館信息表)。表tb_library用于保留和圖書館相關信息,該表結構如表1.6所表示。字段名數(shù)據(jù)類型長度是否主鍵描述libraryNamevarchar80否圖書館名稱curatorvarchar80否館長名稱telvarchar100否聯(lián)絡電話addressvarchar200否聯(lián)絡地址emailvarchar100否電子郵件netvarchar200否網(wǎng)址upbuildTimedatetime8否建管時間remarkvarchar500否備注●tb_readerInfo(讀者信息表)。表tb_readerInfo用于保留全部讀者信息,該表結構如表1.7所表示。字段名數(shù)據(jù)類型長度是否主鍵描述readerBarCodevarchar50否讀者條形碼readerNamevarchar50否讀者名稱sexchar10否讀者性別readerTypevarchar50否讀者類型certificateTypevarchar50否證件類型certificatevarchar50否證件號碼telvarchar50否聯(lián)絡電話emailvarchar50否電子郵件remarkvarchar500否備注●tb_readerType(讀者類型信息表)。表tb_readerType用于保留全部讀者類型信息,該表結構如表1.8所表示。字段名數(shù)據(jù)類型長度是否主鍵描述idint4是類型編號typevarchar50否類型名稱numvarchar50否可借數(shù)量●tb_user(管理員信息表)。表tb_user用于保留全部管理員信息,該表結構如表1.9所表示。字段名數(shù)據(jù)類型長度是否主鍵描述userIdint4是管理員編號userNamevarchar50否管理員名稱userPwdvarchar50否管理員密碼1.3.7文件夾組織機構為了便于讀者對本網(wǎng)站學習,在此將網(wǎng)站文件組織結構展示出來,圖1.19所表示。圖1.19系統(tǒng)文件組織結構圖1.4公共類設計在開發(fā)過程中,常常會用到部分公共模塊,如數(shù)據(jù)庫連接及操作類、字符串處理類等,所以,在開發(fā)系統(tǒng)前首先需要設計這些公共模塊。下面將具體介紹圖書館管理系統(tǒng)中所需要數(shù)據(jù)庫操作類。數(shù)據(jù)庫操作類用來完成數(shù)據(jù)庫連接操作,和數(shù)據(jù)庫查詢、添加、刪除和修改操作。將這多個操作編寫到一個公共類里,能夠降低反復代碼編寫,有利于代碼維護。在dataOperate類中一共定義了5個方法,下面分別對這多個方法進行分析。首先在命名空間區(qū)域引用usingSystem.Data.SqlClient命名空間。代碼以下:usingSystem.Data.SqlClient;●creatCon()方法。creatCon()方法用來連接數(shù)據(jù)庫,此方法返回類型為SqlConnection。代碼以下:例程01publicstaticSqlConnectioncreatCon(){//生成SqlConnection一個對象用于連接數(shù)據(jù)庫SqlConnetcioncon=newSqlConnection("server=.;database=db_WL;uid=sa;pwd=;"); returncon;}●execSQL()方法execSQL(stringsql)方法用來添加、插入和刪除數(shù)據(jù)。此方法返回一個布爾型值,用來表示添加、插入和刪除數(shù)據(jù)是否成功,實施成功返回true,不然返回false。調(diào)用此方法時應傳入一個string類型參數(shù),此參數(shù)表示所要實施SQL語句。代碼以下:例程02publicstaticboolexecSQL(stringsql){//創(chuàng)建連接對象SqlConnectioncon=createCon();con.Open();SqlCommandcom=newSqlCommand(sql,con);try{//實施SQL語句com.ExecuteNonQuery();//關閉連接對象con.Close();}catch(Exceptione){con.Close();//實施失敗返回falsereturnfalse;}//實施成功返回truereturntrue;}●selsSQL()方法execSQL(stringsql)方法用來查找數(shù)據(jù)是否存在。此方法返回一個布爾型值,用來表示是否查找到數(shù)據(jù),如查找到數(shù)據(jù)則返回true,不然返回false。調(diào)用此方法時應傳入一個string類型參數(shù),此參數(shù)表示所要實施SQL語句。代碼以下:例程03publicstaticboolseleSQL(stringsql){Inti;SqlConnectioncon=createCon();con.Open();SqlCommandcom=newSqlCommand(sql,con);try{ i=Convert.ToInt32(com.ExecuteScalar());con.Close();}catch(Exceptione){con.Close();returnfalse;}if(i>0){returntrue;}else{returnfalse;}}●getDataset()方法getDataset(stringsqlstringtable)方法用來查找并返回多行數(shù)據(jù)。此方法返回一個Dataset數(shù)據(jù)集。在調(diào)用此方法時應傳入兩個string類型參數(shù),第一個參數(shù)表示所要實施SQL語句,第二個參數(shù)表示表名。代碼以下:例程04publicstaticDataSetgetDataset(stringsql,stringtable){SqlConnectioncon=createCon();con.Open();DataSetds;SqlDataAdaptersda=newSqlDataAdapter(sql,con);ds=newDataSet();sda.Fill(ds,table);returnds;}●getRow()方法getRow(stringsql)方法用來查找并返回一行數(shù)據(jù)。此方法返回一個SqlCommand對象。在調(diào)用此方法時應傳入一個string類型參數(shù),此參數(shù)表示所要實施SQL語句。代碼以下:例程05publicstaticSqlDataReadergetRow(stringsql){SqlConnectioncon=createCon();con.Open();SqlCommandcom=newSqlCommand(sql,con);returncom.ExecuteReader();}1.5網(wǎng)站首頁設計 1.5.1網(wǎng)站首頁概述管理員經(jīng)過系統(tǒng)登錄模塊驗證后,能夠登錄到圖書館管理系統(tǒng)主頁。系統(tǒng)主頁關鍵包含Banner信息欄、導航欄、借閱排行榜和版權信息4部分。網(wǎng)站首頁運行效果圖1.20所表示圖1.20圖書館管理系統(tǒng)首頁1.5.2網(wǎng)站首頁技術分析在開發(fā)網(wǎng)站時,假如使用GridView控件顯示信息,為其添加一個自動編號列,是一個比較有用功效,能夠一目了然地看到目前頁共有多少條統(tǒng)計。在圖書館管理系統(tǒng)首頁開發(fā)中用到了這一技術,實現(xiàn)根據(jù)借閱次數(shù)多少進行排名功效。在實現(xiàn)自動編號功效時,關鍵觸發(fā)了GridView控件RowDataBound事件,該事件具體說明以下。RowDataBound事件:展現(xiàn)GridView控件之前,該控件中每一行全部必需綁定到數(shù)據(jù)源中一條統(tǒng)計。將某個數(shù)據(jù)行綁定到GridView控件中數(shù)據(jù)以后,將引發(fā)RowDataBound事件。網(wǎng)站首頁在實現(xiàn)自動編號功效時,關鍵是經(jīng)過在GridView控件RowDataBound事件中動態(tài)修改GridView控件中第一列值實現(xiàn)。GridView控件RowDataBound事件中實現(xiàn)代碼以下:if(e.Row.RowIndex!=-1)//判定GridView控件中是否有值{intid=e.Row.RowIndex+1;//將目前行索引加上一賦值給變量ide.Row.Cells[0].Text=id.ToString();//將變量id值傳給GridView控件每一行單元格中}1.5.3網(wǎng)站首頁實現(xiàn)過程1.設計步驟(1)在該網(wǎng)站中新建一個Web窗體,將其命名為index.aspx,用于顯示網(wǎng)站首頁。(2)在Web窗體中添加Table表格,用于頁面布局。(3)在Table表格中添加相關服務器控件,控件屬性設置其用途如表1.10所表示??丶愋涂丶Q關鍵屬性設置控件用途gvBookTaxisAutoGenerateColumns屬性設置為False(去掉GridView控件自動生成列)顯示圖書借閱排行榜Header.ascx均為默認值網(wǎng)站導航功效Bottom.ascx均為默認值網(wǎng)站版本信息表1.10頁面中控件屬性及用途實現(xiàn)代碼首先導入必需命名空間usingSystem.Data.SqlClient.引入命名空間代碼以下:usingSystem.Data.SqlClient;在page_Load單擊事件中,利用Session對象判定用戶登錄狀態(tài),假如Session中存在變量為空,說明用戶未登錄,頁面將跳轉到登錄頁面;假如用戶已登錄,則調(diào)用自定義方法bindBookInfo().代碼以下:protectedvoidPage_Load(objectsender,EventArgse){if(Session["userName"]!=null)//判定用戶是否登錄{bindBookInfo();//調(diào)用自定義方法用來綁定圖書借閱排行}elseResponse.Redirect("entry.aspx");//跳轉到登錄頁面}bindBookInfo()自定義方法用來顯示圖書借閱排行榜,在此方法中使用數(shù)據(jù)庫操作類中getDataset()方法,查找出借閱率高圖書信息綁定到GridView控件上。實現(xiàn)代碼以下:protectedvoidbindBookInfo(){stringsql="selecttop10*fromtb_bookInfoorderbyborrowSumdesc";//設置SQL語句gvBookTaxis.DataSource=dataOperate.getDataset(sql,"tb_bookInfo");//獲取圖書信息數(shù)據(jù)源gvBookTaxis.DataBind();//綁定GridView控件}在圖書信息表中,圖書類型存放是類型編號,為了查看方便將圖書類型編號轉換為類型名稱。此功效在GridView控件RowDataBound事件中實現(xiàn),在此事件中先獲取圖書類型編號,經(jīng)過編號在圖書類型表中獲取類型名稱,將類型名稱綁定到圖書類型列中。實現(xiàn)代碼以下:protectedvoidgvBookTaxis_RowDataBound(objectsender,GridViewRowEventArgse){if(e.Row.RowIndex!=-1)//判定GridView控件中是否有值{intid=e.Row.RowIndex+1;//將目前行索引加上一賦值給變量ide.Row.Cells[0].Text=id.ToString();//將變量id值傳給GridView控件每一行單元格中}if(e.Row.RowType==DataControlRowType.DataRow){//綁定圖書類型stringbookType=e.Row.Cells[3].Text.ToString();//獲取圖書類型編號stringtypeSql="select*fromtb_bookTypewhereTypeID="+bookType;SqlDataReadertypeSdr=dataOperate.getRow(typeSql);typeSdr.Read();//讀取一條數(shù)據(jù)e.Row.Cells[3].Text=typeSdr["typeName"].ToString();//設置圖書類型//綁定書架stringbookcase=e.Row.Cells[4].Text.ToString();//獲取書架編號stringcaseSql="select*fromtb_bookcasewherebookcaseID="+bookcase;SqlDataReadercaseSdr=dataOperate.getRow(caseSql);caseSdr.Read();e.Row.Cells[4].Text=caseSdr["bookcaseName"].ToString();//設置書架//設置鼠標懸停行顏色e.Row.Attributes.Add("onMouseOver","Color=this.style.backgroundColor;this.style.backgroundColor='lightBlue'");e.Row.Attributes.Add("onMouseOut","this.style.backgroundColor=Color;");}}1.6管理員設置模塊1.6.1管理員設置模塊管理員設置模塊關鍵包含查看管理員列表、添加管理員、管理員權限設置和刪除管理員4個功效。選擇"系統(tǒng)設置"/"管理員設置"命令,進入到管理員設置頁面。在此頁面中將顯示全部管理員名稱和管理員擁有權限。管理員設置頁面圖1.21所表示。圖1.21管理員設置頁面單擊"添加管理員"鏈接按鈕將彈出添加管理員網(wǎng)頁對話框,在此對話框中能夠添加新管理員,新添加管理員默認擁有圖書借還權限和系統(tǒng)查詢權限,圖1.22所表示。圖1.22添加管理員單擊"權限設置"鏈接按鈕將彈出管理員權限網(wǎng)頁對話框,在此對話框中能夠設置某一個管理員所擁有權限。比如某個管理員不擁有系統(tǒng)設置權限,則"系統(tǒng)設置"一欄全部功效將不能使用,圖1.23所表示。圖1.23設置管理員權限1.6.2管理員設置模塊技術分析在添加新管理員時,在管理員權限設置表中也應該將新管理員添加到其中。此功效關鍵利用觸發(fā)器來實現(xiàn)。觸發(fā)器在應用程序中能夠替換繁瑣程序代碼,完成對應功效。因為觸發(fā)器能夠查詢其它表,而且能夠包含復雜Transact-SQL語句,所以能夠實現(xiàn)強制性、復雜業(yè)務規(guī)則或要求。觸發(fā)器實質(zhì)是一個特殊存放過程,不過它和表卻是緊密聯(lián)絡,離開了表它將不復存在。觸發(fā)器不像存放過程那樣需要調(diào)用才能實施,而是在對表中數(shù)據(jù)進行增、刪、改(INSERT、DELETE、UPDATE)操作時被觸發(fā)而實施。觸發(fā)器能夠包含復雜Transact-SQL語句。在觸發(fā)器內(nèi)無設置回滾,能夠將觸發(fā)它語句所在事務全部回滾,這么檢測到錯誤時能夠回滾事務以撤銷錯誤。在MicrosoftSQLServer中使用觸發(fā)器優(yōu)點可概括以下:觸發(fā)器能夠實現(xiàn)外鍵約束功效,實現(xiàn)對表級聯(lián)修改。觸發(fā)器能夠實現(xiàn)核查約束功效。而且其功效更為強大。假如對表中數(shù)據(jù)進行了增、刪、改操作,使用觸發(fā)器能夠依據(jù)修改前后差異,采取對應對策。許可在一個表中針對不一樣增、刪、改操作設置多個觸發(fā)器,以完成各類不一樣任務。觸發(fā)器在SQLServer中基礎應用可大致概括為Insert型觸發(fā)器、Update型觸發(fā)器、Delete型觸發(fā)器、嵌套型觸發(fā)器和遞歸型觸發(fā)器。添加管理員模塊使用是Insert型觸發(fā)器,下面介紹觸發(fā)器創(chuàng)建。創(chuàng)建Insert觸發(fā)器:需用到兩個表,一個表為管理員信息表tb_user,用來存放新添加管理員信息;另一個表為管理員權限設置表tb_admSet,用來存放每個管理員管理權限。在管理員信息表中添加一個新管理員信息同時,也應將新添加管理員名稱添加到管理員權限設置表中。在查詢分析器里建立Insert型觸發(fā)器語法以下:userdb_tsrj/*判定表中是否有名為addUser觸發(fā)器*/IFEXISTS(SELECTnameFROMsysobjectsWHEREname='addUser'ANDtype='p')DROPPROCEDUREaddUserGOcreatetriggeraddUserontbUserforinsertasinsertintotb_admSet(userName)selectinserted.userNamefrominserted1.6.3查看管理員信息頁實現(xiàn)過程1.設計步驟(1)在該網(wǎng)站新建一個Web窗體,將其命名為userManage.aspx,用于顯示管理員信息。(2)在Web窗體中添加Table表格,用于頁面布局。(3)在Table表格中添加相關服務器控件,控件屬性設置及其用途如表1.11所表示??丶愋涂丶Q關鍵屬性設置控件用途gvAdmSetAutoGenerateColumns屬性設置為False(去掉GridView控件自動生成列)顯示管理員具體信息Header.ascx均為默認值網(wǎng)站導航功效bottom.ascx均為默認值網(wǎng)站版本信息為了方便讀者了解GridView控件設置,在此給出GridView控件前臺代碼:<asp:GridViewID="gvAdmSet"runat="server"AutoGenerateColumns="False"CellPadding="4"ForeColor="#333333"GridLines="None"Width="815px"OnRowDeleting="gvAdmSet_RowDeleting"><FooterStyleBackColor="#507CD1"Font-Bold="True"ForeColor="White"/><Columns><asp:BoundFieldDataField="userName"HeaderText="管理員名稱"/><asp:CheckBoxFieldDataField="systemSet"HeaderText="系統(tǒng)設置"ReadOnly="True"/><asp:CheckBoxFieldDataField="readerManage"HeaderText="讀者管理"/><asp:CheckBoxFieldDataField="bookManage"HeaderText="圖書管理"/><asp:CheckBoxFieldDataField="bookBorrow"HeaderText="圖書借還"/><asp:CheckBoxFieldDataField="systemSearch"HeaderText="系統(tǒng)查詢"/><asp:TemplateFieldHeaderText="權限設置"><ItemTemplate><ahref="#"onclick="window.open('admSet.aspx?userName=<%#Eval("userName")%>','','width=292,height=176');">權限設置</a></ItemTemplate></asp:TemplateField><asp:CommandFieldShowDeleteButton="True"HeaderText="刪除"/></Columns><SelectedRowStyleBackColor="#D1DDF1"ForeColor="#333333"Font-Bold="True"/><PagerStyleBackColor="#2461BF"ForeColor="White"HorizontalAlign="Center"/><HeaderStyleBackColor="#99C89D"Font-Bold="True"ForeColor="White"/><AlternatingRowStyleBackColor="White"/><RowStyleBackColor="#EFF3FB"/><EditRowStyleBackColor="#2461BF"/></asp:GridView>2.實現(xiàn)代碼在頁面加載事件中,首先判定用戶是否登錄,假如用戶已登錄,則判定此用戶是否擁有管理此頁面權限,擁有此權限將調(diào)用bindUserManage()自定義方法顯示全部管理員信息。實現(xiàn)代碼以下:protectedvoidPage_Load(objectsender,EventArgse){if(Session["userName"]!=null)//判定管理員是否登錄{if(getSet())//判定是否擁有權限{bindUerManage();}elseResponse.Write("<script>alert('您沒有此權限');location='index.aspx';</script>");}else{Response.Redirect("entry.aspx");//返回到登錄頁面}}在bindUserManage()自定義方法中,調(diào)用數(shù)據(jù)庫操作類中getDataset()方法獲取全部管理員信息,實現(xiàn)代碼以下:publicvoidbindUerManage(){stringsql="select*fromtb_admSet";gvAdmSet.DataSource=dataOperate.getDataset(sql,"tb_admSet");//獲取數(shù)據(jù)源gvAdmSet.DataKeyNames=newstring[]{"userName"};//設置主鍵字段gvAdmSet.DataBind();//綁頂GridView控件顯示管理員信息}刪除管理員功效經(jīng)過GridView控件中RowDelete()事件來實現(xiàn),在此事件中獲取該管理員登錄名,經(jīng)過登錄名使用數(shù)據(jù)庫操作類中execSQL()方法將此管理員刪除,最終需要重新綁定管理員信息。實現(xiàn)代碼以下:rotectedvoidgvAdmSet_RowDeleting(objectsender,GridViewDeleteEventArgse){stringuserName=this.gvAdmSet.DataKeys[e.RowIndex].Value.ToString();//獲取主鍵字段stringsql="deletefromtb_admSetwhereuserName='"+userName+"'";dataOperate.execSQL(sql);//刪除管理員信息bindUerManage();//重新綁定管理}1.6.4管理員權限設置頁實現(xiàn)過程1.設計步驟(1)在該網(wǎng)站中新建一個Web窗體,將其命名為admSet.aspx,用于設置管理員權限。(2)在Web窗體中添加Table表格,用于頁面布局。(3)在Table表格中添加相關服務器控件,控件屬性設置及其用途如表1.12所表示。表1.12頁面中控件屬性設置及用途控件類型控件名稱關鍵屬性設置控件用途txtUserName將ReadOnly屬性設置為“True”(設置文本框是否為只讀屬性)顯示管理員登錄名cekboxSystemSet均為默認值顯示并設置管理員系統(tǒng)設置權限ceckboxBookBorrow均為默認值顯示并設置管理員圖書借還權限ceckboxReaderManage均為默認值顯示并設置管理員讀者管理權限ceckboxSystemSearch均為默認值顯示并設置管理員系統(tǒng)查詢權限ceckboxBookManage均為默認值顯示并設置管理員圖書管理權限btnSave均為默認值保留目前設置按鈕btnClose均為默認值關閉此頁面按鈕2.實現(xiàn)代碼在頁面加載事件中判定頁面是否是首次加載,假如頁面是首次加載,則調(diào)用bindUser()自定義方法顯示目前用戶擁有權限。實現(xiàn)代碼以下:staticstringuserName;protectedvoidPage_Load(objectsender,EventArgse){if(!IsPostBack){bindUser();//調(diào)用自定義方法顯示該管理員目前擁有權限}}在bindUser()自定義方法中經(jīng)過查看管理頁面?zhèn)魅牍芾韱T登錄名,在數(shù)據(jù)庫中讀取此管理員目前擁有權限并將權限信息顯示出來。實現(xiàn)代碼以下:publicvoidbindUser(){userName=Request.QueryString["userName"].ToString();//獲取管理員登錄名txtUserName.Text=userName;//顯示管理員登錄名stringsql="select*fromtb_admSetwhereuserName='"+userName+"'";SqlDataReadersdr=dataOperate.getRow(sql);sdr.Read();//讀取一條統(tǒng)計cekboxSystemSet.Checked=Convert.ToBoolean(sdr["systemSet"]);//顯示是否擁有系統(tǒng)設置權限ceckboxSystemSearch.Checked=Convert.ToBoolean(sdr["systemSearch"]);//顯示是否擁有系統(tǒng)查詢權限ceckboxReaderManage.Checked=Convert.ToBoolean(sdr["ReaderManage"]);//顯示是否擁有讀者管理權限ceckboxBookManage.Checked=Convert.ToBoolean(sdr["bookManage"]);//顯示是否擁有圖書管理權限ceckboxBookBorrow.Checked=Convert.ToBoolean(sdr["bookBorrow"]);//顯示是否擁有圖書借還權限}當修改完目前管理員權限后將管理員權限信息更新到管理員權限設置表中,此操作是在“保留”按鈕Click事件中實現(xiàn)。在此事件中獲取目前設置管理員權限信息,使用數(shù)據(jù)庫操作類中execSQL()方法將數(shù)據(jù)庫中權限信息更新。實現(xiàn)代碼以下:protectedvoidbtnSave_Click(objectsender,EventArgse){bytesystemSet=Convert.ToByte(cekboxSystemSet.Checked);//獲取系統(tǒng)管理權限bytesystemSearch=Convert.ToByte(ceckboxSystemSearch.Checked);//獲取系統(tǒng)查詢權限bytereaderManage=Convert.ToByte(ceckboxReaderManage.Checked);//獲取讀者管理權限bytebookManage=Convert.ToByte(ceckboxBookManage.Checked);//獲取圖書管理權限bytebookBorrow=Convert.ToByte(ceckboxBookBorrow.Checked);//獲取圖書借還權限stringsql="updatetb_admSetsetsystemSet="+systemSet+",systemSearch="+systemSearch+",readerManage="+readerManage+",bookManage="+bookManage+",bookBorrow="+bookBorrow+"whereuserName='"+userName+"'";if(dataOperate.execSQL(sql)){RegisterStartupScript("","<script>alert('設置成功!');opener.location.reload();window.close();</script>");}else{RegisterStartupScript("","<script>alert('設置失??!')</script>");}}1.6.5單元測試在獲取管理員某項權限時,使用CheckBox控件Checked屬性獲取一個布爾類型值,此值表示目前控件選中狀態(tài)。假如使用此值更新管理員權限設置表會出現(xiàn)以下錯誤:錯誤原因:沒有將布爾類型值轉換。在管理員權限設置表中存放字段類型為bit.處理方法:將CheckBox控件Checked屬性獲取布爾類型值轉換為byte類型。轉換代碼以下:Convert.ToByte(CheckBox.Checked).1.7圖書檔案管理模塊設計1.7.1圖書檔案管理模塊概述圖書檔案管理模塊關鍵包含查看圖書具體信息、添加圖書信息、修改圖書信息、刪除圖書信息和打印圖書具體信息5個功效。選擇“圖書管理”/“圖書檔案管理”命令,進入到圖書管理頁面。頁面運行效果圖1.24所表示。圖1.24圖書檔案管理頁面單擊"添加圖書信息"或“修改”鏈接按鈕,將彈出添加或修改圖書信息網(wǎng)頁對話框,圖1.25所表示。圖1.25添加或修改圖書信息對話框1.7.2圖書檔案管理模塊技術分析在打印圖書具體信息時用到了,SOLServer視圖功效。視圖是一個常見數(shù)據(jù)庫對象,可將查詢結果以虛擬表形式存放在數(shù)據(jù)庫中。視圖并不在數(shù)據(jù)庫以存放數(shù)據(jù)集形式存在。視圖結構和內(nèi)容是建立在對表查詢基礎上,和表一樣包含行和列。視圖中內(nèi)容是由查詢定義來,而且視圖和查詢?nèi)渴墙?jīng)過SOL語句定義,它們有著很多相同之處,但又存在很多不一樣之處。存放:視圖存放為數(shù)據(jù)庫設計一部分,而查詢則不是。視圖能夠嚴禁全部用戶訪問數(shù)據(jù)庫中基表而要求用戶只能經(jīng)過視圖操作數(shù)據(jù)。這種方法能夠保護用戶和應用程序不受一些數(shù)據(jù)庫修改影響,一樣也能夠白虎數(shù)據(jù)表安全性。排序:能夠排序任何查詢果,不過只有當視圖包含TOP自居是才能排序視圖。加密:能夠加密視圖,但不能加密查詢。視圖能夠使用Teansact-SOL創(chuàng)建,使用是 CREATEVIEW語句。語法以下:CREATEVIEWview_name[(column[,...n])][WITH<view_attribute>[,...n]]ASselect_statement[WITHCHECKOPTION]參數(shù)說明以下:View_name:視圖名稱。Column:定義視圖中字段名。假如沒有指定,則視圖將取得和SELECT語句中字段名相同名稱。但對于一下情況則必需指定字段名:視圖是從多個奧中產(chǎn)生,對于表中有數(shù)據(jù)列重名時。當列是算術表示式中、函數(shù)常量派生得到。當初圖中某列不一樣于表中列名稱時。WITH<view_attribute>:其中<view_attribute>有一下3種參數(shù)。ENCRTPTIONG:表示對視圖文本進行加密。SCHMABINDING:將視圖綁定在架構上。指定SCHMABINDING時select_statement必需包含所引用表、視圖或用戶定義函數(shù)兩部分名稱(owner.object).VIE_METADATA:表示假如某一查詢中引用該視圖元數(shù)據(jù)信息,而不是以個基表或表。AS:視圖要實施操作.Select_statement:定義視圖查詢語句。該語句能夠引用多個表或其它視圖。在CREATEVIEW語句中,對于查詢語句有以下限制。不能包含COMPUTER或COMPUTERBY子句。不能包含ORDERBY子句。除非在SELECT語句中選擇列表中也有一個TOP子句。不能包含INTO關鍵字。不能引用臨時表或變量。WITHCHECKOPTION:要求在視圖上實施全部數(shù)據(jù)修改語句全部必需符合由select_statement設置準則。經(jīng)過視圖修改統(tǒng)計,WITHCHECKOPTION能夠確保提交修改后仍可經(jīng)過視圖修改數(shù)據(jù)。使用CHECKVIEW語句創(chuàng)建視圖時,只要在查詢分析器重寫入對應文本。代碼以下:createviewview_bookInfoasselecta.bookBarCode,a.bookName,b.typeName,c.bookcaseName,a.bookConcern,a.author,a.pricefromtb_bookInfoasainnerjointb_bookTypeasbona.bookType=b.typeIDinnerjointb_bookcaseascona.bookcase=c.bookcaseID控件類型控件名稱關鍵屬性設置及用途控件用途gvBookManageAllowPaging屬性設置為True(許可分頁)AutoGenerateColumns屬性設置為False(去掉GridView控件生成列)PageSize屬性設置為10(每頁顯示10條數(shù)據(jù))顯示圖書具體信息HyperLink1將UavigateUrl屬性設置為“~/bookInfoPrint.aspx”(需要跳轉路徑)跳轉到打印圖書具體信息頁面header.ascx均為默認值網(wǎng)站導航功效bottom.ascx均為默認值網(wǎng)站版本信息表1.13控件屬性設置及用途1.7.3查看圖書具體信息頁面實現(xiàn)過程設計步驟在該網(wǎng)頁中建立一個web窗體,將其命名為bookinfomanage.aspx,用于顯示圖書具體信息。在web窗體中添加table表格,用于頁面布局。在table表格中添加相關服務器控件,控件屬性設置及用途如表4.13所表示.為了方便讀者了解GridView控件設置,在此給出GridView控件前臺代碼。代碼以下:<asp:GridViewID="gvBookManage"runat="server"AllowPaging="True"AutoGenerateColumns="False"CellPadding="4"ForeColor="#333333"GridLines="None"OnPageIndexChanging="gvBookManage_PageIndexChanging"OnRowDataBound="gvBookManage_RowDataBound"OnRowDeleting="gvBookManage_RowDeleting"Width="815px"><FooterStyleBackColor="#507CD1"Font-Bold="True"ForeColor="White"/><Columns><asp:BoundFieldDataField="bookBarCode"HeaderText="圖書條形碼"/><asp:BoundFieldDataField="bookName"HeaderText="圖書名稱"/><asp:BoundFieldDataField="bookType"HeaderText="圖書類型"/><asp:BoundFieldDataField="bookcase"HeaderText="圖書書架"/><asp:BoundFieldDataField="bookConcern"HeaderText="出版社"/><asp:BoundFieldDataField="author"HeaderText="作者"/><asp:BoundFieldDataField="price"HeaderText="圖書定價"/><asp:BoundFieldDataField="borrowSum"HeaderText="借閱次數(shù)"/><asp:TemplateFieldHeaderText="修改"><ItemTemplate><ahref="#"onclick="window.open('addBookInfo.aspx?ID=<%#Eval("bookBarCode")%>','','width=340,height=371')">修改</a></ItemTemplate></asp:TemplateField><asp:CommandFieldHeaderText="刪除"ShowDeleteButton="True"/></Columns><RowStyleBackColor="#EFF3FB"/><EditRowStyleBackColor="#2461BF"/><SelectedRowStyleBackColor="#D1DDF1"Font-Bold="True"ForeColor="#333333"/><PagerStyleBackColor="#99C89D"ForeColor="White"HorizontalAlign="Center"/><HeaderStyleBackColor="#99C89D"Font-Bold="True"ForeColor="White"/><AlternatingRowStyleBackColor="White"/></asp:GridView>實現(xiàn)代碼在頁面加載事件中,判定用戶是否登錄,假如用戶已登錄,則判定此用戶是否含有管理此頁面權限,擁有此權限將調(diào)用自定義bindBook()方法顯示全部圖書具體信息。實現(xiàn)代碼以下protectedvoidPage_Load(objectsender,EventArgse){if(Session["userName"]!=null)//判定管理員是否登錄{if(getSet())//判定是否擁有權限{bindBook();//自定義方法顯示圖書具體信息}elseResponse.Write("<script>alert('您沒有此權限);location='index.aspx';</script>");}else{Response.Redirect("entry.aspx");//返回到登錄頁面}}在自定義bindBook()方法中,調(diào)用數(shù)據(jù)庫操作類中getDataset()方法取得圖書具體信息,將GridView控件數(shù)據(jù)庫設getDataset()方法返回值并設置主鍵字段。實現(xiàn)代碼以下:publicvoidbindBook(){stringsql="select*fromtb_bookInfo";gvBookManage.DataSource=dataOperate.getDataset(sql,"tb_bookInfo");//獲取圖書信息數(shù)據(jù)源gvBookManage.DataKeyNames=newstring[]{"bookBarCode"};//設置主鍵字段gvBookManage.DataBind();//綁定GridView控件}在Gruidview控件RowDataBound事件中,將圖書類型編號和書架編號替換成文本。在此事件中獲取圖書類型和書架編號,經(jīng)過,編號在數(shù)據(jù)庫中找到對應名稱并將其替換。試下代碼以下:protectedvoidgvBookManage_RowDataBound(objectsender,GridViewRowEventArgse){if(e.Row.RowType==DataControlRowType.DataRow){//設置圖書類型stringbookType=e.Row.Cells[2].Text.ToString();//獲取圖書類型編號stringtypeSql="select*fromtb_bookTypewhereTypeID="+bookType;SqlDataReadertypeSdr=dataOperate.getRow(typeSql);typeSdr.Read();//讀取一條統(tǒng)計e.Row.Cells[2].Text=typeSdr["typeName"].ToString();//設置書架stringbookcase=e.Row.Cells[3].Text.ToString();//獲取書架編號stringcaseSql="select*fromtb_bookcasewherebookcaseID="+bookcase;SqlDataReadercaseSdr=dataOperate.getRow(caseSql);caseSdr.Read();//讀取一條統(tǒng)計e.Row.Cells[3].Text=caseSdr["bookcaseName"].ToString();e.Row.Attributes.Add("onMouseOver","Color=this.style.backgroundColor;this.style.backgroundColor='lightBlue'");e.Row.Attributes.Add("onMouseOut","this.style.backgroundColor=Color;");}}刪除圖書信息在GridView控件RowDelecting事件中實現(xiàn),在此事件中獲取改行圖書信息條形碼,依據(jù)條形碼刪除此圖書信息。實現(xiàn)代碼以下:protectedvoidgvBookManage_RowDeleting(objectsender,GridViewDeleteEventArgse){stringbarCode=gvBookManage.DataKeys[e.RowIndex].Value.ToString();//獲取改行圖書條形碼stringsql="deletefromtb_bookInfowherebookBarCode='"+barCode+"'";dataOperate.execSQL(sql);//將此條圖書信息刪除bindBook();//調(diào)用自定義方法重新綁定圖書信息}GetSet()自定義方法用來判定此用戶是否擁有管理此頁面權限,此方法返回一個布爾型值。當此值為True是表示用戶擁有管理此頁面權限,為Fales時則沒有管理此頁面權限,實現(xiàn)代碼以下:publicboolgetSet(){stringuserName=Session["userName"].ToString();//獲取管理員登錄名stringsql="select*fromtb_admSetwhereuserName='"+userName+"'";SqlDataReadersdr=dataOperate.getRow(sql);sdr.Read();//讀取一條統(tǒng)計returnConvert.ToBoolean(sdr["systemSet"]);//返回是否擁有權限}為了方便圖書信息查詢和提升頁面性能,使用了GridView控件自帶分頁功效此功效需要設置AllowPaging屬性為True,并在GridView控件PageIndexChanging事件中設置目前頁面索引。實現(xiàn)代碼以下:protectedvoidgvBookManage_PageIndexChanging(objectsender,GridViewPageEventArgse){gvBookManage.PageIndex=e.NewPageIndex;//設置目前頁索引gvBookManage.DataBind();//重新綁定GridView控件}1.4.7添加和修改圖書信息頁面實現(xiàn)過程1.設計步驟在該網(wǎng)站新建一個web窗體,將其命名為addBookInfo.aspx,用于添加或修改圖書信息。在web窗體中添加Table表格,用于頁面布局。在Table表格中添加相關服務器控件,控件屬性設置及其用途如表1.14所表示.表1.14控件屬性設置及其用途控件類型控件名稱關鍵屬性設置及用途控件用途txtBarCode將ReadOnly屬性設置為True(設置文本框是否為只讀屬性)顯示圖書條形碼txtBookName均為默認值顯示或修改圖書名稱txtAuthor均為默認值顯示或修改圖書作者txtBookConcer均為默認值顯示或修改圖書出版社txtPrice均為默認值顯示或修改圖書價格ddlBookType均為默認值顯示或設置圖書類型ddlBookcase均為默認值顯示或設置書架btnSave均為默認值保留目前圖書設置按鈕btnClose均為默認值關閉窗口按鈕實現(xiàn)代碼在頁面加載時間中依據(jù)圖書管理頁面?zhèn)魅胫?,來判定目前對圖書信息操作,假如添加新圖書信息將傳入值為add,假如對圖書信息進行修改將闖進值為圖書條碼信息。判定出對圖書信息多人操作后依據(jù)對應操作實現(xiàn)不一樣功效,添加新圖書信息操作將調(diào)用自定義barcode()方法生成新圖書條形碼,修改圖書信息操作則調(diào)用自定義bindBookInfo()方法顯示圖書具體信息,實現(xiàn)代碼以下。privatestringid="";protectedvoidPage_Load(objectsender,EventArgse){id=Request.QueryString["ID"].ToString();//獲取對圖書操作方法if(!IsPostBack)//判定是否是首次加載{bindBookType();//自定義方法綁定圖書類型bindBookcase();
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 骨創(chuàng)傷的診斷與外科治療
- 犢牛肺炎并發(fā)癥及護理
- 糖尿病性神經(jīng)病變
- 通信實驗室安全教育
- 2.3.1 物質(zhì)的量單位-摩爾 課件高一上學期化學人教版(2019)必修第一冊
- 2.1.1+共價鍵++課件高二上學期化學人教版(2019)選擇性必修2
- 智慧酒店規(guī)劃設計方案
- 美術老師述職報告
- 物聯(lián)網(wǎng)工程知識點
- 水源污染應急處置
- 女生生理衛(wèi)生課 課件
- 小學六年級數(shù)學計算題100道(含答案)
- 企業(yè)介紹PPT模板
- 電力系統(tǒng)分析智慧樹知到答案章節(jié)測試2023年東北電力大學
- 危險化學品安全周知卡(乙酸乙酯)
- 孤立性肺結節(jié)的CT診斷
- GB/T 37194.2-2018塑料聚苯硫醚(PPS)模塑和擠出材料第2部分:試樣制備和性能測定
- 英語教師基本功大賽筆試試題(附答案)
- 化糞池危險防護應急預案
- GB/T 20572-2019天然腸衣生產(chǎn)HACCP應用規(guī)范
- GB/T 19425-2003防偽技術產(chǎn)品通用技術條件
評論
0/150
提交評論