Android实训宋严严18.docx
《Android实训宋严严18.docx》由会员分享,可在线阅读,更多相关《Android实训宋严严18.docx(21页珍藏版)》请在冰豆网上搜索。
Android实训宋严严18
Android实训作业
无线点餐论文
院系:
计算机与信息工程学院
班级:
软件一班
姓名:
宋严严
学号:
10060401018
日期:
2012年12月30日
系统的概要设计主要对系统的总体功能如何设计,如何划分模块,系统的数据库如何设计进行研究。
它为系统的详细设计做铺垫。
在系统的设计过程中起着非常重要的作用。
该无线点餐系统在性能功能上应达到如下需求:
(1)操作简单、界面友好:
完全控件式的页面布局,使得菜品,资讯,座位等信息的录入工作更简便,许多选项包括餐厅信息,桌位,包房信息等只需要点击鼠标就可以完成;另外,跟踪出现的提示信息也让用户随时清楚自己的操作情况。
对常见的类似网站的管理的各个方面:
基本信息录入、浏览、删除、修改、搜索等方面都大体实现,顾客对菜品的预定及支付方式;
(2)即时可见:
对客户预定餐饮信息的处理(包括录入、删除)将立即在另一应用端及服务器的对应栏目显示出来,达到“即时点击、即时见效”的功能;
(3)系统运行应该快速、稳定、高效和可靠;
(4)在结构上应具有很好的可扩展性,便于将来的功能扩展和维护。
模块的划分与功能设计
本系统主要分两部分:
终端设备和后台管理。
终端设备能实现更新,计费,注销等功能。
功能模块的设计
终端系统主要有以下几个模块构成:
结台管理、更新管理、注销、设置等功能。
结台——在顾客就餐完毕后,计费付帐而设定的功能,是客人能够一目了然,不用担心有什么算错的问题。
更新——就是随时对酒店的就餐信息例如:
桌位,计费,加菜等功能的更新,与服务器保持一致。
注销——在顾客结账以后进行的步骤,方便后来的客人能够及时了解酒店的信息。
设置——原准备有一些简单的设置,后来没有实现。
5数据库设计
数据库需求分析
无线点餐系统以酒店服务信息为主体,因此在这个系统中必须要有一个保存菜单信息的表。
所以用编号做主键。
负责登录终端系统的服务人员应该有保存服务人员信息的表,这个表中也是包括一些基本信息。
并且以服务人员的编号作为主键。
在一个点餐系统中,不可避免的要有桌位的编号。
这样的话就必须有一个桌号表,该表保存桌位信息。
顾客可以按照自己的喜好,在酒店布置的桌号中选择自己喜欢的位置。
另外既然是酒店就必须要有一个订单表,该表中包括订单号,点餐时间,用户ID,桌号,人数,是否结账等基本信息。
这样也就还需要一个订单详细表用于存储顾客所点的菜品信息等等。
原准备再弄一个菜品分类表用于区分凉菜,热菜等。
数据库需求分析
数据库的概念设计,即利用数据模型进行概念数据库的模式设计。
根据无线点餐系统的需求,设计出以下的实体-关系模型(E-R)图如图。
图5-1实体联系图
图5-2实体联系图
数据库的逻辑设计
数据库的逻辑设计,即把概念设计得到的概念数据库模式变为逻辑数据模式,它依赖于DBMS。
根据无线点餐系统的需求分析及数据库的感念设计,得到以下的数据库表和表的相关说明如下:
(1)桌号表
桌号表的结构及相关说明如表5-1所示。
表5-1桌号表
序号
字段名称
字段含义
类型
宽度
备注
1
Id
编号
Int
4
Primarykey
2
number
桌位号
Int
4
3
flag
状态位
Int
4
4
description
描述
varchar
16
(2)订单表
订单表的结构及相关说明如表5-2所示。
表5-2订单表
序号
字段名称
字段含义
类型
宽度
备注
1
Id
订单号
Int
4
Primarykey
2
orderTime
下订单时间
Int
4
3
userID
服务员号
varchar
16
4
tableId
桌位号
Int
4
Foreignkey
5
personNum
顾客人数
Int
4
6
isPay
是否付款
varchar
16
7
remark
备注
varchar
16
(3)订单详细表
订单详细表的结构及相关说明如表5-3所示。
表5-3订单详细表
序号
字段名称
字段含义
类型
宽度
备注
1
Id
编号
Int
4
Primarykey
2
orderId
下订单号
varchar
16
Foreignkey
3
menuId
菜谱号
Int
4
Foreignkey
4
number
点菜数
Int
4
5
remark
备注
varchar
16
连接数据库的设计与实现
本系统采用java语言编写,使用jdbc连接Mysql数据库,所以要用到java中的connection对象和mysql驱动连接到数据库。
其实现代码如下所示。
Stringdriver=com.mysql.jdbc.Driver
Stringurl=jdbc:
mysql:
//localhost:
3360/wireless_db?
useUnicode=true&characterEvcoding=utf-8
Stringusername=root
Stringpassword=
Connectionconn;
Class.forName(driver);
Conn=DriverManager.getConnection(url,username,password)
只有成功连接到了数据库才能进行其他操作,否则就无法开展以下的设计与实现工作了。
可见,连接数据库是一个很关键的步骤。
6系统实现
客户端设计思路
移动终端是使用者最直接接触的东西,包括是否能够让客户很轻松、方便的使用,操作响应时间、主机连接时间、图片综合质量、首页布局质量、首页信息类型等。
一般来说,一个界面主要由下面几个因素构成:
(1)文字:
文字元素是信息传达的主体部分。
界面中的文字主要包括标题、信息、文字链接几种主要形式。
标题和传统媒体中信息传达的基本作用相同,是内容的简概说明一般比较醒目、优先编排。
文字作为占据页面重要比率的元素,同时又是信息重要载体,它的字体、大小、颜色和排布对页面整体设计影响极大。
(2)图形:
图形在界面中具有重要作用。
合理的运用图形,可以生动直观、形象地表现设计主题。
网页中常用的图形格式包括jpg和gif,这两种格式压缩比高,得到了Android平台的支持,图形元素包括标题、背景、主图、链接图标四种。
(3)界面版式:
版式是界面设计的重要组成部分,它将文字、图形等视觉元素进行组合配置,使页面整体视觉效果美观和谐,便于阅读,操作,实现信息传达的最佳效果。
终端系统的界面设计也是综合了文字,图形等元素。
使每一个功能有文字与图片的共同描述,达到看图就大概知道此键是什么功能的目的,最终的目的还是为了使用者能够快速上手,不至于因为操作的不得当而放弃此系统。
主菜单界面
功能描述
主菜单界面包含点菜管理、并台管理、转台管理、查台管理、结台管理、更新管理、注销、设置等八个功能模块。
每个功能模块提供一种服务,包含一组功能操作,界面简单明了方便服务人员操作。
登录界面的设计
登录界面主要是由服务人员来操作的,所以要简单明了易操作。
利用数据库对用户信息进行核对,核对正确后利用界面跳转到主菜单界面。
每一位服务人员有自己单独的一个账号密码用来登录,这样可以责任到人,不至于出现混乱,否则出现错误都不知道是哪个环节的问题。
功能描述
服务人员可通过用户名和密码进入移动终端首界面来为顾客服务。
而服务人员的账号密码是提前在服务器数据库中设置的,每个服务人员都有自己单独的唯一的一个账号密码用来登录,这样可以达到责任到人。
界面设计
图6-1用户登录图
功能实现及关键代码
单独建立一个Activity用来控制用户的登录,再用户输入账号与密码时,系统先判断用户账号密码是否为空,为空则跳出一个对话框给用户提示;如果不为空则再从EditView中取的账号密码与服务器中的账号密码进行匹配,如果匹配成功则利用Intent语句跳转到下一个主菜单界面。
实现登录主要代码及分析:
loginBtn.setOnClickListener(newOnClickListener(){@Overridepublicvoid
onClick(Viewv)
{
if(validate()){//通过validate()判断账号密码是否为空
if(login()){//通过login()连接数据库核对是否一致
Intentintent=newIntent(LoginActivity.this,MainMenuActivity.class);
startActivity(intent);//启动Activity传递intent来跳转页面
}
Else
{
showDialog("用户名称或者密码错误,请重新输入!
");
}
}}});}
对登录按钮添加监听事件,在服务人员输入账号密码后点击登录后,终端会先判断是否满足validate()方法,此方法是防止账号密码为空时的登录提示,如果为空会跳出一对话框进行提示账号密码是必填项,如果不空,则再判断是否满足login()方法,login()方法是用来与数据库进行连接比较核对是否一致,一致则顺利登录跳转到下一个Activity即主菜单界面,否则出现账号密码错误的提示,登录失败;
privatevoidsaveUserMsg(Stringmsg){//将用户信息保存到配置文件
Stringid="";//用户编号
Stringname="";//用户名称
String[]msgs=msg.split(";");//获得信息数组
intidx=msgs[0].indexOf("=");//以“=”为分隔符
id=msgs[0].substring(idx+1);//获取id号
idx=msgs[1].indexOf("=");
name=msgs[1].substring(idx+1);//获取名称
SharedPreferencespre=getSharedPreferences("user_msg",
MODE_WORLD_WRITEABLE);//共享信息,运用本地数据库SQLite
SharedPreferences.Editoreditor=pre.edit();
editor.putString("id",id);
editor.putString("name",name);
mit();
}
此方法是在login()方法中再与后台数据库查询成功后调用的,也将登录用户信息保存在终端系统的本地数据库中,存储方便快捷。
这也正是基于Android平台的优点,拥有自己独立的数据库SQLite,它是一套轻量级的数据库引擎,可供其他应用程序调用。
更新界面
功能描述
此功能按键主要是为了保持数据的同步,时刻保持服务器和客服端的数据一致。
一个是与服务器更新菜谱表数据的,另一个是更新餐桌表数据的。
界面设计
图6-2更新图
功能实现及关键代码
更新功能其实就是要保持终端系统中的数据库与服务器中的数据库随时保持一致。
调用updateMenu()和updateTable()这两个方法来保持数据一致。
两个方法代码大致相同,不过一个是保持菜单表的一致,一个是保持桌号表的一致。
privatevoidconfirm(finalintitem){
AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
builder.setMessage("你真的要更新吗?
").setCancelable(false).
setPositiveButton("确定",newDialogInterface.OnClickListener()
{
publicvoidonClick(DialogInterfacedialog,intid){
if(item==1)
{
updateMenu();
Toast.makeText(UpdateActivity.this,"菜单表更新成功!
",
Toast.LENGTH_SHORT).show();
}
else{
updateTable();
Toast.makeText(UpdateActivity.this,"桌号表更新成功!
",
Toast.LENGTH_SHORT).show();
}
}
}).setNegativeButton("取消",newDialogInterface.OnClickListener()
{
publicvoidonClick(DialogInterfacedialog,intid){
dialog.cancel();
}
});
AlertDialogalert=builder.create();
alert.show();
}
注销界面
功能描述
注销界面:
在服务人员准备下班后,服务人员即可点击注销按钮,退出本次登录。
界面设计
图6-3结账图图6-4注销图
功能实现及关键代码
结账实现的主要代码:
从服务器获得订单编号,显示总计消费金额,再点击结算按钮以后,通过payBtn.setEnabled(false)方法就会是结算按钮失效,不能再次点击生效,这也是为了是否结算更加明了,不易让顾客和酒店服务员出现多次结账的错误。
也是人性化设计的一方面。
OnClickListenerpayListener=newOnClickListener(){//结算监听器
publicvoidonClick(Viewv){
StringorderId=orderIdEt.getText().toString();//获得订单编号
Stringurl=HttpUtil.BASE_URL+"servlet/PayMoneyServlet?
id="+orderId;//请求服务器url
Stringresult=HttpUtil.queryStringForPost(url);//获得查询结果
Toast.makeText(PayActivity.this,result,//显示结算结果
Toast.LENGTH_LONG).show();
payBtn.setEnabled(false);//使结算按钮失效
}};
注销实现的主要代码:
此功能的实现比较简单,通过AlertDialog.Builder创建对话框,在对话框中添加两个按钮,一个确定一个取消并添加监听,来对注销进行操作。
在确定注销时运用SharedPreferences来对登录信息清空,同时也调用Intent来使页面进行跳转到登录界面。
privatevoidlogout(){
AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
builder.setMessage("真的要退出系统吗?
")
.setCancelable(false)
.setPositiveButton("确定",newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intid){
SharedPreferencespres=getSharedPreferences("user_msg",MODE_WORLD_WRITEABLE);
SharedPreferences.Editoreditor=pres.edit();
editor.putString("id","");
editor.putString("name","");
Intentintent=newIntent();
intent.setClass(LogoutActivity.this,LoginActivity.class);
startActivity(intent);
}})
.setNegativeButton("取消",newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intid){
dialog.cancel();}});
AlertDialogalert=builder.create();
alert.show();}
服务器端的实现
服务器端功能
主控计算机处理各无线终端发送过来的数据信息并进行处理、加工(必要的情况下还进行信息回馈)以及发送,从而进行控制、结算、统计、结账打印以及管理等一系列职能操作。
服务端主要是数据库操作,针对无线终端各模块而设置响应相应功能的服务器小程序。
主要包括:
响应登录的Servlet、响应订单的Servlet、响应开桌的Servlet、响应并台的Servlet、响应转台的Servlet、响应查台的Servlet、响应更新桌号的Servlet、响应更新菜谱的Servlet、响应结算的Servlet、响应订单信息的Servlet等。
当操作员点结账的时候另一个Servlet启动,其作用就是讲该订单的标志位修改,并且将该桌子的状态设置成没人,其实就是根据订单号查询到桌子号,将该桌子的falg位置设置为0。
图6-5服务器功能图
服务器各模块设计
登录
当服务器访问loginservlet的时候,服务器得到用户的登录名和密码,该servlet的任务就是通过查询数据库,如果没有该用户或者密码不对返回0;如果有,并且密码正确,则返回一段有规则的字符串,包括用户id和名字。
更新
更新的Servlet主要有两个,一个是更新菜谱,另一个是更新桌子。
主要是考虑到饭店的菜谱和桌子不可能一成不变,将软件的扩展性增强。
当饭店的菜谱或者桌子更新的时候,操作员就可以将手机的数据库SQLITE和服务器的数据库的数据同步。
这两个Servlet的工作原理就是查询table表和menu表组成一个xml文件并且返回给客户端。
结账
结账的Servlet有两个,一个是当操作员发来order编号的时候,改Servlet查询订单表,拼成一个网页发送到手机,这样的好处就是手机不能修改订单信息。
当操作员点结账的时候另一个Servlet启动,其作用就是讲该订单的标志位修改,并且将该桌子的状态设置成没人,其实就是根据订单号查询到桌子号,将该桌子的falg位置设置为0。
PayServlet比较复杂,核心代码如下:
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
response.setContentType("text/html;charset=utf-8");
PrintWriterout=response.getWriter();
//实例化DAO
PayDaodao=newPayDaoImpl();
//获得订单ID
Stringid=request.getParameter("id");
//查询订单信息
QueryOrderqo=dao.getOrderById(Integer.parseInt(id));
//查询订单详细列表
Listlist=dao.getOrderDetailList(Integer.parseInt(id));
//拼HTML页面展示
out.println("
DOCTYPEHTMLPUBLIC\"-//W3C//DTDHTML4.01
Transitional//EN\">");out.println("");out.println("
");
out.println("
");out.print("
");out.print("");out.print("
");out.print("订单编号");out.print(" | ");out.print("
");out.print("下单时间");out.print(" | ");out.print(""); out.print("服务员");out.print(" | ");out.print(""); out.print("人数");out.print(" | ");out.print("");out.print("桌号"); out.print(" | ");out.print("
");out.print("");out.print(""); out.print(id);out.print(" | ");out.print(""); out.print(qo.getOrderTime());out.print(" | ");out.print(""); out.print(qo.getName());out.print(" | ");out.print(""); out.print(qo.getPersonNum());out.print(" | ");out.print(""); out.print(qo.getTableId());out.print(" | ");out.print("
");out.print("
");out.print("");out.print("菜名");out.print(" | ");out.print("
");out.print("价格");out.print(" | ");out.print(""); out.print("数量");out.print(" | ");out.print("");out.print("总计"); out.print(" | ");out.print("");out.print("备注");out.print(" | ");out.print("
");for(inti=0;iQueryOrderDetailqod=(QueryOrderDetail)list.get(i);
Stringname=qod.getName();
intpric
展开阅读全文
相关搜索