摘要
时代在进步,科技在发展,当今时代网络已经成了我们生活中一个不可或缺的部分。网络的发展也给我们带来了无限的商机与便利,有人可以足不出户就赚钱,有人可以足不出户就买到想买的东西、订票等等。在餐饮业,网络也同样能够发挥它巨大的作用—网上订餐管理系统。
网上订餐管理系统旨在通过网站的形式实现想要订餐的用户的订餐过程。本课题基于Web2.0,使用ASP.NET2.0实现B/S模式的订餐系统。用户通过访问餐馆的网站就能够看到该餐馆的菜肴种类、价格等信息,从而做出订餐的决定,然后使用唯一的账号登陆,通过一定的支付方式来付款,仅需几分钟就完成了一次订餐。而餐馆也能够及时地看到用户在自己餐馆网站上下的订单,从容准备,及时送达用户指定的就餐地点。相比一般的电话订餐方式,网上订餐不仅给用户节省了大量电话询问时间和电话费,也为餐馆提供了收款保障,餐馆可以选择网上银行或是充值系统等的预先付款方式,也可以选择货到付款的方式。在信息的准确性方面,网上订餐也比电话订餐高出一等,网上订餐则是由用户自己填写,不太容易造成错误。
关键词:网上订餐,B/S
ABSTRACT
When the era is going ahead, the technology developing quickly, the Internet has become a prerequisite part of our life. The development of the internet has brought us infinite opportunity of business and advantages of life. People can earn, buy things they need, order tickets and so on without going out. In the eatery area the internet can also play an important role which can be called” The System of Dinner-Order through the Internet”.
“The system of dinner-order through the Internet“aims at realizing the process of dinner order in the form of website. This paper bases on Web2.0; uses ASP.NET 2.0 to realize the system of dinner-order through the internet of B/S module. The user who wants to order dinners can see the information of dish such as kinds, price, and introduction through suffering the website which contains the system, and then decides to order or not. After entering the system with his unique account, paying for the dinner through some way, he can finish the order in several minutes. And the eatery can see the orders which are delivered by the users quickly, prepare for the dinner leisurely, and send it to the destinations which are appointed by the users. Compare to the common dinner-order way, dinner-order through telephone, dinner-order through the Internet not only saves a mass of time and telephone fee to ask, but also offers the eatery the protection of receiving the payment. The eatery can choose both payoff beforehand as Net-Bank or Recharge System, and payoff after the dinner has sent to the destination. In the aspect of veracity of information, dinner-order through the internet is advantaged because its information is written by the users themselves and can not go wrong easily.
Key Words: Dinner-Order through the internet, B/S
目 录
1. 引言 .............................................................................................................................. 1
1.1项目背景 .............................................................................................................. 1
1.2国内外现状 .......................................................................................................... 1
1.3项目意义 .............................................................................................................. 2
2. 相关技术介绍 .............................................................................................................. 3
2.1 Web 2.0技术 ........................................................................................................ 3
2.2 ASP.NET技术 ..................................................................................................... 5
2.3 AJAX技术 ........................................................................................................... 6
2.4 SQL Server 2005技术 ......................................................................................... 8
3. 系统功能分析与概要设计 ........................................................................................ 10
3.1 功能分析 ........................................................................................................... 10
3.2 界面设计 ........................................................................................................... 14
3.3 数据库设计 ....................................................................................................... 15
4. 系统详细设计与编码实现 ........................................................................................ 18
4.1 管理员模块 ....................................................................................................... 18
4.2 会员模块 ........................................................................................................... 23
4.3 公共模块 ........................................................................................................... 27
5. 系统测试 .................................................................................................................... 28
5.1 测试计划制定 ................................................................................................... 28
5.2 测试用例设计与执行 ....................................................................................... 28
5.3 测试报告 ........................................................................................................... 30
6. 总结 ............................................................................................ 错误!未定义书签。 致谢 ................................................................................................. 错误!未定义书签。
参考文献 ......................................................................................................................... 33
1. 引言
1.1项目背景
时代在进步,科技在发展,当今时代网络已经成了我们生活中一个不可或缺的部分。网络的发展也给我们带来了无限的商机与便利,有人可以足不出户就赚钱,有人可以足不出户就买到想买的东西、订票等等。在餐饮业,网络也同样能够发挥它巨大的作用—网上订餐管理系统。
“民以食为天”,餐饮业系百业之首。中国加入WTO后,我国餐饮业己形成了高中低档多层次,东西南北菜系多样化,中西餐相互补充的格局。与此同时,一些先进的餐饮管理技术也进入中国。目前,网络热潮正冲击着我们生活的方方面面。具体到餐饮业网络营销,网上订餐是一种主要的形式。网上订餐分为两种类型,一种是通过英特网预订某饭店的席位及菜品,另外一种是通过英特网预订某饭店的菜品,并由该餐厅负责送货上门。本课题就是要实现后者,通过实现网上订餐,以期能从互联网技术方面为餐饮业提供强大的动力,促进餐饮业的蓬勃发展。
1.2国内外现状
在我国,网上订餐最早出现在20世纪90年代末期,98年广州等大城市己出现网上订餐业务。2000年7月,北京丽华快餐公司为了探索餐饮业网络经营的道路,寻求新的经济增长点,也推出了网上订餐,成为探索网上订餐的先驱。
2003年非典之后,为尽快恢复遭受非典疫情严重影响的餐饮业和住宿业的发展,全面振兴我国餐饮业和住宿业。2003年7月30日,商务部制订了《全国餐饮业和住宿业振兴计划》,开展网上订餐服务等拓展服务领域措施作为振兴计划的主要内容被提了出来。随后,一些餐饮公司纷纷在自己的网站上开设了网上订餐业务。
目前网上订餐已逐渐普及,特别是在快餐业发达的东部地区。但目前网上订餐在我国并未成气候,很多大的餐饮公司网上订餐业务经营惨淡,很多网站每天只有几十份,经营较好的也只有几百份。如果单纯依靠网上订餐,公司根本无法生存。相反,一些小的个体饮食店老板巧妙地利用QQ、MSN等即时通信软件作为网上订餐工具,却取得了相当不错的效益。他们随着网上订餐业务的扩大,建立了自己的订餐网站,但最初单纯的网上订餐却发展成了网上送花、网上送票等的网上送货网站或者综合类的饮食网站,已经偏离了网上订餐的初衷[4]。
在美国,食品网(www.aIhUaU.com是目前美国网上订餐行业中的先驱。设在三藩市的食品网在99年已服务于全美一万三千间餐馆,有七十万的网上消费者。任
1
何消费者只要轻松上网,输入邮区号码,就可以了解到在周围有哪些餐馆提供网上送餐服务,并可以浏览到这些餐馆的菜单,做出预订。仅在二分钟内,预订者就可以通过电子邮件得到确定。再过一会,就可以收到所订的美食了。食品网发言人说:在参加该公司网上联网销售的餐馆中,网上订餐的数量实际上比普通的电话订餐高出22%。此外,网上订餐中多功能性的服务还可以让消费者从容地上网浏览餐馆的菜单,或进行价格上的比较,来选择所需要的美食佳肴。目前,通过上网提供外卖和送餐服务的餐厅多于独立餐馆经营者,外卖与送餐服务占餐饮生意额的一半以上。全美餐饮消费者越来越趋向于使用网上订餐的形式来购买外卖,特别是年轻一族的消费者。显而易见,网上订餐将成为餐馆业扩大生意的金矿源,有眼光的餐馆业主应该尽早考虑如何利用英特网上网销售。对于网上预订餐位,三藩市一家餐厅的总经理说该餐厅每周至少可以接到20个网上订餐。不过,他认为网上订餐最有价值的地方是大大地方便了消费者。因为如果通过电话订餐,往往会遇上电话线繁忙、占线的问题,客人也因此会另外选择其它店家。如今,使用网上订餐,这些问题不仅迎刃而解,而且客人什么时候想订餐位都可以,凌晨三四点都不成问题了。据资料报道,国外一些高档的餐厅有的不准备采用网上订购后送餐的服务方式,但是他们会偏向于利用英特网提供预订餐位的服务。如三藩市的entable.com完全利用英特网预订取代了传统的前台用纸用笔接受预订的方法。网上订餐带来了方便、实惠和个性化[3]。
总的说来,单独的网上订餐还不足以支撑网站的经营。目前的状况是规模大的不盈利,小的有盈利。原因是规模大的范围广,运营成本高,规模小的由于运营成本低,客户群相对稳定,故有一定的利润空间。
1.3项目意义
网上订餐业务的兴起, 折射出餐饮业善抓机遇、抢占利润第二落点的经营理念,同时也显示出消费者在日常所需中, 运用网络观念的意识正逐渐增强。但比起如今火爆的网上购物, 网上订酒店住宿等服务, 网上订餐服务在一些餐饮企业中仍未引起足够的重视, 对于消费者来说, 许多人对这一新兴业务尚缺乏了解。但因这种消费方式顺应了当前信息社会的快捷、便利等趋势, 网上订餐仍存在着广阔的发展空间。网上订餐的发展也将给餐饮业带来勃勃的生机。
2
2. 相关技术介绍
2.1 Web 2.0技术
Web2.0的概念最早是去年在美国提出来的,通过Blog口口相传,网上很多IT人士试图都在给 Web2.0 一个具体的定义,事实上却很难。
2.1.1 Web2.0 概述
Web2.0是为了区别于过往的以门户为代表的 Web1.0的称呼,Web2.0只是一个符号,它表明的是正在变化中的互联网,这些变化相辅相成,彼此联系在一起,它让社会性、用户、参与和创作这些元素浮出水面成为互联网文化的中坚力量。
Web2.0的最大特点是个人化、去中心化,同时强调社会化,强调开放、共享, 强调参与、创造。基本上Web2.0的绝大部分服务都存在一个个人标识明确的页面。Web2.0的最大改变就是普通人开始改变、创造网络,草根性质的、或者说更准确的说法是非专业、业余性质的参与。需要说明的是草根并不是是社会底层。 Web2.0要凸现每个用户的价值,每个人在互联网上都可以创造自己的价值。
2.1.2 Web2.0的技术与典型应用
? RSS ,这个是Web2.0标杆式的技术,它以XML为基础,是站点用来和其他站点之间共享内容的一种简易方式(也叫聚合内容),通常被用于新闻和其他按顺序排列的网站, 例如Blog。一段项目的介绍可能包含新闻的全部介绍等。或者仅仅是额外的内容或者简短的介绍。这些项目的链接通常都能链接到全部的内容。网络用户可以在客户端借助于支持RSS的新闻聚合工具软件( 例如 Sharp Reader, News Crawler, Feed Demon),在不打开网站内容页面的情况下阅读支持RSS输出的网站内容。网站提供RSS输出,有利于让用户发现网站内容的更新。
? XML ,Web2.0的基础技术,原来作为HTML的父集出现,现在以其为基础的周边应用越来越多,比如XSL、RSS、Ajax 等。
? Ajax ,很旧的技术,采用 Javascript+XML,克服了以往页面更新请求将所有页面内容重新提交到了服务器, 然后再由服务器重新升成整个页面的低效率方式,Ajax通过XML技术将只向服务器请求更新的数据,然后通过Javascript 技术在客户端运算生成整个页面, 这种技术可以提高数据传输效率,增强用户体验。
? Trackback ,Trackback中文称作“引用通告”,简称“引用”。用处就是通知被你所引用的日志,你引用了它。这样Blog之间就通过Trackback互相连接了起来,因此有人将之称为“思想的桥梁”。
? Tag ,Tag是什么,网上目前也没有一个准确的说法,但是大家都能按照自己的方式去用,其实Tag就是一个文章或者一个Blog的标签,这个标签命名可以
3
来自关键词,也可以来自分类,作为关键词标记,你可以用几个关键词来概括你的文章或者Blog,这个关键词可以是文章中出现过的,也可以是没有的,作为分类标记,Tag又不同于一般的目录结构的分类方法,可以自由地不考虑目录结构的给文章进行分类,各个Tag之间的关系是一种平行的关系但是又可以根据相关性分析,将经常一起出现的Tag关联起来,而产生一种相关性的分类。前面我们提到的RSS、Ajax和Trackback也可以说是Web2.0的Tag。
? Blog ,Web2.0时代最典型代表的应用就是Blog,Blog是Weblog的简写,翻译成中文叫网上日志,Blog是一种平台,也是一种技术,更是一种思潮,Blog是管理个人内容的一种工具。Blog是以 WEB( 网页)方式显示和发布,借助于互联网,人们就可以彼此分享自己的经验、想法、感受等,并由此形成一种新型的网络虚拟社群和人际交往方式。
? Wiki ,Wiki一词来源于夏威夷语的“weekee”,原本是“快点”的意思。在这里 Wiki指的是一种网上共同协作的超文本系统,可由多人共同对网站内容进行维护和更新。我们可以通过网页浏览器对Wiki文本进行浏览、创建、更改,而且创建、更改、发布的代价远比HTML文本为小,您并不需要懂得HYTML代码,只要简单了解少量的Wiki的语法的约定,您就可以在系统中发布您的页面。与其它超文本系统相比,Wiki有使用方便及开放的特点,所以Wiki系统可以帮助我们在一个社群内共同收集、创作某领域的知识,发布大家都关心和感兴趣的话题。
? SNS ,SNS即Social network software的英文缩写, 即社会性网络软件, 社会性网络软件依据六度理论,以认识朋友的朋友为基础,扩展自己的人脉。并且无限扩张自己的人脉,在需要的时候,可以随时获取一点,得到该人脉的帮助。SNS网站,就是依据六度理论建立的网站,帮你运营朋友圈的朋友。六度关系理论:美国著名社会心理学家米尔格伦 (Stanley Milgram)于20 世纪60年代最先提出,在人际脉络中,要结识任何一位陌生的朋友,这中间最多只要通过六个朋友就能达到目的。就是说你想认识一个人,托朋友找朋友,找认识他的人,之间不会超过六个人。
? 网摘 , 网摘就是一种在网上保存网页链接的服务,通俗的说就是一个放在网络上的海量收藏夹。网摘服务作为一种个人的信息整理平台,基于它在网络上的这一独特的优势,它能提供很多本地收藏夹所不能提供的功能。其核心价值已经从保存浏览的网页,发展成了一个新的信息共享的中心,能够真正做到“共享中收藏、收藏中分享”。如果每日使用网摘的用户数量较大,用户每日提供的链接收藏数量足够,网摘站就成了汇集各种新闻链接的门户网站。国外代表网站有Delicious,国内有365key.com。
? Podcast,中文译名尚未统一,但最多的是将其翻译为“播客”。它是数字广播技术的一种, 出现初期借助一个叫“iPodder”的软件与一些便携播放器相结
4
合而实现。Podcasting录制的是网络广播或类似的网络声讯节目,网友可将网上的广播节目下载到自己的 iPod、MP3播放器或其它便携式数码声讯播放器中随身收听,不必端坐电脑前,也不必实时收听,享受随时随地的自由。更有意义的是,你还可以自己制作声音节目,并将其上传到网上与广大网友分享。就像博客颠覆了被动接受文字信息的方式一样,播客颠覆了被动收听广播的方式,使听众成为主动参与者。
? IM,即时通讯(Instant Messenger,简称IM)软件可以说是目前我国上网用户使用率最高的软件。聊天一直是网民们上网的主要活动之一,网上聊天的主要工具已经从初期的聊天室、论坛变为以MSN、QQ为代表的即时通讯软件。大部分人只要上网就会开着自己的MSN或QQ。作为使用频率最高的网络软件,即时聊天已经突破了作为技术工具的极限,被认为是现代交流方式的象征,并构建起一种新的社会关系。它是迄今为止对人类社会生活改变最为深刻的一种网络新形态,没有极限的沟通将带来没有极限的生活。
2.2 ASP.NET技术
ASP.NET是微软提供的新一代的Web开发平台,它为开发人员提供了生成企业级Web应用程序所需要的服务、编程模型和软件基础结构,同其他Web开发平台相比,ASP.NET具有下面三大优势。
2.2.1支持编译型语言
目前流行的几种脚本语言比如VBScript、JavaScript和ASP等都有两个主要的缺点。第一,不支持强数据类型。在JavaScript中定义变量只有一个关键字var,使用var关键字定义的变量,如果赋值是字符串,该变量就是字符串变量;如果赋值是整数,则该变量就是整型变量。在VBScript和ASP中,定义变量只通过一个关键字DIM,该变量也没有具体的类型。第二,脚本语言是解释型的。通常情况下,解释型的脚本语言在性能上抵不上编译型的语言。
自推出.NET开发平台以来,微软在Web服务器端开发语言方面,主推VB.NET和C#.NET这两种编译型语言。通过这两种开发语言,程序员可以像开发普通的Windows程序一样来开发Web程序,只不过在Windows程序中用于开发GUI界面的各种控件,在Web程序开发中也有它们相应的Web版本。
程序员通过C#语言,利用VS.NET提供的各种Web控件,可以非常容易地开发ASP.NET Web程序。开发的ASP.NET程序被编译成MSIL语言,这种中间语言具有平台无关性,而且,由于ASP.NET页面在执行前会被编译,所以ASP.NET的性能得到了很大的提高。
2.2.2程序代码与页面内容的成功分离
通常的动态网页开发,往往是在一个网页上混合多种脚本语言。比如在HTML脚本语言上可以嵌入JavaScript或VBScript等客户端脚本语言,也可以同时嵌入
5
ASP或JSP等服务器端脚本语言。这种多语言混合的Web开发模式通行已久,但是它的代码可读性很差,程序代码同页面内容混合在一起,程序员要在多种语言的思维上频繁切换,如果程序很复杂的话,这种开发模式非常不利于程序的开发,而且日后的维护也将成为大问题。
ASP.NET Web开发技术为程序员提供了一种非常好的开发模式,即Code Behind技术,它通过Web控件将程序代码与页面内容成功分离,从而使ASP.NET的程序结构异常清晰,开发和维护的效率也得到了很大的提高。另外可以利用Visual Studio.NET集成环境下开发ASP.NET应用程序,该环境不仅提供了强大的调试能力,而且还集成了“所见即所得”的HTML编辑器,为开发人员开发Web页面提供了方便的图形化支持。
2.2.3引入服务器端控件
在ASP中,可以给页面手动添加HTML控件,对这些控件的响应有两种办法。一种是在客户端的脚本语言中响应用户对这些控件的输入,另一种是把该页面提交给服务器。这两种办法都存在问题,第一种办法产生的问题是不同的浏览器以不同的方式执行客户端脚本语言,我们很难编写在多种浏览器上都能良好运行的复杂的Web页面。第二种办法存在的问题是,如果我们把Web页面重新提交给服务器,那么Internet的无状态特性就会导致页面上存储在变量中的信息丢失,除非我们编写了复杂的代码,把它们存储在HTML元素或URL查询字符串中。
ASP.NET通过服务器控件解决了上述问题。服务器端控件会生成发送给浏览器的HTML代码,显示控件,它们还能生成隐藏的HTML元素来存储它们当前的状态。在提交页面时,这些信息就会传送回服务器,控件将自动处理这些信息,改变HTML,显示控件[11]。
2.3 AJAX技术
AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。
2.3.1与传统的web应用比较
传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然后返回一个新的网页。这个做法浪费了许多带宽,因为在前后两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。
与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,
6
所以Web服务器的处理时间也减少了。
2.3.2 Ajax应用程序的优势
? 通过异步模式,提升了用户体验
? 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
? Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。
2.3.3 优点和缺点
使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。
Ajax不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。就像DHTML应用程序那样,Ajax应用程序必须在众多不同的浏览器和平台上经过严格的测试。随着Ajax的成熟,一些简化Ajax使用方法的程序库也相继问世。同样,也出现了另一种辅助程序设计的技术,为那些不支持JavaScript的用户提供替代功能。
对应用Ajax最主要的缺点就是,它可能破坏浏览器后退按钮的正常行为。在动态更新页面的情况下,用户无法回到前一个页面状态,这是因为浏览器仅能记下历史记录中的静态页面。一个被完整读入的页面与一个已经被动态修改过的页面之间的差别非常微妙;用户通常都希望单击后退按钮,就能够取消他们的前一次操作,但是在Ajax应用程序中,却无法这样做。不过开发者已想出了种种办法来解决这个问题,当中大多数都是在用户单击后退按钮访问历史记录时,通过建立或使用一个隐藏的IFRAME来重现页面上的变更。
2.3.4 Ajax的工作原理
Ajax的核心是JavaScript对象XmlHttpRequest。该对象在Internet Explorer 5中首次引入,它是一种支持异步请求的技术。简而言之,XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。
在创建Web站点时,在客户端执行屏幕更新为用户提供了很大的灵活性。下面是使用Ajax可以完成的功能:
? 动态更新购物车的物品总数,无需用户单击Update并等待服务器重新发送整个页面。
? 提升站点的性能,这是通过减少从服务器下载的数据量而实现的。例如,在某购物车页面,当更新篮子中的一项物品的数量时,会重新载入整个页面,这必须下载整个页面的数据。如果使用Ajax计算新的总量,服务器只会返回新的总量值,因此所需的带宽仅为原来的百分之一。 消除了每次用户输入时的页面刷新。
7
例如,在Ajax中,如果用户在分页列表上单击Next,则服务器数据只刷新列表而不是整个页面。
? 直接编辑表格数据,而不是要求用户导航到新的页面来编辑数据。对于Ajax,当用户单击Edit时,可以将静态表格刷新为内容可编辑的表格。用户单击Done之后,就可以发出一个Ajax请求来更新服务器,并刷新表格,使其包含静态、只读的数据[12]。
2.4 SQL Server 2005技术
SQL Server 是一个全面的、集成的、端到端的数据解决方案,它为企业中的用户提供了一个安全、可靠和高效的平台用于企业数据管理和商业智能应用。
2.4.1 SQL Server 数据平台
SQL Server 2005 为IT专家和信息工作者带来了强大的、熟悉的工具,同时减少了在从移动设备到企业数据系统的多平台上创建、部署、管理及使用企业数据和分析应用程序的复杂度。 通过全面的功能集、和现有系统的集成性、以及对日常任务的自动化管理能力,SQL Server 2005 为不同规模的企业提供了一个完整的数据解决方案。图1显示了SQL Server 2005数据平台的组成架构。
2.4.2 SQL Server 支持工具
关系型数据库: 安全、可靠、可伸缩、高可用的关系型数据库引擎,提升了性能且支持结构化和非结构化(XML)数据。
? 复制服务: 数据复制可用于数据分发、处理移动数据应用、系统高可用、企业报表解决方案的后备数据可伸缩存储、与异构系统的集成等,包括已有的Oracle数据库等。
? 通知服务: 用于开发、部署可伸缩应用程序的先进的通知服务能够向不同的连接和移动设备发布个性化、及时的信息更新。
? 集成服务: 可以支持数据仓库和企业范围内数据集成的抽取、转换和装载能力。
? 分析服务: 联机分析处理(OLAP)功能可用于多维存储的大量、复杂的数据集的快速高级分析。
? 报表服务: 全面的报表解决方案,可创建、管理和发布传统的、可打印的报表和交互的、基于Web的报表。
? 管理工具: SQL Server 包含的集成管理工具可用于高级数据库管理和调谐,它也和其他微软工具,如MOM和SMS紧密集成在一起。标准数据访问协议大大减少了SQL Server和现有系统间数据集成所花的时间。此外,构建于SQL Server内的内嵌Web service支持确保了和其他应用及平台的互操作能力。
? 开发工具: SQL Server 为数据库引擎、数据抽取、转换和装载(ETL)、数据挖掘、OLAP和报表提供了和Microsoft Visual Studio? 相集成的开发工具,
8
以实现端到端的应用程序开发能力。SQL Server中每个主要的子系统都有自己的对象模型和API,能够以任何方式将数据系统扩展到不同的商业环境中。
2.4.3 SQL Server 2005的特点与优势
? 充分利用数据资产: 除了为业务线和分析应用程序提供一个安全可靠的数据库之外,SQL Server 2005也使用户能够通过嵌入的功能,如报表、分析和数据挖掘等从他们的数据中得到更多的价值。
? 提高生产力: 通过全面的商业智能功能,和熟悉的微软Office系统之类的工具集成,SQL Server 2005为组织内信息工作者提供了关键的、及时的商业信息以满足他们特定的需求。SQL Server 2005目标是将商业智能扩展到组织内的所有用户,并且最终允许组织内所有级别的用户能够基于他们最有价值的资产——数.提供了工业上最低的规划、实现和维护成本,使数据库投资能快速得到回报[13]。
9
3. 系统功能分析与概要设计
3.1 功能分析
本网上订餐管理系统共涉及了三种类型的角色,包括:管理员、注册会员(以下简称会员)和游客。故在功能上也根据这三种角色划分了三种类型的功能。每种功能都需要有相应的角色权限才能使用,比如说游客不能使用会员的一些功能,而会员也不能使用管理员的一些功能,但是游客的功能是会员和管理员都可以使用的。下面将一一介绍。
3.1.1 管理员功能
在用户登陆时可以选择账户的类型,如果选择了管理员的话,则系统将从数据库中判断该用户是否为管理员,如果是的话则跳转到管理员专有的页面上进行操作。(见图3 - 1到
3 - 4)
图 3 - 1 管理员选择管理员类型登陆
图 3 - 2 管理员登陆后的页面头部分
10
图 3 - 3 会员选择管理员类型登陆
图 3 - 4 会员选择管理员类型登陆后的产生错误
管理员功能主要分为以下几个大的部分,首先,最重要的是订单的管理,在该项功能中包含了对当前待处理的定单的处理、查看、排序、删除(见图3 - 5),以及对已处理的历史订单的查看、排序等(见图3 - 6和3 - 7)。
图 3 - 5 所有待处理的定单
图 3 - 6 所有已处理的定单
图 3 - 7 点击“详情”后显示的订单详情(未处理定单中同)
其次,菜品管理也是重要的一个部分。在菜品管理中包括了添加、删除和修改菜品。(见图3 - 8和3 - 9)
管理员通过点击按钮来添加菜品,每个菜品都可以添加有自己的名称、价格、图片和介绍等信息(见图3 - 10)。
图 3 - 8 菜品管理部分功能
11
图 3 - 9 修改菜品信息
图 3 - 10 点击“添加新菜”后的添加菜品
最后的一个部分就是会员的管理。在该功能中,管理员可以查看每个会员的所有订单,对每个订单还能看到他订了些什么、消费了多少等等。 (见图3 - 11)
图 3 - 11 会员管理操作
管理员功能部分的结构图如下图所示:
3.1.2 会员功能 图 3 - 12 管理员功能结构图 在会员功能中,最重要的就是点菜功能了。因此将点菜页面作为了系统的主页,一经登陆就可以看到主页上的热门菜、新品上市和选菜下订单部分。(见图 3 -
13)会员只需点击每个菜品片下面的按钮,就可以将该菜品加入购物车中,然后在页面的底部也将动态地显示出当前购物车中的物品、数量及价格,也
12
可以删除。(见图 3 - 14)在会员认为完成了点菜之后,点击
电话等信息。(见图3 - 15) 按钮,就会显示出当前订单的所有详细的内容,以及要求会员填写就餐时间、地点、联系
其次,会员功能还包括了会员服务和留言反馈。在会员服务中,会员可以修改自己的基本信息,也可以看到自己所有的订单、订单的详细情况以及订单现在有没有被送出等信息。(见图3 - 16)在留言反馈中,会员可以留下对本订餐管理系统中的一些不足之处的意见和建议或者是赞美之词。(见图
3 - 17)
图 3 - 13选菜下订单主页
图 3 - 14购物车
图 3 - 15 点击“ok,去收银台后”的提交菜单
图 3 - 16会员服务页面
图 3 - 17 留言反馈页面
会员功能部分的结构图如下图所示:
13
3.1.3 游客功能 图 3 - 18 会员功能结构图 游客是指没有在本订餐管理系统中注册过的访问者。当游客访问时首先看到的是选餐的页面,游客可以选择菜品,加入购物车,当游客点击按钮时,就会显示出没有登陆的信息并要求登陆后才能使用下订单的功能。对于会员服务,游客点击进去之后所有的内容都是空的,对于留言反馈,游客点击进去之
后只能查看所有的留言而不能发表留言。(见图3 - 19)
图 3 - 19 游客点击“ok,去收银台”之后
3.2 界面设计
本系统的所有界面都采用了红色色调,美工效果比较少,整体比较简洁有序。另外像注册、登陆、收银台和添加新菜这些页面都采用了弹出式的方式,使页面看上去比较有动感。(登陆见图3 – 20,其余弹出框类似)
图 3 - 20 在点击了登陆后弹出的登陆框
3.2.1 管理员界面
在登陆时,管理员选择管理员类型登陆后,即跳转到管理员专用的页面,在管理员部分中将所有的功能分布在三个页面上:订单处理、菜品管理和会员管理。(见图3 - 21)
14
图 3 - 21 管理员页面部分
3.2.2 会员界面
在登陆时,会员选择会员类型登陆后,即跳转到会员的页面,在会员部分中也将所有的功能分布在三个页面上:选餐订餐、会员服务和留言反馈。这部分的页面和游客和页面是一样的,只不过当游客访问某些页面的时候会因为没有登陆而无法访问。(见图3 –
22)
图 3 - 22 会员页面部分
3.3 数据库设计
数据库往往是一个管理信息系统的核心,因为它存储了该系统的所有数据和信息,所以极其重要。在数据库设计中,既要关心到数据的冗余问题,又要关心到表与表之间的关系。
3.3.1 数据库结构
本系统的数据库名称为“DinnerOrder”,数据库中包含了以下几个表:FoodAndDrink, Member, MemberReback, Orders, Orders_Detail。其中FoodAndDrink表中存放了所有菜品的信息,包括:菜品ID、菜品名称、价格、介绍、种类、图片、被订次数;Member表中存放了所有会员的信息,包括会员ID、会员姓名、性别、邮箱、电话、密码、地址、类型、订餐次数、订餐总额;MemberReback表中存放了会员的反馈信息,信息ID、留言人姓名、留言标题、留言内容和留言时间;Orders表中存放了所有的订单,包括订单ID、订单会员ID、菜品数量、总额、用餐地点、订餐时间、用餐时间、状态、联系电话和处理时间;Order_Detail表中存放了每个订单的详细菜单,包括订单ID、菜品ID、每样菜品的数量、菜品名称和价钱。(图3 – 21显示了FoodAndDrink表的结构)
15
图 3 - 23
在这些表中存在一些关系:Orders表中的会员ID参考了Member表中的会员ID,Order_Detail表中的订单ID参考了Orders表中的订单ID,每个表中都是以ID作为主码的。考虑到菜品是随时要修改的,而订单的数据是要一直保存在数据库中的,所以没有将订单中的菜品ID号与FoodAndDrink中的ID号参照起来,虽然这样做产生了一定的数据冗余,但是这保证了在个性菜品信息以后,此前订单中曾经订过该菜品的数据不会丢失,这样,管理员也可以根据历史数据做出合理的安排,此外,将订单的详细数据存放在一张表中虽然有冗余,但是在一定程度上却加快了数据库表查询的速度。
3.3.2 数据库操作
数据库操作主要是指对数据库中每个表的查询、插入、修改和删除等操作。在本系统中,FoodAndDrink和Orders表包含了所有的操作,另外的三个表没有删除的操作。在插入和修改表数据的时候都必须考虑到表中字段的数据类型及完整性约束,如:非空、整型与小数、图像的二进制类型及字符串的定长与可变长度等,必须在程序中对输入的数据进行相应的转换后才可以保存到数据库中,在删除订单时候,由于Order_Detail表中参照了Order表中的ID号,所以必须进行级联删除,即删除订单的时候也删除Order_Detail表中相应订单的数据。而在其他的表中没有这样的问题,因为没有涉及到参照。
3.3.3 数据字典 数据字典
1 菜品表
A 表名
字段名
FoodID
FoodName
FoodPrice
FoodIntro
FoodKind
FoodImg FoodAndDrink 类型 备注 int 非空,自增标识 nvarchar 非空,名称 numeric 非空,价格 text 介绍 nchar 非空,类型,菜肴和酒水 image 图片
16 B 表结构
FoodOrderTimes
2 会员表 A 表名
int 初始值为0
B 表结构
Member
字段名 类型 MembID int MembName nvarchar MembGender nvarchar MembEmail nvarchar MembPhone nchar MembPwd varchar MembAddress nvarchar MembType nchar MembOrderTimes int
MembTotalMoney numeric
备注
非空,自增标识 非空,会员名 非空,性别 会员邮箱
非空,会员电话 非空
会员地址 会员/管理员
订餐次数,初始值为0
订餐消费总额,初始值为0.00
3 反馈表 A 表名
字段名 RebackID MembName RebackTitle RebackContent RebackDate
B 表结构
MembReback 类型 备注 int 非空,自增标识 nvarchar 非空,反馈者会员名 nvarchar 非空,反馈标题 text 非空,反馈内容 datetime 非空,反馈时间 Orders 类型 int int int
numeric nvarchar datetime varchar datetime varchar datetime
4 订单表 A 表名
字段名 OrderID MembID TotalNum TotalMoney
B 表结
Location
构
HaveDinnerTime PhoneNumber OrderTime Deliverd DeliverTime
5 订单详情表 A 表名
字段名
Order_Detail_ID OrderID
B 表结
FoodID
构
FoodTotalNum FoodName FoodPrice
备注
非空,自增标识
非空,外键,引用Member中ID 非空,本订单的菜品数量 非空,本订单的价格总额 非空,用餐地点 非空,用餐时间 非空,联系电话 非空,订餐时间
非空,是否已处理,默认未处理 处理的时间,未处理时为空
Order_Detail 类型 备注 int 非空,自增标识 int 非空,外键,引用Orders中的ID int 非空,菜品ID int 非空,所订该菜品的数量 nvarchar 该菜品名称 numeric 该菜品价格
表 3 - 1 数据字典
17
4. 系统详细设计与编码实现
4.1 管理员模块
管理员模块主要涉及了订单管理、菜品管理和会员管理三个部分,这个模块当中涉及的数据库操作比较多。
4.1.1 订单管理
订单管理主要对会员提交的处理工作,包含了显示订单、在订单派送后更改订单的状态和对于不合理的定单的删除。
在显示订单方面分为未处理订单和已处理订单两个部分,但是都是放在一个页面上,其中未处理订单显示在页面的最上方,有利于管理员登陆后马上就能看到并处理,使用GridView来显示数据,从数据库中把数据读到DataReader中,再建立一张DataTable,把数据放进去,最后将这张DataTable绑定到GirdView中(由于后面的数据显示基本上都是采用这种方法,所以后面不再详述)。将数据对订单的显示也有排序方式可选择,分为:按用餐的时间排序、按订餐时间排序、按订单金额排序和按菜品数量排序四种。排序方式放在DropDownList中,并启用AutoPostBack,值一经改变就马上更新显示的方式并显示。(代码如下,一些变量的定义不在其中,后面的代码都是这样)
/*
*创建gridview的数据,通过strDe_UnDe来判断是哪个
*/
protected void BindOrderUndeliverd()
{
this.gridviewOrderUndeliverd.DataSource =
CreateSourceOrder(strSelOrderUnDeliverd, "UnDe");
this.gridviewOrderUndeliverd.DataBind();
lbnNextPageUnde.Enabled = true;
lbnPrevPageUnde.Enabled = true;
if (intCurrentPageUnde == (intPageCountUnde - 1))
{
lbnNextPageUnde.Enabled = false;
}
if (intCurrentPageUnde == 0)
{
lbnPrevPageUnde.Enabled = false;
}
lblCurrentPageUnde.Text = (intCurrentPageUnde + 1).ToString(); this.updatepanelOrderUndeliverd.Update();
}
/*
*创建gridview的数据,通过strDe_UnDe来判断是哪个
18
*/
protected ICollection CreateSourceOrder(string strSelOrder, string strDe_UnDe) {
SqlCommand sqlCmd = new SqlCommand(strSelOrder, sqlConn); DataTable dtOrders = new DataTable();
dtOrders.Columns.Add("ID", typeof(int));
dtOrders.Columns.Add("MembID", typeof(int));
dtOrders.Columns.Add("MembName", typeof(string));
dtOrders.Columns.Add("TotalNum", typeof(int));
dtOrders.Columns.Add("TotalMoney", typeof(decimal));
dtOrders.Columns.Add("OrderTime", typeof(string));
dtOrders.Columns.Add("HaveDinnerTime", typeof(string)); dtOrders.Columns.Add("Location", typeof(string));
dtOrders.Columns.Add("OrderID", typeof(int));
int intStartIndex = 0;
if (strDe_UnDe == "De")
{
intStartIndex = intCurrentPageDe * intPageSize;
dtOrders.Columns.Add("DeliverTime", typeof(string)); }
else
{
intStartIndex = intCurrentPageUnde * intPageSize;
}
int i = 0, j = intStartIndex + 1;
if (sqlConn.State == ConnectionState.Closed)
{
sqlConn.Open();
}
SqlDataReader dr = sqlCmd.ExecuteReader();
while (dr.Read())
{
i++;
if (i > intStartIndex && i <= intStartIndex + intPageSize) {
DataRow drow = dtOrders.NewRow();
drow["ID"] = j++;
drow["MembID"] = dr["ID"];
drow["TotalNum"] = dr["NUM"];
drow["TotalMoney"] = dr["MONEY"];
drow["OrderTime"] = dr["OTIME"];
drow["HaveDinnerTime"] = dr["HDTIME"];
drow["Location"] = dr["ADDR"];
drow["OrderID"] = dr["ODID"];
if(strDe_UnDe == "De")
{
drow["DeliverTime"] = dr["DTIME"];
}
dtOrders.Rows.Add(drow);
}
19
if (i > (intStartIndex + intPageSize))
{
break;
}
}
dr.Close();
sqlConn.Close();
for (int k = 0; k < dtOrders.Rows.Count; k++ )
{
dtOrders.Rows[k]["MembName"] =
SelectName_ID(int.Parse(dtOrders.Rows[k]["MembID"].ToString()),
"MembID", "MembName", "Member");
}
return dtOrders.DefaultView;
}
为了实现订单处理,在负责显示的GridView中添加一个链接按钮,显示的标题栏为“更改状态”,在数据栏中显示的内容为“未送出”,管理员只要点击这个链接就可以将该订单的状态改为“已处理”。由于在GirdView中每个数据的链接按钮都是相同的,所以在这个链接按钮上使用了CommandName来绑定GridView中的OrderID,在后台中读取到这个ID,然后再更改数据库中该ID的状态。在实现显示订单详情上也采用了类似的方法,这里不再详述。(代码如下)
/*
* 点击“未送出”链接按钮后触发的修改订单的状态事件
*/
protected void lkbtnChangeStatue_Command(object sender, CommandEventArgs e) {
int intOrderIDUnde = int.Parse(e.CommandName.ToString());
string strUpdateOrderState = "UPDATE [Orders] SET Deliverd = '已送出'
WHERE OrderID = " + intOrderIDUnde + ";";
string strUpdateOrderDeliverTime = "UPDATE [Orders] SET DeliverTime =
'" + DateTime.Now.ToString() + "'
WHERE OrderID = " +
intOrderIDUnde + ";";
SqlCommand sqlcmd = new SqlCommand(strUpdateOrderState, sqlConn); SqlCommand sqlcmd2 = new SqlCommand(strUpdateOrderDeliverTime,
sqlConn);
if(ConnectionState.Closed == sqlConn.State)
{
sqlConn.Open();
sqlcmd.ExecuteNonQuery();
sqlcmd2.ExecuteNonQuery();
sqlConn.Close();
}
BindOrderDe();// 重新绑定数据
BindOrderUndeliverd();// 重新绑定数据
}
20
4.1.2 菜品管理
菜品管理主要包括添加菜品、删除和修改菜品三块内容。菜品的显示也是采用了GridView,在这前面已经详述过,这里不再叙述。添加菜品是采用了AjaxControlToolkit中的Animations组件来实现弹出的效果,关于如何实现的代码如下:
<ajaxControlToolkit:AnimationExtender id="OpenAnimation" runat="server" TargetControlID="imgbtnNewFood">
<Animations>
<OnClick>
<Sequence>
<EnableAction Enabled="false" />
<ScriptAction
Script="Cover($get('ctl00_ContentPlaceHolder1_imgbtnNewFood'),
$get('flyout'));" />
<StyleAction AnimationTarget="flyout" Attribute="display"
Value="block"/>
<Parallel AnimationTarget="flyout" Duration=".3" Fps="25"> <Move Horizontal="150" Vertical="-50" />
<Resize Width="260" Height="280" />
<Color PropertyKey="backgroundColor" StartValue="#AAAAAA"
EndValue="#FFFFFF" />
</Parallel>
<ScriptAction Script="Cover($get('flyout'), $get('info'), true);" /> <StyleAction AnimationTarget="info" Attribute="display"
Value="block"/>
<FadeIn AnimationTarget="info" Duration=".2"/>
<StyleAction AnimationTarget="flyout" Attribute="display"
Value="none"/>
<Parallel AnimationTarget="info" Duration=".5">
<Color PropertyKey="color" StartValue="#FF0000"
EndValue="#666666" />
<Color PropertyKey="borderColor" StartValue="#FF0000"
EndValue="#666666" />
<FadeIn AnimationTarget="btnCloseParent" MaximumOpacity=".9" /> </Parallel>
</Sequence>
</OnClick>
</Animations>
</ajaxControlToolkit:AnimationExtender>
以上是实现弹出式添加菜品中的弹出部分的内容,关闭部分与打开部分相似,另外还需要一些层来实现,由于比较简单,这里不再详述。AjaxControlToolkit都是采用了标签式的方式来配置各种属性,与HTML代码类似,这方便了将其嵌入HTML代码中方便使用和查看。添加菜品需要注意的问题有以下几个:一是检验信息的完整性,二是检验信息的合法性(在这部分主要是菜品价格的合法性,因为必须是数字),三是如何将图片上传到数据库中保存起来。下面一一叙述。
21
首先检验信息的完整性使用了ASP.NET中Validation中的RequiredFieldValidator控件来控制TextBox框的内容必须被填写,当点击页面上的按钮后,系统会自动触发该控件来检测需要填写的内容是否被正确地填写了,如果还有未被填写的,则按钮事件不会被触发,并将显示出预先设定好的ErrorMessage的内容。(效果如图
4 - 1)
图 4 - 1
其次信息的合法性上,添加菜品这部分涉及了价格的数字特性。在这里采用了AjaxControlToolkit中的MaskedEditExtender来控制文本框中只能被输入0至9的数字。(代码如下)
<ajaxControlToolkit:MaskedEditExtender ID="MaskedEditExtender2" runat="server" TargetControlID="tbFoodPrice"
Mask="99,999.99"
MessageValidatorTip="true"
OnFocusCssClass="MaskedEditFocus"
OnInvalidCssClass="MaskedEditError"
MaskType="Number"
InputDirection="RightToLeft"
AcceptNegative="Left"
DisplayMoney="Left"
/>
最后是图片上传到数据库中保存。在数据库存放菜品信息的表中有一个image字段,这在前面数据库设计部分已经讲到过,在SQL中,这种类型的字段是以二进制的形式来存储的,所以在上传图片的时候要将图片转化成二进制的数组,然后再将这个数组中的内容存储到数据库中进行保存。在这里使用了IO流先把图片打开到流中,再从流中将图片的信息转化为二进制并保存到字节数组中,最后在把这个字节数组中的内容存入数据库中的image字段。(代码如下)
//获得图象并把图象转换为byte[]
22
HttpPostedFile upPhoto = this.fileFoodImg.PostedFile;
System.IO.Stream PhotoStream;
int upPhotoLength;
if(0 == upPhoto.ContentLength)
{
string strPath = "~/resource/pic/NoImage.jpg";
string strPhotoPath = Server.MapPath(strPath);
PhotoStream = File.Open(strPhotoPath, FileMode.Open);
upPhotoLength = (int)PhotoStream.Length;
}
else
{
upPhotoLength = upPhoto.ContentLength;
PhotoStream = upPhoto.InputStream;
}//没有图片使用默认
byte[] PhotoArray = new Byte[upPhotoLength];
PhotoStream.Read(PhotoArray, 0, upPhotoLength);
strSql = "INSERT INTO [FoodAndDrink](FoodName, FoodPrice, FoodIntro,
FoodKind, FoodImg) VALUES('"
+ strFoodName + "'," + dubFoodPrice + ",'" + strFoodIntro + "','" +
strFoodKind + "', @foodImg)";
cmd = new SqlCommand(strSql, conn);
cmd.Parameters.Add("@foodImg", SqlDbType.Image);
cmd.Parameters["@foodImg"].Value = PhotoArray;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
4.1.3 会员管理
会员管理部分主要是显示会员以及显示会员的所有订单和订单的详细情况。显示会员信息与前面显示订单部分类似,这里不再详述。显示所有订单和订单的详细情况都是采用了AJAX Extensions中的UpdatePanel组件,这个组件的功能是可以进行页面的部分刷新,提高了显示的速度。将所有订单和订单的详细情况的分别放在两个GridView中,再将这两个GridView分别放入两个UpdatePanel中,初始默认为隐藏,等到触发了显示事件的时候再显示出来。有关显示哪个订单的问题还是采用了链接按钮的CommandName来判断,前面已经详述过。
4.2 会员模块
会员模块中包含了订餐管理、会员服务和留言反馈三个部分,其中会员服务和留言反馈部分都没有什么难的内容,在选餐订餐方面涉及到了购物车的实现。
4.2.1 选餐订餐
如概要设计中所述,选餐订餐是本系统的主页,在每个菜品下面都有一个加入菜单的链接,在点击这个链接以后就可以将这个菜品加入本次会话的购物车中,再次点击则购物车中该菜品的数量会增加。那么购物车如何实现呢?
23
我认为用Session加上Datatable实现比较方便,因为Cookie的话有可能在有的电脑上被禁止了,而DataSet等这些方法的操作都比较麻烦。Session的话不用管数据是什么类型,所以类型的东西都使用同一种方式读取,数据集合也一样。
所以在实现的时候,可以先把自己的数据从数据库中读取出来,存放在一个DataTable中,当会话开始的时候把这个表和里面的内容放入Session中,每次对表修改的时候也对Session修改,或者可以一次性修改。(代码如下)
/*
*初始化菜单
*/
protected void CreateOrderCar()
{
if (Session["FoodOrderCar"] == null)
{
dtOrderCar.Columns.Add("FoodName", typeof(string));
dtOrderCar.Columns.Add("FoodPrice", typeof(double));
dtOrderCar.Columns.Add("FoodNum", typeof(int));
dtOrderCar.Columns.Add("FoodPriceSum", typeof(double)); Session.Add("FoodOrderCar", dtOrderCar);
}//刷新后dtOrderCar就没有了,要从Session中读取
else
{
dtOrderCar = (DataTable)Session["FoodOrderCar"];
}
this.GridViewFoodOrder.DataSource = dtOrderCar.DefaultView; this.GridViewFoodOrder.DataBind();
this.GridViewFoodOrder.Visible = true;
updatePanelOrder.Update();
}
/*
*加入一个菜
*/
protected void AddFoodIntoOrder(string strFoodName, double dubFoodPrice) {
dtOrderCar = (DataTable)Session["FoodOrderCar"];
foreach (DataRow dr in dtOrderCar.Rows)
{
if (dr[0].ToString() == strFoodName)
{
dr[2] = double.Parse(dr[2].ToString()) + 1;
dr[3] = double.Parse(dr[2].ToString()) *
double.Parse(dr[1].ToString());
CaculateTotalMoney();
UpdateOrderUpdatePanel();
return;
}
}// 判断是否已存在于定单中
DataRow drNewFood = dtOrderCar.NewRow();
24
drNewFood[0] = strFoodName;
drNewFood[1] = dubFoodPrice;
drNewFood[2] = 1; //第一次一次点击,数量为1
drNewFood[3] = dubFoodPrice * 1;
dtOrderCar.Rows.Add(drNewFood);
UpdateOrderUpdatePanel();
UpdateSubmitOrder();
}
protected void CaculateTotalMoney()
{
double dubTotalMoney = 0;
foreach (DataRow dr in dtOrderCar.Rows)
{
dubTotalMoney += (double.Parse(dr[1].ToString()) *
double.Parse(dr[2].ToString()));
}
lbOrderTotalMoney.Text = dubTotalMoney.ToString();
}
在选餐订餐部分还有一个收银台的功能,收银台也是采用了前面添加菜品中的弹出方式来实现。所不同的是去收银台要求是已经是点了至少一个菜了并且用户必须已经登陆才可以。这里还是用Validation来实现,但是与前面的方式有所不同。因为有没有点菜和有没有登陆不是靠用户自己输入数据来判断的,而是要从Session中读取的,而如果将Session中的数据读出来输出到Label中的话,Validation的使用对象是不能为Label的。我结合了这两个内容,把从Session中读取的购物车信息和用户信息写到收银台中的TextBox中去,然后把这个TextBox设置为ReadOnly,这样就可以为TextBox加上Validation了。并且在收银台中还有一个用餐时间的填写问题,用户在订餐后要选择就餐时间,但是这个时间不能是比现在还早的时间,也不能是餐馆来不及准备和送餐的时间(我这里设置了30分钟),所有要加上时间的判断和计算。(代码如下)
/*
*提交菜单事件
*/
protected void btnSubmitOrder_Click(object sender, EventArgs e)
{
DateTime dtNow = DateTime.Now;
int intYear = dtNow.Year;
int intMonth = int.Parse(dplistMonth.SelectedValue.ToString());
int intDay = int.Parse(dplistDay.SelectedValue.ToString());
int intHour = int.Parse(dplistHour.SelectedValue.ToString());
int intMinute = int.Parse(dplistMinute.SelectedValue.ToString());
DateTime dtSelectTime;
try
{
dtSelectTime = new DateTime(intYear, intMonth, intDay, intHour,
intMinute, 0);
25
}
catch
{
this.lbSubmitError.Text = "您选择的时间有错误,请重新选择"; this.lbSubmitError.Visible = true;
UpdatePanel3Update();
return;
}
if(CaculateMinute(intMonth, intDay, intHour, intMinute) < 30)
{
this.lbSubmitError.Text = "订餐失败,对不起,我们需要至少半个小
时的准备时间!";
this.lbSubmitError.Visible = true;
UpdatePanel3Update();
return;
}
else
{
// 更新orders, orders_detatil表
string strUserName = Session["userName"].ToString();
string strAddr = this.tbUseFoodAddress.Text.ToString();
string strPhoneNum = this.tbSubmitPhoneNumber.Text.ToString(); int intTotalNum = int.Parse(this.tbTotalFoodNum.Text.ToString()); decimal decTotalMoney =
decimal.Parse(this.lbSubmitTotalMoney.Text.ToString());
if(0 == InsertTableOrders(strUserName, strAddr, intTotalNum,
decTotalMoney, dtSelectTime, strPhoneNum)
|| 0 ==
InsertTableOrders_DetailAndFood((DataTable)Session["FoodOr
derCar"]))
{
this.lbSubmitError.Text = "出现错误,请重试!";
this.lbSubmitError.Visible = true;
UpdatePanel3Update();
return;
}
this.lbSubmitError.Text = "谢谢你订餐,我们会及时送达!"; this.lbSubmitError.Visible = true;
//Session.Remove("FoodOrderCar");
UpdatePanel3Update();
UpdateOrderUpdatePanel();
}
}
4.2.2 会员服务和留言反馈
会员服务和留言反馈这两块内容比较简单,而且涉及到的显示方式前面基本上都讲到过。在会员服务中的内容在刚加载的时候就从数据库中读取出来存放在页面上,需要修改的话直接在页面上相应的地方修改,完成后点击“确定修改”按钮
26
即可,若是有不合法的内容,也都是通过Validation来提示。密码修改单独做成一个弹出式的窗口,因为密码修改部分需要有密码验证等,将它单独列出来处理比较方便。会员自己的所有订单及订单详情也采用了前面订单管理部分的显示方式。在这两个部分中如果要进行操作的话只能是已经登陆的用户,在验证有没有登陆上也是采用了与收银台中相同的方法。
4.3 公共模块
在本系统中的公共模块其实就两个部分,一是选餐订餐部分,二是留言反馈部分。在选餐订餐部分游客和会员都可以选餐,但是在提交订单到收银台的时候,游客会被要求登陆。在留言反馈部分,游客和会员都可以查看所有的反馈信息,但是游客是不能发表反馈的,必须经过登陆。
27
5. 系统测试
5.1 测试计划制定
为了使本系统能够正确运行,故在完成了系统编码以后对本系统进行黑盒测试(白盒测试在代码的编写过程中已经完成)。测试主要是对系统进行功能性的测试,即为系统的每个功能设计若干个测试用例,然后执行,由于本系统功能不是很多,所以这样测试实现起来并不复杂,而且这种测试覆盖比较全。
测试时间共3天,其中第一天设计测试用例,后两天执行用例和完成测试报告。测试的离开准则为所有的测试用例都通过。
5.2 测试用例设计与执行
本次测试主要是针对系统的所有功能进行测试,分为以下几个功能部分:注册与登陆、选餐与订餐、修改会员信息及查看会员订单、发表反馈及查看反馈、处理未送出的订单及查看订单、添加菜品、修改菜品信息和查看所有会员及会员的订单详情。由于全部用例数量比较多,这里主要列出选餐与订餐功能部分的用例。(见表格5 - 1) 用
例用例目的 号
选择排序方式能否正常显示 直接点击提交订单能否成功 选择某个菜能否加入菜单 选择某个菜,菜单中的金额是否正确变化 再次选择该菜,菜单中的数
通过/不通过 通过 通过 通过
测试动作 测试数据 期望结果 实际结果
1
2
3
选择按价格从低到高方式排序 直接点击“去收银台”
点击“香菇青菜”的链接 点击“香菇青菜”的链接 再次点击“香菇青菜”的链接
无
按价格从低到高排序 提示错误 在菜单中显示该菜,数量为1 在菜单中显示总金额为8元 在菜单中的该菜数量增1
按价格从低到高排序
提示没有选择任何菜品等信息 在菜单中显示该菜,数量为1
无
无
4 无
在菜单中显示总金额为8元 通过
5 无
在菜单中的该菜数量增1 通过
28
量是否增加 接上用例,菜单6
中的金额是否正常变化 再选择另外一个7
菜,菜单中的金额是否正常变化 删除菜单8
中的一个菜能否成功
点击“去9
收银台”能否提交
登陆后再去收银台
能否提交 接上用例,用餐时间选择比当前时间早,能否提交 接用例 10,用餐时间选择比现在时
间晚30分钟以内能否提交 接用例9,用餐时间选择比现在时间晚
30分钟以上能否提交
无 点击“西湖啤酒”的链接
点击菜单中“香菇青菜”
后的删除链接
点击“去收
银台”,再点击提交
用测试数据
登陆,再同
用例8步骤
使用测试数据的用餐时间,点击提交
使用测试数据的用餐时间,点击提交 使用测试数据的用餐时间,点击提交 在菜单中显无
示总金额为16元
在菜单中显无
示总金额为19元
无
菜单中没有香菇青菜 无 提示没有登陆 用户名:
gcc1
提示填写必密
须的信息
码:111111 时间比当前时间早提示用餐时一天
间不正确
时间比当
前时间晚提示用餐时20-30分间不正确 钟
时间比当
前时间晚提示订餐成至少30分功 钟
表格 5 - 1
29
在菜单中显示总金额为16元 在菜单中显示总金额为19元 菜单中没有香菇青菜 提示没有登陆,且
必须的信息未填
写,不能提交 提示填写必须的信息,不能提交
提示需要至少半个小时时间来准备,不能提交
提示需要至少半个小时时间来准备,不能提交
提示订餐成功
通过
通过
通过
通
过
通过
通过
通过
通过
10 11
12 13