基于Android-JavaEE-DB2实现的旧物交易平台

greenlight

发布日期: 2018-09-26 09:16:18 浏览量: 1876
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

摘要

随着移动网络的日益进步,手机、平板等移动设备已经在我们日常的生活和学习中占有越来越大的比例。软件是移动设备的重要组成部分,手机软件也从开始的单一功能变得具有多种多样的功能,日益符合人们的生活需要。设计本软件的目的在于迎合消费群体的需求。近几年日益兴起的网络购物逐渐取代实体购物,通过网络平台以物易物成为一种近年来新兴的网络交易方式,其发展呈现出一种久盛不衰的趋势。本项目的设计理念旨在通过网络平台对二手物品的价值进行再一次利用,充分实现其利益的最大化。该软件是基于Android平台研发的,使用Eclipse开发旧物交易平台安卓客户端,并使用Tomcat、借助MyEclipse服务器软件开发JavaEE后台服务器,使用DB2数据库进行数据的存储与管理。

关键字: Android Eclipse MyEclipse 二手交易

ABSTRACT

Withthe increasing progress of mobile networks, mobile phones, flat and othermobile devices have been in our daily life and learning to occupy an increasingproportion. Software is an important part of mobile devices, mobile phonesoftware from the beginning of a single function has become a variety offunctions, increasingly meet people’s needs. The purpose of this software is tomeet the needs of consumer groups. In recent years, the growing online shoppinggradually replace the physical shopping, through the network platform to barteras a new way of emerging online transactions, its development presents along-standing trend. The design concept of this project aims to make use of thevalue of secondhand items through the network platform, and realize themaximization of its interests. The software is based on the Android platformdevelopment, the use of Eclipse to develop the old transaction platform Andrewsclient, and use Tomcat, with MyEclipse server software development JavaEEbackground server, the use of DB2 database for data storage and management.

Key words: Android Eclipse MyEclipse Used transactions

第一章 绪论

1.1 系统简介

“旧时光”旧物交易平台是一款基于商品信息的共享而促成买方和卖方达成交易的第三方平台。卖方将所交易的物品信息上传在该平台上,买方通过该平台选择自己心仪的商品来购买、取得商品。用户的个人资料和商品的发布信息存储在后台数据库中,在交易过程中进行实时的添加、删除、修改等工作。

1.2 系统的目的和意义

根据市场调研,发现目前人们的日常生活中普遍存在一个问题,即在市场经济的刺激和人们生活水平提高的情况下,家中的闲置物品也日益增多甚至无处摆放,闲置物品的归属问题也成为物品所有者的苦恼。将闲置物品闲放在家中只会增加房间的占有率,使房间的利用率降低,若是将闲置物品遗弃虽然能使家中的空闲空间变大,但是会奢侈浪费。针对这种情况,设计了旧物交易平台这个项目。目的是希望能够通过这个平台将用户家中的闲置物品充分利用起来,使闲置物品能够进行二次销售。充分发挥闲置物品的剩余价值,实现其利益的最大化。

手机较之电脑等平台在体积上更具便捷性,用户使用操作的性价比较高,在该平台中用户可以自主选择自己喜欢的商品加入到购物车中以待最终的购买,再通过查看卖家的详细信息与卖家进行私下交流协商,省去了中间商来赚取差价。同时平台中的卖方和买方没有明显的界限,可以同时既是一件商品的卖方,又是另一件商品的买方,有利于用户充分了解双方的运营模式,能够双方平等公开地进行交易。

1.3 本文工作及组织结构

本人的主要任务是实现“旧物交易平台”APP中的用户管理模块和商品显示模块。用户管理模块主要包括用户注册、用户登录和用户信息管理方面。商品显示模块包括主界面的商品显示,推荐商品的显示和搜索功能的搜索结果显示。

本文一共包含三个部分,第一、二章节是第一部分,第一章主要介绍了系统的主要功能以及系统的目的和意义;第二章主要介绍了开发此软件用到的环境Eclipse、MyEclipse,此外还介绍了后台用到的DB2数据库和对应的JSON数据类型。第三、四章是第二部分,第三章是系统设计,主要是根据系统的需求分析设计出系统的总体功能;第四章是系统的详细设计,也是本人完成的主要内容,这部分实现了用户模块的两大功能:登录和注册、商品的搜索和推荐以及程序的初始化和下拉刷新,为了更符合用户的使用还对页面内容进行了布局,此外还实现了对上拉加载和下拉刷新功能的测试。第五、六章节是第三部分,第五章是系统测试,主要是对第四章实现的功能进行测试,提高软件的健壮性。第六章是论文总结和展望,主要总结了一些本文的工作并根据目前的实现情况提出了本文的不足。

第二章 开发技术及设计方案

2.1 开发技术

2.1.1 Eclipse

Eclipse开发环境有一个最大的优势就是它不用受到平台的限制,针对所使用的代码语言不同的情况下只需在其中安装相对应的插件即可,这种特殊的插件形式使得其比其他软件更具灵活性,Eclipse的插件机制能够允许将外界的扩充添加到现有的程序中。Eclipse除了可以当成Java集成开发环境,还包含着插件开发环境,使用Eclipse开发的Android平台是比较成熟的,无论是在开发环境还是代码的实际运用都是比较适合程序员编写的[1]。

2.1.2 MyEclipse

MyEclipse是以Eclipse为基础,但在其插件和功能上又拥有自己独特变化的工作平台,通过它有利于对服务器、数据库和JavaEE等进行整体结合。将MyEclipse单单从结构上进行划分就可以划分为多种类别,每种类别可以通过一系列的插件来实现类别想要实现的功能,它能够支持对代码进行编写、调试、配置、测试等功能操作[2]。

2.1.3 DB2数据库

DB2数据库是一个用来处理大型数据的关系型数据库,它的扩展版可以使同一类型的数个不同的计算机对一个数据库中的信息资源实现共享,大大提高了单个数据库的储存和应用范围。它允许多个用户基于同一条查询语句查询到不同的数据库甚至不同的数据库管理系统的数据。在本项目设计中,是通过JDBC将DB2数据库和服务器连接到一起,以满足设计的需求。IBM Data Studio是针对应用数据库进行开发的重要工具,它在管理数据库和优化数据查询方面都有比较好的优势,而且它还支持多种数据库的应用。它在整合之前,是通过不同的程序来实现功能,但在整合之后可以减少各种程序之间的来回切换,使软件的应用更加的简便快捷。Data Studio提供Java和数据透视功能,当用户打开一个透视时,与其相关联的视图就会相应的显示出来[4]。

2.1.4 JSON数据类型

JSON是用于JavaScript脚本设计的对象标记语言。它的层次结构简单明了,便于编程人员的编写和阅读。JSON数据类型与XML的区别主要是JSON拥有更好的扩展性,虽然XML自身的扩展性也很好,但JSON的范围要更广一些,并且它可以存储JAVA脚本的复合对象。JSON格式简单,易于读写解析,能够使服务器端和客户端之间的代码量大量减少,对于日后的维护也更为方便[5]。

2.2 设计方案

本次的项目采用的是MVC模式,分别是模型、视图和控制器,模型和视图的分离使得一个程序可以有数个表现方式,控制器可以保证视图能够在模型发生改变的前提下发生相应的改变。运用MVC模式进行分组开发有利于对复杂的程序进行管理。本次的项目与其相对应的分别是Java代码、layout布局文件和AndroidMinifest.xml[6][7]。

本次是采取将Struts、Spring和Hibernate这3个框架相互结合互相渗透的方式来开发这个网络平台交易系统。其中在Struts表示层和Spring业务层之间通过服务获取器将其两者相互连接,在Spring业务层和Hibernate持久层是通过DAO类来进行连接。这种方法也简称为SSH模式。

第三章 系统设计

3.1 导言

在网络信息技术飞速发展的前提之下,其研究方向逐渐渗透在人们日常生活中各个领域,消费群体也深入扩展到大多数人。所以,作为技术的研发者需要以满足绝大多数消费者的需求为设计目的,制作出能为消费者带来便利、丰富消费者日常生活的技术软件。近年来随着网络购物的兴起,人们也欣喜地感受到网络购物的方便。针对这一现象,本次设计旨在传统网络购物的基础上对闲置的二手物品进行交易。使卖方充分发挥闲置物品的价值,买方能够以较低的价格买入自己较为心仪的物品,使买方和卖方的利益都能够得到满足[8]。

3.2 项目需求分析

该项目所要求达到的具体功能:

1.从用户角度出发,在该交易平台中用户作为主体最重要的前提是注册和登录个人账户,在此基础上查看商品、浏览平台所发布的所有信息,用户的用例图如图3-1所示。

1

2.从买家的角度出发,买家主要可以利用该平台搜索商品、查看商品、将商品加入购物车和联系卖家,从最初的查找商品到最后的交易成功都可以通过该平台来实现,详细的买家用例图如图3-2所示。

2

3.从卖家的角度出发,卖家可以发布、修改、删除商品并且查看自己发布的商品,该平台充分尊重用户自主性原则,允许用户在不损害他人利益的前提下对商品的管理能够自由支配,卖家的用例图如图3-3所示。

3

4.从平台管理者的角度出发,它可以查找、修改、删除后台数据和普通用户信息,平台管理者是在整个平台的运作过程中起到一个保护和维持的作用,它可以强制性地对某些信息进行处理,详细的平台管理用例图如图3-4所示。

4

3.3 项目总体设计

3.3.1 系统结构图

在做项目设计时,通常习惯先对项目进行基础的解析,设计基本的框架结构,然后在框架结构中填充各个功能模块,如图3-5。

5

设计时项目组经过市场的调研和产品功能的具体分析,对项目所要满足的功能有一个概念性的总结,系统基本功能需求图如图3-6到图3-9所示。

3.3.2 Fragment

在实际运用中经常把Fragment当成Activity中的一个组成部分,甚至一个Activity界面可以由多个互不相同的Fragment组成,并且它们之间不会相互抵触。Fragment可以使一个App不需要因为一个移动终端大小的改变而进行布局的修改,使App能够同时适应不同尺寸的移动终端。Fragment也拥有属于自己的生命周期和接收处理用户事件的能力,这样就无需在Activity的框架中写一系列关于控件处理的代码,并且可以动态的增加、修改和删除某个具体的Fragment,Fragment是随着Activity的存在而存在的, Fragment的生命周期在一定程度上需要依存于Activity。在Activity的布局文件中对Fragment进行声明,所有控件的事件处理都有各自相对应的Fragment并依赖着它们去进行相应功能的实现,大大提高了代码的可读性、复用性和可维护性[9]。

3.3.3 自定义Item的ListView

ListView可以通过重写Adapter适配器简单实现一些效果:例如分组,类似在通讯录中按照姓氏的第一个字母进行分组的功能;在Item中放图片,按钮等其他组合控件等。构造每一个ListView都要有一个Adapter来将数据和显示进行连接。

3.3.4 Action类

Action类是Structs 2的核心,编写Action类是使用Structs 2框架的主要编码工作。每个Action类都与其相应的请求命令相对应,通过Action中具体的执行函数execute()来实现对传输的数据进行相应的处理[10]。

3.3.5 数据库架构

在DB2的数据库架构中,每个数据库包含着多个表空间,每个表空间中可以储存多张表,每张表中记录了相应的信息,通过各种关系运算符在各个表之间建立对应的关系。针对本次项目设计的数据库而言,建立了一个名为OldTime的数据库,在整个数据库中分别包含了用户表(TABLE_USER)、商品表(TABLE_COMMODITY)、推荐表(TABLE_RECOMMODITY)、购物车表(TABLE_SHOPPINGCAR)、发布表(TABLE_FABU),设置了相应的数据类型和约束对表格数据进行相应的限制,使其在功能上能满足商品交换的基本需求[11],数据库中各表结构分别如表3-1至3-5所示。

用户表

字段 数据类型 允许空 备注
USER_ID Int 用户标识,主键,自增长
USER_NAME Varchar 用户名
PASSWORD Varchar 密码
USER_IMG Varchar 用户头像

商品表

字段 数据类型 允许空 备注
COMMODITY_ID Int 商品标识,主键,自增长
USER_NAME Varchar 商品名称
COMMODITY_TITLE Varchar 商品标题
COMMODITY_DETAIL Varchar 商品详情
COMMODITY_PICTURE1_ID Varchar 商品图片
COMMODITY_PICTURE2_ID Varchar 商品图片
COMMODITY_PICTURE3_ID Varchar 商品图片
COMMODITY_PICTURE4_ID Varchar 商品图片
COMMODITY_PICTURE5_ID Varchar 商品图片

推荐表

字段 数据类型 允许空 备注
COMMODITY_ID Int 标识,主键,自增长
COMMODITY_TITLE Varchar 商品标题
COMMODITY_IMAGE_ID Varchar 商品图片

购物车表

字段 数据类型 允许空 备注
USER_NAME Varchar 用户名
COMMODITY_ID Int 商品序号

发布表

字段 数据类型 允许空 备注
USER_NAME Varchar 用户名
COMMODITY_ID Int 商品序号

第四章 系统详细设计

该项目中本人所研究的内容主要是该平台的用户管理模块和商品展示模块。用户管理模块主要包括用户注册、用户登录和用户信息管理方面。商品展示模块包括主界面的商品显示,推荐商品的显示和搜索功能的搜索结果显示。

4.1 用户管理

4.1.1 用户注册

用户通过注册模块输入用户名、手机号、密码,并将这些资料上传到服务器保存,对用户注册的界面进行页面布局设计,用户在注册时用户名、密码和确认密码必须要填写,如图4-1所示,注册代码如下图所示:

  1. if("".equals(user_name)) {//判断用户名是否为空,若为空则Toast,不为空则判断密码
  2. Toast.makeText(RegisterActivity.this, "用户名不能为空", Toast.LENGTH_SHORT).show();
  3. }
  4. //password_sure不需要判断是否为空,因为空值肯定与password不相同。
  5. if(password.equals("")){//判断密码是否为空,若为空则Toast,不为空则判断两次输入的密码是否一致。
  6. Toast.makeText(getApplicationContext(), "密码不能为空", Toast.LENGTH_SHORT).show();
  7. }else if(!password.equals(password_sure)){//若两次密码一致则向服务器发送注册请求。
  8. Toast.makeText(getApplicationContext(), "两次输入的密码不一致", Toast.LENGTH_SHORT).show();
  9. }

在用户按照提示将注册信息填写完毕后,将填写的用户号通过服务器与数据库中已存取的用户号进行对比。若新填写的用户号与数据库中原有的用户号相同,则返回该用户号已被使用的信息;若无相同,则把新注册的用户号和密码等添加到数据库中,成功注册之后会在数据库添加一条字段并将结果返回。

注册的客户端代码如下:

  1. String result = EntityUtils.toString(httpResponse.getEntity());//将从服务器返回的结果放到String数据中。
  2. if(result.equals("1")){//如果结果是1,则表示成功注册
  3. Toast.makeText(RegisterActivity.this, "注册成功,请登录", Toast.LENGTH_SHORT).show();
  4. Intent intent = new Intent(RegisterActivity.this,LoginActivity.class);//成功注册后自动跳转到登录Activity。
  5. startActivity(intent);
  6. }else{//如果返回结果不为1显示用户名被使用
  7. Toast.makeText(RegisterActivity.this, "用户名已被使用", Toast.LENGTH_SHORT).show();
  8. }

注册的服务器端代码如下:

  1. Session session = HibernateSessionFactory.getSession();//创建session
  2. Transaction ts = session.beginTransaction();//创建Transaction
  3. TableUser tableUser = new TableUser();//创建POJO类对象
  4. /*判断客户端发来的信息是否正确*/
  5. if(userName.equals("")){
  6. System.out.println("用户名不能为空!");
  7. return null;
  8. }else if(password.equals("")){
  9. System.out.println("密码不能为空!");
  10. return null;
  11. }else{
  12. //创建query,并通过query创建一个hql语句
  13. Query query = session.createQuery("from TableUser where userName=?");
  14. query.setString(0, userName);
  15. List list = query.list();
  16. //将hql查询出的结果放到TableUser对象中
  17. if(list.size()==0){
  18. tableUser.setUserName(userName);
  19. tableUser.setPassword(password);
  20. session.save(tableUser);
  21. ts.commit();//提交Transaction
  22. return tableUser;
  23. }else{//如果用户名在数据库中已经有了
  24. System.out.println("用户名已被使用");
  25. return null;
  26. }
  27. }


4.1.2 用户登录

用户通过登录模块进入平台,本平台的商品发布和购物车等功能必须登录之后才能使用,在对用户登录界面进行设计时,首先要通过判断语句来保证用户的用户名和密码不能为空。在用户名和密码符合条件的情况下,客户端向服务器发出请求,并进行是否超时的检测。服务器收到请求后执行相应的Action,将对数据库中数据的处理结果返回给客户端,若用户登录的信息与数据库中储存的用户信息相同,则注明登录成功,并将结果返回至客户端,反之则为失败。若未能正常连接服务器,就会返回“没有获取到Android服务器端的响应!”的提示语,登录时3个主要界面如图4-3至图4-5所示。

登录的客户端代码如下:

  1. public void run() {
  2. Looper.prepare();//启用轮询
  3. HttpPost httpRequest = new HttpPost(getResources().getString(R.string.url_web)+"/login.action");//action的地址
  4. //创建一个NameValuePair的List并将用户名和密码保存到该List中
  5. List<NameValuePair> params = new ArrayList<NameValuePair>();
  6. params.add(new BasicNameValuePair("username", username));
  7. params.add(new BasicNameValuePair("password", password));
  8. try {
  9. httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));//设置请求参数项
  10. HttpClient httpClient = new DefaultHttpClient();//设置超时检测超过2000毫秒即为超时。 httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 2000);
  11. httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,2000);
  12. HttpResponse httpResponse = httpClient.execute(httpRequest);//执行请求返回响应
  13. System.out.println(httpResponse.getStatusLine().getStatusCode());
  14. if(httpResponse.getStatusLine().getStatusCode() == 200){//判断是否请求成功
  15. String result = EntityUtils.toString(httpResponse.getEntity());
  16. if("1".equals(result)){//判断返回结果是否为1,是则登录成功。并跳转到MainActivity
  17. Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
  18. //跳转到MainActivity并将用户名、密码和登录结果传到MainActivity中
  19. Intent intent = new Intent(LoginActivity.this,MainActivity.class);
  20. intent.putExtra("username", username);
  21. intent.putExtra("password", password);
  22. intent.putExtra("fragment_id",1);
  23. intent.putExtra("activityName", "loginActivity"); R.layout.fragment_personal_center_logined);
  24. finish();
  25. startActivity(intent);
  26. }else{//如果返回结果不是1,则登录失败
  27. Toast.makeText(LoginActivity.this, "登录失败", Toast.LENGTH_SHORT).show();
  28. }
  29. Toast.makeText(LoginActivity.this, result, Toast.LENGTH_LONG).show();
  30. }else{//如果连接服务器的连接码是200,则服务器故障
  31. Toast.makeText(LoginActivity.this, "没有获取到Android服务器端的响应!", Toast.LENGTH_LONG).show();
  32. }
  33. }

登录的服务器端代码如下:

  1. try{
  2. Query query = session.createQuery("from TableUser where userName=? and password=?");
  3. //创建query,并通过query新建一条hql语句,查询数据库中是否相应的数据。
  4. query.setParameter(0, username);
  5. query.setParameter(1, password);
  6. query.setMaxResults(1);//设置最大结果为1
  7. TableUser tableUser = (TableUser) query.uniqueResult();//将查询出的结果存放到POJO类对象tableUser中
  8. if(tableUser!=null){
  9. return tableUser;
  10. }else{
  11. System.out.println("用户名或密码错误,请重试");
  12. return null;
  13. }
  14. }catch(Exception e){
  15. e.printStackTrace();
  16. return null;
  17. }



4.1.3 用户信息管理

用户登录之后可以查看、修改自己的用户信息,当打开该软件时,点击主页面上的“个人中心”标签,会提示用户进行注册或者登陆。当新用户点击注册并对基本信息进行填写完毕后提交,数据就会通过服务器传送到数据库,数据库对新增的数据进行进行插入,增添新的字段来存储。对于老用户可以直接进行登录进入个人的信息管理界面,上面记载了用户的基本信息和发布的商品等,用户可以在此界面查询基本信息并对其进行修改,如图4-6所示,用户信息管理代码如下:

  1. personalCenter_logined_root_view= inflater.inflate(R.layout.fragment_personal_center_logined, container,false);//登录成功之后则用户中心对应的Fragment显示
  2. tv_username=(TextView) personalCenter_logined_root_view.findViewById(R.id.tv_user);
  3. tvw_set =(TextView)personalCenter_logined_root_view.findViewById(R.id.tv_settle);
  4. tvw_per =(TextView)personalCenter_logined_root_view.findViewById(R.id.tv_edit);
  5. btn_exit =(Button)personalCenter_logined_root_view.findViewById(R.id.bt_exit);
  6. tv_public = (TextView) personalCenter_logined_root_view.findViewById(R.id.tv_public);

4.2 商品展示

4.2.1 商品的搜索

用户可以搜索自己想要查看的商品,用户在客户端中输入要搜索的商品信息后,所输入的信息通常是关键字,如商品的名称、标题等,系统会向服务器端创建连接并向其发出请求。服务器端在接受该请求的内容后会对数据库中的数据进行处理,主要是通过模糊查询,对数据进行顺序检索,当发现有与关键字相符的数据时,对该条数据进行提取,将所有提取出的数据放置在容器中,将其返回给客户端。搜索的商品的名称、图片和内容将在ListView中进行显示,如图4-7。

客户端中的商品搜索代码如下:

  1. //连接服务器并获取列表数据
  2. new Thread(new Runnable() {
  3. @SuppressWarnings("deprecation")
  4. public void run() {
  5. Looper.prepare();
  6. HttpClient httpClient = new DefaultHttpClient();
  7. try {
  8. //连接服务器并将request发送到服务器,将返回结果在客户端接收。
  9. HttpPost httpRequest;
  10. List<NameValuePair> params = new ArrayList<NameValuePair>();
  11. params.add(new BasicNameValuePair("searchCommodity", searchText));
  12. httpRequest = new HttpPost(url+"/search.action");
  13. httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
  14. HttpResponse httpResponse;
  15. httpResponse = httpClient.execute(httpRequest);
  16. if(httpResponse.getStatusLine().getStatusCode() == 200){
  17. HttpEntity entity = httpResponse.getEntity();
  18. if(entity!=null){
  19. String out = EntityUtils.toString(entity,"utf-8");
  20. System.out.println(out);
  21. JsonUtils(out);
  22. for(int i=1;i<= tv_search_list_image.size();i++){ bm_search_list_image.add(getUrlImage(url+"/"+tv_search_list_image.get(i-1)));
  23. }
  24. ArrayList list = new ArrayList();
  25. //这个list用于在bundle中传递需要传递的ArrayList<Object>
  26. /*将几个list添加到同一个List中,用以发送到主线程*/
  27. list.add(bm_search_list_image);
  28. list.add(tv_search_list_title);
  29. list.add(tv_search_list_content);
  30. //通过过message将存放有list的bundle发送
  31. Message message = new Message();
  32. Bundle bundle = new Bundle();
  33. bundle.putParcelableArrayList("list",list);
  34. message.setData(bundle);
  35. handler.sendMessage(message);
  36. }
  37. }
  38. }
  39. }}

服务器端中的商品搜索代码如下:

  1. Session session = org.util.HibernateSessionFactory.getSession();//创建session
  2. Transaction ts = session.beginTransaction();//创建Transaction
  3. List queryList = session.createQuery("from TableCommodity where commodityTitle like '"+commodityTitle+"'").list();//创建hql语句查询数据库,并将结果存放在一个List中
  4. ts.commit();//提交
  5. return queryList;

4.2.2 商品的推荐

本平台随机向用户推荐一些商品,设置按钮监听事件,当用户单击“推荐”标签时向服务器发出获取平台向用户推荐的商品信息的请求。服务器根据请求将数据库中已经存储好的推荐信息取出,并放到JSON中,并将该JSON统一发送给客户端,在客户端解析JSON 将解析出来的数据放在几个ArrayList中。如图4-8。在显示页面中设置下拉加载功能,使其能观看到所有的推荐信息。若数据在数据库、服务器和客户端的传递一切顺利且加载功能正常运行,则成功时会弹出“已经全部加载完成”的提示语。连接服务器获取数据的代码如下:

  1. public void run() {
  2. Looper.prepare();
  3. HttpClient httpClient = new DefaultHttpClient();
  4. HttpPost httpRequest;
  5. try {
  6. httpRequest = new HttpPost(url+"/show.action");
  7. List<NameValuePair> send = new ArrayList<NameValuePair>();
  8. send.add(new BasicNameValuePair("timer", timer+""));
  9. httpRequest.setEntity(new UrlEncodedFormEntity(send, HTTP.UTF_8));
  10. HttpResponse httpResponse;
  11. httpResponse = httpClient.execute(httpRequest);
  12. if(httpResponse.getStatusLine().getStatusCode() == 200){
  13. HttpEntity entity = httpResponse.getEntity();
  14. if(entity!=null){
  15. String out = EntityUtils.toString(entity,"utf-8");
  16. if ("".equals(out)) {
  17. Toast.makeText(getActivity(), "已经全部加载完成", Toast.LENGTH_SHORT).show();
  18. }
  19. onStop();
  20. JsonUtils(out);
  21. for(int i=1;i<= tv_recommend_list_image.size();i++){
  22. bm_recommend_list_image.add(getUrlImage(url+"/"+tv_recommend_list_image.get(i-1)));
  23. }
  24. ArrayList list = new ArrayList(); //这个list用于在budnle中传递 需要传递的ArrayList<Object>
  25. list.add(bm_recommend_list_image);
  26. list.add(tv_recommend_list_title);
  27. list.add(tv_recommend_list_content);
  28. Message message = new Message();
  29. Bundle bundle = new Bundle();
  30. bundle.putParcelableArrayList("list",list);
  31. message.setData(bundle);
  32. handler.sendMessage(message);
  33. }
  34. }
  35. }
  36. }

4.3 页面布局设计

对于二手交易平台而言,用户最直观感受到的就是每个页面的具体布局。页面整体的结构、每个模块的大小比例、颜色的具体搭配等都是关系到这个页面能否吸引人的眼球,能否引起人们进行购物的欲望。所以对各种按钮、文字和图片等的具体搭配设计是软件被公众采纳的一个至关重要的因素。在对客户端的各种具体页面进行设计时主要是参考Google官方发布的Metrial Design,结合项目特点,对相对布局、绝对布局还有线性布局的系统组合,再把各种具体的控件穿插在整体的布局中。运用各种控件如Button、TextView、EditText、ImageView等进行组合实现具体的功能,各种位置的设计和功能交相呼应,使用户在使用这个平台时有种赏心悦目的效果。为了实现刷新及加载功能,在界面显示上还使用了第三方库PullToRefresh库中的PullToRefreshListView组件进行列表的显示。

4.4 程序启动与退出设计

4.4.1 程序的启动界面

当用户点击手机主界面上本应用的图标时,整个程序开始进入Launcher界面。在这个页面中上方有应用平台的名称,右上角有一个“跳过”按钮,当点击此按钮时通过OnClick触发事件监听功能,直接通过timer.cancel()取消时间进程,直接跳入到主页面中。如果不点击“跳过”按钮,会有3秒钟的时间进程,3秒过后也会自动跳入到主页面。主要是运用TimerTask实现。在这个页面中间的绝大部分位置放置的是一张图片,目的是为了日后本开发软件推广后能吸引广告商家借助本平台进行宣传,从而提高本开发平台的商业价值,如图4-9。

  1. button.setOnClickListener(new OnClickListener() {//点击跳过按钮,出发点击事件的监听
  2. public void onClick(View v) {
  3. timer.cancel();//取消时间进程,直接跳转到MainActivity
  4. startActivity(intent);
  5. }
  6. });
  7. final TimerTask timerTask = new TimerTask() {//时间进程
  8. @Override
  9. public void run() {
  10. startActivity(intent);//启动MainActivity
  11. }
  12. };

4.4.2 程序的退出

有了程序的启动自然少不了程序的终止,通过代码进行设置。两次点击返回键时将会退出程序,此次设计主要是防止不小心碰触返回键时,若点击一次就完全的退出程序,当用户误点时还需重新启动程序,即使初始化页面中有跳过按钮但这个过程仍然会使不少用户丧失耐心,不利于该程序的长期使用和发展,而且用户还需要从头重新查找商品。所以我们设计当用户返回至主页面时,当用户两秒内按下第二次返回键时,会通过Toast.makeText弹出“再按一次退出程序”的提示框来提醒用户,如图4-23,这样就会给用户发出预告退出的信号,再按一次返回键就直接通过代码 System.exit(0)退出程序,会大大地减轻用户错误退出程序的现象,使该程序更为地人性化和合理化,具体的程序退出代码如下:

  1. //返回键点击事件,两次点击退出程序
  2. public boolean onKeyDown(int KeyCode,KeyEvent event){//监听实体按键点击事件
  3. if(KeyCode==KeyEvent.KEYCODE_BACK){//按键代码是返回键
  4. exit();//执行exit方法判断是否是第二次点击
  5. return false;
  6. }
  7. else{
  8. return super.onKeyDown(KeyCode, event);
  9. }
  10. }
  11. //返回键点击后执行的方法
  12. public void exit(){
  13. if (!isExit) {//若是第一次点击则将isExit设置为true,并提示用户预告退出。
  14. isExit = true;
  15. Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
  16. mHandler.sendEmptyMessageDelayed(0, 2000);//设置handler以确定2秒之内点击两次返回键才会退出。
  17. } else {
  18. Intent intent = new Intent(Intent.ACTION_MAIN);
  19. intent.addCategory(Intent.CATEGORY_HOME);
  20. startActivity(intent);
  21. System.exit(0);
  22. }
  23. }

4.5 上拉加载和下拉刷新设计

像二手商品交易平台这种软件商品的信息时时刻刻都处在动态的变换之中,就少不了在显示商品时对商品进行刷新功能,这样可以防止商品信息的滞后性对买家和卖家所造成的损失。当需要对商品的显示列表进行刷新时,只需到商品栏的最上面将整个商品的显示栏下拉即可,会显示一个正在转动圆圈,在旁边注明正在刷新的提示语。当用户在依列表顺序查看商品时,观看到页面显示的最后一个时可以上拉整个商品的显示列表,与刷新类似,旁边的提示语变成了正在加载,如图4-11所示。其中在制作拉动时的显示方面主要是通过调用getLoadingLayoutProxy方法来实现的,在显示列表时不是直接将数据放到ArrayList中,这种方式复杂度较大并且不能放置多个种类的数据。所以我们采取将数据放置到一个新建的Adapter类中,这样减少了复杂度又可将其放到一个View中。两者都是将当前的最完整的信息提供给消费者,都是具有实时性的功能设计,加载刷新代码如下:

  1. lv_main_detail.setMode(Mode.BOTH);//设置上拉加载和下拉刷新
  2. //设置拉动时的显示
  3. lv_main_detail.getLoadingLayoutProxy(false, true).setPullLabel(getResources().getString(R.string.shanglajiazai));//下拉时的显示
  4. lv_main_detail.getLoadingLayoutProxy(false, true).setRefreshingLabel(getResources().getString(R.string.zhengzaijiazai));//正在刷新时的显示
  5. lv_main_detail.getLoadingLayoutProxy(false, true).setReleaseLabel(getResources().getString(R.string.songkaijiazai));//刷新完成时的显示
  6. lv_main_detail.getLoadingLayoutProxy(true, false).setPullLabel(getResources().getString(R.string.xialashuaxin));//上拉时的显示
  7. lv_main_detail.getLoadingLayoutProxy(true, false).setRefreshingLabel(getResources().getString(R.string.zhengzaishuaxin));//正在加载时的显示
  8. lv_main_detail.getLoadingLayoutProxy(true, false).setReleaseLabel(getResources().getString(R.string.songkaishuaxin));//加载完成时的显示

第五章 系统测试

5.1 用户注册测试

在新用户进行注册时,输入特定的临界值,观察程序是否能够正常运行,在输入用户名时输入一个已经被注册的用户名,观察程序能否正常显示“用户名已被注册”,在输入密码时需要两次确认密码的正确输入,当第二次输入密码与第一次密码不一致时,系统显示“两次输入的密码不一致”,在输入获取的验证码时,若输入的不正确则显示“验证码不正确”,注册界面测试结果如图5-1所示。

5.2 程序启动测试

当打开该应用程序的图标进入程序的启动页面,会在该界面有3秒钟的程序延时,当然用户也可以通过点击右上角的“跳过”按钮直接跳过初始化界面进入该软件平台,初始化界面如图5-2所示。

5.3 用户的退出测试

当用户返回到程序的商品显示的主页面时,若再按一下返回键时,由于这已经是程序的最初界面,无法再返回到其他界面时,程序会默认用户想要退出该应用软件,会显示“再按一下退出程序”,用户再按一下退出,测试过程如图5-3所示。

5.4 商品的加载刷新测试

在商品的显示界面中,最新发布一个商品信息,但在主页的商品列表中并没有发现此条发布信息,通过下拉刷新的方式,可以发现在商品列表中显示刚刚发布的此条消息,当搜索推荐商品时,会发现推荐的商品种类并不多,通过上拉加载的方式,可以加载出更多的商品,加载前后的商品显示界面如图5-4所示。


5.5 商品搜索测试

模拟用户在搜索框中输入想要查找的商品的关键字时,系统会根据关键字的需要对全部商品逐条进行筛选 ,筛选出符合要求的商品来进行显示,具体的搜索框如图5-5所示。

5.6 个人中心测试

用户在尚未登录的情况下进入的个人中心界面如图5-6的(a)图所示,用户通过注册或登录进入个人中心后其显示界面如图5-6中的(b)图所示,上面记载着用户名,该用户发布的商品、买到的和卖出的商品,并允许用户编辑和分享信息,同时也支持该用户退出当前账号。


第六章 设计总结

6.1 设计总结

经过这段时间的学习和实践,本人对Android设计和整体代码架构有了更深层次的认识,将理论运用到实践是作为一名编程人员基本的素养。纸上得来终觉浅,觉知此事要躬行。理论知识只是一种知识储备,它是一个项目完成的基础,在运用到具体实践过程中会出现一些理论上没有直接点明的问题。在设计的过程中也学习掌握了许多技术性的知识,学会了使用JSON数据类型来实现数据交换,运用Http库中的Response和Request两个方法在客户端和服务器之间请求和响应,并通过PrintWriter传递数据[14],Fragment的使用交互和集成,每个Action类中的execute方法对数据的处理[15]。同时编写程序需要程序员有严谨的思维和发达的逻辑能力,在具体程序的嵌套和调用过程中,环环相扣,一次思维的偏差都不可能导致结果的出现,需要编程人员事先在脑中形成清晰的框架,这样在具体实施过程中才能做到心中有数,按部就班。在编写程序的过程中,也需要编程人员有足够的耐心和细心,一个逻辑符号的错误都可能导致程序向不同的方向发展,而错误问题的寻找是解决问题的关键,要求对程序的设计有清楚地了解,对找出错误的出处有足够的耐心,进而才能解决问题得到想要的结果。

6.2 展望

在该平台的页面设计的美化方面还存在欠缺,需要专门的美工人员来进一步优化。在数据量方面由于工作量过于庞大,所以在测试时只是简单的输入几条有代表性的数据,当真正投入到市场之后随着用户的不断增加,发布的商品数也不断增加,用户表和商品表的数据量过大可能会引起客户端和服务器速度的限制。

谢 辞

时光飞逝,转眼间已经到了即将离开校园的时候,回想刚来到大学校门时的青涩懵懂,现如今已成熟不少,在这里成长了四年,也蜕变了四年。校园里的每个角落都留下当初走过的痕迹,也记载着大家的成功和失败。欧阳修说过“古之学者必严其师,师严然后道尊。”老师不仅传授大家学业上的知识,还为大家解答生活上的疑惑,充当传道、授业、解惑的角色。在这四年的成长经历中给予了不少的帮助。

本次的毕业设计是在老师的带领下完成的,老师在学术问题上一向是事事巨细,一丝不苟。在老师的指导下发现自己在之前的学习过程中有许多细节方面的疏忽,这些都可能导致在实际的编写程序过程中引起逻辑的混乱,导致程序编写的失败。老师的教诲绝不仅限于此,举一反三,未雨绸缪,在日后的实际运用过程中会产生深远的影响。当时在确定老师为指导老师时深感荣幸,从毕业设计开始到最终的定稿,老师总是不遗余力地定期进行指导,询问进度和进程中可能出现的问题,耐心地进行解释,发现问题,提出建议,使得问题能够及时发现及时解决。在此由衷的感谢老师的付出,项目的最终完成您有着不可磨灭的功劳。

在项目的具体制作过程中,当程序编写遇到瓶颈期停滞不前时,同学、朋友、家人也给予了不少的鼓励与建议,在遇到问题的时候不要打退堂鼓,要勇往直前解决问题。谢谢你们的关心和帮助。

在这次毕业设计的过程中,我学会了很多,明白了很多,也收获了很多。谢谢这一路陪着一起走过的人,你们的批评和鼓励是我前进的动力,因为有你们,将不畏前路的荆棘与坎坷,带着你们的建议与期许描绘出更精彩的人生!

参考文献

[1] 来源:百度百科(链接:http://baike.baidu.com/link?url=dEsap-DsPoXiOf3zNnmePV3ZxX92qxR_RevTHJ0ARO5OtvmAGo3AREFBweh9j1iAY_6qeZdVxcqISmhMqnqEuK)

[2] 来源:百度百科(链接:http://baike.baidu.com/link?url=WAeoLfon6b4jSDNavglMfQJphDDRbfbs9OCGyxpGFsbf2gC5OleSm_QgsZpPlTcysJdwp-W8TrMs8mPATqYDwl-7pGvqef5Qbx3QhS4-6qi)

[3] 来源:百度百科(链接:http://baike.baidu.com/link?url=QqYR2nEKaMusm6BvnbJKmGuC9fyo4mtctdjORF09E4nLgCeMCGjBwiJkd3P117AAKqElgQ1xOVXXis4ySD-e2L9s3WHHOQC_9bAxQFRJC5Ti7k7KTMCen-46OLq00tkd61QPIqaen4Nh8WHF1Fnwx

[4] 来源:互动百科 (链接: http://www.baike.com/wiki/DB2%E6%95%B0%E6%8D%AE%E5%BA%93

[5] 来源:博客频道 -CSDN.NET(链接: http://blog.csdn.net/tangtiantian520/article/details/50945582

[6] 来源:百度百科(链接:http://baike.baidu.com/link?url=LHtyOBX-CoB_yfFjjhKN8u11RBViU_AqhdzOXvjhQUN4jPZJWpPr8XMRfYdaXkXTeQhAb3xAmR3GPtcK-2iEHYg4a4cl3KS2iWW_1JC3Vb3)

[7] 郑阿奇.JavaEE教程[M].北京:清华大学出版社,2012:134-281.

[8] 王端义. 基于商脉的B2B电商系统Android客户端的设计与实现——基础功能模块和商脉拓展模块的设计与实现[D]. 东南大学, 2015.

[9] 邓丽.企业级数据库基础——DB2[M].大连:东软电子出版社,2013:112-132.

[10] 郑阿奇.JavaEE教程[M].北京:清华大学出版社,2012:134-281.

[11] 来源:博客(链接:http://blog.itpub.net/11325862/viewspace-1263476)

[12] 李宁. Android应用开发实战[M].北京: 机械工业出版社, 2013:28-34.

[13] 邵雨舟,贾岚,刘力强. Android移动互联网的开发[M]. 北京:北京邮电大学出版社, 2016:118-136.

[14] 李冉. 安卓客户端与WEB服务器数据传输方案的实现[J]. 湖北工程学院学报, 2016, 36(3):34-37.

[15] 田柏玉, 庄海涛, 钱旭. 高校网上跳蚤市场Android客户端设计与实现[J]. 计算机科学, 2016, 43(S2):572-574.

上传的附件 cloud_download 毕设.7z ( 20.44mb, 120次下载 )
error_outline 下载需要14点积分

发送私信

幸福的绿光在哪里

21
文章数
20
评论数
最近文章
eject