1、数据库课程设计摘 要随着我国市场经济的快速发展,各行业都呈现出生机勃勃的发展景象,其中餐饮业的发展尤为突出.近两年来已呈现出高速发展的态势。但在快速发展的同时,餐饮业在日常经营管理中仍普遍采用手工管理方式,整体科技含量低。随着餐饮企业规模和数量的不断增长,手工管理模式无论是在工作效率、人员成本还是提供决策信息方面都已难以适应现代化经营管理的要求,因此制约了整个餐饮业的规模化发展和整体服务水平的提升。有效的管理成为了一个难题,为能有效的解决这些问题提高企业的经济效益,在这些中小型饭店中采用工作流技术,结合饭店绿色管理内容,实施计算机管理信息系统不视为一条有效的解决途径。本论文主要针对中小型饭店餐
2、饮管理中的一些问题,将其与计算机信息管理系统结合起来,实现中小型饭店管理信息计算机化、系统化,将中小型饭店管理中的工作流转化成比较科学化、规范化的业务流程,使管理基础数据更加准确化,管理人员摆脱了事务性工作,转而从事管理专业工作,为经营决策提供了快捷和强大的数据支持。把计算机用于餐饮企业管理,可在很大程度上提高管理者分析和决策的科学性,提高经营管职水平,带来更多的顾客,使企业取得更好的经济效益.关键词: 计算机信息管理系统,中小型饭店, 餐饮管理目录第1章 系统简介11。1 课题背景11.2 系统开发的意义11。3 系统开发及运行环境1第2章 需求分析32。1 餐饮管理系统的可行性分析32.1
3、。1 技术水平分析32.1.2 经济效益分析32。1.3 市场分析32。2 餐饮管理系统的需求分析3第3章 总体设计53.1 项目规划53。2 系统业务流程分析53.3 系统功能结构6第4章 详细设计74。1 数据库设计74。1.1 数据表概要说明74。1.2 部分数据表ER图74.1.3 数据表的结构94。2 系统主要功能模块设计与实现114。2。1 系统登录模块的设计与实现114。2。2 主窗体的设计与实现124。2。3 凭证信息录入窗体的设计与实现154。2.4 管理员信息窗体的设计与实现18第5章 测试与总结215。1 程序调试与错误处理215。2 总结23第1章 系统简介1.1 课题
4、背景民以食为天,随着人民生活水平的提高,餐饮业在服务行业中占有越来越重要的地位。努力在当前餐饮行业日趋激烈的竞争中脱颖而出,已成为每位餐饮业经营者所追求的目标。经过多年发展,餐饮管理已经逐渐由定性管理,进入到重视定量管理的科学阶段.众所周知,在定量管理的具体实现方法和手段方面,最有效的工具就是电脑管理。传统的手工操作管理存在着许多无法避免的问题,该系统将能大大的降低许多问题,减轻人力与物力。1。2 系统开发的意义本系统属于小型的餐饮管理系统,可以有效地对中小型餐厅消费进行管理,本系统应达到以下目标:系统采用人机交互的方式,界面美观友好,信息查询灵活、方便,数据存储安全可靠。实现对餐厅顾客开台、
5、点菜/加菜、账目查询和结账等操作。对用户输入的数据,进行严格的数据检验,尽可能的避免人为错误.实现对消费账目自动结算。实现对消费的历史记录进行查询.系统应最大限度地实现易维护性和易操作性。1.3 系统开发及运行环境系统开发平台:Microsoft Visual Studio 2008系统开发语言:C#数据库管理系统软件:SQL Server 2005运行平台:Windows XP(SP2)/Windows 2000(SP4)/Windows Server 2003(SP1)运行环境:Microsoft.NET Framework SDK v2。0分辨率:最佳效果1024*768像素第2章 需求
6、分析2.1 餐饮管理系统的可行性分析2.1.1 技术水平分析本软件采用Microsoft Visual Studio 2005为前台开发工具,SQL Server 2005 数据库作为后台数据库支持。本软件专为中小型餐厅消费管理而设计,本软件可在Windows 2000/XP 上运行,不用专业人士去配制服务器可以直接安装使用,具有很好的可移植性,有良好的中文界面,操作简便,适合餐饮服务人员使用。2。1。2 经济效益分析本软件能在很大程度上解决中小型餐厅的消费管理,方便对顾客的消费进行管理,本系统运行时能在主菜单上看到当前的桌台情况是否被占用,能很好分配顾客的用餐,顾客点菜时能很好的进行记录,有
7、方便的结账功能,直接计算出找零,本系统还能对桌台信息进行管理,方便以后的增加与减少桌台,同时也能方便的对服务人员的信息进行管理,有系统数据库备份功能,防止系统在死机的情况下丢失大量重要信息.2.1.3 市场分析现如今餐饮业发展壮大迅速,拥有一套良好的餐饮管理系统能在很大程度上解决许多问题,方便对服务人员的管理,以及内部的一些信息变化的管理如菜品的增删,价格的改变、桌台的增删、人员的流动,还能很好的管理顾客的点菜、查询消费记录、结账,这将能改善传统意义上的管理,使管理变得方便并且有效,所以本系统有着很好的市场需求前景.2.2 餐饮管理系统的需求分析通过实际了解,要求本系统具有以下功能:系统采用人
8、机交互的方式,界面美观友好,信息查询灵活、方便,数据存储安全可靠。实现对餐厅顾客开台、点菜/加菜、账目查询和结账等操作。对用户输入的数据,进行严格的数据检验,尽可能的避免人为错误。实现对消费账目自动结算。实现对消费的历史记录进行查询。实现对餐厅人员流动进行管理以及能够管理餐厅桌台信息.系统应最大限度地实现易维护性和易操作性。餐饮管理系统的用例图,如下图2.1所示。图2.1 餐饮管理系统的用例图 第3章 总体设计3。1 项目规划餐饮管理系统主要由用户登录、桌台信息管理、服务员信息管理、修改密码、开台、取消开台、点/加菜、消费查询、数据库管理和退出等模块组成,具体规划如下。(1) 用户登录模块该模
9、块主要用于实现验证用户是否合法,只有合法用户才能有权登录,只有登录成功情况下才能进入系统功能主界面,并且在登录的同时能验证登录人员的管理权限,根据权限显示其能管理范围.(2) 桌台信息管理模块该模块主要用于管理桌台的信息,可以设置桌台名称,桌台位置,桌台占用所需价钱。(3) 服务员信息管理模块该模块主要用于方便对服务人员的信息进行管理。(4) 修改密码模块该模块主要用于实现对登录人员的密码进行管理,长时间不更换密码是不安全的,增加此模块能增加系统的安全性.(5) 开台模块该模块主要用于实现对顾客进行开台,已经占用的桌台不能被再次分配,方便分配未占用的桌台给顾客(6) 取消开台模块该模块主要用于
10、实现对已经开台的桌台进行取消开台。(7) 消费查询模块该模块主要用于实现客户能够查询自己已消费清单情况,进行核对自己的消费.(8) 结账模块该模块主要用于实现对客户的消费进行自动汇总,显示消费金额,能进行找零计算。(9) 数据库管理模块该模块主要用于实现对系统数据库的备份,防止系统在死机的情况下丢失大量重要信息。3。2 系统业务流程分析餐饮管理系统的业务流程图如图3.1所示。图3.1 餐饮管理系统的业务流程图3。3 系统功能结构系统功能结构图如图3。2所示。餐饮管理系统密码管理服务员管理消费查询管理结账管理数据库管理用户登录管理guanl桌台信息管理修改密码删除更新添加恢复备份删除更新开台取消
11、开台添加17图3.2 系统功能结构图1第4章 详细设计4。1 数据库设计本系统采用SQL Server 2005作为后台数据库,数据库名称为restaurantManage,其中包含5张数据表。下面分别介绍:4.1.1 数据表概要说明为了对本系统后台数据库中的数据表有一个更清晰的认识,在此设计了一个数据表树形结构图,该结构图包括系统所有数据表,如图4。1所示.图4。1 数据表树状结构图4。1。2 部分数据表ER图本里中规化出的实体主要有菜品信息实体、顾客点菜信息实体、桌台信息实体、用户登录信息实体和服务员信息实体.其中部分实体的E-R图如下所示。图4。2 用户表实体ER图图4。3 菜品信息实体
12、ER图图4。4 桌台信息实体ER图图4。5 员工信息实体E-R图图4。6 顾客点菜信息实体ER图4。1.3 数据表的结构(1) food表(菜品信息表)表food用于保存菜品的基本信息,该表的结构如图4.7所示。图4。7 菜品信息表(2) guestfood表(顾客点菜信息表)表guestfood用于保存顾客点菜的详细信息,该表的结构如图4.8所示。图4.8 顾客点菜信息表(3) room表(桌台信息表)表room用于保存桌台的一些有关信息,该表的结构如图4.9所示。图4.9 桌台信息表(4) userlogin 表(登录人员信息表)表userlogin用于保存登录用户基本信息,表的结构如图4
13、.10所示。图4。10 登录用户信息表(5) waiter表(餐厅服务人员信息表)表waiter用于保存餐厅服务人员的一些基本信息,表的结构如图4。11所示。图4。11 餐厅服务人员信息表4.2 系统主要功能模块设计与实现4.2。1 系统登录模块的设计与实现系统登录主要用于对进入餐饮管理系统的用户进行安全性检查,以防止非法用户进入该系统。在登录时,只有合法的用户,才可以进入该系统.系统登录窗体如图4。12所示.图4。12 系统登录代码设计单击【确定】按钮,程序执行判断用户输入的用户名和密码是否正确,如果正确,则成功登录餐饮管理系统,并将用户名、用户使用权限、用户登陆时间传到主窗体中,同时分别使
14、用Names、power、Times全局变量进行接受。否则,弹出“用户名或密码错误信息提示.【确定】按钮的Click事件代码如下: private void btnSure_Click(object sender, EventArgs e) if (txtUserName .Text = )/判断用户名是否为空 MessageBox.Show(用户名不能为空, 警告”, MessageBoxButtons。OK, MessageBoxIcon.Warning); else if (txtPwd。Text = ”)/判断密码是否为空 MessageBox。Show(请输入密码, 警告”, Mes
15、sageBoxButtons。OK, MessageBoxIcon。Warning); else/用户名及密码不为空的情况下执行如下代码 SqlConnection conn = connectToDatabase .restaurantManagementConn (); conn。Open(); SqlCommand cmd = new SqlCommand(”select count() from UserLogin where UserName=” + txtUserName 。Text + ” and UserPwd=” + txtPwd 。Text + ”, conn); int
16、i = Convert.ToInt32(cmd。ExecuteScalar()); if (i 0) cmd = new SqlCommand(”select from UserLogin where UserName= + txtUserName .Text + ”, conn); SqlDataReader sdr = cmd.ExecuteReader(); sdr。Read(); string UserPower = sdrPower。ToString()。Trim(); conn。Close(); formMain main = new formMain(); main.power
17、= UserPower; main.Names = txtUserName .Text ; main。Times = DateTime。Now.ToShortDateString(); main.Show(); this。Hide(); else MessageBox。Show(”用户名或密码错误); 4.2。2 主窗体的设计与实现在正确验证用户的用户名和密码以后,就显示出餐饮管理系统的主窗体。主窗体主要用于显示系统所具有的功能,例如菜单栏里显示了基础信息、辅助工具、系统设置、退出系统、系统维护等几个功能模块.用户可以选择相应的按钮对应的子功能对系统进行不同的操作,餐饮管理系统的主窗体如图4.
18、13所示。图4。13 主窗体主窗体实现的几个重要功能实现代码如下: /接收从login窗体传来的信息,以下四个定义的变量是以后代码用到的全局变量 public string power; public string Names; public string Times; private SqlDataReader sdr; /以下是窗体加载时执行的代码 private void formMain_Load(object sender, EventArgs e) StatusLabeUser.Text = Names; StatusLabeLoginTime。Text = Times; swit
19、ch (power) case ”0: StatusLabePower.Text = 超级管理员”; break; case 1: StatusLabePower.Text = ”经理”; TSMenuItemSystemMaintenance。Enabled = false; break; private void formMain_Activated(object sender, EventArgs e)/窗体激发时执行如下代码 lvDesk.Items。Clear(); SqlConnection conn = connectToDatabase.restaurantManagement
20、Conn(); conn。Open(); SqlCommand cmd = new SqlCommand(”select * from Room, conn); sdr = cmd。ExecuteReader(); while ( sdr .Read() string status = sdrRoomStatus”.ToString().Trim(); AddItems(status );/根据桌台使用与否,选择图片显示桌子是否在被用中 conn。Close(); private void AddItems(string status) if (status = ”使用”) lvDesk。It
21、ems.Add(sdr”RoomName”。ToString(), 1); else lvDesk。Items。Add(sdrRoomName。ToString(), 0); /右键中单击开台会执行如下代码 private void 开台ToolStripMenuItem_Click(object sender, EventArgs e) if (lvDesk。SelectedItems。Count != 0) string names = lvDesk。SelectedItems0.SubItems0。Text; formOpen frm = new formOpen(); frm。name
22、 = names; frm.ShowDialog(); else MessageBox.Show(请选择一个桌台进行开台); /右键中单击取消开台会执行如下代码 private void 取消开台ToolStripMenuItem_Click(object sender, EventArgs e) if (lvDesk.SelectedItems.Count != 0) string names = lvDesk.SelectedItems0。SubItems0.Text; SqlConnection conn = connectToDatabase。restaurantManagementC
23、onn(); conn.Open(); SqlCommand cmd = new SqlCommand(update Room set RoomStatus=待用,Num=0 Where RoomName= + names + , conn); cmd。ExecuteNonQuery(); cmd = new SqlCommand(”delete from GuestFood where DiningTable=” + names + ”, conn); cmd。ExecuteNonQuery(); conn.Close(); formMain_Activated(sender, e); el
24、se MessageBox。Show(请选择桌台); 其他右键功能代码在源代码中,代码设计思想和开台代码类似。 /单击listview控件中的一项内容时会执行如下代码,这里我们将listview的name定义为lvDesk private void lvDesk_Click(object sender, EventArgs e) string names = lvDesk。SelectedItems0.SubItems0。Text; SqlConnection conn = connectToDatabase。restaurantManagementConn(); conn.Open(); S
25、qlCommand cmd = new SqlCommand(select * from Room where RoomName= + names + ”, conn); SqlDataReader sdr = cmd.ExecuteReader(); sdr.Read(); string status = sdrRoomStatus.ToString().Trim();/将选中桌台的状态信息提取出来 sdr.Close(); if (status = 使用”) this.contextMenuStrip1.Items0.Enabled = false; this。contextMenuStr
26、ip1。Items1。Enabled = true; this.contextMenuStrip1.Items3。Enabled = true; this。contextMenuStrip1。Items5。Enabled = true; this.contextMenuStrip1。Items6。Enabled = true; if (status = 待用) this.contextMenuStrip1.Items0。Enabled = true; this.contextMenuStrip1.Items1。Enabled = false; this。contextMenuStrip1.It
27、ems3。Enabled = false; this.contextMenuStrip1.Items5。Enabled = false; this。contextMenuStrip1.Items6.Enabled = false; conn。Close(); /双击listview控件中的一项内容时会执行如下代码 private void lvDesk_DoubleClick(object sender, EventArgs e) deskInfo desk = new deskInfo (); desk 。tableName = lvDesk。SelectedItems0.SubItems0
28、.Text; desk.ShowDialog(); /单击menustrip控件中基础信息下的桌台信息管理按钮会执行如下代码 private void TSMenuItemTableInfo_Click(object sender, EventArgs e) deskInfoManagement desk = new deskInfoManagement(); desk.ShowDialog(); menustrip控件中的其他按钮的代码设计思路与上面的单击menustrip控件中基础信息下的桌台信息管理按钮类似都是初始化一个相应窗体的对象,显示窗体.注:其他代码详见系统设计文档。4.2.3
29、右键菜单中的几个重要功能的介绍右键菜单功能中顾客可以选择开台,取消开台,点菜,查询消费记录以及结账,下面介绍其中三个重要功能的实现代码,有开台,点菜以及结账,窗体运行结果分别如图4.14、图4。15和图4。16所示.图4。14 开台窗体图4.15 点菜窗体图4。16 结账窗体凭证信息录入窗体的主要实现代码如下:图4。15的实现代码 public string name; public SqlConnection conn; private void formOpen_Load(object sender, EventArgs e) conn = connectToDatabase.restau
30、rantManagementConn(); conn.Open(); SqlCommand cmd = new SqlCommand(”select from Room, conn); SqlDataReader sdr = cmd.ExecuteReader(); while (sdr。Read() cbNum.Items。Add(sdrRoomName”。ToString()。Trim(); cbNum。SelectedItem = name.Trim(); sdr.Close(); cmd = new SqlCommand(”select from Waiter, conn); sdr
31、= cmd。ExecuteReader(); while (sdr。Read() cbWaiter.Items。Add(sdrWaiterName”。ToString().Trim()); cbWaiter。SelectedIndex = 0; sdr。Close(); private void txtNum_KeyPress(object sender, KeyPressEventArgs e) if (e.KeyChar != 8 & !char.IsDigit(e。KeyChar)) & e.KeyChar != 13) MessageBox。Show(请输入数字”); e。Handle
32、d = true; private void btnSave_Click(object sender, EventArgs e) if (txtNum。Text = ” Convert。ToInt32(txtNum。Text) = 0) MessageBox。Show(”请输入用餐人数”); else string RoomName = cbNum。SelectedItem.ToString(); SqlCommand cmd1 = new SqlCommand(update Room set GuestName=” + txtName.Text + ”,PaymentDate= + date
33、TimePicker1。Value.ToString() + ”,Num=” + Convert.ToInt32(txtNum。Text) + ”,WaiterName=” + cbWaiter。SelectedItem。ToString() + ” ,RoomStatus=使用 where RoomName= + name + , conn); cmd1.ExecuteNonQuery(); this.Close(); 代码不全,其他代码见源代码图4.16的实现代码 public string RName; public int i = 0; private void formOrder_L
34、oad(object sender, EventArgs e)/formOrder窗体加载时执行下列语句 / TODO: 这行代码将数据加载到表“restaurantManageDataSet.GuestFood”中.您可以根据需要 移动或移除它。 this.guestFoodTableAdapter。Fill(this.restaurantManageDataSet.GuestFood); /向treeview节点添加四类菜 TreeNode newnode1 = tvFood。Nodes.Add(”煲汤”); TreeNode newnode2 = tvFood.Nodes.Add(肉菜”
35、); TreeNode newnode3 = tvFood.Nodes.Add(素菜”); TreeNode newnode4 = tvFood.Nodes.Add(主食); SqlConnection conn = connectToDatabase.restaurantManagementConn(); conn.Open(); /表中foodtype为1的是“煲汤类的菜 SqlCommand cmd = new SqlCommand(select * from food where FoodType=1, conn); SqlDataReader sdr = cmd.ExecuteReader(); while (sdr.Read() /将属于“煲汤”类的菜从数据表中找出,加到treeview节点上 newnode1。Nodes.Add(sdr3。ToString()。Trim(); sdr.Close(); cmd = new SqlCommand(select * from food where FoodType=2”, conn); sdr = cmd。ExecuteReader(); while (sdr.Read()) newnode2.Nodes。Add(sdr3.ToString().Trim(); sdr。Close(); cmd = new SqlCom