酒店管理系统的设计与实现.docx

上传人:b****8 文档编号:9551001 上传时间:2023-02-05 格式:DOCX 页数:19 大小:26.70KB
下载 相关 举报
酒店管理系统的设计与实现.docx_第1页
第1页 / 共19页
酒店管理系统的设计与实现.docx_第2页
第2页 / 共19页
酒店管理系统的设计与实现.docx_第3页
第3页 / 共19页
酒店管理系统的设计与实现.docx_第4页
第4页 / 共19页
酒店管理系统的设计与实现.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

酒店管理系统的设计与实现.docx

《酒店管理系统的设计与实现.docx》由会员分享,可在线阅读,更多相关《酒店管理系统的设计与实现.docx(19页珍藏版)》请在冰豆网上搜索。

酒店管理系统的设计与实现.docx

酒店管理系统的设计与实现

酒店管理系统的设计与实现

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对象的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1