首页 > 代码库 > 团队作业(二)

团队作业(二)

 团队成员

凌霄   李嘉琪   曹瑞   王娇

  1 概述

1.1 开发背景

民以食为天。餐饮业是一种个性化、多样化的服务产业,餐饮传统的点菜方式是纯人工操作,由服务员记录顾客点的菜,在具体工作中容易出现以下问题:手写单据字迹潦草从而导致上错菜、传菜分单出错现象严重、加菜和查账程序较繁琐。处理特殊口味有遗漏和偏差、客人催菜遗忘现象较频繁、计算账单易出错、不方便人员管理等等。

电子商务则是最能凸显个性化、多样化服务的商务方式。随着网络技术的发展和普及,方便、快捷、个性化的网上订餐正在进入人们的生活。正因如此,无线点餐模式应运而生。它不仅可以有效地提高餐饮业的工作效率,更可以规范服务体系,提高整体服务质量和管理水平,并为规模化经营提供了坚实的技术基础。服务员使用手持终端为顾客点餐,当消费者点完餐后,服务员将存储在手持终端内的点餐信息,点餐信息同时也能被前台看到,方便快捷。

1.2 开发目标

本文介绍了无线点餐系统的开发过程。论文详尽论述了从需求分析、系统分析、概要设计、详细设计以及测试与调试的整个开发过程。首先系统地研究了无线点餐系统的背景和意义,分析了当今点餐系统的特点和共性,从而得出设计本系统的思路和方法。接着介绍了实现系统开发的Android平台环境,数据库用MySQL实现。同时简要介绍了以上工具的功能和方法。

概要设计分成后台数据库管理操作设计和客户端操作设计,同时介绍了数据库的建立和维护。详细设计主要阐述了点菜管理、并台管理、查台管理,转台管理,注销等实现,并给出了系统的部分设计代码。

1.3 参考资料

JDBC

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实现了所有这些面向标准的目标并且具有简单、严格类型定义且高性能实现的接口。

Jquery

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即可。

Ajax

Ajax指异步JavaScript及XML(Asynchronous JavaScript And XML),是一种用于创建更好更快以及交互性更强的Web应用程序的技术。Ajax的核心是JavaScript对象XmlHttpRequest。Ajax在浏览器与 Web 服务器之间使用异步数据传输(HTTP 请求)。简而言之,XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。

通过Ajax,您的JavaScript可使用 JavaScript的XMLHttpRequest对象来直接与服务器进行通信。通过这个对象,您的 JavaScript可在不重载页面的情况与Web服务器交换数据,这样就可使网页从服务器请求少量的信息。

Web应用程序较桌面应用程序有诸多优势;它们能够涉及广大的用户,它们更易安装及维护,也更易开发。

1.4 设计原则

1.可行性分析:随着经济的快速发展,点餐类网站,已如雨后春笋般的出现在了各大城市。特别是在公司,企业内部,团体点餐已经成为趋势。同时,随着全国人民的物质、精神和文化生活的高度提高,人们已经不再仅仅停留在吃饱的程度,而是不但要吃饱,还要吃好,并且越来越挑刺,正因为如此网上点餐业务的出现,正迎合了这些人的口味,他们不但省去了自己做饭的麻烦,而且也能寻找和发现新的菜种,品尝不同风格和不同种类的菜品,网上点餐业务在中国有着极大的发展空间和良好的发展前景。当代大学生与白领工作人士作为社会中的重要群体,他们对饮食的要求都在不断提高,饮食在他们生活中起着重要作用。因此,面向大学生与都市白领人士的网上点餐系统的设计有着良好的现实意义。

2.菜单需要用文件来存储,ini或者txt,或者其他类型,可以自己选择。   

  1. 需求分析的要求不够仔细,比如系统需要几个管理员,每个管理员密码是否一样,系统可不可以提供注册的功能类似的问题,大家可以自由发挥,自己添加,功能越多越好  
  2. 一定要注意人性化,这个程序是给别人用的,要加上菜单选项,给用户选择功能 

需求分析

2.1 需求陈述

系统目标和要求

首先,我们得确定使用这个系统的用户应该有顾客、服务员、收银员。顾客和服务员应该是系统数据的起点,由他们做出相应的操作,然后系统进行处理;收银员则为系统数据的终点。

该系统在性能功能上应达到如下要求:

1.操作简单、界面友好:完全控件式的页面布局,使得菜品,资讯,座位等信息的

录入工作更简便,许多选项包括餐厅信息,桌位,包房信息等只需要点击鼠标就可以完成;另外,跟踪出现的提示信息也让用户随时清楚自己的操作情况。对常见的类似网站的管理的各个方面:基本信息录入、浏览、删除、修改、搜索等方面都大体实现,顾客对菜品的预定及支付方式;

2.即时可见:对客户预定餐饮信息的处理(包括录入、删除)将立即在另一应用端及服务器的对应栏目显示出来,达到“即时点击、即时见效”的功能;

3.系统运行应该快速、稳定、高效和可靠;

4.在结构上应具有很好的可扩展性,便于将来的功能扩展和维护。

2.2 操作用例

管理用户在登录窗口,填入用户名与密码,登录完毕后让客户进行注册登录,并选桌看菜单点菜加入购物车,最后下单并确认点单再取号。然后服务人员根据客户需要可为其进行查台换台并台添菜结账等添加功能。

2.3 功能分析划分

本系统主要分两部分:

  1. Web点餐系统与后台:

Web系统主要是给客户点菜;客户只能点菜、拿号。

  1. 终端设备与后台:

终端设备指的是基于安卓平台的一个设备。主要给服务员、收银员等工作人员使用;能更新菜谱,结账,点菜、查看等功能。

2.3.1 web点餐系统

1)登录——若没有用户账号,提供注册

2)查看菜单

3)查看菜单详情

4)加入购物车(点菜)

5)下单(提交预定菜单)

6)拿号

2.3.2 终端设备

终端系统主要有以下几个模块构成:结台管理、更新管理等功能。

1)点菜——包括开桌、点菜、下单三个功能

2)并台——两桌拼接

3)结台——在顾客就餐完毕后,计费付帐而设定的功能,是客人能够一目了然,不用担心有什么算错的问题。

4)查台——查看座位情况,哪些是有人,哪些是空位

2.4 运行环境

Eclipse

Eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse附带了一个标准的插件集,包括Java开发工具(Java Development Tools,JDT)。Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++和Python的开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。

1.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发布,第三方组件有各自自身的许可协议。

2.Eclipse Android环境搭建

1)JDK安装

a)我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量:

JAVA_HOME值为:安装JDK的目录;

CLASSPATH值为:D:\AndroidDeveloper\android-sdk-windows\tools;

b)Path:在开始追加%JAVA_HOME%\bin;

c)NOTE:前面四步设置环境变量对搭建Android开发环境不是必须的,可以跳过。

安装完成之后,可以在检查JDK是否安装成功。打开cmd窗口,输入Java –version查看JDK的版本信息。

2)Eclipse安装

http://www.eclipse.org/downloads/,下载Eclipse IDE for Java Developers(92M)的win 32bit版,Android SDK安装在Android Developers下载android-sdk_r05

-windows.zip,下载完成后解压到任意路径。

a)运行SDK Setup.exe,点击Available Packages。如果没有出现可安装的包,请点击Settings,选中Misc中的“Force https://...” 这项,再点击Available Packages。

b)选择希望安装的SDK及其文档或者其它包,点击Installation Selected、Accept All、Install Accepted,开始下载安装所选包。

c)在用户变量中新建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开发工具开发的。

Tomcat服务器

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服务器。

应用平台Android

Android是基于Linux内核的操作系统,早期由Google开发,后由开放手机联盟开发。它采用了软件堆的架构,主要分为三部分。底层以Linux内核工作为基础,只提供基本功能;其他的应用软件则由各公司自行开发,以Java作为编写程序的一部分。另外,为了推广此技术,Google和其它几十个手机公司建立了开放手机联盟。Android在未公开之前常被传闻为GPhone。

它采用了软件堆层(software stack,又名软件叠层)的架构,主要分为三部分:底层以Linux核心为基础,由c语言开发,只提供基本功能。中间层包括函数库Library和虚拟机Virtual Machine,由C++开发。最上层是各种应用软件,包括通话程序,短信程序等,应用软件则由各公司自行开发,以Java编写。

Android平台五大优势特色:

1)开放性

  在优势方面,Android平台首先就是其开放性,开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。

开放性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,最大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。

2)挣脱运营商的束缚

在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。自从iPhone上市,用户可以更加方便地连接网络,运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈。

3)丰富的硬件选择

这一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容。好比你从诺基亚Symbian风格手机一下改用苹果iPhone,同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是可以方便地转移。

4)不受任何限制的开发商

Android平台提供给第三方开发商一个十分宽泛、自由的环境。因此不会受到各种条条框框的阻挠,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏如何控制正是留给Android难题之一。

5)无缝结合的Google应用

如今叱咤互联网的Google已经走过10年历史。从搜索巨人到全面的互联网渗透,Google服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的Google服务。

3 总体设计

3.1 系统建模

3.1.1 层次方框图

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.1.2  ER图(实体-联系图)

数据库的概念设计,即利用数据模型进行概念数据库的模式设计。根据无线点餐系统的需求,设计出以下的实体-关系模型(E-R)图如图。

 

 

 

 

 

 

 

 

 

 

 

                            3-3 实体联系图

 

3.2 接口设计

3.2.1 内部接口设计

package dao;

 

import java.util.List;

 

import entity.Menutbl;

 

public interface MenutblDao {

public List<Menutbl> findAll();

   

public void delete(Menutbl menu);

   

public int save(Menutbl menu);

   

public void update(Menutbl menu);

   

public Menutbl findById(int id);

}

package dao;

 

import java.util.List;

 

import entity.Orderdetailtbl;

 

 

public interface OrderdetailDao {

public List<Orderdetailtbl> findAll();

   

public void delete(Orderdetailtbl detail);

   

public int save(Orderdetailtbl detail);

   

public void update(Orderdetailtbl detail);

   

public Orderdetailtbl findById(int id);

}

 

package dao;

 

import java.util.List;

 

import entity.Ordertbl;

 

public interface OrdertblDao {

public List<Ordertbl> findAll();

   

public void delete(Ordertbl order);

   

public int save(Ordertbl order);

   

public void update(Ordertbl order);

   

public Ordertbl findById(int id);

}

 

package dao;

 

import java.util.List;

 

import entity.Tabletbl;

 

public interface TabletblDao {

public List<Tabletbl> findAll();

   

public void delete(Tabletbl table);

   

public int save(Tabletbl table);

   

public void update(Tabletbl table);

   

public Tabletbl findById(int id);

}

 

package dao;

 

import java.util.List;

 

import entity.Usertbl;

 

public interface UsertblDao {

public List<Usertbl> findAll();

   

public void delete(Usertbl user);

   

public int save(Usertbl user);

   

public void update(Usertbl user);

   

public Usertbl findById(int id);

 

public Usertbl checkLogin(String name,String pwd);

}

package com.amaker.dao;

// 转台DAO接口

public interface ChangeTableDao {

// 转台方法

public void changeTable(int orderId,int tableId);

}

package com.amaker.dao;

import java.util.List;

public interface CheckTableDao {

// 获得餐桌列表

public List getTableList();

}

package com.amaker.dao;

 

import com.amaker.entity.Order;

import com.amaker.entity.OrderDetail;

public interface OrderDao {

// 保存开桌信息

public int saveOrder(Order o );

// 保存点菜列表信息

public void saveOrderDetail(OrderDetail od);

// 更新桌号状态,有人

public void updateTableStatus(Order o);

// 更新桌号状态,空位

public void updateTableStatus2(int orderId);

}

package com.amaker.dao;

 

import java.util.List;

 

import com.amaker.entity.QueryOrder;

 

public interface PayDao {

// 查询订单信息

public QueryOrder getOrderById(int id);

// 查询订单详细

public List getOrderDetailList(int id);

// 结算

public void pay(int id);

}

package com.amaker.dao;

 

import java.util.List;

// 并台功能接口

public interface UnionTableDao {

// 获得桌位列表

public  List getTableList();

// 更新合并后的数据

public void updateStatus(int tableId1,int tableId2);

}

 

package com.amaker.dao;

import java.util.List;

public interface UpdateDao {

// 获得菜单列表

public List getMenuList();

// 获得餐桌列表

public List getTableList();

}

 

package com.amaker.dao;

 

import com.amaker.entity.User;

// UesrDao 接口

public interface UserDao {

// 登录方法

public User login(String account,String password);

}

 

3.2.2 登录界面设计

  1. 登录功能

以下是登录功能的关键代码:

  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 = "http://www.mamicode.com/show.jsp";

}

}

</script>

3.3 数据库结构设计

3.3.1 数据库E-R图

数据库的概念设计,即利用数据模型进行概念数据库的模式设计。根据无线点餐系统的需求,设计出以下的实体-关系模型(E-R)图如图。

 

 

 

 

 

 

 

 

 

 

 

                            3-3 实体联系图

 

3.3.2 数据库逻辑设计

设计表结构,如下图所示:

表3.1 用户信息表

列名

数据类型

是否允许为空

说明

id

int11

序号

name

varchar50

用户名

password

varchar50

密码

account

varchar50

登录名

gender

varchar20

性别

permission

int11

权限

remark

varchar2000

备注

3.2 菜单信息表

列名

数据类型

是否允许为空

说明

id

int11

序号

price

int11

价格

typeId

int11

类型

name

varchar50

菜名

pic

varchar1000

图片

remark

varchar2000

备注

3.3 订单信息表

列名

数据类型

是否允许为空

说明

id

int11

序号

orderTime

varchar100

下单时间

userId

int11

下单人

tableId

int11

桌号

personNum

int11

人数

isPay

int11

是否支付

remark

varchar2000

备注

 

3.4 订单信息详情表

列名

数据类型

是否允许为空

说明

id

int11

序号

orderId

int11

订单ID

menuId

int11

ID

num

int11

订购数量

remark

varchar2000

备注

3.5 餐桌信息表

列名

数据类型

是否允许为空

说明

id

int11

序号

num

int11

订购数量

flag

int11

标识

remark

varchar2000

备注

3.4 登录出错处理

本系统的登录出错处理如下图:

                 

3.5 安全保密设计

登录界面主要是由服务人员来操作的,所以要简单明了易操作。利用数据库对用户信息进行核对,核对正确后利用界面跳转到主菜单界面。服务人员的账号密码是提前在服务器数据库中设置的,每个服务人员都有自己单独的唯一的一个账号密码用来登录,这样可以责任到人,不至于出现混乱,否则出现错误都不知道是哪个环节的问题。

4 详细设计

4.1 程序流程图

 

4.2 伪代码编写

以下是点菜功能的关键代码:

// 添菜监听器

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();

}

5 实现

5.1 编码

5.1.1 代码约定

1. 文件编码

2. 包名使用小写字母

3. import不要使用通配符。即,不要出现类似这样的import语句:import Java.util.*;

4. 列长限制。一个项目可以选择一行80个字符或100个字符的列限制,超出列长限制时换行,换行时缩进至少4个空格,缩进不要用tab。

5. 注释。注释应少而精,代码的关键处应该有注释, 注释不能误导读者。

6. 变量声明。每次只声明一个变量,不要使用组合声明,比如int a, b;需要变量时才声明,并尽快进行初始化。

7. 命名约定。命名应该:见名知意、简洁,避免拼音与英文混用。

命名风格:

类名以UpperCamelCase风格编写

非常量字段名、方法名、参数名、局部变量名以lowerCamelCase风格编写

常量名以CONSTANT_CASE风格编写

8. 类成员顺序。每个类应该以某种逻辑去排序它的成员,维护者应该要能解释这种排序逻辑。比如,新的方法不能总是习惯性地添加到类的结尾。

9. 慎用System.out.println()。使用log而不是System.out.println()

10. 使用大括号(即使是可选的)。大括号与if, else, for, do, while语句一起使用,即使只有一条语句(或是空),也应该把大括号写上。

11. 减少代码嵌套,代码嵌套层次达3层以上时,一般人理解起来都会困难。减少嵌套的方法有很多:(1)合并条件;(2)利用return以省略后面的else;(3)使用子方法

12. 异常处理。捕获的异常不能忽视,典型的响应方式是打印日志

5.1.2 代码编写原则

 1、可以抽象化的尽量抽象化

 2、import的类尽可能的少

 3、尽可能使用静态类或单例,但可能出现同步问题的地方尽可能不用

 4、通用的代码里面绝不包含特定业务逻辑的任何代码段

 5、不考虑数据库的独立性

 6、没有经过测试的代码绝不发布

5.2 测试要点

5.2.1 登录测试要点

1.  在登录时,首先要填写相应的用户编号和密码。

2.  在登录时,当用户的编号和用户密码为空时,此时不能进行提交,并在下方给出相应的提示。

以上的两点是登录的时候会遇到的,对此测试用例:

账号的测试用例:账号abcdef123456 密码 123456

此时账号中有非数字的字符,通过正则表达式进行比较。

5.2.2 主界面测试要点

如果登录成功,登录成功后进入主页面,就能看到点菜,查台,注销,结台等选项。点击点菜:

开桌:若当前桌号是开过桌的,开桌按钮将会不可用,并且人数自动为上次开过桌之后的人数,这一步是通过桌号来从数据库中判断桌子的标示实现的,可以修改。

添菜:所有的菜单信息都是从数据库中取出的,与web版本向客户提供的信息保持一致。然后我们可以看到菜名进行选菜。

点击下单直接下单,下单成功。下单即向数据库的订单详情表插入数据。

    结账这一功能,就是从点餐详情表中取出所有订单信息,并且再跟据菜号,将菜肴的价格取出,相加得到总价格显示出来。

5.3 测试结果和总结

5.3.1 测试结果:

系统主要是实现网上浏览菜单、点餐、产生订单等功能的系统。需要实现菜品信息的动态提示、购物车管理、客户信息注册、登录管理、订单处理、信息反馈等模块。测试成功后:当客户进入网上点餐时,应该在主页面中分类显示最新的菜品信息,以供客户选择所需菜品,同时提供按菜品名称,快速查询所需菜品信息的功能。当客户选择预定某个菜品时,应该能够将对应菜品信息,如:价格、数量记录到对应的购物车中,此时客户可以选择选择其他菜品或是查看自己的购物车,最后,在购物车中填写相应的送餐信息,提交点餐订单后,自动清除以生成订单的购物车中的信息。

5.3.2 总结:

这个项目是我接手的第一个项目,也是一个理论联系实际的过程,回想起来,收获颇丰。

经验主要如下:
1、学会如何将书中的理论与实践相结合;
2、学会如何根据项目Demo及需求文档撰写测试文档;
3、学会如何根据项目变更修改测试文档;
4、学会如何用英文撰写文档,提交,验证问题;
5、 学会如何理清项目逻辑,如何更深入地撰写文档并进行测试;
6、学会如何与编程人员沟通交流,获得解答,以便正确提交BUG;

教训如下:
1、撰写测试文档前没有理清业务逻辑,导致前期测试深度不够;
2、撰写测试文档时结构不清晰,导致后期难以维护和修改;
3、测试过程中心态有些浮躁,有些急于求成;
4、还没有形成测试思维,测试过程思维显得有些混乱;
5、对BUG轻重缓急界定不够,导致有时测试难以继续进行

 

6 维护

6.1 维护方法

1、首先起名要好,文件名函数名变量名字段名等等。

2、目录归类,常用函数用一个公用文件装起来,其它用include文件夹分成多个文件装。

3、更新日志,记下自己修改的文件及其内容。

4.大局观。应该知道写的小函数在整个项目构架中的位置和他工作的意义。

5结对编程,这样会让代码的质量和可读性更高。

6克制的注释。不要重复注释,与其写一堆注释,不如写几行足够清晰的程序。

7注重接口的设计和接口的连接。

6.2 维护文档

1.项目需求描述文件;2.数据库结构说明;3.软件架构描述与关键流程说明;4.系统操作手册;5.软件升级记录;另外:软件代码本身的也要有合理的注释。

6.3 功能拓展方法

对于功能拓展方面,我们团队对其进行了如下设想,添加转台和并台两个功能让这个系统更加完整。

转台:

换台成功后有提示,转台对于数据库的操作,就是将原来订单号的中的桌号编程就该之后的桌号。换座位成功

并台:

所谓并台,就是两桌人并成一桌,对于数据库所做的操作有:先把被并的目标桌号的状态修改为空位,再把订单上的桌号修改为并台后的桌号即可。并台必须针对的是已经开过桌的桌子。

团队作业(二)