因此在网站前台页面的设计上采用了色彩较为欢快的色彩风格。该页面上放置了"查看电影信息"、"购物车管理"、"给电影评价"和"修改个人信息"四个模块,这样用户在进入网站时就能根据自己的需要选择自己感兴趣的模块。如果不需要进行操作或切换用户,直接单击"退出"即可。为方便用户浏览上映电影的信息,在他们进入前台页面时时默认显示的为"电影信息"页面。
网站前台页面命名为shop,其运行效果图如图5-3所示。
图5-2 用户注册页面运行效果图
图5-3 网站前台页面
将电影添加到购物车是购票网站前台的核心功能。网站中的购物车模仿现实中的购物车,存放用户选择的电影,用户可以根据自己的需求增加、清除购物车中的电影票。综上分析,在实现时采用 SESSION 标识 ID 将当前的用户和购物车之间关联起来。在用户表中,设置了"等级"(rank)这个属性,它用于判断用户的级别。凡是在本网站购票成功一次,用户等级便加1。当用户等级小于5时,属于网站的普通用户,普通用户预定电影票不能选择具体座位,只能根据个人喜好选择大体方位,如前排、中间或后排,若预定两张以上电影票可以选择座位是否连续,具体座位由系统根据个人喜好自动分配。当用户等级大于或等于5时,属于网站的星级用户,星级用户在预定电影票时便可以选择具体座位,但对于系统已经分配好的座位,星级用户是不可选的。这种座位分配方法是由顺序算法得到的,如果普通用户喜欢前排的座位,那么系统从第一排A1开始分配,遇到已经分配好的座位,系统会自动跳过,不会进行二次分配。如果用户需要连续座位,系统也会按照顺序分配连续的位置,若没有满足条件的位置剩余,系统会提示分配失败。系统分配座位的具体算法分析如下:
public String getSeats(String qh,int num,boolean cont)
(1)参数 String qh 表示前后排喜好的选择,可选值"front","middle","back",分别指前排、中间、后排。
(2)参数 int num 表示订购的票的张数,取正整数。
(3)参数 boolean cont表示是否要求订购连续的座位,true 表示要求连续,false表示不要求连续。
座位用整形数组seatTable[5][10]来表示,数组共5行10列,取值1表示该行被预订,取值0表示未被预订,订购的座位号用字符串数组rs[num]来表示,共num个元素,取值为订购的座位号,如"A10"。
以用户选择前排座位为例,若订购票得数量大于等于2且要求座位不连续时,从头开始遍历,碰到空座位生成座位字符串后填入到rs数组里。若rs数组满则分配成功,若遍历到最后rs数组未被填满则分配失败。算法描述如下:
if(qh.equals("front"))
{
int j=0;
for(int i=0; i<50 && j
{
if(this.seatTable[i/10][i%10]= =0) // 该座位未被使用
{ // 得到当前的行
int i_row=i/10+'A'; // 将行转化为字母,如第一行转化为'A'
char c=(char)i_row;
rs[j]=Character.toString(c); // 将行字符串填入rs
int i_col=i%10+1; // 得到当前的列
rs[j]+=Integer.toString(i_col); // 将列字符串填入rs
j++; //rs的索引值加一
}
}
if(j!=num) //分配失败
return "分配失败,请重新设定条件!";
}
若订购票得数量大于等于2且要求座位连续时,从头开始遍历,beg记录第一个空座位,初值为0,last记录还需要分配的连续座位数,初值为num。每当遇到空座位时,last减1,last为0时表示分配成功,分配以beg-1为结束的连续num个座位。每当遇到已被售出的座位时,last重置为num,beg置为下一位置。遍历到表尾尚未分配成功则表示分配失败。算法描述如下:
int beg=0;int last=num;
if(qh.eq