基于ANDROID的美食分享APP的设计与实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/biyesheji51qqcom/article/details/89091926

获得更好的阅读体验请访问:http://www.itbiyesheji.com/index.php/2019/04/03/基于android的美食分享app的设计与实现/

系统主要的功能性能需求完成情况

美食分享软件系统包括了一般用户、系统管理员两种用户,根据其不同的角色对系统有不同的需求。我们的美食分享系统把绝大部分的功能都实现了,详细见下面分析。而且在这基础上,还在Web端实现了所有功能(原计划仅仅打算在Android端实现本系统)。

  1. 一般用户需求

一般用户可以通过安装在Android系统上的应用程序来访问美食分享软件。在手n机端,用户可以注册或者登录系统,登录之后能够进行搜索美食,查看美食,收藏美食,上传美食等操作。这些功能已经全部实现了。

2. 管理员需求

当管理员登录美食分享系统时,可以对整个系统进行管理,包括添加美食种类,删除美食种类,更改每日推荐等等。这些功能都已经实现,而且直接登录数据库图形化管理工具Navicat,操作数据库更为方便。操作页面事例如图1.1所示:

图1-1 操作页面示例

性能方面,就下面数据精确度几个指标进行展开:我们的系统能够做到:用户在进行美食搜索时要保证查全率、查准率,所有符合条件的美食都能被找到,这达到了预期的目标。

  • 时间特性

1.打开一个新的链接的时间不能超过3秒。

2.系统处理美食搜索操作响应时间不能超过10秒。

扫描二维码关注公众号,回复: 6001795 查看本文章

3.我们的系统,打开一个新链接需要时间不到1秒,在毫秒的量级;

4.进行美食搜索操作同样也不到1秒,当然,这与我们的数据库里能够搜索的内容偏少有关。

  • 适应性

本软件系统应能在Android 2.2及其以上手机操作系统上良好运行,Web端应能使用IE6.0以上内核的浏览器,Chrome浏览器,FireFox浏览器进行访问,完全达到预期目标。

  • 安全性

我们的系统具有一定程度的权限管理,逻辑分析以及检测数据完整性功能,各个功能模块需要相应的权限才能访问。例如:非注册用户(游客)只具备浏览美食,搜索美食的权限,只有登录用户才可以对美食进行收藏、上传等操作。这一部分在Web端和Android端已经实现,但是还有一些本地验证等还需要进一步的完善。

  • 可靠性

只要服务器不宕机(充当服务器的PC不关机),系统可以保证一直正常运行。

1.2 系统主要设计技术

我们在系统中主要运用的一些技术有:

  1. 使用jquery图片延迟加载插件jquery.lazyload实现图片延迟

实现原理:把所有需要延时加载的图片改成如下的格式:<img lazy_src=”图片路径” border=”0″/>,然后在页面加载时,把所有使用了lazy_src的图片都保存到数组里,然后在滚动时计算可视区域的top,然后把延时加载的图片中top小于当前可视区域(即图片出现在可视区域内)的图片的src的值用lazy_src的来替换(加载图片)。

使用方法:把页面上需要延时加载的图片src改成为lazy_src,然后把上面的js放到body最后面,然后调用:lazyLoad.init();调用的方法可以使用firebug来查看一时图片是否是延时加载。

特效优点:

(1)加速wordpress站点的页面载入速度;

(2)不唐突的图片渐显方式;

(3)代码精简,便于操作维护。

  • JAVA的动态代理 

(1)代理模式 

代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 

按照代理的创建时期,代理类可以分为两种。 

静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 

动态代理:在程序运行时,运用反射机制动态创建而成。

(2)工厂模式

实例化对象模式,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例 对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。

  • Ajax异步判断

本系统对一些主键是否重复的判断,采用Ajax异步方式进行,只要光标离开输入框就和数据库进行查找比对。整个过程是异步进行的不会影响下面的输入,比对完成后,如果有重复,在对应的输入框后面用红字提示已经存在的信息。Ajax的验证代码流程如下。

(1)创建Ajax引擎对象XMLHttpRequest。

    xmlHttp = new XMLHttpRequest();

(2)调用open方法与Ajax引擎建立连接,并告诉Ajax引擎我们的请求方式为get,请求url及采用异步方式。

    xmlHttp.open(“GET”, url, true);

(3)告诉Ajax引擎处理完后,如何把结果反馈给我们,我们通常指定一个方法句柄,那么Ajax就会调用我们指定的方法,从而就可以得到Ajax引擎返回的数据,这种方式一般称为回调机制。

   xmlHttp.onreadystatechange = function(){ };

(4)最后调用send方法,将设置信息发送到Ajax引擎让其处理。

    xmlHttp.send(null);

1.3 系统开发管理过程

我们组进行软件开发的过程中,使用了SVN进行代码版本管理。这是提交的部分记录。

图1-2 SVN提交记录

其中MSTXClient项目(客户端)的代码行数为3556行,MSTX项目(服务器端)的代码行数为4753行。

二 系统设计与实现

2.1 系统结构设计

  1. WEB端逻辑架构

本系统开发采用三层架构:表示层,JSP/ Servlet主要负责相关的显示;业务逻辑层,主要实现业务规则;持久化层,主要包装持久化逻辑。三层架构是在MVC模式的基础上抽取了一个持久化层。抽取持久化层,主要是为了持久层的改变不影响业务逻辑层,为了更加清楚的划分职责。

采用抽象工厂方法,三层架构依赖于抽象,每一层都建立一个抽象,是自上而下的依赖。如:程序对JDBC的依赖就是依赖了他的抽象层,程序和JDBC是单向依赖,只调用JDBC,JDBC实现不会调用程序,特别容易扩展。

三层架构模式时序图如图2.l所示。

图2.1  三层架构模式时序图

三层架构模式层与层的依赖关系如图2.2所示。

 

图2.2  层与层的依赖关系

  • WEB端物理架构
  • Web服务器一台,技术解决方案apache-tomcat-7.0.57。
  • Database服务器一台,技术解决方案MySQL Server 5.1.73。
  • WEB端总体框架

如图2.3所示:

图2.3 系统结构图

JSP/ Servlet主要负责相关的显示,使用人员点击jsp页面内容,相关动作提交到Servlet业务处理端,调用业务逻辑方法,调用持久化业务逻辑和数据库打交道。然后返回jsp界面,渲染后在显示给用户。

4.Android端的类架构图

如下图2-4所示:

图2.4Android类架构图

2.2 系统主要功能接口设计

 众所周知,接口是提供给其他模块或者系统使用的一种约定或者规范。因此接口必须要保证足够的稳定性和易用性。这是设计接口的基本要求。

在Android端,各个Activity模块之间的数据交互主要是利用Bundle类对数据进行封装,然后通过Intent机制在各个模块之间进行传输。

Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来完成请求。比如,有一个Activity希望打开网页浏览器查看某一网页的内容,那么这个Activity只需要发出WEB_SEARCH_ACTION给Android,Android就会根据Intent的请求内容,查询各组件注册时声明的IntentFilter,找到网页浏览器的Activity来浏览网页。 

要在不同的activity之间传递数据,就要在intent中包含相应的内容,一般来说数据中最基本的应该包括:

  • Action:用来指明要实施的动作是什么,比如说ACTION_VIEW, ACTION_EDIT等。具体的可以查阅android SDK-> reference中的Android.content.intent类,里面的constants中定义了所有的action。
  • Data: 要事实的具体的数据,一般由一个Uri变量来表示。
  • Category:一个字符串,包含了关于处理该intent的组件的种类的信息。一个intent对象可以有任意个category。
  • Type:显式指定Intent的数据类型(MIME)(多用途互联网邮件扩展,Multipurpose Internet Mail Extensions)。

登录模块

1)请求消息

接口含义:客户端通过socket请求提交用户信息进行验证

接口协议:TCP/IP协议

命令字:dout.writeUTF

参数 描述 约束
uid 系统给用户分配的id 必须是注册成功的id
pwd 密码 必须是对应的密码

2)接收消息

接口含义:客户端接收来自服务器端发来的消息

接口协议:TCP/IP协议

命令字:din.writeUTF

参数 描述 约束
uid 系统给用户分配的id 必须是注册成功的id
pwd 密码 必须是对应的密码

这部分的核心代码实现如下:

注册模块

  • 请求消息

接口含义:客户端通过socket请求提交用户信息进行注册

接口协议:TCP/IP协议

命令字:dout.writeUTF

参数 描述 约束
u_name 用户名 不能为空
u_pwd1 密码 两次密码输入一致
u_qq QQ 数字
u_Email 邮箱地址 不能为空
u_dis 个人描述
  • 接收消息

接口含义:客户端接收来自服务器端发来的消息

接口协议:TCP/IP协议

命令字:din.writeUTF

参数 描述 约束
uid 系统给用户分配的id 必须是注册成功的id
u_name 用户名 提交的用户名

这部分的核心代码实现如下:

拍照模块

这一部分调用了手机上的相机api,同时将得到的照片提交到上传模块中,与其他内容一起提交到服务器中。

拍照的API函数:myCamera.takePicture

调用的过程:

返回数据:

接口含义:拍照模块向上传模块发送图片数据

接口协议:TCP/IP协议

命令字:onPictureTaken

参数 描述 约束
data 图片二进制数据

主要实现代码:

地图模块

这一部分调用了Google地图的API,同时将得到的照片提交到上传模块中,与其他内容一起提交到服务器中。

调用的Google地图API包括以下几个方面:

返回数据:

接口含义:地图模块向上传模块发送图片数据

接口协议:TCP/IP协议

命令字:setResult

参数 描述 约束
RESULT_OK 标识符
lat 经度 浮点数
lon 纬度 浮点数

主要实现代码:

其他模块的接口设计与上述几个模块的接口设计类似,在这不再赘述。

2.3 系统的设计模式应用

1 MVC设计模式

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面 显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于 映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。MVC结构如图2-5所示:

图2-5 MVC结构图

抽象工厂模式

下面是系统封装的抽象工厂描述性说明

  • 创建抽象工厂类

public class BeanFactory

  • 保存相关对象

保存Service相关对象private Map serviceMap = new HashMap();

保存Dao相关对象private Map daoMap = new HashMap();

  • 返回相关对象实例

return serviceMap.get(c.getName());

return daoMap.get(c.getName());

  • 将创建好多的对象放到Map中

serviceMap.put(c.getName(), service); daoMap.put(c.getName(), dao);

  • 返回系列产品

return service; return dao;

抽象工厂模式示意图如图2-6所示。

3 Filter统一控制

本系统采用Filter技术面向切面编程,实现了统一处理字符集;简单的webCache,统一控制缓存;只有经过登录页面登陆成功才能进入其他页面。体现了一个责任链模式,提供了一种声明式服务,具有可插拔的能力。采用Filter技术对Request和Response请求进行了拦截,这对系统后期的完善,权限的分配,病毒的拦截有至关重要的作用。

采用Filter技术主要是调用下面的方法

public void doFilter(ServletRequest request, ServletResponse response,

                     FilterChain chain) {

          //完成相关的控制语句

                     chain.doFilter(request, response);

       }

通过本系统中的用户维护说明Filter的基本原理如图2-7所示。

图2-7 Filter统一控制流程图

2.4 系统的AOP 设计应用

面向方面编程(Aspect Oriented Programming,简称AOP)是一种声明式编程(Declarative Programming)。声明式编程是和命令式编程(Imperative Programming)相对的概念。我们平时使用的编程语言,比如C++、Java、Ruby、Python等,都属命令式编程。

命令式编程的意思是, 程序员需要一步步写清楚程序需要如何做什么(How to do What)。声明式编程的意思是,程序员不需要一步步告诉程序如何做,只需要告诉程序在哪些地方做什么(Where to do What)。比起命令式编程来,声明式编程是在一个更高的层次上编程。声明式编程语言是更高级的语言。声明式编程通常处理一些总结性、总览性的工作,不适 合做顺序相关的细节相关的底层工作。

本系统中能用到AOP的地方:

1.统一字符编码处理

2.打印出所有业务类的工作流程日志

3.所有关键业务方法都加上事务管理功能

2.5 系统的非功能设计(如性能、安全性等)

这一部分已经在第一节阐述,这里不再赘述。

2.6 系统的数据库设计

本系统中的信息表主要有10张表:头像表、用户信息表、美食种类表、美食信息表、每日推荐表、我的收藏表、广告表、广告图片表和最大编号表。他们之间的关系可以用图2-8来表示。

图 2-8 数据库设计图

部分数据库建表语句如下:

create database mstx;

use mstx;

CREATE TABLE mstx_user(/*用户信息表*/

       uid         int          NOT NULL,

       u_name  char(50) NOT NULL,

       u_qq      varchar(15),

       u_pwd   varchar(50),

       u_Email varchar(50),

       u_head   int,

       u_admin       boolean NOT NULL,

       u_mood varchar(50),

       u_integral     int,

       u_hobby       varchar(50),

       u_level   int,

       u_number     int,

       PRIMARY KEY(uid),

       FOREIGN KEY(u_head) REFERENCES mstx_head(tid)

);

       FOREIGN KEY(gid) REFERENCES mstx_ads(gid)

);

CREATE TABLE mstx_info(/*美食信息表*/

       mid                    int NOT NULL, 

       info_title             char(50) NOT NULL,

       info_dis        text,

       info_lon        float(17,14),

       info_lat         float(17,14),

       info_sort              int,

       info_price            double,

       info_time             TIMESTAMP,

       uid                       int,

       hotel_name          char(50),

       PRIMARY KEY(mid),

       FOREIGN KEY(uid) REFERENCES mstx_user(uid),

       FOREIGN KEY(info_sort) REFERENCES mstx_sort(sid)

);

其他表格设计类似,不再赘述。

2.7 用户界面设计

我们采用了线性布局,线性布局时最简单布局之一,提供了控件水平或者垂直排列的模型。使用此布局时可以通过设置控件的weight参数控制各个控件在容器中的相对大小。界面主要分为八个部分:包括登录、注册、搜索、拍照界面等等。初步设计的WEB端界面如下:

  1. 启动配置好的Tomcat,运行该系统,首先进入该系统主页,如图2-7所示,用户可以在主页点击按钮或者链接进入相应界面:

2-7 首页

  • 在主页可以点击”注册”按钮注册用户,然后通过”登陆”按钮登陆该系统,登陆界面如图2-8所示:

2-8 注册界面

3.登陆成功后,会自动跳转到系统主页,在主页点击”我的收藏”会进入”我的收藏”,收藏用户美食,如图2-9所示,在收藏界面可以通过删除链接将相应美食从收藏中删除。

2-9 我的收藏

  • 击”美食搜索”链接便会进入搜索界面,效果如图2-10所示,在搜索界面可以根据美食种类及价格进行美食搜索,而且可以对搜索到的美食进行收藏。

  •  

2-10 搜索界面

5.单击”上传美食”,按钮进入上传美食界面,在该界面中可以上传美食信息,上传后的美食便会存入数据库,其他用户便可搜索到美食,在上传美食界面中应用了Baidu地图技术,显示经纬度,如图2-11所示:

2-11 上传美食

6. 点击右上侧”美食网欢迎您”链接,进入个人资料修改页面,可对用户信息进行修改,如图2-12所示:

2-12 个人资料界面

7.注销当前登陆的用户,使用管理员账号登陆,在网页右侧上出现”管理网站”,通过该链接,进入网站管理页面,如图2-13所示,在网站页面可以执行添加删除每日推荐美食、上传广告图片、添加种类等。

2-13 美食管理

Android端的主要界面如下:

图2-14 美食上传                                 图2-15 美食搜索

图2-16 美食信息                                 图2-17 美食收藏

图2-18 地图显示                                 图2-19 美食推荐

图2-20 收藏提示                                 图2-21 搜索结果

图2-22 删除提示                                 图2-23 用户登录

 图2-24 用户注册

2.8 开发工具与环境

2.8.1 下载并安装eclipse

Eclipse 版本有要求:The “Eclipse Classic” version is recommended. Otherwise, a Java or RCP version of Eclipse is recommended.

1.下载eclipse只需登录到http://www.eclipse.org/downlands/即可下载最新版本的eclipse安装程序。

2.将下载好的eclipse解压到D:\eclipse for android。

3.双击D:\eclipse for android目录下的eclipse.exe运行eclipse即可[2]。

2.8.2 下载并安装jdk

1.首先登录到SUN官方网站http://java.sun.com/javase/downloads下载最新的JDK安装程序。

2.然后双击刚下载的JDK安装程序jdk-7u21-windows-i586,根据提示将JDK安装到默认目录。

3.右键单击我的电脑,依次选择属性/高级/环境变量,在系统变量中新建一个名为JAVA_HOME,值为“C:\Program Files\Java\jdk1.7.0_21”的环境变量。

再打开Path环境变量,在最后加上“C:\Program Files\Java\jdk1.7.0_21\bin;”,单击“确定”按钮即可。

2.8.3开发环境简介

JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品。自从Java诞生以来,JDK已经成为最广泛的Java SDK。JDK是整个Java的核心内容,包括了Java运行环境、Java工具和Java基础类库三部分。从Sun的JDK1.5开始,提供了一些非常使用的功能,其版本也不断更新,运行效率得到了非常大的提高。

Eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组建构建开发环境。Eclipse附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。 Android SDK即软件开发工具包(software development kit)。被软件开发工程师用于为特定的软件包、软件架构、硬件平台、操作系统等建立应用软件工具的集合。因此Android SDK是Android专属的开发工具包。其授权协议为Apache,开发语言为Java、需要Android操作系统的支持。

PS: 获得更好的阅读体验请访问:http://www.itbiyesheji.com/index.php/2019/04/03/基于android的美食分享app的设计与实现/

猜你喜欢

转载自blog.csdn.net/biyesheji51qqcom/article/details/89091926