基于QT的电子点餐系统的设计与实现_第1页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

II目录TOC\o"1-9"\t"样1,1,样2,1,样3,1"\h24767摘要 123449Abstract 218301绪论 122061.1引言 1119171.1.1编写目的 1229571.1.2项目背景 1280841.1.3现实背景 1278651.2术语定义 229301.3参考资料 2129221.4研究目的和意义 2286921.4.1目的 2116851.4.2意义 398642开发平台及核心技术简介 4105052.1开发语言介绍 451802.1.1Qt介绍 430562.1.2Qt信号槽机制简介 511752.1.3属性介绍 762182.2开发环境 7198172.2.1VisioStudio2008简介 7250492.2.2VC2008与Qt4.7的开发环境搭建 8153132.3核心技术介绍 840932.3.1UDP协议 8136762.3.2TCP协议 9181042.3.3Qt数据库支持 1060803需求分析 12145473.1目前餐饮企业工作流程 12287403.2所建议系统的工作流程 12134063.3产品功能 13147163.4软件需求描述 14173613.5系统用例图 14281463.6软件接口 1645104总体设计与实现 1720814.1系统架构设计 17268704.2系统编码规范 17323934.2.1类型的命名 17179324.2.2方法和属性的命名 1814084.2.3变量和常数 18146214.2.4Main函数代码 19277815详细设计 20151085.1数据库模块功能设 20233175.2登录模块功能设计 20182135.3点餐模块功能设计 2144455.4服务器模块功能设计 21281425.5厨房模块功能设计 22131145.6数据库模块设计与实现 22277265.6.1数据库模块设计 2262365.6.2数据库模块实现 23306575.7登录模块设计与实现 23129535.7.1登录模块设计 23112385.7.2登陆模块代码 23255165.7.3注册模块代码 24117185.8点餐模块设计与实现 2497035.8.1点餐模块设计 24312705.8.2点餐客户端代码 25183565.9服务器模块设计与实现 26162875.9.1服务器模块设计与实现 26142885.9.2服务器代码 26272235.10厨房模块设计与实现 2842605.10.1厨房模块设计 28303435.10.2厨房客户端代码 28171976系统测试 3121046.1简介 3116136.1.1编写目的 31311956.1.2项目背景 3155016.1.3系统简介 31247406.1.4参考资料 31251436.2测试概要 31155786.2.1测试用例设计 32137156.2.2测试环境与配置 32321126.2.3测试方法(和工具) 32276296.3测试结果及缺陷分析 32311456.3.1登录模块测试 326526.3.2点餐模块实现 33226756.3.3服务器模块实现 34121886.3.4厨房模块实现 36239616.4测试结论 3716132总结 382697参考文献 39732致谢 4019117外文原文 41绪论引言编写目的本文档是餐饮点餐管理系统的项目需求说明书,对餐饮点餐管理系统的发展进行简要回顾,分析当前的业务流程,总结此类管理系统的基本特点以及总体功能,尽可能完整的概括提取出需求方的全部想法。本文档对项目开发人员、设计人员及系统实施人员具有很重要的指导意义。项目背景项目名称:餐饮点餐管理系统;中国是举世闻名的美食大国,拥有五千年的饮食文化和巨大的餐饮市场,随着人民生活水平和生活方式的转变,餐饮业具有巨大的投资市场,被称为中国的黄金产业,但同样也应看到,餐饮业不仅面临着巨大的发展机遇,也面临着前所未有的挑战和考验。餐饮业的不断发展,在经营管理上也逐步向电子化迈进,通过电脑信息系统管理餐饮业的内部事务,使得作业更加简单化、高效。以财务为中心,减轻一线操作人员的劳动强度,节省营业人员的交班时间,加强财务审核管理。提供多种点菜、结算、统计报表功能,提供分厨房直接打印前台点菜数据。在餐饮经营中,传统的纸制作业流程无法满足现代客户在信息娱乐及服务安保等方面的要求。而此系统的使用,使餐厅管理者便捷的进行经营娱乐的管理,大大增加的各店成本控制及销售额现实背景我国的餐饮市场经过30多年的改革开放及发展,可以说我国正迎来一个餐饮业大发展的时期,市场潜在力量巨大,远景很是广阔。根据中国烹饪协会发布的2009年度餐饮业发展报告显示,即便在经济遭受重创的2009年,全社会餐饮业零售额达依然到17998亿元,同比增长16.8%。其中,每月的零售额均超过1300亿元,增长率稳定在14.4%至21.6%。在各类消费性支出中增幅居前,仅次于交通和通信支出。并且预计2012年餐饮市场还将继续增长,营业额也将达到20000亿元。与此同时,我国餐饮业发展的质量和内涵也发生了重大变化。行业的经营领域和市场空间不断拓宽,经营档次和企业管理水平不断提高,经营业态日趋丰富,投资主体和消费需求多元化特点更加突出,网点数量和人员队伍继续扩大;餐饮市场更加繁荣,消费的个性化和特色化的趋势明显,追求健康营养和连锁规模发展成为主题。集团化、品牌化、产业化和国际化的发展步伐加快,餐饮现代化的进程不断推进。近几年来,中国餐饮业的发展一直保持强劲快速增长同时,也看到目前餐饮行业普遍存在的问题。餐饮企业的发展一直处于自我摸索、自我运作、自我积累和自我完善为主的状态,利润低、承载重、支撑小、发展难的特点突出。餐饮企业在产品标准化技术设备开发、连锁管理体系的建立、专业人才的培养、吸纳资本投入、理论指导和信息交流等方面的条件十分不足,存在着技术开发与设备配套难、管理与人才难、配送渠道与发展资金难、沟通交流与合作难等深层次因素的制约,行业平台和基础支持力量不强,对企业发展产生较大的影响。术语定义所谓”翻台率”是指在某期间里,指餐桌座位坐满及餐桌空荡的速度。一个高翻台率意味更多用餐者吃了并且走了,而一个低的翻台率意味同样用餐者是在一段长时间里使用餐桌,或者餐桌座位是空的。参考资料[1] 餐饮点餐管理系统项目开发计划_v1.00研究目的和意义目的在我们这个“食文化”高度发达的国度里,餐饮业毋庸置疑地成为第一大传统产业。然而,正是这历史悠久、规模庞大的产业,却也是信息化程度最慢和最低的产业之一。至今为止,绝大多数餐饮企业的经营方式仍然停留在“一张纸、一支笔、经理喊破嗓、员工跑断腿”的境地;而会计工作,也仍然是以一支笔或一个算盘,或最好的情况下一个计算器进行加减乘除,其本质仍然是以人脑计算为基础,不但工作量巨大,而且极易出错。笔者曾经见过生意极好的大排档,服务员进进出出地飞奔于户外桌台、大堂吧台和厨房之间,而经理则用计算器算得满头大汗的场景,蔚为壮观。且不说这种日复一日的重复、单调的劳动意义何在,单就消费计算方面的出错而引发的与客户之间的矛盾纠纷,就不可胜计。其实在人类文明已经进入电子信息的时代,绝大多数重复、单调、可程式化的工作都已经可以交由计算机来完成。面对复杂和庞大的计算任务,计算机在效率和准确度方面是人脑所不能望其项背的。作为传统产业的餐饮业,同其他很多传统产业一样,同样可以引入信息化改造。餐饮业的信息化改造内容,主要有:由传统的笔和纸点餐,改用电子点餐;由传统的人工计算、统计、管理,改用电脑进行计算、统计和管理;将现代的电子技术、无线技术、计算机技术和网络技术引入到餐饮行业中来,替代部分人工操作,加快餐饮企业的运转效率,提升餐饮企业的管理水平,使餐饮企业运作更规范、更科学、更高效。在餐饮企业的信息化改造当中,无线点餐(点菜)系统,成为其核心内容,也是餐饮企业进行信息化改造的必由之路。因此本论文研究的目的在于通过餐饮企业的信息化改造暨利用无线技术,替代传统的纸和笔进行电子点餐(点菜)操作,实现远距离地进行信息即时传递。当然,无线点餐(点菜)系统不只是可以进行点餐操作,同时通过配套的餐饮管理软件,还可以实现强大的统计和管理功能,使餐饮企业真正实现信息化。意义能够有效地的提升餐饮企业的档次和管理水平,做到科学管理、科学决策、高效运转、降低成本,进行信息化是必由之路。而采用无线点餐(点菜)系统取代传统的手工点餐,采用餐饮管理软件取代传统的人工统计和粗放型管理又是信息化当中的核心内容。餐饮企业引进一套无线点餐(点菜)系统,成本大约在一万元左右(视配置情况而不同),大约相当于一个服务员一年的工资,但带来的便利性和管理水平的升级则是无与伦比的。无线点餐(点菜)系统所带来的运营效率的大幅度提高和人力成本的节约,远超其投资成本,对于餐饮企业信息化,可以说是不二的选择。

开发平台及核心技术简介开发语言介绍Qt介绍Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(MetaObjectCompiler,moc))以及一些宏,易于扩展,允许组件编程。2008年,奇趣科技被诺基亚公司收购,QT也因此成为诺基亚旗下的编程语言工具。2012年,Qt被Digia收购。Qt是一个跨平台的C++图形用户界面库,由挪威TrollTech公司出品,目前包括Qt/X11,基于Framebuffer的QtEmbedded,快速开发工具QtDesigner,国际化工具QtLinguist等,Qt支持Unix系统及Linux,还支持WinNT/Win2k,Win95/98平台。Qt的良好封装机制使得Qt的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。QtAPI和开发工具对所有支持平台都是一致的,从而可以进行独立于平台的程序开发和配置。它使得跨平台软件编程直观、简易和方便。Qt提供了一种称为signals/slots的安全类型来替代callback回调函数,这使得各个控件之间的协同工作变得十分简单。Qt在Linux下有GPL版,可方便用户的学习及开发。如果用户使用C++,对库的稳定性,健壮性要求比较高,并且希望跨平台开发的话,那么使用Qt是较好的选择,Qt还支持2D/3D图形渲染、OpenGL、XML等。QtScriptforApplications(QSA)是Trolltech的跨平台脚本工具箱。Qt为静态的Qt/C++程序提供了一个脚本界面,可以定制和扩展程序。Qtopia是为基于Linux的PDA,智能电话和其他移动设备设计的一个全面的,可以用户化的应用程序平台和用户界面。Qt/Embedded是面向嵌入式系统的Qt版本,是Qt的嵌入式Linux窗口,是完整的自包含C++GUI和基于Linux的嵌入式平台开发工具。Qt/EmbeddedAPI可用于多种开发项目。许多基于Qt的XWindow程序可以非常方便地移植到嵌入式版本,适用于高端PDA等产品。Qt/Embedded内部对于字符集的处理采用了UNICODE编码标准。Qt是基于面向对象的C++语言,Qt提供了signal和slot的对象通信机制,具有可查询和可设计的属性以及强大的事件和事件过滤器,同时,还具有字符国际化,即支持根据上下文进行国际化的字符串翻译。许多Qt的特性是基于QObject的继承,通过标准C++技术实现的优良的跨平台特性:Qt支持下列操作系统:MicrosoftWindows95/98,MicrosoftWindowsNT,Linux,Solaris,SunOS,HP-UX,DigitalUNIX(OSF/1,Tru64),Irix,FreeBSD,BSD/OS,SCO,AIX,OS390,QNX等等。面向对象:Qt的良好封装机制使得Qt的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。Qt提供了一种称为signals/slots的安全类型来替代callback,这使得各个元件之间的协同工作变得十分简单。丰富的API:Qt包括多达250个以上的C++类,还提供基于模板的collections,serialization,file,I/Odevice,directorymanagement,date/time类。甚至还包括正则表达式的处理功能。支持2D/3D图形渲染,支持OpenGL,丰富的XML支持。Qt信号槽机制简介信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方。信号和槽是QT自行定义的一种通信机制,它独立于标准的C/C++语言,因此要正确的处理信号和槽,必须借助一个称为moc(MetaObjectCompiler)的QT工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码。在我们所熟知的很多GUI工具包中,窗口小部件(widget)都有一个回调函数用于响应它们能触发的每个动作,这个回调函数通常是一个指向某个函数的指针。但是,在QT中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程序更为简洁明了。信号和槽能携带任意数量和任意类型的参数,他们是类型完全安全的,不会像回调函数那样产生coredumps。所有从QObject或其子类(例如Qwidget)派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射(emit)出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。我们可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接,甚至于将一个信号与另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。(1)信号当某个信号对其客户或所有者发生的内部状态发生改变,信号被一个对象发射。只有定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,与其相关联的槽将被立刻执行,就象一个正常的函数调用一样。信号-槽机制完全独立于任何GUI事件循环。只有当所有的槽返回以后发射函数(emit)才返回。如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行。信号的声明是在头文件中进行的,QT的signals关键字指出进入了信号声明区,随后即可声明自己的信号。例如,下面定义了三个信号: signals: voidmySignal(); voidmySignal(intx); voidmySignalParam(intx,inty);在上面的定义中,signals是QT的关键字,而非C/C++的。接下来的一行voidmySignal()定义了信号mySignal,这个信号没有携带参数;接下来的一行voidmySignal(intx)定义了重名信号mySignal,但是它携带一个整形参数,这有点类似于C++中的虚函数。从形式上讲信号的声明与普通的C++函数是一样的,但是信号却没有函数体定义,另外,信号的返回类型都是void,不要指望能从信号返回什么有用信息。信号由moc自动产生,它们不应该在.cpp文件中实现。(2)槽槽是普通的C++成员函数,可以被正常调用,它们唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。既然槽是普通的成员函数,因此与其它的函数一样,它们也有存取权限。槽的存取权限决定了谁能够与其相关联。同普通的C++成员函数一样,槽函数也分为三种类型,即publicslots、privateslots和protectedslots:publicslots:在这个区内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用,你可以创建彼此互不了解的对象,将它们的信号与槽进行连接以便信息能够正确的传递。protectedslots:在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。这适用于那些槽,它们是类实现的一部分,但是其界面接口却面向外部。privateslots:在这个区内声明的槽意味着只有类自己可以将信号与之相连接。这适用于联系非常紧密的类。槽也能够声明为虚函数,这也是非常有用的。槽的声明也是在头文件中进行的。例如,下面声明了三个槽: publicslots: voidmySlot(); voidmySlot(intx); voidmySignalParam(intx,inty);(3)信号与槽的关联建立连接:通过调用QObject对象的connect函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。该函数的定义如下:

boolQObject::connect(constQObject*sender,constchar*signal, constQObject*receiver,constchar*member)[static]这个函数的作用就是将发射者sender对象中的信号signal与接收者receiver中的member槽函数联系起来。当指定信号signal时必须使用QT的宏SIGNAL(),当指定槽函数时必须使用宏SLOT()。如果发射者与接收者属于同一个对象的话,那么在connect调用中接收者参数可以省略。断开连接:disconnect函数来断开连接。其定义如下:boolQObject::disconnect(constQObject*sender,constchar*signal, constObject*receiver,constchar*member)[static]这个函数断开发射者中的信号与接收者中的槽函数之间的关联。属性介绍Qt的属性也基于元对象系统,在类声明中用宏Q_PROPERTY来声明。属性只能在继承于QObject的子类中声明。宏Q_OVERRIDE用来覆盖一些子类中由继承得到的属性。属性也是一个类的成员。元对象系统中设置属性和得到属性的成员函数列出如下:QObject::setProperty()可以让你控制类中那些在编译时不可用的属性。QMetaObject::propertyNames()返回所有可用属性的名称。QMetaObject::property()返回一个指定属性的属性数据:一个QMetaProperty对象。下面两个设置函数是等效的://QButton*b和QObject*o指向同一个按钮时b->setDown(TRUE);o->setProperty("down",TRUE);开发环境VisioStudio2008简介MicrosoftVisualStudio(简称VS)是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台,包括MicrosoftWindows、WindowsMobile、WindowsCE、.NETFramework、.NETCompactFramework和Microsoft

Silverlight

及WindowsPhone。VisualStudio2008在三个方面为开发人员提供了关键改进:1、快速的应用程序开发。2、高效的团队协作。3、突破性的用户体验。VisualStudio2008提供了高级开发工具、调试功能、数据库功能和创新功能,帮助在各种平台上快速创建当前最先进的应用程序。VisualStudio2008包括各种增强功能,例如可视化设计器(使用.NETFramework3.5

加速开发)、对Web开发工具的大量改进,以及能够加速开发和处理所有类型数据的语言增强功能。VisualStudio2008为开发人员提供了所有相关的工具和框架支持,帮助创建引人注目的、令人印象深刻并支持AJAX的Web应用程序。开发人员能够利用这些丰富的客户端和服务器端框架轻松构建以客户为中心的Web应用程序,这些应用程序可以集成任何后端数据提供程序、在任何当前浏览器内运行并完全访问ASPNET应用程序服务和Microsoft平台。[2]程序开发为了帮助开发人员迅速创建先进的软件,VisualStudio2008提供了改进的语言和数据功能,例如语言集成的查询(LINQ),各个编程人员可以利用这些功能更轻松地构建解决方案以分析和处理信息。VisualStudio2008还使开发人员能够从同一开发环境内创建面向多个.NETFramework版本的应用程序。开发人员能够构建面向.NETFramework2.0、3.0或3.5的应用程序,意味他们可以在同一环境中支持各种各样的项目。VisualStudio2008为开发人员提供了在最新平台上加速创建紧密联系的应用程序的新工具,这些平台包括

Web、WindowsVista、Office2007、SQLServer2008

和WindowsServer2008。对于Web,ASPNETAJAX及其他新技术使开发人员能够迅速创建更高效、交互式更强和更个性化的新一代Web体验。[3]高效的团队协作VisualStudio2008提供了帮助开发团队改进协作的扩展的和改进的服务项目,包括帮助将数据库专业人员和图形设计人员加入到开发流程的工具。[3]VC2008与Qt4.7的开发环境搭建VC2008与Qt开发环境搭建是十分简单的事情,Qt授权模式有三种授权协议,分别是GPL,LGPL和Commercial,选择GPL协议即可。1.下载并安装Vc2008专业版。2.下载并安装Qt安装包qt-win-opensource-4.7.0-vs2008.exe

。3.下载并安装qt-vs-addin-1.1.7.exe。4.在系统环境变量中添加D:\QT\4.7.0。核心技术介绍UDP协议UDP协议是英文UserDatagramProtocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。与我们所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。UDP协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数据报就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。UDP协议的全称是用户数据报协议[2],在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。UDP协议使用端口号为不同的应用保留其各自的数据传输通道。UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将UDP数据报通过源端口发送出去,而数据接收一方则通过目标端口接收数据。有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。一般来说,大于49151的端口号都代表动态端口。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。TCP协议TransmissionControlProtocol

传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transportlayer)通信协议,由IETF的RFC793说明(specified)。TCP在IP报文的协议号是6。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,UDP是同一层内另一个重要的传输协TCP/IP协议并不完全符合OSI的七层参考模型。传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。这7层是:物理层、数据链路层、网路层、传输层、话路层、表示层和应用层。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为:应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、SerialLine等)来传送数据。在因特网协议族(Internetprotocolsuite)四层协议中,TCP层是位于IP层之上,应用层之下的传输层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分割成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个字节一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算和校验。首先,TCP建立连接之后,通信双方都同时可以进行数据的传输,其次,它是全双工的;在保证可靠性上,采用超时重传和捎带确认机制。在流量控制上,采用滑动窗口协议,协议中规定,对于窗口内未经确认的分组需要重传。在拥塞控制上,采用广受好评的TCP拥塞控制算法(也称AIMD算法),该算法主要包括三个主要部分:1,加性增、乘性减;2,慢启动;3,对超时事件做出反应。Qt数据库支持Qt提供了QtSql模块来提供平台独立的基于SQL的数据库操作。这里我们所说的“平台独立”,既包括操作系统平台,有包括各个数据库平台。另外,我们强调了“基于SQL”,因为NoSQL数据库至今没有一个通用查询方法,所以不可能提供一种通用的NoSQL数据库的操作。Qt的数据库操作还可以很方便的与model/view架构进行整合。通常来说,对数据库的操作更多地在于对数据库表的操作,而这正是model/view架构的长项。不过,由于受到协议的限制,Qt开源版本并没有提供上面所有驱动的二进制版本,而仅仅以源代码的形式提供。通常,Qt只默认搭载QSqlite驱动(这个驱动实际还包括Sqlite数据库,也就是说,如果需要使用Sqlite的话,只需要该驱动即可)。我们可以选择把这些驱动作为Qt的一部分进行编译,也可以当作插件编译。如果习惯于使用SQL语句,我们可以选择QSqlQuery类;如果只需要使用高层次的数据库接口(不关心SQL语法)。Qt为数据库访问提供的QtSql模块实现了数据库和Qt应用程序的无缝集成,同时为开发人员提供了一套与平台无关和具体所用数据库均无关的调用接口。这使得开发人员只需掌握基本的SQL语句,就能进行简单的数据库应用程序开发。如下表所示,QtSql模块由3部分组成。驱动层 :驱动层实现了特定数据库与SQL接口的底层桥接。SQL接口层 :SQL接口层提供了数据库类的访问用户接口层:用户接口层提供从数据库数据到用于数据库表示的窗体的映射QtSql模块提供了一个平台无关且数据库无关的访问SQL数据库的接口。Qt中的每个数据库连接用一个QSqlDatabase对象来表示;Qt使用不同driver来和各种不同数据库的API进行通讯。QSqlQuery提供了直接执行任意SQL语句的特性;此外还提供了两个高层次的无需SQL命令的数据库接口:QSqlTableModel和QSqlRelationalTableModelSection1.ConnectingandQuerying在执行SQL命令前,必须先建立好同数据库的连接。静态函数QSqlDatabase::addDatabase()用于创建一个新的QSqlDatabase对象,函数的第一个参数指定了Qt该选择哪个Driver来访问数据库。在对创建的QSqlDatabase对象设定好hostname,databasename,username和password后,需要调用open()函数来建立到数据库的连接。一旦到数据库的链接建立好后,就可以通过QSqlQuery::exec()来执行底层数据库所支持的任意SQL语句了。QSqlQuery::next()返回查询结果集中的下一行,而QSqlQuery::value()则返回当前行中的某一项的值,以QVariant的形式返回。可以使用QSqlQuery::isActive()来检查SQL语句的执行是否出现错误。placeholderQSqlQuery::prepare()QSqlQuery::bindValue()orQSqlQuery::addBindValue()QSqlQuery::exec()Qt支持数据库中transaction(事务)这个概念。transaction()用于启动transaction,而commit()或rollback()用于结束transaction。静态函数QSqlDatabase::database(),返回指定连接所对应的QSqlDatabase对象。QSqlDatabase::driver()返回该连接底层所使用的dirverQSqlDatabase::hasFeature()可用来查询底层数据库是否支持某项特性。Qt允许在一个程序中创建多个数据库连接,这中情况下在执行SQL语句时,需要为QSqlQuery的构造函数传入要执行该语句的数据库对应的QSqlDatabase对象。与QSqlQuery相比,QSqlTableModel提供了一个更高层次、更抽象的接口,可以避免使用原始的SQL命令。QSqlTableModel::record()&QSqlTableModel::value()QSqlTableModel::insertRow()&QSqlTableModel::setData()QSqlTableModel::submitAll(),于其他model不同,在使用QSqlTableModel时,必须调用submitAll()来强制所有的修改都写入数据库。当需要处理外键(foreignkey)时,需要使用QSqlRelationalTableModel而不是QSqlTableModel。对于使用了SQL相关类的应用程序,需要在对应的.pro中添加下面一行:"QT+=sql",这样在链接时会将QtSql库链入。

需求分析目前餐饮企业工作流程目前的中小餐饮企业采用最多的手工记账形式,其业务流程如图2.1所示客人点餐客人点餐服务员登记厨师加工处理客人点餐收银台服务员登记图3-1手工业务流程分析流程图简介:顾客到达餐厅有引领员引导到座位后,承上菜谱并登记客人所点食品,完毕后唱菜谱并由客人确认,征得客人同意后交给后台厨师及配餐人员,配餐人员根据大厅服务员提交的菜谱为客人配齐所有饮料、酒水、甜点等食物,厨师根据大厅服务员提供的菜谱按照先凉后热的顺序快速加工出美味可口的食物交友送餐人员及时送到指定的餐桌。客人用餐完毕后有服务员或者客户到收银处办理结算手续,客人如有会员卡的话,收银员应给予相应的优惠,结算完毕后有引领员送客人出餐厅,这样的工作方式当客流量增加的时候,必然会出现争抢菜谱,上错菜,漏上菜、忘记上菜以及计算失误等现象,轻则引起客户的不满,重则引起纠纷,因此有必要采用新的工作模式,来避免上述情况的发生。所建议系统的工作流程基于传统餐饮企业手工操作所带来的种种弊端,一种新的利用计算机来管理信息的系统餐饮点餐管理系统也就应运而生,那么该系统的工作流程如图2.2所示图3-2自动化的点餐系统产品功能根据所建议系统的业务流程图,分析出新系统的功能模块图如2.3所示用户登录用户登录点餐管理配餐管理结算管理系统管理图3-3功能模块图软件需求描述1.用户登陆:用户输入用户名及密码后,系统自动验证有效性及用户角色,根据用户拥有的角色自动进入不同的子系统2.客户点餐子系统:当客人落座后,服务员手持IPAD登陆点餐子系统后,首先输入相应的桌号,然后由客人根据不同的服务类别(特价、凉菜、热菜、汤、酒水、饮料)选择不同的食物及数量,系统根据不同的食物计算出总价格,方便客人控制总价格,如果输入错误系统提供删除的功能,最后提交到后厨配餐子系统中.3.配餐管理子系统:配餐员或者厨师根据最新的配餐信息,按照时间先后顺序配置食品,完成后提交给结算管理子系统中4.结算管理子系统:收银员根据服务员或者客人提供的桌号计算出总价格,客人如果提供会员卡或者会员号,系统自动验证卡号及会员身份并计算出相应的折扣及实付金额,根据相应的金额出具对应的发票5.系统管理子系统:经理登陆子系统后,上传菜谱,管理菜谱及特价。在此子系统中,还实现了会员及用户、留言、桌位的管理。系统用例图系统用例【9】图是按照场景的形式对系统的功能做清晰地设计,具体用例有:登陆用例图、点餐用例图、配餐用例图、结账用例图、管理用例。用户通过餐饮管理系统可以实现用户登陆,如图:图3-4登陆用例服务员通过餐饮管理系统可以实现客人点餐,如图:图3-5点餐用例厨师通过餐饮管理系统实现厨师配餐,如图:图3-6配餐用例收银员通过餐饮管理系统实现替客人结账功能,如图:图3-7结算用例经理通过餐饮管理系统实现对系统的设置等操作,如图:图3-8系统设置用例软件接口Windows操作系统所提供的各种API:1.基础服务(BaseServices),提供对Windows系统可用的基础资源的访问接口。比如象:文件系统(filesystem)、外部设备(device)、,进程(process)、线程(thread)以及访问注册表(Windowsregistry)和错误处理机制(errorhandling)。这些功能接口位于,16位Windows下的kernel.exe、krnl286.exe或krnl386.exe系统文档中;以及32位Windows下的kernel32.dll和advapi32.dll中。2.图形设备接口(GDI),提供功能为:输出图形内容到显示器、打印机以及其他外部输出设备。它位于16位Windows下的gdi.exe;以及32位Windows下的gdi32.dll。3.图形化用户界面(GUI),提供的功能有创建和管理屏幕和大多数基本控件(control),比如按钮和滚动条。接收鼠标和键盘输入,以及其他与GUI有关的功能。这些调用接口位于:16位Windows下的user.exe,以及32位Windows下的user32.dll。从WindowsXP版本之后,基本控件和通用对话框控件(CommonControlLibrary)的调用接口放在comctl32.dll中。4.通用对话框链接库(CommonDialogBoxLibrary),为应用程序提供标准对话框,比如打开/保存文档对话框、颜色对话框和字体对话框等等。这个链接库位于:16位Windows下的commdlg.dll中,以及32位Windows下comdlg32.dll中。它被归类为UserInterfaceAPI之下。5.通用控件链接库(CommonControlLibrary),为应用程序提供接口来访问操作系统提供的一些高级控件。比如像:状态栏(statusbar)、进度条(progressbars)、工具栏(toolbar)和标签(tab)。这个链接库位于:16位Windows下的commctrl.dll中,以及32位Windows下comctl32.dll中。。它被归类为UserInterfaceAPI之下。6.Windows外壳(WindowsShell),作为WindowsAPI的组成部分,不仅允许应用程序访问Windows外壳提供的功能,还对之有所改进和增强。它位于16位Windows下的shell.dll中,以及32位Windows下的shell32.dll中(Windows95则在shlwapi.dll中)。它被归类为UserInterfaceAPI之下。7.网络服务(NetworkServices),为访问操作系统提供的多种网络功能提供接口。它包括NetBIOS、Winsock、NetDDE及RPC等。

总体设计与实现系统架构设计本系统采用流行的C/S结构,既客户端/服务器端结构,客户端是基于.NetFrameWork平台的应用程序,服务器端是基于SqlServer2005的数据库存储应用系统,采用面向对象【12】的开发语言C#【13】作为编程语言,使用Visualstudio2010作为开发工具以及应用流行的软件开发模型—瀑布模型系统编码规范系统编码实现采用目前流行的面向对象的编程语言—C#,因此为了今后的系统扩展及测试维护,所以按照微软统一发布的C#编码规范,具体内容如下:类型的命名1.类名,以Class声明的类,都必须以名词或名词短语命名,体现类的作用。如:ClassIndicator当类是一个特性(Attribute)时,以Attribute结尾,当类是一个异常(Exception)时,以Exception结尾:ClassColorSetExceptionClassCauseExceptionAttribute当类只需有一个对象实例(全局对象,比如Application等),必须以Class结尾,如ClassScreenClassClassSystemClass。当类只用于作为其他类的基类,根据情况,以Base结尾:MustInheritClassIndicatorBase,如果定义的类是一个窗体,那么名字的后面必须加后缀Form,如果是Web窗体,必须加后缀Page:ClassPrintForm:InheritsForm'*Windows窗体ClassStartPage:InheritsPage'*Web窗体2.枚举和结构:同样必须以名词或名词短语命名。最好体现枚举或结构的特点,如:EnumColorButtons'以复数结尾,表明这是一个枚举StructureCustomerInfoRecord'以Record结尾,表明这是一个结构体3.委派类型:普通的委派类型以描述动作的名词命名,以体现委派类型实例的功能:DelegateSubDataSeeker(ByValSeekStringAsString),用于事件处理的委派类型,必须以EventHandler结尾,如:DelegateSubDataChangedEventHandler(ByValSenderAsObject,ByValeAsDataChangedEventArgs)4.接口:与其他类型不同,接口必须要由I作为前缀,并用形容词命名,突出表现实现接口的类将具有什么能力:InterfaceISortable5.模块:模块不是类型,他的名称除了必须以名词命名外,必须加以后缀Module:ModuleSharedFunctionsModule,上述所有规则的共同特点是,每个组成名称的词语都必须是大写开头,禁止完全大写或小写的名称。方法和属性的命名1.方法:无论是函数还是子程序,方法都必须以动词或动词短语命名。无需区分函数和子程序,也无需指明返回类型。SubOpen(ByValCommandStringAsString),FunctionSetCopyNumber(ByValCopyNumberAsInteger),参数需要指明ByVal还是ByRef,这一点写起来会让程序边长,但非常必要。如果没有特别情况,都使用ByVal。参数的命名方法,参考后面“变量的命名方法”。需要重载的方法,一般不写Overloads,根据需要编写重载的方法。2.属性:原则上,字段(Field)是不能公开的,要访问字段的值,一般使用属性。属性以简洁清晰的名词命名:PropertyConcentrationAsSingle,PropertyCustomerAsCustomerTypes3.事件:事件是特殊的属性,只能在事件处理上下文中使用。命名的原则一般是动词或动词的分词,通过时态表明事件发生的时间:EventClickAsClickEventHandler,EventColorChangedAsColorChangedEventHangler变量和常数常数以表明常数意义的名词命名,一般不区分常数的类型:ConstDefaultConcentrationAsSingle=0.01,在严格要求的代码中,常数以c_开头,如c_DefaultConcentration,但最好不要用它,它会带来输入困难。普通类型的变量,只要用有意义的名字命名即可,不可使用简称和无意义的名称诸如A,x1等,下面给出了良好的例子:DimIndexAsIntegerDimNextMonthExpenditureAsDecimalDimCustomerNameAsString不能起太长的名字,应该尽量简洁,如下面的例子:DimVariableUsedToStoreSystemInformationAsString'*错误,太复杂了DimSystemInformationAsString'*正确,简单明了DimsysInfoAsString'*错误,过于简单特殊情况可以考虑一个字母的变量:DimgAsGraphic对于控件,应该指明控件的类型,方法是直接在变量后面加以类名:FriendWithEventsNextPageButtonAsButton'*按钮FriendWithEventsColorChoicerPanelAsPanel'*面版FriendWithEventsCardFileOpenDialogAsFileOpenDialog'*文件打开对话框等等,无需规定某种类型的变量的前缀,只需把类型写在后面就行了,试对比下列代码:btnCancel.Text="&Cancel"CancelButton.Text="&Cancel"显然后者更能使阅读者明白变量的类型是一个按钮。Main函数代码intmain(intargc,char*argv[]){ QApplicationa(argc,argv); QApplication::addLibraryPath("./plugins"); QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312")); QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312")); QApplication::addLibraryPath("./sqldrivers"); QDataBase*p=QDataBase::GetInstance(); p->ConnectDataBase(); QLoadMangerdlg; if(dlg.exec()!=QDialog::Accepted) return0; QMealw; w.show(); returna.exec();}

详细设计数据库模块功能设数据库模块主要包括用户管理、菜品管理、会员管理三大部分,这三大部分都需要将数据保存到数据库,所以都归结到了数据库模块中。其中用户管理模块主要是包括用户的注册和用于用户登录的验证功能;而菜品管理模块主要是实现对菜品的添加,对菜品的修改,对菜品的删除三大功能;同样会员管理也主要是实现对会员添加,对会员的修改,以及对会员的删除。图5-1登录模块功能设计登录模块主要实现的功能就是对系统管理员用户的注册以及对已经注册的用户进行用户信息验证,用来完成用户登录模块。图5-2点餐模块功能设计点餐模块主要包括四个功能:用户点餐、呼叫服务、结账、更新菜单。用户点餐主要是用户用来从菜单上进行菜品选择,这个功能包括了用户对菜品的选择,既选择菜单;下单,既将选择的菜单同步到厨房客户端中,告诉厨房需要做那些菜;提交菜单,既将菜单提交到了服务器中,主要是用来进行菜品的登记以及菜价的求和等操作。呼叫服务主要是呼叫服务员,这个是需要在柜台上进行一下设置,所以在软件中这个功能没有详细实现,只是留下了实现端口。结账功能现在以及实现了自动算账功能,这个功能也是需要在柜台上留下一个实现端口,在投入使用后直接在柜台电脑实现即可。更新菜单是将菜单从服务器中同步到点菜客户端中,每次系统重启后必须选择一下更新菜单,这样才能实现点菜客户端的更新。图5-3服务器模块功能设计服务器模块式最主要的模块,这个模块其实包括了上面的数据库模块,但是还有一些其他功能模块包括在其中,这就是我整个系统的后台服务器模块,所有需要后台进行的运算都在这个模块中实现。这个服务器模块主要还是包括了用户登录模块和数据库模块量大部分。登录模块主要实现的功能就是对系统管理员用户的注册以及对已经注册的用户进行用户信息验证,用来完成用户登录模块。数据库模块主要包括用户管理、菜品管理、会员管理三大部分,这三大部分都需要将数据保存到数据库,所以都归结到了数据库模块中。其中用户管理模块主要是包括用户的注册和用于用户登录的验证功能;而菜品管理模块主要是实现对菜品的添加,对菜品的修改,对菜品的删除三大功能;同样会员管理也主要是实现对会员添加,对会员的修改,以及对会员的删除。同时还有一个呼叫功能在服务器模块中进行了实现,该功能主要就是实现将用户的点餐过程进行一个记录,所有的点餐呼叫都是会记录到系统中的,点击呼叫中心就可以进行呼叫记录的查看。图5-4厨房模块功能设计厨房客户端的设计主要是实现接受订单功能和对所点产品的删除功能实现,厨房客户端在未进行点菜时候是没有显示任何菜品的,当在点菜客户端进行点菜后点击提交按钮后就可以把所点菜品提交到厨房客户端。图5-5数据库模块设计与实现数据库模块设计单例模式:单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。本论文中对数据库进行封装成QDatabase类,采用单例模式,提供全局唯一实例化接口: staticQDataBase*GetInstance() { staticQDataBaseinstance; return&instance; }QDatabase对数据库的操作提供接口,例如用户登录模块中的添加用户、修改用户、检验用户是否存在提供对应的接口: void AddUser(constUserInfo&info); void ModifyUser(constUserInfo&info); bool ExistUser(constUserInfo&info);数据库模块实现图5-6登录模块设计与实现登录模块设计登陆模块的功能就是验证用户名及密码是否有效,同时提供用户注册功能。登陆模块代码voidQLoadManger::OnLoad(){ UserInfoinfo; info.strName=m_pEdtName->text(); info.strPasswd=m_pEdtPassword->text(); QDataBase*p=QDataBase::GetInstance(); if(!p->ExistUser(info)) { QMessageBox::warning(this,tr("MealSever"), tr("用户名或者密码错误!" ), QMessageBox::Ok); reject(); } else { accept(); }注册模块代码voidQLoadManger::OnRegister(){ if(!m_pDlgRegister) return; if(m_pDlgRegister->exec()==QDialog::Accepted) { UserInfoinfo; m_pDlgRegister->GetUserInfo(info); QDataBase*p=QDataBase::GetInstance(); p->AddUser(info); } QMessageBox::warning(this,tr("MealSever"), tr("注册完成!" ), QMessageBox::Ok);}点餐模块设计与实现点餐模块设计点餐模块是系统中重要的模块,主要实现客户餐单的创建以及所点菜品的保存,该模块的实现思路是首先系统分类显示今日特价、凉菜、热菜、汤类、酒水、饮料,客人按照所需登记桌位,选择菜品及分数(默认1份),系统自动计算总金额,如果有误客人则可以删除某类菜品,最后点击提交保存到数据库。那么该模块实现的前提条件是用户以服务员身份登录到系统,且数据库中有相应的菜品信息以及一定数量的桌位。点餐模块主要包括四个功能:用户点餐、呼叫服务、结账、更新菜单。用户点餐主要是用户用来从菜单上进行菜品选择,这个功能包括了用户对菜品的选择,既选择菜单;下单,既将选择的菜单同步到厨房客户端中,告诉厨房需要做那些菜;提交菜单,既将菜单提交到了服务器中,主要是用来进行菜品的登记以及菜价的求和等操作。呼叫服务主要是呼叫服务员,这个是需要在柜台上进行一下设置,所以在软件中这个功能没有详细实现,只是留下了实现端口。结账功能现在以及实现了自动算账功能,这个功能也是需要在柜台上留下一个实现端口,在投入使用后直接在柜台电脑实现即可。更新菜单是将菜单从服务器中同步到点菜客户端中,每次系统重启后必须选择一下更新菜单,这样才能实现点菜客户端的更新。表5-1点餐模块输入输出数据数据数据输出类型数据类型约束菜名输出字符串类型长度小于50价格输出字符串类型长度小于50图片输出二进制类型桌号输入字符串类型长度小于50菜名编号输入数字份数输入数字下图为点菜客户端的类图图5-7点餐客户端代码QOrder::QOrder(QWidget*parent,Qt::WFlagsflags) :QMainWindow(parent,flags){ ui.setupUi(this);}QOrder::~QOrder(){}服务器模块设计与实现服务器模块设计与实现下图为服务器的类图图5-8服务器代码QMeal::QMeal(QWidget*parent) { setIconSize(QSize(50,50)); QMenuBar*pMenuBar=menuBar(); QMyIconStyle*pMyIconStyle=newQMyIconStyle;以下为菜品管理代码部分,主要是实现对菜品的管理,首先可以实现添加新菜品,而且可以对添加的新菜品进行修改和删除,但是不管进行什么操作都必须要进行一下提交修改才可以同步到服务器中代码如下: QMenu*pMenu=pMenuBar->addMenu(tr("菜品管理")); //pMenu->setStyle(pMyIconStyle); //pMenu->setFixedSize(QSize(60,60)); //pMenu->setIcon(QIcon(tr(":/images/dinnerManager.png"))); QAction*pAct=pMenu->addAction(tr("菜品管理")); connect(pAct,SIGNAL(triggered(bool)),this,SLOT(OnMealMangerClicked())); pAct=pMenu->addAction(tr("添加新菜品")); connect(pAct,SIGNAL(triggered(bool)),this,SLOT(OnAddMeal())); pAct=pMenu->addAction(tr("修改当前菜品")); connect(pAct,SIGNAL(triggered(bool)),this,SLOT(OnModifyMeal())); pAct=pMenu->addAction(tr("删除当前菜品")); connect(pAct,SIGNAL(triggered(bool)),this,SLOT(OnDeleteMeal())); pAct=pMenu->addAction(tr("提交更改")); connect(pAct,SIGNAL(triggered(bool)),this,SLOT(OnSubitMealChanges()));以下为会员管理代码部分,主要是实现对会员的管理,首先可以实现添加新会员,而且可以对添加的新会员进行修改和删除,但是不管进行什么操作都必须要进行一下提交修改才可以同步到服务器中代码如下: pMenu=pMenuBar->addMenu(tr("会员管理")); //pMenu->setStyle(pMyI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论