文档库 最新最全的文档下载
当前位置:文档库 › 基于安卓客户端的订餐系统的毕业论文

基于安卓客户端的订餐系统的毕业论文

基于Android客户端的食堂订餐系统的设计与实现

软件技术131班曹龙腾

一、引言 (1)

(一)开发背景 (1)

(二)系统设计的意义 (1)

(三)开发工具的介绍 (1)

二、需求分析 (2)

(一)经济可行性............................ 错误!未定义书签。

(二)技术可行性............................ 错误!未定义书签。

(三)功能需求分析.......................... 错误!未定义书签。

三、系统设计 (3)

(一)系统设计的体系结构 (3)

(二)系统流程图 (3)

(三)系统功能图 (3)

(四)系统活动图............................ 错误!未定义书签。

四、数据库表设计 (4)

(一)系统E-R图 (4)

(二)系统数据表设计 (4)

五、系统功能的具体实现 (7)

(一)网站首页 (7)

(二)食品查询 (17)

(三)用户注册 (23)

(四)用户信息修改界面 (23)

(五)后台管理登陆界面 (24)

(六)后台管理主界面 (25)

(七)用户管理 (25)

(八)管理员维护界面 (26)

(九)订餐管理界面 (27)

六、系统调试与测试 (29)

七、结论 (30)

基于Android客户端的食堂订餐系统的设计与实现

摘要:在网络技术快速发展的今天,原先普通的电话预定餐厅已经不能满足的功能需求。网络越来越贴近生活,本产品通过网络订餐方便商家客户互动。用户通过注册登陆的方式能及时看到餐饮商家更新的信息,包括餐厅环境,菜肴信息,菜价等,反馈饭菜的好吃与否。商家可及时更新信息,处理订单,通知客户订单确认。系统管理员可以维护更新发布消息,还可以推荐食品(根据反馈),菜谱管理等一些辅助功能。

关键词:Android;客户端;订餐

一、引言

(一)开发背景

在网络技术快速发展的今天,原先普通的电话预定餐厅已经不能满足的功能需求。网络越来越贴近生活,本产品通过网络订餐方便商家客户互动。用户通过注册登陆的方式能及时看到餐饮商家更新的信息,包括餐厅环境,菜肴信息,菜价等,反馈饭菜的好吃与否。商家可及时更新信息,处理订单,通知客户订单确认。系统管理员可以维护更新发布消息,还可以推荐食品(根据反馈),菜谱管理等一些辅助功能。

(二)面向对象

学校内的学生,教师

(三)开发工具的介绍

以下是对食物信息管理系统的开发环境进行阐述:

操作系统: Windows XP

数据库:Mysql8.2

开发工具:Eclipse

二、需求分析

1 用户注册

用户使用android APP进行注册或登录。若未注册可选择注册,只有注册用户方可点餐。未注册用户:只能登陆查询餐厅菜肴信息,不能订餐;

注册用户:注册提供用户名,密码邮箱,短号或其他联系方式,学号或工号。可以查询信息,可以订餐。

2登陆

客户端登陆进行点餐,服务端登陆进行管理。

3 查看餐厅信息

显示餐厅的各种信息,包括餐厅名称,ID图片文字说明。用户找到自己喜欢的餐厅后,点击餐厅图片进入此餐厅信息页面,可同构点击菜肴信息进入订餐。

4 查看菜肴信息

用户再点击进入菜肴信息后,可以查看所有菜肴信息,包括名称、图片、价格、餐厅等,找到自己喜欢的菜肴可以点击确定,还可以根据就餐爱好,分类查询,动态搜索。

5 订餐确认

用户在选择餐厅菜肴后,可点击确定,系统根据用户选择会自动生成订单信息,包括订单ID,用户名,学号或工号,餐厅ID,餐厅名称,菜肴ID,菜肴名称,菜式剩余数量,到餐时间,取货地点,联系方式等。用户查看又不满意可以取消订单或者更换菜肴,直至满意。然后点击订单确认,此订单生成,订单信息系统自动存储。

6 商家确认订单生成

在用户生成订单后,餐厅查看,并确认。

7 商家更新信息

商家根据实体店近期信息,可选择更新餐厅信息,包括菜肴信息及优惠信息等。更新菜肴信息:包括名称、口味、图片、编号、价格等,更新优惠信息。更新结束后,点击确认,信息生成并保存在服务端。

三、系统设计

(一)系统设计的体系结构

本系统的设计及开发采用了流行的B/S(浏览器/服务器)模式的数据库体系,用户端主要负责人机交互,包括一些与数据和应用关系的图形和界面运用。Web服务器主要负责对客户端应用程序的集中管理。应用服务器主要负责应用系统的逻辑结构和数据关系,即事务处理。应用服务器又可以根据其处理的具体业务不同而分为多个。数据服务器则主要负责数据的存储和组织、分布式管理、备份和同步等等。

(二)系统流程图

根据食物网站设计的特点,将其分为两大模块:前台用户模块和后台管理员模块。

1.前台模块流程图如图3-1所示:

图3-1 前台模块流程图

2.后台模块流程图如图3-2所示:

图3-2 后台模块流程图

(三)系统功能图

绘制系统结构图的过程,实际上就是对系统功能模块进行分解设计的过程,即合理地将数据流程图转变为所需要的系统结构图。

系统结构图将会使读者和用户能直观的了解系统的结构模式,理解系统的各个功能的结构,能很好地方便用户使用和理解整个系统。

根据上述分析,按照结构化程序设计的需求,得到系统模块图,如图3-3所示:

四、数据库表设计

(一)系统E-R图

E-R图由实体、实体的属性以及实体之间的关系三部分组成,实体是具有相同的性质并且彼此之间可以相互区分的现实世界对象的集合;属性是实体所具有的特征,它是描述实体或者关系的性质的数据项;实体之间的关系通常是指不同实体之间的关系。

图4-1 E-R图

(二)系统数据表设计

数据库在物理设备上的存储结构与存取方法被称为数据库的物理结构,它依赖与给定的计算机系统。为一个给定的逻辑数据模型选取一个最合适应用要求的物理结构。根据上面的实体关系分析以及ER图,设计系统的数据库表。

1.管理员信息表(t_admin),用来记录管理员的姓名及密码的信息。

表4-1 管理员信息表

2. 站内公告信息表(t_gonggao),主要记录了站内公告的标题、内容、日期和公告发布者,公告删除则是在数据库表中显示公告是否已被删除。

3.食物信息表(t_Food),该表主要用来记录食物的名称、所在地址、食物价格和食物的详情,并且可以在数据库表中查看到食物信息是否被删除,其中食物编号是表中的外键。

表4-3食物信息表

4.订单信息表(t_jiudian),用来记录客人的名称、地址以及客人的号码、联系人和订餐的一些标准,其中食物编号是信息表中的外键。

表4-4 酒店信息表

表4-5 食物信息表

6.订餐信息表(t_foods),用来记录订餐的标、内容以及订餐的日期。

表4-6 订餐信息表

记录了投票的名称和投票的日期。

8.用户信息表(t_user),用来记录用户名、密码、用户类型、用户的真实姓名及用户的地址、性别、用户的联系方式、邮箱和QQ。

表4-8 用户信息表

五、系统功能的具体实现

(一)网站首页

在食物资源管理网站首页可查看发布的订餐资讯、发布的食物公告信息、可按关键字查询食物信息、可进行投票调查等功能,用户登录之后即可进入网站首页,首页如下图5-1所示:

图5-1网站首页图

主要代码如下:package food.test.zqz.util;

import java.io.InputStream;

import https://www.wendangku.net/doc/eb15177867.html,.HttpURLConnection;

import https://www.wendangku.net/doc/eb15177867.html,.URL;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import org.apache.http.HttpResponse;

import https://www.wendangku.net/doc/eb15177867.html,ValuePair;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.message.BasicNameValuePair;

import org.apache.http.protocol.HTTP;

import org.apache.http.util.EntityUtils;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.util.Log;

import android.widget.ImageView;

import food.test.domain.Food;

/**

*

* @author zhuqiuzhu 从服务器获取有关主界面的所有数据

*

*/

public class GetNetWorkData {

//菜品图片资源定位符

public final static String URL = "http://10.0.2.2:8080/DestineFoodServer/images";

public final static String URL_AllFood = "http://10.0.2.2:8080/DestineFoodServer/GetAllFoodServlet";

/**

*

* @param url

* 服务器端的URI地址

* @param params

* 发给服务端的请求参数,以键值对的形式封装名字和对应的值,

*

* 其中params的名字键位应该跟服务端保持一致

*

* @return

*/

public final static StringBuffer getConnectionPost(String url,

HashMap params) {

StringBuffer sb = new StringBuffer();

HttpPost request = null;

HttpResponse response = null;

try {

if (url != null) {

/*----------请求--------------------*/

request = new HttpPost(url);

List list = new ArrayList();

for (Map.Entry entry : params.entrySet()) {

String name = entry.getKey();

String value = entry.getKey();

list.add(new BasicNameValuePair(name, value));

}

request.setEntity(new UrlEncodedFormEntity(list, HTTP.UTF_8));

/*-------------响应-------------------*/

response = new DefaultHttpClient().execute(request);

if (response.getStatusLine().getStatusCode() == 200) {

String temp = EntityUtils.toString(response.getEntity());

if (temp.trim().length() > 0) {

sb.append(temp);

} else {

sb.append("error response data length");

}

} else {

sb.append("error response code:").append(

response.getStatusLine().getStatusCode());

}

} else {

// url为空

return null;

}

} catch (Exception e) {

e.printStackTrace();

}

return sb;

}// end of getConnectionPost()

/**

*

* 对服务器端的响应数据进行“解码”

*

* 解码规则:约定服务器端传送的数据为字符串类型,格式为

* "[name=value;name=value;...],[name=value;...]...",

* 注意"="两端无空格,必须以"["开头,以"]"结束

*

*

* @param sb

* 服务器端的响应数据

* @return 一个以键值对形式存储的服务端响应数据

*/

public final static ArrayList decodeResponseData(String sb) {

ArrayList resData = new ArrayList();

String itemStr = "";

String name = "";

String value = "";

Food food;

do {

int a = sb.indexOf(',');

if (a == -1) {

itemStr = sb;

// decode(resData,initResponse);

food = new Food();

// 一个while语句对应一个Food对象,等等还要重构

while (true) {

int n_last = itemStr.indexOf('=');

name = itemStr.substring(1, n_last);

System.out.println(name);

int v_first = itemStr.indexOf('=');

itemStr = itemStr.substring(v_first);

int v_last = itemStr.indexOf(';');

if (v_last == -1) {

v_last = itemStr.indexOf(']');

}

value = itemStr.substring(1, v_last);

System.out.println(value);

if (name.equals("foodId") && name != null) {

food.foodId = Integer.parseInt(value);

} else if (name.equals("foodPrice") && name != null) {

food.foodPrice = Float.parseFloat(value);

} else if (name.equals("foodType") && name != null) {

food.foodType = Integer.parseInt(value);

} else if (name.equals("foodDescri") && name != null) {

food.foodDescri = value;

} else if (name.equals("foodImage") && name != null) { food.foodImage = value;

} else if (name.equals("foodName") && name != null) {

food.foodName = value;

} else {

Log.e("-----", "error params");

}

itemStr = itemStr.substring(v_last);

if (itemStr.trim().startsWith("]")

|| itemStr.trim().length() <= 2) {

break;

}

}// end of while

resData.add(food);

break;

}

itemStr = sb.substring(0, a );

// decode(resData,itemStr);

food = new Food();

while (true) {

int n_last = itemStr.indexOf('=');

name = itemStr.substring(1, n_last);

System.out.println(name);

int v_first = itemStr.indexOf('=');

itemStr = itemStr.substring(v_first);

int v_last = itemStr.indexOf(';');

if (v_last == -1) {

v_last = itemStr.indexOf(']');

}

value = itemStr.substring(1, v_last);

System.out.println(value);

Log.e("name" + name, "value" + value);

if (name.equals("foodId") && name != null) {

food.foodId = Integer.parseInt(value);

} else if (name.trim().equals("foodPrice") && name != null) {

Log.e("GetNet test", "---" + name);

food.foodPrice = Float.parseFloat(value);

} else if (name.equals("foodType") && name != null) {

Log.e("GetNet test", "---" + value);

food.foodType = Integer.parseInt(value);

} else if (name.equals("foodDescri") && name != null) {

food.foodDescri = value;

} else if (name.equals("foodImage") && name != null) { food.foodImage = value;

} else if (name.equals("foodName") && name != null) {

Log.e("GetNet test", "---" + value);

food.foodName = value;

} else {

Log.e("-----", "error params");

}

itemStr = itemStr.substring(v_last);

if (itemStr.trim().startsWith("]")

|| itemStr.trim().length() <= 2) {

break;

}

}// end of while

resData.add(food);

sb = sb.substring(a + 1);

} while (true);

return resData;

}// end of decodeResponseData()

/**

* 对图片的接收还要等等

*/

public static ArrayList decode(ArrayList resData, String itemStr) {

String name = "";

String value = "";

Food food = new Food();

while (true) {

int n_last = itemStr.indexOf('=');

name = itemStr.substring(1, n_last);

System.out.println(name);

int v_first = itemStr.indexOf('=');

itemStr = itemStr.substring(v_first);

int v_last = itemStr.indexOf(';');

if (v_last == -1) {

v_last = itemStr.indexOf(']');

}

value = itemStr.substring(1, v_last);

System.out.println(value);

itemStr = itemStr.substring(v_last);

if (itemStr.trim().startsWith("]") || itemStr.trim().length() <= 2) { break;

}

if (name.equals("foodId") && name != null) {

food.foodId = Integer.parseInt(value);

} else if (name.equals("foodPrice") && name != null) {

food.foodPrice = Float.parseFloat(value);

} else if (name.equals("foodType") && name != null) {

food.foodType = Integer.parseInt(value);

} else if (name.equals("foodDescri") && name != null) {

food.foodDescri = value;

} else if (name.equals("foodImage") && name != null) {

food.foodImage = value;

} else if (name.equals("foodName") && name != null) {

food.foodName = value;

} else {

Log.e("-----", "error params");

}

resData.add(food);

food = new Food();

}// end of while

return resData;

}// end of decode()

// /**

// *

// * 根据所传参数设定订餐的所有菜品的图片

// *

// * @param allImageInfo

// * 封装了所有要显示的图片信息url+foodImageView

// * url即对应服务器端资源地址(对于本方法资源即图片,同下), 可由{@link# setFoodBitmapUrl()}

// * 设定。

// * foodImageView订餐系统界面的UI元素

// */

// public static void setFoodBitMap(

// ArrayList> allImageInfo) {

//

// // 网络协议中的URL对象

// URL imageUrl = null;

// // 管理HTTP连接

// HttpURLConnection conn = null;

// try {

// if (url != null) {

//

// imageUrl = new URL(url);

// // 根据URL打开一个可以双向通信的连接

// conn = (HttpURLConnection) imageUrl.openConnection();

// // 设置连接可以输入

// conn.setDoInput(true);

// // 根据之前配置建立连接,建立后不能再设配置

// conn.connect();

// // 获取指定URL资源

// InputStream in = conn.getInputStream();

// Bitmap bitmap = BitmapFactory.decodeStream(in);

// if (foodImageView != null) {

//

// foodImageView.setImageBitmap(bitmap);

// }

// } else {

//

// Log.e("url-------", "为空");

// }

// } catch (Exception e) {

//

// e.printStackTrace();

// }

//

// }// end of setFoodBitMapByType()

/**

*

* @param foodType

* 菜品类型

* @param location

* 对应资源的位置

* @param foods

* 服务端所有的菜品信息对应的资源名称,详细设定见{@link food.test.domain.Food}类

* @return 对应菜品类型所有资源的URL的字符串

*/

public static ArrayList getAllFoodBitmapUrl(int foodType, String location,

ArrayList foods) {

// 存储所有指定菜品的定位字符串

ArrayList urls = new ArrayList();

while (foods.iterator().hasNext()) {

// 若该菜品属于指定foodType类型

if (foodType == foods.iterator().next().foodType) {

// 暂时存一个URL

String url = "";

if (location.endsWith("/")) {

url = location + foods.iterator().next().foodImage;

} else {

url = location + "/" + foods.iterator().next().foodImage;

}

urls.add(url);

}// end of if

}

return urls;

}// end of getAllFoodBitmapUrl()

/**

* 获取指定资源的具体位置

* @param location 资源集的URL

* @param foodImage 服务端某个的菜品信息对应的资源名称,详细设定见{@link food.test.domain.Food}类

* @return

*/

public static String getAssignedFoodBitmapUrl(String location,String foodImage){

String url = "";

if (location.endsWith("/")) {

url = location + foodImage;

} else {

url = location + "/" + foodImage;

}

return url;

}// end of getAssignedFoodBitmapUrl()

/**

*

* @param url 对应服务器端资源地址(对于本方法资源即图片,同下), 可由{@link# getAssignedFoodBitmapUrl()}

* 获取。

* @param foodImageView foodImageView订餐系统界面的UI元素

*/

public static void setAssignedFoodBimapView(String url, ImageView foodImageView){

// 网络协议中的URL对象

URL imageUrl = null;

// 管理HTTP连接

HttpURLConnection conn = null;

try {

if (url != null) {

imageUrl = new URL(url);

// 根据URL打开一个可以双向通信的连接

conn = (HttpURLConnection) imageUrl.openConnection();

// 设置连接可以输入

conn.setDoInput(true);

// 根据之前配置建立连接,建立后不能再设配置

conn.connect();

// 获取指定URL资源

InputStream in = conn.getInputStream();

Bitmap bitmap = BitmapFactory.decodeStream(in);

if (foodImageView != null) {

foodImageView.setImageBitmap(bitmap);

}

} else {

Log.e("url-------", "为空");

}

} catch (Exception e) {

e.printStackTrace();

}finally{

conn.disconnect();

}

}

}// end of GetNetWorkData

(二)食物查询

可在网站上按关键词进行查询相关食物,食物查询如下图5-2所示:

图5-2 食物查询

主要代码如下:package food.test.hyl;

import java.io.IOException;

import java.io.UnsupportedEncodingException;

import java.util.ArrayList;

import java.util.List;

import org.apache.http.HttpResponse;

import https://www.wendangku.net/doc/eb15177867.html,ValuePair;

import org.apache.http.client.ClientProtocolException; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost;

import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair;

import org.apache.http.protocol.HTTP;

import food.test.R;

import food.test.util.DButil;

import food.test.wjf.ShopCart;

import food.test.wjf.ShopCartShowAll;

import android.app.Activity;

import android.app.AlertDialog;

import android.app.Dialog;

import android.content.DialogInterface;

import android.content.Intent;

import android.content.SharedPreferences;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

public class OrderListActivity extends Activity {

private DButil db;

private TextView tvname_show;//客户的名字显示

private TextView tvid_show;//客户的Id显示

private EditText etaddress;//客户的地址

private EditText ete_mail;//客户的Email

private EditText ettelephone;//客户的电话号码

private EditText etsuggest;//客户的要求。(要不要加配料等)

private Button bsubmit;

private Button bcancel;

public String address;

public String email ;

public String telephone ;

public String userId;//客户的Id

public String suggest ;

public String userName;//客户的name

private ArrayList orderFoods = new ArrayList();//购物车中的菜的信息。

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Log.e("1111111111", "tttttt");

setContentView(https://www.wendangku.net/doc/eb15177867.html,yout.hyl_order);

SharedPreferences share = this.getSharedPreferences("android",MODE_WORLD_READABLE);

userId = share.getString("userId", "");

userName = share.getString("userName", "");;

db=new DButil(this);

orderFoods = db.getFoodFromCart();//从客户端数据库读出购物车中的信息。

final Object foods[][] = new Object[orderFoods.size()][5];

tvname_show = (TextView) findViewById(https://www.wendangku.net/doc/eb15177867.html,name_show);

tvid_show = (TextView) findViewById(https://www.wendangku.net/doc/eb15177867.html,Id_show);

etaddress = (EditText) findViewById(R.id.etaddress);//客户地址的编辑框

ete_mail = (EditText) findViewById(R.id.ete_mail);//客户邮箱编辑框

ettelephone = (EditText) findViewById(R.id.ettelephone);//客户电话

etsuggest = (EditText) findViewById(R.id.etsuggest);//客户的建议要求。

bsubmit = (Button) findViewById(R.id.bsubmit);

bcancel = (Button) findViewById(R.id.bcancel);

tvname_show.setText(userName);//显示客户的名字。

tvid_show.setText(userId);//显示客户的Id.

bsubmit.setOnClickListener(new OnClickListener() {//提交清单按钮被按下。

public void onClick(View v) {

address = etaddress.getText().toString();

email = ete_mail.getText().toString();

telephone = ettelephone.getText().toString();

suggest = etsuggest.getText().toString();

if(!"".equals(userId)&&!"".equals(address)&&!"".equals(telephone)&&orderFoo ds.size()>0){

callPost(foods,address,email,telephone,suggest,userId,userName);//向服务器传数据

db.deleteAllShopcart();

db.close();

finish();

}

else{

showDialog(2);

}

}

private void callPost(Object[][] foods, String address,

String email, String telephone, String suggest,String userId,String userName) {

HttpPost req = new HttpPost("http://10.0.2.2:8080/DestineFoodServer/AddOrderServlet");

List param = new ArrayList();

param.add(new BasicNameValuePair("userName",userName));

param.add(new BasicNameValuePair("userId",userId));

param.add(new BasicNameValuePair("address",address));

param.add(new BasicNameValuePair("email",email));

param.add(new BasicNameValuePair("telephone",telephone));

param.add(new BasicNameValuePair("suggest",suggest));

param.add(new

BasicNameValuePair("foodsNum",orderFoods.size()+""));

for(int i=0;i

相关文档