【正文】
前排、中間或后排,若預(yù)定兩張以上電影票可以選擇座位是否連續(xù),具體座位由系統(tǒng)根據(jù)個(gè)人喜好自動(dòng)分配。當(dāng)用戶等級(jí)大于或等于5時(shí),屬于網(wǎng)站的星級(jí)用戶,星級(jí)用戶在預(yù)定電影票時(shí)便可以選擇具體座位,但對(duì)于系統(tǒng)已經(jīng)分配好的座位,星級(jí)用戶是不可選的。這種座位分配方法是由順序算法得到的,如果普通用戶喜歡前排的座位,那么系統(tǒng)從第一排A1開始分配,遇到已經(jīng)分配好的座位,系統(tǒng)會(huì)自動(dòng)跳過,不會(huì)進(jìn)行二次分配。如果用戶需要連續(xù)座位,系統(tǒng)也會(huì)按照順序分配連續(xù)的位置,若沒有滿足條件的位置剩余,系統(tǒng)會(huì)提示分配失敗。系統(tǒng)分配座位的具體算法分析如下: public String getSeats(String qh,int num,boolean cont)(1)參數(shù) String qh 表示前后排喜好的選擇,可選值”front”,”middle”,”back”,分別指前排、中間、后排。(2)參數(shù) int num 表示訂購的票的張數(shù),取正整數(shù)。(3)參數(shù) boolean cont表示是否要求訂購連續(xù)的座位,true 表示要求連續(xù),false表示不要求連續(xù)。座位用整形數(shù)組seatTable[5][10]來表示,數(shù)組共5行10列,取值1表示該行被預(yù)訂,取值0表示未被預(yù)訂,訂購的座位號(hào)用字符串?dāng)?shù)組rs[num]來表示,共num個(gè)元素,取值為訂購的座位號(hào),如“A10”。以用戶選擇前排座位為例,若訂購票得數(shù)量大于等于2且要求座位不連續(xù)時(shí),從頭開始遍歷,碰到空座位生成座位字符串后填入到rs數(shù)組里。若rs數(shù)組滿則分配成功,若遍歷到最后rs數(shù)組未被填滿則分配失敗。算法描述如下:if((front)) { int j=0。 for(int i=0。 i50 amp。amp。 jnum。 i++) // 遍歷,若到數(shù)組尾或rs表被填滿跳出循環(huán) { if([i/10][i%10]= =0) // 該座位未被使用 { // 得到當(dāng)前的行 int i_row=i/10+39。A39。 // 將行轉(zhuǎn)化為字母,如第一行轉(zhuǎn)化為‘A’ char c=(char)i_row。 rs[j]=(c)。 // 將行字符串填入rs int i_col=i%10+1。 // 得到當(dāng)前的列 rs[j]+=(i_col)。 // 將列字符串填入rs j++。 //rs的索引值加一 } }if(j!=num) //分配失敗 return 分配失敗,請重新設(shè)定條件!。 }若訂購票得數(shù)量大于等于2且要求座位連續(xù)時(shí),從頭開始遍歷,beg記錄第一個(gè)空座位,初值為0,last記錄還需要分配的連續(xù)座位數(shù),初值為num。每當(dāng)遇到空座位時(shí),last減1,last為0時(shí)表示分配成功,分配以beg1為結(jié)束的連續(xù)num個(gè)座位。每當(dāng)遇到已被售出的座位時(shí),last重置為num,beg置為下一位置。遍歷到表尾尚未分配成功則表示分配失敗。算法描述如下:int beg=0。int last=num。if((front)){ //未分配成功且未遍歷完則繼續(xù)遍歷 while(beg50amp。amp。last!=0) { if([beg/10][beg%10]==0) //遇到空座位 last。 else //遇到被售出的座位 last=num。 beg++。 } if(beg==50) //分配失敗 return 分配失敗,請重新設(shè)定條件!。 else //分配成功,此時(shí)beg指向被分配的座位的下一個(gè)位置 { //分配索引值從begnum開始到beg1的所有座位 for(int i=begnum,j=0。ibeg。i++,j++) { int i_row=i/10+39。A39。 char c=(char)i_row。 rs[j]=(c)。 int i_col=i%10+1。 rs[j]+=(i_col)。 } }購物車功能實(shí)現(xiàn)的效果圖如圖54和圖55所示,分為普通用戶和星級(jí)用戶購物車。紅色標(biāo)記出的表示已經(jīng)分配好的座位。普通用戶在團(tuán)購電影票(一次購買數(shù)量不小于20)時(shí)會(huì)給予價(jià)格優(yōu)惠,在原價(jià)的基礎(chǔ)上打八折,即為原價(jià)的80%。圖54 普通用戶購物車運(yùn)行效果圖圖55 星級(jí)用戶購物車運(yùn)行效果圖 后臺(tái)頁面的實(shí)現(xiàn)網(wǎng)站后臺(tái)管理頁面命名為manage,其運(yùn)行效果圖如圖56所示。圖56 網(wǎng)站后臺(tái)頁面網(wǎng)站后臺(tái)管理頁面也要體現(xiàn)出易操作性,使管理員的工作更加快捷方便,更要給人以穩(wěn)重之感,所以選擇沉穩(wěn)的藍(lán)色色調(diào)。該頁面上放置了“電影管理”、“訂單管理”和“用戶管理”和“評(píng)價(jià)管理”四個(gè)模塊,這樣管理員在進(jìn)入網(wǎng)站時(shí)就能根據(jù)自己的需要選擇相應(yīng)的模塊。如果不需要進(jìn)行操作或切換用戶,直接單擊“退出”即可。由于 HTTP 的無連接狀態(tài),在每個(gè)頁面都要開啟 SESSION 來判斷用戶的登錄狀態(tài)及對(duì)應(yīng)的操作權(quán)限(前臺(tái)頁面也是如此),因此從后臺(tái)登錄開始到管理員注銷離開,在此期間每個(gè)頁面都要驗(yàn)證 SESSION,判斷用戶操作合法性。另外,為方便管理員隨時(shí)添加新上映的電影,在管理員進(jìn)入后臺(tái)時(shí)默認(rèn)顯示的頁面為“電影信息”頁面。(1)電影管理:主要為管理員提供添加電影信息、修改電影信息、刪除電影信息等基本操作,當(dāng)管理員單擊“添加新電影”按鈕時(shí),彈出“添加電影”頁面,此頁面需要管理員輸入電影的名稱、放映廳、上映時(shí)間、價(jià)格、簡介等基本信息,當(dāng)管理員輸入完畢單擊“提交”按鈕,在判斷數(shù)據(jù)的完整性、合法性之后將數(shù)據(jù)存入數(shù)據(jù)庫,否則將彈出出錯(cuò)信息和相應(yīng)的修改提示,如圖57所示。“修改電影信息”的操作與“添加新電影”的操作相似,此處不再贅述。(2)訂單管理:訂單管理為后臺(tái)的核心管理功能,此處為管理員提供了訂單查詢和刪除的功能。單擊“訂單管理”按鈕后可進(jìn)入訂單詳細(xì)信息頁面,若單擊后面的“刪除”按鈕,即將選中的訂單刪除。(3)用戶管理:當(dāng)管理員單擊“用戶管理”按鈕后,將彈出“用戶信息表”(為方便管理員查看,以英文字母順序排序)。管理員可以根據(jù)用戶注冊名的首字母對(duì)新注冊的用戶進(jìn)行審核。當(dāng)管理員發(fā)現(xiàn)某些會(huì)員的信息不合法時(shí)可以刪除該用戶,被刪除的用戶將無法再次進(jìn)行相應(yīng)的購票活動(dòng)。(4)評(píng)價(jià)管理:對(duì)于用戶的評(píng)價(jià),管理員可以進(jìn)行查看和刪除的操作。當(dāng)單擊“評(píng)價(jià)管理”按鈕時(shí),處理程序?qū)⑾驍?shù)據(jù)庫提交搜索請求,搜索所有的評(píng)價(jià),以表格形式顯示在默認(rèn)頁面,并以時(shí)間降序排列,這樣管理員可以單擊某條評(píng)價(jià)進(jìn)行對(duì)應(yīng)的操作。假如當(dāng)前網(wǎng)站并無用戶評(píng)價(jià),那么在默認(rèn)頁面將提示“電影暫無用戶留評(píng)價(jià)”。圖57 添加電影頁面運(yùn)行效果圖6 結(jié)論本網(wǎng)站以JSP語言作為開發(fā)工具,采用 Microsoft Access進(jìn)行數(shù)據(jù)庫設(shè)計(jì),建立了一個(gè)電影票預(yù)定網(wǎng)站,通過后臺(tái)信息發(fā)布管理實(shí)現(xiàn)了電影信息的展示,實(shí)現(xiàn)了該網(wǎng)站的基本功能。文章從需求分析、系統(tǒng)設(shè)計(jì)和系統(tǒng)實(shí)施各方面對(duì)整個(gè)系統(tǒng)進(jìn)行了詳細(xì)分析?,F(xiàn)國內(nèi)對(duì)于用戶購買電影票的方式仍主要停留在現(xiàn)場購票的模式上,但非現(xiàn)場購票也越來越流行。該網(wǎng)站的成功開發(fā),能夠免除人們的排隊(duì)之苦,提前預(yù)定緊俏座位。由于時(shí)間有限,網(wǎng)站在設(shè)計(jì)上并沒有在提高用戶體驗(yàn)效果上作出過多的考慮,因此,本網(wǎng)站在用戶體驗(yàn)上存在一定的缺陷。比如即將上映的電影信息在網(wǎng)站上暫時(shí)并不可見,對(duì)于電影的介紹也沒有特別完善,僅僅只是以訂票為主。在訂票成功之后,支付方式和派票方式還未給予考慮。由于本網(wǎng)站為個(gè)人開發(fā),因此在數(shù)據(jù)庫的選擇上使用了Access,存在一定的限制,只能對(duì)輕量級(jí)的數(shù)據(jù)進(jìn)行處理。綜上所述,本網(wǎng)站有待進(jìn)一步擴(kuò)Design of Movie Ticket Booking Website Based on JSPSun XiaoyanDept. Information Engineering, Nanjing University of Information Science amp。 Technology, 210044ABSTRACTTo facilitate the public39。s entertainment life, prevent people from suffering pains of queuing when buying movie tickets, this disseration introduces the process of designing and implementing online movie ticket booking website of B/S structure, from needs analysis, site design to the specific implementations of ideas,following the website development and database design methods. The design of the website uses JSP development tools and application of Microsoft Access database management system. This disseration details the whole process of a movie ticket booking website analysis, design and development, it analyzes and implements the basic functions of booking tickets.Key words: Movie Ticket Booking。 JSP。 Database附錄 主要功能代碼:package Login。import .*。import 。public class LoginBean extends Execute_DB{ private String memberName=null。 //會(huì)員姓名 private String pwd=null。 //密碼 private int LoginTimes=1。 //登錄次數(shù) private int rank=1。 private static String strDBDriver=。 //JDBC驅(qū)動(dòng) private static String strDBUrl=jdbc:odbc:VIP。 //數(shù)據(jù)源 private Connection conn=null。 //連接 private ResultSet rs=null。 private int SysRole。 //結(jié)果集 public LoginBean(){ //加載JDBCODBC驅(qū)動(dòng) try{ (strDBDriver)。 }catch( e){ //捕獲異常 (LoginBean():+())。 } } //獲得登錄次數(shù) public int getLoginTimes(){ String strSql=null。 try{ conn=(strDBUrl)。 Statement stmt=()。 strSql=Select LoginTimes from user where memberName=39。+memberName+39。and pwd=39。+pwd+39。 rs=(strSql)。 while(()){ //登錄次數(shù) LoginTimes=(LoginTimes)。 } //如果是合法會(huì)員則將其登錄次數(shù)加1 if(LoginTimes!=1){ strSql=Update user set LoginTimes=+(LoginTimes+1)+ where memberName=39。+memberName+39。 (strSql)。 } ()。 ()。 ()。 }catch(SQLException e){ //捕獲異常 (():+())。 } return LoginTimes。 } //獲得等級(jí) public int getRank(){ String strSql=null。 try{ conn=(strDBUrl)。 Statement stmt=()。 strSql=Select rank from user where memberName=39。+memberName+39。 rs=(strSql)。 while(()){ //登錄次數(shù) rank=(rank)。 } //如果是合法會(huì)員則將其登錄次數(shù)加1 ()。 ()。 ()。 }catch(SQLException e){ //捕獲異常 (():+())。 } return rank。 } public int addRank() { int rank=()。 rank++。 String str=update user set rank=+rank+ where memberName=39。+memberName+39。 (str)。 return rank。 } //設(shè)置memberID屬性 public void setmemberName(String name){ =na