1课题背景与意义.31.1课题开发背景.31.2课题开发意义.32系统需求分析.42.1项目要求.42.2开发方案.52.3开发环境.53总体开发.53.1开发思想.53.2系统功能结构设计.73.3业务流程图设计.84数据库设计.84.1数据库概念设计.84.1.1考生档案实体.84.1.2管理员档案实体.94.1.3课程档案实体.94.1.4考试题目实体.104.1.5考生成绩实体.104.2数据库逻辑设计.114.2.1tb_manager(管理员信息表).114.2.2tb_Student(考生信息表).114.2.3tb_stuResult(考生成绩信息表).114.2.4tb_TaoTi(套题信息表).124.2.5tb_Lesson(课程信息表).124.2.6tb_Questions(考试题目信息表).124.3数据表关系设计.135详细设计.145.1前台首页模块设计.145.2考生信息模块设计.145.3在线考试模块设计.155.4考试题目管理模块设计.176软件测试.186.1软件开发技术概述.186.2通过Ajax技术实现计时与显示剩余时间.19参考文献.19附录:数据库源程序.20
2023/11/10 21:58:18 6.81MB 在线考试
1
餐饮管理系统一、需求分析随着社会服务行业的发展,餐饮业对自身服务的质量和能力也有了更高的要求。
餐饮管理系统正是在这样的情况之下越来越受到重视。
餐厅的内部服务项目众多,既需要完成前台的服务工作,还需要完成后台的管理工作,如果没有一套可靠的餐饮管理系统,单凭手工操作,不仅效率低,而且会极大地影响到酒店的服务质量。
设计的目标:实现餐饮管理的科学化、自动化,提高各个模版的办公效率,为高质量的餐饮服务提供保证。
系统功能概述民以食为天,随着人民生活水平的提高,餐饮业在服务行业中占有越来越重要的地位。
经过多年发展,餐饮管理已经逐渐由定性管理,进入到重视定量管理的科学阶段。
众所周知,在定量管理的具体实现方法和手段方面,最有效的工具就是计算机管理。
传统的手工操作管理存在着许多无法避免的问题,例如:人工计算机账单金额出现差错;
收银工作中跑单、漏单、偷钱现象普遍;
个别服务员作弊、改单、宰客情形时有发生;
客人消费单据难以保存和查询。
如果借助计算机来管理,就可以轻松的解决处理这些问题。
一个餐饮管理信息系统应该包括基本的餐厅的服务管理、管理人员信息的维护等,以及与之相应的操作。
所以整个餐饮管理信息系统分为两个大部分,即后台的数据管理维护和前台的操作。
后台数据库的管理能保证系统各项功能正常运行,前台操作能提供给客户尽可能方便快捷的服务。
功能模块划分1. 前台操作系统订餐管理模块:点菜(输入桌台代码和食物代码)、加菜、下单。
结账管理模块:结账(输入桌台代码)、结账方式选择(包括现金结账、信用卡结账、支票结账、签单等)。
交班管理模块:统计当班数据(包括桌台数、人民币结账金额以及总金额等),为下班操作作准备。
2. 后台管理维护系统用户权限设置:可以查询员工的基本资料(姓名、性别、年龄、出生年月、籍贯、家庭住址等),员工登录名称、密码、员工操作权限等,可以根据需要进行设置。
菜谱设置:新菜单录入(包括菜式名称、代码、类型、价格、成本等)、菜式修改、删除等菜式维护。
付款方式设置:分为人民币付款、信用卡、支票签单等,可以根据需要进行添加和删除。
系统流程分析系统流程图1所示。
当用户进入系统主界面以后,新用户经过注册后才能凭借其用户名和密码登录,老用户可以直接登录。
用户登录以后,系统自动判断出其操作权限。
操作权限包括普通员工和管理人员。
新用户的操作权限默认为是普通员工。
普通员工只能进行订餐、结账操作,而管理人员除此之外还可以进行系统设置与营业分析。
•图1当有顾客订餐的时候,员工输入桌台号和食物代码即可进行点菜,在结账以前,加菜是允许的。
当顾客结账的时候,员工输入桌台号,选择顾客的付款方式,即可完成结账。
在下班时间,员工可以统计当班期间的消费情况。
这样,员工注销此次登录,退出系统,一天的工作就到此结束。
管理人员可以随时进行系统设置,包括菜谱设置、用户权限设置、付款方式设置等。
功能模块调用餐饮管理系统调用了以下功能模块:用户注册模块、用户登录模块、数据显示模块。
二、概念设计图2给出了餐饮管理系统的E-R实体关系图。
收银员、餐桌、菜单三者之间的关系是订餐,其中订餐关系包括的属性有:餐桌编号、菜肴编号、菜肴名称、菜肴单价、菜肴数量、菜肴价格、菜肴折扣、是否结账、结账时间。
三、逻辑设计将E-R关系模型转化为二维表。
本系统主要需要6个表,分别为用户信息表(UserInfo)、菜谱信息表(MenuInfo)、订餐信息表(OrderInfo)、桌台信息表(DeskInfo)、付款方式表(PayModeInfo)、当班统计表(CaldayInfo),各个表中字段的类型以及说明如表1-表6所示。
表1用户信息表表2菜谱信息表表3订餐信息表表4桌台信息表表5付款方式表表6当班统计表其中,用户信息表主要存储用户的基本信息,权限项决定了用户的操作权限。
菜谱信息表存储食物的基本信息。
价格项为结账与结算提供依据。
桌台信息表存储各个桌台的消费情况,如消费金额、是否结账等。
订餐信息表存储各个桌台的点菜情况。
付款方式表存储了基本的付款方式,供结账时选择。
当班统计表存储员工当班期间的营业情况。
四、数据库设计数据库管理系统采用MicrosoftSQLServer2000作为后台数据库。
首先,在企业管理器中建立一个名为MenuManageSys的数据库,然后建立以上6个数据库表,并设定主键、长度。
这样,数据库的设计已经完成。
五、详细设计本餐饮管理系统采用VisualC+++SQLServer来开发。
利用ADO技术调用后台数据库,使用了两个ADO智能指针_ConnectionPtr和_RecordsetPtr,其中_ConnectionPtr用来连接后台SQLServer数据库,_RecordsetPtr指针用来对数据库的表中的记录集进行操作。
工程使用的是基于对话框的程序,每个对话框为一个类,父类为CDialog,实现的一些功能都封装在类的函数中,体现了面向对象编程语言C++的特性。
导入ADO接口:在工程的stdafx.h文件里直接引入符号#import引入ADO库文件,加入下面一行代码,以使编译器能正确编译:#import"c:\programfiles\commonfiles\system\ado\msado15.dll"no_namespacerename("EOF","adoEOF")用_ConnectionPtr指针连接数据库:在CmenuManageSysApp类的BOOLInitInstance()函数中加入以下代码:m_pConnection.CreateInstance("ADODB.Connection"); try { m_pConnection->ConnectionTimeout=8; m_pConnection->PutCursorLocation(adUseClient);m_pConnection->Open("driver={SQLServer};Server=172.29.130.47;DATABASE=MenuManageSys;UID=;PWD=","","",adModeUnknown); } catch(_com_errore) { AfxMessageBox("数据库连接失败!"); returnFALSE; }1.设计工程框架餐饮管理系统的框架是一个对话框类型的操作界面,用户注册、登录后,可对餐饮管理的各个功能模块进行操作。
1.1设置主界面系统主界面如图3:图3每个事件的对应代码如下:(1) 单击“注册”菜单,弹出“注册”对话框,代码如下:voidCMenuManageSysDlg::OnRegister(){ CRegisterDlgdlg(this); dlg.DoModal();}(2) 单击“登录”菜单,弹出“登录”对话框,代码如下:voidCMenuManageSysDlg::OnLogin(){ CLoginDlgdlg(this); dlg.DoModal();}(3) 单击“订餐”菜单,判断用户是否登录,代码如下:voidCMenuManageSysDlg::OnUpdateOrderSystem(CCmdUI*pCmdUI){ if(theApp.m_Level==0||theApp.m_Level==1) { pCmdUI->Enable(true); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); }}(4) 如果用户已经登录,弹出“餐桌信息”对话框,否则提示用户登录,代码如下:voidCMenuManageSysDlg::OnOrderSystem(){ CDeskDlgdlg; dlg.DoModal();}(5) 单击“结账”菜单,判断用户是否登录,代码如下:voidCMenuManageSysDlg::OnUpdatePayCheck(CCmdUI*pCmdUI){ if(theApp.m_Level==0||theApp.m_Level==1) { pCmdUI->Enable(true); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); }}(6) 如果用户已经登录,弹出“结账”对话框,否则提示用户先登录,代码如下:voidCMenuManageSysDlg::OnPayCheck(){ CPayDlgdlg; dlg.DoModal();}(7) 单击“下班”菜单,判断用户是否登录,代码如下:voidCMenuManageSysDlg::OnUpdateChangeDuty(CCmdUI*pCmdUI){ if(theApp.m_Level==0||theApp.m_Level==1) { pCmdUI->Enable(true); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); }}(8) 如果用户已经登录,弹出“交接班”对话框,否则提示用户先登录,代码如下:voidCMenuManageSysDlg::OnChangeDuty(){ COffdutyDlgdlg; dlg.DoModal();}(9) 单击“用户权限设置”菜单,判断用户是否登录及其权限,代码如下:voidCMenuManageSysDlg::OnUpdateSetLevel(CCmdUI*pCmdUI){ if(theApp.m_Level==1) { pCmdUI->Enable(true); } elseif(theApp.m_Level==0) { pCmdUI->Enable(false); AfxMessageBox("您无权进行用户级别设置"); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); } }(10) 如果权限是管理人员,弹出“权限设置”对话框,如果是普通员工会提示无权进行用户级别设置,代码如下:voidCMenuManageSysDlg::OnSetLevel(){ CLevelDlgdlg; dlg.DoModal();}(11) 单击“菜谱设置”菜单,判断用户是否登录及其权限,代码如下:voidCMenuManageSysDlg::OnUpdateSetMenu(CCmdUI*pCmdUI){ if(theApp.m_Level==1) { pCmdUI->Enable(true); } elseif(theApp.m_Level==0) { pCmdUI->Enable(false); AfxMessageBox("您无权进行菜谱设置"); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); } }(12)如果权限是管理人员,弹出“菜谱设置”对话框,如果是普通员工会提示无权进行用户级别设置,代码如下:voidCMenuManageSysDlg::OnSetMenu(){ CMenuSetDlgdlg; dlg.DoModal();}(13)单击“付款方式设置”菜单,判断用户是否登录及其权限,代码如下:voidCMenuManageSysDlg::OnUpdatePaymodeSet(CCmdUI*pCmdUI){ if(theApp.m_Level==1) { pCmdUI->Enable(true); } elseif(theApp.m_Level==0) { pCmdUI->Enable(false); AfxMessageBox("您无权进行付款方式设置"); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); }}(14)如果权限是管理人员,弹出“设置付款方式”对话框,如果是普通员工会提示无权进行用户级别设置,代码如下:voidCMenuManageSysDlg::OnPaymodeSet(){ CSetPaymodeDlgdlg; dlg.DoModal();}(15)单击“注销”菜单,提示用户本次登录已注销,代码如下:voidCMenuManageSysDlg::OnLogout(){ if(MessageBox("您确定要注销吗","注销询问",MB_OKCANCEL|MB_ICONQUESTION)==IDOK) { theApp.m_Level=-1; AfxMessageBox("本次登录已注销"); }}(16)单击“退出系统”,在确定退出后,关闭系统,代码如下:voidCMenuManageSysDlg::OnExitSystem(){ if(MessageBox("真的要退出系统吗","退出询问",MB_OKCANCEL|MB_ICONQUESTION)==IDOK) { CDialog::OnOK(); }}1.2设计注册模块注册模块如图4:图4注册模块在输入了完整的信息,按下“确定”按钮后,如果没有重复用户,则注册成功,代码如下:voidCRegisterDlg::OnRegisterBtn(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE);if(!m_strUserName.IsEmpty()&&!m_strUserNative.IsEmpty()&&!m_strUserAdddress.IsEmpty()&&!m_strUserPwd.IsEmpty()&& !m_strUserPwdAgain.IsEmpty()&&!m_strUserNum.IsEmpty()&&m_nUserAge!=0) { if(m_strUserPwd.CompareNoCase(m_strUserPwdAgain)!=0) { MessageBox("密码有误,请重新输入密码。
","系统注册"); } else { try { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open("SELECT*FROMUserInfo",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText); } catch(_com_errore) { CStringtemp; temp.Format("连接数据库错误信息:%s",e.ErrorMessage()); AfxMessageBox(temp); return; } m_pRecordset->AddNew(); m_pRecordset->PutCollect("UserName",_variant_t(m_strUserName)); m_pRecordset->PutCollect("UserPwd",_variant_t(m_strUserPwd)); m_pRecordset->PutCollect("UserNative",_variant_t(m_strUserNative)); m_pRecordset->PutCollect("UserAddress",_variant_t(m_strUserAdddress)); m_pRecordset->PutCollect("UserNum",_variant_t(m_strUserNum)); CStringstr; if(m_nUserSex==0) { m_pRecordset->PutCollect("UserSex",_variant_t("男")); } elsem_pRecordset->PutCollect("UserSex",_variant_t("女")); str.Format("%d",m_nUserAge); m_pRecordset->PutCollect("UserAge",_variant_t(str)); str.Format("%d",0); m_pRecordset->PutCollect("UserLevel",_variant_t(str)); m_pRecordset->Update(); m_pRecordset->Close(); m_pRecordset=NULL; MessageBox("恭喜您注册成功","系统注册"); CDialog::OnOK(); return; } } else { MessageBox("请输入完整注册信息","系统注册"); } }登录模块如图5:图5登录模块输入完整信息,并单击“确定”按钮后,如果用户名不存在,则重新输入;
如果密码错误,则重新输入,在重新输入三次密码后还不正确,则退出登录界面,登录失败。
代码如下:voidCLoginDlg::OnOK(){ UpdateData(TRUE); if(!m_strUserName.IsEmpty()&&!m_strPassword.IsEmpty()) { try { CStringsql,str; // str.Format("%d",m_nUserNum); sql="SELECT*FROMUserInfoWHEREUserName='"+m_strUserName+"'andUserNum='"+m_strUserNum+"'andUserPwd='"+m_strPassword+"'"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText); if(m_pRecordset->adoEOF) { m_pRecordset->Close(); sql="SELECT*FROMUserInfoWHEREUserName='"+m_strUserName+"'ANDUserNum='"+m_strUserNum+"'"; try { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText); if(m_pRecordset->adoEOF) { MessageBox("此用户不存在!","登录系统"); } else { if(count>=2) { MessageBox("登录次数过多,系统关闭","系统登录错误",MB_OK|MB_ICONWARNING); CDialog::OnOK(); } else { MessageBox("密码错误!","登录系统"); count++; } return; } } catch(_com_errore)///捕捉异常 { CStringtemp; temp.Format("连接数据库错误信息:%s",e.ErrorMessage()); AfxMessageBox(temp); return; } } else { theApp.m_Level=m_pRecordset->GetCollect("UserLevel").lVal; theApp.m_name=m_strUserName; MessageBox("登录成功!","登录系统",MB_OKCANCEL|MB_ICONQUESTION); CDialog::OnOK(); return; } } catch(_com_errore)///捕捉异常 { CStringtemp; temp.Format("连接数据库错误信息:%s",e.ErrorMessage()); AfxMessageBox(temp); return; } m_pRecordset->Close(); m_pRecordset=NULL; } else { MessageBox("请输入用户名和密码","登录系统"); }}到此,注册模块与登录模块就设计完成。
新用户注册以后,凭借其用户名和密码可以登陆,从而对系统进行操作。
3.功能模块设计根据功能模块划分,可以将餐饮管理系统的功能模块划分为值班员管理模块、菜谱管理模块、用户管理模块、订餐模块、结账模块,下面对工程各个功能进行介绍。
3.1订餐模块设计订餐模块的功能是员工输入桌台号码和食物代码进行点菜、根据需要加菜、下单。
订餐模块如图6所示:图6订餐模块为对话框类添加3个数据集对象:_RecordsetPtrm_pRecordset_Desk;_RecordsetPtrm_pRecordset_Order;_RecordsetPtrm_pRecordset_Menu;对话框类的各成员函数的代码如下:CDeskDlg::CDeskDlg(CWnd*pParent/*=NULL*/):CDialog(CDeskDlg::IDD,pParent){ //{{AFX_DATA_INIT(CDeskDlg) m_nOrderDeskNumber=0; m_nOrderFoodNumber=0; m_nOrderFoodRebate=100; m_nOrderFoodAcount=1; //}}AFX_DATA_INIT}BOOLCDeskDlg::OnInitDialog()//对话框初始化函数{ CDialog::OnInitDialog(); GetDlgItem(IDOK)->EnableWindow(FALSE); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCDeskDlg::OnOrderBtn()//点菜消息按钮{ UpdateData(TRUE); CStringstr; CStringsql; if(m_nOrderDeskNumber==0) { AfxMessageBox("请输入餐桌编号"); return; } if(m_nOrderFoodNumber!=0) { str.Format("%d",m_nOrderFoodNumber); sql="SELECT*FROMMenuInfoWHEREFoodNum="+str+""; m_pRecordset_Menu.CreateInstance("ADODB.Recordset"); m_pRecordset_Menu->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Menu->GetRecordCount()==0) { AfxMessageBox("该菜肴编号不存在,请重新输入编号"); return; } else { intm_nTempPrice; CStringm_strTempName; m_nTempPrice=m_pRecordset_Menu->GetCollect("FoodPrice").lVal;//食物价格 m_strTempName=m_pRecordset_Menu->GetCollect("FoodName").bstrVal;//食物名称 m_pRecordset_Menu->Close(); str.Format("%d",m_nOrderDeskNumber);//桌子编号 sql="SELECT*FROMOrderInfoWHEREDeskNum="+str+""; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_pRecordset_Order->AddNew(); str.Format("%d",m_nOrderDeskNumber); m_pRecordset_Order->PutCollect("DeskNum",_variant_t(str));//餐桌编号 str.Format("%d",m_nOrderFoodNumber); m_pRecordset_Order->PutCollect("FoodNum",_variant_t(str));//食物编号 str.Format("%d",m_nTempPrice); m_pRecordset_Order->PutCollect("FoodSignalPrice",_variant_t(str));//食物单价 str.Format("%d",m_nOrderFoodAcount); m_pRecordset_Order->PutCollect("FoodAcount",_variant_t(str));//食物数量 m_nTempPrice*=m_nOrderFoodAcount; str.Format("%d",m_nTempPrice); m_pRecordset_Order->PutCollect("FoodPrice",_variant_t(str));//食物价格 str.Format("%d",m_nOrderFoodRebate); m_pRecordset_Order->PutCollect("FoodRebate",_variant_t(str));//食物折扣 intm_nTempRePrice; m_nTempRePrice=(int)m_nTempPrice*m_nOrderFoodRebate/100; str.Format("%d",m_nTempRePrice); m_pRecordset_Order->PutCollect("FoodRePrice",_variant_t(str)); //折后价格(小计) m_pRecordset_Order->PutCollect("FoodName",_variant_t(m_strTempName));//食物名称 intm_nTempCheck; m_nTempCheck=0; str.Format("%d",m_nTempCheck); m_pRecordset_Order->PutCollect("FoodCheck",_variant_t(str));//是否结帐 CStringpaytime; CTimenow=CTime::GetCurrentTime(); paytime=now.Format(_T("%Y-%m-%d%H:%M:%S")); m_pRecordset_Order->PutCollect("FoodTime",_variant_t(paytime));//点菜时间 m_pRecordset_Order->Update(); m_pRecordset_Order->Close(); str.Format("%d",m_nOrderDeskNumber); CStringstr1; str1.Format("%d",0); sql="SELECT*FROMOrderInfoWHEREDeskNum="+str+"andFoodCheck="+str1+""; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbFood.SetRefDataSource(NULL); m_dbFood.SetRefDataSource((LPUNKNOWN)m_pRecordset_Order); m_dbFood.SetColumnHeaders(2); m_dbFood.Refresh(); GetDlgItem(IDOK)->EnableWindow(TRUE); } } else { AfxMessageBox("请输入菜肴编号"); return; } }voidCDeskDlg::OnOK()//下单消息按钮{ CStringstr,sql,str1; intm_nTempRePrice; m_nTotalPrice=0; while(!m_pRecordset_Order->adoEOF) { m_nTempRePrice=m_pRecordset_Order->GetCollect("FoodRePrice").lVal; m_nTotalPrice+=m_nTempRePrice; m_pRecordset_Order->MoveNext(); } if(m_nTotalPrice>0) { inttemp=0; str1.Format("%d",temp); str.Format("%d",m_nOrderDeskNumber); sql="SELECT*FROMDeskInfoWHEREDeskNum="+str+"andDeskCheck="+str1+""; m_pRecordset_Desk.CreateInstance("ADODB.Recordset"); m_pRecordset_Desk->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Desk->GetRecordCount()==0) { m_pRecordset_Desk->AddNew(); str.Format("%d",m_nOrderDeskNumber); m_pRecordset_Desk->PutCollect("DeskNum",(_variant_t)str); str.Format("%d",m_nTotalPrice); m_pRecordset_Desk->PutCollect("DeskPrice",(_variant_t)str); temp=0; str.Format("%d",temp); m_pRecordset_Desk->PutCollect("DeskCheck",(_variant_t)str); } else { str.Format("%d",m_nTotalPrice); m_pRecordset_Desk->PutCollect("DeskPrice",(_variant_t)str); } m_pRecordset_Desk->Update(); m_pRecordset_Desk->Close(); } CDialog::OnOK();}voidCDeskDlg::OnUpdateOrderDeskNumber()//根据餐桌号自动将原来已点的食物信息绑定到数据列表{ UpdateData(TRUE); CStringstr,sql; str.Format("%d",m_nOrderDeskNumber); CStringstr1; inttemp=0; str1.Format("%d",temp); sql="SELECT*FROMOrderInfoWHEREDeskNum="+str+"andFoodCheck="+str1+""; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbFood.SetRefDataSource(NULL); m_dbFood.SetRefDataSource((LPUNKNOWN)m_pRecordset_Order); m_dbFood.SetColumnHeaders(2); m_dbFood.Refresh(); }3.2结账模块设计结账模块的功能是员工输入桌台代码进行结账、选择结账方式(包括现金结账、信用卡结账、支票结账、签单等)、自动找零。
结账模块如图7所示:图7结账模块为对话框类添加3个数据集对象,代码如下: _RecordsetPtrm_pRecordset_Paymode; _RecordsetPtrm_pRecordset_Order; _RecordsetPtrm_pRecordset_Desk;对话框类的各成员函数的代码如下:CPayDlg::CPayDlg(CWnd*pParent/*=NULL*/) :CDialog(CPayDlg::IDD,pParent){ //{{AFX_DATA_INIT(CPayDlg) m_strPaymode=_T(""); m_strPayUserName=_T(""); m_nPayDeskNumber=0; m_nPayTotalPrice=0; m_nPayRealPrice=0; m_nPayRePrice=0; m_timePay=COleDateTime::GetCurrentTime(); //}}AFX_DATA_INIT}BOOLCPayDlg::OnInitDialog()//对话框初始化函数{ CDialog::OnInitDialog(); m_strPayUserName=theApp.m_name; CStringsql; sql="SELECT*FROMPayModeInfo"; m_pRecordset_Paymode.CreateInstance("ADODB.Recordset"); m_pRecordset_Paymode->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Paymode->GetRecordCount()!=0) { while(!m_pRecordset_Paymode->adoEOF) { m_coPaymode.AddString((LPCTSTR)(_bstr_t)m_pRecordset_Paymode->GetCollect("NAME")); m_pRecordset_Paymode->MoveNext(); } m_pRecordset_Paymode->Close(); m_coPaymode.SetCurSel(0); } UpdateData(FALSE); returnTRUE;}voidCPayDlg::OnUpdatePayDeskNumber()//自动将对应桌号的点菜信息以及消费情况显示在桌面上{ UpdateData(TRUE); CStringsql,str,str1; inttemp=0; str.Format("%d",m_nPayDeskNumber); str1.Format("%d",temp); sql="SELECT*FROMDeskInfoWHEREDeskNum="+str+"ANDDeskCheck="+str1+""; m_pRecordset_Desk.CreateInstance("ADODB.Recordset"); m_pRecordset_Desk->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Desk->GetRecordCount()!=0) { m_nPayTotalPrice=m_pRecordset_Desk->GetCollect("DeskPrice").lVal; } m_pRecordset_Desk->Close(); sql="SELECT*FROMOrderInfoWHEREDeskNum="+str+"ANDFoodCheck="+str1+""; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbPay.SetRefDataSource(NULL); m_dbPay.SetRefDataSource((LPUNKNOWN)m_pRecordset_Order); m_dbPay.SetColumnHeaders(1); m_dbPay.Refresh(); UpdateData(FALSE);}voidCPayDlg::OnUpdatePayRealprice()//根据实收金额自动计算找零金额{ UpdateData(TRUE); m_nPayRePrice=m_nPayRealPrice-m_nPayTotalPrice; UpdateData(FALSE);}voidCPayDlg::OnOK()//确定按钮消息函数,将数据写回DESK表和ORDER表,结账完成{ UpdateData(TRUE); if(!m_strPaymode.IsEmpty()&&m_nPayRealPrice!=0) { CStringsql,str,str1; inttemp=0; str.Format("%d",m_nPayDeskNumber); str1.Format("%d",temp); sql="SELECT*FROMDeskInfoWHEREDeskNum="+str+"ANDDeskCheck="+str1+""; m_pRecordset_Desk.CreateInstance("ADODB.Recordset"); m_pRecordset_Desk->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Desk->GetRecordCount!=0) { temp=1; str.Format("%d",temp); m_pRecordset_Desk->PutCollect("DeskCheck",(_variant_t)str); intselmode; selmode=m_coPaymode.GetCurSel(); m_coPaymode.GetLBText(selmode,m_strPaymode); m_pRecordset_Desk->PutCollect("DeskPaymode",_variant_t(m_strPaymode)); CStringpaytime; CTimenow=CTime::GetCurrentTime(); paytime=now.Format(_T("%Y-%m-%d%H:%M:%S")); m_pRecordset_Desk->PutCollect("DeskDateTime",(_variant_t)paytime); m_pRecordset_Desk->PutCollect("DeskName",(_variant_t)m_strPayUserName); } m_pRecordset_Desk->Update(); m_pRecordset_Desk->Close(); str.Format("%d",m_nPayDeskNumber); sql="SELECT*FROMOrderInfoWHEREDeskNum="+str+"ANDFoodCheck="+str1+""; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Order->GetRecordCount()!=0) { temp=1; str.Format("%d",temp); while(!m_pRecordset_Order->adoEOF) { m_pRecordset_Order->PutCollect("FoodCheck",(_variant_t)str); m_pRecordset_Order->Update(); m_pRecordset_Order->MoveNext(); } } m_pRecordset_Order->Close(); str.Format("%d",m_nPayDeskNumber); str+="号桌已结账"; AfxMessageBox(str); CDialog::OnOK(); } else { AfxMessageBox("请输入完整信息"); }}到此,结账模块已经设计完成。
3.3交接班模块设计交接班模块的功能是管理员统计当班数据(包括桌台数、人民币结账金额以及总金额等),为下班操作做准备。
交接班模块如图8所示:图8交接班模块为对话框类添加两个数据集对象,代码如下:_RecordsetPtrm_pRecordset_Off;_RecordsetPtrm_pRecordset_Desk;对话框类的各成员函数的代码如下:COffdutyDlg::COffdutyDlg(CWnd*pParent/*=NULL*/) :CDialog(COffdutyDlg::IDD,pParent){ //{{AFX_DATA_INIT(COffdutyDlg) m_strDayName=_T(""); m_nTotalAcount=0; m_timeDay=0; //}}AFX_DATA_INIT}BOOLCOffdutyDlg::OnInitDialog()//对话框初始化{ CDialog::OnInitDialog(); m_timeDay=CTime::GetCurrentTime(); m_strDayName=theApp.m_name; UpdateData(FALSE); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCOffdutyDlg::OnCalDayBtn()//统计按钮,负责当班统计{ CStringsql,str; inttemp=1; str.Format("%d",temp); sql="SELECT*FROMDeskInfoWHEREDeskCheck="+str+"ANDDeskName='"+m_strDayName+"'"; m_pRecordset_Desk.CreateInstance("ADODB.Recordset"); m_pRecordset_Desk->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); intrenminbi_jine=0,qita_jine=0,total_jine=0,acount=0; if(m_pRecordset_Desk->GetRecordCount!=0) { while(!m_pRecordset_Desk->adoEOF) { str=m_pRecordset_Desk->GetCollect("DeskPaymode").bstrVal; if(str.CompareNoCase("人民币")==0) { renminbi_jine+=m_pRecordset_Desk->GetCollect("DeskPrice").lVal; } else { qita_jine+=m_pRecordset_Desk->GetCollect("DeskPrice").lVal; } acount++; m_pRecordset_Desk->MoveNext(); } } m_pRecordset_Desk->Close(); total_jine=renminbi_jine+qita_jine; m_pRecordset_Off.CreateInstance("ADODB.Recordset"); m_pRecordset_Off->Open("SELECT*FROMCalDayInfo",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Off->GetRecordCount!=0) { while(!m_pRecordset_Off->adoEOF) { m_pRecordset_Off->Delete(adAffectCurrent); m_pRecordset_Off->Update(); m_pRecordset_Off->MoveNext(); } } m_pRecordset_Off->AddNew(); m_pRecordset_Off->PutCollect("mode",_variant_t("人民币")); str.Format("%d",renminbi_jine); m_pRecordset_Off->PutCollect("money",_variant_t(str)); m_pRecordset_Off->AddNew(); m_pRecordset_Off->PutCollect("mode",_variant_t("其他")); str.Format("%d",qita_jine); m_pRecordset_Off->PutCollect("money",_variant_t(str)); m_pRecordset_Off->AddNew(); m_pRecordset_Off->PutCollect("mode",_variant_t("合计")); str.Format("%d",total_jine); m_pRecordset_Off->PutCollect("money",_variant_t(str)); m_dbTotalDay.SetRefDataSource(NULL); m_dbTotalDay.SetRefDataSource((LPUNKNOWN)m_pRecordset_Off); m_dbTotalDay.SetColumnHeaders(2); m_dbTotalDay.Refresh(); m_pRecordset_Off->Update(); m_nTotalAcount=acount; UpdateData(FALSE);}3.4用户权限管理模块设计用户权限模块的功能是方便管理人员查询员工的基本资料,设置员工的操作权限。
用户权限设置模块的设计如图9:图9权限设置模块对话框类的各成员函数的代码如下:CLevelDlg::CLevelDlg(CWnd*pParent/*=NULL*/) :CDialog(CLevelDlg::IDD,pParent){ //{{AFX_DATA_INIT(CLevelDlg) m_strUserName=_T(""); m_strUserNum=_T(""); m_strLevelSelect=_T(""); //}}AFX_DATA_INIT}BOOLCLevelDlg::OnInitDialog(){ CDialog::OnInitDialog(); m_coLevelSelect.AddString("管理员"); m_coLevelSelect.AddString("用户"); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE); UpdateData(FALSE); CStringsql; sql="SELECT*FROMUserInfo"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCLevelDlg::OnChange(){ GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(TRUE); GetDlgItem(IDC_CONFIRM)->EnableWindow(TRUE); UpdateData(TRUE); CStringsql; sql="SELECTUserName,UserNum,UserLevel,UserPwdFROMUserInfoWHEREUserName='"+m_strUserName+"'ANDUserNum='"+m_strUserNum+"'"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh();}voidCLevelDlg::OnConfirm(){ UpdateData(TRUE); if(!m_strLevelSelect.IsEmpty()) { if(m_strLevelSelect.CompareNoCase("管理员")==0) { CStringstr,sql;inttemp=1; str.Format("%d",temp); sql="SELECTUserName,UserNum,UserLevel,UserPwdFROMUserInfoWHEREUserName='"+m_strUserName+"'ANDUserNum='"+m_strUserNum+"'"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_pRecordset->PutCollect("UserLevel",_variant_t(str)); m_pRecordset->Update(); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); AfxMessageBox("权限修改成功"); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE); } else { CStringstr,sql;inttemp=0; str.Format("%d",temp); sql="SELECTUserName,UserNum,UserLevel,UserPwdFROMUserInfoWHEREUserName='"+m_strUserName+"'ANDUserNum='"+m_strUserNum+"'"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_pRecordset->PutCollect("UserLevel",_variant_t(str)); m_pRecordset->Update(); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); AfxMessageBox("权限修改成功"); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE); } } else { AfxMessageBox("请选择权限"); }}voidCLevelDlg::OnShowAll(){ CStringsql; sql="SELECT*FROMUserInfo"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE);}至此,权限设置模块设计完成。
3.5菜谱管理模块设计菜谱管理模块的功能是管理人员进行新菜式的录入、菜式修改、删除等菜式维护。
菜谱管理模块如图10:图10菜单管理模块对话框类的各成员函数的代码如下:CMenuSetDlg::CMenuSetDlg(CWnd*pParent/*=NULL*/) :CDialog(CMenuSetDlg::IDD,pParent){ //{{AFX_DATA_INIT(CMenuSetDlg) m_nInputNum=0; m_nCost=0; m_strName=_T(""); m_nNum=0; m_nPrice=0; m_strRemark=_T(""); m_strType=_T(""); //}}AFX_DATA_INIT}BOOLCMenuSetDlg::OnInitDialog()//对话框初始化{ CDialog::OnInitDialog(); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCMenuSetDlg::OnUpdateEditInputNum(){ UpdateData(TRUE); if(m_nInputNum!=0) { GetDlgItem(IDC_INQUIRY)->EnableWindow(TRUE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); }}voidCMenuSetDlg::OnInquiry()//查询{ UpdateData(TRUE); CStringsql,str; str.Format("%d",m_nInputNum); sql="SELECT*FROMMenuInfoWHEREFoodNum="+str+""; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset->GetRecordCount()!=0) { m_nInputNum=0; m_nNum=m_pRecordset->GetCollect("FoodNum").lVal; m_strName=m_pRecordset->GetCollect("FoodName").bstrVal; m_strType=m_pRecordset->GetCollect("FoodType").bstrVal; m_nPrice=m_pRecordset->GetCollect("FoodPrice").lVal; m_nCost=m_pRecordset->GetCollect("FoodCost").lVal; m_strRemark=m_pRecordset->GetCollect("FoodRemark").bstrVal; GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(TRUE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); } else { // m_nInputNum=0; AfxMessageBox("您所查找的菜肴不存在"); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); } UpdateData(FALSE);}voidCMenuSetDlg::OnAddNew()//新增{ m_nCost=0; m_strName=_T(""); m_nNum=0; m_nPrice=0; m_strRemark=_T(""); m_strType=_T(""); GetDlgItem(IDC_ADDSAVE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_NUM)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(TRUE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_INPUT_NUM)->EnableWindow(TRUE); UpdateData(FALSE);}voidCMenuSetDlg::OnAddSave()//保存所增加项{ UpdateData(TRUE); if(m_nCost!=0&&m_nNum!=0&&m_nPrice!=0&&!m_strName.IsEmpty()&&!m_strRemark.IsEmpty()&&!m_strType.IsEmpty()) { GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_INPUT_NUM)->EnableWindow(TRUE); CStringstr,sql; str.Format("%d",m_nNum); sql="SELECT*FROMMenuInfoWHEREFoodNum="+str+""; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset->GetRecordCount()!=0) { AfxMessageBox("菜肴号码已存在"); } else { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open("SELECT*FROMMenuInfo",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_nNum==0) { AfxMessageBox("菜肴号码不能为0"); return; } else { m_pRecordset->AddNew(); str.Format("%d",m_nNum); m_pRecordset->PutCollect("FoodNum",_variant_t(str)); m_pRecordset->PutCollect("FoodName",_variant_t(m_strName)); m_pRecordset->PutCollect("FoodType",_variant_t(m_strType)); str.Format("%d",m_nPrice); m_pRecordset->PutCollect("FoodPrice",_variant_t(str)); str.Format("%d",m_nCost); m_pRecordset->PutCollect("FoodCost",_variant_t(str)); m_pRecordset->PutCollect("FoodRemark",_variant_t(m_strRemark)); m_pRecordset->Update(); m_pRecordset->Close(); AfxMessageBox("已保存"); m_nCost=0; m_strName=_T(""); m_nNum=0; m_nPrice=0; m_strRemark=_T(""); m_strType=_T(""); UpdateData(FALSE); } } } elseAfxMessageBox("请输入完整信息");}voidCMenuSetDlg::OnModify()//修改{ GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(TRUE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(TRUE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); m_nCost=0; m_nPrice=0; m_strRemark=_T(""); m_strType=_T(""); UpdateData(FALSE);}voidCMenuSetDlg::OnModifysave()//保存修改{ UpdateData(TRUE); if(!m_strType.IsEmpty()&&m_nPrice!=0&&m_nCost!=0&&!m_strRemark.IsEmpty()) { CStringstr,sql; str.Format("%d",m_nNum); // m_pRecordset->PutCollect("FoodNum",_variant_t(str)); // m_pRecordset->PutCollect("FoodName",_variant_t(m_strName)); m_pRecordset->PutCollect("FoodType",_variant_t(m_strType)); str.Format("%d",m_nPrice); m_pRecordset->PutCollect("FoodPrice",_variant_t(str)); str.Format("%d",m_nCost); m_pRecordset->PutCollect("FoodCost",_variant_t(str)); m_pRecordset->PutCollect("FoodRemark",_variant_t(m_strRemark)); m_pRecordset->Update(); AfxMessageBox("修改成功"); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); } else { AfxMessageBox("请输入完整信息"); }}voidCMenuSetDlg::OnDel(){ m_pRecordset->Delete(adAffectCurrent); m_pRecordset->Close(); AfxMessageBox("删除成功"); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE);}至此,菜谱管理模块设计完成。
3.6付款方式设置模块设计付款方式设置模块如图11:图11付款方式模块对话框类的各成员函数的代码如下:CSetPaymodeDlg::CSetPaymodeDlg(CWnd*pParent/*=NULL*/) :CDialog(CSetPaymodeDlg::IDD,pParent){ //{{AFX_DATA_INIT(CSetPaymodeDlg) m_strPaymode=_T(""); //}}AFX_DATA_INIT}BOOLCSetPaymodeDlg::OnInitDialog()//对话框初始化{ CDialog::OnInitDialog(); m_bAdd=FALSE; m_bDel=FALSE; m_sInputPaymode.ShowWindow(SW_HIDE); m_editPaymode.ShowWindow(SW_HIDE); m_btnSure.ShowWindow(SW_HIDE); CStringsql; sql="SELECT*FROMPayModeInfo"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbPaymode.SetRefDataSource(NULL); m_dbPaymode.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbPaymode.SetColumnHeaders(1); m_dbPaymode.Refresh(); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCSetPaymodeDlg::OnPaymodeAddBtn()//单击按钮后,开始新增{ m_sInputPaymode.ShowWindow(SW_SHOW); m_editPaymode.ShowWindow(SW_SHOW); m_btnSure.ShowWindow(SW_SHOW); m_bAdd=TRUE; m_bDel=FALSE;}voidCSetPaymodeDlg::OnPaymodeDelBtn()//单击按钮后,开始删除{ m_sInputPaymode.ShowWindow(SW_SHOW); m_editPaymode.ShowWindow(SW_SHOW); m_btnSure.ShowWindow(SW_SHOW); m_bAdd=FALSE; m_bDel=TRUE;}voidCSetPaymodeDlg::OnOK()//确定添加或者删除{ UpdateData(TRUE); if(!m_strPaymode.IsEmpty()) { if(m_bAdd==TRUE) { CStringstr; BOOLflag=0; m_pRecordset->MoveFirst(); while(!m_pRecordset->adoEOF) { str=m_pRecordset->GetCollect("NAME").bstrVal; if(str.CompareNoCase(m_strPaymode)==0) { MessageBox("您输入的付款方式已存在","输入错误",MB_OK|MB_ICONWARNING); flag=1; break; } elsem_pRecordset->MoveNext(); } /* CStringsql; sql="SELECT*FROMPayModeInfoWHERENAME='"+m_strPaymode+"'"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset->GetRecordCount()==0) { MessageBox("您输入的付款方式已存在","输入错误",MB_OK|MB_ICONWARNING); flag=1; } */ if(flag==0) { m_pRecordset->MoveLast(); m_pRecordset->AddNew(); m_pRecordset->PutCollect("NAME",_variant_t(m_strPaymode)); m_pRecordset->Update(); m_dbPaymode.SetRefDataSource(NULL); m_dbPaymode.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbPaymode.SetColumnHeaders(1); m_dbPaymode.Refresh(); m_bAdd=FALSE; } } if(m_bDel==TRUE) { BOOLflag=0; UpdateData(TRUE); CStringstr; intnewid; /* m_pRecordset->MoveFirst(); while(!m_pRecordset->adoEOF) { str=m_pRecordset->GetCollect("NAME").bstrVal; if(str.CompareNoCase(m_strPaymode)==0) { flag=1; m_pRecordset->Delete(adAffectCurrent); m_pRecordset->Update(); break; } else m_pRecordset->MoveNext(); } */ CStringsql; sql="SELECT*FROMPayModeInfoWHERENAME='"+m_strPaymode+"'"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset->GetRecordCount()!=0) { flag=1; m_pRecordset->Delete(adAffectCurrent); m_pRecordset->Update(); m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open("SELECT*FROMPayModeInfo",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbPaymode.SetRefDataSource(NULL); m_dbPaymode.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbPaymode.SetColumnHeaders(1); m_dbPaymode.Refresh(); m_bDel=FALSE; } if(flag==0) { MessageBox("您输入的付款方式不存在,请查询后确认","输入错误",MB_OK|MB_ICONWARNING); } m_dbPaymode.Refresh(); m_bDel=FALSE; } m_editPaymode.SetWindowText(""); m_sInputPaymode.ShowWindow(SW_HIDE); m_editPaymode.ShowWindow(SW_HIDE); m_btnSure.ShowWindow(SW_HIDE); } else { AfxMessageBox("请输入付款方式"); }}至此,付款方式设置模块设计完成。
六、系统演示系统设计并编写完成后,编译运行程序,初始界面如图12所示:图121. 系统登录单击“登录”菜单,弹出登录界面,在登陆界面输入框中分别输入用户编号、用户名和密码,如图13所示。
如果用户名和密码都正确,那么就可以登陆系统,系统提示如图14所示。
图13图14如果用户名不存在或密码输入不正确,系统提示如图15和图16所示,将无法进入系统。
图15图16如果未登录就进行其他操作,系统提示如图17所示。
只有登录后才能操作其他功能。
单击“注册”菜单,弹出注册对话框如图18所示。
按要求填写完注册信息,如果注册名未被注册,并且前后两次输入的密码一致,那么系统给出如图19所示提示。
如果前后两次输入密码不一致,系统给出如图20所示提示,此时注册不成功。
图19图202.订餐操作系统登录后,单击“订餐”菜单,弹出“餐桌信息”对话框,如图21所示。
餐桌第一次订餐时,输入餐桌编号、食物编号、数量以及折扣,单击“点菜”按钮,在右侧点菜信息栏中列举了该餐桌所点的菜肴,如图22所示。
图21图22如果餐桌已经订过餐,但是还没有结账,则在餐桌编号输入框输入餐桌号,在点菜信息栏中显示该桌已点的菜。
单击“下单”按钮,即可把点菜信息记录下来。
3.结账操作单击“结账”菜单,弹出“结账单”对话框。
输入桌台号,自动显示对应的点菜信息以及消费金额。
选取付款方式和实收金额后,界面会自动显示找零金额,结果如图23所示。
图234.用户权限设置单击“管理”|“用户权限设置”,弹出“权限设置”对话框,如图24所示,所有用户的信息都显示在数据列表中。
输入要查询的用户编号和名称,单击“更改”,该用户的信息就显示在列表中,结果如图25所示。
图24图25选择权限,单击确定后,如图26所示,用户权限已被修改。
图26单击“显示全部”,结果如图27所示。
图275.菜谱管理单击“管理”|“菜谱设置”菜单,弹出“菜谱设置”对话框,如图28所示。
图28在“菜谱设置”对话框中可以对菜谱进行查找、添加、删除、修改等操作。
6.付款方式设置单击“管理”|“付款方式设置”菜单,弹出“付款方式”对话框,如图29所示。
单击“新增”或“删除”按钮,显示新增付款方式文本框和“确定”按钮,如图30所示。
图29图30在文本框中输入要增加/删除的付款方式,并单击“确定”按钮,将新增或删除所选择的付款方式。
7.注销用户单击“注销”菜单,弹出“注销询问”对话框如图31所示。
选择“确定”,注销成功,如图32所示。
图31图328.系统退出单击“退出系统”菜单,弹出“退出询问”对话框如图33所示。
选择“确定”,则系统退出。
图33至此,系统的全部功能已经演示完毕。
七、结束语经过两个多星期的时间,终于完成了本系统的设计。
虽然本系统有一些漏洞和不完善的地方,但是本系统结合餐饮管理的实际情况,基于数据库设计通用的模块,对餐饮管理的前台和后台操作进行功能模块的设计,实现了餐饮管理的基本功能。
在设计的过程中,遇到了很多的技术上的问题。
例如,第一次接触ADO数据库访问技术,对用ADO来连接数据库不是很了解,出现了很多的问题,设计受到了很大的阻碍。
经过向专业指导老师请教和参阅了有关书籍后,终于把一些问题解决了。
在本次设计中,我懂得了“书到用时方恨少”的道理,发现了自己在专业方面还有很多要提高的地方,在今后的学习中,我一定努力进步!参考文献:[1]萨师煊,王珊.数据库系统概论[M]第3版.北京:高等教育出版社,2000[2]侯其锋,李晓华,李莎.VisualC++数据库通用模块开发与系统移植.北京:清华大学出版社,2007致谢在这次课程设计中,戴小鹏老师给了我很大的帮助。
他对我的精心指导和关心,使我在设计的过程中受到了很大的启发。
特别是他的那份耐心和责任心,使我在今后的学习和工作中受益匪浅。
在此,特向戴小鹏老师表示衷心的感谢!
2023/9/21 22:43:02 1.21MB 餐厅管理系统
1
《数据库课程设计》由周爱武、汪海威、肖云编著,遵循数据库课程设计的具体要求,独立于具体的数据库教材,从实际应用系统的需求着手,引导读者逐步完成数据库设计全过程,重点讲解数据库系统的需求分析、概念设计、逻辑设计、物理设计和实施,并对每个案例都安排了大量常用的数据库访问操作,目的是让读者掌握数据库操作基本技能,加强动手实践能力,看得懂、学得会、用得上、记得牢。
2023/7/10 22:27:30 1.26MB 数据库 课程设计 选题系统
1
要求设计基于UML的银行活期储蓄管理系统,并且要包含需求分析、概念设计、逻辑设计、物理设计、数据库实现、应用系统开发等主要步骤及其内容。
设计结果不仅包含数据库内容的设计,还要有数据库之上应用系统界面及功能的设计与实现,最终完整的实现银行储蓄系统的软件功能。
2023/6/6 11:11:27 541KB Bank
1
1需求分析11.1编写目的11.2背景11.2.1电子商务的发展历史11.2.2乐购电子商城开发背景21.3定义21.4目标31.5需求分析31.5.1系统的功能描述31.5.2系统总体功能图41.5.3系统流程图61.5.4数据流图71.5.5实体与数据71.5.6联系与数据71.5.7数据字典82概念设计142.1实体图142.2多个实体间的联系图162.3总体ER图183逻辑设计193.1关系设计193.2关系优化203.3约束的说明223.4基本表234物理设计254.1确定数据库的存储结构254.2确定数据库的存取方法26
2023/5/30 20:19:41 606KB 数据库设计
1
1引言 31.1问题的提出 31.2任务与分析 32程序主要功能 42.1添加功能 42.2删除功能 42.3显示功能 42.4查找功能 42.5修改功能 43程序运行平台 54总体设计 55数据库设计说明 65.1需求分析 65.2数据库概念设计 75.3数据库物理设计 115.4数据库逻辑设计 136模块分析 186.1系统管理模块 186.2图书信息模块 216.3借阅信息模块 236.4读者信息模块 257系统测试 278小组分工 349参考文献 3410结论 341引言1.1问题的提出 图书管理系统是一个学校不可缺少的部分,它的内容对于学校的管理者和读者来说都至关重要,直接关系到图书的借用率,所以开发图书管理系统能够为管理员和读者提供充足的信息和快捷的查询手段。
编写程序系统主要实现图书馆的增加图书、查询图书、删除图书、借阅图书、还书;
增加借书证、查询借书证、删除借书证、借书信息、借书限制等智能化管理过程。
图书管理者只需略懂电脑知识就可以简易的操作该图书管理系统。
1.2任务与分析 本课题主要的目的是: 1.强化和巩固理论基础,掌握数据库编程的基本技巧;
2.要求用C/C++语言或其它语言及相应开发环境,实现一个小型完整程序的设计与开发;
3.巩固深化所学课程的知识,培养学生运用知识,分析和解决实际问题的能力。
系统概述: 1.图书管理:每种图书都有书名、书号(ISBN)、一名或多名作者(译者)、出版社、定价和内容简介。
图书信息登入、查询和维护。
2.借书证管理,包括申请、注销借书证,查询借书证持有人等。
借书证记录有借阅者的姓名、所在单位、职业等。
3.凭借书证借书,每次最多能借8本书。
借书期限最长为30天。
4.借还图书、资料的登记、超期处理,超期拒借等。
5.图书、资料查询,借、还图书和资料情况查询。
6.图书、资料借阅情况的统计分析,拒此作为图书馆图书、资料订够的依据之一。
设计要求: 1.进行需求分析,编写数据字典。
2.设计E-R图。
3.实现新进图书的数据录入。
4.实现对所有购进图书的分类查询和分类统计。
5.能够按书名、作者等分类查询现有图书的数量。
6.记录借阅者的个人资料和所借图书的书名、书号数据等。
2程序的主要功能2.1添加功能 添加一本图书的基本信息,包括书名、书号、名作者(译者)、出版社和图书简介。
添加图书借阅的基本信息,包括书号,借书证号,借书日期,应还书日期。
2.2删除功能 删除一本图书的基本信息,删除读者的基本信息,删除图书借阅基本信息。
2.3显示功能 显示所有图书信息,包括图书代码,图书名称,作者,出版社和简介。
显示所有借阅信息,包括读者号,图书号,借书日期,应还书日期。
2.4查找功能 图书信息查找,可以更具图书代码,图书名称,作者,出版日期和出版社进行查找。
读者信息查找,可更具读者姓名,读者编号,年龄,性别和所在系进行查找。
借阅信息查询,可更具图书编号和读者编号进行查询。
2.5修改功能 对图书和读者的信息进行修改。
3程序运行平台 VS2008(C#) SQLServer2005 WindowsXp(sp3)4系统总体框架图图4.1系统总体框架图5数据库设计说明5.1、需求分析1.1信息需求 在数据库Library中需要设计如下所示的数据字段和数据表: 图书信息表---dbo.libary,包括:图书编号、图书名称、作者、出版日期、出版社和简介。
借阅登记表---dbo.jy,包括:读者编号、图书编号、借书日期、应还书日期。
系统用户表---dbo.manage,包括:密码、用户名。
读者表----dbo.reader,包括:读者编号、读者姓名、性别、所在系、年龄。
1.2处理需求此数据库系统应用于图书馆的图书基本信息管理、读者信息管理、图书借阅管理等主要功能。
具体功能如下:1.2.1.基本信息管理一、图书信息 图书信息管理部分:主要包括图书信息的添加、修改、删除和查询。
此功能为图书的分类管理提供依据。
图书信息管理部分:主要包括图书基本信息的添加、修改、删除和查询。
退出系统。
二、读者信息 读者信息管理部分:主要包括读者信息的添加、修改、删除和查询。
此功能为读者信息管理提供依据。
读者管理部分:主要包括读者的基本信息的添加、修改、删除和查询。
退出系统。
三、借阅信息 借阅信息管理部分:主要包括借阅信息的添加、查询。
此功能为借阅信息管理提供依据。
读者管理部分:主要包括读者的
2023/5/17 17:02:08 3.38MB c#图书管理系统
1
混合动力汽车电驱动零碎的功能安全概念设计_王林.pdf
1
 针对游客游迹跟踪与追溯系统,本文深入分析了游客游迹不确定数据产生的原因,根据景区应用特点,提出了一种游客游迹RFID数据处理与清洗方法。
在数据处理时,引入事件概念,设计出了游客游迹RFID事件处理机制;
引入过滤器概念,给出了游客游迹数据的一种过滤模型,设计了游客游迹数据的去噪、平滑以及去冗余清洗算法。
最后,通过模仿场景的实验,对该算法的准确性和有效性进行了验证。
1
摘要 IABSTRACT II目录 IV1前言 11.1课题背景 11.1.1办公自动化概述 11.1.2中小企业办公模式的现状 21.2研究意义 31.3设计技术及开发环境 51.3.1设计技术 51.3.2开发环境 72可行性分析 92.1组织和管理可行性 92.2经济可行性 92.3技术可行性 93需求分析 113.1现行业务分析 113.1.1业务流程 113.1.2功能分析 113.2系统建模 133.2.1用户身份验证用例图 133.2.2个人通讯录用例图 133.2.3职工信息管理用例图 143.2.4日程安排用例图 143.2.5日志管理用例图 153.2.6短消息管理用例图 153.2.7公告管理用例图 163.2.8文件管理用例图 163.2.9会议管理用例图 174系统设计 184.1系统设计 184.1.1用户身份验证模块流程图 194.1.2个人通讯录模块流程图 194.1.3职工信息管理模块流程图 214.1.4日程安排模块流程图 224.1.5工作日志模块流程图 234.1.6短消息管理模块流程图 244.1.7文件管理模块流程图 254.1.8公告管理模块流程图 264.1.9会议管理模块流程图 274.2数据库设计 294.2.1数据库概念设计 294.2.2数据库逻辑设计 315系统实现 355.1系统架构 355.1.1系统架构图 355.1.2程序结构图 365.2持久层Hibernate实现 375.2.1创建并配置Hibernate映射文件 375.2.2开发并配置HibernateDAO层 385.3控制层Struts实现 385.3.1开发Struts核心流程代码 385.3.2开发JSP页面原型 405.3.3增加表单校验功能 405.3.4调用DAO组件操作数据库 415.4业务层Spring实现 415.4.1数据源配置 425.4.2配置SessionFactory 435.4.3配置事务 435.4.4配置DAO组件 435.4.5配置DAO事务 436系统测试 446.1测试计划 446.2测试用例 446.2.1对身份验证功能进行测试 446.2.2对职工信息管理功能进行测试 456.3测试结果 467系统开发总结 478结束语 48参考文献 49致谢 50附录 51A次要源程序 51B用户手册 55B.1系统功能简介 55B.2系统的支持平台 56B.3安装说明 56B.4使用说明 59B.5系统维护方法 72C软件光盘 73C.1光盘的树形目录 73C.2光盘文件一览表 73D科技译文 74JavaLearningPathprocess 74JAVA学习过程 81
2023/2/13 15:13:47 1.11MB OA系统 毕业 设计 论文
1
机票预订零碎数据库——需求分析-概念设计-逻辑设计-物理设计(含代码)【数据库课程设计作业】
2016/6/19 2:21:06 265KB SQL
1
共 30 条记录 首页 上一页 下一页 尾页
在日常工作中,钉钉打卡成了我生活中不可或缺的一部分。然而,有时候这个看似简单的任务却给我带来了不少烦恼。 每天早晚,我总是得牢记打开钉钉应用,点击"工作台",再找到"考勤打卡"进行签到。有时候因为工作忙碌,会忘记打卡,导致考勤异常,影响当月的工作评价。而且,由于我使用的是苹果手机,有时候系统更新后,钉钉的某些功能会出现异常,使得打卡变得更加麻烦。 另外,我的家人使用的是安卓手机,他们也经常抱怨钉钉打卡的繁琐。尤其是对于那些不太熟悉手机操作的长辈来说,每次打卡都是一次挑战。他们总是担心自己会操作失误,导致打卡失败。 为了解决这些烦恼,我开始思考是否可以通过编写一个全自动化脚本来实现钉钉打卡。经过一段时间的摸索和学习,我终于成功编写出了一个适用于苹果和安卓系统的钉钉打卡脚本。
2024-04-09 15:03 15KB 钉钉 钉钉打卡