ASP.NETMVC项目实战网页版音乐播放平台源码数据库为Oracle链接方式为ODAC前端框架为bootstrap
2024/5/21 20:44:44 128KB ASP.NET C# ORACLE Web
1
1.Oracle.Data.Access.Components.v6.80.0.47.FS.forD5-D2009为控件;
2.请参照“安装方法.txt”安装该控件,部分dpl包不是设计包,安装不上是正常现象;
3.程序例子.zip为程序例子;
4.如果程序例子跑不通,请参照《Oracle设置常识》设置服务器参数。
LuJun研究qq:393748124欢迎共同学习一起进步!
2023/10/29 15:31:31 6.45MB Delphi7 ODAC Oracle 免客户端
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
delphiodac控件直接連接數據庫,繞過BDE的中轉
2023/5/14 10:21:51 9.38MB delphi odac控件
1
LPC177x_8xCMSIS-CompliantStandardPeripheralFirmwareDriverLibraryRev1.17-12June2012ThisisthelistofexamplesthatsupportedinLPC177x_8xCMSISpackagePeripheralExampleDescriptionADCAdc_BurstShowshowtouseADCconversioninburstmodewithsingleormultipleinputAdc_DmaShowshowtouseADCconversionandtransferconverteddatabyusingDMAAdc_InterruptShowshowtouseADCconversionininterruptmode.Adc_PollingShowshowtouseADCconversioninpollingmode.BODBOD_DemoShowshowtouseBOD.CANCan_AflutShowshowtouseCANdriverfunctionsforsetupandchangeAFLUTtabledynamicallyCan_BypassShowshowtotestCANoperationbyusingbypassmodeCan_SelftestShowshowtotestCANself-testmodeCortex-M3Bit_BandingShowshowtouseBit-bandingfeatureofCortex-M3processor.MPUShowshowtouseMPUtoprotectmemoryregion.Privilege_ModeShowshowtochangeprivilegetounprivilegedmodeandviceversa.CRCCrc_DemoShowshowtouseCRCengineonLPC177x_8x.TheresultsarecalculatedbysomedifferentpolynomialsCrc_DmaShowshowtouseCRCenginewithDMAsupportDACDac_DmaShowshowtouseDMAtotransferdatatoDACperipheralDma_SineWaveShowshowtouseDACtogenerateasinewavesignalorpositive-halfsinewavesignalDMADma_Flash2RamShowhowtotransferdatafromFlashtoRa妹妹emorybyusingDMAengineEEPROMEeprom_DemohowtoworkwithEEPRO妹妹emoryonLPC177x_8xEMACEmac_EasyWebShowshowtoimplementansimplewebapplicationEmac_RawShowshowtotestEMACdriverwithrawpacketframeformatthatisnotrelatedwithanyupper-layer(i.e.TCP/IP...).Emac_uIPShowshowtohandleasinglenetworkinterfaceandcontainstheIP,ICMP,UDPandTCPprotocols.EMCEmc_NandFlashDemoShowshowtoworkwithNandFlash(ifavailable)byusingEMCcomponentofLPC177x_8xEmc_NorFlashDemoShowshowtoworkwithNorFlash(ifavailable)byusingEMCcomponentofLPC177x_8xEmc_SdramDemoShowshowtoworkwithSDRAM(ifavailable)byusingEMCcomponentofLPC177x_8xGPIOGpio_InterruptShowshowtouseinterruptfunctionofGPIOpins.Gpio_LedBlinkySetON/OFFfortheGPIOpinstodriveLEDsIAPIAP_DemoShowshowtoaccess/updateon-chipflashmemoryfromapplicationcodeI2CI2c_Pca9532DrvShowshowtouseI2CtodrivewithPCA9532andindicateviaLEDsthatconnectedtoPCAchipI2C_MasterShowshowtouseI2Cblockasamastertosend/receivedatato/fromaslave.I2C_SlaveShowshowtouseI2Cblockasaslavetosend/receivedatato/fromamaster.I2C_EEPROMShowshowtodriveEEPROMthroughI2C.I2SI2s_4WireShowshowtoconfigureI2Speripheraltorunin4wiremodeI2s_AudioShowshowtouseI2StotransferaudiodatathroughI2Spinstoplayashortmusicsoundandoutputtoheadphoneline.I2s_DmaShowshowtouseI2SwithDMAengineI2s_InterruptShowshowtouseI2StotransferdataininterruptmodeI2s_MclkShowshowtouseI2SmasterclockasI2SclocksourceLCDLcd_DemoShowshowtointeractwithGFT035A320240YLCDandQVGATFTLCD(ifit’savailable)MCIMci_CidCardShowshowtouseMultimediaCardInterface(MCI)onLPC177x_8xIC.Basicallyit’storeadCIDofthecardthatinputtothecardslot.MCI_ReadWriteShowshowtouseMCIonLPC177x_8xtoread/writedataonaSD/妹妹Ccard.MCI_FSShowshowtointegrateFatFSandEFSLopensourcetouseFATFileSystemonLPC177x_8x.MCPW妹妹CPWMSimpleShowshowtotestMotorControlPW妹妹oduleinLPC17xxNVICNvic_PrioritiesShowshowtoconfigureNVICprioritygroupingfortestingtheinterruptsintail-chainingandLate-arrivingmodeNvic_VectorTableRelocationShowshowtorelocationvectortableinanothersiteinRAMPWMPwm_DualEdgeShowshowtogeneratePWMsignalon3Channelsinbothedgemodeandsinglemode.Pwm_MatchInterruptShowshowtousePW妹妹atchfunctionininterruptmodePwm_SingleEdgeShowshowtousePWMsignalon6ChannelsinsingleedgemodePWRPwr_DeepPowerDownShowshowtoentersysteminDeepPowerDownmodeandwake-upbyusingRTC(Real-timeclock)interruptPwr_DeepSleepShowshowtoentersysteminDeepSleepmodeandwakeupitbyusingWDTInterruptPwr_PowerDownShowshowtoentersysteminPowerDownmodeandwake-upitbyusingNMI(Non-MaskableInterrupt)Pwr_SleepShowshowtoentersysteminsleepmodeandwake-upbyusingexternalinterruptQEIQei_VeloShowshowtouseQuadratureEncoderInterfacemoduletocalculatevelocityanddetectdirectionchangingRTCRtc_AlarmShowstheconfigurationstogenerateinterruptinSecondCounterIncrementInterrupt(1s)andgenerateAlarminterruptat10sRtc_CalibrationShowshowtodoreal-timeclockcalibration.Rtc_EvShowshowtodoeventmonitor/recorder.SSPSsp_DmaShowshowtoconfigureSSPperipheralwithDMAsupport.SSP_MasterShowshowtouseSSPblockasamastertosend/receivedatato/fromaslave.SSP_SlaveShowshowtouseSSPblockasaslavetosend/receivedatato/fromamaster.SSP_MicrowireShowshowtouseSSPperipheralwithMicroWireframeformat.SSP_TIShowshowtouseSSPperipheralwithTIframeformat.SYSTICKSystick_10msBaseShowshowtoconfigureSystemTicktimertogenerateinterrupteach10msSystck_StclkShowshowtoconfigureSystemTicktimeruseexternalclocksourceSTCLKTIMERTimer_CaptureShowshowtouseCaptureTimerfunction.Timer_FreqMeasureShowshowtouseTimertomeasurethefrequencyofthesignalinputTimer_MatchInterruptShowshowtoconfiguretheTimertogenerateMatchinterrupt.UARTUart_AutobaudThisisasimpleUARTexampleusingautobaudratemodeUart_DmaShowshowtouseUARTinDMAmodeUart_FullModemThisisasimpleUARTexampleusingUART1willFullmode妹妹odeUart_HWFlowControlShowshowtouseUARTinhardwareflowcontrolmode.Uart_InterruptShowshowtouseUARTininterruptmodeUart_IrDAReceiveShowshowtoconfigureUARTforreceivingdataviaIrDAprotocolUart_IrDATransmitShowshowtoconfigureUARTfortransmittingdataviaIrDAprotocolUart_PollingShowshowtouseUARTinpollingmodeUart_Rs485MasterShowshowtoconfigureUARTforRS485functionalityinMastermode.Uart_Rs485SlaveShowshowtoconfigureUARTforRS485functionalityinSlavemode.USBDEVUSBMassStorageShowshowtoimplementasimpleUSBMassStorageapplicationonLPC177x_8x.USB_AudioShowshowtoimplementUSBspeakeronLPCD177x_8x.USB_HIDShowshowtoimplementHIDdeviceonLPCD177x_8x.Usb_VirtualComShowshowtoconfigureUSBDeviceofasavirtualCOMport.USBHostLiteUsbHost_MassStorageShowshowtoconfigureUSBHostControlleronLPC177x_8x.WDTWdt_InterruptShowshowtouseWDTtogenerateinterruptafteraspecifictime.Wdt_ResetShowshowtouseWDTtogeneratechipresetafteraspecifictime.Wdt_WindowModeTesttheoperationofWindowModeofWindowWatchdogTimeronLPC177x_8x
2023/3/12 4:45:20 58.32MB LPC177x LPC178x CMSIS driver
1
由于集群资源有限,可能多个应⽤用同时使⽤用Hadoop集群,防⽌止系统资源被单个应⽤用占⽤用过多影响整体集群使⽤用情况,引⼊入资源池管理理集群资源。
unde允许未声明的池OYARN(MR2Included)(服务范围)cyarnschedulerfair.allow-undeclaredpools默认情况下,"A|owUndeclaredpools"可选项是选中的,需要关闭。
否则如果用户指定一个尚未声明的资源池时,比如prod,YARN将会自动生成一个prod资源池。
配置文件修改后需要重新启动YARN服务,重新部署客户端配置。
6.配置“若用户提交任务不指定特定的queue,就使用default资源池”FairScheduerUserAsDefaultQueue使用默认队列时的FairSchedulerOResourceManagerDefaultGroupC当设置为true时,如果未指定池名称,Fair用户Scheduler将会使用用户名作为默认的池名yarnscheduler.fairuser-as-default尔当没为1s时,所有应用程序都在名为default的共享池中运行7.进去动态资源池配置页面clouderamanager群集核图表·倍份●ARN(MR2Include大数据分听平台t50状态宴例配置命令应用程序HHBase主机SHDFS报告利用率报告切换至经奥规划角iHueVImpalaYARN应用栏予v范图bOozemale个查询YAHN(MR2Inclirlen)见围)ksey当论置为te时.如果未指动态资源池配置Scheduler将会使用用户名作为Gateway会SEark2称。
当设置为fdse时,所有应月ucbhlistorySever静态服务池温YARN(MR2Inclut个名为defaut的其享池中运行v类别ClouderaManagementService每页c|ouderaMANAGER群集够断·审楼图表理文持·admn边态资潺池配置(大数分平台)YARNImpalaAdmission(antro源池计划模式放置规贝阳广限制可以嵌,它的每一个级别都可以支持不同的计划程序,如日FC或Farscheduler。
每个池都可以配置为仅允许某些用户和组集访问该池已为3个正在运行的NedeMenacer总共配置72个vcre640当宇节内存。
直看动态责源池钛添创建资需也默认设置访间控制没置最小资源数最大资数虚内板虚拟内核正在运行的应用程序最大量计划策略1500%150.%7.1资源池(资源分配界面)。
主要配置项权重(%):动态权重,资源不是静态的,去其他池相关的资源共享最大最小CPU、内存正在运行的应用程序最大数量●计划策略创建资源池,资源池名称为deV创建资源池资源池名称d口父池Resourcelimits计划策略抢占提交访问控制管理访问控制4与其他池相关的资源共享资源数虚拟内核吉字节:内存Theminumnumberofvirtualcoresandmemoryavailabletothispool.Thistakespriorityovertheweightbasedshare(optional)最大资源数虚拟内核吉字:内存Themaximunnumberofvirtualcoresandmemoryavailabletothispool.Thistakespriorityovertheweightbasedshare(optional)正在运行的应用程序最大池中同时运行的应用程序数量限制。
数量取消创建7.2配置计划策略(对dev资源池控制)编辑资源池ResourceLimits计划策略抢占提交访问控制管理访问控制DRF:Dominantresourcefairness。
根据c門U和内存公平调度资源。
(建议)○FAR仅根据内存公平调度资源FIFC:拥有子池的池不能是FFO。
取消保存7.3提交访问控制(对dev资源池控制)编辑资源池Resourcelimits计划策略抢占提交访问控制管理访问控制此功能仅在“启用ResourceManagerACL"设置为te且“管理ACL"未设置为*时相关。
(请参见顶级页面中的“访问控制设置"。
)Fairscheduler访问控制列表可以控制向池提交应用程序的用户。
对于子池,有杈限提交父池旳用户自动继承子池的相同功能。
○允许任何用尸向该池提交允许这些用户和组向该池提交用户组bi_dev,bi_dev_vipl取消保存7.4管理访问控制(对dev资源池控制)编辑资源池Resourcelimits计划策略抢占提交访问控制管理访问控制此功能仅在"启用ResourceManagerACL"设置为true且“管理ACL未设置为*时相关。
(请参见顶级页面中的"访问控制设置"。
)FairScheduler访问控制列表可以控制可以管理池的用户。
对于子池,有权限管理父池的用户自动继承子池的相同功能○允许任何用户管理该池⊙允许这些用户和组管理该池用户arm组bi_cev,bi_dev_vip保存7.5验证资源池访问控制●新建o用户:yan.yo用户组:Wms为该用户初始化wordcount数据,具体操作见步骤3在执行hadoop命令內加入资源池控制,如下图yan.yhi-bca?-ue-201-]sgroups新的用户组Lyan.jyabi-bcao-ue-001*]5hadoopjar/usr/local/cloud0:56:08INFOinputFileInputFormatTotalinpt18/03/0810:56:08INFDmapreduceJobSubmitter:nuberofsplits8/03/0810:56:09INFOmapreduce,JobSubmitter:Submittingtokensforjob:job_152041指定资源池dev9c23.8/03/0810:56:09INFDmapreduce.Jobsubmitter:Cleaningupthestagingarea/user/ya18/03/0810:56:09WARNsecurity.UserGroupInformation:PriviledgedActionExceptionasauth:SIMPLE)couse:javcioICException:org.apache,hadoop,yarn.exceptions.YarnExceptiFatledtosbitapplication1520413797733_0023tDYARNnstoqueuerootcevvotoIDExceticn:org.apachehadoopyarn.exceptions.YarnExceptian:Failedtosubmitapplication_1520413797733-0023toYARN:UseryanJycamotsubmitapplicaticnstoqueueroanner.java:300)atjavasecurityAccesscontroller.doPrivleged(NativeMethod)tiondoAs(UserGroupInfonmaticnjava:1920)Cob,java:1325)atsunreflectNativeMethodAccessorIpLinvoke(NativeNethodAccessorImpLjava:bZnreflect.DelegatingMethodAccesJava,lcngrefLectanDescription.invoke(ProgramDriver71)Java:74)utsun,I'eeLLNutive:Lhu.Imul,niwuAee(NuLiveveceexyodecessorImpl.java:43)atsunreflectNativeMethodAccesso-ImpLivoke(NativeNetatorg.apache,hadoop,util.RunJar,matnCRunar.java:136Causedby:org.apachehadoopyorn.exceptions.YarnException:Failedtosubmitapplication-1520413797733_0023toYARN:UseryariycarnotsubnitapplicationstoqueLeroot.devatorg.apache,hadoopyarn.clientapiimol,YarndlientInpl,subcation(YarnCLientImpL,java:2570saurccMgrDelcgate.java:290)atorg.apache,hadoopmapredYARNRunnersubritJob(YARNRunne8.计划模式(资源池配置集)可以根据不同时段使用不同的资源池配置。
动态资源池配置(大数据分析平台YaRNMalaArm?Control池计划模式故置规则用广制要确定特定设置问时应处于活动状态,请指定计划规则及规则的评估顷序创速计划则重新持列十划模式顾序每天重复,从早上8点0O分到晚上1点0C分CSD,从2018-02-07开。
2每天重复,从凌属12点00分到早上8点0C分CsT,从20180307开ETLIE编|3在所有其他规则不活用时运行配置了计划模式,资源池会有多套配置,如下图clouderamanager·主机,·审孩图,备份·管理适持warm动态资源池配置(大数据分析平台)YARNImpalaAdmissionControl资源池计划横式款置规则用户限制池可以嵌,它的郎一个级别都可以支排不同的计划程序,如FFO或Farscheduler。
都个池都可以配置为允许某些用户和组集法间该池已为3个正在运行的NodeManager总共配置72个Vcore和640吉字节内存,直看动态资源池状态创建资歇认设置访问控制设置配置集ET时段default资源数最大资原数月户活跃时段名称虛拟内核内存正在运仁的立月程序最大数量计划筑暗ETL时段users116%wonhigh-bl4667计划规则主要控制配置有效时间段,创建计划规则如下图创建计划规则配置集◎新建用户活跃时段default可以将此配置集配置为包含不同的每泡CPU和内存设置。
○使用现有项重复每天全天介于早上8点00分CST:晚上11点0分CsT取消创建9.放置规则主要作用:控制任务(Job、Task)使用资源池规则,即任务会根据以下规则放到对应资源池执行。
clouderaMANAGeR:主机,说图表·音份理搜索dmin动念资源池配置(大数据分析平台)ARNImpalaAdmissionConrol负源池计划模式故置规则用产限制配置YARN如呵确定将在哪个池中运行应月程序创键放置规‖重新列放置观则放规则仅想已在适得时走存在时使用该池编相2仪当root.users.username存在司使用该消编辐|3使用rootdefault此规始终满正。
不会使用后续现则。
10.用户限制主要作用:控制单个用户最大应用程序并发度。
动态资源池配置(大数分析平台)YARNImpalaAdmissionControl密源浊计划模式放置规Q用户见制用户可以同时捉交的最大应用程序数量创建用广阳制默认设置止在行的应用序量大数量操作bide1编辑|动态资源池到这里基本配置完成。
具体配置方案,要根据项目实际情况。
建议:保证默认资源池可以使用,不影响正常使用的情况下配置动态资源池。
2020/1/16 2:18:11 1.67MB cdh 动态资源池 hadoop spark
1
由于集群资源有限,可能多个应⽤用同时使⽤用Hadoop集群,防⽌止系统资源被单个应⽤用占⽤用过多影响整体集群使⽤用情况,引⼊入资源池管理理集群资源。
unde允许未声明的池OYARN(MR2Included)(服务范围)cyarnschedulerfair.allow-undeclaredpools默认情况下,"A|owUndeclaredpools"可选项是选中的,需要关闭。
否则如果用户指定一个尚未声明的资源池时,比如prod,YARN将会自动生成一个prod资源池。
配置文件修改后需要重新启动YARN服务,重新部署客户端配置。
6.配置“若用户提交任务不指定特定的queue,就使用default资源池”FairScheduerUserAsDefaultQueue使用默认队列时的FairSchedulerOResourceManagerDefaultGroupC当设置为true时,如果未指定池名称,Fair用户Scheduler将会使用用户名作为默认的池名yarnscheduler.fairuser-as-default尔当没为1s时,所有应用程序都在名为default的共享池中运行7.进去动态资源池配置页面clouderamanager群集核图表·倍份●ARN(MR2Include大数据分听平台t50状态宴例配置命令应用程序HHBase主机SHDFS报告利用率报告切换至经奥规划角iHueVImpalaYARN应用栏予v范图bOozemale个查询YAHN(MR2Inclirlen)见围)ksey当论置为te时.如果未指动态资源池配置Scheduler将会使用用户名作为Gateway会SEark2称。
当设置为fdse时,所有应月ucbhlistorySever静态服务池温YARN(MR2Inclut个名为defaut的其享池中运行v类别ClouderaManagementService每页c|ouderaMANAGER群集够断·审楼图表理文持·admn边态资潺池配置(大数分平台)YARNImpalaAdmission(antro源池计划模式放置规贝阳广限制可以嵌,它的每一个级别都可以支持不同的计划程序,如日FC或Farscheduler。
每个池都可以配置为仅允许某些用户和组集访问该池已为3个正在运行的NedeMenacer总共配置72个vcre640当宇节内存。
直看动态责源池钛添创建资需也默认设置访间控制没置最小资源数最大资数虚内板虚拟内核正在运行的应用程序最大量计划策略1500%150.%7.1资源池(资源分配界面)。
主要配置项权重(%):动态权重,资源不是静态的,去其他池相关的资源共享最大最小CPU、内存正在运行的应用程序最大数量●计划策略创建资源池,资源池名称为deV创建资源池资源池名称d口父池Resourcelimits计划策略抢占提交访问控制管理访问控制4与其他池相关的资源共享资源数虚拟内核吉字节:内存Theminumnumberofvirtualcoresandmemoryavailabletothispool.Thistakespriorityovertheweightbasedshare(optional)最大资源数虚拟内核吉字:内存Themaximunnumberofvirtualcoresandmemoryavailabletothispool.Thistakespriorityovertheweightbasedshare(optional)正在运行的应用程序最大池中同时运行的应用程序数量限制。
数量取消创建7.2配置计划策略(对dev资源池控制)编辑资源池ResourceLimits计划策略抢占提交访问控制管理访问控制DRF:Dominantresourcefairness。
根据c門U和内存公平调度资源。
(建议)○FAR仅根据内存公平调度资源FIFC:拥有子池的池不能是FFO。
取消保存7.3提交访问控制(对dev资源池控制)编辑资源池Resourcelimits计划策略抢占提交访问控制管理访问控制此功能仅在“启用ResourceManagerACL"设置为te且“管理ACL"未设置为*时相关。
(请参见顶级页面中的“访问控制设置"。
)Fairscheduler访问控制列表可以控制向池提交应用程序的用户。
对于子池,有杈限提交父池旳用户自动继承子池的相同功能。
○允许任何用尸向该池提交允许这些用户和组向该池提交用户组bi_dev,bi_dev_vipl取消保存7.4管理访问控制(对dev资源池控制)编辑资源池Resourcelimits计划策略抢占提交访问控制管理访问控制此功能仅在"启用ResourceManagerACL"设置为true且“管理ACL未设置为*时相关。
(请参见顶级页面中的"访问控制设置"。
)FairScheduler访问控制列表可以控制可以管理池的用户。
对于子池,有权限管理父池的用户自动继承子池的相同功能○允许任何用户管理该池⊙允许这些用户和组管理该池用户arm组bi_cev,bi_dev_vip保存7.5验证资源池访问控制●新建o用户:yan.yo用户组:Wms为该用户初始化wordcount数据,具体操作见步骤3在执行hadoop命令內加入资源池控制,如下图yan.yhi-bca?-ue-201-]sgroups新的用户组Lyan.jyabi-bcao-ue-001*]5hadoopjar/usr/local/cloud0:56:08INFOinputFileInputFormatTotalinpt18/03/0810:56:08INFDmapreduceJobSubmitter:nuberofsplits8/03/0810:56:09INFOmapreduce,JobSubmitter:Submittingtokensforjob:job_152041指定资源池dev9c23.8/03/0810:56:09INFDmapreduce.Jobsubmitter:Cleaningupthestagingarea/user/ya18/03/0810:56:09WARNsecurity.UserGroupInformation:PriviledgedActionExceptionasauth:SIMPLE)couse:javcioICException:org.apache,hadoop,yarn.exceptions.YarnExceptiFatledtosbitapplication1520413797733_0023tDYARNnstoqueuerootcevvotoIDExceticn:org.apachehadoopyarn.exceptions.YarnExceptian:Failedtosubmitapplication_1520413797733-0023toYARN:UseryanJycamotsubmitapplicaticnstoqueueroanner.java:300)atjavasecurityAccesscontroller.doPrivleged(NativeMethod)tiondoAs(UserGroupInfonmaticnjava:1920)Cob,java:1325)atsunreflectNativeMethodAccessorIpLinvoke(NativeNethodAccessorImpLjava:bZnreflect.DelegatingMethodAccesJava,lcngrefLectanDescription.invoke(ProgramDriver71)Java:74)utsun,I'eeLLNutive:Lhu.Imul,niwuAee(NuLiveveceexyodecessorImpl.java:43)atsunreflectNativeMethodAccesso-ImpLivoke(NativeNetatorg.apache,hadoop,util.RunJar,matnCRunar.java:136Causedby:org.apachehadoopyorn.exceptions.YarnException:Failedtosubmitapplication-1520413797733_0023toYARN:UseryariycarnotsubnitapplicationstoqueLeroot.devatorg.apache,hadoopyarn.clientapiimol,YarndlientInpl,subcation(YarnCLientImpL,java:2570saurccMgrDelcgate.java:290)atorg.apache,hadoopmapredYARNRunnersubritJob(YARNRunne8.计划模式(资源池配置集)可以根据不同时段使用不同的资源池配置。
动态资源池配置(大数据分析平台YaRNMalaArm?Control池计划模式故置规则用广制要确定特定设置问时应处于活动状态,请指定计划规则及规则的评估顷序创速计划则重新持列十划模式顾序每天重复,从早上8点0O分到晚上1点0C分CSD,从2018-02-07开。
2每天重复,从凌属12点00分到早上8点0C分CsT,从20180307开ETLIE编|3在所有其他规则不活用时运行配置了计划模式,资源池会有多套配置,如下图clouderamanager·主机,·审孩图,备份·管理适持warm动态资源池配置(大数据分析平台)YARNImpalaAdmissionControl资源池计划横式款置规则用户限制池可以嵌,它的郎一个级别都可以支排不同的计划程序,如FFO或Farscheduler。
都个池都可以配置为允许某些用户和组集法间该池已为3个正在运行的NodeManager总共配置72个Vcore和640吉字节内存,直看动态资源池状态创建资歇认设置访问控制设置配置集ET时段default资源数最大资原数月户活跃时段名称虛拟内核内存正在运仁的立月程序最大数量计划筑暗ETL时段users116%wonhigh-bl4667计划规则主要控制配置有效时间段,创建计划规则如下图创建计划规则配置集◎新建用户活跃时段default可以将此配置集配置为包含不同的每泡CPU和内存设置。
○使用现有项重复每天全天介于早上8点00分CST:晚上11点0分CsT取消创建9.放置规则主要作用:控制任务(Job、Task)使用资源池规则,即任务会根据以下规则放到对应资源池执行。
clouderaMANAGeR:主机,说图表·音份理搜索dmin动念资源池配置(大数据分析平台)ARNImpalaAdmissionConrol负源池计划模式故置规则用产限制配置YARN如呵确定将在哪个池中运行应月程序创键放置规‖重新列放置观则放规则仅想已在适得时走存在时使用该池编相2仪当root.users.username存在司使用该消编辐|3使用rootdefault此规始终满正。
不会使用后续现则。
10.用户限制主要作用:控制单个用户最大应用程序并发度。
动态资源池配置(大数分析平台)YARNImpalaAdmissionControl密源浊计划模式放置规Q用户见制用户可以同时捉交的最大应用程序数量创建用广阳制默认设置止在行的应用序量大数量操作bide1编辑|动态资源池到这里基本配置完成。
具体配置方案,要根据项目实际情况。
建议:保证默认资源池可以使用,不影响正常使用的情况下配置动态资源池。
2015/7/3 7:11:31 1.67MB cdh 动态资源池 hadoop spark
1
ODAC免安装客户端衔接oracle。
可以直接TCP/IP衔接ORCALE。
2017/4/26 5:41:41 11.87MB ODAC ORCALE
1
asp旧事发布系统asp数据库实现旧事发布系统access+asp实现旧事发布系统index.aspnews_add.aspnews_del.aspnews_modact.asp
2019/10/8 2:14:40 38KB asp 新闻发布系统
1
odac9.4.14professionalRetailfordelphi7bpl版,正式版,非试用版
2022/9/3 3:57:33 3.95MB odac 9.4 d7
1
共 11 条记录 首页 上一页 下一页 尾页
在日常工作中,钉钉打卡成了我生活中不可或缺的一部分。然而,有时候这个看似简单的任务却给我带来了不少烦恼。 每天早晚,我总是得牢记打开钉钉应用,点击"工作台",再找到"考勤打卡"进行签到。有时候因为工作忙碌,会忘记打卡,导致考勤异常,影响当月的工作评价。而且,由于我使用的是苹果手机,有时候系统更新后,钉钉的某些功能会出现异常,使得打卡变得更加麻烦。 另外,我的家人使用的是安卓手机,他们也经常抱怨钉钉打卡的繁琐。尤其是对于那些不太熟悉手机操作的长辈来说,每次打卡都是一次挑战。他们总是担心自己会操作失误,导致打卡失败。 为了解决这些烦恼,我开始思考是否可以通过编写一个全自动化脚本来实现钉钉打卡。经过一段时间的摸索和学习,我终于成功编写出了一个适用于苹果和安卓系统的钉钉打卡脚本。
2024-04-09 15:03 15KB 钉钉 钉钉打卡