酒店管理系统的设计与实现Word格式文档下载.docx
《酒店管理系统的设计与实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《酒店管理系统的设计与实现Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
![酒店管理系统的设计与实现Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-12/15/491db979-f533-49f4-a97e-637eb8223a58/491db979-f533-49f4-a97e-637eb8223a581.gif)
根据系统功能的要求,考虑到VisualC++的编程特点,将酒店
管理系统分解成前台和后台两部分,并将系统分解为几个比较小
的功能模块分别进行开发。
使得开发过程更具条理性,并且方便
对模块功能进行修改或添加新的功能模块,从而使整个系统能够
随着酒店业务的扩展进行功能的升级。
为了增强系统的安全性,
需要设计登录模块,登录成功后才可以使用全部功能.整个酒店管
理系统的设计方案如图2所示。
图1软件系统结构
图2系统设计方案
摘要:
本文主要介绍了利用VisualC++开发的酒店管理系统。
随着软件开发技术和数据库技术的完善与发展,国内外的企业已经开
始充分利用各种各样的系统管理软件来管理诸如销售信息、产品信息、员工信息等大量日趋繁杂的资料,计算机辅助管理的高效性和高
安全性等优点使得传统的管理方式黯然失色,也为系统管理软件的发展提供了更广阔的前景和发展空间。
本系统设计的主要目标是设计
一个面向中小型酒店的简单易用的酒店管理系统。
前台以VisualC++为开发工具,设计软件的界面和各个功能模块;
后台使用SQL
Server2000进行系统数据库的连接和管理。
本系统已基本实现了中小型酒店常用的点菜、订菜、结算等功能,帮助酒店建立了菜谱数据库
和销售存根数据库,可以方便地进行查询,并在系统的易用性和安全性两方面进行了相应的完善。
关键词:
VisualC++;
安全性;
数据库
中图分类号:
TP315文献标识码:
A文章编号:
1009-3044(2007)19-40023-03
TheDesignmentandImplementationofRestaurantManagementSystem
GANChao-Song1,XIARong2
(1.SchoolofComputing,JiangxiCityVocationalInstitute,Nanchang330004,China;
2.ScienceandTechnologyCollegeofNCHU,Nanchang
330034,China)
Abstract:
ThispapermainlyintroducesthemanagementsystemofrestaurantdevelopedwithMicrosoftVisualC++.Withthedevelopment
ofsoftwareanddatabasetechnology,thedomesticcorporationsandtheoverseacorporationsalreadybegintomakefulluseofallkindsofsystem
managementsoftwaretomanagelotsofinteriorthings,suchasvenditioninformation、productioninformation、employeeinformationandsoon.
Computer-aidedmanagementhaslotsofmeritscomparedwithtraditionalmanagementmode,suchashighefficiencyandhighsecurity.Italso
suppliesmorewideforegroundanddevelopingspaceforthedevelopmentofsystemmanagementsoftware.Themainaimofthissystemistodesign
aeasily-usingmanagementsystemofrestaurantforpettyrestaurant.FrontendusesVisualC++asdevelopingtool,designsmaininterface
andfunctionmodules;
backgrounduseSQLServer2000forconnectingandmanagingsystemdatabase.Thissystembasiclyactualizedfunctions
incommonuseoforderdishes、prearrangement、settleaccountsforpettyrestaurant,andhelprestauranttosetupdatabaseofbillsoffareandvendition
information.Theycanexpedientlybequeryedandstrengthentheeasily-usingandsecurityofsystem.
Keywords:
VisualC++;
security;
database
23
4设计要点与注意事项
4.1设计要点
图形化界面尽量做到美观简洁;
充分考虑到系统的安全性;
通过使用map类快速保存和检索数据集结果;
通过使用数据绑定技术优化代码。
4.2注意事项
系统运行前数据库要进行正确配置;
算法应简单明了,有较高的时空效率;
注意学习使用数据绑定等新技术;
设计登录模块时注意增强安全性。
5关键技术
5.1数据库的连接
将SQLServer默认的数据库设置为酒店管理系统所在的
RMS后,就可以在程序中使用DSN来访问SQLServer数据库了。
CRMSDlg:
:
OnInitDialog()中连接数据库部分的代码如下:
try{m_DBCnt.CreateInstance(_uuidof(Connection));
m_DBCnt->
ConnectionString="
DSN=RMS;
UID=fdd;
PWD=
121"
;
m_DBCnt->
Open("
"
"
-1);
}catch(_com_error&
e)
{AfxMessageBox(e.ErrorMessage());
this->
EndDialog(0);
}
returnTRUE;
其中DSN=后面即为酒店管理系统所用的数据库的名称,可
根据实际情况进行更改。
5.2菜谱管理模块
菜谱对话框的设计采用一个列表框控件显示读取的数据记
录,并在CDlgViewCP:
OnInitDialog()中对这个控件(m_list)进行初
始化(分割列,设置列宽,设置风格等),其中m_list.SetExtendedStyle
(LVS_EX_FULLROWSELECT);
这一行代码使单击列表框时选中其
中的一整行,而不是其中的某一格。
在单击并选中某一行的时候,
程序处理这个单击事件,并将这一行的数据在下面的列表框中显
示出来,利用函数CDlgViewCP:
OnClickListCp来实现这一点:
inti=m_list.GetSelectionMark();
m_no=m_list.GetItemText(i,0);
m_name=m_list.GetItemText(i,1);
m_kind=m_list.GetItemText(i,2);
m_price=(float)atof(m_list.GetItemText(i,3));
m_detail=m_list.GetItemText(i,4);
UpdateData(FALSE);
*pResult=0;
另外在菜谱管理模块中还要同时实现菜谱查询功能,即由用
户选择查询目标(编号,菜名,种类),再填入所要查询的内容就可在
菜谱中查询到符合条件的菜。
如果没有输入任何查询条件,那么
就列出菜谱中所有的菜。
voidCDlgViewCP:
RefreshData(LPCTSTRqry)
{m_list.DeleteAllItems();
m_list.SetRedraw(FALSE);
_RecordsetPtrpRst=NULL;
IADORecordBinding*picRs=NULL;
//InterfacePointerdeclared.(
VC++Extensions)
CCPRsrs;
try{_bstr_tstrSQL=qry;
TESTHR(pRst.CreateInstance(_uuidof(Recordset)));
pRst=m_DBCnt->
Execute(strSQL,NULL,adCmdText);
//数据绑定(DataBinding)
TESTHR(pRst->
QueryInterface(_uuidof(IADORecordBinding),
(LPVOID*)&
picRs));
TESTHR(picRs->
BindToRecordset(&
rs));
inti=0;
charbuf[128];
while(!
pRst->
adoEOF)
{m_list.InsertItem(0,rs.m_sz_no);
m_list.SetItemText(i,1,rs.m_sz_name);
m_list.SetItemText(i,2,rs.m_sz_kind);
sprintf(buf,"
%f"
rs.m_f_price);
m_list.SetItemText(i,3,buf);
m_list.SetItemText(i,4,rs.m_sz_detail);
//移到下一条记录
pRst->
MoveNext();
picRs->
Release();
Close();
catch(_com_error&
m_list.SetRedraw(TRUE);
return;
在上面的这段RefreshData函数的代码中,由于使用了ADO
2.0forVisualC++Extensions所提供的新特性DataBinding(数据
绑定)技术,所以代码显得比较简洁。
5.3登录管理模块
在未登录的时候,主对话框中的按钮,除了登录,退出,帮助,
关于等项,全是不可用的。
为了达到这一效果,在CRMSDlg:
OnInitDialog()中加入如下代码:
GetDlgItem(IDC_BTN_UPDPWD)->
EnableWindow(FALSE);
GetDlgItem(IDC_BTN_DC)->
GetDlgItem(IDC_BTN_JS)->
GetDlgItem(IDC_BTN_CP)->
GetDlgItem(IDC_BTN_VIEWDC)->
若登录成功后,只需将FALSE换成TRUE,则所有按钮都变
为可用。
将进行登录验证的SQL代码加入到主对话框的事件处理
函数CRMSDlg:
OnBtnLogin()中,用来处理登录事务:
sql_.Format("
SELECT值班员FROMZBYWHERE值班员=
'
%s'
AND密码='
dlg.m_name,dlg.m_pswd);
这里并没有取出值班员表中的所有字段(值班员和密码),然
后把密码字段和用户的输入作比较来决定登录成功与否;
而是只
取出了值班员名字(值班员),密码的校验放在数据库服务器端进
行,这主要是基于安全的考虑。
如果没有确实的需要,就尽量不从
数据库里取用户密码这种敏感数据,以免产生安全漏洞,削弱系
统的安全性。
修改密码部分的处理代码和登录部分类似,只是不但要进行
旧密码的验证,还要确认两次输入的新密码一致,如旧密码错误
或两次输入的新密码不一致则需要给出相应的提示。
另外还要利
用SQL语句向数据库中写入新密码:
sql_.Format("
UpdateZBY
SET密码='
%s'
WHERE值班员='
dlg.m_newpswd,dlg.
m_name);
密码修改成功后则给出密码已修改成功的提示。
5.4点菜模块
在这个模块里可以根据顾客的需要逐项输入菜谱中的菜肴,
并可对已经做出的选择进行删除和修改。
待最终决定之后单击提
交按钮就会将结果保存到数据库中。
点菜订菜操作首先要在桌号
编辑框中输入桌号,然后在编号选择框中通过选择菜谱中的编号
来选择菜肴。
这样顾客只需说出所需菜肴在菜谱上的编号,值班
员就可以很快地找到顾客所需要的菜,而不必让顾客报出菜名,
提高服务效率,降低出错率。
为了使编号选择框中包含所有的菜
谱号,在CDlgDC:
OnInitDialog()中应包含如下代码:
try
{_bstr_tstrSQL("
SELECT*FROMCP"
);
cpmap.clear();
//清空cpmap
{m_nos.AddString(rs.m_sz_no);
//向cpmap中添加一个[菜谱号-菜名]映射
cpmap.insert(CPMap:
value_type(string(rs.m_sz_no),string(rs.
24
m_sz_name)));
上面代码中的cpmap变量用于保存一组[菜谱号-菜名]的映
射,这样在用户选中某一个菜谱编号是能迅速的由编号找到对应
的菜,而不用去读取数据库.值班员在编号选择框中选中一个编号
的事件为CBN_CLOSEUP,这个事件的处理函数为
CDlgDC:
OnCloseupComboDcnos():
voidCDlgDC:
OnCloseupComboDcnos()
{charbuf[128];
m_nos.GetWindowText(buf,128);
CPMap:
const_iteratorit=cpmap.find(string(buf));
if(it!
=cpmap.end())
{stringname=(*it).second;
GetDlgItem(IDC_EDIT_DCNAME)->
SetWindowText(name.data());
}}
cpmap的定义在DlgDC.cpp的开头:
#pragmawarning(disable:
4786)
4503)
#include<
map>
string>
usingnamespacestd;
typedefmap<
string,string>
CPMap;
CPMapcpmap;
这里定义的CPMap类建立了一个从字符串到字符串的映
射,就是从map和string模板类来的,CPMap是一个STL(Standard
TemplateLibrary)类,而cpmap则是CPMap型的全局变量。
另外由
于使用了模板,会在类的内部产生相当长的类型名,从而在编译
时出现C4787警告,提示指示类型名长度超过255个字符,所以
用“#pragmawarning(disable:
4786)”来关掉这个警告。
值班员在订餐模块中修改、删除和增加菜肴都不会对数据库
作修改,而是先在列表框控件m_list中进行这些操作。
只有在单
击提交按钮之后,才会向数据库中提交数据。
每向数据库中加入
一条,就会自动清除列表框中相应的输入。
全部添加成功后,列表
框才会被全部清空。
如果中途出现错误,则停止添加。
列表框中剩
下的项就是没有成功添加的项,值班员可对其进行修改后再进行
添加。
这部分的主要代码如下:
{TESTHR(pRst.CreateInstance(_uuidof(Recordset)));
DC"
_variant_t((IDispatch*)m_DBCnt,true),
adOpenKeyset,adLockOptimistic,adCmdTable);
//逐项读取,逐项提交
while(m_list.GetItemCount()>
0)
{
m_list.GetItemText(0,0,rs.m_sz_desk,sizeof(rs.m_sz_desk));
m_list.GetItemText(0,1,rs.m_sz_no,sizeof(rs.m_sz_no));
m_list.GetItemText(0,2,rs.m_sz_name,sizeof(rs.m_sz_name));
rs.m_f_number=(float)atof(m_list.GetItemText(0,3));
m_list.GetItemText(0,4,rs.m_sz_date,sizeof(rs.m_sz_date));
COleSafeArrayvaFieldlist,vaValuelist;
rs.FillFieldsArray(vaFieldlist,vaValuelist);
//提交一条菜谱记录
TESTHR(pRst->
AddNew(vaFieldlist,vaValuelist));
//从列表控件中删除已成功添加的菜
m_list.DeleteItem(0);
在将数据添加到数据库后将显示操作完成的提示。
5.5结算模块
开始结算时,将先出现要求输入桌号和折扣率的对话框,为
符合实际情况,需要在ClassWizard里限制折扣率一项的输入在
0.1-1.0之间。
如未输入桌号就点击确定,则会给出要求输入桌号
的提示。
下面是处理单击结算按钮事件的函数:
voidCRMSDlg:
OnBtnJs()
{CDlgBeginJSdlg1;
ShowWindow(SW_HIDE);
dlg1.DoModal();
if(dlg1.m_desk.GetLength()>
{CDlgJSdlg2;
dlg2.Setup(m_DBCnt,dlg1.m_desk,dlg1.m_dz);
dlg2.DoModal();
}else
{MessageBox("
请输入桌号!
"
ShowWindow(SW_SHOW);
在上面的代码中,读取了桌号和折扣率的信息之后,程序把
这两个信息传给一个CDlgJS对话框对象,然后显示这个对话框。
程序读出指定桌号的订餐信息,计算出总金额,并根据打折情况
计算出结算金额,这部分工作在OnInitDialog中完成:
floatCDlgJS:
GetPrice(LPCTSTRno)
{_RecordsetPtrpRst=NULL;
rs.m_f_price=0.0;
CStringsql_;
sql_.Format("
SELECT*FROMCPWHERE编号='
no);
_bstr_tstrSQL=sql_;
if(pRst->
adoEOF)_com_issue_error(0x80000000);
TESTHR(pRst->
QueryInterface(__uuidof(IADORecordBinding),
returnrs.m_f_price;
结算完成后单击保存帐单按钮,程序将在结算表中添加一条
记录,并删除已经结算过的订菜信息。
由于涉及到两个相互关联
的操作,所以必须使用ADO的事务功能。
在添加操作之前调用
Connection对象的