1 绪 论
1.1 研究的背景及意义
民以食为天。餐饮业是一种个性化、多样化的服务产业,餐饮传统的点菜方式是纯人工操作,由服务员记录顾客点的菜,在具体工作中容易出现以下问题:手写单据字迹潦草从而导致上错菜、传菜分单出错现象严重、加菜和查账程序较繁琐。处理特殊口味有遗漏和偏差、客人催菜遗忘现象较频繁、计算账单易出错、不方便人员管理等等。
电子商务则是最能凸显个性化、多样化服务的商务方式。随着网络技术的发展和普及,方便、快捷、个性化的网上订餐正在进入人们的生活。正因如此,无线点餐模式应运而生。它不仅可以有效地提高餐饮业的工作效率,更可以规范服务体系,提高整体服务质量和管理水平,并为规模化经营提供了坚实的技术基础。服务员使用手持终端为顾客点餐,当消费者点完餐后,服务员将存储在手持终端内的点餐信息,点餐信息同时也能被前台看到,方便快捷。
1.2 本文主要内容
本文介绍了无线点餐系统的开发过程。论文详尽论述了从需求分析、系统分析、概要设计、详细设计以及测试与调试的整个开发过程。首先系统地研究了无线点餐系统的背景和意义,分析了当今点餐系统的特点和共性,从而得出设计本系统的思路和方法。接着介绍了实现系统开发的Android平台环境,数据库用MySQL实现。同时简要介绍了以上工具的功能和方法。
概要设计分成后台数据库管理操作设计和客户端操作设计,同时介绍了数据库的建立和维护。详细设计主要阐述了点菜管理、并台管理、查台管理,转台管理,注销等实现,并给出了系统的部分设计代码。
2 相关技术和开发环境
2.1 系统架构
无线点餐系统主要用到采用模型-视图-控制器MVC架构的设计模式。MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
视图是用户看到并与之交互的界面。MVC一个大的好处是它能为你的应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。
模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。例如它可能用像EJBs和ColdFusion Components这样的构件对象来处理数据库。被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
控制器接收用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后确定用哪个视图来显示模型处理返回的数据。
总的来说MVC的处理过程,就是首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。
2.2 关键技术
2.2.1JDBC
JDBC(Java Data Base Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为工具/数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯 Java API 编写数据库应用程序,同时,JDBC也是个商标名。
有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事。程序员只需用JDBC API写一个程序就够了,它可向相应数据库发送SQL调用。同时,将Java语言和JDBC结合起来使程序员不必为不同的平台编写不同的应用程序,只须写一遍程序就可以让它在任何平台上运行,这也是Java语言“编写一次,处处运行”的优势。
Java数据库连接体系结构是用于Java应用程序连接数据库的标准方法。JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。作为API,JDBC为程序开发提供标准的接口,并为数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。JDBC使用已有的SQL标准并支持与其它数据库连接标准,如ODBC之间的桥接。JDBC实现了所有这些面向标准的目标并且具有简单、严格类型定义且高性能实现的接口。
2.2.2Jquery
Jquery是继prototype之后又一个优秀的Javascrīpt框架,由美国人John Resig创建。它是轻量级的js库(压缩后只有21k) ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+,Safari 2.0+,Opera 9.0+)。Jquery使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供Ajax交互。Jquery还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。Jquery能够使用户的HTML页保持代码和HTML内容分离,也就是说,不用再在html里面插入一堆js来调用命令了,只需定义id即可。
2.2.3Ajax
Ajax指异步JavaScript及XML(Asynchronous JavaScript And XML),是一种用于创建更好更快以及交互性更强的Web应用程序的技术。Ajax的核心是JavaScript对象XmlHttpRequest。Ajax在浏览器与 Web 服务器之间使用异步数据传输(HTTP 请求)。简而言之,XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。
通过Ajax,您的JavaScript可使用 JavaScript的XMLHttpRequest对象来直接与服务器进行通信。通过这个对象,您的 JavaScript可在不重载页面的情况与Web服务器交换数据,这样就可使网页从服务器请求少量的信息。
Web应用程序较桌面应用程序有诸多优势;它们能够涉及广大的用户,它们更易安装及维护,也更易开发。
2.3 开发环境及平台
2.3.1Eclipse
Eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse附带了一个标准的插件集,包括Java开发工具(Java Development Tools,JDT)。Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++和Python的开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。
- Eclipse的主要构成
Eclipse是一个开放源代码的软件开发项目,专注于为高度集成的工具开发提供一个全功能的、具有商业品质的工业平台。它主要由Eclipse项目、Eclipse工具项目和Eclipse技术项目三个项目组成,具体包括四个部分组成——Eclipse Platform、JDT、CDT和PDE.JDT支持Java开发、CDT支持C开发、PDE用来支持插件开发,Eclipse Platform则是一个开放的可扩展IDE,提供了一个通用的开发平台。它提供建造块和构造并运行集成软件开发工具的基础。Eclipse Platform允许工具建造者独立开发与他人工具无缝集成的工具从而无须分辨一个工具功能在哪里结束,而另一个工具功能在哪里开始。
Eclipse SDK(软件开发者包)是Eclipse Platform、JDT和PDE所生产的组件合并,它们可以一次下载。这些部分在一起提供了一个具有丰富特性的开发环境,允许开发者有效地建造可以无缝集成到Eclipse Platform中的工具。Eclipse SDK由Eclipse项目生产的工具和来自其它开放源代码的第三方软件组合而成。Eclipse项目生产的软件以 GPL发布,第三方组件有各自自身的许可协议。 - Eclipse Android环境搭建
- JDK安装
- 我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量:
JAVA_HOME值为:安装JDK的目录;
CLASSPATH值为:D:\AndroidDeveloper\android-sdk-windows\tools; - Path:在开始追加%JAVA_HOME%\bin;
- NOTE:前面四步设置环境变量对搭建Android开发环境不是必须的,可以跳过。
安装完成之后,可以在检查JDK是否安装成功。打开cmd窗口,输入Java –version查看JDK的版本信息。
- Eclipse安装
在http://www.eclipse.org/downloads/,下载Eclipse IDE for Java Developers(92M)的win 32bit版,Android SDK安装在Android Developers下载android-sdk_r05
-windows.zip,下载完成后解压到任意路径。
- 运行SDK Setup.exe,点击Available Packages。如果没有出现可安装的包,请点击Settings,选中Misc中的“Force https://...” 这项,再点击Available Packages。
- 选择希望安装的SDK及其文档或者其它包,点击Installation Selected、Accept All、Install Accepted,开始下载安装所选包。
- 在用户变量中新建PATH值为:Android SDK中的tools绝对路径(本机为D:\AndroidDevelop\android-sdk-windows\tools)。
- MyEclipse
MyEclipse,是一个十分优秀的用于开发Java,J2EE的Eclipse插件集合,MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持十分不错。
MyEclipse企业级工作平台(MyEclipse Enterprise Workbench ,简称MyEclipse)是对EclipseIDE的扩展,利用它我们可以在数据库和JavaEE的开发、发布以及应用程序服务器的整合方面极大的提高工作效率。它是功能丰富的JavaEE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML,Struts,JSP,CSS,Javascript,Spring,SQL,Hibernate。
在对于毕业课题的设计中,Android终端设备客户端是采用Eclipse开发工具开发的;而Web版本是采用MyEclipse开发工具开发的。
2.3.3Tomcat服务器
Tomcat很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感兴趣的程序员都可以更改它或在其中加入新的功能。
Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML 页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行Tomcat 时,它实际上作为一个与Apache独立的进程单独运行的。
当配置正确时,Apache为HTML页面服务,而Tomcat实际上运行JSP 页面和Servlet。另外,Tomcat和IIS、Apache等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。
2.3.4应用平台Android
Android是基于Linux内核的操作系统,早期由Google开发,后由开放手机联盟开发。它采用了软件堆的架构,主要分为三部分。底层以Linux内核工作为基础,只提供基本功能;其他的应用软件则由各公司自行开发,以Java作为编写程序的一部分。另外,为了推广此技术,Google和其它几十个手机公司建立了开放手机联盟。Android在未公开之前常被传闻为GPhone。
它采用了软件堆层(software stack,又名软件叠层)的架构,主要分为三部分:底层以Linux核心为基础,由c语言开发,只提供基本功能。中间层包括函数库Library和虚拟机Virtual Machine,由C++开发。最上层是各种应用软件,包括通话程序,短信程序等,应用软件则由各公司自行开发,以Java编写。
Android平台五大优势特色:
- 开放性
在优势方面,Android平台首先就是其开放性,开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。
开放性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,最大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。 - 挣脱运营商的束缚
在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。自从iPhone上市,用户可以更加方便地连接网络,运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈。 - 丰富的硬件选择
这一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容。好比你从诺基亚Symbian风格手机一下改用苹果iPhone,同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是可以方便地转移。 - 不受任何限制的开发商
Android平台提供给第三方开发商一个十分宽泛、自由的环境。因此不会受到各种条条框框的阻挠,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏如何控制正是留给Android难题之一。 - 无缝结合的Google应用
如今叱咤互联网的Google已经走过10年历史。从搜索巨人到全面的互联网渗透,Google服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的Google服务。
3 订餐系统分析与设计
3.1需求分析
3.1.1系统目标和要求
首先,我们得确定使用这个系统的用户应该有顾客、服务员、收银员。顾客和服务员应该是系统数据的起点,由他们做出相应的操作,然后系统进行处理;收银员则为系统数据的终点。
该系统在性能功能上应达到如下要求:
- 操作简单、界面友好:完全控件式的页面布局,使得菜品,资讯,座位等信息的
录入工作更简便,许多选项包括餐厅信息,桌位,包房信息等只需要点击鼠标就可以完成;另外,跟踪出现的提示信息也让用户随时清楚自己的操作情况。对常见的类似网站的管理的各个方面:基本信息录入、浏览、删除、修改、搜索等方面都大体实现,顾客对菜品的预定及支付方式; - 即时可见:对客户预定餐饮信息的处理(包括录入、删除)将立即在另一应用端及服务器的对应栏目显示出来,达到“即时点击、即时见效”的功能;
- 系统运行应该快速、稳定、高效和可靠;
- 在结构上应具有很好的可扩展性,便于将来的功能扩展和维护。
3.1.2可行性分析
随着经济的快速发展,B2C电子商务越来越受到人们的关注。无线订餐系统,已经如雨后春笋般的出现在了许多城市的大酒店中。特别在大型餐饮集团使用已经成为了趋势。同时,随着全国人民的精神、物质和文化生活高度的提高,人们已经不在仅仅停留在吃饱的程度,不但要吃饱,还要吃好,而且对酒店服务也越来越挑刺,正因为如此无线订餐系统的出现,正好满足了大众的需要,不仅让宾客享受到精美可口的美食,更让他们感受到服务管理的贴心与完善。无线订餐业务在中国有着极大的发展空间以及良好的背景。随着酒店管理的完善,使用这种智能的无线点餐系统必然成为追究卓越的餐饮公司的最爱,也更能够体现信息技术发展之猛烈。
此次毕业设计基于Android平台开发无线订餐系统。Android平台给我们提供了巨大的自由空间,再运用Java面向对象语言,是系统功能更加强大。MySQL 是一个杰出的数据库平台,具有功能强大,安全可靠等特点,可用于中小型联机事务处理、数据仓库及电子商务等。
3.2 订餐系统概要设计
系统的概要设计主要对系统的总体功能如何设计,如何划分模块,系统的数据库如何设计进行研究。它为系统的详细设计做铺垫。在系统的设计过程中起着非常重要的作用。
3.2.1模块的划分
本系统主要分两部分:
- Web点餐系统与后台
Web系统主要是给客户点菜;客户只能点菜、拿号。 - 终端设备与后台
终端设备指的是基于安卓平台的一个设备。主要给服务员、收银员等工作人员使用;能更新菜谱,结账,点菜、查看等功能。
3.2.2功能模块的设计
- Web点餐系统
- 登录——若没有用户账号,提供注册
- 查看菜单
- 查看菜单详情
- 加入购物车(点菜)
- 下单(提交预定菜单)
- 拿号
图3-1功能描述图
- 终端设备
终端系统主要有以下几个模块构成:结台管理、更新管理等功能。
- 点菜——包括开桌、点菜、下单三个功能
- 并台——两桌拼接
- 结台——在顾客就餐完毕后,计费付帐而设定的功能,是客人能够一目了然,不用担心有什么算错的问题。
- 查台——查看座位情况,哪些是有人,哪些是空位
查台
结台
并台
图3-2功能描述图
3.3 数据库设计
3.3.1数据库需求分析
无线点餐系统以酒店服务信息为主体,因此在这个系统中必须要有一个保存菜单信息的表。所以用编号做主键。负责登录终端系统的服务人员应该有保存服务人员信息的表,这个表中也是包括一些基本信息。并且以服务人员的编号作为主键。在一个点餐系统中,不可避免的要有桌位的编号。这样的话就必须有一个桌号表,该表保存桌位信息。顾客可以按照自己的喜好,在酒店布置的桌号中选择自己喜欢的位置。另外既然是酒店就必须要有一个订单表,该表中包括订单号,点餐时间,用户ID,桌号,人数,是否结账等基本信息。这样也就还需要一个订单详细表用于存储顾客所点的菜品信息等等。
3.3.2数据库E-R图设计
数据库的概念设计,即利用数据模型进行概念数据库的模式设计。根据无线点餐系统的需求,设计出以下的实体-关系模型(E-R)图如图。
ID编号
描述
标识号
桌号
桌位
n
服务
1
服务人员
用户密码
ID编号
用户名称
图3-3 实体联系图
图3-4 实体联系图
3.3.3数据表设计
数据库的逻辑设计,即把概念设计得到的概念数据库模式变为逻辑数据模式,它依赖于DBMS。根据无线点餐系统的需求分析及数据库的概念设计,建立数据库了wireless_db。
建库语句:create database wireless_db;
设计表结构,如下图所示:
表3.1 用户信息表(usertbl)
列名 | 数据类型 | 是否允许为空 | 说明 |
---|---|---|---|
id | int(11) | 否 | 序号(主键) |
name | varchar(50) | 是 | 用户名 |
password | varchar(50) | 是 | 密码 |
account | varchar(50) | 是 | 登录名 |
gender | varchar(20) | 是 | 性别 |
permission | int(11) | 是 | 权限(客户2,用户1) |
remark | varchar(2000) | 是 | 备注 |
表3.2 菜单信息表(menutbl)
列名 | 数据类型 | 是否允许为空 | 说明 |
---|---|---|---|
id | int(11) | 否 | 序号(主键) |
price | int(11) | 是 | 价格 |
typeId | int(11) | 是 | 类型 |
name | varchar(50) | 是 | 菜名 |
pic | varchar(1000) | 是 | 图片 |
remark | varchar(2000) | 是 | 备注 |
表3.3 订单信息表(ordertbl)
列名 | 数据类型 | 是否允许为空 | 说明 |
---|---|---|---|
id | int(11) | 否 | 序号(主键) |
orderTime | varchar(100) | 是 | 下单时间 |
userId | int(11) | 是 | 下单人 |
tableId | int(11) | 是 | 桌号 |
personNum | int(11) | 是 | 人数 |
isPay | int(11) | 是 | 是否支付(1已支付) |
remark | varchar(2000) | 是 | 备注 |
表3.4 订单信息详情表(orderdetailtbl)
列名 | 数据类型 | 是否允许为空 | 说明 |
---|---|---|---|
id | int(11) | 否 | 序号(主键) |
orderId | int(11) | 是 | 订单ID |
menuId | int(11) | 是 | 菜ID |
num | int(11) | 是 | 订购数量 |
remark | varchar(2000) | 是 | 备注 |
表3.5 餐桌信息表(tabletbl)
列名 | 数据类型 | 是否允许为空 | 说明 |
---|---|---|---|
id | int(11) | 否 | 序号(主键) |
num | int(11) | 是 | 订购数量 |
flag | int(11) | 是 | 标识(1有人0没人) |
remark | varchar(2000) | 是 | 备注 |
3.3.4连接数据库实现
本系统采用Java语言编写,使用jdbc连接MySQL数据库,所以要用到Java中的connection对象和MySQL驱动连接到数据库。数据库配置文件如下所示。
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/wireless_db?useUnicode=true&characterEncoding=utf-8
username=root
password=123
只有成功连接到了数据库才能进行其他操作,否则就无法开展以下的设计与实现工作了。可见,连接数据库是一个很关键的步骤。
4 订餐系统实现
4.1安卓平台系统实现
4.1.1功能描述
主菜单界面包含点菜管理、并台管理、转台管理、查台管理、结台管理、注销等几个功能模块。每个功能模块提供一种服务,包含一组功能操作,界面简单明了方便服务人员操作。
4.1.2界面展示
登录界面主要是由服务人员来操作的,所以要简单明了易操作。利用数据库对用户信息进行核对,核对正确后利用界面跳转到主菜单界面。服务人员的账号密码是提前在服务器数据库中设置的,每个服务人员都有自己单独的唯一的一个账号密码用来登录,这样可以责任到人,不至于出现混乱,否则出现错误都不知道是哪个环节的问题。
图4-1 登录截图
输入数据的验证:
图4-2 登录数据验证
登录失败:
图4-3 登录失败
登陆成功之后进入主菜单:
图4-图4-4 主界面
点击点菜:
开桌:若当前桌号是开过桌的,开桌按钮将会不可用,并且人数自动为上次开过桌之后的人数,这一步是通过桌号来从数据库中判断桌子的标示(1表示开桌,0表示没有开桌)实现的,可以修改。
图4-5 开桌
2号桌已经被开过桌,所以开桌按钮变成不可用。
图4-6 开桌验证
添菜:所有的菜单信息都是从数据库中取出的,与web版本向客户提供的信息保持一致。
图4-7 点餐
点击下拉列表选择菜名:如图
图4-8 选择菜单
图4-9 填写人数
点击下单直接下单,下单成功后,屏幕下方会提示桌号(如图)。下单即向数据库的订单详情表插入数据,插入客户定的菜号、桌号、备注信息等。
图4-10 下单成功
点击转台:
图4-11 换桌位
换台成功后有提示(如图),转台对于数据库的操作,就是将原来订单号的中的桌号编程就该之后的桌号。
图4-12 换座位成功
查台:
图4-12 查台
并台:所谓并台,就是两桌人并成一桌,对于数据库所做的操作有:先把被并的目标桌号的状态修改为空位,再把订单上的桌号修改为并台后的桌号即可。并台必须针对的是已经开过桌的桌子。
图4-13 并台
并台选择桌号:查出来的都是开过桌的桌号。
图4-14选择桌号
结账这一功能,就是从点餐详情表中取出,订单号为1的所有订单信息,并且再跟据菜号,将菜肴的价格取出,相加得到总价格显示出来。结账成功后,将数据库中订单表中的isPay字段的状态改成已支付。(0表示未支付,1表示已支付)
图4-15 结算界面
注销:
图4-16 注销
4.1.3关键代码
以下是点菜功能的关键代码:
// 添菜监听器
private OnClickListener addListener = new OnClickListener() {
@Override
public void onClick(View v) {
// 调用点菜方法
addMeal();
}
};
//添菜方法
private void addMeal() {
// 获得LayoutInflater实例
LayoutInflater inflater = LayoutInflater.from(this);
// 实例化在弹出对话框中添加的视图
final View v = inflater.inflate(R.layout.order_detail, null);
// 获得视图中的Spinner对象,菜单下拉列表
final Spinner menuSpinner = (Spinner) v.findViewById(R.id.menuSpinner);
// 获得视图中的EditText对象,数量
EditText numEt = (EditText) v.findViewById(R.id.numEditText);
// 获得视图中的EditText实例,备注
EditText remarkEt = (EditText) v.findViewById(R.id.add_remarkEditText);
String url = HttpUtil.BASE_URL +"/servlet/MenuServlet";
String result = HttpUtil.queryStringForGet(url);
try {
JSONArray tables = new JSONArray(result);
List<JSONObject> lists = new ArrayList<JSONObject>();
for(int i=0;i<tables.length();i++)
{
lists.add(tables.getJSONObject(i));
}
JsonArrayAdapter adapter = new JsonArrayAdapter(this, R.layout.spinner_lo, lists, new String[]{"id","name","price"},new int[] {
R.id.id_TextView01, R.id.price_TextView02,
R.id.name_TextView03, });
menuSpinner.setAdapter(adapter);
} catch (JSONException e) {
// TODO Auto-generated catch block
Log.e("amaker", "转换数据出错");
}
// 获得AlertDialog.Builder实例
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder
// 设置标题
.setMessage("请点菜:")
// 设置自定义视图
.setView(v)
// 设置确定按钮
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
// 确定按钮事件
public void onClick(DialogInterface dialog, int id) {
// 获得ListView中的自定义视图LinearLayout
LinearLayout v1 = (LinearLayout) menuSpinner
.getSelectedView();
// 获得TextView,菜编号
TextView id_tv = (TextView) v1
.findViewById(R.id.id_TextView01);
// 获得TextView,菜价格
TextView price_tv = (TextView) v1
.findViewById(R.id.name_TextView03);
// 获得TextView,菜名称
TextView name_tv = (TextView) v1
.findViewById(R.id.price_TextView02);
// 获得EditText,菜数量
EditText num_et = (EditText) v
.findViewById(R.id.numEditText);
// 获得EditText,菜备注
EditText remark_et = (EditText) v
.findViewById(R.id.add_remarkEditText);
// 菜编号值
String idStr = id_tv.getText().toString();
// 菜价格值
String priceStr = price_tv.getText().toString();
// 菜名称值
String nameStr = name_tv.getText().toString();
// 菜数量值
String numStr = num_et.getText().toString();
// 菜备注值
String remarkStr = remark_et.getText().toString();
// 封装到Map中
map = new HashMap();
map.put("id", idStr);
map.put("name", nameStr);
map.put("num", numStr);
map.put("price",priceStr);
map.put("remark", remarkStr);
// 添加到ListView
data.add(map);
// 关联的TextView
to[0] = R.id.id_ListView;
to[1] = R.id.name_ListView;
to[2] = R.id.num_ListView;
to[3] = R.id.price_ListView;
to[4] = R.id.remark_ListView;
// 实例化SimpleAdapter
sa = new SimpleAdapter(OrderActivity.this, data,
R.layout.listview, from, to);
// 为ListView绑定数据
lv.setAdapter(sa);
}
}).setNegativeButton("取消", null);
AlertDialog alert = builder.create();
alert.show();
}
4.1.4服务器端的实现
服务器端功能
主控计算机处理各无线终端发送过来的数据信息并进行处理、加工(必要的情况下还进行信息回馈)以及发送,从而进行控制、结算、统计、结账打印以及管理等一系列职能操作。
服务端主要是数据库操作,针对无线终端各模块而设置响应相应功能的服务器小程序。主要的Servlet(如图显示)。
图4-17 服务器功能图
4.2 网页系统实现
4.2.1界面展示
订餐系统主界面展示了所有的菜品,听过客户查看选择,并可以加入购入车,准备下单订餐。
图4-18 菜品展示
点击详情,进入菜单详情页面:
图4-19 菜品详情
点击订购:若当前用户没有登录,则会跳出登录的页面,只有登录之后的用户才能订购,否则只允许查看。跳入登录页面:
图4-20 登录界面
若登录不符合要求,也会有相应的验证信息:如图
图4-21 登录验证
若用户登录成功后订购,出现购物车界面:
图4-22 购物车
进入购物车界面后,客户可以选择继续购物或者下单,若选择继续购物,则跳出主页,菜单页面,若生成订单,则跳入订单信息确认页面:如图
图4-23 订单确认
若客户没有订购任何菜肴,则不能提交订单,提示如下图:
图4-24 订单提交验证
4.2.2关键代码
- 登录功能
以下是登录功能的关键代码:
login.jsp页面:
<script type="text/javascript">
function checkName(){
var userName = document.loginForm.loginName.value;
//获得用户层对象:
var uDiv = document.getElementById("userNameDiv");
if(userName.length == 0){
uDiv.innerHTML ="<font size='3' color = 'red'> 用户名不能为空!</font>";
return false; //函数有返回值
}
uDiv.innerHTML = "";
return true;
}
function checkPwd(){
var userPwd= document.loginForm.loginPass.value;
var pDiv = document.getElementById("passwordDiv");
if(userPwd.length == 0){
pDiv.innerHTML ="<font size='3' color = 'red'> 密码不能为空!</font>";
return false; //函数有返回值
}
pDiv.innerHTML = "";
return true;
}
//jquey中的方法,当页面一加载的时候就执行方法
$(document).ready(
function(){
//当登录按钮点击时,触发方法
$("#loginBT").click(
function(){
var username=$("#loginName").val();
var pwd=$("#loginPass").val();
//利用ajax去后台判断,用户输入的用户是否可以登录
$.ajax(
{
url:"${base}/LoginServlet",
type:"post",
data:"username="+username+"&pwd="+pwd,
dataType:"json",
success:successInfo
}
);
}
);
});
//ajax的回调函数,接受后台判断过后传过来的结果
function successInfo(json){
var error=json.errorMsg;//tipDiv
if(error!=null){
//后台若判断登录失败,前台提示信息
$("#tipsDiv").show();
}else{
window.location.href = "show.jsp";
}
}
</script> - 点菜功能
以下是点菜进入购物车功能的关键代码:
<jsp:useBean id="caritems" class="shopping.ShoppingCar" scope="session"></jsp:useBean>
<%
String id = request.getParameter("menuId");
if (id != null && !(id.equals(""))) {
MenutblDaoImpl imp = new MenutblDaoImpl();
Menutbl menu1 = imp.findById(Integer.parseInt(id));
caritems.addItem(Integer.parseInt(id), menu1);
session.setAttribute("caritems", caritems);
}
%>
<%
if (size > 0) {
Collection<CarItemBean> cols = caritems.getItems().values();
for (CarItemBean item : cols) {
Menutbl menu = item.getMenu();
%>
<%
}
} else {
%>
<tr bgcolor="#ffffff">
<td colspan="5">
您没有订购任何菜肴或者已经订购已经提交~
</td>
</tr>
<%
}
%>
<tr bgcolor="#dadada">
<td width="50" height="22" align="center">
<font color="#000000">合计</font>
</td>
<td height="22" align="center">
<font color="#000000">-</font>
</td>
<td width="104" height="22" align="center">
<font color="#000000">-</font>
</td>
<td width="100" class="hh" height="22" align="center">
<font color="#000000">-</font>
</td>
<td width="116" class="bb" align="center" height="22">
<font color="#000000">¥<%=caritems.getTotalPrice()%></font>
</td>
</tr>
结 论
经过近几个月的代码及论文书写,毕业设计也随之进入收尾阶段,无限点餐系统的基本功能也逐个完成。
在这次毕业设计中,通过学习与思考并实践,使本人对Google Android开发及Java等相关的技术初步了解,同时,由于本人做的是一套无线点餐系统,从起初资料的查询,让本人在有限的时间内丰富了对无线开发的认知,积累了理论上的知识。需求分析,可行性分析,再到后来的Java配置环境,书写代码及其调试,让本人作为一个用户对该类系统的需求和软件运行的环境有了一定了解。将之前学过的数据库知识跟Java技术结合在一起,理论联系实际,在实践中锻炼了本人分析处理问题的能力并激发了这方面的兴趣。
这次毕业设计的过程中,还让本人巩固了并加深了对软件工程这门学科的认识,尤其让本人在使用工程流程的各个阶段有了进一步的了解,并相对独立地完成各个阶段的任务。通过这次设计还让我明白了需求分析和总体设计是系统真正开发的关键,它规划出系统的大致模块和业务接口,流程转换以及模块之间的关系。如果总体设计规划不科学,将会导致之后的详细设计工作出现冗余,目标不明确甚至失去方向。虽然在开发过程中受水平和时间所限,在设计中还有些欠缺或考虑不周全的地方,但这次毕业设计的经历将对本人今后的学习和工作产生重大意义。
致 谢
毕业论文暂告收尾,这也意味着我在南京理工大学紫金学院的学习生活既将结束。在这四年的时间里,我在学习上和思想上都受益非浅。这除了自身努力外,与各位老师、同学和朋友的关心、支持和鼓励是分不开的.
非常感谢紫金和网博的指导我毕业设计的老师。各位老师在我大学的最后学习阶段——毕业设计阶段给自己的指导,从最初的定题,到资料收集,到写作、修改,到论文定稿,她们给了我耐心的指导和无私的帮助。为了指导我们的毕业论文,她们放弃了自己的休息时间,她们的这种无私奉献的敬业精神令人钦佩,在此我向她们表示我诚挚的谢意。同时,感谢所有任课老师和所有同学在这四年来给自己的指导和帮助,是他们教会了我专业知识,教会了我如何学习,教会了我如何做人。正是由于他们,我才能在各方面取得显著的进步,在此向他们表示我由衷的谢意,并祝老师们培养出越来越多的优秀人才,桃李满天下!
在本论文的写作过程中,要特别感谢我的导师丛玉华,丛玉华老师倾注了大量的心血,从选题到开题报告,从写作提纲,到一遍又一遍地指出每稿中的具体问题,严格把关,循循善诱,在此我表示衷心感谢。
参 考 文 献
[1] 郭宏志.Android应用开发详解[M].北京:电子工业出版社,2010.
[2] 杨文志.Android程序设计指南[M].北京:电子工业出版社,2009.
[3] 吴亚峰.Android核心技术与实例详解[M].北京:电子工业出版社,2010.
[4] 思志学.J2EE整合详解与典型案例[M].北京:电子工业出版社,2008.
[5] 靳岩,姚尚朗.Android开发入门与实战[M].北京:人民邮电出版社,2009.
[6] 张利国.Android移动开发入门与进阶[M].北京:人民邮电出版社,2009.
[7] 埃克尔.Java编程思想[M].北京:机械工业出版社,2007.
[8] 梁超著.J2me应用程序开发[M].北京:清华大学出版社,2004.
[9] 池瑞楠,仵博,张立涓.J2ME无线开发实训教程[M].北京:清华大学出版社,2007.
[10] 林闯单,志广任.计算机网络的服务质量[M].北京:清华大学出版社,2004.
[11] 马国生.MySQL初级教程[M].北京:北京电子工业出版社,2011.
[12] 方爱华.MySQL的优化[M].南京:东南大学出版社,2008.
[13] 李飞.Java的线程[M].重庆:重庆大学出版社,2008.
[14] 张孝祥.struts[M].北京:电子工业出版社,2011.
[15] Merlin.spring的起点[M].北京:机械工业出版社,2004.