Android实训杨超杰26文档格式.docx
《Android实训杨超杰26文档格式.docx》由会员分享,可在线阅读,更多相关《Android实训杨超杰26文档格式.docx(63页珍藏版)》请在冰豆网上搜索。
![Android实训杨超杰26文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/30/0a11ab02-01eb-467d-8b97-396052fb83c6/0a11ab02-01eb-467d-8b97-396052fb83c61.gif)
它不仅可以有效地提高餐饮业的工作效率,更可以规模服务体系,提高整体服务质量和管理水平,并为规模化经营提供了坚实的技术基础。
2功能模块的设计
2.1客户端
客户端主要有以下几个模块构成:
登陆、点餐、更新、结账等功能。
结构图:
2.2数据库
客户端采用SQLite数据库,服务器采用MySQL数据库,并提供了客户端数据和服务器端数据和服务器端数据的同步功能,提高了程序的运行效率。
创建了6张表分别是:
系统用户表(UserTbl)、菜谱分类表(MenuTypeTbl)、餐桌表(TableTbl)、菜谱表(MenuTbl)、订单表(OrderTbl)、订单明细表。
系统用户表:
登陆系统使用。
菜谱分类表:
方便点餐,将菜单信息进行分类,如热菜、凉菜等。
餐桌表:
用来表示顾客在哪个桌位就坐。
菜谱表:
菜谱表用来保存菜信息,如分类、名称和价格等。
订单表:
当顾客开桌点菜时生成的信息,保存到该表。
订单明细表:
订单明细表和上面的订单表是一对多的关系,即一桌客人点了多份菜。
3主要任务
无线点餐系统的登陆、点餐模块的客户端与服务器端和程序主菜单的实现部分。
4模块操作
4.1登陆模块客户端实现
1.创建一个Android工程,名为“WirelessOrder_Client”。
2.在res\layout目录下,创建“login_system.xml”的布局文件,
布局文件外层使用LinearLayout布局,内嵌TableLayout完成布局管理。
布局文件引用一个图片资源来显示背景图片、俩个TextView用来显示用户名称和密码、两个EditText用来输入用户名和密码、两个Button用来登陆和取消系统。
代码均见附录!
3.创建名为“LoginActivity”的Acivity,在类的顶部声明所用的EditText和Button组件,在onCreate()方法中调用setContenView(R.layout.login_system)方法设置布局视图。
通过findViewById()方法实例化EditText和Button对象。
4.定义一个工具类HttpUtil来获得HttpRequest对象和HttpResponse对象,以及发送get和post请求获得返回response信息的方法。
5.定义一个显示提示信息的对话框方法,用来显示提示信息。
6.定义validate()方法,对用户名称和密码进行非空验证。
7.定义一个query()方法,通过用户名称和密码尽心查询,发送Post请求,获得响应结果。
8.定义login()方法,该方法调用query()方法,获得查询结果,并将查询结果通过SharedPrerences保存到XML配置文件,以便在后面程序的点餐中使用用户信息。
Login()方法调用saveUserMsg()方法将用户信息保存到配置文件。
9.为登录按钮添加单击监听器,在onClick()方法中,首先调用calidate()方法进行验证,如果验证通过再调用login()方法,如果登录成功,系统进入主菜单界面,否则提示登录失败信息。
如果验证失败则提示失败信息,请求用户重新输入。
10.为取消按钮添加单击监听器,在onClick()方法中调用finish()方法结束该Activity。
运行结果如图:
4.2登录模块服务器端实现
1.创建一个名为“WirelessOrder_server”的Web工程。
2.创建程序需要的包结构。
dao包用于放置采用DAO设计模式实现的访问数据库接口及其实现类;
entity包用于放置对应数据库表的实体类;
servlet包用于放置Servlet类;
filter包用于放置过滤器;
util包是工具类。
3.程序要访问MySQL数据库,所以要添加MySQL驱动包“mysql-connector-java-5.0.3-bin.jar”。
将该jar文件添加到工程的classpath下。
4.创建访问数据库的工具类DBUtil,该类的主要功能是打开和关闭数据库连接。
将配置信息保存到配置文件中,这样可以在不修改程序的前提下移植数据库。
5.创建用于封装UserTbl表信息的实体类User类。
6.创建访问数据库的DAO接口类UserDao。
7.创建UserDao接口实现类UserDaoImpl。
8.创建LoginServlet类响应请求。
该类通过request.getParameter()方法获得请求参数,调用UserDaoImpl的login()方法,并根据登陆结果返回响应结果信息。
4.3程序主菜单实现
1.在工程的res\layout\目录下创建一个布局文件,该布局文件外层是LinearLayout,使用一个图片资源充当背景色,内层是一个GridView。
2.创建“MainMenuActivity”的Acivity,在onCreate()方法中设置Acivity界面标题和布局,实例化GridView组件,为GridView绑定Adapter。
3.定义一个名称为“ImageAdapter”的类,该类集成BaseAdapter,为GridView设置Adapter。
4.定义一个单击监听器,打开点餐界面。
4.4点餐功能客户端实现
1.在工程的res\layout\目录下创建一个名称为“order.xml”的布局文件,该文件外层使用LinearLayout布局,内层嵌套TableLayout。
TableLayout中有三行:
第一行TextView和一个Spinner,提示操作员选择课桌号;
第二行TextView和EditText,要求永华输入人数;
第三行3个Button,分别是开桌,点菜和下单,TableLayout下面有一个ListView用来显示客户点菜列表。
2.创建“OrderAcivity”的Activity,该Activity集成Acitivity,在OderActivity顶部声明使用到的实例,在OnCreate方法中初始化之。
3.开桌功能,要求操作员选择桌号并输入人数,并将这些信息保存到服务器端MySQL数据库中的OrderTbl表中。
这里需要为桌号下拉列表Spinner绑定数据,为开桌按钮添加监听器,实现具体操作。
4.点菜功能。
单击点菜按钮,弹出点菜对话框,要求输入点菜信息。
定义一个View视图,添加到对话框,并且自定义视图中有一个Spinner引用菜单列表数据。
在res\layout\目录下创建“order_detail.xml”的布局文件,外层是LinearLayout,内层嵌套TableLayout。
程序运行结果如图:
4.5点餐功能服务器端实现
1.在“WirelessOrder_Server”工程的“com.amaker.entity”包中创建一个实体类Order,该类封装了数据中OrderTbl表的信息,以面向对象的方法来操作该表。
2.在该包中创建实体类OrderDetail,该类封装了数据库中QueryOrderDetail表的信息,以面向对象的方法来操作该表。
3.在“com.amaker.dao”包中创建一个OrderDao接口,有四个方法,分别用来保存订单信息Order、保存订单详细信息OrderDetail、更新桌号状态为有人和更新桌号状态为空位。
4.在“com.amaker.dao.impl”包中创建OrderDaoImpl的实现类实现OrderDao接口里定义的方法。
5.在“com.amaker.servlet”包中创建一个名称“StarTableServlet”的Servlet,响应客户端请求,调用后台数据,保存数据,更新餐桌状态。
login_system.xml
<
?
xmlversion="
1.0"
encoding="
utf-8"
>
LinearLayoutxmlns:
android="
android:
orientation="
vertical"
layout_width="
fill_parent"
layout_height="
background="
@drawable/login"
>
<
TableLayout
stretchColumns="
1"
<
TableRow>
<
TextViewandroid:
text="
"
/>
/TableRow>
<
TextView
android:
用户名称:
id="
@+id/TextView"
wrap_content"
textColor="
#0000ff"
/>
EditText
@+id/userEditText"
/>
用户密码:
@+id/pwdEditText"
password="
true"
TableRow
gravity="
right"
Button
android:
取消"
@+id/cancelButton"
登陆"
@+id/loginButton"
/TableLayout>
/LinearLayout>
LoginActivity
packagecom.amaker.wlo;
importandroid.app.Activity;
importandroid.app.AlertDialog;
importandroid.content.DialogInterface;
importandroid.content.Intent;
importandroid.content.SharedPreferences;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.Toast;
importcom.amaker.util.HttpUtil;
publicclassLoginActivityextendsActivity{
//声明登录、取消按钮
privateButtoncancelBtn,loginBtn;
//声明用户名、密码输入框
privateEditTextuserEditText,pwdEditText;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
//设置标题
setTitle("
掌中宝无线订餐系统-用户登录"
);
//设置当前Activity界面布局
setContentView(R.layout.login_system);
//通过findViewById方法实例化组件
cancelBtn=(Button)findViewById(R.id.cancelButton);
loginBtn=(Button)findViewById(R.id.loginButton);
userEditText=(EditText)findViewById(R.id.userEditText);
pwdEditText=(EditText)findViewById(R.id.pwdEditText);
cancelBtn.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
finish();
}
});
loginBtn.setOnClickListener(newOnClickListener(){
if(validate()){
if(login()){
Intentintent=newIntent(LoginActivity.this,MainMenuActivity.class);
startActivity(intent);
}else{
showDialog("
用户名称或者密码错误,请重新输入!
}
}
}
//登录方法
privatebooleanlogin(){
//获得用户名称
Stringusername=userEditText.getText().toString();
//获得密码
Stringpwd=pwdEditText.getText().toString();
//获得登录结果
Stringresult=query(username,pwd);
if(result!
=null&
&
result.equals("
0"
)){
returnfalse;
}else{
saveUserMsg(result);
returntrue;
}
//将用户信息保存到配置文件
privatevoidsaveUserMsg(Stringmsg){
//用户编号
Stringid="
;
//用户名称
Stringname="
//获得信息数组
String[]msgs=msg.split("
intidx=msgs[0].indexOf("
="
id=msgs[0].substring(idx+1);
idx=msgs[1].indexOf("
name=msgs[1].substring(idx+1);
//共享信息
SharedPreferencespre=getSharedPreferences("
user_msg"
MODE_WORLD_WRITEABLE);
SharedPreferences.Editoreditor=pre.edit();
editor.putString("
id"
id);
name"
name);
mit();
//验证方法
privatebooleanvalidate(){
if(username.equals("
showDialog("
用户名称是必填项!
if(pwd.equals("
用户密码是必填项!
returntrue;
privatevoidshowDialog(Stringmsg){
AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
builder.setMessage(msg)
.setCancelable(false)
.setPositiveButton("
确定"
newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intid){
AlertDialogalert=builder.create();
alert.show();
//根据用户名称密码查询
privateStringquery(Stringaccount,Stringpassword){
//查询参数
StringqueryString="
account="
+account+"
+password;
//url
Stringurl=HttpUtil.BASE_URL+"
servlet/LoginServlet?
+queryString;
//查询返回结果
returnHttpUtil.queryStringForPost(url);
}
HttpUtil
packagecom.amaker.util;
importjava.io.IOException;
importorg.apache.http.HttpResponse;
importorg.apache.http.client.ClientProtocolException;
importorg.apache.http.client.methods.HttpGet;
importorg.apache.http.client.methods.HttpPost;
importorg.apache.http.impl.client.DefaultHttpClient;
importorg.apache.http.util.EntityUtils;
publicclassHttpUtil{
//基础URL
publicstaticfinalStringBASE_URL="
http:
//192.168.0.1:
8888/WirelessOrder_Server/"
//获得Get请求对象request
publicstaticHttpGetgetHttpGet(Stringurl){
HttpGetrequest=newHttpGet(url);