1、 C#程序设计及应用教程餐饮收银系统学 院专 业学 号姓 名指导教师年 月 日1 引言 .12 可行性研究 .12.1 技术可行性 12.2 操作可行性 12.3 经济可行性 13 需求分析 .14 详细设计 .25 数据库设计 .45.1 E-R 图 .45.1 数据库表设计 46 实现及测试 .57 结束语 108 参考文献 109 附录代码 101嗨翻天火锅店收银系统1 前言餐饮收银系统是实现餐饮行业全面管理的现代化软件。其主要目的是为餐饮管理人员提供餐饮管理所需的各项信息,主要包括桌台、就餐人数、顾客点菜统计等餐饮行业综合管理和经营管理方面的信息,使整个餐馆的信息流和物流迅速、及时、准
2、确地反馈给各级管理管理人员,以辅助各级管理人员进行日常管理决策和经营决策。利用此系统,前台收银员可以很方便完成结账、销账工作,从而极大减少错误的发生,避免不必要的损失。2 可行性研究可行性研究的目的不是解决问题,而是确定问题是否值得去解决。我们当然不能靠主观猜想而只能靠客观分析。从而判断原定的系统规模和目标是否得以实现,系统完成后所带来的效益是否大到值得投资开发这个系统的程序。因此可行性分析就是在较高层次上以抽象的方法进行的系统分析和设计的过程。下面我从技术可行性、操作可行性、经济可行性三个方面来分析。2.1 技术可行性在这个系统中,我采用了 C#语言来开发。C#语法简单,可用性强、用 C#
3、设计的组件可以很容易的转换成 Web 服务,可以以任意操作系统的任意语言从 Internet 上调用。开发人员可以定义特定域的属性,并将它们应用于任何语言元素如类,接口等。使用的工具是 Microsoft Visual Studio 2008,Visual Studio 2008 提供了高级开发工具、调试功能、数据库功能和创新功能,帮助在各种平台上快速创建当前最先进的应用程序。Visual Studio 2008 包括各种增强功能,例如可视化设计器(使用 .NET Framework 3.5 加速开发) 、对 Web 开发工具的大量改进,以及能够加速开发和处理所有类型数据的语言增强功能。Vis
4、ual Studio 2008 为开发人员提供了所有相关的工具和框架支持,使用的数据库是 Visual Studio 2008自带的 SQL SERVER,因此该系统在技术上是可以实现的。2.2 操作可行性该系统主要的使用对象是餐饮行业的工作人员,因此简单、实用、界面友好是该系统的主要优点,使用人员可以非常轻松的使用该软件,不用进行专业的培训。而且该系统能够有效提高工作人员的工作效率,节省大量时间,为更多的顾客服务。2.3 经济可行性该系统不需要进行大量的人力物力财力投资,只需要编程人员使用编程工具开发即可,而且该系统简单方便,操作容易,后期不需要投入大量的精力进行维护,因此该系统在经济上是可
5、行的。综上所述该系统在技术、操作、经济方面是可行的,必要时还应该从法律、社会效益等更广泛的方面研究该系统的可行性。3 需求分析传统的餐饮收银系统现在已经很难应对当今社会对餐饮行业的需求,因此我们迫切的需要有以计算机技术为背景的餐饮收银系统,它与传统的收银系统2相比有很大的优势。安全性方面:传统的纸质记录方式查询起来很麻烦,效率低下,而且保密性差,很容易丢失的记录数据,对于保管数据是非常不利的。但是如果使用餐饮收银系统,那么这些担心全都不存在了,我们可以很方便的对数据进行备份查询。准确性方面:传统的人工记账很容易出错,如果采用收银系统,那么该系统会很准确、快速的把消费结算计算出来,效率会大大的提
6、高。有了餐饮收银系统,餐饮行业的管理、发展都会极大的提高,因此该系统是餐饮行业必须的,具有广泛的市场前景。4 详细设计对该系统作完可行性分析和需求分析之后,我基本设计出了该系统的流程图,使得我更加容易的做后面的工作。系统流程图如下:用户登录桌台信息开台关闭桌台查询 结账点菜 退出系统流程图流程图简介:用户登录火锅店收银系统之后,进入大厅主界面,显示桌台信息,工作人员可以清晰的看到哪些桌台是空闲状态,哪些是已经被占用的,通过这些信息可以为顾客选择桌台。选完桌台之后,顾客可以点菜,进入点菜模块,点完菜之后可以进入查询模块,查看所点的菜,就餐完毕之后可以进入结账模块。如果顾客在选择完桌台之后又不想就
7、餐了,可以选择关闭桌台,离开火锅店。根据以上需求,我对该系统具体需要实现的功能进行了划分。整体功能模块图如下:3大厅主界面开台管理菜单管理查询管理账单管理添菜 改菜销菜 销账结账整体功能模块图下面是各个模块所实现的功能。用户登录模块:在该模块中,只有知道账户密码的人才能有权利登录系统,保证了系统的安全性。开台管理模块:通过该模块我们可以清楚的看到哪个桌台处于空闲状态,哪个桌台有顾客就餐。我们可以为刚到的顾客开台、也可以为就餐完毕的顾客关台。在开台的过程中,我们可以选择指定的服务员为顾客服务,然后填写就餐人数,增加了系统的健壮性。开 台 管 理 模 块开台取消开台点菜查询菜单结账开台管理模块图点
8、菜模块:顾客可以通过菜品种类自由的选择菜系,单击保存按钮即可点菜,若顾客想退菜,那么点击删除按钮即可完成操作。顾客选择完菜系之后选择退出按钮即可退回到大厅主界面。点菜模块选择菜系退出删除保存查询模块:通过查询模块,餐饮工作人员和顾客可以方便的查看顾客所点的菜单,有利于数据的保存结账模块:在该模块中,顾客只要付完钱之后,该系统即可快速的计算出该找的零钱,不会出现错误,提高了工作效率。通过各个模块的详细设计,我基本上可以确定各个模块需要实现的功能,4接下来需要进行数据库设计。5 数据库设计数据库设计是指对于一个给定的应用环境构造优化的数据库逻辑模型和物理结构,并据此建立数据库及其应用系统,使之能够
9、有效存储和管理数据,满足各种用户的应用需求,包括信息管理要求和数据操作要求。信息管理要求是指在数据库中应该存储和管理哪些数据对象;数据操作要求是指对数据对象需要进行哪些操作,如查询、增、删、改、统计等操作。根据以上数据库要求,针对餐饮信息管理系统,分别对用户、客户、食谱、职员等实体进行详细的调研和分析。5.1 E-R 图概念模型是对信息世界建模,所以概念模型能够方便、准确的表示出信息世界中的常用概念。概念模型的表示方法很多,最为著名最为常用的是实体-联系方法,该方法用 E-R 图来描述现实世界的概念模型。下面列举食品和服务员的 E-R 图。Tb_food 的 ER 图:T b _ f o o
10、df o o d p r i c ef o o d n a m ef o o d n u mI Df o o d t yTb_food 的 ER 图主要存储食品的一些信息,如食品编号、食品价格、食品名称等。Tb_Waiter 的 ER 图:T b _ W a i t e rT e lS e xA g eC a r d N u mW a i t e r _ N u mW a i t e r _ N a m e I DTb_Waiter 的 ER 图主要存储餐饮工作人员的一些信息,如名字、编号、年龄等。5.2 数据库表设计整体数据库表设计:5食品的数据库表设计:用户的数据库表示如下:职员的数据库中
11、数据如下:6 实现及测试项目整体框架:6登录界面:在登录界面用户需要输入用户名和密码,在本系统中我设计的用户名和密码分别是:胡佳敏和 123运行时开始界面:运行该系统之后,出现如下界面,用浓情火锅节来作为主界面,代表了该店具有活力,可以吃的非常嗨。单击点击按钮之后,进入登录界面之后,一阵清爽的感觉袭来,填写用户名和密码即可进入该系统。如果输入的用户名和密码不正确,那么就会提示你填写信息错误。7错误登录信息:大厅主界面:8开台界面:开台之后工作人员可以添加就餐人数,可以记录时间、顾客姓名、所选择的的桌台以及服务员是谁,可以供以后查询使用。点菜界面:顾客可以在此界面上点菜,如果顾客对这家店比较熟悉
12、,还可以指定哪个服务员为他服务,同时店主也知道哪个服务员现在处于空闲状态,可以为下一位顾客服务。当顾客点完之后,单击保存按钮,即可点菜成功,同一种菜可以重复选择;若顾客不想点菜,单击删除按钮即可。点完菜之后,单击退出按钮,即可退回到大厅主界面。查询界面:当顾客不记得点了什么菜的时候,可以查询点菜信息,在这里记录了顾客所点的菜品。9结账界面:在界面左边,是几号桌台顾客所点菜系,可以清晰的看到顾客所点的菜的种类,防止出错。在右边界面,工作人员只需要输入顾客的付款,系统自动输出零钱。例如:当收银 100 时,系统自动计算出该找给顾客 33.5。主界面:当顾客结账完毕之后,工作人员只需要单击退出按钮,
13、系统自动退回到大厅主界面,继续为下一位顾客服务。107 结束语这次我做的论文题目是餐饮收银系统,经过这么长时间的努力,餐饮收银系统终于得以实现其功能了。在这里我对.NET 技术有了更深一步的认识,程序开发到后来比刚刚开发时的速度要快上好多,一开始的时候完全不知道如何下手,也不知道如何设计系统流程图,我需要停下来查找相关资料,在网上搜实例代码下来学习,去图书馆查阅书籍,然后在思考自己该做出什么样的界面来。但是功夫不负有人,经过一段时间的学习,餐饮收银系统终于实现。这次我是把餐饮系统具体化,做成一个火锅店,并且取名为嗨翻天火锅店,登录界面做的也比较火辣,弄清火锅节更是让火锅店嗨起来。世界上没有十全
14、十美的事情,我基本上实现了餐饮收银系统该具有的功能:登录模块、开台模块、点菜模块、查询模块、结账模块。但是由于时间原因和自己水平有限,一些细节并没有考虑得很周到,在系统运行时还会出现一些异常,但是整体功能还是可以实现的。如果给我更多的时候我一定会更加完善该系统,使该系统的功能更加具体,界面更加友好。另外,由于不是经常画流程图,此次流程图画的特别不令人满意,整体设计逻辑也不是很清晰。经过这次小实践,我的编程能力、解决问题能力都得到了提高,相信这次经历对我以后面对问题、解决问题都会有帮助。8 参考文献1 马骏 C#程序设计及应用教程 人民邮电出版社2 张海藩 软件工程导论 清华大学出版社3 明日科
15、技 C#项目案例分析 清华大学出版社4 明日科技 ASP.NET 项目开发案例全程实录5 王珊 数据库系统概论 高等教育出版社9 附录代码登录界面主要代码:private void txtPwd_KeyPress(object sender, KeyPressEventArgs e)11if (e.KeyChar = 13)btnSubmit_Click(sender, e);private void btnSubmit_Click(object sender, EventArgs e)if (txtName.Text = “)MessageBox.Show(“请输入用户名“, “警告“, M
16、essageBoxButtons.OK, MessageBoxIcon.Warning);elseif (txtPwd.Text = “)MessageBox.Show(“请输入密码“, “警告“, MessageBoxButtons.OK, MessageBoxIcon.Warning);elseSqlConnection conn = BaseClass.DBConn.CyCon();conn.Open();SqlCommand cmd = new SqlCommand(“select count(*) from tb_User where UserName=“ + txtName.Tex
17、t + “ and UserPwd=“ + txtPwd.Text + “, conn);int i = Convert.ToInt32(cmd.ExecuteScalar();if (i 0)cmd = new SqlCommand(“select * from tb_User where UserName=“ + txtName.Text + “, conn);SqlDataReader sdr = cmd.ExecuteReader();sdr.Read();string UserPower = sdr“power“.ToString().Trim();conn.Close();frmM
18、ain main = new frmMain();main.power = UserPower;main.Names = txtName.Text;main.Times = DateTime.Now.ToShortDateString();main.Show();this.Hide();else12MessageBox.Show(“用户名或密码错误“);private void btnConcel_Click(object sender, EventArgs e)if (MessageBox.Show(“确定退出系统吗? “, “提示“, MessageBoxButtons.OKCancel,
19、 MessageBoxIcon.Asterisk) = DialogResult.OK)Application.Exit();大厅主界面代码:private void 开台ToolStripMenuItem_Click( object sender, EventArgs e)if (lvDesk.SelectedItems.Count != 0)string names = lvDesk.SelectedItems0.SubItems0.Text;frmOpen openroom = new frmOpen();openroom.name = names;openroom.ShowDialog
20、();elseMessageBox.Show(“请选择桌台“ );private void frmMain_Activated(object sender, EventArgs e)lvDesk.Items.Clear();SqlConnection conn = BaseClass.DBConn.CyCon();conn.Open();SqlCommand cmd = new SqlCommand(“select * from tb_Room“, conn);sdr = cmd.ExecuteReader();while (sdr.Read()string zt = sdr“RoomZT“.
21、ToString().Trim();AddItems(zt);13conn.Close();private void 点菜ToolStripMenuItem_Click(object sender, EventArgs e)if (lvDesk.SelectedItems.Count != 0)string names = lvDesk.SelectedItems0.SubItems0.Text;frmDC dc = new frmDC();dc.RName = names;dc.ShowDialog();elseMessageBox.Show(“请选择桌台“ );private void 消
22、费查询ToolStripMenuItem_Click(object sender, EventArgs e)if (lvDesk.SelectedItems.Count != 0)string names = lvDesk.SelectedItems0.SubItems0.Text;frmSerch serch = new frmSerch();serch.RName = names;serch.ShowDialog();elseMessageBox.Show(“请选择桌台“ );private void 结账ToolStripMenuItem_Click(object sender, Eve
23、ntArgs e)if (lvDesk.SelectedItems.Count != 0)string names = lvDesk.SelectedItems0.SubItems0.Text;frmJZ jz = new frmJZ();jz.Rname = names;jz.ShowDialog();elseMessageBox.Show(“请选择桌台“ );14private void lvDesk_Click(object sender, EventArgs e)string names = lvDesk.SelectedItems0.SubItems0.Text;SqlConnect
24、ion conn = BaseClass.DBConn.CyCon();conn.Open();SqlCommand cmd = new SqlCommand(“select * from tb_Room where RoomName=“ + names + “, conn);SqlDataReader sdr = cmd.ExecuteReader();sdr.Read();string zt = sdr“RoomZT“.ToString().Trim();sdr.Close();if (zt = “使用“)this.contextMenuStrip1.Items0.Enabled = fa
25、lse;this.contextMenuStrip1.Items1.Enabled = true;this.contextMenuStrip1.Items3.Enabled = true;this.contextMenuStrip1.Items5.Enabled = true;this.contextMenuStrip1.Items6.Enabled = true;if (zt = “待用“)this.contextMenuStrip1.Items0.Enabled = true;this.contextMenuStrip1.Items1.Enabled = false;this.contex
26、tMenuStrip1.Items3.Enabled = false;this.contextMenuStrip1.Items5.Enabled = false;this.contextMenuStrip1.Items6.Enabled = false;conn.Close();private void 取消开台toolStripMenuItem_Click(object sender, EventArgs e)if (lvDesk.SelectedItems.Count != 0)string names = lvDesk.SelectedItems0.SubItems0.Text;SqlC
27、onnection conn = BaseClass.DBConn.CyCon();conn.Open();SqlCommand cmd = new SqlCommand(“update tb_Room set RoomZT=待用,Num=0 where RoomName=“ + names + “, conn);cmd.ExecuteNonQuery();15cmd = new SqlCommand(“delete from tb_GuestFood where zhuotai=“ + names + “, conn);cmd.ExecuteNonQuery();conn.Close();f
28、rmMain_Activated(sender, e);elseMessageBox.Show(“请选择桌台“ );点菜主界面:public partial class frmDC : Formpublic frmDC()InitializeComponent();public string RName;private void frmDC_Load(object sender, EventArgs e)this.Text = RName + “点/加菜“;TreeNode newnode1 = tvFood.Nodes.Add(“锅底“);TreeNode newnode2 = tvFood
29、.Nodes.Add(“配菜“);TreeNode newnode3 = tvFood.Nodes.Add(“酒水“);TreeNode newnode4 = tvFood.Nodes.Add(“主食“);SqlConnection conn = BaseClass.DBConn.CyCon();conn.Open();SqlCommand cmd = new SqlCommand(“select * from tb_food where foodty=1“, conn);SqlDataReader sdr = cmd.ExecuteReader();while (sdr.Read()newn
30、ode1.Nodes.Add(sdr3.ToString().Trim();sdr.Close();cmd = new SqlCommand(“select * from tb_food where foodty=2“, conn);sdr = cmd.ExecuteReader();while (sdr.Read()newnode2.Nodes.Add(sdr3.ToString().Trim();sdr.Close();16cmd = new SqlCommand(“select * from tb_food where foodty=3“, conn);sdr = cmd.Execute
31、Reader();while (sdr.Read()newnode3.Nodes.Add(sdr3.ToString().Trim();sdr.Close();cmd = new SqlCommand(“select * from tb_food where foodty=4“, conn);sdr = cmd.ExecuteReader();while (sdr.Read()newnode4.Nodes.Add(sdr3.ToString().Trim();sdr.Close();cmd = new SqlCommand(“select * from tb_Waiter“,conn);sdr
32、 = cmd.ExecuteReader();while (sdr.Read()cbWaiter.Items.Add(sdr“WaiterName“.ToString().Trim();cbWaiter.SelectedIndex = 0;sdr.Close();cmd = new SqlCommand(“select RoomZT from tb_Room where RoomName=“+RName+“,conn);string zt = Convert.ToString(cmd.ExecuteScalar();if (zt.Trim() = “待用“)groupBox1.Enabled
33、= false;groupBox2.Enabled = false;groupBox3.Enabled = false;groupBox4.Enabled = false;conn.Close();GetData();tvFood.ExpandAll();private void treeView1_DoubleClick(object sender, EventArgs e)string foodname = tvFood.SelectedNode.Text;if (foodname = “锅底“ | foodname = “配菜“ | foodname = “酒水“ | foodname
34、= “主食“ )17elseSqlConnection conn = BaseClass.DBConn.CyCon();conn.Open();SqlCommand cmd = new SqlCommand(“select * from tb_food where foodname=“ + foodname + “, conn);SqlDataReader sdr = cmd.ExecuteReader();sdr.Read();txtNum.Text = sdr“foodnum“.ToString().Trim();txtName.Text = foodname;txtprice.Text
35、= sdr“foodprice“.ToString().Trim();conn.Close();if (txtpnum.Text = “)MessageBox.Show(“数量不能为空“ );return;elsetxtallprice.Text = Convert.ToString(Convert.ToInt32(txtprice.Text) * Convert.ToInt32(txtpnum.Text);private void txtpnum_TextChanged(object sender, EventArgs e)if (txtpnum.Text = “)MessageBox.Sh
36、ow(“数量不能为空“ );return;elseif (Convert.ToInt32(txtpnum.Text) 0)string names = dgvFoods.SelectedCells0.Value.ToString();SqlConnection conn = BaseClass.DBConn.CyCon();conn.Open();SqlCommand cmd = new SqlCommand(“delete from tb_GuestFood where foodname=“ + names + “ and zhuotai=“ + RName + “, conn);cmd.E
37、xecuteNonQuery();conn.Close();GetData();private void btnSave_Click(object sender, EventArgs e)if (txtName.Text = “ | txtNum.Text = “| txtprice.Text = “)MessageBox.Show(“请将选择菜系“ );19return;elseif (txtpnum.Text = “)MessageBox.Show(“数量不能为空“ );return;elseif (Convert.ToInt32(txtpnum.Text) = 0)MessageBox.
38、Show(“请输入消费数量“ );return;elseSqlConnection conn = BaseClass.DBConn.CyCon();conn.Open();SqlCommand cmd = new SqlCommand(“insert into tb_GuestFood(foodnum,foodname,foodsum,foodallprice,waitername,beizhu,zhuotai,datatime) values(“ + txtNum.Text.Trim() + “,“ + txtName.Text.Trim() + “,“ + txtpnum.Text.Tri
39、m() + “,“ + Convert.ToDecimal(txtallprice.Text.Trim() + “,“ + cbWaiter.SelectedItem.ToString() + “,“ + txtbz.Text.Trim() + “,“ + RName + “,“ + DateTime.Now.ToString() + “)“, conn);cmd.ExecuteNonQuery();conn.Close();GetData();菜单查询界面:public partial class frmSerch : Formpublic frmSerch()InitializeCompo
40、nent();public string RName;private void frmSerch_Load(object sender, EventArgs e)SqlConnection conn = BaseClass.DBConn.CyCon();20SqlDataAdapter sda = new SqlDataAdapter(“select foodname,foodsum,foodallprice,waitername,beizhu,zhuotai,datatime from tb_GuestFood where zhuotai=“ + RName + “order by ID d
41、esc“, conn);DataSet ds = new DataSet();sda.Fill(ds);dataGridView1.DataSource = ds.Tables0;private void button1_Click(object sender, EventArgs e)this.Close();结账界面:public partial class frmJZ : Formpublic frmJZ()InitializeComponent();public string Rname;public string price;public string bjf;private voi
42、d frmJZ_Load(object sender, EventArgs e)this.Text = Rname + “结账“;groupBox1.Text = “当前桌台-“ + Rname;SqlConnection conn = BaseClass.DBConn.CyCon();SqlDataAdapter sda = new SqlDataAdapter(“select foodname,foodsum,foodallprice,waitername,beizhu,zhuotai,datatime from tb_GuestFood where zhuotai=“ + Rname +
43、 “order by ID desc“, conn);DataSet ds = new DataSet();sda.Fill(ds);dgvRecord.DataSource = ds.Tables0;conn.Open();SqlCommand cmd = new SqlCommand(“select sum(foodallprice) from tb_GuestFood where zhuotai=“ + Rname + “, conn);price = Convert.ToString(cmd.ExecuteScalar();if (price = “)lblprice.Text = “
44、0“;btnJZ.Enabled = false;else21cmd = new SqlCommand(“select RoomBJF from tb_Room where RoomName=“+Rname+“, conn);bjf = cmd.ExecuteScalar().ToString();if (bjf = “0“)btnJZ.Enabled = true;lblprice.Text = price + “*95%“+“+“+bjf+“=“ + (Convert.ToDecimal(Convert.ToDouble(price) * Convert.ToDouble(0.95).To
45、String(“C“);elsebtnJZ.Enabled = true;lblprice.Text = price + “*95%“+“+“+bjf+“=“ + (Convert.ToDecimal(Convert.ToDouble(price) * Convert.ToDouble(0.95) + Convert.ToDecimal(bjf).ToString(“C“);conn.Close();private void txtmoney_KeyPress(object sender, KeyPressEventArgs e)if (e.KeyChar != 8 e.Handled = t
46、rue;private void txtmoney_TextChanged(object sender, EventArgs e)if (price = “)lbl0.Text = “0“;elseif (txtmoney.Text = “)txtmoney.Text = “0“;lbl0.Text = “0“;22elselbl0.Text = Convert.ToDecimal(Convert.ToDouble(txtmoney.Text.Trim() - Convert.ToDouble(price) * Convert.ToDouble(0.95) - Convert.ToDouble
47、(bjf).ToString(“C“);private void btnJZ_Click(object sender, EventArgs e)if (txtmoney.Text = “|lbl0.Text=“0“)MessageBox.Show(“请先结账“);return;elseif (lbl0.Text.Substring(1, 1) = “-“)MessageBox.Show(“金额不足“ );return;elseSqlConnection conn = BaseClass.DBConn.CyCon();conn.Open();SqlCommand cmd = new SqlCom
48、mand(“delete from tb_GuestFood where zhuotai=“ + Rname + “, conn);cmd.ExecuteNonQuery();cmd = new SqlCommand(“update tb_Room set RoomZT=待用,Num=0,WaiterName= where RoomName=“ + Rname + “, conn);cmd.ExecuteNonQuery();conn.Close();this.Close();private void btnExit_Click(object sender, EventArgs e)this.Close();