电影售票预定系统档案
一.摘 要
随着人们生活水平的不断提高,人们生活的消费和需求也越来越旺盛。电影院售票系统可以实现影片的登记和电影票的购买, 可以方便 的进行电影以及实时影票信息的查询等,从而做到方便的售票操作, 方便了工作人员的同时也让顾客能够轻轻松松地买票, 我们的宗旨是 一个字:快! ;两个字:便捷。因此,该系统主要根据实际需求,划分了电影信息管理,每场电影的坐位信息管理,每个电影的预定情况,并选用Visual Studio 。NET 2008开发工具和 SQL Server 2005数据库,采用B/S模式实现了从客户来访、报价、订购等多个环节数据的跟踪管理服务,基本上满足了电影销售管理流程。 关键词:销售管理;B/S模式;数据库;.NET
1.2 定义:
查询:对数据库的操作的一种,用于搜索数据信息。
插入:对数据库的操作的一种,用于将数据存入数据库中。 更新:对数据库的操作的一种,用于更改数据库中的数据信息。 软件结构图:反映软件系统的功能模块之间的关系的数据图。
二.电影售票预定系统的需求分析
2。1系统需求
本电影售票预定系统是一个协助影院进行全面管理的一个信息管理系统.本管理系统在实现上应满足以下需求:
1。能达到网站和影院间的无缝链接和数据的共享。 2.为系统提供数据支持。
3.不同级别的用户拥有相应的权限使用该系统,从而大大提高了系统的安全性和管理效率。
首先将电影信息入库,然后影院通过与客户的交易活动,将相关信息存入库,然后影院通过销售信息的查询获得电影票销售的情况,通过库存查询获得影院目前的剩票情况。由此可分析系统需要达到以下目标:
1。 能很好地完成电影票售前管理.售前管理包括影院信息,电影场次,电影片名信息的入库作业.
2。 能详细地记录影院和客户的交易过程,即订票或退票的情况。
3. 能详细地记录电影场次跟票数量的关系,即某场的电影和剩余票的关系。
4. 能及时准确地获得影院和市场的需求.即通过对电影场次,片名及票务销售的情况信息查询获得相应的结果,以备公司作为参考,从而安排更好的电影场次。
5. 能够对各场电影票销售的情况进行相应的记录。包括对订票,退票,修改等。
6。 能够对不同权限的用户进行合理的管理。包括添加用户,删除用户,用户账号和密码管理等。
2。2数据字典描述
数据字典是各累数据描述的集合。对数据库设计来讲,数据字典是进行详细的数据收集和数据分析所获得的主要结果。
数据字典通常包括数据项、数据结构、数据流、数据存储和处理过程5个部分。其中数据项是最小的组成单位,若干个数据项可以组成一个数据结构,数据字典对数据项和数据结构的定义来描述数据流、数据存储的逻辑内容。
数据字典是关于数据库中数据的描述,即元数据,而不是数据本身。数据本身将存在物理数据库中,由数据库系统管理.数据字典有助于这些数据的进一步管理和控制,为设计人员和数据库管理员在数据库设计、实现和运行阶段控制有关数据提供依据。
2。3 程序描述
各功能详细描述:
本系统主要用于电影票预订,所以提供了以下几个子功能:用户注册,用户登陆,电影详细内容,生成订单,退订订单,付款,以及后台方面的电影的添加,以及电影的查询等后台功能.
1、用户注册:新用户可以通过注册会员来登陆.
2、用户登陆:登陆后的会员才能进行购票,查询订单。
3、电影详细内容:点击进入后可以查看电影的详细信息。包括:时长,价格,上映的时间等。
4、生成订单:该项功能提供用户选择购买电影票的数量,及取消订单等操作. 5、退订功能:会员可以选择是否取消已经生成的电影订单。
6、付款:此页面用户可以选择付款方式,并最终确定订单的生成。
7、后台电影的添加:该功能只有机场管理员有权力操作,管理员可以通过影院电影场次的安排来增加电影的内容,信息等操作。
三.概念结构设计
3。1软件结构:
电影售票预定系统 数据信息 数据信息 数据输入 数据输入 判断信息 判 断结果 判断查询 返回订单等 准备SQL 确定错误原因 返回影片信息 数据信息 数据输出 数据信息 数据信息 数据判断 数据信息 数据处理、查询 数据信息 页面信息录入 数据录入 数据库操作 用户登陆 生产订单 显示错误原因 确定订单 登陆信息 3。2 E-R图向关系模型转换:
电影售票预定系统的基本E-R图
下面分别介绍表的结构:
编号 1 2 3 4 5 6 7 8 字段名称 电影编号 电影名 价格 时长 上映时间 电影简介 票数 图片 结构类型 Int char Money Char Datetime Char Int Char 1 电影表结构
大小 20 10 200 60 2 订单表结构
编号 1 2 3 4 5 6 7 8 字段名称 订单编号 会员名 订单日期 发货方式 付款方式 总金额 是否发货 备注 结构类型 Int char Datetime Char Char Float Bit Next 大小 20 20 20 20 3 购物车表结构
编号 1 2 3 4 字段名称 购物车编号 会员名 电影编号 数量 结构类型 Int Char Int Int 大小 12 4 管理员表结构
编号 1 2 3 字段名称 用户名 密码 权限 结构类型 Char Char Int 大小 20 32 5 会员表结构
编号 1 2 字段名称 会员名 名字 结构类型 Char Char 大小 12 20 说明 不允许为空 不允许为空 说明 不允许为空 不允许为空 不允许为空 说明 不允许为空 外键 不允许为空 不允许为空 说明 主键 不允许为空 不允许为空 不允许为空 不允许为空 不允许为空 不允许为空 允许为空 说明 主键 主键 不允许为空 不允许为空 允许为空 不允许为空 不允许为空 不允许为空 3 4 5 6 7 8 密码 性别 出生日期 联系地址 联系电话 邮政编码 Char Char Datetime nchar Char Char 32 2 60 13 6 6 详细订单表结构
不允许为空 允许为空 允许为空 不允许为空 不允许为空 不允许为空 编号 1 2 3 4 字段名称 订单编号 会员名 电影编号 数量 结构类型 Int Char Int Int 大小 12 说明 外键 不允许为空 不允许为空 不允许为空 3.3 源程序代码
创建数据库 电影售票 创建6个表,两个视图
创建电影表
USE [电影售票] GO
/****** 对象: Table [dbo]。[电影表] 脚本日期: 12/23/2011 15:57:34 ******/
SET ANSI_NULLS ON GO
SET QUOTED_IDENTIFIER ON GO
SET ANSI_PADDING ON GO
CREATE TABLE [dbo]。[电影表](
[电影编号] [int] NOT NULL, [电影名] [char](20) NULL,
[价格] [money] NULL, [时长] [char](10) NULL, [上映时间] [datetime] NULL, [电影简介] [char](200) NULL, [票数] [int] NULL, [图片] [char](60) NULL
) ON [PRIMARY] 创建订单表
CREATE TABLE [dbo].[订单表]( (
[订单编号] 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] 创建购物车表
CREATE TABLE [dbo]。[购物车表](
[购物车编号] [int] NOT NULL, [会员名] [char](12) NULL, [电影编号] [int] NULL, [数量] [int] NULL,
[订单编号] [int] NOT NULL, [会员名] [char](20) NULL, [订单日期] [datetime] NULL, [发货方式] [char](20) NULL, [付款方式] [char](20) NULL, [总金额] [float] NULL, [是否发货] [bit] NULL, [备注] [ntext] NULL,
CONSTRAINT [PK_订单表] PRIMARY KEY CLUSTERED
CONSTRAINT [PK_购物车表] PRIMARY KEY CLUSTERED (
[购物车编号] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] 创建管理员表
CREATE TABLE [dbo].[管理员表](
[用户名] [char](20) NOT NULL, [密码] [char](32) NULL, [权限] [int] NULL
) ON [PRIMARY] 创建会员表
CREATE TABLE [dbo].[会员表](
[会员名] [char](12) NOT NULL,
(
[名字] [char](20) NULL, [密码] [char](32) NULL, [性别] [char](2) NULL, [出生日期] [datetime] NULL, [联系地址] [nchar](60) NULL, [联系电话] [char](13) NULL, [邮政编码] [char](6) NULL,
CONSTRAINT [PK_会员表] PRIMARY KEY CLUSTERED
[会员名] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] 创建详细订单表
CREATE TABLE [dbo].[详细订单表](
[订单编号] [int] NULL, [会员名] [char](12) NULL, [电影编号] [int] NULL, [数量] [int] NULL
) ON [PRIMARY]
创建购物车视图
SET ANSI_NULLS ON GO
SET QUOTED_IDENTIFIER ON GO
ALTER VIEW [dbo]。[购物车视图] AS
SELECT dbo。购物车表。购物车编号, dbo。购物车表。会员名, dbo.购物车表。电影编号, dbo.购物车表.数量, dbo。电影表。电影名, dbo。电影表.价格 FROM dbo。购物车表INNER JOIN
dbo。电影表ON dbo。购物车表。电影编号= dbo。电影表。电影编号
创建详细订单视图
ALTER VIEW [dbo]。[详细订单视图] AS
SELECT dbo.订单表。订单编号, dbo.订单表。会员名, dbo.订单表.发货方式, dbo.订单表.订单日期, dbo。订单表。付款方式, dbo.订单表.是否发货, dbo。订单表。备注, dbo。详细订单表.数量, dbo.详细订单表.电影编号, dbo。电影表。电影名, dbo。电影表。价格, dbo.订单表。总金额 FROM dbo。订单表INNER JOIN
dbo。详细订单表ON dbo。订单表.订单编号= dbo.详细订单表。订单编号INNER JOIN
dbo。电影表ON dbo.详细订单表。电影编号= dbo.电影表.电影编号
存储过程
ALTER procedure [dbo]。[添加电影计划] @电影编号int, @电影名char(20), @价格money, @时长char(10), @上映时间datetime, @电影简介char(200), @票数int, @图片char(60), @返回值char(50)output as begin
if (select COUNT(*) from 电影表where 电影编号=@电影编号)〉0 set @返回值='库中已有,请先重新信息’ return —1 end
insert into 电影表
values(@电影编号,@电影名,@价格,@时长,@上映时间,@电影简介,@票数,@图片); set @返回值=’添加成功' return 1
网页界面
定义一个DB类
using System;
using System。Data;
using System。Configuration; using System.Web;
using System。Web.Security; using System。Web.UI;
using System.Web.UI.WebControls;
using System。Web.UI.WebControls.WebParts; using System.Web。UI.HtmlControls; using System.Data.SqlClient;
/// public SqlConnection Con = new SqlConnection(); public SqlCommand Com = new SqlCommand(); public SqlDataAdapter Da = new SqlDataAdapter(); public DataSet Ds = new DataSet(); public DB() { } // // TODO: 在此处添加构造函数逻辑 // //定义一个用于返回数据库连接字符串的方法 public String GetConnectionString() { String ConStr; ConStr = @”Data Source=.\\SQL2005;Initial Catalog=电影售票;Persist Security Info=True;User ID=sa;Password=sql2005\"; return ConStr; } //定义一个用于返回数据集的公共查询方法 public DataSet GetDataTableBySql(String SqlStr) { Con.ConnectionString = GetConnectionString(); Com。Connection = Con; Com.CommandText = SqlStr; Da。SelectCommand = Com; try { Ds.Clear(); Con。Open(); Da。Fill(Ds); Con。Close(); } catch (SqlException) { Con。Close(); } return Ds; } public bool GetBoolBySql(String SqlStr) { Con.ConnectionString = GetConnectionString(); Com.Connection = Con; Com。CommandText = SqlStr; Da。SelectCommand = Com; try { Ds.Clear(); Con.Open(); Da。Fill(Ds); Con.Close(); } catch (SqlException) { Con。Close(); } if (Ds.Tables [0]。Rows。Count !=0) return true ; else return false ; } //定义一个用于返回执行数据更新操作是否成功标志的方法 public Boolean UpdateDataBySql(String SqlStr) { Con.ConnectionString = GetConnectionString(); Com.Connection = Con; Com.CommandText =SqlStr; try { Con.Open(); Com。ExecuteNonQuery(); Con。Close(); return true; } catch (SqlException) { Con。Close(); return false; } } } 主界面有购物车,订单查询,账号登陆,电影信息显示,管理员登陆 账号登陆 protected void Button1_Click(object sender, EventArgs e) SqlStr = \"select * from 会员表 where 会员名=’” + this.TextBox1.Text + ”' and 密码=’\" + this.TextBox2.Text + \"'\"; Ds = db。GetDataTableBySql(SqlStr); try { if (Ds。Tables[0]。Rows.Count == 0) { this.Label1.Text = ”用户名或密码错误,请重试!\"; this.TextBox1。Focus(); } else { this.Label1。Text =”用户 \"+this。TextBox1。Text + ” 恭喜您登录成功!\"; Session[\"UserName”] = this.TextBox1。Text; } } catch (Exception) { this。Label1.Text = \"没有得到任何数据,请重试!”; } } 注册用户 protected void btn_Register_Click(object sender, EventArgs e) { String Md5_User_Pwd = FormsAuthentication。HashPasswordForStoringInConfigFile(this.txt_User_Pwd.Text, ”MD5\"); DB db = new DB(); SqlConnection conn = new SqlConnection(@\"Data Source=.\\SQL2005;Initial Catalog=电影售票;Persist Security Info=True;User ID=sa;Password=sql2005”); conn。Open(); String SqlStr = ”insert into 会员表(会员名,密码,名字,性别,出生日期,联系地址,邮政编码,联系电话)\" + \"values('\" + this.txt_User_Name.Text + \"',’\" + Md5_User_Pwd + \"’,'” + this.txt_Rel_Name。Text + \"’,” + ”'\" + this.DDL_Sex.SelectedItem.Text + ”’,’\" + this。DDL_Year。SelectedItem。Text + \"-” + this.DDl_Month。SelectedItem.Text + \"—\" + this。DDL_Day.SelectedItem。Text + \"',” + ”’” + this.txt_Address。Text + \"','\" + this.txt_Postalcode。Text + \"','\" + this.txt_Tel。Text + ”')”; Boolean InsertResult; SqlCommand cmd = new SqlCommand(SqlStr, conn); int i = Convert。ToInt32(cmd.ExecuteNonQuery()); if (i==1) { this。Labinfo。Text = \"恭喜您注册成功!\"; } else { this。Labinfo。Text = \"对不起,注册失败,请重试!”; this。txt_User_Name。Focus (); } } 显示电影 register.aspx; 数据库调用cs代码 SqlStr = ”select * from 电影表”; Ds = db。GetDataTableBySql(SqlStr); try { if (Ds。Tables[0]。Rows.Count != 0) { this。DataList1。DataSource = Ds.Tables[0]。DefaultView; this.DataList1。DataBind(); } } catch (Exception) { Response。Write(”} 价格结算 public partial class order : System。Web。UI.Page { String SqlStr; DB db = new DB(); DataSet Ds = new DataSet(); //绑定数据方法 public void DataGridViewBind() { SqlStr = ”select * from 购物车视图 where 会员名=’” + Session[”Username\"] + ”’”; Ds = db。GetDataTableBySql(SqlStr); try { this。GridView1。DataSource = Ds。Tables[0]。DefaultView; this.GridView1。DataBind(); } catch (Exception) { Response.Write(\"〈script>alert('没有得到数据,请重试!')〈/script〉”); } } //计算总金额 public void total_money() { SqlStr = \"select * from 购物车视图 where 会员名=’\" + Session[”Username”] + \"'”; Ds = db.GetDataTableBySql(SqlStr); try { if (Ds。Tables[0].Rows。Count != 0) { Double price, sum = 0; int count; for (int i = 0; i < Ds.Tables[0].Rows.Count; i++)//通过循环得到总金额 { price = Double。Parse(Ds。Tables[0]。Rows[i][”价格\"].ToString()); count = int.Parse(Ds。Tables[0].Rows[i][\"数量\"]。ToString()); sum += price * count; } this.total_money_txt.Text = sum。ToString(); } } catch (Exception) { Response.Write(\"〈script〉alert('没有得到数据,请重试!')”); } } protected void Page_Load(object sender, EventArgs e) { if (Page.IsPostBack == false) { //Session[\"Username”] = ”ning\"; if (Session[\"Username\"] != null) { DataGridViewBind(); total_money(); } else { Response.Redirect(\"Error。aspx\"); } } } protected void orderbtn_Click(object sender, EventArgs e) { int max_order; SqlStr = \"select max(订单编号) from 订单表”; Ds = db.GetDataTableBySql(SqlStr); //判断订单表中是否已有记录,如果有,则直接获取胜订单编号;否则,将最大订单编号设为1 if (Ds。Tables[0]。Rows[0][0]。ToString() != \"\") { max_order = int。Parse(Ds.Tables[0]。Rows[0][0]。ToString()) + 1; } else { max_order = 1; } //生成订单 SqlStr = ”insert into 订单表(订单编号,会员名,发货方式,付款方式,总金额,是否发货,备注)\" + ”values(’” + max_order.ToString() + ”’,’” + Session[\"Username\"] + \"',’\" + this.ddlconsignment.SelectedItem。Text + ”’,” + \"'\" + this.ddlpayment.SelectedItem。Text + ”',’\" + this.total_money_txt。Text.ToString().Trim() + \"',0,'\" + this。remarktxtbox。Text + ”’)”; if (db。UpdateDataBySql(SqlStr)) { Boolean UpdateResult; //生成详细订单 SqlStr = \"insert into 详细订单表(会员名,电影编号,数量) select 会员名,电影编号,数量 from 购物车表 where ” + \"会员名='” + Session[”Username\"] + \"’\"; UpdateResult = db.UpdateDataBySql(SqlStr); SqlStr = ”update 详细订单表 set 订单编号=’\" + max_order.ToString() + \"' where 订单编号 is null”; UpdateResult = db.UpdateDataBySql(SqlStr); //删除购物车中的数据 SqlStr = \"delete from 购物车表 where 会员名=’” + Session[\"Username”] + ”'”; UpdateResult = db.UpdateDataBySql(SqlStr); this。ordernolab。Visible = true; this.ordernolab。Text += max_order。ToString(); } } 管理员登陆 protected void btnLogin_Click(object sender, EventArgs e) { String Md5_User_Pwd = FormsAuthentication。HashPasswordForStoringInConfigFile(this。txt_User_Pwd。Text.ToString(), ”MD5\");//作为密码方式加密 SqlStr = \"select * from 管理员表 where 用户名=’\" + this。txt_User_Name。Text + \"’ and 密码=’\" + this。txt_User_Pwd.Text + \"'\"; Ds = db.GetDataTableBySql(SqlStr); try { if (Ds.Tables[0].Rows。Count == 0) { Response.Write(”\"); } } catch (Exception) { Response.Write(\"〈script>alert( ’没有得到任何数据,请重试!’)} 添加电影(灰色为存储过程的调用) protected void Button1_Click(object sender, EventArgs e) { if (Session[\"Admin_UserName”] != null) { try { string path_file = FileUpload_Image。PostedFile。FileName。ToString(); string file_type = path_file。Substring(path_file.LastIndexOf(”。”)); string file_name = DateTime.Now。Year。ToString() + DateTime。Now.Month.ToString() + DateTime。Now.Day.ToString() + DateTime。Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now。Second。ToString(); full_name = file_name + file_type; string path = Server。MapPath(”image\\\\\") + full_name; FileUpload_Image。SaveAs(path); } catch (Exception) { Response.Write(\"〈script>alert(’上传文件失败!’)〈/script>\"); } string image_path = \"image\\\\\" + full_name; SqlConnection conn =new SqlConnection(@\"Data Source=.\\SQL2005;Initial Catalog=电影售票;Persist Security Info=True;User ID=sa;Password=sql2005”); conn.Open(); SqlCommand cmd = new SqlCommand(\"添加电影计划\", conn); cmd。CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(\"@电影名”, SqlDbType。Char); cmd.Parameters.Add(\"@价格\); cmd.Parameters.Add(\"@上映时间\。Int); cmd.Parameters.Add(\"@时长”, SqlDbType.Char); cmd.Parameters。Add(”@电影简介\); cmd.Parameters。Add(”@票数\", SqlDbType.Char); cmd。Parameters.Add(”@图片”, SqlDbType。Char); cmd.Parameters.Add(\"@电影编号”, SqlDbType。Int); cmd.Parameters[”@电影名\"]。Value = TextBox_BookName.Text ; cmd。Parameters[\"@影片名”].Value = TextBox_BookPrice。Text ; cmd.Parameters[\"@上映时间”]。Value = TextBox1。Text ; cmd.Parameters[\"@时长\"].Value = TextBox2.Text ; cmd。Parameters[”@电影简介”]。Value = TextBox4。Text ; cmd.Parameters[\"@票数\"].Value = TextBox3.Text ; cmd。Parameters[”@图片\"].Value = image_path ; cmd.Parameters[”@电影编号”]。Value = TextBox5.Text ; cmd。ExecuteScalar(); Response。Write(”〈script>alert (’添加成功!’)〈/script〉\"); } else { Response.Redirect(\"Error。aspx”); } 订单管理 订单显示 asp:SqlDataSource ID=”SqlDataSource6\" runat=”server” ConnectionString=”<%$ ConnectionStrings:电影售票ConnectionString %>” DeleteCommand=”DELETE FROM [订单表] WHERE [订单编号] = @订单编号” InsertCommand=\"INSERT INTO [订单表] ([订单编号], [会员名], [订单日期], [发货方式], [付款方式], [总金额], [是否发货], [备注]) VALUES (@订单编号, @会员名, @订单日期, @发货方式, @付款方式, @总金额, @是否发货, @备注)” SelectCommand=”SELECT [订单编号], [会员名], [订单日期], [发货方式], [付款方式], [总金额], [是否发货], [备注] FROM [订单表]” UpdateCommand=\"UPDATE [订单表] SET [会员名] = @会员名, [订单日期] = @订单日期, [发货方式] = @发货方式, [付款方式] = @付款方式, [总金额] = @总金额, [是否发货] = @是否发货, [备注] = @备注 WHERE [订单编号] = @订单编号”〉 3.4测试要点: 在测试过程中,首先需要对各子单元过程进行测试。在各子单元过程测试完毕后,再对各模块(包括各子单元过程之间的接口)进行测试,处理好各模块之间的接口,最后对系统进行测试和维护. 主要通过测试部分,发现开发人员忽视的部分,通过测试人员和编码人员的沟通和协作,可以不断的改进系统,不断提高系统的性能以及安全性。 因篇幅问题不能全部显示,请点此查看更多更全内容DataBinder.Eval(Container.DataItem,”电影编号”)%〉'〉 DataBinder.Eval(Container。DataItem,”图片”) %〉’〉
〈/ItemTemplate〉DataBinder。Eval(Container.DataItem,”电影编号”)%〉’〉 电影名”) %〉〈/td〉