KFC宅急送点餐系统开发

原文作者:@Joe Chael

原文地址:

本文写于该系统开发完成后的第二年,那时候博主大二,有一门名为“程序设计方法学”的课程,老师上课很幽默风趣,也经常给我们带来一些时事新闻。当然,课余也会给我们布置一些作业。其中“KFC宅急送”就是该作业中的一次。

隐约记得当时的要求是这样的:仿照KFC网站的页面,设计出的自己的C/S模式的 KFC宅急送 系统,要求用到设计模式的知识。

本系统由@SnailSet 与 我共同完成,其中@SnailSet负责设计模式设计,博主负责MFC界面设计。

以下是当时写的一些文档:

(一)、 设计模式 作者:@SnailSet

本程序共有三种六个类,分别是: 1、CActivity类 及其子类: (1)、CNormalActivity (2)、CRebateActivity (3)、CReturnActivity 2、CStatistics类 3、CGlobal类类的关系已经在"KFC点餐UML图.png"中表示,下面对这些类进行简要的文字说明:

一、CActivity类是活动类的基类,给出通过活动计算收费接口。据我了解活动能够改变最后支付结果的有三种, 1 正常收费: 不优惠 2 打折收费: 比如 打九折 3 返利收费: 比如 满100返10 分别用下面三个类描述: 1 CNormalActivity 正常收费 2 CRebateActivity 打折收费,折率可变 3 CReturnActivity 返利收费,返利条件和返利可变 还有什么“买二赠一”等活动不改变最后支付结果,所以程序里不用描述只要收银员收两份的钱,然后送出一份。 二、CStatistics类负责统计和维护购买信息,包括计算最终收费结果、打印小票等。对于计算终收费结果,由于不同的活动会有不同的计算方式,所以CStatistics类必须维护一个CActivity的指针。采用策略模式。 三、CGlobal类负责维护菜单和一些全局变量,类内定义了CStatistics型指针,还定义了一个CGlobal*型的静态变量,并且构造函数私有化,可以保证实例唯一。采用单例模式。

(二)、MFC界面设计 作者:@Joe Chael

设计思路:本程序参照kfc网上订餐官网()设计模式仿照而来。为了与官网界面统一,软件开发时,设置为2个界面,主界面和发票打印界面。主界面:实现除了发票打印的所有功能,包括餐品的选择,数目和预支统计等等功能。一、如何使用主界面:1、界面的左边是餐品的分类,包括优惠直通车,早餐,午餐,,夜宵,新餐上映几个选项,可以点击这几个选项,进行不同的选择。2、界面的右边是餐品展示场所,这个界面是根据你右边选项的选择而动态加载的。3、每个餐品的下面都有"-","+"号,用户可以直接点击进行选餐,这样设计给用户使用起来也比较方面,如果同一件物品需要选择多份,直接多点击几次"+"就可以了,同时,如果餐品选择多了则点击"-"。4、用户在选择餐品的同时,可以注意到界面的底部,已经给计算出来了餐品的实际价格(原价),5、可能用户选择的餐品有优惠的则还有一个优惠后的价格(现价)。6、当用户选择好餐品之后,只需要点击主界面右下角的立即结算按钮就可以进行付款了。二、如何使用发票打印界面:该界面有两个编辑框是可以输入的,分别是 优惠券 和 实收。优惠券:支持用户使用优惠券,这时候需要输入优惠券的面值。实收:实际收取用户的现金,填写实收现金的时候,系统会自动计算出应找零多少。三、如果你是管理员:1、也许你注意到了,主界面底部有一个管理员的按钮,这是管理员登陆的。2、点击"管理员"按钮后,会弹出认证页面(这里我已经给默认了账号密码了)。3、认证成功后会弹出 两个选项 "修改菜价" 和 "增加菜谱"。修改菜价:需要输入两个参数 1.菜名 :通过这个找到文件里面的菜资料。(必须存在于文件中,否则提示未找到) 2.价格 :就是你现在要设定的价格。增加菜谱:也需要输入两个参数 1.菜名 :不能与文件中的菜名重复。(重复,则提示添加不成功) 2.价格 :菜价。涉及到的知识:1.树状控件的使用 ★实例:KFC右边点餐部分 具体实现:在对话框的OnInitDialog()函数中,构建树列表。 1)首先,通过LoadIcon()函数加载树列表的ico图标。 2)然后,通过SetImageList()函数,为树形控件设置图像序列。 3)最后,开始树桩列表的插入,就是用InsertItem()函数,插入列表时注意句柄的选择 (树根节点不需要句柄,一级树枝,使用根节点句柄,二级树枝,使用一级树枝句柄…)2.动态按钮,位图的使用 ★实例:KFC餐品展示部分,位图和按钮的条件显示与隐藏 具体实现:主要是在MFC对话框绘制函数OnPaint() 里面实现。 1)按钮的禁用与解禁: 禁用:GetDlgItem(IDC_BT3_Z)->EnableWindow(FALSE); //其中IDC_BT3_Z为控件ID 解禁:GetDlgItem(IDC_BT3_Z)->EnableWindow(TRUE); 2)位图的动态显示: CPaintDC pDC(this); CBitmap tp,*OldBitMap; CDC *dc,dcMem; dc=GetDC(); dcMem.CreateCompatibleDC(&pDC); tp.LoadBitmap(IDB_BT_WFL); OldBitMap=dcMem.SelectObject(&tp); dc->BitBlt(645,280,845,480,&dcMem,0,0,SRCCOPY); dcMem.SelectObject(OldBitMap); DeleteObject(&tp); dcMem.DeleteDC(); 3)按钮的隐藏与显示: 隐藏:GetDlgItem(IDC_BT6_Z)->ShowWindow(SW_HIDE); //其中IDC_BT6_Z为控件ID 显示:GetDlgItem(IDC_BT6_Z)->ShowWindow(SW_SHOW);3.界面大小动态控制 实例:管理员入口,菜谱的修改和增加 1)获取分割控件的位置。(获得窗体大小GetWindowRect()) 2)通过此控件的位置,设置窗体大小。(实现窗体的收缩与展开,设置大小函数SetWindowPos())。(三)、成果展示

1、注意,有菜单(menu.txt),以及账单(tip.txt)在同一目录下面~

2、欢迎界面由一张大图构成

3、左边是一个树形菜单以供选择

4、点击左下角的“管理员”,可以进入系统后台

5、系统后台有一些对菜谱等进行操作的选项

(四)、原文Demo下载:

(1)

(2)链接: 密码: 4t65

于是夜莺会在黎明到来之前勇敢的将胸膛顶住蔷薇的刺,

KFC宅急送点餐系统开发

相关文章:

你感兴趣的文章:

标签云: