# 01 介绍
一个有会员制的电影院购票系统。具有会员注册功能,可区分会员和散客两种身份,实现会员及折扣管理。购票具有挑选电影场次,选择座位和查看电影信息等功能。
- 查看电影详情、获取排片信息。
- 选择场次座位,完成支付,获取取票信息。
- 注册成为影院会员,享受优惠折扣。
![](https://upload-images.jianshu.io/upload_images/10386940-ccca49013103e612.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/10386940-5e98b3d7421fd2e7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/10386940-5117b6f7fc65dad3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/10386940-230f05b0d09e1e52.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
# 代码获取
**关注我们的公众号!在后台回复【CSTK】不包括【】即可获取。**
![](http://upload-images.jianshu.io/upload_images/10386940-ba0c519723650398.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
# 02 设计思路
在功能设计上,一个电影院购票系统,首先需要具备最基础的功能:影片选择、场次选择和座位选择。在用户提交选择后,会需要支付模块提示用户付款并完成出票。为了吸引用户,我们增加了会员的注册和登录模块,为会员用户提供折扣。
注册与购票的支付我们的处理是预留一个接口,当做简单模拟,实际使用可以调用支付宝或微信的支付接口。
在界面设计上,我们为系统添加了好看的背景图片。通过Detail栏展示用户信息与折扣,通过Hot Movie栏在最吸引眼球展示热映电影的海报,提高用户的购买欲望。最后,作为主要部分的座位选择栏简介明了,座位之间间隔明显,有效的防止用户错误操作。
# 03 具体设计
通过三层架构来完成影院购票系统的开发,将真个业务应用划分为:界面层(UI层)、业务逻辑层(BLL层)、数据访问层(DAL层)。对于复杂的系统分层让结构清晰,便于对系统进行整体的理解、把握;而且便于维护,将各部分之间的相互影响的程度降低到最小,系统基本的架构可以通过工具自动生成代码。当数据库发生改变时,只用重新生成代码,改动业务逻辑层的部分代码即可。在实施的过程中,难点在于将三层结构进行划分,掌握各层之间的设计思路以及调用关系,下面内容就结合代码展示具体实现过程。
**1) Model层( 封装数据,使数据在三层中传输)**
例如Movie:
```C#
namespace Model
{
public class Movie
{
[Key]
public int MovieID { get; set; }
public string MovieName{ get; set; } /// 电影名称
public string Actor { get; set; } /// 主演
public string Director { get; set; }/// 导演名
public int Duration { get; set; } //时长
public string MovieType { get; set; }/// 电影类型
public string Poster{ get; set; } /// 海报图片名
}
}
```
**2) DAL层(提供基本的数据访问)**
实现代码(以Movies为例):
```C#
namespace DAL
{
public class MovieDAL
{
public static List
GetAllMovies()
{
var MoviesQuery = from m in CinemaDbContext.CDbContext.Movies
select m;
return MoviesQuery.ToList();
}
public static Movie GetMovieByMovieID(int mID)
{
return CinemaDbContext.CDbContext.Movies.Find(mID);
}
}
}
```
**3) BLL层(负责处理业务逻辑,在本次的系统开发中,包括了与用户和影票信息相关的处理)**
实现代码(以TicketBLL为例):
```C#
namespace BLL
{
public class TicketBLL
{
public static bool AddTickets(List tickets)
{
return true;
}
}
}
```
**4) UI层(负责显示和采集用户操作)**
系统总共包含五个界面,分别为:用户登录界面、用户注册界面、影院主页、票务信息确认界面以及支付界面。同时,使用Winform皮肤插件来实现对系统界面整体风格的把控。下面将以界面的为单位来对其实现过程进行描述:
- **用户登录界面**
用户将身份信息写入文本框后,用其输入的信息创建新的customer对象,通过调用BLL层的功能将输入内容与用户信息比对,最后用判断语句激活弹窗反馈登陆结果,登陆成功后进入到售票系统首页。
```C#
private void button1_Click(object sender, EventArgs e)
{
Customer cLogin = new Customer
{
UserName = this.textBox1.Text,
PassWord = this.textBox2.Text
};
if (CustomerBLL.Login(cLogin))
{
MessageBox.Show("登录成功");
MainForm mainForm = new MainForm();
mainForm.customerVIP = cLogin;
mainForm.Show();
this.Visible = false;
}
else
{
MessageBox.Show("登录失败");
}
}
```
同时,用户可以点击注册按钮,跳转到注册界面完成新用户的注册。
```C#
private void button3_Click(object sender, EventArgs e)
{
UserRegisterForm userRegisterForm = new UserRegisterForm();
userRegisterForm.Show();
this.Visible = false;
}
```
- **用户注册界面**
用户将身份信息写入文本框后,用其输入的信息创建新的customer对象,通过调用BLL层的服务将新的用户信息写入数据库,最后用判断语句激活弹窗对注册结果予以反馈。
```C#
private void button1_Click(object sender, EventArgs e)
{
PayForm payform = new PayForm(true);
payform.ShowDialog();
//Thread.Sleep(7000);
//payform.Visible = false;
Customer cRegister = new Customer
{
UserName = this.textBox1.Text,
PassWord = this.textBox2.Text
};
if (CustomerBLL.Register(cRegister))
{
MessageBox.Show("注册成功");
UserLoginForm userLoginForm = new UserLoginForm();
userLoginForm.Show();
this.Visible = false;
}
else
{
MessageBox.Show("注册失败");
}
}
```
- **排片详情获取**
```C#
///
/// 初始化TreeView控件
///
private void InitTreeView()
{
tvMovies.BeginUpdate();
tvMovies.Nodes.Clear();
TreeNode movieNode = null;
foreach(Movie m in MovieDAL.GetAllMovies())
{
movieNode = new TreeNode(m.MovieName);
tvMovies.Nodes.Add(movieNode);
foreach (Schedule s in ScheduleDAL.GetSchedulesByMovieID(m.MovieID))
{
TreeNode timeNode = new TreeNode(s.DateTime);
timeNode.Name = s.ScheduleID.ToString();
movieNode.Nodes.Add(timeNode);
}
}
tvMovies.EndUpdate();
}
```
- **影厅初始化**
```C#
///
/// 初始化放映厅座位
///
/// 行数
/// 列数
///
//普通厅放映
private void InitSeatsCheckBox(int seatRow, int seatCol, TabPage tb, Dictionary ckBox, Dictionary cSeats)
{
CheckBox checkBox;
Seat seat;