航空訂票系統(tǒng)詳細(xì)設(shè)計(jì)_第1頁(yè)
航空訂票系統(tǒng)詳細(xì)設(shè)計(jì)_第2頁(yè)
航空訂票系統(tǒng)詳細(xì)設(shè)計(jì)_第3頁(yè)
航空訂票系統(tǒng)詳細(xì)設(shè)計(jì)_第4頁(yè)
航空訂票系統(tǒng)詳細(xì)設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、詳細(xì)設(shè)計(jì)報(bào)告一、引言 1.1 編寫目的: 本階段在系統(tǒng)的需求分析的基礎(chǔ)上,對(duì)航空訂票系統(tǒng)做詳細(xì)設(shè)計(jì)。主要解決了實(shí)現(xiàn)該系統(tǒng)程序模塊具體設(shè)計(jì)問題。包括確定算法,數(shù)據(jù)結(jié)構(gòu),模塊接口的使用,數(shù)據(jù)庫(kù)的動(dòng)態(tài)操作以及界面設(shè)計(jì)等。在以下的概要設(shè)計(jì)報(bào)告中將對(duì)在本階段中對(duì)系統(tǒng)所做的所有詳細(xì)設(shè)計(jì)進(jìn)行詳細(xì)的說明。在下一階段的編碼過程中,程序設(shè)計(jì)員可參考此詳細(xì)設(shè)計(jì)報(bào)告,在詳細(xì)設(shè)計(jì)對(duì)機(jī)票預(yù)定系統(tǒng)所做的算法設(shè)計(jì),數(shù)據(jù)結(jié)構(gòu)以及數(shù)據(jù)庫(kù)動(dòng)態(tài)操作的基礎(chǔ)上,對(duì)系統(tǒng)進(jìn)行編碼。1.2 項(xiàng)目背景: 開發(fā)軟件名稱:航空訂票系統(tǒng)。用戶:航空公司運(yùn)行環(huán)境:宿舍電腦。 開發(fā)平臺(tái):MyEclipse 7.0 PostgreSql數(shù)據(jù)庫(kù)。系統(tǒng)架構(gòu):該

2、系統(tǒng)采用java+jsp框架1.3 定義: 查詢:對(duì)數(shù)據(jù)庫(kù)的操作的一種,用于搜索數(shù)據(jù)信息。 插入:對(duì)數(shù)據(jù)庫(kù)的操作的一種,用于將數(shù)據(jù)存入數(shù)據(jù)庫(kù)中。 更新:對(duì)數(shù)據(jù)庫(kù)的操作的一種,用于更改數(shù)據(jù)庫(kù)中的數(shù)據(jù)信息。 PostgreSql: 系統(tǒng)服務(wù)器所使用的數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)。 SQL: 一種用于訪問查詢數(shù)據(jù)庫(kù)的語(yǔ)言 事務(wù)流:數(shù)據(jù)進(jìn)入模塊后可能有多種路徑進(jìn)行處理。 主鍵:數(shù)據(jù)庫(kù)表中的關(guān)鍵域。值互不相同。 外部主鍵:數(shù)據(jù)庫(kù)表中與其他表主鍵關(guān)聯(lián)的域。1.4 參考資料: 需求分析說明書 軟件開發(fā)小組 軟件工程 齊治昌 譚慶平 寧洪等高等教育出版社 實(shí)用軟件工程 鄭人杰等,清華大學(xué)出版社。二、總體設(shè)計(jì) 2

3、.1 需求概述 航空訂票系統(tǒng)的總目標(biāo)是:在計(jì)算機(jī)網(wǎng)絡(luò),數(shù)據(jù)庫(kù)和先進(jìn)的開發(fā)平臺(tái)上,利用現(xiàn)有的軟件,配置一定的硬件,開發(fā)一個(gè)具有開放體系結(jié)構(gòu)的、易擴(kuò)充的、易維護(hù)的、具有良好人機(jī)交互界面的機(jī)票預(yù)定系統(tǒng),實(shí)現(xiàn)航空公司的機(jī)票銷售的自動(dòng)化的計(jì)算機(jī)系統(tǒng),為企業(yè)的決策層提供準(zhǔn)確、精細(xì)、迅速的機(jī)票銷售信息。具體功能為用戶把預(yù)定機(jī)票的旅客信息(姓名、性別、身份證號(hào)碼(護(hù)照號(hào)碼)、乘坐時(shí)間、出行始發(fā)地和目的地等)輸入到系統(tǒng)中,系統(tǒng)為旅客安排航班。當(dāng)旅客交付了預(yù)訂金后,系統(tǒng)打印出取票通知和帳單給旅客,旅客在飛機(jī)起飛前一天憑取票通知和帳單交款取票,系統(tǒng)核對(duì)無誤即打印出機(jī)票給旅客。此外航空公司為隨時(shí)掌握各個(gè)航班飛機(jī)的乘載

4、情況,需要定期進(jìn)行查詢統(tǒng)計(jì),以便適當(dāng)調(diào)整。同時(shí)還需完成旅客延誤了取票時(shí)間的處理,航班取消后的處理,旅客臨時(shí)更改航班的處理等。根據(jù)可行性研究的結(jié)果和客戶的要求,分析現(xiàn)有情況及問題,采用B/S結(jié)構(gòu),將機(jī)票預(yù)定系統(tǒng)劃主要就是服務(wù)器端子系統(tǒng)。2.2 軟件結(jié)構(gòu): 航空訂票系統(tǒng)數(shù)據(jù)輸入數(shù)據(jù)輸出數(shù)據(jù)輸入頁(yè)面信息錄入用戶登陸或注冊(cè)數(shù)據(jù)處理、查詢數(shù)據(jù)判斷PostgreSql判斷查詢數(shù)據(jù)庫(kù)操作返回賬單等確定錯(cuò)誤原因返回機(jī)票信息打印賬單等顯示錯(cuò)誤原因打印機(jī)票圖1軟件結(jié)構(gòu)圖三、程序描述 3.1 各功能詳細(xì)描述:本系統(tǒng)主要用于機(jī)票預(yù)訂,所以提供了以下幾個(gè)子功能:機(jī)票預(yù)訂,取票通知,查詢航班,查詢機(jī)票,退票,打印機(jī)票,各

5、航班的營(yíng)運(yùn)統(tǒng)計(jì),以及后臺(tái)方面的航班的添加,取消航班,機(jī)票的生成,以及航班的查詢等后臺(tái)功能。1、機(jī)票預(yù)訂功能:用戶和機(jī)場(chǎng)管理員有權(quán)力進(jìn)行該項(xiàng)功能。首先通過查詢得到旅客所需的航班,確定該航班還有沒有被預(yù)訂的座位,然后選擇座位的等級(jí),填寫旅客的詳細(xì)信息之后就可進(jìn)行網(wǎng)上預(yù)訂機(jī)票。2、取票通知:該項(xiàng)功能只有用戶和機(jī)場(chǎng)管理員有權(quán)力進(jìn)行操作,在機(jī)票預(yù)訂功能成功完成之后,系統(tǒng)會(huì)自動(dòng)給瀏覽器端發(fā)送一條取票信息以及所需繳納的費(fèi)用。旅行社可以利用特定設(shè)備將該取票信息打印出來,這就是取票通知。3、查詢航班:可以通過輸入出發(fā)地,目的地,日期和時(shí)間選定自己航班。4、查詢機(jī)票:該項(xiàng)功能用戶、游客、管理員都可以操作,可以通過

6、自己的身份證號(hào)以及取票通知上的機(jī)票號(hào)查詢自己的機(jī)票信息。5、退訂機(jī)票:該功能只有用戶和機(jī)場(chǎng)管理員有權(quán)力操作,利用身份證號(hào)和對(duì)應(yīng)的機(jī)票號(hào)就可以查詢到機(jī)票信息,然后就可以退訂機(jī)票。6、打印機(jī)票:該功能只有機(jī)場(chǎng)管理員有權(quán)力操作,只有當(dāng)管理員確認(rèn)旅客已經(jīng)付款后才予以打印機(jī)票,可以通過身份證號(hào)和對(duì)應(yīng)的取票信息上的機(jī)票號(hào)查詢機(jī)票信息,然后服務(wù)器返回機(jī)票信息,管理員就可以打印該機(jī)票信息,交給旅客。7、各航班的營(yíng)運(yùn)統(tǒng)計(jì):該項(xiàng)功能只有機(jī)場(chǎng)管理員才能操作,他可以通過輸入年份和月份查詢當(dāng)月個(gè)航班的營(yíng)運(yùn)情況,以便機(jī)場(chǎng)能夠及時(shí)掌握航班動(dòng)態(tài)。8、后臺(tái)的航班添加:該項(xiàng)功能只有機(jī)場(chǎng)管理員才能操作,他通過提供航班的具體信息添加

7、航班信息。9、后臺(tái)的取消航班:該項(xiàng)功能只有機(jī)場(chǎng)管理員才能操作,先通過航班號(hào)和航班日期查詢到航班信息后,取消航班就可以將該航班從數(shù)據(jù)庫(kù)中刪除。10、后臺(tái)的航班查詢:該項(xiàng)功能只有機(jī)場(chǎng)管理員才能操作,通過航班號(hào)和航班日期查詢到航班信息。11、后臺(tái)的機(jī)票生成:該項(xiàng)功能只有機(jī)場(chǎng)管理員才能操作,可以通過該項(xiàng)功能給剛添加的航班生成對(duì)應(yīng)的飛機(jī)票號(hào)紀(jì)錄。3.2 主要的系統(tǒng)功能模塊如下:1、用戶模塊:用戶用例圖如圖2所示(1)用戶登陸模塊ConsumerDAO.getConsumer()(2)用戶注冊(cè)模塊ConsumerDAO.register()(3)查詢航班模塊ConsumerDAO.getFlightByI

8、nformation()(4)訂票模塊ConsumerDAO.orderTicket()(5)修改密碼模塊ConsumerDAO.modifyPassword() (6)付款模塊ConsumerDAO.paying() (7)退票模塊ConsumerDAO.returnTicket()用戶注冊(cè)或登錄 搜索飛機(jī)票普通用戶刪除已定機(jī)票生成交易信息并請(qǐng)用戶確認(rèn)預(yù)訂飛機(jī)票付款 圖22、管理員模塊:管理員用例圖如圖3所示(1)管理員登陸模塊ManagerDAO.getManager()(2)管理員修改密碼模塊ManagerDAO.modifyPassword()(3)刪除用戶ManagerDAO.del

9、eteConsumer()(4)添加新管理員ManagerDAO.addManager()(5)刪除管理員模塊ManagerDAO.deleteManager()(6)發(fā)布新航班模塊ManagerDAO.addNewFlight()(7)刪除航班模塊ManagerDAO.deleteFlight()(8)根據(jù)信息查看航班信息模塊ConsumerDAO.getFlightByInformation()管理員修改密碼管理員登錄刪除管理員增加新管理員查看航班信息 刪除用戶管理員 刪除航班發(fā)布新航班圖3 3、創(chuàng)新點(diǎn)通過關(guān)鍵字從其他網(wǎng)站找到一些信息推薦給用戶模塊:用例如圖4所示。 推薦信息模塊Infor

10、mationDAO.getInformationByKeyWord() 交通狀況附近餐館信息附近旅館信息 信息采集器3.3數(shù)據(jù)庫(kù)設(shè)計(jì):普通用戶(Consumer)字段名字段類型是否為空默認(rèn)值字段含義注釋consumerIdVARCHAR2(10)N用戶編號(hào)用以標(biāo)示不同用戶。consumerNameVARCHAR2(20)N用戶名稱用戶自己取的名字有利于用戶記憶,可以用來登錄等。consumerPasswordVARCHAR2(20)N用戶密碼用于確定用戶身份。consumerGenderVARCHAR2(1)N用戶性別consumerBookingFligtVARCHAR2(20)Y用戶已訂票

11、航班用于儲(chǔ)存用戶已訂票的航班。consumerBookingSeatVARCHAR2(20)Y用戶已定機(jī)票的座位號(hào)用于儲(chǔ)存用戶已訂票航班的座位號(hào)。consumerIDCardOrPassportNoVARCHAR2(20)N用戶的身份證號(hào)或護(hù)照號(hào)用戶取票的憑證(身份證號(hào)或護(hù)照號(hào))consumerTelephoneVARCHAR2(11)N聯(lián)系電話用已與用戶取得聯(lián)系consumerMailBoxVARCHAR2(20)N電子郵箱用已與用戶取得聯(lián)系管理員(Manager)字段名字段類型是否為空默認(rèn)值字段含義注釋managerIdVARCHAR2(10)N管理員編號(hào)用以標(biāo)示不同管理員。manager

12、NameVARCHAR2(20)N管理員名稱管理員自己取的名字有利于其記憶,可以用來登錄等。managerPasswordVARCHAR2(20)N管理員密碼用于確定管理員身份。航班表(FLIGHT)字段名字段類型是否為空默認(rèn)值字段含義注釋flightIdCHAR(6)N飛機(jī)編號(hào)PRIMARY KEYstartDateDATEN出發(fā)日期飛機(jī)起飛的日期endDateDATEN到達(dá)日期飛機(jī)到達(dá)的日期fromAddressVARCHAR2(20)N出發(fā)地點(diǎn)飛機(jī)起飛地點(diǎn)toAddressVARCHAR2(20)N到達(dá)地點(diǎn)飛機(jī)目的地startTimeDATEN出發(fā)時(shí)間起飛時(shí)間endTimeDATEN到達(dá)

13、時(shí)間到達(dá)目的地時(shí)間schedulerCHAR(7)N班期sailLengthNUMBER(5)N航程 座位表(FLIGHT)字段名字段類型是否為空默認(rèn)值字段含義注釋flightIdCHAR(6)N飛機(jī)編號(hào)flight_numberCHAR(6)N航班號(hào)PRIMARY KEYfirst_class_remain_seatsNUMBER(3)N頭等艙剩余座位數(shù)飛機(jī)到達(dá)的日期business_class_remain _seatsNUMBER(3)N公務(wù)艙剩余座位數(shù)economy_class_remain _seatsNUMBER(3)N經(jīng)濟(jì)艙剩余座位數(shù)priceoffNUMBER(4,2)N季節(jié)折

14、扣calendarDATEN出發(fā)日期3.4、流程圖:客戶端啟動(dòng)登錄有效數(shù)據(jù)?出票航班查詢修改密碼Noyes輸入查詢條件驗(yàn)證有效?Noyes已查航班?No輸入乘客信息驗(yàn)證有效?Noyes輸入新密碼驗(yàn)證有效?Noyes封裝request對(duì)象將request對(duì)象寫向服務(wù)器分揀請(qǐng)求調(diào)用FligthDao調(diào)用TicketOrderDAO調(diào)用BranchDao調(diào)用BranchDao出票請(qǐng)求查詢航班請(qǐng)求修改密碼請(qǐng)求登陸請(qǐng)求封裝response對(duì)象將response對(duì)象寫往客戶端解析request對(duì)象將結(jié)果顯示在客戶端圖5流程圖3.5 DAO 接口設(shè)計(jì)設(shè)計(jì)了通用的DAO接口,而不是直接寫訪問數(shù)據(jù)庫(kù)的實(shí)現(xiàn)類,這

15、樣可以創(chuàng)建不同的實(shí)現(xiàn)類來實(shí)現(xiàn)接口,使標(biāo)準(zhǔn)制定和標(biāo)準(zhǔn)實(shí)現(xiàn)分離。當(dāng)換了數(shù)據(jù)庫(kù),或者換了數(shù)據(jù)庫(kù)訪問技術(shù),就可以寫新的實(shí)現(xiàn)類,不用改變?cè)瓉淼拇a。如定義FlightDAO接口,若從文件中讀取數(shù)據(jù)可以定義FlightDaoFromFile實(shí)現(xiàn)類,若利用JDBC訪問數(shù)據(jù)可以定義FlightDaoFromJDBC實(shí)現(xiàn)類,若利用hibernate訪問數(shù)據(jù)可以定義FlightDaoFromHibernate實(shí)現(xiàn)類等。3.5.1 FlightDAOflightDAO用來航班計(jì)劃,航班的數(shù)據(jù)訪問。package com.tarena.abs.dao;import com.tarena.abs.model.*;imp

16、ort java.util.*;/對(duì)航班和航班計(jì)劃數(shù)據(jù)訪問的接口。public interface FlightDAO / 根據(jù)指定出發(fā)地,目的地和出發(fā)日期在底層數(shù)據(jù)源中查找 /得到所有的航班對(duì)象的集合。public Set getAllFlights(String fromAddr,String toAddr,Calendar date); /執(zhí)行出票的操作。public boolean order(Order ord);/添加指定的航班計(jì)劃對(duì)象。public boolean addFlightSchedular(FlightSchedular fs); /根據(jù)給定的航班編號(hào)在底層數(shù)據(jù)源中刪

17、除該航班計(jì)劃,/以及該計(jì)劃下的所有航班。public boolean removeFlightSchedular(String flightNumber);/ 得到所有航班計(jì)劃對(duì)象public Set getAllFlightSchedulars();/添加航班public boolean addFlight(Flight fl);3.5.2 TicketOrderDAOTicketOrderDAO用來訪問票單數(shù)據(jù)。package com.tarena.abs.dao;import java.util.Set;import java.util.Calendar;import com.taren

18、a.abs.model.*;/ 機(jī)票出票記錄訪問接口public interface TicketOrderDAO / 執(zhí)行出票的操作。public boolean order(Order ord);/ 執(zhí)行退票操作。public boolean cancelOrder(int TicketNumber);/ 查詢指定營(yíng)業(yè)網(wǎng)點(diǎn)在指定時(shí)間段內(nèi)的出票記錄public Set<TicketOrder> getAllTicketOrder(Branch branch,Calendar startDate,Calendar endDate);/ 得到指定營(yíng)業(yè)網(wǎng)點(diǎn)指定日期內(nèi)的營(yíng)業(yè)額。publi

19、c double getAllTicketMoney(Branch branch,Calendar startDate,Calendar endDate);/得到所有營(yíng)業(yè)網(wǎng)點(diǎn)指定日期內(nèi)的營(yíng)業(yè)額public double getAllTicketMoney(Calendar startDate,Calendar endDate);/查詢所有出票信息public Set<TicketOrder> getAllTicketOrder();4 關(guān)健代碼分析4.1流程代碼分析服務(wù)器啟動(dòng)時(shí)讀取配置文件,讀取數(shù)據(jù),并且服務(wù)器端ServerSocket 等待客戶端線程訪問,當(dāng)收到客戶端相應(yīng)后,則創(chuàng)

20、建一個(gè)新的服務(wù)線程 執(zhí)行服務(wù)。ServerSocket ss=null;Socket s=null;try /創(chuàng)建服務(wù)器socketss=new ServerSocket(Integer.parseInt(pro.getProperty("ServerPort");while(true)s=ss.accept();/轉(zhuǎn)發(fā)給serverThread處理(傳遞socket參數(shù))new ServerThread(s).start() catch (IOException e) e.printStackTrace();服務(wù)線程ServerThread通過構(gòu)造函數(shù)接受socket,然

21、后轉(zhuǎn)發(fā)給Controllerpublic class ServerThread extends ThreadSocket s;protected ServerThread(Socket s) /用傳入的socket初始化this.s=s;public void run()try new Controller(s).handle(); /交給控制器處理 catch (Exception e) e.printStackTrace(); finally trys.close();catch(IOException e) 由controller調(diào)用handle方法,分析請(qǐng)求對(duì)象。 if(type.eq

22、uals("login") / 登陸處理 loginHandle(req);else if(type.equals("flightSearch") /航班計(jì)劃查詢處理flightSearchHandle(req);else if(type.equals("order") /訂單處理orderHandle();else if(type.equals("quit") /退出處理/quitHandle();break;else if(type.equals("modifyPasswd")modifyP

23、asswd(req);有不同的處理程序,調(diào)用相應(yīng)的dao將查詢信息封裝到response中。hs=(HashSet)(flightDao.getAllFlights(fromAddr,toAddr,cal);Response res=new Response("flightSearch");res.setData(hs);4.2用表格顯示表單 當(dāng)客戶端查詢到航班計(jì)劃時(shí),把flightlist航班集合傳給FlightTableModel,再把FLightTableModel傳給JTable,然后把JTable加入JScorllPane,就會(huì)自動(dòng)顯示數(shù)據(jù)。FlightTable

24、Model ftm = new FlightTableModel(flightlist);JTable jt = new JTable(ftm);ClientMainClass.clientFrame.setTable(jt);FlightTableModel實(shí)現(xiàn)了AbstractTableModel接口,實(shí)現(xiàn)了如下四個(gè)方法。package com.tarena.abs.client;import javax.swing.table.*;import java.util.*;import com.tarena.abs.model.*;public class FlightTableModel

25、extends AbstractTableModelArrayList s;public FlightTableModel(ArrayList s)this.s=s;/獲得列名public String getColumnName(int arg0) switch(arg0)case 0: return "航班號(hào)"case 1: return "出發(fā)地"case 2: return "目的地"case 3: return "起飛時(shí)間"case 4: return "到達(dá)時(shí)間"case 5: re

26、turn "機(jī)型"case 6: return "票價(jià)"case 7: return "頭等艙"case 8: return "公務(wù)艙"case 9: return "經(jīng)濟(jì)艙"default: return null;/獲得行數(shù)public int getColumnCount() return 10;/獲得列數(shù)public int getRowCount() return s.size();/獲得指定位置的值public Object getValueAt(int row, int col)

27、Flight f=(Flight)s.get(row);if(row<0 | row>s.size()return null;switch(col)case 0: return f.getSch().getFlightNumber();case 1: return f.getSch().getFromAddress();case 2: return f.getSch().getToAddress();case 3: return f.getSch().getFromTime();case 4: return f.getSch().getToTime();case 5: return

28、 f.getSch().getPlane();case 6: return (int)(f.getSch().getPrice()*f.getPriceOff();case 7: return f.getFCSRemain();case 8: return f.getBCSRemain();case 9: return f.getECSRemain();default: return null; 4.3 Hibernate映射關(guān)系1、構(gòu)建pojo(Plain Old Java Objects)對(duì)象用JDBC儲(chǔ)存數(shù)據(jù)時(shí),涉及多個(gè)表格的修改,查找。工作難度較大。所以考慮用hibernate實(shí)現(xiàn)數(shù)據(jù)

29、儲(chǔ)存。首先把模型改寫為標(biāo)準(zhǔn)pojo。(1) 添加Long 類型的oid屬性。(2) 為保存每個(gè)屬性添加getter,setter方法。(3) 添加無參構(gòu)造函數(shù)。(4) 寫hibernate映射文件。2、Hibernate儲(chǔ)存原理當(dāng)儲(chǔ)存數(shù)據(jù)時(shí),hibernate自動(dòng)調(diào)用getter方法,把屬性存入相應(yīng)字段。當(dāng)讀取數(shù)據(jù)時(shí),hibernate自動(dòng)調(diào)用無參構(gòu)造方法創(chuàng)建對(duì)象,然后調(diào)用setter方法給對(duì)象賦值,從而產(chǎn)生和原來對(duì)象相等(equals)的對(duì)象。當(dāng)增、刪、改操作時(shí),hibernate會(huì)自動(dòng)把與原數(shù)據(jù)相關(guān)聯(lián)的表的字段修改(必須設(shè)置級(jí)聯(lián))。3、映射關(guān)系分析(1) 航班計(jì)劃和飛機(jī)型號(hào)是多對(duì)一關(guān)系:每

30、個(gè)航班計(jì)劃都包含飛機(jī)型號(hào)屬性,各飛機(jī)型號(hào)會(huì)被多個(gè)航班計(jì)劃引用。(2) 航班和航班計(jì)劃是多對(duì)一的關(guān)系:每個(gè)航班都屬于某個(gè)航班計(jì)劃,因此每個(gè)航班都包含一個(gè)航班計(jì)劃屬性,而每個(gè)航班表都有一個(gè)外間指向航班計(jì)劃的id子段。(3) 定單與航班是多對(duì)一關(guān)系:一個(gè)定單包含的航班信息有它包含的航班屬性得到,通過航班屬性還可以得到航班計(jì)劃和飛機(jī)型號(hào)的信息。每個(gè)定單只能有一個(gè)航班,每個(gè)航班可以包含在多個(gè)定單中,因此定單與航班是多對(duì)一關(guān)系。(4) 定單和網(wǎng)點(diǎn)是多對(duì)一的關(guān)系:原理同定單和航班的關(guān)系。5 總結(jié) 航空訂票系統(tǒng)使用軟件分層結(jié)構(gòu),利用面向?qū)ο蟮脑O(shè)計(jì)方法,并把學(xué)到的知識(shí)應(yīng)用于實(shí)踐。實(shí)現(xiàn)了穩(wěn)定、可維護(hù)、可擴(kuò)展性的軟

31、件,并且完成業(yè)務(wù)需求。如做以下改進(jìn)會(huì)使系統(tǒng)更加完善:1、初始化配置參數(shù):程序是直接讀配置文件來讀取初始化參數(shù)的,如下所示:ServerIP=127.0.0.1ServerPort=8888可以將此參數(shù)放入程序中,由用戶或管理員輸入,來選側(cè)不同的服務(wù)器。客戶端的參數(shù)設(shè)置及重新連接功能有待實(shí)現(xiàn)。2、服務(wù)器掉線:默認(rèn)是實(shí)現(xiàn)是客戶端先退出,通知服務(wù)器,服務(wù)器從內(nèi)存中刪掉此客戶端,然后客戶端關(guān)閉連接。 private void quitHandle(Request req)String currentUserName=(String)req.getData("currentUser"

32、);for(Object o:onlineAgent)Branch a = (Branch)o;if(a.getName().equals(currentUserName)onlineAgent.remove(a);try s.close(); catch (IOException e) e.printStackTrace(); 但是,當(dāng)服務(wù)器由于網(wǎng)絡(luò)故障,或者系統(tǒng)維修時(shí),臨時(shí)斷開,沒有通知客戶端,當(dāng)客戶端此時(shí)向服務(wù)器發(fā)請(qǐng)求時(shí),便會(huì)出現(xiàn)想不到的錯(cuò)誤。 一個(gè)有效的解決方法是:利用觀察者模式。在服務(wù)器推出方法中遍歷在線客戶端socket,發(fā)送等待信息。Private void quit() For

33、(Socket s:Currentsockets) ······ /封裝等待信號(hào)給客戶端 客戶端受到等待信號(hào)后,執(zhí)行waitServer()方法,并禁止操作。3、請(qǐng)求響應(yīng)對(duì)象:現(xiàn)在的request對(duì)象封裝了String類型的Type變量代表請(qǐng)求類型。Response對(duì)象包裝了Object類型的Date變量作為相應(yīng)。可以把請(qǐng)求對(duì)象作為枚舉類型,更安全,不易出錯(cuò)。4、數(shù)據(jù)顯示的輪動(dòng)更新:服務(wù)器端顯示航班信息,網(wǎng)點(diǎn)信息,出現(xiàn)一張表,該表不能滾動(dòng)和更新。可以利用可滾動(dòng)、可更新的結(jié)果集以及Swing的某些特性實(shí)現(xiàn)excel中的實(shí)時(shí)修改數(shù)據(jù)功能。

34、實(shí)現(xiàn)此功能較為復(fù)雜。3.3數(shù)據(jù)庫(kù)連接的的主要代碼塊 import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;public class DBUtils statictry Class.forName("org.postgresql.Driver"); catch (ClassNotFoundException e) / TODO Auto-generated catch blocke.printStackTrace();public static Connect

35、ion getConnection() throws SQLException Connection conn = DriverManager.getConnection("jdbc:postgresql:/localhost/postgres", "postgres", "123");return conn;3.3 頁(yè)面設(shè)計(jì) 主要的幾個(gè)系統(tǒng)頁(yè)面有登陸頁(yè)面,主頁(yè)面,已經(jīng)其他子系統(tǒng)頁(yè)面。頁(yè)面代碼如下:主要代碼:<body><%session.setAttribute("use","trav

36、eller");String UserName=(String)request.getParameter("username");String Password=(String)request.getParameter("password");String Select=(String)request.getParameter("load");if(UserName.equals("") | Password.equals("") out.print(show.errorBox(&qu

37、ot;請(qǐng)?zhí)顚懲暾?quot;,"驗(yàn)證錯(cuò)誤");elseint intT=0;if(Select!=null&&Select.equals("user") intT=data.getRowCount("userload WHERE userid='"+UserName+"' AND password='"+Password+"'");if(intT>0) session.setAttribute("name",UserNa

38、me); session.setAttribute("use","user"); response.sendRedirect("index_user.jsp"); else out.print(show.errorBox("檢查你的用戶名或密碼!","驗(yàn)證錯(cuò)誤"); return; else if(Select!=null&&Select.equals("admin") intT=data.getRowCount("adminload WHERE u

39、serid='"+UserName+"' AND password='"+Password+"'"); if(intT>0) session.setAttribute("name",UserName); session.setAttribute("use","admin"); response.sendRedirect("index_user.jsp"); else out.print(show.errorBox("檢

40、查你的用戶名或密碼!","驗(yàn)證錯(cuò)誤"); return; else out.print(show.errorBox("檢查你的用戶名或密碼!","驗(yàn)證錯(cuò)誤"); return;%></body>主要代碼:<body><%String use=(String)session.getAttribute("use");%><table width="999" height="580" border="2"

41、 cellPadding=0 cellSpacing=0> <tr> <td width="191" height="60"><img src="image/logo.jpg" width="200" height="82"></td> <td width="800" height="60"><img src="image/logo.gif" width="

42、;798" height="83"></td> </tr> <tr> <td height="491"> <table width="200" height="443" cellpadding=0 cellspacing=0 border="0"> <tr> <td width="200" height="36"><img src="imag

43、e/guoji.JPG" width="200" height="36"></td> </tr> <tr> <td height="133"><p> <marquee scrollamount='1' scrolldelay='90' direction= 'UP' width='200' id=movewdg height='120' onMouseOver=movewdg

44、.stop() onMouseOut=movewdg.start()> <span class="style2">北京 漢城 價(jià)格:¥2200 </span> <p class="style2">北京 東京 價(jià)格:¥3000</p> <p class="style2">北京 紐約 價(jià)格:¥4000</p> <p class="style2">北京 溫哥華 價(jià)格:¥4500</p> </marquee>

45、</td> </tr> <tr> <td height="34"><img src="image/tejia.JPG" width="200" height="34"></td> </tr> <tr> <td height="109"><marquee scrollamount='1' scrolldelay='90' direction= '

46、UP' width='200' id=movewdg height='157' onMouseOver=movewdg.stop() onMouseOut=movewdg.start()> <p class="style2">北京 上海 價(jià)格:¥450</p> <p class="style2">北京 哈爾濱 價(jià)格:¥500</p> <p class="style2">北京 西安 價(jià)格:¥700</p> <p c

47、lass="style2">北京 濟(jì)南 價(jià)格:¥300</p> </marquee></td> </tr> <tr> <td height="34"><img src="image/notice.gif" width="200" height="34"></td> </tr> <tr> <td height="97"><marquee

48、 scrollamount='1' scrolldelay='90' direction= 'UP' width='200' id=movewdg height='78' onMouseOver=movewdg.stop() onMouseOut=movewdg.start()> <p class="style2">本月12日發(fā)往東京的k8888航班取消,請(qǐng)旅行社盡快與相關(guān)旅客取得聯(lián)系,更改航班。</p> <p class="style2"

49、>本月20日發(fā)往濟(jì)南的k7777航班取消,請(qǐng)旅行社盡快與相關(guān)旅客取得聯(lián)系,更改航班。</p> </marquee></td> </tr> </table></td> <td width="800" height="491"><%if (use.equals("user")%><img src="image/main1.jpg" width="800" height="489&qu

50、ot; border="0" usemap="#Map1"><%else if(use.equals("admin")%> <img src="image/main2.jpg" width="800" height="489" border="0" usemap="#Map2"> <%else%><img src="image/main3.jpg" width=&quo

51、t;800" height="489" border="0" usemap="#Map3"><%></td> </tr></table></body>主要代碼:<body><p> <% Show show=new Show(); Str str=new Str();Conn con=new Conn();String planeno=(String)request.getParameter("planeno")

52、;String planedate=(String)request.getParameter("planedate");String fromplace=(String)request.getParameter("fromplace");String toplace=(String)request.getParameter("toplace");String planetime=(String)request.getParameter("planetime");String economyseat=(String)

53、request.getParameter("economyseat");String businessseat=(String)request.getParameter("businessseat");String economyprice=(String)request.getParameter("economyprice");String businessprice=(String)request.getParameter("businessprice");if(planeno.equals("&qu

54、ot;)|planedate.equals("")|fromplace.equals("")|toplace.equals("")|planetime.equals("")|economyseat.equals("")|businessseat.equals("")|economyprice.equals("")|businessseat.equals("")out.print("對(duì)不起,你需要將信息填寫完整!");

55、else int flag=0;int length;String fdate1,fdate2,fdate3;length=planedate.length();if(length>=8)fdate1=planedate.substring(4,5);fdate2=planedate.substring(6,7);fdate3=planedate.substring(7,8);if(fdate1.equals("-")&&(fdate2.equals("-")|fdate3.equals("-") flag=1;

56、 if(flag=0) out.print("對(duì)不起,你輸入的日期格式不正確!"); else int intT1=0; intT1=data.insert("INSERT INTO plane(planeno,toplace,fromplace,planedate,planetime,economyseat,businessseat,economyprice,businessprice) VALUES('"+planeno+"','"+toplace+"','"+fromplace+"','"+planedate+"','"+planetime+"','"+economyseat+"','"+businessseat+"','"+ec

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論