电影订票系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。







组长:王润森
组员:尹佩珊、谢楚璇、吴绮玲
完成日期:2013年12月10日星期二
目录
1系统使用说明及软件基本功能3
1.1用户3
1.1.1用户注册3
1.1.2用户登陆4
1.1.3浏览电影4
1.1.4用户资料管理5
1.1.5浏览电影简介6
1.1.6观看预告片7
1.1.7订购电影8
1.2管理员9
1.2.1后台用户登录9
1.2.2后台管理员主页9
1.2.3增加电影10
1.2.4更新电影页面11
1.2.5删除电影13
1.2.6座位管理14
1.2.7现场订票15
1.2.8插入预告片16
1.3功能结构图17
2数据库设计18
2.1数据字典18
2.1.1数据项18
2.1.2数据结构20
2.2结构设计20
2.2.1概念结构设计20
2.2.2逻辑结构设计21
2.2.3物理结构设计21
3关键代码描述26
3.1动态生成上映电影信息26
3.2选座窗口使用D ATA G RID V IEW控件显示座位信息26
3.3控制电影排期时间,避免冲突26
3.4模拟交易过程28
4系统报告测试28
4.1存在问题以及解决方案28
4.2不足30
5小组详细分工30
1系统使用说明及软件基本功能
1.1用户
1.1.1用户注册
功能介绍:
为用户提供一个注册会员的友好界面。

使用说明:
输入注册信息,包括用户名,用户密码,昵称,性别,邮箱,手机号码,邮箱,QQ号码。

输入完成后点注册按钮完成注册。

如果信息填写的格式不对,则无法完成注册,并返回提示信息。

图1-1-1用户注册界面
1.1.2用户登陆
功能介绍:
为用户提供一个登录界面。

使用说明:
输入帐号、密码均正确,才登录成功,否则登录失败,若用户名或者密码为空,则返回提示信息。

图1-1-2用户登录界面
1.1.3浏览电影
功能介绍:
通过一个友好的欢迎界面显示可订票的电影信息,待上映的电影信息等。

使用说明:
电影按时间先后进行排列,用户可以了解各电影的放映顺序。

页面左上角显示订票入口和修改个人信息入口。

图1-1-3电影的界面
1.1.4用户资料管理
功能介绍:
为用户提供修改个人资料的界面
使用说明:
此界面提供用户个人信息(包括用户名,用户密码,昵称,性别,邮箱,手机号码,邮箱,QQ号码)的完善与修改。

用户密码采用的是MD5加密算法,修改密码时会弹出密码修改对话框,用户需要输入原始密码,新密码,还要进行新密码确认,若原始密码错误,则返回提示信息并无法进行密码修改。

图1-1-4用户资料管理界面
1.1.5浏览电影简介
功能介绍:
为用户提供一个电影简介的页面,用户可以选择订购该影片,购买的票数,放映时间,放映厅都会在此页面显示。

使用说明:
用户可以查看电影库中所正在上映电影的介绍(包括导演,主演,时长,语言,类型,上映时间,票价,简介),可以在线订购。

当用户点击选票按钮时,用户将被转到所选电影订购页面。

图1-1-5电影简介界面
1.1.6观看预告片
功能介绍:
为用户提供观看预告片功能。

使用说明:
点击此按钮,用户可以观看电影的预告片,以此决定是否购票。

图1-1-6观看预告片
1.1.7订购电影
功能介绍:
为用户提供选择观看座位,订购电影票的界面。

使用说明:
用户可以选择灰色座位,红色座位表示不可选,黄色座位表示已选。

点击确认购买时,当用户选择完之后,将被转到售票处结算,并自动扣除金额。

完成支付后,用户会收到支付成功短信,可凭借短信到前台取票。

用户可点击取消订座按钮取消订座,但无法取消别人所订的票。

图1-1-7电影订票界面
1.2管理员
1.2.1后台用户登录
功能介绍:
后台用户即系统管理员,系统管理员将通过专有的入口登录到该系统,对用户不可见。

使用说明:
管理员通过输入账号、密码进入系统管理界面,成功登陆之后,可对电影票的信息进行操作、管理及对电影进行更新等操作。

1.2.2后台管理员主页
功能介绍:
为管理员提供一个对电影信息的综合管理平台
使用说明:
电影按时间先后进行排列,管理员可以了解各电影的放映顺序,每部电影下方均提供更新和删除入口。

页面左上角显示现场购票入口、修改个人信息入口和增加电影入口。

图1-2-1管理员界面
1.2.3增加电影
功能介绍:
为管理员提供一个增加电影的界面
使用说明:
点击“增加电影”按钮进入该页面,填写电影的详细信息,上传电影海报,点击下方“增加”按钮即可成功增加一部电影。

图1-2-2管理员增加电影的界面
1.2.4更新电影页面
功能介绍:
为管理员提供一个可以修改电影详细信息、更新电影上映场次的界面。

使用说明:
1. 点击电影下方“更新”按钮进入该页面,可以对电影详细信息进行修改,修改完毕点击“更新”按钮即可保存。

通过下方对放映厅的选择和对上映日期和开始时间(结束时间会根据电影时长自动进行更新)的填写,点击“新增”按钮及可增加该电影的上映场次。

【假如上映时间在当前时间之前,则提示管理员重新输入。


图1-2-3管理员更新电影的界面(1)
2. 若要删除该电影的某个上映场次,点击该上映场次的“删除”按钮即可成功删除。

【假如已有订座,则无法删除。


图1-2-4管理员更新电影的界面(2)
3. 若填写了新增的上映场次,没有点击“新增”按钮,却点击了“删除”按钮,则会弹出“没有更新…怎么删除…”的提醒窗口。

图1-2-5管理员更新电影的界面(3)
1.2.5删除电影
功能介绍:
为管理员提供一个删除电影的入口
使用说明:
点击待删除电影下方的“删除”按钮,在弹出的窗口中点击“是”即可成功删除该电影。

【假如已有订座则无法删除,若所有排期均无订座,则可连同电影、排期一同删除。


图1-2-6管理员删除电影的界面
1.2.6座位管理
功能介绍:
为管理员提供一个管理座位的界面
使用说明:
1. 若管理员发现某个座位是不可用的,则选中该座位,点击右下角“设置为不可用”按钮,即可把该座位设置为不可用,颜色显示为红色。

图1-2-7座位管理界面(1)
2. 若需要把某个不可用的座位设置为可用,即选中该座位,点击右下角“设置为不可用”按钮,即可把该座位设置为可用,颜色显示为灰色。

图1-2-8座位管理界面(2)
1.2.7插入预告片
功能介绍:
管理员可插入预告片供观众观看。

使用说明:
点击“插入预告片”按钮进入该页面,从本机中选中视频便可将视频文件名插入到数据库里面,并复制预告片文件到本目录下。

图1-2-9插入预告片
1.2.8现场订票
功能介绍:
为管理员提供一个替用户现场选票的页面。

使用说明:
点击“购票”按钮进入该页面,选中座位,点击下方“订座”按钮成功购票,在弹出的窗口中点击“确定”按钮即可。

该座位颜色改为黄色,意为该座位以被选中。

图1-2-10现场订票界面1.3功能结构图
图1-3-1用户功能结构
图1-3-2管理员功能结构
2数据库设计
2.1数据字典
2.1.1数据项
客户信息表(customers)
字段类型允许为空是否为主键描述
c_id varchar(20) 否主键客户账号c_passward varchar(20) 否否客户密码c_name varchar(20) 否否客户名字sex varchar(2) 是否客户性别phone varchar(30) 否否客户电话email varchar(40) 是否客户邮箱qq varchar(20) 是否客户qq号
电影信息表(films)
字段类型允许为空是否为主键描述
f_id int 否主键电影编号f_name varchar(50) 否否电影名star varchar(100) 是否主演director varchar(30) 是否导演
排期信息表(schedules)
座位信息表(seats)
订单信息表(orders)
2.1.2数据结构
数据结构名组成
customers c_id、c_password、c_name、sex、phone、email、qq
films f_id、f_name、star、director、duration、languages、f_type、descriptions、price、poster、startdate、prevue_path
schedules sch_id、f_id、h_id、dates、start_hr、start_min、end_hr、end_min seats s_id、sch_id、row、col、isActive
orders o_id、c_id、sch_id、s_id、way_of_payment、dates
2.2结构设计
2.2.1概念结构设计
E-R图
2.2.2逻辑结构设计
关系模式
customers(c_id、c_password、c_name、sex、phone、email、qq)
films(f_id、f_name、star、director、duration、languages、f_type、descriptions、price、poster、startdate、prevue_path)
schedules(sch_id、f_id、h_id、dates、start_hr、start_min、end_hr、end_min)
seats(s_id、sch_id、h_id、row、col、isActive)
orders(o_id、c_id、sch_id、s_id、way_of_payment、dates)
2.2.3物理结构设计
建表代码
USE [master]
GO
/****** Object: Database [CinemaBookingSystem] Script Date: 12/07/2013 14:40:28 ******/
CREATE DATABASE [CinemaBookingSystem]
GO
USE [CinemaBookingSystem]
GO
/****** Object: Table [dbo].[films] Script Date: 12/07/2013 14:37:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[films](
[f_id] [int] IDENTITY(1,1) NOT NULL,
[f_name] [varchar](50) NOT NULL,
[star] [varchar](100) NULL,
[director] [varchar](30) NULL,
[duration] [varchar](10) NULL,
[languages] [varchar](20) NULL,
[f_type] [varchar](50) NULL,
[descriptions] [varchar](1000) NULL,
[price] [int] NULL,
[poster] [image] NULL,
[startdate] [date] NULL,
[prevue_path] [varchar](500) NULL,
CONSTRAINT [PK__films__2911CBED03317E3D] PRIMARY KEY CLUSTERED
(
[f_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[customers] Script Date: 12/07/2013 14:37:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[customers](
[c_id] [varchar](20) NOT NULL,
[c_password] [varchar](20) NOT NULL,
[c_name] [varchar](20) NOT NULL,
[sex] [varchar](2) NULL,
[phone] [varchar](30) NOT NULL,
[email] [varchar](40) NULL,
[qq] [varchar](20) NULL,
PRIMARY KEY CLUSTERED
(
[c_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[schedules] Script Date: 12/07/2013 14:37:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[schedules](
[sch_id] [int] IDENTITY(1,1) NOT NULL,
[f_id] [int] NOT NULL,
[h_id] [int] NULL,
[dates] [date] NULL,
[start_hr] [varchar](2) NULL,
[start_min] [varchar](2) NULL,
[end_hr] [varchar](2) NULL,
[end_min] [varchar](2) NULL,
CONSTRAINT [PK__schedule__9A5C8C7C1367E606] PRIMARY KEY CLUSTERED
(
[sch_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[seats] Script Date: 12/07/2013 14:37:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[seats](
[sch_id] [int] NOT NULL,
[s_id] [int] IDENTITY(1,1) NOT NULL,
[row] [int] NULL,
[col] [int] NULL,
[isActive] [bit] NULL,
CONSTRAINT [PK__seats__2F3684F40EA330E9] PRIMARY KEY CLUSTERED
(
[s_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[orders] Script Date: 12/07/2013 14:37:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[orders](
[o_id] [int] IDENTITY(1,1) NOT NULL,
[c_id] [varchar](20) NOT NULL,
[way_of_payment] [varchar](40) NOT NULL,
[dates] [date] NOT NULL,
[sch_id] [int] NOT NULL,
[s_id] [int] NOT NULL,
CONSTRAINT [PK__orders__904BC20E619B8048] PRIMARY KEY CLUSTERED
(
[o_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Check [CK__customers__sex__1DB06A4F] Script Date: 12/07/2013 14:37:50 ******/
ALTER TABLE [dbo].[customers] WITH CHECK ADD CHECK (([sex]='男'? OR [sex]='女'))
GO
/****** Object: Check [CK__customers__sex__2F10007B] Script Date: 12/07/2013 14:37:50 ******/
ALTER TABLE [dbo].[customers] WITH CHECK ADD CHECK (([sex]= '男'? OR [sex]='女'))
GO
/****** Object: Check [CK__schedules__end_h__173876EA] Script Date: 12/07/2013 14:37:50 ******/
ALTER TABLE [dbo].[schedules] WITH CHECK ADD CONSTRAINT [CK__schedules__end_h__173876EA] CHECK (([end_hr]>=(0) AND [end_hr]<(24)))
GO
ALTER TABLE [dbo].[schedules] CHECK CONSTRAINT [CK__schedules__end_h__173876EA]
GO
/****** Object: Check [CK__schedules__end_m__182C9B23] Script Date: 12/07/2013 14:37:50 ******/
ALTER TABLE [dbo].[schedules] WITH CHECK ADD CONSTRAINT [CK__schedules__end_m__182C9B23] CHECK (([end_min]>=(0) AND [end_min]<(60)))
GO
ALTER TABLE [dbo].[schedules] CHECK CONSTRAINT [CK__schedules__end_m__182C9B23]
GO
/****** Object: Check [CK__schedules__start__15502E78] Script Date: 12/07/2013 14:37:50 ******/
ALTER TABLE [dbo].[schedules] WITH CHECK ADD CONSTRAINT [CK__schedules__start__15502E78] CHECK (([start_hr]>=(0) AND [start_hr]<(24)))
GO
ALTER TABLE [dbo].[schedules] CHECK CONSTRAINT [CK__schedules__start__15502E78]
GO
/****** Object: Check [CK__schedules__start__164452B1] Script Date: 12/07/2013 14:37:50 ******/
ALTER TABLE [dbo].[schedules] WITH CHECK ADD CONSTRAINT [CK__schedules__start__164452B1] CHECK (([start_min]>=(0) AND [start_min]<(60)))
GO
ALTER TABLE [dbo].[schedules] CHECK CONSTRAINT [CK__schedules__start__164452B1]
GO
/****** Object: ForeignKey [FK__orders__c_id__6383C8BA] Script Date: 12/07/2013 14:37:50 ******/
ALTER TABLE [dbo].[orders] WITH CHECK ADD CONSTRAINT [FK__orders__c_id__6383C8BA] FOREIGN KEY([c_id])
REFERENCES [dbo].[customers] ([c_id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[orders] CHECK CONSTRAINT [FK__orders__c_id__6383C8BA]
GO
/****** Object: ForeignKey [FK__orders__s_id__656C112C] Script Date: 12/07/2013 14:37:50 ******/
ALTER TABLE [dbo].[orders] WITH CHECK ADD CONSTRAINT [FK__orders__s_id__656C112C] FOREIGN KEY([s_id])
REFERENCES [dbo].[seats] ([s_id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[orders] CHECK CONSTRAINT [FK__orders__s_id__656C112C]
GO
/****** Object: ForeignKey [FK__orders__sch_id__6477ECF3] Script Date: 12/07/2013 14:37:50 ******/
ALTER TABLE [dbo].[orders] WITH CHECK ADD CONSTRAINT [FK__orders__sch_id__6477ECF3] FOREIGN KEY([sch_id])
REFERENCES [dbo].[schedules] ([sch_id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[orders] CHECK CONSTRAINT [FK__orders__sch_id__6477ECF3]
GO
/****** Object: ForeignKey [FK__schedules__f_id__1920BF5C] Script Date: 12/07/2013 14:37:50 ******/
ALTER TABLE [dbo].[schedules] WITH CHECK ADD CONSTRAINT [FK__schedules__f_id__1920BF5C] FOREIGN KEY([f_id])
REFERENCES [dbo].[films] ([f_id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[schedules] CHECK CONSTRAINT [FK__schedules__f_id__1920BF5C]
GO
/****** Object: ForeignKey [FK_seats_schedules] Script Date: 12/07/2013 14:37:50 ******/ ALTER TABLE [dbo].[seats] WITH CHECK ADD CONSTRAINT [FK_seats_schedules] FOREIGN KEY([sch_id])
REFERENCES [dbo].[schedules] ([sch_id])
GO
ALTER TABLE [dbo].[seats] CHECK CONSTRAINT [FK_seats_schedules]
GO
3关键代码描述
3.1动态生成上映电影信息
先将所有电影加载到DataTable里面,再使用foreach从DataTable里面取出电影信息,每取得一条电影信息,则new一个放置电影海报的PictureBox和Text为电影名的Button(若身份为管理员,则还有更新和删除按钮)。

手动设置控件的各种属性和事件,使用条件判断语句:if (xGap + x * (pb.Width + xGap) + pb.Width > panelOfGroupBox.Width)实现当电影在一行内放不下时(即大于panel的宽度),自动更改后面电影的Location,并且panel停靠在父窗口gb_Movies上,gb_Movies的Dock属性为Fill,并且窗体默认最大化且不能更改,从而实现了在不同屏幕大小的计算机上运行都能有同样的效果(不会超出显示屏的宽度)。

并能实现鼠标移动到图片上时放大图片效果和点击图片或按钮弹出电影详细信息窗口。

3.2选座窗口使用DataGridView控件显示座位信息
1. 由于考虑到直接将图片转化为二进制数据存进数据库作为座位的使用情况带来操作上的不方便以及空间上的浪费,本系统使用bit类型来储存座位使用的3种情况,分别是可选(Null 表示)、不可选(0表示)、已选(1表示),其中“不可选”状态由管理员设定以灵活地使用座位(防止座位不存在或座位维修却被用户选中的情况的发生)。

2. 在显示座位使用情况下,本系统使用DataGridView控件,在窗体弹出后立即载入该排期的详细信息(包括电影名、放映厅以及上映时间),并通过以上信息从数据库里面取出该排期的座位情况,再根据座位使用情况在DataGridView的单元格上增加图片,并根据座位的数量动态增加DataGridView的行数(1行10个座位,超出则新增一行)。

3. 当用户选了座位后,重新加载座位表更新座位信息,并在选座中加入了并发控制,一旦发现冲突,立刻回滚。

3.3控制电影排期时间,避免冲突
1.更新或新增电影排期前,先调用CheckScheduleRepetition()函数,从数据库里面取出上映日
期和放映厅都相同而且满足一下3个条件之一的数据:
①新增电影的开始时间在已存在电影的开始时间和结束时间之间;(新增电影的开始时间可等于已存在电影的结束时间,但不能等于已存在电影的开始时间。


代码:(datediff(mi,cast(convert(varchar(10),start_hr+':'+start_min+':00',108) as datetime),cast(convert(varchar(10),@StartHour+':'+@StartMinute+':00',108) as datetime))>=0 and
datediff(mi,cast(convert(varchar(10),End_hr+':'+End_min+':00',108) as datetime),cast(convert(varchar(10),@StartHour+':'+@StartMinute+':00',108) as datetime))<0)
②新增电影的结束时间在已存在电影的开始时间和结束时间之间;(新增电影的结束时间可等于已存在电影的开始时间,但不能等于已存在电影的结束时间。


代码:(datediff(mi,cast(convert(varchar(10),end_hr+':'+end_min+':00',108) as datetime),cast(convert(varchar(10),@EndHour+':'+@EndMinute+':00',108) as datetime))<=0 and
datediff(mi,cast(convert(varchar(10),Start_hr+':'+Start_min+':00',108) as datetime),cast(convert(varchar(10),@EndHour+':'+@EndMinute+':00',108) as datetime))>0)
③新增电影的开始时间在已存在电影的开始时间之前而且新增电影的结束时间在已存在电影的结束时间之后。

代码:(datediff(mi,cast(convert(varchar(10),end_hr+':'+end_min+':00',108) as datetime),cast(convert(varchar(10),@EndHour+':'+@EndMinute+':00',108) as datetime))>0 and
datediff(mi,cast(convert(varchar(10),Start_hr+':'+Start_min+':00',108) as datetime),cast(convert(varchar(10),@StartHour+':'+@StartMinute+':00',108) as datetime))<0)
若取出来的count大于0,则电影排期存在冲突,弹出对话框提示管理员。

(只能由管理员添加电影排期。


2. 由于数据库的开始小时和分钟采用字符串类型,因此需要使用函数
cast(convert(varchar(10),Hour+':'+Minute+':00',108) as datetime)来将字符串转化为datetime
类型,再用datediff函数进行比较。

3.4模拟交易过程
1. 为了模拟交易的过程,用户在确定了订单信息并确认支付后,本系统新开一个线程弹出一个窗口显示“正在支付…”并让系统睡眠1.5秒,然后更改Label信息为“正在发送短信…”并再次睡眠1.5秒,然后再将订单信息增加进数据库,并弹出“支付成功,你的订单号是XXX,可凭借短信到前台取票”信息。

2.假如登录者是管理员admin,则不执行该线程,直接弹出对话框“现场选座成功,你的订单号是XXX”信息。

4系统报告测试
4.1存在问题以及解决方案
1. 注册和更新同时判断用户是否存在
解决方案:将判断用户是否存在的函数erRepetition(string account)从BLL 层分离出来,单独加在注册中。

2. 电影排期时间冲突
解决方案:调用CheckScheduleRepetition()函数,从数据库里面取出上映日期和放映厅都相同而且满足一下3个条件之一的数据:
①新增电影的开始时间在已存在电影的开始时间和结束时间之间;(新增电影的开始时间可等于已存在电影的结束时间,但不能等于已存在电影的开始时间。


代码:(datediff(mi,cast(convert(varchar(10),start_hr+':'+start_min+':00',108) as datetime),cast(convert(varchar(10),@StartHour+':'+@StartMinute+':00',108) as datetime))>=0 and
datediff(mi,cast(convert(varchar(10),End_hr+':'+End_min+':00',108) as datetime),cast(convert(varchar(10),@StartHour+':'+@StartMinute+':00',108) as datetime))<0)
②新增电影的结束时间在已存在电影的开始时间和结束时间之间;(新增电影的结束时间可等于已存在电影的开始时间,但不能等于已存在电影的结束时间。


代码:(datediff(mi,cast(convert(varchar(10),end_hr+':'+end_min+':00',108) as datetime),cast(convert(varchar(10),@EndHour+':'+@EndMinute+':00',108) as datetime))<=0 and
datediff(mi,cast(convert(varchar(10),Start_hr+':'+Start_min+':00',108) as datetime),cast(convert(varchar(10),@EndHour+':'+@EndMinute+':00',108) as datetime))>0)
③新增电影的开始时间在已存在电影的开始时间之前而且新增电影的结束时间在已存在电影的结束时间之后。

代码:(datediff(mi,cast(convert(varchar(10),end_hr+':'+end_min+':00',108) as datetime),cast(convert(varchar(10),@EndHour+':'+@EndMinute+':00',108) as datetime))>0 and
datediff(mi,cast(convert(varchar(10),Start_hr+':'+Start_min+':00',108) as datetime),cast(convert(varchar(10),@StartHour+':'+@StartMinute+':00',108) as datetime))<0)
若取出来的count大于0,则电影排期存在冲突,弹出对话框提示管理员。

(只能由管理员添加电影排期。


3. 鼠标放在图片上没放大却隐藏
解决方案:不使用另外一个PictureBox覆盖原本PictureBox,直接修改原本PictureBox大小,并设置pb.SizeMode = PictureBoxSizeMode.StretchImage,即可使图片随PictureBox增大而增大。

4. 电影不按上映时间降序排列
解决方案:放弃原先在数据库中orderby desc的想法,直接在取电影信息的时候在结尾加上orderby desc即可。

5. 用户可取消他人订单
解决方案:在取消前调用函数BLL.Main.OrderCustomerFind(scheduleInfo.ScheduleID, seatInfo.SeatID)取出该座位订购者和当前用户id是否一致,否则不能取消订单。

6.管理员可设置一个已选座位不可用
解决方案:在用户订座以后,立刻设置该座位的“设置为不可用”按钮的enable属性为
false,则当管理员按下任何已选座位时,“设置为不可用”按钮均不可用。

当管理员设置了一个座位为不可用成功后,订座和取消按钮均不可用。

7. 每新增一个电影的排期,座位增加问题
解决方案:每新增一个电影的排期,则采用一个循环自动增加50个该排期的座位,IsActive属性均设置为NULL。

4.2不足
1.一个订单只能订一个座位
2.没有实现支付和发送短信功能
3.刷新电影时延大,系统运行有点慢(测试机器cpu为Intel i3-2310M,主频2.1GHz,若
在I5cpu(实验室机器)中测试,则无延迟效果。


4.没有分离管理员和前台登记者,没有分离客户和管理员信息表,即客户和管理员信息存
储在同一张表中
5.订票系统规模较小,只有3个放映厅,而且每个放映厅的座位固定为50个
5小组详细分工。

相关文档
最新文档