基于JAVA的航空票務(wù)系統(tǒng)的設(shè)計與實現(xiàn)畢業(yè)設(shè)計論文_第1頁
基于JAVA的航空票務(wù)系統(tǒng)的設(shè)計與實現(xiàn)畢業(yè)設(shè)計論文_第2頁
基于JAVA的航空票務(wù)系統(tǒng)的設(shè)計與實現(xiàn)畢業(yè)設(shè)計論文_第3頁
基于JAVA的航空票務(wù)系統(tǒng)的設(shè)計與實現(xiàn)畢業(yè)設(shè)計論文_第4頁
基于JAVA的航空票務(wù)系統(tǒng)的設(shè)計與實現(xiàn)畢業(yè)設(shè)計論文_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

合肥師范學(xué)院2015屆本科生畢業(yè)論文(設(shè)計)合肥師范學(xué)院2015屆本科生畢業(yè)論文(設(shè)計)本科生畢業(yè)論文(設(shè)計)題目:基于JAVA的航空票務(wù)系統(tǒng)的設(shè)計與實現(xiàn)學(xué)院計算機學(xué)院學(xué)科門類工科專業(yè)計算機科學(xué)與技術(shù)學(xué)號姓名指導(dǎo)教師2015年5月22日PAGEIPAGE摘要現(xiàn)如今的航空售票業(yè)務(wù)是一個高度依賴信息的行業(yè)?;ヂ?lián)網(wǎng)信息技術(shù)的飛速發(fā)展不僅使航空售票工作者逐漸擺脫了繁重的手工勞動、提高了工作效率,而且推著航空事業(yè)向現(xiàn)代化管理邁進。所以航空票務(wù)系統(tǒng)的實現(xiàn)在現(xiàn)實生活中尤為重要?;贘AVA的航空票務(wù)系統(tǒng)就是使用JAVA實現(xiàn)在網(wǎng)頁上進行航空機票的交易和管理。通過本系統(tǒng)不僅可以進行售票工作,用戶還可進行改簽和退票等功能,系統(tǒng)的后臺管理還可以對旅客情況和航班和機票的信息進行查詢,并可根據(jù)不同的情況隨時進行進行增加,修改,刪除等工作,使售票人員能夠有效的對機票進行控制和管理。極大程度的節(jié)約了成本,并為用戶提供更加快捷、簡便的服務(wù)。關(guān)鍵詞:航空票務(wù);管理系統(tǒng);JAVAIIAbstractThe

airline

ticketing

is

nowadays

a

career

highly

relied

on

information.

The

rapid

development

of

internet

information

technology

gradually

getting

the

heavy

missions

off,

improving

the

work

efficiency

and

making

steps

towards

modern

management.

Soitisveryimportantrealizeairlineticketingsysteminourlife.The

Java-based

airline

ticketing

system

realized

the

airline

tickets

trade

and

management

online

in

Web.

Not

only

the

ticket

selling

service

can

be

achieved

by

the

system,

but

the

tickets

rescheduling

and

canceling

service.

The

back-stage

management

realized

the

inquire

function

for

passenger,

flight

and

ticket

information.

Add,

delete

and

change

function

can

also

be

realized

in

necessary,

which

makes

tickets

seller

have

a

efficient

control

and

management

to

air

ticket.

Saved

cost

in

a

big

extent

and

proved

users

with

better

service.KeyWords:AirTicketing;ManagementSystem;JAVA目錄TOC\o"1-3"\h\u28798摘要 I18659Abstract II145001.引言 1233621.1開發(fā)背景及意義 1183551.2開發(fā)工具和環(huán)境配置 1183531.2.1開發(fā)工具 1289841.2.2環(huán)境配置 2194081.3可行性研究 4316002.需求分析 580652.1功能需求 517742.2性能需求 5206023.系統(tǒng)設(shè)計 6174843.1數(shù)據(jù)庫設(shè)計 6183403.1.1數(shù)據(jù)庫表 6288373.1.2數(shù)據(jù)庫的概念結(jié)構(gòu)設(shè)計 658043.1.3數(shù)據(jù)庫的邏輯結(jié)構(gòu)設(shè)計 8227753.2功能模塊概要設(shè)計 10167883.2.1模塊設(shè)計 10209773.2.2系統(tǒng)流程圖 10307634.詳細設(shè)計 1176074.1登錄模塊 11189004.2航班管理模塊 13324944.3機票預(yù)訂模塊 17174724.4我的訂單模塊 18213994.5修改密碼模塊 1882224.6用戶注冊模塊 19167834.7用戶管理模塊 2092435.系統(tǒng)測試 21215205.1系統(tǒng)測試的概念 21309355.2測試策略及結(jié)果 21312935.2.1功能的測試 21158235.2.2其他測試 2358816.結(jié)語 2428233參考文獻 255279附錄 2624246致謝 38PAGEPAGE21.引言1.1開發(fā)背景及意義隨著科技的發(fā)展,人們生活水平的提高,飛機這種交通工具逐漸的得到人們的青睞,它方便了人們的出行。民航服務(wù)業(yè)的發(fā)展,也推動著各種機票經(jīng)營企業(yè)的快速發(fā)展,用戶需要實時的管理航班信息,能夠?qū)蛻舳ㄆ?、退票、產(chǎn)生定單進行管理。面對各種不同種類的信息,需要合理的數(shù)據(jù)庫結(jié)構(gòu)來保存數(shù)據(jù)信息以及有效的程序結(jié)構(gòu)支持各種數(shù)據(jù)操作的執(zhí)行。因此,航空票務(wù)系統(tǒng)的設(shè)計與實現(xiàn)是必須的。它不但能滿足各種機票經(jīng)營企業(yè)的需求,也大大方便了乘客的查詢航班、購買機票、退票等活動。管理信息系統(tǒng)的開發(fā)需要語言的支持,現(xiàn)在主流的語言有JAVA、C、IOS、Android等。這里比較適合的是JAVA語言,它是面向?qū)ο蟮?、B/S(瀏覽器/服務(wù)器)結(jié)構(gòu)。面向?qū)ο蟮拈_發(fā)是將所需開發(fā)的管理信息系統(tǒng)要解決的問題抽象成若干對象,再研究這些對象之間的關(guān)系,構(gòu)建這些對象之間的聯(lián)系,最終反映在開發(fā)的管理信息系統(tǒng)中。B/S結(jié)構(gòu)是瀏覽器、服務(wù)器的結(jié)構(gòu),客戶之間通過瀏覽器就可以訪問票務(wù)系統(tǒng),不需要下載客戶端。更加方便的為用戶通過服務(wù)[1]。本系統(tǒng)的開發(fā)使用的JAVA中的SERVLET和JSP技術(shù)。前臺頁面時動態(tài)的JSP頁面,在通過SERVLET交互式地瀏覽和修改數(shù)據(jù),生成動態(tài)Web內(nèi)容。整個項目使用MVC設(shè)計模式,層次結(jié)構(gòu)分明便于開發(fā)和維護。1.2開發(fā)工具和環(huán)境配置1.2.1開發(fā)工具本系統(tǒng)開發(fā)主要使用的開發(fā)工具是MyEclipse9.0和MySQL數(shù)據(jù)庫,同時還在MyEclipse中配置了Tomcat服務(wù)器以及使用火狐瀏覽器進行運行測試。1、MyEclipse:是在Eclipse基礎(chǔ)上加上自己的插件開發(fā)而成的功能強大的企業(yè)級集成開發(fā)環(huán)境,主要用于JAVA、JAVAEE以及移動應(yīng)用的開發(fā)。MyEclipse的功能非常強大,支持也十分廣泛,尤其是對各種開源產(chǎn)品的支持相當不錯[2]。2、MySQL:是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),其所使用的SQL語言是用于訪問數(shù)據(jù)庫的最常用標準化語言。MySQL由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網(wǎng)站的開發(fā)都選擇MySQL作為網(wǎng)站數(shù)據(jù)庫[3]。3、Tomcat服務(wù)器是一個免費的開放源代碼的Web應(yīng)用服務(wù)器,屬于輕量級應(yīng)用服務(wù)PAGEPAGE39器,在中小型系統(tǒng)和并發(fā)訪問用戶不是很多的場合下被普遍使用,是開發(fā)和調(diào)試JSP程序的首選。4、火狐瀏覽器:可以用來運行顯示系統(tǒng)開發(fā)編寫的JSP頁面,尤其是火狐下的一款插件Firebug更是方便進行查錯。它集HTML查看和編輯、JavaScript控制臺、網(wǎng)絡(luò)狀況監(jiān)視器于一體,是開發(fā)JavaScript、CSS、HTML和Ajax的得力助手[4]。Firebug能從各個不同的角度剖析Web頁面內(nèi)部的細節(jié)層面,給Web開發(fā)者帶來很大的便利。1.2.2環(huán)境配置1、配置JDK:首先下載安裝JDK軟件,安裝好后配置系統(tǒng)環(huán)境變量,右擊計算機-屬性-高級系統(tǒng)設(shè)置-環(huán)境變量-,然后就可以對環(huán)境變量進行設(shè)置。找到系統(tǒng)變量中的path值。如下圖所示:圖1-1環(huán)境變量配置選中“path”-點擊編輯-把安裝JDK的路徑粘貼到變量值的后面。注意,復(fù)制進去的路徑一定要與前面的數(shù)據(jù)用分號隔開。圖1-2系統(tǒng)變量編輯2、配置Tomcat:首先下載Tomcat文件,我是把文件放在E盤下。然后啟動MyEclipse,點擊Windows-preferences-搜索tomcat。如下圖操作:圖1-3Tomcat配置3、使用第三方工具連接數(shù)據(jù)庫:下載、安裝MySQL客戶端軟件NavicatforMysql,雙擊打開工具-點擊“Connection”彈出如圖示窗口,填寫服務(wù)器的IP以及端口號、數(shù)據(jù)庫的用戶名和密碼連接數(shù)據(jù)庫。圖1-4連接數(shù)據(jù)庫1.3可行性研究航空票務(wù)系統(tǒng)是使用JAVA語言開發(fā),使用SERVLET和JSP技術(shù)進行實現(xiàn)。為了更加方便用戶進行訂票、退票、查詢等功能,系統(tǒng)使用JAVAWEB技術(shù),直接將系統(tǒng)發(fā)布到萬維網(wǎng)上,用戶直接通過瀏覽器訪問該系統(tǒng),不需要下載客戶端。在技術(shù)上使用MVC設(shè)計模式,將顯示層、業(yè)務(wù)邏輯層以及控制層分開,結(jié)構(gòu)清晰便于開發(fā)、易維護[5]。2.需求分析2.1功能需求本航空票務(wù)系統(tǒng)主要實現(xiàn)的功能有:(1)實現(xiàn)不同權(quán)限的登錄。主要有三種用戶權(quán)限:管理員權(quán)限、登錄用戶、未登錄用戶。管理員可進行用戶管理、航班管理、機票管理以及系統(tǒng)維護。登錄用戶可進行航班查詢,機票查詢、預(yù)定、退票改簽以及個人信息管理。未登錄用戶能對航班和機票進行查詢以及注冊、登錄等[6]。(2)訂票功能,能夠按照顧客提供的信息提供訂票服務(wù),例如按給定的起飛城市、到達城市、起飛日期、艙位類型等訂票。

(3)航班管理,管理員能夠?qū)桨嘈畔⑦M行增、刪、改、查。保持航班信息的更新及維護。(4)機票管理,管理員客戶操作反饋的信息,對機票信息進行增、刪、改、查等操作。(5)提供各種查詢功能。例如航班時刻查詢,包括起飛時間,到達時間;航班的其他基本信息查詢,以及對機票的查詢。

(6)我的訂單。用戶登錄后通過我的訂單可以查看個人的訂單詳情,還可進行退票功能以及機票改簽,并且打印改簽前后機票的價格信息。

(7)公司簡介,通過公司簡介可以查看公司的介紹。用戶登錄進入航空票務(wù)系統(tǒng)的主界面,在上方有六個菜單按鈕:系統(tǒng)主頁、公司簡介、航班查詢、機票預(yù)訂、我的訂單及修改密碼。各個界面簡潔,操作方便,容易上手,用戶可以對航班進行詳細的信息查詢,在機票查詢中進行機票的查詢和預(yù)定,在我的訂單中進行機票退訂和改簽。2.2性能需求為了保證系統(tǒng)能夠長期、安全、穩(wěn)定、可靠、高效的運行,系統(tǒng)應(yīng)該滿足以下的性能需求:系統(tǒng)處理的準確性和及時性是系統(tǒng)的必要性能,系統(tǒng)在后期的維護下以及可擴展性,要求系統(tǒng)提供足夠的手段進行功能的調(diào)整和擴充。3.系統(tǒng)設(shè)計3.1數(shù)據(jù)庫設(shè)計對于航空票務(wù)系統(tǒng),它的數(shù)據(jù)庫設(shè)計是通過對航空公司管理業(yè)務(wù)過程的數(shù)據(jù)流程分析和用戶的基本信息以及用戶的處理業(yè)務(wù)的數(shù)據(jù)分析后進行設(shè)計??梢源_定岀系統(tǒng)中一些實體對象及以及它們之間的關(guān)系,這些實體包含各種具體信息,通過相互之間的作用形成數(shù)據(jù)的流動[7]。3.1.1數(shù)據(jù)庫表航空票務(wù)系統(tǒng)中的實體對象包括航班信息表(flightinfo),用戶和管理員信息表(userinfo),機票信息表(ticketinfo),訂單信息表(user_ticketinfo)這些實體模型的含義如下所述。(1)flightinfo:代表一個航班信息實體:包括航班號(id)、航空公司(airfirm)、起飛地(start)、到達地(end)、起飛時間(leaveTime)、到達時間(arriveTime)。(2)userinfo:代表一個用戶或管理員的信息實體:包括用戶編號(id)、用戶名(name),密碼(password),性別(sex),手機號碼(tel),身份證號(idcard),用戶權(quán)限(level)。(3)ticketinfo:代表每一張機票的信息實體:機票編號(id)、起飛地(start)、到達地(end)、起飛時間(leaveTime)、到達時間(arriveTime),日期(time),座位等級(seatLeval),票價(fare),discount(折扣),航班號(flight_id)、機票剩余數(shù)量(ticketNum)。(4)user_ticketinfo:代表一個用戶購買機票的信息實體:機票編號(id)、起飛地(start)、到達地(end)、起飛時間(leaveTime)、到達時間(arriveTime),日期(time),座位等級(seatLeval),票價(fare),用戶名(name)、身份證號(idcard)。3.1.2數(shù)據(jù)庫的概念結(jié)構(gòu)設(shè)計概念結(jié)構(gòu)設(shè)計將反映現(xiàn)實世界中的實體、屬性和它們之間的關(guān)系,建立原始數(shù)據(jù)形式。概念結(jié)構(gòu)設(shè)計的目標是產(chǎn)生反映系統(tǒng)信息需求的整體數(shù)據(jù)庫概念結(jié)構(gòu)[8],描述工具主要有實體圖: 圖3-1航班信息實體圖3-2用戶信息實體圖3-3機票信息實體圖3-4訂單信息實體圖3-5ER圖3.1.3數(shù)據(jù)庫的邏輯結(jié)構(gòu)設(shè)計數(shù)據(jù)庫邏輯結(jié)構(gòu)設(shè)計是描述數(shù)據(jù)庫的組織結(jié)構(gòu)、生成數(shù)據(jù)庫模式。數(shù)據(jù)庫模式定義以下內(nèi)容:存儲什么信息、數(shù)據(jù)的組織、需要的表、列的定義[9]。本課題使用的是MySQL數(shù)據(jù)庫,根據(jù)上述建立的E-R圖,經(jīng)設(shè)計得到如下的數(shù)據(jù)表:flightinfo(航班信息表)航班信息表用來保存航班的信息,如圖3-5所示。userinfo(用戶信息表)用戶信息表用于記錄用戶的信息情況,如圖3-6所示。ticketinfo(機票信息表)機票信息表用來保存機票的信息,如圖3-7所示。user_ticketinfo(訂單信息表)訂單信息表用于記錄每個用戶訂購機票的信息,如圖3-8所示。圖3-6flightinfo(航班信息表)圖3-7userinfo(用戶信息表)圖3-8ticketinfo(機票信息表)圖3-9user_ticketinfo(訂單信息表)3.2功能模塊概要設(shè)計3.2.1模塊設(shè)計[用戶登錄模塊]實現(xiàn)了對用戶使用系統(tǒng)的檢驗工作。用戶又分為不同的權(quán)限,管理員登陸,用戶登錄和不進行登錄直接進入。對不同用戶進入系統(tǒng)所賦予的權(quán)限也不同,增加了系統(tǒng)的安全性。[用戶管理模塊]管理員登陸的權(quán)限,對系統(tǒng)登錄用戶的查看和刪除操作。[航班管理模塊]包含對航班信息的查詢,所有用戶都擁有的權(quán)限。對航班信息的添加、修改和刪除這是系統(tǒng)管理員的操作權(quán)限。[機票管理模塊]包含對機票信息的查詢,所有用戶都擁有的權(quán)限。對機票信息的添加、修改和刪除這是系統(tǒng)管理員的操作權(quán)限。對機票的預(yù)定這是登錄用戶的權(quán)限。[我的訂單模塊]包含對用戶訂單信息的查詢,并且包含對機票的退訂以及改簽權(quán)限,改簽后會提示改簽前后機票價格信息。[修改密碼模塊]對于已登錄用戶可進行密碼修改。[登錄和注冊模塊]這是對進入系統(tǒng)沒有登錄的用戶的權(quán)限。用戶點擊登錄按鈕跳轉(zhuǎn)到登陸界面。點擊注冊進行注冊,用戶注冊包含對用戶信息的驗證。3.2.2系統(tǒng)流程圖圖3-10系統(tǒng)走向圖4.詳細設(shè)計本系統(tǒng)使用的是JAVA的SERVLET和JSP技術(shù),所以系統(tǒng)的設(shè)計又分為前端JSP頁面設(shè)計和后端業(yè)務(wù)邏輯處理。下面的模塊設(shè)計主要從前端JSP頁面和后端中的SERVLET控制層兩部部分進行講解。4.1登錄模塊登錄模塊進行登錄用戶的用戶名和密碼進行驗證,點擊“快速注冊”還能跳轉(zhuǎn)到注冊界面進行用戶注冊。登錄用戶登錄后,傳遞用戶填寫的用戶名和密碼進入到UserServlet中的loginStu方法進行用戶身份驗證,如果用戶名和密碼輸入錯誤則跳轉(zhuǎn)到登錄頁面。用戶登錄正確則跳轉(zhuǎn)到系統(tǒng)主界面。實現(xiàn)代碼如下: /** *用戶登錄 */ publicvoidloginStu(HttpServletRequestrequest,HttpServletResponseresponsethrowsSQLException,ServletException,IOException{ Stringusername=request.getParameter("username"); Stringpassword=request.getParameter("password"); Stringsql="select*fromuserinfowherename=?andpassword=?"; Objectparames[]=newObject[]{username,password}; System.out.println(username+""+password); //一般用戶登錄(不需要用戶名、密碼) if((username==null||username=="")&&(password==""||password==null)){ response.sendRedirect("main1.jsp"); }else{ //管理員或用戶登錄 List<Map<String,String>>list=fun.login(sql,parames); if(list!=null){ Map<String,String>map=list.get(0); if(username.equals(map.get("name"))&&password.equals(map.get("password"))){ System.out.println("登錄成功~~~"); //判斷是管理員還是用戶登錄 if(map.get("level").equals("1")){ System.out.println("管理員登錄成功?。?!~~~"); HttpSessionsession=request.getSession(); session.setAttribute("username",username); request.getRequestDispatcher("main2.jsp").forward(request,response); }else{ System.out.println("用戶登錄成功?。?!~~~"); HttpSessionsession=request.getSession(); session.setAttribute("username",username); session.setAttribute("psw",password); request.getRequestDispatcher("main3.jsp").forward(request,response); } }else{ System.out.println("登錄失敗~~~~~"); response.sendRedirect("/login.html"); } } else{ System.out.println("list為空,用戶名或密碼錯誤!"); response.sendRedirect("login.html"); } } }登錄成功跳轉(zhuǎn)到系統(tǒng)主界面:圖4-1主界面登錄失敗跳轉(zhuǎn)到登錄界面:圖4-2登錄界面4.2航班管理模塊航班管理包含對航班信息系的查詢、添加、修改和刪除。在航班信息查詢中又分為按航班號和起飛地進行查詢。航班按航班號條件查詢通過調(diào)用selectByhangbanhao方法,把按查詢的條件選擇航班號和查詢的條件值航班值作為參數(shù)傳遞給selectByhangbanhao方法進行查詢。圖4-3按航班號查詢 /** *根據(jù)航班號查詢 */ publicvoidselectByhangbanhao(HttpServletRequestrequest, HttpServletResponseresponse)throwsSQLException,ServletException,IOException{ Stringchaxun=request.getParameter("chaxun"); Stringsql="select*fromflightinfowhereid=?"; if(chaxun==null||chaxun==""){ Objectparames[]=newObject[]{chaxun}; List<Map<String,String>>list=fun.selectFlight(sql,parames); if(list!=null){ System.out.println("根據(jù)航班號查詢成功~~~"); request.setAttribute("flightList",list); request.getRequestDispatcher("user_adminlogin/selectFlight.jsp").forward(request,response); } } }航班按起飛地條件查詢通過調(diào)用selectByqifeidi方法,把按查詢的條件選擇起飛地和查詢的條件值起飛地值作為參數(shù)傳遞給selectByqifeidi方法進行查詢。圖4-4按航班號查詢 /** *根據(jù)起飛地查詢 */ publicvoidselectByqifeidi(HttpServletRequestrequest, HttpServletResponseresponse)throwsServletException,IOException,SQLException{ request.setCharacterEncoding("utf-8"); response.setContentType("txt/html;charset=utf-8"); //轉(zhuǎn)換編碼格式,將前臺輸入數(shù)據(jù)的編碼改為UTF-8; Stringchaxun=request.getParameter("chaxun"); System.out.println("按照起飛地【"+chaxun+"】查詢"); Stringsql="select*fromflightinfowherestart=?"; if(chaxun==null||chaxun==""){ //查詢?nèi)坑涗?request.getRequestDispatcher("adminServlet?caozuo=flightSelect").forward(request,response); }else{ Objectparames[]=newObject[]{chaxun}; List<Map<String,String>>list=fun.selectFlight(sql,parames); if(list!=null){ System.out.println("根據(jù)起飛地查詢成功~~~"); request.setAttribute("flightList",list); request.getRequestDispatcher("user_adminlogin/selectFlight.jsp").forward(request,response); } } }把添加航班的信息通過放在要跳轉(zhuǎn)的URL之后傳遞到Servlet中,在Servlet中進行判斷選擇調(diào)用flightInsert方法,通過INSERT語句向數(shù)據(jù)庫中插入數(shù)據(jù),實現(xiàn)添加航班。圖4-5添加航班 /** *航班添加 */ publicvoidflightInsert(HttpServletRequestrequest, HttpServletResponseresponse)throwsSQLException,ServletException,IOException{ Stringid=request.getParameter("id"); Stringstart=request.getParameter("start"); Stringend=request.getParameter("end"); StringleaveTime=request.getParameter("leaveTime"); Stringsql="insertintoflightinfovalue(?,?,?,?,?,?)"; Objectparames[]=newObject[]{id,airfirm,start,end,leaveTime,arriveTime}; inti=fun.insert(sql,parames); response.sendRedirect("user_adminlogin/newWin.jsp?winValue="+winValue); }}圖4-6刪除航班刪除航班是通過傳遞航班的id號,來確定這條航班記錄。在調(diào)用flightDelete方法通過DELETE語句刪除記錄,實現(xiàn)航班刪除。/** *航班刪除 */ publicvoidflightDelete(HttpServletRequestrequest, HttpServletResponseresponse)throwsSQLException,IOException{ Stringid=request.getParameter("id"); Stringsql="deletefromflightinfowhereid=?"; inti=fun.delete(sql,parames); if(i!=-1){ System.out.println("刪除航班成功~~~"); response.sendRedirect("adminServlet?caozuo=flightSelect"); } }圖4-7修改航班 /** *航班修改 */ privatevoidflightUpdate(HttpServletRequestrequest, HttpServletResponseresponse)throwsSQLException,IOException{ Stringid1=request.getParameter("id1"); Stringid=request.getParameter("id"); Stringairfirm=request.getParameter("airfirm"); Stringstart=request.getParameter("start"); Stringend=request.getParameter("end"); StringleaveTime=request.getParameter("leaveTime"); StringarriveTime=request.getParameter("arriveTime"); Stringsql="updateflightinfosetid=?,airfirm=?,start=?,end=?,leaveTime=?,arriveTime=?whereid=?"; Objectparames[]=newObject[]{id,airfirm,start,end,leaveTime,arriveTime,id1}; inti=fun.update(sql,parames); response.sendRedirect("user_adminlogin/newWin.jsp?winValue="+winValue); } }4.3機票預(yù)訂模塊用戶點擊“機票預(yù)訂”菜單,會進入到機票預(yù)訂界面。頁面中會顯示所以機票的信息,用戶可以根據(jù)起飛地、到達地和日期,進行查詢篩選出所需機票。用戶點擊“訂票”按鈕完成交易。完成訂票后會把機票的票數(shù)修改為原來的值減一,然后在用戶訂單表中插入一條記錄。圖4-8機票預(yù)訂圖4-9機票售完提示4.4我的訂單模塊我的訂單是根據(jù)用戶預(yù)訂機票產(chǎn)生的訂單信息,用戶可以對訂單進行“改簽”和“退票”操作。改簽完成后會彈出改簽前后票價信息的提示。改簽調(diào)用gaiQian方法,在這個方法中把原記錄刪除再添加一條新紀錄。圖4-10我的訂單圖4-11改簽后價格提示4.5修改密碼模塊點擊“修改密碼”菜單,會彈出窗口修改密碼。用戶需要輸入原密碼和兩次新密碼。通過調(diào)用updatePsw方法,在這個方法中用UPDATE語句對密碼信息進行修改。圖4-12修改用戶密碼 /** *修改密碼 */ publicvoidupdatePsw(HttpServletRequestrequest, HttpServletResponseresponse)throwsSQLException,ServletException,IOException{ StringoldPsw=request.getParameter("oldPsw");//獲得原密碼 StringnewPsw=request.getParameter("newPsw"); //獲得新密碼 HttpSessionsession=request.getSession(); Stringname=(String)session.getAttribute("username"); Stringsql="updateuserinfosetpassword=?wherepassword=?andname=?"; Objectparames[]=newObject[]{newPsw,oldPsw,name}; inti=fun.update(sql,parames); response.sendRedirect("user_userlogin/newWin.jsp?"); }4.6用戶注冊模塊用戶注冊可以在登錄界面點擊“快速注冊”進行注冊或者在直接進入系統(tǒng)化點擊菜單里的“注冊”按鈕注冊用戶。實現(xiàn)原理就是調(diào)用zhuCe方法,把注冊的信息傳遞到zhuCe方法,然后INSERT到數(shù)據(jù)庫中。圖4-13修改用戶密碼 /** *用戶注冊 */ publicvoidzhuCe(HttpServletRequestrequest,HttpServletResponseresponse)throwsSQLException,ServletException,IOException{ Stringid=request.getParameter("id"); Stringname=request.getParameter("name"); Stringpassword=request.getParameter("password"); Stringtel=request.getParameter("tel"); Stringidcard=request.getParameter("idcard"); Stringsql="insertintouserinfo(id,name,password,sex,tel,idcard)value(?,?,?,?,?,?)"; Objectparames[]=newObject[]{id,name,password,sex,tel,idcard}; inti=fun.insert(sql,parames); request.getRequestDispatcher("login.html").forward(request,response); } }4.7用戶管理模塊用戶管理員登錄后,可進行用戶信息查詢以及用戶信息的刪除。圖4-14用戶信息管理 /** *用戶刪除 */ publicvoiduserDelete(HttpServletRequestrequest,HttpServletResponseresponse)throwsSQLException,ServletException,IOException{ Stringid=request.getParameter("id"); Stringsql="deletefromuserinfowhereid=?"; Objectparames[]=newObject[]{id}; inti=fun.delete(sql,parames); if(i!=-1){request.getRequestDispatcher("adminServlet?caozuo=userSelect").forward(request,response); } }5.系統(tǒng)測試5.1系統(tǒng)測試的概念軟件測試不僅僅包括程序測試,而是貫穿于整個軟件開發(fā)的全過程,也就是說其對象除了包括需求分析所獲得的開發(fā)成果、還包括概要設(shè)計所獲得的開發(fā)成果、以及包括詳細設(shè)計所獲得的開發(fā)成果、和包括編碼實現(xiàn)所獲得的開發(fā)成果[10]。系統(tǒng)測試是針對整個產(chǎn)品系統(tǒng)進行的測試,目的是驗證系統(tǒng)是否滿足了需求規(guī)格的定義,找出與需求規(guī)格不符或與之矛盾的地方,從而提出更加完善的方案。系統(tǒng)測試發(fā)現(xiàn)問題之后要經(jīng)過調(diào)試找出錯誤原因和位置,然后進行改正。是基于系統(tǒng)整體需求說明書的黑盒類測試,應(yīng)覆蓋系統(tǒng)所有聯(lián)合的部件。對象不僅僅包括需測試的軟件,還要包含軟件所依賴的硬件、外設(shè)甚至包括某些數(shù)據(jù)、某些支持軟件及其接口等比較常見的、典型的系統(tǒng)測試包括恢復(fù)測試、安全測試、壓力測試[11]。下面對這幾種測試進行一一介紹:1)恢復(fù)測試恢復(fù)測試作為一種系統(tǒng)測試,主要關(guān)注導(dǎo)致軟件運行失敗的各種條件,并驗證其恢復(fù)過程能否正確執(zhí)行。在特定情況下,系統(tǒng)需具備容錯能力。另外,系統(tǒng)失效必須在規(guī)定時間段內(nèi)被更正,否則將會導(dǎo)致嚴重的經(jīng)濟損失。2)安全測試安全測試用來驗證系統(tǒng)內(nèi)部的保護機制,以防止非法侵入。在安全測試中,測試人員扮演試圖侵入系統(tǒng)的角色,采用各種辦法試圖突破防線。因此系統(tǒng)安全設(shè)計的準則是要想方設(shè)法使侵入系統(tǒng)所需的代價更加昂貴。3)壓力測試壓力測試是指在正常資源下使用異常的訪問量、頻率或數(shù)據(jù)量來執(zhí)行系統(tǒng)。139845.2測試策略及結(jié)果5.2.1功能的測試概述:功能測試也稱為黑盒測試,就是運行整個系統(tǒng)測試各模塊功能與預(yù)期的功能效果對比是否相同,在測試過程中把整個程序看成一個打不開的黑盒,在完全不考慮程序內(nèi)部結(jié)構(gòu)和內(nèi)部特性的情況下,在程序接口進行測試。就是按照開發(fā)的功能分析和各個模塊的功能設(shè)計進行測試,主要針對軟件界面和軟件功能進行測試。功能測試既是測試的重點,也是測試的難點[12]。目標:功能測試的目標或者說過程就是分別使用有效的和無效的數(shù)據(jù)測試各個功能模塊,測試輸入為有效數(shù)據(jù)時,能否得到與預(yù)期結(jié)果相符的結(jié)果,測試輸入為無效數(shù)據(jù)時,能否得到與預(yù)期相符的提示信息或者警告信息。結(jié)果:測試各模塊,結(jié)果達到目標。下面以機票預(yù)訂和我的訂單功能模塊的測試為例,該模塊測試用例、測試結(jié)果如下:表4-1機票預(yù)訂和我的訂單功能測試用例用例機票預(yù)訂,我的訂單測試類名稱dingPiao、ticketSelecttuiPiao、gaiQian測試目的驗證該模塊的功能測試環(huán)境Windows7、火狐瀏覽器、IE瀏覽器、360瀏覽器測試環(huán)境MyEclipse9.0、MySQL數(shù)據(jù)庫、測試用例標號測試項目輸入描述預(yù)期結(jié)果實際結(jié)果1查詢機票輸入正確的機票信息查詢出對應(yīng)條件的機票信息一致2查詢機票點擊“機票預(yù)訂”菜單按鈕查詢出所有機票信息的記錄一致3查詢機票起飛地錯誤結(jié)果為空一致4查詢機票目的地錯誤結(jié)果為空一致5查詢機票日期錯誤結(jié)果為空一致6查詢機票所有條件為空結(jié)果為空一致7機票預(yù)訂票數(shù)為0提示機票已賣完一致8機票預(yù)訂機票有剩余訂票成功,票數(shù)減1一致9機票預(yù)訂重復(fù)購買提示機票不能重復(fù)購買一致10退票點擊退票退票成功一致11退票飛機起飛前三十分點擊退票退票失敗一致12改簽點擊改簽后選擇預(yù)定的機票改簽成功一致13改簽完成改簽顯示改簽前后機票價格一致14改簽點擊改簽后不選擇預(yù)定的機票改簽失敗一致15改簽點擊改簽后進行其他操作改簽失敗一致16改簽點擊改簽后點擊退出系統(tǒng)按鈕退出當前系統(tǒng)成功,改簽失敗一致5.2.2其他測試1、性能的測試概述:性能的測試是為了獲得系統(tǒng)的最大負載和最大處理能力等等數(shù)據(jù),其主要是通過評測和評估非功能性需求來獲得的,包括評測和評估系統(tǒng)處理速度、系統(tǒng)響應(yīng)時間以及其他與時間相關(guān)的數(shù)據(jù)[13]。目標:性能的測試的目標是測試在正常負荷下運行的系統(tǒng)的預(yù)期工作量。結(jié)果:經(jīng)過測試,得出系統(tǒng)平均響應(yīng)時間、處理速度、最大負載等性能達到目標。2、壓力的測試概述:壓力的測試也就是系統(tǒng)承受壓力的測試,既有高壓測試又有負載測試。目標:壓力的測試主要就是要掌握系統(tǒng)的安全運行性能,這就需要了解系統(tǒng)在長時間處理多個用戶相同的且性能最壞的業(yè)務(wù)的情況下的安全運行邊界條件,這就需要測試系統(tǒng)在給定時間內(nèi)能夠持續(xù)處理的最大工作量或最大負載。結(jié)果:經(jīng)過測試,系統(tǒng)在所需最大負荷兩倍的條件下,仍能夠正常運轉(zhuǎn)。5、配置的測試概述:配置的測試主要是確認系統(tǒng)的使用范圍,這需要測試系統(tǒng)在不同的軟件配置中的運行情況以及在不同的硬件配置中的運行情況[14];目標:配置的測試的目標就是測試系統(tǒng)在不同條件下是否能夠正常運行,這就包括測試系統(tǒng)在所需的軟件配置以及所需的硬件配置中,也就是說在正常配置下,運行是否正常。測試系統(tǒng)的兼容性,也就是測試在其他版本的瀏覽器操作或者在其他系統(tǒng)平臺的異常情況下,系統(tǒng)是否兼容,也就是說系統(tǒng)是否能夠正常運行[15]。結(jié)果:系統(tǒng)在主流操作系統(tǒng)WindowsXP、Windows7,火狐瀏覽器,IE瀏覽器,360瀏覽器以及其他操作系統(tǒng)和瀏覽器上都可以正常運行。6.結(jié)語經(jīng)過兩個月的忙碌整個畢業(yè)設(shè)計和論文已全部完成,總結(jié)這兩個月的經(jīng)歷感覺真的學(xué)到了很多。從最開始的不知從何下手到最后的全部完成,這中間我付出了很多努力同時也收獲了很多。這次的畢業(yè)設(shè)計不僅僅是對我大學(xué)四年所學(xué)的總結(jié),還是對我能力的一個考驗。因為想要完成一個優(yōu)秀的畢業(yè)設(shè)計僅依靠大學(xué)中所學(xué)習(xí)到知識是完全不夠的,但我經(jīng)過四年的學(xué)習(xí)也具備了自學(xué)的能力,我通過查找相關(guān)的資料書籍以及用過網(wǎng)絡(luò)資源獲取來幫助我完成畢業(yè)設(shè)計。拿到這個畢業(yè)設(shè)計題目,首先我們從系統(tǒng)的需求分析入手,我們將系統(tǒng)要實現(xiàn)的功能和估計要用到的相關(guān)技術(shù)及相關(guān)技術(shù)難點進行分析。接下來就是進行系統(tǒng)的總體設(shè)計,首先將系統(tǒng)的結(jié)構(gòu)進行分析,分析這個系統(tǒng)需要完成哪些功能,將這些功能劃分為多個模塊,這樣在設(shè)計上我們就將軟件分成一個立體的,低偶合的一個一個的小模塊。我先從簡單的模塊開始著手編寫代碼,然后一點點的完成整個項目的開發(fā)。

本次系統(tǒng)設(shè)計中我也遇到了很到問題,主要是缺少項目經(jīng)驗。有些只是可能會但是在實際項目開發(fā)中一不小心就會出錯。還有在做系統(tǒng)時不能把以前學(xué)過的知識都綜合到一起。每當遇到這樣或那樣的問題時,我都通過網(wǎng)上查閱相關(guān)資料,一些沒有接觸過的知識也是從頭開始學(xué)起,在這個過程中讓我的進步非常大通過解決這一個個難點不僅是對我知識的積累也是對我學(xué)習(xí)能力的提高,這一點對我今后的工作有很大的幫助。另外在這次做系統(tǒng)的過程中,我認為軟件最難的是設(shè)計,設(shè)計有了,實現(xiàn)是很簡單的,所以也為我指明了以后學(xué)習(xí)的方向。

系統(tǒng)中難免有不盡人意之處,如系統(tǒng)的安全性能有待提高,系統(tǒng)的通用性也需要完善。由于本人的知識水平和能力有限,本文的疏漏和不當之處在所難免,敬請指正。我也會努力盡量完善所有編寫的功能模塊,完美的完成這個畢業(yè)設(shè)計,為我的大學(xué)劃上一個圓滿的句號。參考文獻[1]良葛格.Java學(xué)習(xí)筆記(第一版)[M].北京:清華大學(xué)出版社,2006.[2]孫衛(wèi)琴.精通Hibernate:Java面向持久化技術(shù)詳解[M].北京:電子工業(yè)出版社,2007.[3]盧曉慶.基于Web的交通旅游訂票系統(tǒng)的設(shè)計與實現(xiàn)[D].大連:大連理工大學(xué),2004.[4]薩師煊,王珊.數(shù)據(jù)庫系統(tǒng)概論[M].北京:高等教育出版社,2003.[5]張水平.數(shù)據(jù)庫應(yīng)用技術(shù)[M].西安:西北工業(yè)大學(xué)出版社,2005.[6]楊小平.VisualC++項目案例導(dǎo)航[M].北京:科學(xué)出版社,2005.[7]李閩溟,吳繼剛.數(shù)據(jù)庫系統(tǒng)開發(fā)實例[M].北京:人民郵電出版社,2002.[8]鄭阿奇,丁有和.VisualC++教程[M].北京:機械工業(yè)出版社,2004.[9]蔡學(xué)鏞.Java程序員的心聲第2版[M].北京:電子工業(yè)出版社,2004.[10]姜志強.Java語言程序設(shè)計[M].北京:電子工業(yè)出版社,2007.[11]田苗苗.基于面向?qū)ο蠹夹g(shù)開發(fā)[J].面向?qū)ο笱芯?2004,(02):134-139.[12]BruceEckel.《ThinkinginJava4》[M].American:PrenticeHallPTR,2007.[13]A.Parasan.《marketingresearch》[M].American:HoughtonCompany,2007.[14]MichaclHammer.《ReengineeringtheCorporation》[M].American:HarperBusiness,1993.附錄ADO層JDBC建立數(shù)據(jù)庫的連接:packagecom.nite.dao;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importorg.junit.Test;/***@author:劉賢龍*@功能:JDBC*@時間:2015.3*/publicclassDao{ Connectioncon=null; PreparedStatementps=null; ResultSetrs=null;publicDao(){} static{ try{ Class.forName("com.mysql.jdbc.Driver"); }catch(ClassNotFoundExceptione){ e.printStackTrace(); } } /** *數(shù)據(jù)庫連接 *@throwsSQLException */ @Test publicvoidgetConnect()throwsSQLException{ Stringurl="jdbc:mysql://localhost:3306/ticketsystem"; Stringuser="root"; Stringpassword="liu"; con=DriverManager.getConnection(url,user,password); if(con!=null){ System.out.println("連接數(shù)據(jù)庫成功"); }else{ System.out.println("連接數(shù)據(jù)庫失敗"); } } /** *執(zhí)行sql *return:影響行數(shù) *@throwsSQLException */ publicintdoSql(Stringsql,Objectparames[])throwsSQLException{ getConnect(); ps=con.prepareStatement(sql); for(inti=0;i<parames.length;i++){ ps.setObject(i+1,parames[i]); } ps.execute(); inti=ps.getUpdateCount(); returni; } /** *獲得結(jié)果集 *@throwsSQLException *return:結(jié)果集 */ publicResultSetgetRs()throwsSQLException{ rs=ps.getResultSet(); returnrs; } /** *關(guān)閉資源 *@throwsSQLException */ publicvoidgetClose()throwsSQLException{ if(rs!=null) rs.close(); if(ps!=null) ps.close(); if(con!=null) con.close(); }}2、SERVICE(業(yè)務(wù)邏輯層)層處理業(yè)務(wù)邏輯:packagecom.nite.service;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcom.nite.dao.Dao;publicclassFunction{ privateDaodao=newDao(); /** *查詢航班 *@paramsql *@paramparames *@return *@throwsSQLException */ publicList<Map<String,String>>selectFlight(Stringsql,Object[]parames)throwsSQLException{ List<Map<String,String>>list=newArrayList<Map<String,String>>(); dao.doSql(sql,parames); ResultSetrs=dao.getRs(); rs.last(); inti=rs.getRow(); System.out.println("結(jié)果集中有"+i+"條記錄"); if(i>0){ rs.beforeFirst(); while(rs.next()){ Stringid=rs.getString("id"); Stringairfirm=rs.getString(2); Stringstart=rs.getString(3); Stringend=rs.getString(4); StringleaveTime=rs.getString(5); StringarriveTime=rs.getString(6); Map<String,String>map=newHashMap<String,String>(); map.put("id",id); map.put("airfirm",airfirm); map.put("start",start); map.put("end",end); map.put("leaveTime",leaveTime); map.put("arriveTime",arriveTime); list.add(map); } }else{ list=null; } dao.getClose(); returnlist; } /** *查詢機票 *@throwsSQLException */ publicList<Map<String,String>>selectTicket(Stringsql,Object[]parames)throwsSQLException{ List<Map<String,String>>list=newArrayList<Map<String,String>>(); dao.doSql(sql,parames); ResultSetrs=dao.getRs(); rs.last(); inti=rs.getRow(); System.out.println("結(jié)果集中有"+i+"條記錄"); if(i>0){ rs.beforeFirst(); while(rs.next()){ Stringid=rs.getString("id"); Stringstart=rs.getString(2); Stringend=rs.getString(3); StringleaveTime=rs.getString(4); StringarriveTime=rs.getString(5); Stringtime=rs.getString(6); StringseatLevel=rs.getString(7); Stringfare=rs.getString(8); Stringdiscount=rs.getString(9); Stringflight_id=rs.getString(10); StringticketNum=rs.getString(11); Map<String,String>map=newHashMap<String,String>(); map.put("id",id); map.put("start",start); map.put("end",end); map.put("leaveTime",leaveTime); map.put("arriveTime",arriveTime); map.put("time",time); map.put("seatLevel",seatLevel); map.put("fare",fare); map.put("discount",discount); map.put("flight_id",flight_id); map.put("ticketNum",ticketNum); list.add(map); } }else{ list=null; } dao.getClose(); returnlist; } /** *添加 *@paramsql *@paramparames *@return *@throwsSQLException */ publicintinsert(Stringsql,Object[]parames)throwsSQLException{ inti=dao.doSql(sql,parames); System.out.println("影響行數(shù)"+i); dao.getClose(); returni; } /** *刪除 *@paramsql *@paramparames *@throwsSQLException */ publicintdelete(Stringsql,Object[]parames)throwsSQLException{ inti=dao.doSql(sql,parames); System.out.println("影響行數(shù):"+i); dao.getClose(); returni; } /** *修改 *@paramsql *@paramparames *@throwsSQLException */ publicintupdate(Stringsql,Object[]parames)throwsSQLException{ inti=dao.doSql(sql,parames); System.out.println("影響行數(shù):"+i); dao.getClose(); returni; } /** *登錄 *@throwsSQLException */ publicList<Map<String,String>>login(Stringsql,Objectparames[])throwsSQLException{ dao.doSql(sql,parames); ResultSetrs=dao.getRs(); List<Map<String,String>>list=newArrayList<Map<String,String>>(); rs.last(); inti=rs.getRow(); if(i>0){ rs.beforeFirst(); while(rs.next()){ Stringname=rs.getString("name"); Stringpassword=rs.getString("password"); Stringlevel=rs.getString("level"); Map<String,String>map=newHashMap<String,String>(); map.put("name",name); map.put("password",password); map.put("level",level); list.add(map); } }else{ list=null; } returnlist; } /** *用戶查詢 *@paramsql *@paramparames *@throwsSQLException */ publicList<Map<String,String>>selectUser(Stringsql,Object[]parames)throwsSQLException{ List<Map<String,String>>list=newArrayList<Map<String,String>>(); dao.doSql(sql,parames); ResultSetrs=dao.getRs(); rs.last(); inti=rs.getRow(); if(i>0){ rs.beforeFirst(); while(rs.next()){ Stringid=rs.getString("id"); Stringname=rs.getString(2); Stringpassword=rs.getString("password"); Stringsex=rs.getString(4); Stringtel=rs.getString(5); Stringidcard=rs.getString(6); Stringlevel=rs.getString("level"); Map<String,String>map=newHashMap<String,String>(); map.put("id",id); map.put("name",name); map.put("password",password); map.put("sex",sex); map.put("tel",tel); map.put("idcard",idcard); map.put("level",level); list.add(map); } }else{ list=null; } returnlist; } /** *查詢訂單 *@throwsSQLException */ publicList<Map<String,String>>selectMyTicket(Stringsql,Object[]parames)throwsSQLException{ List<Map<String,String>>list=newArrayList<Map<String,String>>(); dao.doSql(sql,parames); ResultSetrs=dao.getRs(); rs.last(); inti=rs.getRow(); System.out.println("結(jié)果集中有"+i+"條記錄"); if(i>0){ rs.beforeFirst(); while(rs.next()){ Stringid=rs.getString("id"); Stringstart=rs.getString(2); Stringend=rs.getString(3); StringleaveTime=rs.getString(4); StringarriveTime=rs.getString(5); Stringtime=rs.getString(6); StringseatLevel=rs.getString(7); Stringfare=rs.getString(8); Stringname=rs.getString(9); Stringidcard=rs.getString(10); Stringflight_id=rs.getString(11); Map<String,String>map=newHashMap<String,String>(); map.put("id",id); map.put("start",start); map.put("end",end); map.put("leaveTime",leaveTime); map.put("arriveTime",arriveTime); map.put("time",time); map.put("seatLevel",seatLevel); map.put("fare",fare); map.put("name",name); map

溫馨提示

  • 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論