软件工程课程设计.docx

上传人:b****3 文档编号:12663829 上传时间:2023-04-21 格式:DOCX 页数:23 大小:448.03KB
下载 相关 举报
软件工程课程设计.docx_第1页
第1页 / 共23页
软件工程课程设计.docx_第2页
第2页 / 共23页
软件工程课程设计.docx_第3页
第3页 / 共23页
软件工程课程设计.docx_第4页
第4页 / 共23页
软件工程课程设计.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

软件工程课程设计.docx

《软件工程课程设计.docx》由会员分享,可在线阅读,更多相关《软件工程课程设计.docx(23页珍藏版)》请在冰豆网上搜索。

软件工程课程设计.docx

软件工程课程设计

《软件工程》课程设计

一、课程设计题目

Android手机用户可以通过手机浏览自己所需要查看的饭店信息。

当用户注册成为本

软件的注册用户后,除了对饭店进行搜索以外还可以对饭店进行评价和利用本软件内嵌的GoogleMap查询饭店的具体位置和行车路线。

一.课程设计的目的

为解决基于Android美食搜索软件开发过程中出现的实际问题,特别是非数值计算类型的应用问题。

本课程设计完成了一个较为完整的应用需求分析,在完成设计和编程大型作业的过程中,深化对数据结构与算法课程中基本概念、理论和方法的理解;综合运用所学知识处理实际问题,强化面向对象的程序设计理念;提高程序设计与调试水平。

二.课程设计的功能

本项目采用面向对象的方法,运用Android、J2EE、数据库等现有技术,设计开发一个基于Android手机应用软件,实现传统的基于Web数据搜索系统的基本功能:

用户管理:

(用户删除、密码修改)用户登录后可对现有注册用户进行管理

饭店管理:

(饭店添加、查询、修改、删除)主要实现饭店的信息管理

注册用户查询:

(饭菜查询、地址查询、饭店评论)主要用于用户对饭店饭菜、地址查询和饭店评论

游客查询:

(饭菜查询、用户登录)主要用于游客查询

为了更加清晰地表达系统的业务功能模块,画出用例图,对于不同的角色,所承担的任务各自不同,功能不一样:

客户端游客用例图

客户端用户用例图

管理端用例图

 

三.课程设计的分析步骤

应用软件的定位是一个“北京美食搜索”,是一个通过网络的搜索引擎。

据以上分析,该系统的架构图如下:

根据软件功能要求,通过多种查询方式我们将数据库分为手机端数据库(SQLite)和服务器数据库(MySQL)。

手机端(SQLite)

地铁沿线---Subway

所有商区---AllCityProper

地标建筑---LandMark

热点地区---hotSpace

所有菜系---AllDish

热门菜---HotDish

用餐目的---DinnerTarget

服务器端(MySQL)

用户信息---User

饭店信息---Restaurant

饭店设施---RestaurantInstallation

饭店评论---RestaurantComment

服务项目---ServerItem

菜价---DishPrice

 

由于传输的信息主要是文本信息,图片在服务器数据库中存放的是该图片的网路地址,用户在发送图片请求时服务器返回一个图片地址的网络地址然后通过网络下载图片。

在本系统中有些实体只是单独的存在,没有与其他实体的关系。

但是有些实体之间存在着相互关系的,E-R图如图2-4-1所示。

数据库E-R图

四开发环境与技术介绍

JAVA语言

Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。

Java语言是简单的。

Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用Java。

另一方面,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。

特别地,Java语言不使用指针,并提供了自动的废料收集,使得程序员不必为内存管理而担忧。

Java语言是一个面向对象的。

Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制。

Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。

总之,Java语言是一个纯的面向对象程序设计语言。

Java语言是分布式的。

Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口,它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。

Java的RMI机制也是开发分布式应用的重要手段。

Android平台

Android是基于Linux内核的操作系统,早期由Google开发,后由开放手机联盟开发。

它采用了软件堆层的架构,主要分为三部分。

底层以Linux内核工作为基础,只提供基本功能;其他的应用软件则由各公司自行开发,以Java作为编写程序的一部分。

Android平台特点

应用程序框架支持组件的重用与替换

Dalvik虚拟机专门为移动设备做了优化

内部集成浏览器该浏览器基于开源的WebKit引擎

优化的图形库包括2D和3D图形库,3D图形库基于OpenGLES1.0

#SQLite用作结构化的数据存储

多媒体支持包括常见的音频、视频和静态印象文件格式

蓝牙Bluetooth,EDGE,3G,andWiFi

照相机,GPS,指南针,和加速度计

丰富的开发环境包括设备模拟器,调试工具,内存及性能分析图表,和Eclipse集成开发环境插件

Android架构

Android应用:

Android将预装一组核心应用程序,包括email客户端、短信服务、日历日程、地图服务、浏览器、联系人和其他应用程序。

所有应用程序都是Java编程语言编写的。

GoogleMap应用的技术

GoogleMapsAPI是Google自己推出编程API,可以让全世界对GoogleMaps有兴趣的程序设计师自行开发基于GoogleMaps的服务,建立自己的地图网站。

GoogleMapAPI是一种通过JavaScript将Google地图嵌入到您的网页的API。

该API提供了大量实用工具用以处理地图,并通过各种服务向地图添加内容,从而使您能够在您的网站上创建功能全面的地图应用程序。

Struts2框架

今天我们见到的绝大多数应用都是基于B/S(浏览器/服务器)构架的,而Struts2是一个具有很好的使用价值的MVC(模型/视图/控制器)框架。

Struts2框架最大的好处就是重用。

面向对象系统获得的最大复用方式就是框架,由于框架能重用代码,因此从已有构建库中建立应用变得非常容易,因为构建都采用框架统一定义的接口,从而使构件间的通信简单。

Struts2处理流程图:

开发工具

Eclipse3.5

MyEclipse8.5

SQLite3

Droiddraw

五详细设计

服务端详细设计

1.手机端请求

服务端是针对手机端的请求来为其提供所需求的数据和服务。

手机端发送的每条请求,服务端都需要对其响应请求,固然,根据Struts2框架下的模式,每个请求都对应相应的action去应答。

本软件经过统计,手机端共有16个请求会产生,针对这些请求,服务端一一对其响应,然后需要返回数据的再将其所请求的数据通过JSON形式发送回手机端,手机端负责解析这些数据给用户。

手机端请求在服务器所对应Action图如5-1-1:

2.JSP页面请求

同时服务端针对JSP页面发送来的请求来为其提供所需求的数据和服务。

与手机端一样JSP页面发送的每条请求,服务端都需要对其响应请求,然而,根据Struts2框架下的模式,每个请求都对应相应的action去应答。

本软件经过统计,JSP页面共有10个请求会产生,针对这些请求,服务端一一对其响应,然后需要返回数据的再将其所请求的数据发送回JSP页面。

JSP页面请求所对应Action图如5-1-2:

2客户端详细设计

Android中每个界面的显示都是一个Activity,而在Android平台下的所有软件都是由界面组成的。

所以我们就可以说设计Android软件就是在设计Activity,通过对Activity的实现从而达到界面内容和软件需求的效果。

在实现Activity的时候我们必须用到各种数据以进行传递。

在Android中为我们提供了不同Activity之间的跳转方法startActivity()和StartActivityForResult()。

但是,有些数据的交互我们有可能不只是在两个Activity中使用的,它有可能在整个程序中都会使用到这个变量值。

所以,我们在各个不同Activity中传递数据是选择了mark.java这个专门用户标识各种不同变量的类如图5-2界面对应Activity图。

六手机端内部实现分析

6.1手机端代码设计分析

软件需求数据的相互传递,而非独立的数据使用;软件需求实现各种界面的跳转,而非单一界面的实现;软件的界面显示内容需要多元化,而非枯燥文字的独立显示。

如何才能在Android平台软件设计中很好的处理这些问题呢?

Android中每个界面的显示都是一个Activity,而在Android平台下的所有软件都是由界面组成的。

所以我们就可以说设计Android软件就是在设计Activity,通过对Activity的实现从而达到界面内容和软件需求的效果。

数据的相互传递

从软件的需求中我们就可以看出将会有大量的数据进行传输和接收。

1.软件需要是通过服务器传输数据。

那么在请求不同的数据时就需要通过不同的页面请求地址来传输数据,为了考虑到软件的维护性和可修改性,我们就需要定义不同变量来保存相应的页面地址。

2.软件需要对数据库中不同表的不同字段进行查询。

当查询某些数据时我们就需要知道所查询的是那张表的哪个字段名。

为了标识这些不同的表名以及字段名,我们更需要定义不同的变量名来保存各个表名与字段名。

3.软件中功能的使用设计到权限问题。

评论和GoogleMap这两个功能模块都需要注册用户才可以使用,那么在用户点击“评论”或“GoogleMap”Button的时候就需要对用户现在的权限进行判断。

为了标识不同用户模式状态,我们有必要定义出用户状态变量来让程序进行判断可否执行对应功能。

所以在程序设计当中必须考虑到数据在代码中的清晰性、简洁性。

既要让代码中的变量名符合自己所代表的意义,也要使得这些变量在代码中不至于混乱。

为此我们在设计中设计了专门负责管理各种变量的类mark.java。

界面的跳转

软件由不同的界面共同组成,那么在一个界面向另一界面跳转时是如何去实现的呢?

Android自带了Activity跳转方法-startActivity()和startActivityForResult()。

这两种方法是共同使用,还是只是用其中的一种即可呢,我们在稍后具体分析。

6.2手机端代码设计原

根据前面的分析及客户的需求,本软件在手机端的实现用户注册、用户登录、模糊查找、分类查找、用户评论以及GoogleMap等模块。

在代码设计的时候我设计了用户跳转的各个Activity、DBhelper、DataProvider、mark(用于标识各种变量)。

其中Activity包括了start.java、register.java、userInformation.java、searchlist.java、searchlistTwo.java、searchRestaurant.java、、restaurantInformation.java、restaurantComment.java、Googlemap.java。

在手机端这边分为游客模式、和注册用户模式。

当软件刚打开的时候默认为游客模式,游客模式中用户可以对自己所需要的餐饮地址等信息进行检索。

游客用也可以通过软件注册成为我们的注册用户,并登陆到服务器中。

当成为我们的注册用户的时候,用户不仅可以通过软件从服务器中获得自己所需要的餐饮地址信息、还可以针对某个特定的餐厅或饭店进行评论以及通过我们软件内嵌的GoogleMap查询去该餐厅或饭店的具体路线。

游客权限图如图6-1:

图6-1游客权限图

注册用户权限图如图6-2:

图6-2注册用户权限图

在软件的代码DBhelper,DataProvider作为手机端数据创建、查询等使用。

mark中存放的是各种标识符的定义,其中包括了向服务器请的各种不同请求的页面地址、当前用户名、当前用户昵称、成功标识、失败标识、查询表名、查询表的字段名等等。

当Activity需要用到一些标识以便于存储或者其他Activity使用的时候,程序就可以去调用mark中的变量,使得程序运行更加效率。

6.3手机端Activity之间的跳转

Activity之间跳转方法有两种,StartActivity()和StartActivityForResult()。

StartActivity():

通过这种方式启动应用程序可以看作为独立运行于系统中,启动它的parent无需得到其所运行的返回值,更具体的讲是一个Standalone的应用程序启动了另一个有着同样Standalone特性的程序。

StartActivityForResult():

通过方法的命名可以很直观的看到,其最大的作用是当启动了某个Activity后,parent依然关联着当前进程所处理的Activity。

当操作完成后,会有特定的返回值作为Parent响应某些Events的结果

Activity之间的跳转的时候我们可以选择不带参数的跳转和带参数的跳转,在软件设计的时候我们需要根据不同的需求制定不同的跳转方式。

例如,在start.java中当我们点击“地标建筑”的时候我们需要跳转到searchlistTwo.java。

但是,由于searchlistTwo.java是一个公用的Activity,所以当我们跳转到searchlistTwo.java时我们就需要判断是哪个请求,这个时候我们就用到了Activity带参数的跳转,实现代码如下:

利用startActivity()实现:

跳转前Activity中代码为:

Intentit=newIntent(start.this,searchlistTwo.class);

it.putExtra("searchway",landmark.getText().toString());

startActivity(it);

跳转后Activity中代码为:

Bundlebundle=this.getIntent().getExtras();

way.setText(bundle.getString("searchway"));

利用startActivityForResult()实现:

跳转前Activity中代码为:

Intenti=newIntent(this,Activity2.class);

it.putExtra("searchway",landmark.getText().toString());

startActivityForResult(i,10);

跳转后Activity中代码为:

Bundlebundle=this.getIntent().getExtras();

way.setText(bundle.getString("searchway"));

this.finish();

AndroidManifest.xml提供Activity服务

AndroidManifest.xml是每一个应用都需要的文件,位于应用根目录下,它描述了程序包的全局变量,包括暴露的应用组件(activities,services等等)和为每个组件的实现类,什么样的数据可以操作,以及在什么地方运行。

activity是application模块的运行时子元素,标识了一个UI。

除了application,一个应用可以声明并实现零至多个其它运行时模块,activity也同样。

activity也包含了许多定义它工作状态的属性,其中:

“name”是必须的,它指定了该activity所在的文件名,如果该文件所属包不同于该应用的包名(即本描述文件的最开始处),那么名字前面需要加入所在包名。

activity通过增加intent-fliter来标识哪些intent可以被处理,同时intent也是调度activity的主要参数。

当工程被创建的时候时候会要求程序员首先输入一个默认的Activity,而AndroidManifest.xml这个文件就会以程序员定义的此Activity名为初始Activity。

在以后的Activity中如果程序需要跳转另外的Activity,那么就必须在AndroidManifest.xml中添加跳转的Activity名,这样才可以成功跳转。

AndroidManifest.xml也提供网络支持服务,当Activity需要对网络进行数据访问的时候就应当在其配置中添加网络访问权限

name="android.permission.INTERNET

">。

6.4手机端Activity编码与实现

程序首先进入的是start.java。

这个Activity为软件的起始Activity,其中需要实现的功能有用户模式的显示(以用户昵称为标志,游客模式的时候默认昵称为“游客”,注册用户的时候为当前登录用户的昵称)、用户注册、用户登录、用户信息查看修改、分类搜索(分为地标建筑、热点地区、全部商区、用餐目的、地铁沿线、全部菜系、热门菜)、模糊搜索、从服务器下载饭店信息查询排行榜。

用户状态分为游客模式、注册用户模式以mark.USERIN为标识。

游客状态的时候mark.USERIN=mark.TOURISTIN,注册用户状态的时候mark.USERIN=mark.REGISTERUSERIN。

而用户昵称用mark.USERNAME标记,默认状态下mark.USERNAME=“游客”,当用户登录成功后程序将mark.USERNAME致为当前登录用户昵称如图图6-3游客昵称图、图6-4注册用户昵称图。

 

图6-3游客昵称图

图6-4注册用户昵称图

 

当用户点击注册按钮的时候会跳转到register.java。

用户注册图6-5:

图6-5用户注册图

当用户输入完信息后,程序将先判断用户所输入的信息是否完整,若有没有填的信息程序会提示用户“请完整填写注册信息”,若用户以将信息完整,程序会再次判断两次密码输入是否一致,若两次密码不一致会提示用户“两次输入密码不一致请重新输入”。

当所有信息填写正确后,程序会将用户填写的信息进行封装并传送给服务器。

//发送请求

HttpClienthttpclient=newDefaultHttpClient();

HttpPosthttppost=newHttpPost(mark.SERVERREGISTER);

ArrayListnvps=

newArrayList();

nvps.add(newBasicNameValuePair("username",username.getText().toString()));

nvps.add(new

BasicNameValuePair("nickname",nickname.getText().toString()));

nvps.add(new

BasicNameValuePair("password",password.getText().toString()));

nvps.add(new

BasicNameValuePair("phone",phone.getText().toString()));

try{

UrlEncodedFormEntityentityin=newUrlEncodedFormEntity(

nvps,"gbk");

httppost.setEntity(entityin);

}catch(UnsupportedEncodingExceptione1){

e1.printStackTrace();

}

当服务器处理完此数据后,并确认注册成功后会让用户自动处于登录状态,并发送给用户登录成功标识。

当用户注册成功或点击登录按钮时会进行登录操作。

当用户点击登录按钮的时候会弹出一个对话框出来,让用户输入用户名和密码,当点击登录后手机端向服务器发送消息。

若验证正确则进入注册用户模式并将mark.USERNAME致为当前用户的昵称。

Android显示的对话框其实是另一个xml在本Activity的xml的显示,所以在对话框的xml中是可以修改其显示的所有属性的,用户登录对话框如图6-6。

图6-6用户登录对话框图

 

用户登录成功后又有可能需要查看或修改自己的一些信息,此时点击用户昵称便可跳转到userInformation.java这个Activity中。

在此Activity中以texrView的方式显示出用户不可改变的信息(用户名、用户创建时间),以EditView的方式显示出用户可修改信息(用户昵称、手机、密码)。

进入这个Activity时先通过mark.USERNAME获得用户名并以post的方式传递给服务器。

服务器接受到数据并处理数据后将数据以json的方式传送给手机端。

手机端这边在接受到了数据后将json中的数据逐取出,方法为json.getString("username"),其中“username”为从json中所取出来的数据变量名。

同理便可以取出创建时间、密码、手机和昵称。

然后利用username.setText(username)的方法将所取出来变量值传递到TextView和EditView中以在界面中显示出来。

当需要修改用户昵称、手机、密码的时候利用利用getText()的方法获得此时EditView中的信息并赋值给相对应的临时变量。

然后通过此临时变量和该信息变量值比较。

若发现该变量值没有改变,则提醒用户“未修改成功数据未做修改”,若该变量已经改变则将改变后的变量名和当前登录用户名一同以post的方式发送给服务器。

服务器接受并处理完信息后返回给手机端修改成功失败标识“usermodify”。

手机将此标识传递给mark.USERMODIFY,并对mark.USERMODIFY值进行判断,如果mark.USERMODIFY==mark.SUCESS则表示修改成功,并提示用户“修改成功”,否则提示用户“未修改成功数据传输失败”。

通过这种方式就实现了用户信息的查看和修改。

软件设计了六种不同的搜索方式,分别为地标建筑、热点地区、全部商区、用餐目的、地铁沿线、全部菜系、热门菜。

这七种搜索方式表存放在了Android的数据库中。

而为了程序设计的方便与简洁我们将这七种表的字段名暂设为一样。

地标建筑、全部商区、地铁沿线、全部菜系有三个字段名分别为area,address。

程序中将mark.TABLEAREA="area",mark.TABLEADDRESS="address".或许这样命名mark中的标识符,但是这样确实会使程序更加简洁,设计更加方便。

当点击这四种搜索方式的任何一种的时候程序进入到searchlistTwo.java这个Activity中。

进入Activity后首先接受从上一Activity传过来的变量值searchway。

由于area是address的上一级查询方式。

所以应将需要查询的的字段设置为area即DBHelper.USER_TABLE_NAME_F

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1