分享 | C#编写的电影售票系统(附源码+数据库)
最近疫情真的很可怕,大家要注意保护好自己,响应国家的号召。尽量不出门,可以利用这个时间好好充实自己。
也希望武汉和中国能尽快好起来,大家都健健康康,相安无事。
01 介绍
这个是小编上学期的C#课程结课作业,是小组完成的。这次一并分享出来啦。嗯……为什么界面这么少女心呢,并不是小编有一颗少女心,而是因为UI部分是同组的女生负责设计的。
我们做的是一个有会员制的电影院购票系统。具有会员注册功能,可区分会员和散客两种身份,实现会员及折扣管理。购票具有挑选电影场次,选择座位和查看电影信息等功能:
代码获取
关注我们的公众号!
在后台回复【CSTK】不包括【】即可获取。
02 设计思路
在功能设计上,一个电影院购票系统,首先需要具备最基础的功能:影片选择、场次选择和座位选择。
在用户提交选择后,需要支付模块提示用户付款并完成出票。为了吸引用户,我们增加了会员的注册和登录模块,为会员用户提供折扣。
注册与购票的支付我们的处理是预留一个接口,当做简单模拟,实际使用可以调用支付宝或微信的支付接口。
在界面设计上,我们为系统添加了好看的背景图片。通过Detail栏展示用户信息与折扣,通过Hot Movie栏在最吸引眼球展示热映电影的海报,提高用户的购买欲望。
最后,作为主要部分的座位选择栏简介明了,座位之间间隔明显,有效的防止用户错误操作。
03 具体设计
通过三层架构来完成影院购票系统的开发,将真个业务应用划分为:界面层(UI层)、业务逻辑层(BLL层)、数据访问层(DAL层)。
对于复杂的系统分层让结构清晰,便于对系统进行整体的理解、把握;而且便于维护,将各部分之间的相互影响的程度降低到最小,系统基本的架构可以通过工具自动生成代码。当数据库发生改变时,只用重新生成代码,改动业务逻辑层的部分代码即可。
在实施的过程中,难点在于将三层结构进行划分,掌握各层之间的设计思路以及调用关系,下面内容就结合代码展示具体实现过程。
1) Model层
这层的作用是封装数据,使数据在三层中传输。例如Movie:
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为例):
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为例):
namespace BLL
{
public class TicketBLL
{
public static bool AddTickets(List tickets)
{
return true;
}
}
}
4) UI层
这一层负责显示和采集用户操作。系统总共包含五个界面,分别为:用户登录界面、用户注册界面、影院主页、票务信息确认界面、支付界面以及取票信息界面。
同时,使用Winform皮肤插件来实现对系统界面整体风格的把控。下面将以界面的为单位来对其实现过程进行描述:
》用户登录界面
用户将身份信息写入文本框后,用其输入的信息创建新的customer对象,通过调用BLL层的功能将输入内容与用户信息比对,最后用判断语句激活弹窗反馈登陆结果,登陆成功后进入到售票系统首页。
同时,用户可以点击注册按钮,跳转到注册界面完成新用户的注册。
用户将身份信息写入文本框后,用其输入的信息创建新的customer对象,通过调用BLL层的服务将新的用户信息写入数据库,最后用判断语句激活弹窗对注册结果予以反馈。
04 数据库设计
数据库采用的是SQLSERVER,可以复制下面的脚本到查询框执行,即可得到数据库和样本数据。
系统中采用DbContext方式直接连接数据库。一个DbContext映射了所有的数据库表。具体代码如下:
namespace Model
{
public class CinemaDbContext : DbContext
{
public static CinemaDbContext CDbContext = new CinemaDbContext();
public CinemaDbContext() : base("data source=.\\SQLSERVER1;initial catalog=Cinema;Integrated Security=SSPI;") //构造函数,指定数据库名称的约定连接
{
//Code first会在第一次ef查询的时候会对__MigrationHistory访问,是为了检查数据库和model是否匹配,以保证ef能正常运行
Database.SetInitializer
(null); }
//public BookDbContext() : base("Data Source=.;Initial Catalog=Students;Integrated Security=SSPI;") { }
//DbSet是一个模版类,<>中代表的是模版类中的实体类
public DbSet
Customers { get; set; } public DbSet
Halls { get; set; } public DbSet
Movies { get; set; } public DbSet
Schedules { get; set; } public DbSet
Tickets { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//取消复数表名惯例
modelBuilder.Conventions.Remove
(); }
}
}
各表的设计如下:
Customer表:保存注册用户的用户名和密码,建议加密后保存。
Hall表:保存每个影厅的信息,包括一行的座位数和一列的座位数。
Movie表:保存电影的信息,电影名,类型,演员等。
Schedule表:保存电影院的排片信息,包括价格,放映时间等。
Ticket表:保存电影票的信息,包括排片信息,具体座位等。
》数据库脚本
TIP:直接复制源代码说明文件中的数据库脚本到SQLSERVER中执行即可得到数据库和相应的数据。调整一下代码即可连接到程序中使用。
脚本文件附录在源代码的README文件最后。