餐饮管理系统(1)界面图+源代码
发布时间:2014-06-25 19:29:39
发布时间:2014-06-25 19:29:39
餐饮管理系统
1、前言
在餐饮业务竞争越来越激烈的今天,如何提高服务质量,其管理能力显的越来越重要。尤其是对一些大的餐饮店,餐饮店内部服务项目越多,管理难度越大,既要处理前台又要处理后台的工作,所以一个好的管理系统可以提高酒店的管理水平也可以大幅度提高酒店服务水平。
1.1目的
随着当今社会信息化的日新月异的发展,计算机应用已经渗透到日常工作的许多方面无论是其自身还是所发挥的作用,计算机都标志着一种高科技、高效率和高水平。为了企业创先进、争一流,为了企业的发展一套好的系统必不可少.现在餐饮业发展速度飞快,要想在激烈的社会竞争有一席之地,好的服务是最基本的保障,此次开发的餐饮管理系统就是针对现代化社会管理和要求, 在服务上提高自己的效率,使自己的公司立于不败之地.
1.2定义
餐饮管理系统,SQL,E-R图
1.3 参考资料
《数据库应用系统开发技术》 朱如龙 刘焰 机械出版社 2004年8月
《VC++与SQL2000开发技术》汪晓平 钟军 人民邮电出版社 2004年8月
2、系统设计
2.1系统目标设计
餐饮管理系统的主要目标是实现对酒店内部各种管理的电子化、自动化,提高各个模块之间的办公效率,为高质量餐饮服务提供保证。
2.2开发设计思想
餐厅系统是按照国内餐饮行业最新要求开发的全心概念的信息管理系统。该系统将餐厅收银、往来帐务结算及销售情况统计工作在单计算机或网络系统中完成。主要特点包括:
*代码菜谱编制,方便统计,方便输入;
*开单、改单、结算、打印、用户界面方便友好;
*系统专设往来账、内部账,结算方式灵活多样,结算消息详尽;
*系统可同前台系统衔接,查询客人信贷情况,往前台客人帐户转账;
*报表真实,实用性强,如:收银报表汇总收银、支票、信用卡、转帐等情况;菜肴销售报表汇总各种菜肴的日、月销售量;员工销售统计表,可打印值台人员销售业绩核实报表提供依据。
*账务系统共讷讷感的完整性。一旦该系统正式运行,餐厅每日的营业账和全部往来客户的账务操作结算都将依靠计算机,该系统面对当前餐厅餐饮业各种负复杂的结算要求应具有很强的应变能力。为此本系统为适应拥护的要求,设计了完整的转帐功能。
*帐务系统的可扩充性。由于餐厅业务的扩展,势必要求帐务结算系统随之扩展,在不修改程序的前提下,本系统可在相当可观的范围内,由用户扩展其营业项目和结算手段。
*帐务操作数据的可校验性。本系统提供了多种方便的查询,校核和统计功能,共帐务操作人员和专职人员自校对帐务数据。如当班收银员下班的时候直接统计当班期间的输单、收银情况。为餐饮企业管理人员提供及时准确的经营状况和帐务信贷系统情况。
餐厅系统需要完成的功能有以下几点:
*定餐管理:定餐修改、定餐取消、定金处理、定餐统计、定餐查询、定餐报表。
*收款管理:立帐、校费明细录入、特色菜自定义、追加消费、消费修改、消费取消、加位、更改台号、折扣设定、消费服务设定、帐单打印、现付结算和房帐转录。
*交班管理:统计当班数据、为下班操作做准备、当班帐务流水报表。
*系统报表:餐饮销售分析报表、每菜销售统计报表、营业收入报表、每菜销售统计日报表和当班特色菜报表。
*系统维护:餐厅代码设定、餐台号码以及贵宾房设定
特色分类设定、特色编码设定、折扣设定、货币设定、服务费率设定、营业统计项目设定、成本统计项目设定、使用者权限维护、系统备份、系统恢复。
*餐饮成本核算:成本统计项目设定、成本管理。
2.3系统功能模块设计
在系统功能分析的基础上,考虑Visual C++的编程特点,得到如下面功能模块图。
图1-1为餐厅系统餐饮系统的功能模块图。
餐饮系统功能图
由上面的餐饮系统的功能分析,可以看出一个餐饮管理系统是一个复杂的系统工程,涉及到系统的各个方面。由于篇幅的问题就不具体的介绍了 。
3、数据库设计
在数据库系统开始设计的时候应该尽量考虑全面,尤其应该仔细考虑用户的各种需求,避免浪费不必要的人力和物力。
3.1数据库需求分析
在仔细调查餐饮日产管理过程的基础上,得到本系统所处理的数据流程图如图1-2所示。
餐饮管理数据流程图
针对本市里,通过对餐饮系统管理系统的内容和数据流程分析,设计的数据项和数据结构如下。
*菜谱信息。包括的数据项有菜谱号、名称、所属价格、种类、描述等。
*值班员信息。包括数据项有值班员的姓名和口令。
*荣誉客户信息。包括的数据项有客户号、客户姓名、年龄、性别、职称、联系电话、工作单位等 。
*定餐信息。包括的数据项有客户号、桌号、结算日期、打折情况和总计等。
有了上面的数据结构、数据项和数据流程,就能进行下面的数据库设计。
3.2数据库概念设计
本实例根据上面的设计规划出的实体有 :菜谱实体、值班员实体、客户实体、定餐实体和结算实体。各个实体具体的描叙E-R图及其之间的关系描述如下。
图1-3为菜谱实体E-R图。
菜谱实体E-R图
图1-4为值班员实体E-R图
值班员实体E-R图
图1-5为客户实体E-R图
客户实体E-R图
图1-6为订餐信息实体E-R图
订餐信息实体E-R图
图1-7为结算信息实体E-R图
实体和实体之间的关系E-R图如图1-8所示
实体之间的关系E-R
3.3数据库逻辑结构设计
在 上面的实体以及实际实体之间关系的基础上,形成数据库中表格以及各个表格之间的关系。
餐饮管理系统数据库中各个表格的设计结果如下面的几个表格所示。每个表格表示在数据库中的一个表
表1-1为值班员ZSP
表1-1 值班员表ZSP
表1-2为菜谱信息表CP
表1-2 菜谱信息表CP
表1-3为荣誉客户信息表KH
表1-3 荣誉客户信息表KH
表1-4为定餐信息表
表1-4 定餐信息表
表1-5为结算信息表JS
表1-5 结算信息表JS
3.4数据字典
数据项
数据项描述={数据项名,数据项含义说明,别名,数据类型,
长度,取值范围,取值含义,与其他数据项的逻辑关系}
值班员数据项描述
菜谱信息数据项描述
荣誉客户信息数据项描述
订餐信息数据项描述
结算信息数据项描述
用户数据结构描述
3.5 数据库物理结构设计
数据库物理设计指确定数据库在物理设备上的存储结构与存取方法。
确定数据库的物理结构:是否聚集存储,如何建立索引,数据的存放位置,确定系统配置等。介于本系统数据库的简单性,我们没有采用聚集存储之类的结构设计。
4、功能模块设计
4.1 设计登录和口令管理模块
在未登录时,主对话框中的按钮,除了“登录”“退出”“帮助”“关于”等项,全是不可用的。为达到这一效果,在CRMSDlg::OnInitDialog()中加入如下代码:
GetDlgItem(IDC_BTN_UPDPWD)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_DC)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_JS)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_KH)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_CP)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_ZBY)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_VIEWDC)->EnableWindow(FALSE);
然后在资源编辑器加入如图所示的登录对话框。
主对话框的事件处理函数CRMSDlg::OnBtnLogin()的代码如下,它来处理登陆事务。若成功,则使所有的按钮变为可用,示意登录成功。
void CRMSDlg::OnBtnLogin()
{
CDlgLogin dlg;
dlg.DoModal();
try
{
CString sql_;
sql_.Format("SELECT ZBY_NAME FROM ZBY WHERE ZBY_NAME='%s' AND ZBY_PSWD='%s'",
dlg.m_name, dlg.m_pswd);
_bstr_t sql = sql_;
_RecordsetPtr pRst;
pRst = m_DBCnt->Execute(sql, NULL, adCmdText);
if (!pRst->adoEOF)
{
MessageBox("登录成功!");
GetDlgItem(IDC_BTN_UPDPWD)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_DC)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_JS)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_KH)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_CP)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_ZBY)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_VIEWDC)->EnableWindow(TRUE);
} else
{
MessageBox("登录失败!");
}
pRst->Close();
}
catch(_com_error& e)
{
AfxMessageBox(e.ErrorMessage());
return;
}
}
void CRMSDlg::OnBtnUpdpwd()
{
CDlgUpdPwd dlg;
dlg.DoModal();
if (dlg.m_newpswd!=dlg.m_newpswd2)
{
MessageBox("两次输入新密码不一致!");
return;
}
下面是一段SQL语句:
sql_format(“SELECT ZBY NAME FORM ZBY WHERE ZBYNAME+’%s’”
“AND ZBY_PSWD=’%s’”dlg.m_name,dlg.m_pswd);
这里并没有取出ZBY表中的所有字段(ZBY_NAME和ZBY_PSWD),然后把密码字段和用户的输入作比较来决定登录的与否;而是只取出了值班员名字(ZBY_NAME),密码的校验放在数据库服务器端进行。这主要是基于安全考虑。如果没有确实的需要,就竟量不从数据库里取用户密码这种敏感数据。虽然这只是一个细节,但是很多安全漏洞都是又对这种细节的忽视应起的。
登录成功后可以单击“修改口令”按钮激活“修改口令”界面如图所示。
这部分事务的处理代码和登录处理类时,只是更为繁琐。所以只给代码,
void CRMSDlg::OnBtnUpdpwd()
{
CDlgUpdPwd dlg;
dlg.DoModal();
if (dlg.m_newpswd!=dlg.m_newpswd2)
{
MessageBox("两次输入新密码不一致!");
return;
}
try
{
CString sql_;
sql_.Format("SELECT ZBY_NAME FROM ZBY WHERE ZBY_NAME='%s' AND ZBY_PSWD='%s'",
dlg.m_name, dlg.m_oldpswd);
_bstr_t sql = sql_;
_RecordsetPtr pRst;
pRst = m_DBCnt->Execute(sql, NULL, adCmdText);
if (pRst->adoEOF)
{
MessageBox("密码错误!");
pRst->Close();
return;
}
pRst->Close();
sql_.Format("Update ZBY SET ZBY_PSWD='%s' WHERE ZBY_NAME='%s'",
dlg.m_newpswd, dlg.m_name);
sql = sql_;
m_DBCnt->Execute(sql, NULL, adCmdText);
MessageBox("修改密码成功!");
}
catch(_com_error& e)
{
AfxMessageBox(e.ErrorMessage());
return;
}
}
4.2设计值班员管理模块
下面开始设计值班员表(ZBY0的管理界面。
在资源编辑器中加入一个对话框,用ClassWizard 为这个对话框生成一个类,名为CDlgViewZBY.在CRMSDlg 的按钮事件处理函数中加入这样的代码来激活这个对话框。
void CRMSDlg::OnBtnZby()
{
CDlgViewZBY dlg;
ShowWindow(SW_HIDE);
dlg.DoModal();
ShowWindow(SW_SHOW);
}
这个模块,我们采用ADO的ActiveX 控件来实现对数据库表格的管理。
4.3设计菜谱管理模块
不同的用户需要不同界面每个窗口都需要和数据库连接,这一浪费了 资源,也降低了系统性能,所以好的用户需要一个好的菜谱管理模块。此对话框设计如下图所示。
这里用一个列表控件显示读取的数据记录。在 CDlgViewCP::OnInitDialog()中 这个控件(m_list)进行初始化。
BOOL CDlgViewCP::OnInitDialog()
{
CDialog::OnInitDialog();
m_list.InsertColumn(0,"菜谱号");
m_list.InsertColumn(1,"菜名");
m_list.InsertColumn(2,"种类");
m_list.InsertColumn(3,"价格");
m_list.InsertColumn(4,"备注");
RECT rect;
m_list.GetWindowRect(&rect);
int wid = rect.right - rect.left;
m_list.SetColumnWidth(0,wid/5);
m_list.SetColumnWidth(1,wid/5);
m_list.SetColumnWidth(2,wid/5);
m_list.SetColumnWidth(3,wid/5);
m_list.SetColumnWidth(4,wid/5);
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
使其中m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);一行,这一行使单击列表框时,使整行被选中而不是其中的某一格。在单机到某一行的时候,程序处理这个单击事件(NM_CLICK),把这一行的数据在下面的各个编辑框中显示出来。这是一个很常用的方法,所以把这部分代码列在下表:
void CDlgViewCP::OnClickListCp(NMHDR* pNMHDR, LRESULT* pResult)
{
int i = m_list.GetSelectionMark();
m_no = m_list.GetItemText(i,0);
m_name = m_list.GetItemText(i,1);
m_kind = m_list.GetItemText(i,2);
m_price = (float)atof(m_list.GetItemText(i,3));
m_detail = m_list.GetItemText(i,4);
UpdateData(FALSE);
*pResult = 0;
}
这里程序将要实现查询菜谱功能:由用户选择查询的目标,然后填入查询内容,就能查到符合条件的菜谱。如果没有任何输入查询条件,则列出所有菜谱。使用ClassWizard添加响应“查询”按钮的事件处理函数。
void CDlgViewCP::OnBtnVcqry()
{
CString qry;
CString col;
GetDlgItemText(IDC_EDIT_VCQRY, qry);
GetDlgItemText(IDC_COMBO_VCCOL, col);
if ((qry.GetLength()==0) || (col.GetLength()==0))
{
RefreshData("SELECT * FROM CP");
} else
{
CString sql;
sql.Format("SELECT * FROM CP WHERE %s='%s'",
col, qry);
RefreshData(sql);
}
}
4.4设计订餐模块
订餐管理模块里,客户可以逐项输入想订制的菜肴,并随时可对已经作出的选择进行删除和修改。待最终决定后 单击“提交”按钮,用户输入才会保存到数据库中 。
用户先要在“桌号”编辑对话框中输入桌号,然后在“菜谱号”组合框中选择菜肴,为使这个组合框包含所有的菜肴号,在CDlgDC::OnInitDialog()添加代码如下:
BOOL CDlgDC::OnInitDialog()
{
CDialog::OnInitDialog();
m_list.InsertColumn(0,"桌号");
m_list.InsertColumn(1,"菜谱号");
m_list.InsertColumn(2,"菜名");
m_list.InsertColumn(3,"数量");
m_list.InsertColumn(4,"日期");
RECT rect;
m_list.GetWindowRect(&rect);
int wid = rect.right - rect.left;
m_list.SetColumnWidth(0,wid/5);
m_list.SetColumnWidth(1,wid/5);
m_list.SetColumnWidth(2,wid/5);
m_list.SetColumnWidth(3,wid/5);
m_list.SetColumnWidth(4,wid/5);
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);
m_date = CTime::GetCurrentTime();
UpdateData(FALSE);
_RecordsetPtr pRst = NULL;
IADORecordBinding *picRs = NULL; //Interface Pointer declared.(VC++ Extensions)
CCPRs rs;
try
{
_bstr_t strSQL("SELECT * FROM CP");
pRst = m_DBCnt->Execute(strSQL, NULL, adCmdText);
TESTHR(pRst->QueryInterface(__uuidof(IADORecordBinding),(LPVOID*)&picRs));
TESTHR(picRs->BindToRecordset(&rs));
int i = 0;
// 清空cpmap
cpmap.clear();
while (!pRst->adoEOF)
{
m_nos.AddString(rs.m_sz_no);
// 向cpmap中添加一个[菜谱号-菜名]映射
cpmap.insert(CPMap::value_type(string(rs.m_sz_no), string(rs.m_sz_name)));
pRst->MoveNext();
}
picRs->Release();
pRst->Close();
}
catch(_com_error& e)
{
AfxMessageBox(e.ErrorMessage());
return TRUE;
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
4.5设计订餐管理模块
订餐管理模块的设计和菜谱管理模块的界面设计基本相同,数组操控方法也 一样,所以二者的设计 基本可以同样处理。
void CDlgDC::OnBtnDcadd()
char buf[128];
m_list.InsertItem(0, m_desk);
m_nos.GetWindowText(buf, 128); m_list.SetItemText(0, 1, buf);
m_list.SetItemText(0, 2, m_name); {
if (!UpdateData())
return;
if (m_desk.GetLength()==0)
{
MessageBox("请输入桌号!");
return;
}
if (m_name.GetLength()==0)
{
MessageBox("请选择一样菜!");
return;
}
sprintf(buf, "%f", m_number); m_list.SetItemText(0, 3, buf);
_tmstr(m_date, buf); m_list.SetItemText(0, 4, buf);
}
4.6设计结算模块
在单击主界面的“结算”按钮。开始结算的时候,最先出现下面的对话框,如图所示:
用户在这里输入结算桌号和折扣情况,为符合实际情况,需要在Class Wizard里限制折扣一项的输入0.1-1.0之间。下面的处理单击“结算”按钮事件的函数。
void CRMSDlg::OnBtnJs()
{
CDlgBeginJS dlg1;
ShowWindow(SW_HIDE);
dlg1.DoModal();
if (dlg1.m_desk.GetLength()>0)
{
CDlgJS dlg2;
dlg2.Setup(m_DBCnt, dlg1.m_desk, dlg1.m_dz);
dlg2.DoModal();
} else
{
MessageBox("请输入桌号!");
}
ShowWindow(SW_SHOW);
}
在上面的代码中,读取了桌号和折扣的信息后,程序把这2个信息传给一个CDlgJS对话框对象,然后显示这个对话框,如下所示:
在这里。程序读出指定桌号的订餐信息,计算出总金额,并根据打折情况算出帐目。
,BOOL CDlgJS::OnInitDialog()
{
CDialog::OnInitDialog();
m_list.InsertColumn(0,"桌号");
m_list.InsertColumn(1,"菜谱号");
m_list.InsertColumn(2,"菜名");
m_list.InsertColumn(3,"菜价");
m_list.InsertColumn(4,"数量");
m_list.InsertColumn(5,"订餐日期");
RECT rect;
m_list.GetWindowRect(&rect);
int wid = rect.right - rect.left;
m_list.SetColumnWidth(0,wid/6);
m_list.SetColumnWidth(1,wid/6);
m_list.SetColumnWidth(2,wid/6);
m_list.SetColumnWidth(3,wid/6);
m_list.SetColumnWidth(4,wid/6);
m_list.SetColumnWidth(5,wid/6);
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);
m_date = CTime::GetCurrentTime();
SetDlgItemText(IDC_EDIT_JSDESK, m_desk);
char buf[64];
sprintf(buf, "%f", m_dz);
SetDlgItemText(IDC_EDIT_JSDZ, buf);
RefreshData();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
float CDlgJS::GetPrice(LPCTSTR no)
{
_RecordsetPtr pRst = NULL;
IADORecordBinding *picRs = NULL; //Interface Pointer declared.(VC++ Extensions)
CCPRs rs;
rs.m_f_price = 0.0;
CString sql_;
sql_.Format("SELECT * FROM CP WHERE cp_no='%s'", no);
_bstr_t strSQL = sql_;
pRst = m_DBCnt->Execute(strSQL, NULL, adCmdText);
if (pRst->adoEOF)
_com_issue_error(0x80000000);
TESTHR(pRst->QueryInterface(__uuidof(IADORecordBinding),(LPVOID*)&picRs));
TESTHR(picRs->BindToRecordset(&rs));
picRs->Release();
pRst->Close();
return rs.m_f_price;
}
4.7设计帮助模块
本系统的帮助模块由2部分组成。一部分是本程序的about窗口。另一个是在外部编译号的chm格式的帮助文件。单击主对话框中相应按钮可以激活2部分功能。
5、小结经过半个月的设计和调试,完成了餐饮管理系统。其功能基本符合目前餐饮业的要求.先进性:设计合理适用性:功能齐全,模块式可拆卸易用性:操作简单,容易维护稳定性:系统成熟,稳定,安全性能好在整个设计过程中,也并不是很顺利,也出现过很多的问题,不知不觉就钻牛角尖,在不断学习的过程中我体会到:1、作是一个不断学习新鲜事物的过程,从设计初的不懂到最后能够顺利完成,我体会到在实践中学习的重要性,这对于将来我未来的学习具有重要意义。2、由于自己的专业知识不够,在编程的过程中遇到了很多很多的问题,在一步一步的检查后基本上实现了设计处的要求,但功能不是很完善,有待进一步提高3、设计过程中,经常会遇到困难,我学会通过别人的代码理解语言的含义但这并不是抄袭,然后根据自己的设计要求编写代码。设计中得到老师和同学的悉心指导。4、总之,通过此次数据库课程设计,我深刻体会到要做好一个完整的事情,需要有系统的思维方式和方法,对待一个新的问题,要耐心、要善于运用已有的资源来充实自己。同时我也深刻的认识到,在对待一个新事物时,一定要从整体考虑,完成一步之后再作下一步,这样对于系统而言才能更加有效。对MS SQL SERVER2000有了深刻的认识,积累了使用软件工程的思想来开发软件的经验,同时最重要的是摸索出了一套考虑问题和解决问题的法,这对于我以后的工作和学习有了很大的帮助,谢谢柳老师在百忙中抽出时间给我们指导在此感谢!
目录
1 前言…………………………………………………………………………………1
1.1 目的……………………………………………………………………………1
1.2 背景……………………………………………………………………………1
1.3 定义……………………………………………………………………………1
1.4 参考资料………………………………………………………………………1
2 系统分析与设计……………………………………………………………………1
2.1系统目标设计………………………………………………………………… 1
2.2系统开发设计思想 …………………………………………………………1
2.3 系统功能模块……………………………………………………………… 2
3 数据库设计……………………………………………………………………… 2
3.1数据库需求分析……………………………………………………………… 2
3.2数据库概念设计 …………………………………………………………… 3
3.3 数据库逻辑结构设计 ……………………………………………………… 5
3.4 数据字典 ………………………………………………………………… 8
3.5 数据库物理设计…………………………………………………………… 10
4 功能模块设计…………………………………………………………………… 10
4.1设计登陆和口令管理模块………………………………………………… 10
4.2设计值班员管理模块……………………………………………………… 26
4.3设计登陆和口令管理模块……………………………………………………10
4.4 设计管理模块新 ………………………………………………………14
4.5设计定餐模块…………………………………………………………………17
4.6设计结算模块……………………………………………………………… 20
4.7 设计帮助模块……………………………………………………………… 23
5小节………………………………………………………………………………25