酒店管理系统的设计与实现.docx
《酒店管理系统的设计与实现.docx》由会员分享,可在线阅读,更多相关《酒店管理系统的设计与实现.docx(16页珍藏版)》请在冰豆网上搜索。
![酒店管理系统的设计与实现.docx](https://file1.bdocx.com/fileroot1/2022-12/15/491db979-f533-49f4-a97e-637eb8223a58/491db979-f533-49f4-a97e-637eb8223a581.gif)
酒店管理系统的设计与实现
酒店管理系统的设计与实现
1引言
酒店管理系统是我们常说的MIS(ManagementInformation
System,管理信息系统)的一种,在强调管理,强调信息的现代社会
中它越来越得到普及。
酒店管理系统的主要目标是实现对酒店内
部各种管理的电子化和自动化,提高酒店的办公效率,为高质量
的酒店服务提供保证。
在酒店业竞争越来越激烈的今天,努力在市场竞争中脱颖而
出,已经成为每位酒店经营者所追求的目标。
酒店如何才能提高
服务质量,其管理能力显得越来越重要。
由于使用了先进的数据
库管理技术,酒店管理系统对提高酒店的管理能力将会起到比较
重大的作用,整个系统的基本设计目标是实现系统界面友好美
观、简单易用、功能全面并有较高的安全性。
本系统需要实现中小
型酒店常用的点菜、订菜、结算等功能,并帮助酒店建立菜谱数据
库和销售存根数据库,能够方便地进行查询,并在系统的易用性
和安全性两方面进行相应的完善。
2系统主要模块
(1)登录管理模块;
(2)菜谱管理模块;(3)点菜订菜模块;(4)结算
模块;(5)帮助模块;(6)数据库设计;(7)系统界面设计。
软件系统由各个具体的功能模块组成,若值班员未登录或登
录失败,则只能使用登录,帮助,关于,退出这四个功能模块。
登录
成功后才可以使用全部的功能模块。
各个功能模块都是分别进行
开发的,这样就便于日后拓展功能,也易于检查和修改错误。
软件
的系统结构如图1所示。
3系统设计方案
根据系统功能的要求,考虑到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();
pRst->Close();}
catch(_com_error&e)
{AfxMessageBox(e.ErrorMessage());
m_list.SetRedraw(TRUE);
return;}
m_list.SetRedraw(TRUE);}
在上面的这段RefreshData函数的代码中,由于使用了ADO
2.0forVisualC++Extensions所提供的新特性DataBinding(数据
绑定)技术,所以代码显得比较简洁。
5.3登录管理模块
在未登录的时候,主对话框中的按钮,除了登录,退出,帮助,
关于等项,全是不可用的。
为了达到这一效果,在CRMSDlg:
:
OnInitDialog()中加入如下代码:
GetDlgItem(IDC_BTN_UPDPWD)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_DC)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_JS)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_CP)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_VIEWDC)->EnableWindow(FALSE);
若登录成功后,只需将FALSE换成TRUE,则所有按钮都变
为可用。
将进行登录验证的SQL代码加入到主对话框的事件处理
函数CRMSDlg:
:
OnBtnLogin()中,用来处理登录事务:
sql_.Format("SELECT值班员FROMZBYWHERE值班员=
'%s'AND密码='%s'",dlg.m_name,dlg.m_pswd);
这里并没有取出值班员表中的所有字段(值班员和密码),然
后把密码字段和用户的输入作比较来决定登录成功与否;而是只
取出了值班员名字(值班员),密码的校验放在数据库服务器端进
行,这主要是基于安全的考虑。
如果没有确实的需要,就尽量不从
数据库里取用户密码这种敏感数据,以免产生安全漏洞,削弱系
统的安全性。
修改密码部分的处理代码和登录部分类似,只是不但要进行
旧密码的验证,还要确认两次输入的新密码一致,如旧密码错误
或两次输入的新密码不一致则需要给出相应的提示。
另外还要利
用SQL语句向数据库中写入新密码:
sql_.Format("UpdateZBY
SET密码='%s'WHERE值班员='%s'",dlg.m_newpswd,dlg.
m_name);密码修改成功后则给出密码已修改成功的提示。
5.4点菜模块
在这个模块里可以根据顾客的需要逐项输入菜谱中的菜肴,
并可对已经做出的选择进行删除和修改。
待最终决定之后单击提
交按钮就会将结果保存到数据库中。
点菜订菜操作首先要在桌号
编辑框中输入桌号,然后在编号选择框中通过选择菜谱中的编号
来选择菜肴。
这样顾客只需说出所需菜肴在菜谱上的编号,值班
员就可以很快地找到顾客所需要的菜,而不必让顾客报出菜名,
提高服务效率,降低出错率。
为了使编号选择框中包含所有的菜
谱号,在CDlgDC:
:
OnInitDialog()中应包含如下代码:
try
{_bstr_tstrSQL("SELECT*FROMCP");
pRst=m_DBCnt->Execute(strSQL,NULL,adCmdText);
TESTHR(pRst->QueryInterface(_uuidof(IADORecordBinding),
(LPVOID*)&picRs));
TESTHR(picRs->BindToRecordset(&rs));
inti=0;
cpmap.clear();//清空cpmap
while(!
pRst->adoEOF)
{m_nos.AddString(rs.m_sz_no);
//向cpmap中添加一个[菜谱号-菜名]映射
cpmap.insert(CPMap:
:
value_type(string(rs.m_sz_no),string(rs.
24
m_sz_name)));
pRst->MoveNext();}
picRs->Release();
pRst->Close();}
catch(_com_error&e)
{AfxMessageBox(e.ErrorMessage());
returnTRUE;}
上面代码中的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)
#pragmawarning(disable:
4503)
#include
#include
usingnamespacestd;
typedefmapCPMap;
CPMapcpmap;
这里定义的CPMap类建立了一个从字符串到字符串的映
射,就是从map和string模板类来的,CPMap是一个STL(Standard
TemplateLibrary)类,而cpmap则是CPMap型的全局变量。
另外由
于使用了模板,会在类的内部产生相当长的类型名,从而在编译
时出现C4787警告,提示指示类型名长度超过255个字符,所以
用“#pragmawarning(disable:
4786)”来关掉这个警告。
值班员在订餐模块中修改、删除和增加菜肴都不会对数据库
作修改,而是先在列表框控件m_list中进行这些操作。
只有在单
击提交按钮之后,才会向数据库中提交数据。
每向数据库中加入
一条,就会自动清除列表框中相应的输入。
全部添加成功后,列表
框才会被全部清空。
如果中途出现错误,则停止添加。
列表框中剩
下的项就是没有成功添加的项,值班员可对其进行修改后再进行
添加。
这部分的主要代码如下:
try
{TESTHR(pRst.CreateInstance(_uuidof(Recordset)));
pRst->Open("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);}
pRst->Close();}
catch(_com_error&e)
{AfxMessageBox(e.ErrorMessage());
return;}
在将数据添加到数据库后将显示操作完成的提示。
5.5结算模块
开始结算时,将先出现要求输入桌号和折扣率的对话框,为
符合实际情况,需要在ClassWizard里限制折扣率一项的输入在
0.1-1.0之间。
如未输入桌号就点击确定,则会给出要求输入桌号
的提示。
下面是处理单击结算按钮事件的函数:
voidCRMSDlg:
:
OnBtnJs()
{CDlgBeginJSdlg1;
ShowWindow(SW_HIDE);
dlg1.DoModal();
if(dlg1.m_desk.GetLength()>0)
{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;
IADORecordBinding*picRs=NULL;//InterfacePointerdeclared.(
VC++Extensions)
CCPRsrs;
rs.m_f_price=0.0;
CStringsql_;
sql_.Format("SELECT*FROMCPWHERE编号='%s'",no);
_bstr_tstrSQL=sql_;
pRst=m_DBCnt->Execute(strSQL,NULL,adCmdText);
if(pRst->adoEOF)_com_issue_error(0x80000000);
TESTHR(pRst->QueryInterface(__uuidof(IADORecordBinding),
(LPVOID*)&picRs));
TESTHR(picRs->BindToRecordset(&rs));
picRs->Release();
pRst->Close();
returnrs.m_f_price;}
结算完成后单击保存帐单按钮,程序将在结算表中添加一条
记录,并删除已经结算过的订菜信息。
由于涉及到两个相互关联
的操作,所以必须使用ADO的事务功能。
在添加操作之前调用
Connection对象的