今天我們來制作一個影院訂票模型忿危,模型中用戶可以選擇影片斯棒、場次和座位剿涮,并且支持一次預定多張影票,下面來說一說具體實現(xiàn)方法腻异。
一.數(shù)據(jù)庫
1.影片庫
在實際案例中可能需要添加更多字段进副,比如演員表,影片描述等,模型中我們就簡化一下影斑,只保存影片名稱和影片海報给赞。
2.影廳庫
影廳中的座位一般都是按照行列排序,所以我們可以用一個二維數(shù)組存儲影廳的座位信息矫户。不過影廳中的座位可能如下圖中的情況片迅,并不是對應(yīng)一個完整的二維數(shù)組,所以我們令數(shù)組元素為true和false分別表示有無對應(yīng)座位皆辽。具體操作就是添加一個JSON字段位置地圖柑蛇,將二維數(shù)組寫成JSON字符串格式添加到數(shù)據(jù)庫中。另外我們還需要添加一個JSON字段定座地圖驱闷,這個字段中true和false表示座位是否被預定耻台,不過由于每個影廳會放映多個場次,因此具體的定座情況是無法在影廳庫中體現(xiàn)的空另,我們就只是保存一份所有座位都為未被預定的初始狀態(tài)數(shù)據(jù)盆耽。
3.場次庫
場次庫中前面幾個字段保存的是影片名稱、日期扼菠、開場散場時間和影廳名等基本信息摄杂,后面的位置地圖和定座地圖則與影廳庫中的含義相同,而且添加新場次時其初始值就由是影廳庫的輸出結(jié)果直接賦值的(本案例中使用Ctrl+C娇豫,Ctrl+V在數(shù)據(jù)庫里直接輸入就可以了)匙姜。顯然場次庫中定座地圖字段的值是會隨著用戶訂票操作而改變的。
4.用戶選座記錄
這個數(shù)據(jù)庫中我們存放用戶成功定座的操作記錄冯痢,因為數(shù)據(jù)庫會默認添加提交用戶氮昧,所以我們只需再用兩個字段記錄用戶所選擇的電影場次ID和選擇的座位即可。要注意這里的“用戶選擇”是一個一維數(shù)組格式的JSON字段浦楣,每個引號里的內(nèi)容代表一個座位袖肥,“-”前是行號,“-”后是列號振劳。
二.服務(wù)
1.選擇影片
選擇影片服務(wù)中將所選影片的名稱傳給服務(wù)即可椎组,數(shù)據(jù)庫會把場次庫中該影片的所有場次輸出并返回。
2.選擇場次
其實選擇影片時已經(jīng)將該影片的所有場次信息都輸出到前臺了历恐,不過在輸出到前臺后可能又有其他用戶成功訂票導致后臺數(shù)據(jù)更新寸癌,所以還是添加一個選擇場次服務(wù),能夠通過數(shù)據(jù)ID讓場次庫輸出該場次的最新數(shù)據(jù)弱贼。
3.選座訂票服務(wù)
接下來就是案例的核心——選座訂票服務(wù)了蒸苇,我們需要傳給服務(wù)的是選擇場次的ID和所選座位組成的一維數(shù)組。首先我們會將該場次的定座地圖輸出到后臺的一個二維數(shù)組里吮旅,然后將數(shù)值變量“可以定票數(shù)”歸零溪烤。之后我們通過一個循環(huán)判斷用戶所選的每一個座位是否被預定,如果沒有就讓“可以訂票數(shù)”加1,并將二維數(shù)組中對應(yīng)的元素改為true檬嘀。
循環(huán)結(jié)束后如果“可以訂票數(shù)”等于用戶傳給服務(wù)的一維數(shù)組中元素的個數(shù)槽驶,就說明用戶所選的座位都是可預訂的,就將更改后的二維數(shù)組更新到場次庫中并返回seccess鸳兽,如果不等于則說明已有其他用戶預訂此座位掂铐,定座失敗,返回fail贸铜。
三.前臺
1.影片選擇頁面
在頁面初始化時堡纬,我們讓影片庫將所有影片輸出到前臺對象數(shù)組中,通過循環(huán)創(chuàng)建展示所有影片蒿秦。
當用戶選擇某一影片后烤镐,調(diào)用選擇影片服務(wù),將返回的影片場次信息保存到前臺的對象數(shù)組“場次選擇”中棍鳖。
2.場次選擇頁面
在場次選擇頁面中炮叶,我們依舊是通過循環(huán)創(chuàng)建展示出所有場次。當用戶選擇場次后通過該場次的數(shù)據(jù)ID調(diào)用選擇場次服務(wù)渡处,獲取場次數(shù)據(jù)镜悉,并且將返回結(jié)果中的定座地圖和位置地圖分別保存到兩個二維數(shù)組。
3.位置選擇頁面
在位置選擇頁面医瘫,首先利用二維數(shù)組“位置地圖”進行一個雙層的循環(huán)創(chuàng)建侣肄,然后通過if容器判斷當前數(shù)據(jù)的值,如果為true說明該點有座位醇份,就顯示一個座位的圖標稼锅;如果為false就用一個與背景顏色相同的分割線組件占位。當然展示的座位還有3種情況僚纷,已被預訂矩距,未被預訂和當前用戶選中,我們需要再進行兩層判斷怖竭,在有座位的情況下座位是否被預定锥债,沒被預定的情況下是否被當前用戶選中。
接下來是訂票操作的邏輯痊臭,當點擊一個處于未被預訂狀態(tài)的座位圖標時哮肚,我們會先判斷這個座位是否在一維數(shù)組“用戶選擇”里,如果不在就用該座位的行列號拼成“3-3”這樣的格式加到“用戶選擇”中广匙,如果已經(jīng)在“用戶選擇”里就將該值從數(shù)組中刪除绽左。(可以注意到上一步中判斷是否將座位顯示為用戶選中狀態(tài)的if容器,其篩選條件與此處的邏輯是對應(yīng)的)
最后是提交定座艇潭,最下方按鈕的禁用屬性和內(nèi)容都與“用戶選擇”進行了數(shù)據(jù)綁定,當“用戶選擇”的元素個數(shù)為0,也就是當前用戶沒有選擇座位時蹋凝,按鈕會被禁用并顯示Please select the seat鲁纠,當用戶選擇座位后按鈕會顯示Buy tickets并允許點擊。點擊后則調(diào)用選座訂票服務(wù)鳍寂,返回該場次最新的數(shù)據(jù)信息并告知用戶定座結(jié)果改含。
總結(jié)
案例中第一個難點是要使用合適的數(shù)據(jù)結(jié)構(gòu)存儲用戶的訂票信息,這點需要大家能夠熟練使用JSON字符串迄汛,設(shè)計出自己需要的變量格式捍壤;第二個是在展示座位狀態(tài)時使用了多層的for容器和if容器,這里我們需要明確每層循環(huán)的數(shù)據(jù)格式和類型鞍爱,以及if容器進行判斷的條件分支結(jié)構(gòu)鹃觉。