1、 电影订票系统 组长:王润森 组员:尹佩珊、谢楚璇、吴绮玲 完成日期: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、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选座窗口使用DataGridView控件显示座位信息 26 3.3控制电影排期时间,避免冲突 26 3.4模拟交易
3、过程 28 4系统报告测试 28 4.1存在问题以及解决方案 28 4.2不足 30 5小组详细分工 30 1系统使用说明及软件基本功能 1.1用户 1.1.1用户注册 功能介绍: 为用户提供一个注册会员的友好界面。 使用说明: 输入注册信息,包括用户名,用户密码,昵称,性别,邮箱,手机号码,邮箱,QQ号码。输入完成后点注册按钮完成注册。如果信息填写的格式不对,则无法完成注册,并返回提示信息。 图1-1-1用户注册界面 1.1.2用户登陆 功能介绍: 为用户提供一个登录界面。 使用说明: 输入帐号、密码均正确,才登录成功,否则登录失败,若用户名或者
4、密码为空,则返回提示信息。 图1-1-2用户登录界面 1.1.3浏览电影 功能介绍: 通过一个友好的欢迎界面显示可订票的电影信息,待上映的电影信息等。 使用说明: 电影按时间先后进行排列,用户可以了解各电影的放映顺序。页面左上角显示订票入口和修改个人信息入口。 图1-1-3电影的界面 1.1.4用户资料管理 功能介绍: 为用户提供修改个人资料的界面 使用说明: 此界面提供用户个人信息(包括用户名,用户密码,昵称,性别,邮箱,手机号码,邮箱,QQ号码)的完善与修改。用户密码采用的是MD5加密算法,修改密码时会弹出密码修改对话框,用户需要输入原始密码,新密码,还要进
5、行新密码确认,若原始密码错误,则返回提示信息并无法进行密码修改。 图1-1-4用户资料管理界面 1.1.5浏览电影简介 功能介绍: 为用户提供一个电影简介的页面,用户可以选择订购该影片,购买的票数,放映时间,放映厅都会在此页面显示。 使用说明: 用户可以查看电影库中所正在上映电影的介绍(包括导演,主演,时长,语言,类型,上映时间,票价,简介),可以在线订购。当用户点击选票按钮时,用户将被转到所选电影订购页面。 图1-1-5电影简介界面 1.1.6 观看预告片 功能介绍: 为用户提供观看预告片功能。 使用说明: 点击此按钮,用户可以观看电影的预告片,以此决定是否
6、购票。 图1-1-6观看预告片 1.1.7订购电影 功能介绍: 为用户提供选择观看座位,订购电影票的界面。 使用说明: 用户可以选择灰色座位,红色座位表示不可选,黄色座位表示已选。点击确认购买时,当用户选择完之后,将被转到售票处结算,并自动扣除金额。完成支付后,用户会收到支付成功短信,可凭借短信到前台取票。用户可点击取消订座按钮取消订座,但无法取消别人所订的票。 图1-1-7电影订票界面 1.2管理员 1.2.1后台用户登录 功能介绍: 后台用户即系统管理员,系统管理员将通过专有的入口登录到该系统,对用户不可见。 使用说明: 管理员通过输入账号、密码进入系统管
7、理界面,成功登陆之后,可对电影票的信息进行操作、管理及对电影进行更新等操作。 1.2.2后台管理员主页 功能介绍: 为管理员提供一个对电影信息的综合管理平台 使用说明: 电影按时间先后进行排列,管理员可以了解各电影的放映顺序,每部电影下方均提供更新和删除入口。页面左上角显示现场购票入口、修改个人信息入口和增加电影入口。 图1-2-1管理员界面 1.2.3增加电影 功能介绍: 为管理员提供一个增加电影的界面 使用说明: 点击“增加电影”按钮进入该页面,填写电影的详细信息,上传电影海报,点击下方“增加”按钮即可成功增加一部电影。 图1-2-2管理员增加电影的界面
8、1.2.4更新电影页面 功能介绍: 为管理员提供一个可以修改电影详细信息、更新电影上映场次的界面。 使用说明: 1. 点击电影下方“更新”按钮进入该页面,可以对电影详细信息进行修改,修改完毕点击“更新”按钮即可保存。通过下方对放映厅的选择和对上映日期和开始时间(结束时间会根据电影时长自动进行更新)的填写,点击“新增”按钮及可增加该电影的上映场次。 【假如上映时间在当前时间之前,则提示管理员重新输入。】 图1-2-3管理员更新电影的界面(1) 2. 若要删除该电影的某个上映场次,点击该上映场次的“删除”按钮即可成功删除。【假如已有订座,则无法删除。】 图1-2-4管理员更新
9、电影的界面(2) 3. 若填写了新增的上映场次,没有点击“新增”按钮,却点击了“删除”按钮,则会弹出“没有更新…怎么删除…”的提醒窗口。 图1-2-5管理员更新电影的界面(3) 1.2.5删除电影 功能介绍: 为管理员提供一个删除电影的入口 使用说明: 点击待删除电影下方的“删除”按钮,在弹出的窗口中点击“是”即可成功删除该电影。【假如已有订座则无法删除,若所有排期均无订座,则可连同电影、排期一同删除。】 图1-2-6管理员删除电影的界面 1.2.6座位管理 功能介绍: 为管理员提供一个管理座位的界面 使用说明: 1. 若管理员发现某个座位是不可用的,则选中该
10、座位,点击右下角“设置为不可用”按钮,即可把该座位设置为不可用,颜色显示为红色。 图1-2-7座位管理界面(1) 2. 若需要把某个不可用的座位设置为可用,即选中该座位,点击右下角“设置为不可用”按钮,即可把该座位设置为可用,颜色显示为灰色。 图1-2-8座位管理界面(2) 1.2.7 插入预告片 功能介绍: 管理员可插入预告片供观众观看。 使用说明: 点击“插入预告片”按钮进入该页面,从本机中选中视频便可将视频文件名插入到数据库里面,并复制预告片文件到本目录下。 图1-2-9插入预告片 1.2.8现场订票 功能介绍: 为管理员提供一个替用户现场选票的页面。
11、 使用说明: 点击“购票”按钮进入该页面,选中座位,点击下方“订座”按钮成功购票,在弹出的窗口中点击“确定”按钮即可。该座位颜色改为黄色,意为该座位以被选中。 图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(2
12、0) 否 否 客户名字 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) 是 否 导演 d
13、uration varchar(10) 是 否 片长 languages varchar(20) 是 否 语言 f_type varchar(50) 是 否 类型 descriptions varchar(1000) 是 否 简介 price int 是 否 价格 poster image 是 否 电影海报 startdate date 是 否 上映日期 prevue_path varchar(500) 是 否 预告片 排期信息表(schedules) 字段 类型 允许为空 是否为主键 描述 sch
14、id int 否 主键 排期编号 f_id int 是 外键 电影编号 h_id int 否 否 放映厅号 dates date 否 否 放映日期 start_hr varchar(2) 否 否 放映开始的小时 start_min varchar(2) 否 否 放映开始的分钟 end_hr varchar(2) 否 否 放映结束的小时 end_min varchar(2) 否 否 放映结束的分钟 座位信息表(seats) 字段 类型 允许为空 是否为主键 描述 s_id int 否 主键
15、座位编号 sch_id int 否 外键 排期编号 row int 是 否 第i排 col int 是 否 第i列 isActive bit 是 否 是否已订 订单信息表(orders) 字段 类型 允许为空 是否为主键 描述 o_id int 否 主键 订单编号 c_id varchar(20) 否 外键 客户账号 sch_id Int 否 外键 排期编号 s_id Int 否 外键 座位编号 way_of_payment varchar(40) 否 否 支付方式 dates dat
16、e 否 否 订单日期 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、isA
17、ctive 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、d
18、ates、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 [CinemaBookingSys
19、tem] 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 N
20、ULL, [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] [varc
21、har](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 OF
22、F 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)
23、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 [PR
24、IMARY] ) 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]
25、[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, S
26、TATISTICS_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
27、 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_D
28、UP_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]
29、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_N
30、ORECOMPUTE = 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
31、[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/201
32、3 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]
33、 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__s
34、chedules__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
35、/****** 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__sc
36、hedules__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
37、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
38、].[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_
39、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]
40、[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:
41、 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从Da
42、taTable里面取出电影信息,每取得一条电影信息,则new一个放置电影海报的PictureBox和Text为电影名的Button(若身份为管理员,则还有更新和删除按钮)。手动设置控件的各种属性和事件,使用条件判断语句:if (xGap + x * (pb.Width + xGap) + pb.Width > panelOfGroupBox.Width)实现当电影在一行内放不下时(即大于panel的宽度),自动更改后面电影的Location,并且panel停靠在父窗口gb_Movies上,gb_Movies的Dock属性为Fill,并且窗体默认最大化且不能更改,从而实现了在不同屏幕大小的计算机
43、上运行都能有同样的效果(不会超出显示屏的宽度)。并能实现鼠标移动到图片上时放大图片效果和点击图片或按钮弹出电影详细信息窗口。 3.2选座窗口使用DataGridView控件显示座位信息 1. 由于考虑到直接将图片转化为二进制数据存进数据库作为座位的使用情况带来操作上的不方便以及空间上的浪费,本系统使用bit类型来储存座位使用的3种情况,分别是可选(Null表示)、不可选(0表示)、已选(1表示),其中“不可选”状态由管理员设定以灵活地使用座位(防止座位不存在或座位维修却被用户选中的情况的发生)。 2. 在显示座位使用情况下,本系统使用DataGridView控件,在窗体弹出后立即载入该排
44、期的详细信息(包括电影名、放映厅以及上映时间),并通过以上信息从数据库里面取出该排期的座位情况,再根据座位使用情况在DataGridView的单元格上增加图片,并根据座位的数量动态增加DataGridView的行数(1行10个座位,超出则新增一行)。 3. 当用户选了座位后,重新加载座位表更新座位信息,并在选座中加入了并发控制,一旦发现冲突,立刻回滚。 3.3控制电影排期时间,避免冲突 1. 更新或新增电影排期前,先调用CheckScheduleRepetition()函数,从数据库里面取出上映日期和放映厅都相同而且满足一下3个条件之一的数据: ①新增电影的开始时间在已存在电影的开始时
45、间和结束时间之间;(新增电影的开始时间可等于已存在电影的结束时间,但不能等于已存在电影的开始时间。) 代码:(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 datet
46、ime),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',10
47、8) 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
48、',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,则电影排期存在冲突,弹出对话框提示管理员
49、只能由管理员添加电影排期。) 2. 由于数据库的开始小时和分钟采用字符串类型,因此需要使用函数cast(convert(varchar(10),Hour+':'+Minute+':00',108) as datetime)来将字符串转化为datetime类型,再用datediff函数进行比较。 3.4模拟交易过程 1. 为了模拟交易的过程,用户在确定了订单信息并确认支付后,本系统新开一个线程弹出一个窗口显示“正在支付…”并让系统睡眠1.5秒,然后更改Label信息为“正在发送短信…”并再次睡眠1.5秒,然后再将订单信息增加进数据库,并弹出“支付成功,你的订单号是XXX,可凭借短信到前
50、台取票”信息。 2. 假如登录者是管理员admin,则不执行该线程,直接弹出对话框“现场选座成功,你的订单号是XXX”信息。 4系统报告测试 4.1存在问题以及解决方案 1. 注册和更新同时判断用户是否存在 解决方案:将判断用户是否存在的函数BLL.Register.userRepetition(string account)从BLL层分离出来,单独加在注册中。 2. 电影排期时间冲突 解决方案:调用CheckScheduleRepetition()函数,从数据库里面取出上映日期和放映厅都相同而且满足一下3个条件之一的数据: ①新增电影的开始时间在已存在电影的开始时间和结束时间






