基于android平台的移动手机商城设计与实现毕业论文

基于android平台的移动手机商城设计与实现毕业论文

ID:1392266

大小:3.01 MB

页数:101页

时间:2017-11-11

上传者:U-267
基于android平台的移动手机商城设计与实现毕业论文_第1页
基于android平台的移动手机商城设计与实现毕业论文_第2页
基于android平台的移动手机商城设计与实现毕业论文_第3页
基于android平台的移动手机商城设计与实现毕业论文_第4页
基于android平台的移动手机商城设计与实现毕业论文_第5页
资源描述:

《基于android平台的移动手机商城设计与实现毕业论文》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

基于Android平台的移动手机商城设计与实现毕业论文目录摘要IAbstractII目录III引言11.课题研究背景21.1Android平台21.23G时代手机购物与网络购物的比较分析31.3集成开发环境Eclipse51.4Android模拟器..............................................................................................................61.4.1模拟器概述................................................................................................................61.4.2模拟器和真机的区别...............................................................................................71.5研究的目的和主要内容71.5.1研究的目的71.5.2研究的主要内容81.6论文组织结构................................................................................................................82.基于Android平台的移动手机商城开发环境和相关技术..............................................82.1开发环境及硬件需求92.2Java语言特点92.3关于ECLIPSE............................................................................................................132.4数据库需求分析.........................................................................................................132.5本章小结.....................................................................................................................133.系统总体设计143.1总体功能143.2E-R图........................................................................................................................153.3初步设计方案.............................................................................................................16-98- 3.3.1客户端的登录和注册.............................................................................................163.3.2客户端的浏览功能.................................................................................................173.3.3购物车功能............................................................................................................173.3.4订单功能................................................................................................................183.3.5服务器管理功能....................................................................................................193.4系统流程概述193.5系统框架图.................................................................................................................203.6数据库设计..................................................................................................................213.7本章小结234.系统详细设计...................................................................................................................244.1总体流程概要设计244.2Android系统客户端逻辑结构设计及其内容编码..................................................254.2.1客户端登陆功能内容............................................................................................254.2.2客户端注册功能内容............................................................................................264.2.3客户端商品和搜索功能内容................................................................................284.2.4客户端购物车功能内容........................................................................................394.2.5客户端订单功能内容............................................................................................494.2.6客户端httpclient.....................................................................................................534.3系统后台逻辑结构设计及其程序开发.....................................................................554.3.1系统后台管理员和用户登录程序内容.................................................................564.3.2系统后台商品管理程序内容.................................................................................594.3.3系统后台订单管理程序内容.................................................................................624.4本章小结......................................................................................................................655.系统的具体实现...............................................................................................................665.1前台android客户端主要功能的实现.......................................................................675.1.1登入界面.................................................................................................................675.1.2注册界面.................................................................................................................685.1.3商品主界面.............................................................................................................68-98- 5.1.4商品服装的详细页面.............................................................................................705.1.5htc手机商品的详细界面和将想要购买的加入购物车界面...............................715.1.6购物车界面.............................................................................................................725.1.7订单结算界面.........................................................................................................735.2后台web端主要功能的实现....................................................................................745.2.1后台登入界面.........................................................................................................745.2.2后台主界面.............................................................................................................755.2.3商品列表界面.........................................................................................................765.2.4后台添加商品界面.................................................................................................775.2.5后台编辑商品界面.................................................................................................785.2.6后台订单管理界面.................................................................................................805.3本章小结......................................................................................................................806.总结和展望.......................................................................................................................816.1基于Android平台的移动手机商城的设计回顾.......................................................816.2Android平台的移动手机商城的设计经验总结........................................................816.3本章小结82结论83致谢84参考文献86-98- 引言Java语言是由美国SunMicrosystem的詹姆斯·高斯林、PratrickNaughton及MikeSheridan等人在1991年精心设计出来的计算机编程语言,它的构想在于实现可以在不同的平台上运作使用同一种编程语言所编写出来的程序。这种架构是具有革命性的对于消费性电子产品而言,因为在消费性电子产品中的操作系统及处理器各不相同,如果要在不同的平台上开发程序就必须要了解和熟悉各个平台的特性,以及其供应的API使用方式,必须分别开发不同的版本才可以执行,这就影响了应用程序的普便性。近几年,由于移动互联网作为全新的时代背景,甚至有业内人士大胆预测随着无线互联不断蚕食着有线互联市场,未来可能接近7成都将是无线互联的市场,人们日常上网的主要的产品将是手机。正是预见到手机用户的无线市场有着巨大的发展潜力,各行各业都不断加速抢占无线互联的市场。移动电子商务在未来的巨大发展潜力是吸引京东、当当、卓越以及淘宝等各大电子商务企业进入这一领域的主要原因。程善宝指出,淘宝、京东等传统电子商务企业进入移动电子商务,根据商品渠道、运营经验等方面的经验的优势,在移动电子商务领域将会比电信运营商、software提供商和新兴的移动电子商务企业具有着更好的远景。由于移动通信的不断发展和互联网转向移动终端的推广,用户和网络对移动终端的要求与日俱增,因为WindowsMobile,Symbian,PalmOS等手机平台过于陈旧与封闭,不能很好的满足用户的需要和要求,所以市场急切需要着开放性很强的一个平台。随着多年的发展,第三代数字通信(3G)技术获取了市场广泛的关注和接受,它为移动终端用户提供了更快捷的数据传输速率。随着3G网络的使用,移动终端不再只是通讯网络的终端,还将成为互联网的终端。所以,移动终端的应用软件以及需要的服务将会有着很大发展的空间。Google就为此在2007年的11月推出了一个专门为了移动设备设计的一个软件平台——Android。Android是一套真正意义上的具有开放性的移动设备的综合平台,它包括操作系统、中间件和一些关键的平台应用。Android是由Linux+Java构成的开源软件,允许所有厂商和个人在其基础上进行设计开发。Android平台具有的开放性等特点既能促进移动通信技术的不断创新,也将有助于对开发成本的降低,还可以使得运营商非常方便的制定出具有自己特色的产品。因此,它是具备-98- 很大的市场发展潜力。1.课题研究背景1.1Android平台1.Android平台:Android是Google基于Linux平台研发出来的手机操作系统。是google公布的手机应用平台。它包括用户界面,操作系统和移动电话工作所需要的全部软件。它使用软件堆层的构架主要有3部分,最底层是以Linux内核工作为基础的。谷歌通过与运营商,设备制造商,开发商和其他相关方面的深厚的合作伙伴关系,希望能够通过创建一个标准的,开放的手机软件平台,在移动通信行业形成一个开放的生态系统。2.Android系统的优势以及特点:□开放性。Google与开放手机联盟合作开发了Android,谷歌通过与运营商,设备制造商,开发商和其他相关方面的深厚的合作伙伴关系,希望能够通过创建一个标准的,开放的手机软件平台,在移动通信行业形成一个开放的生态系统。□应用无国限。在Android设备上的应用程序可以通过标准API访问核心移动。通过互联网,应用程序的功能可以宣布它们提供给其他应用程序。□在平等基础上创建应用程序。在移动设备上的应用程序可以被替换或扩展,即便是拨号程序,或在主屏幕上的核心部件也可以。□应用程序可以很容易地嵌入到网络。应用程序可以很容易地嵌入在HTML、JavaScript和样式表,并且也可以通过WebView将网络内容显示。□在应用程序中可以实现并行运行。在Android这种完整的多任务环境中,应用程序可以在实现并行运行。并且后台运行的时候,应用程序能产生通知以引起注意。3.Android的应用发展现状因为现如今有很多的厂商看到了Android的美好发展前景,所以从外国到内陆很多厂商都已经利用Android来生产手机和平板电脑等的电子产品。像戴尔这样有实力的厂商也是如此,例如戴尔推出的平板电脑streak就是使用的Android系统,与苹果ipad的功能相比几乎不相上下,甚至用户在使用感受上和通用性能上会比ipad更加优秀。-98- 在国内,许多厂商在全力追求具有高清播放能力的电子产品的情况下也都同时使用了Android作为他们自己产品的使用的系统。甚至还有很多的山寨产品也全是使用的Android的操作系统来生产他们的产品,虽然还是和模仿的产品有多少的差距,但是从外观和价格的角度上来讲山寨的产品还是有它的市场。这些都证实了当今Android的应用现状是非常受认可的。4.开发基于Android平台的应用在Android平台上,可以开发出各式各样的应用。Android的应用程序是用Java语言开发的,也就是说,只要会Java语言就可以比较容易地开发出Android的应用。如果不了解Java也没有关系,通过一段时间对Java语言的学习,也可以很快进入Android开发领域。加上Android平台提供了2D、3D的图形支持、数据库支持(SQLite),并且集成了浏览器。基于Android的平台,我们可以开发出丰富多彩的应用,这些应用可以涉及工具、管理、互联网、游戏等,在此开放的平台上,这一切都取决于程序员的自由发挥和创意。1.23G时代手机购物与网络购物的比较分析1.手机购物的概念手机购物指的是使用手机上网从而实现在网络上购物的过程,属于移动电子商务。其购物的原理与在使用电脑网购一样,仅仅是载体从电脑变成了网络手机。国内的3G业务将有可能与网络购物和网络支付等平台联手,通过网速的超高速率来实现“手机购物”。在不久的将来中国的手机购物将会迎来一个高速的增长期,用户只要开通手机的上网服务,就可以通过手机查询商品信息,并且可以在线支付购买产品。不用去实体店铺,也不用坐在电脑前“淘货”,一部手机就可以完成挑选、选购和支付的全过程。据了解,目前运营商和网购平台以及网付平台三方已有意向进行合作,一旦“手机购物”的铁三角形成,用户不仅购物将会更加的便捷,运营商和网购平台以及网付平台三方也将从中获益匪浅。实际上,此前国内的部分网购商曾经推出过“手机购物”业务,但是由于2G手机的网速较慢,用户浏览网店以及网上支付的效果并不是很好。2.外国的手机购物发展如今将近九成的日本以及韩国的手机用户都已经习惯了手机购物,即便是购买食品、洗浴用品这样的在日常生活中不可缺少的用品。在最早开通3G服务的日本,手机网络购物的交易额已经占电子商务总体交易额的四成左右。由于移动电子商务的高速发展,为日本的众多商业企业提供了更多的销售渠道,将近全部的网络经营者都同时经营着自己的移动商铺。与传统的互联网购物相比,用户消费者用手机购物更加-98- 的方便、保密、共享。手机购物已经成为日本、韩国等国“快时尚”标志,在城市德年轻人当中深受喜爱。3.当今手机购物在中国的发展与问题在当今大城市的地铁中出现了这样的奇特情景:在行人匆匆走过的地铁通道中,出现了超市中才能见到的商品货架,琳琅满目的商品,就像是在大型超市一样,但走进才发现“货架”竟然是“贴在”墙上的,可乐、奶粉、甚至还有尿不湿,每一种产品下方都有相应价格和唯一的二维码。这究竟是何物呢?来这个“墙壁超市”是电商企业1号店进一步开拓潜在市场所推出的一种全新尝试,属于国内首创的虚实结合移动电子商务应用,12年7月25日在上海首次与消费者进行见面,29日覆盖北京CBD范围的公交站点同期进行投放,此举是为了让更多消费者体验到全新的购物模式。  早在今年年初,中国主力电子商务军真正向无线应用发起进军,不再是前两年的“雷声大、雨点小”。移动互联网俨然成为电子商务争抢的香饽饽,电子商务网站纷纷启动了移动互联网战略。目前,电子商务企业推出手机、PC客户端早已不是新鲜事,淘宝网、乐淘网、麦考林、凡客诚品、当当网、卓越网等均相继推出各种类型操作系统的手机客户端产品。  而今年第一季度中国移动互联网用户规模达到了约3.5亿人,同比增速高达66.5%,其中移动购物第一季度收入突破15亿,占移动互联网总收入的14.20%。  无论是网络的便捷性、物流的畅达性、产品的多样性、经营方式上的灵活性,抑或是对于消费者生活方式的改变,各种优势都在进一步挤压传统零售商的生存空间。同时也触动了他们对市场的敏感,面对此庞大的市场蛋糕开始蠢蠢欲动。  以目前国内手机产业的发展趋势来看,数量巨大的移动互联网用户,为移动电子商务的发展提供了潜在的用户基础,巨大的利益也引来了众多企业纷纷加入。不过,移动电子商务还不能达到炉火纯青的地步,比如手机上网不够快、资费仍然偏贵、移动终端的安全性、支付的安全性等制约着移动电子商务的发展。在市场化的过程中显露出的一系列问题,终将由市场来解决,移动电子商务也必将有广阔的市场前景。4.与传统网络购物相比,手机购物具有的优势分析(1)手机购物具有很好的便捷性(2)手机购物用户群体数量多(3)3G技术的支持(4)手机购物具有"随时随地"等特点(5)手机购物有较好的身份认证的基础-98- 5.与传统网络购物相比,手机购物存在的问题(1)购物形式单一(2)支付体系的建立和完善尚需时间(3)相比网络购物具有更大的不安全因素1.3集成开发环境EclipseEclipse是一个开放源代码的、与NetBeans、SunONEStudio和BorlandJbuilder类似的一种基于Java的整合型可扩展开发平台,也是目前最著名的开源项目之一。其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse附带了一个标准的插件集,包括Java开发工具(JavaDevelopmentTools,JDT)。其未来的目标不仅仅是成为专门开发Java程序的IDE环境,根据Eclipse的体系结构,通过开发插件,它能扩展到任何语言的开发,甚至能成为图片绘制的工具。同时可以通过开发新的插件扩展现有插件的功能,比如本文为了进行手机即时网络游戏的开发,就是通过J2ME插件的扩展来加以实现的。Eclipse的跨平台性很强,可以通过无限扩展各厂商的专有SDK,来实现应用程序在各种型号不同的手机上的应用,而且它本身有着统一的外观,操作和系统资源管理,这正是Eclipse的潜力所在[4]。相比其他的手机专用开发工具,Eclipse有如下几个优点:①、丰富的观察窗口。视图是Eclipse的最灵活的部分,可以自定义每个视图中包含的观察窗口种类,也可以自定义一个新视图。当然,每个视图的观察窗口都是可配置的,多样化的视图不但可以帮助程序员以不同角度观察代码,也可以满足不同的编程习惯。②、强大的调试功能。Eclipse有多种跟踪方式,断点设置,变量值察看窗口等,而且根据所安装插件的不同,Eclipse存在多种运行/调试程序的方式。这样可以使程序员能更快的发现问题和解决问题,提高开发的效率。③、强大的插件加载功能。这正是Eclipse实现手机跨平台特性的真正魅力所在,也是提高手机游戏移植效率的有效方法。④、快捷的代码显示切换功能。Eclipse提供了只显示所选单元的代码显示切换功能,这在编辑Java程序的时候可以以方法为单位进行编辑,不仅代码的显示更加简捷,而且还有助于编写封装性更好的类。正是由于Eclipse的种种优秀特性,使得Eclipse在众多整合型开发平台中脱颖而出,成为不少从事手机软件开发的程序员的首选开发工具,这也是本文中的手机即时网络游戏选用Eclipse进行开发的真正原因。-98- 1.4Android模拟器1.4.1模拟器概述Android模拟器的主界面,如图1-1所示图1-1安卓模拟器的主界面如1-1图所示的是模拟器的主界面全景图,从图中我们可以看出模拟器主要是由两个部分组成的,上图左边的部分模拟的是手机的显示界面,主要分布有电话按钮,主菜单按钮和上网按钮,右面的部分模拟的是手机的键盘输入。在模拟手机的部分内置了一些Google公司自带的程序,如打电话,发短信以及其他程序。Android模拟器中AndroidSDK自带一个移动模拟器。它是一个可以运行在你电脑上的虚拟设备。Android模拟器可以让你无需使用物理设备便可预览、开发和测试设计的Android应用程序。Android模拟器能够模拟除了接听和拨打电话外的所有移动设备上的典型功能和行为。Android模拟器提供了大量的导航和控制键,你可以通过鼠标或键盘点击这些按键来为你的应用程序产生事件。同时它还有一个屏幕用于显示Android自带应用程序和你自己的应用程序。为了便于模拟和测试应用程序,Android模拟器允许你的应用程序通过Android平台服务调用其他程序、访问网络、播放音频和视频、保存和传输数据、通知用户、渲染图像过渡和场景。Android模拟器同样具有强大的调试能力,例如能够记录内核输出的控制台、模拟程序中断(比如接受-98- 短信或打入电话)、模拟数据通道中的延时效果和遗失。下面的章节将提供关于模拟器的详细信息,以及如何在开发应用程序中使用模拟器。1.4.2模拟器和真机的区别Android的模拟器功能很强,但是模拟器仍然只能尽量去模拟手机,有些手机的功能还是模拟不了,下面做一个简单的说明。(1)模拟器不支持呼叫来电和接听实际来电,但可以通过控制台模拟电话呼叫。(2)模拟器不支持USB连接。(3)模拟器不支持相机/视频捕捉。(4)模拟器不支持音频输入,但支持输出。(5)模拟器不支持拓展耳机。(6)模拟器不支持蓝牙。(7)模拟器不能确定连接状态。(8)模拟器不能确定电池电量水平和充电状态。(9)模拟器不能确定SD卡的插入和弹出。1.5研究的目的和主要内容1.5.1研究的目的题目要求研究并完成一个基于Andriod平台的网上购物商城,在此设计使用手机商城,用户可以通过Android系统手机登录该商城,而且可以进行查询和购买商品等功能,就如京东,当当等网站一样,提供用户对商品的一些简单的操作.此购物系统使得用户使用的时候自由度较高,并非非要通过电脑来进行购买商品,只需要有个Android系统的手机就可以无时无刻的进行购物了.不但解放了时间和空间的限制,也增加了购物的效率,和购物的乐趣.1.5.2研究的主要内容(1)用户可以进行注册并成为会员(2)用户可以通过用户名登录(3)用户可以对自己想要浏览的商品进行查询和搜索(4)用户可以对商品进行浏览(5)用户可以添加想要购买的商品进入购物车(6)用户也可以将已经添加到购物车的商品删除或修改(7)登录的用户可以对订单进行查询(8)管理员管理商品的基本信息-98- (9)管理员可以对该网站的商品进行添加或删除(10)管理员管理订单的基本信息1.6论文组织结构本论文的引言部分和第一章中阐述了基于Android平台的移动手机商城的当今概况,并介绍了手机网络购物在当前社会的发展潜力,以及程序设计的一些研究背景。并且对基于Android平台的移动手机商城研究的目的和主要内容进行了说明。本文其余部分的内容如下:第二章介绍了Java语言的特点、本程序的开发环境及其相关工具的原理和使用。第三章中介绍了手机网络商城程序的基本流程和框架。对手机商城基本框架等做了详细叙述。第四章主要介绍了手机网络商城设计的详细过程,还对其重要部分的编程和代码进行了分析和讲解。第五章中在Eclipse开发平台下,使用Andriod模拟器对该手机购物商城系统进行测试实现。第六章中回顾了基于Android平台的移动手机商城设计过程中的遇到的难题,总结了设计过程中得到的经验与启示。-98- 2.基于Android平台的移动手机商城开发环境和相关技术介绍2.1开发环境及硬件需求Windowsxp较好的兼容性,内存资源占用少的特点是我选择作为本次开发的主系统的重要依据。考虑到机器的性能方面,在数据库的选择上,选用相对小型的Mysql5.0,更有利于系统的开发。Tomcat是一个轻量级应用服务器,占用系统资源少,扩展性好,性能稳定,是现在比较流行的Web应用服务器MyEclipseforSpring8.6集成了很多eclipse没有的插件,对于Web的开发有很好的帮助。EclipseIndigo3.7.2是开发Android系统的相对较好,稳定的开发工具。此次java开发环境沿用的是一直很熟悉的JDK1.6,在android方面用的是最先版本SDK。自身电脑完全可以支持本次系统的开发,硬件支持较好。2.2Java语言特点Java与C++语言相比,去掉了C++语言的复杂性和二义性的成分,增加了安全性和可移植性的成分。Java语言具有如下特点:简单性、面向对象、平台无关性、可移植性、解释性、髙性能、动态性、可靠性和安全性、多线程、分布式处理等。下面将介绍Java语言的主要特点2.3关于ECLIPSEEclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse附带了一个标准的插件集,包括Java开发工具(JavaDevelopmentTools,JDT)。虽然大多数用户很乐于将Eclipse当作JavaIDE来使用,但Eclipse的目标不仅限于此。Eclipse还包括插件开发环境(Plug-inDevelopmentEnvironment,PDE),这个组件主要针对希望扩展Eclipse的软件开发人员,因为它允许他们构建与Eclipse环境无缝集成的工具。2.4数据库需求分析-98- 基于功能需求中的各项功能,总结出数据库需要的主要有四张表。分别是:用户表,商品表,订单表。用户表需要包含用户昵称,密码,性别等较为详细的信息;商品表则需要包含商品名称,数量,价格等商品所应具备的基本信息;订单表需要包含订单编号,用户昵称,用户地址,订单状态等详细信息。2.5本章小结第二章介绍了Java语言的特点、本程序的开发环境及其相关工具的使用原理和使用方法。-98- 3.系统概要设计3.1总体功能该系统分为前端的客户端和后端的管理端,前端也就是客户端主要包括用户的浏览商品,注册,登录,商品搜索以及购物,添加到购物车,订单等重要功能.后端主要是管理员和用户的登陆与管理员对商品的订单信息和商品信息的管理,在整个系统中各自有不同的功能和权限.系统实现的大致过程是客户端连接服务器,服务器链接数据库;客户端连接数据库是网络连接,基于TCP/IP连接。服务器是通过jdbc接口与数据库连接的客户端的主要使用对象是普通的注册后的会员用户,后端管理模块的使用对象是管理人员和用户系统的概要设计流程如图3-1所示用户注册登录客户端商品搜索购物系统数据库浏览后台管理购物车订单查询管理员管理员登录商品信息管理订单信息管理图3-1系统的概要设计流程图-98- 3.2E-R图1.系统管理员主要管理用户,商品的添加和删除,订单,商品类型四个方面。2.用户主要包含了,ID,昵称,密码等属性。3.商品主要包含ID,名称,价格等属性。4.订单主要包含ID,订单状态等属性。5.商品类型主要包含ID,类型名称等属性。如下图3-2所示:用户昵称用户ID管理员用户时间商品订单管理管理管理密码电话等级手机号码性别余额商品ID规格价格图片数量描述商品名称用户姓名订单ID用户电话总价订单日期收货地址订单状态管理商品类型类型ID类型名mmm1111m-98- 图3-2E-R图3.3初步设计方案3.3.1客户端的登录和注册客户端的登录和注册是指一个用户如果要进行购买等商品时必须要有会员号,这是就需要注册手机商城是自己成为商城的会员,必须要填写用户自己想要在网站上使用的用户名还有密码,并且还要再次输入密码使得密码是确定唯一的。还要写入自己的手机号以便将来忘记密码时可以及时地找回并且还要填入性别。以上信息填写好后就可以生成一个属于用户个人的该网站的会员号。记住会员号和其对应的密码通过用户名和密码的填写可以进行登陆,若密码或用户名中出现与注册时不相同的信息则不能够登陆成功,将提示从新登陆。若用户名和密码填写正确后的用户可以登陆成功。通过挑选商品添加到购物车,方便下订单和之后的操作。客户端登陆注册流程如图3-3所示:手机主界面登陆/注册注册界面登陆界面NoyesNo验证验证yes注册用户的主界面图3-3客户端的登陆与注册流程图-98- 3.3.2客户端的浏览功能浏览功能是当一个用户进行注册和登陆成功后可以看到手机商城的主界面,主界面中具有五大类商品的按钮,其中有服装/服饰,电视机/显示器,手机/数码,皮包/包包,还有运动鞋等商品。点击5个图片按钮的操作程序按钮,点击后即可以显示该类商品的具体有哪些商品的信息。使得用户进行浏览和选购。客户端的浏览功能图如3-4所示手机主界面手机电脑照相机其他图3-4浏览功能的流程图3.3.3购物车功能购物车功能是对注册完成的手机商城的会员可以进行登陆,登陆成功之后的用户可以对自己中意的商品添加到购物车中,若用户还需要继续购物则可以回到商品区继续进行购物从而再把自己喜欢的商品添加到购物车,若购物完成后则可以在购物车中进行管理,可以对自己选入购物车的商品进行筛选,最终将所选择的商品进行购买或者将购买的商品下订单等.客户端购物车功能如图3-5所示客户端本地请求,读取本地文件,造型为对象点击购物车Tab将列表中元素在客户端显示点击结算,将数据写成字节流,发送至服务器服务器读取数据,写入数据库-98- 图3-5客户端购物车功能图3.3.4订单功能订单功能是对注册完成后的手机商城的会员可以进行对所选择的商品从购物车中下订单进行购买。订单界面中显示用户自己的账户余额,还有用户所要下订单的商品的价格,若要下订单必须要正确地填写用户的家庭住址以及联系电话,以便送货人员可以快速而又准确的配送;并且还要输入注册时填写的密码,若填写正确则下订单成功,若填写不正确则要继续填写正确后方可完成购买。订单系统的流程图如图3-6所示手机主界面商品浏览no订单用户登录状态yes接受订单图3-6订单功能的流程图3.3.5服务器管理功能服务器管理功能是指手机商城的网站管理员通过用户名以及密码的正确填写后登录到后台主页面,在商品管理的商品列表中通过数据库可以对产品的具体信息进行查询,修改,添加以及删除。管理员通过对商品信息的编辑可以添加商品。例如管理员要对打折期间的促销商品进行修改价格等操作或新上架的商品进行编辑从而使得普通用户可以在客户端浏览其信息。-98- 管理员在订单管理中可以看到用户下的订单,并且对客户的订单进行完成。服务器后台的大致流程如3-7所示管理员登录数据库管理删除增加修改查询数据库图3-7服务管理流程图3.4系统流程概述(1)用户如果要浏览网站得时后首先应该看到的就是网站首页,在首页用户可以浏览近期发布或更新的最新商品,还有网站的热门产品和该网站推荐的产品,而且还可以对已知的商品的信息进行搜索。(2)如果用户想要购买某些商品的时候用户需要注册成为该网站的会员。(3)如果用户浏览完商品的具体信息后,还可以把自己想买的商品放入购物车,也可以随时增加和删除或修改购物车里已添加的商品。(4)如果购物车里的商品用户已经满意就可以去下单。(5)相关的程序模块会将用户所填写的所有信息内容都记录在数据库内,使网上商城的管理人员可以准确和快速的核对信息内容,以便发送货物(6)若用户已经确认收到了购买的产品后整个购买的过程就结束了。(7)管理员在电子商城的后台管理方面还需要添加,修改,删除商品,同时要对商品进行分类和订单处理都是需要后台的管理人员来操作的。3.5系统框架图(1)后台管理框图如图3-8所示-98- 后台管理订单管理会员管理商品管理删除添加查找删除添加图3-8后台管理流程(2)用户端框图如图3-9所示用户订购商品查找商品浏览商品注册登录图3-9用户端框图-98- 3.6数据库设计本系统采用的是Mysql数据库,为了将在系统页面中显示的动态数据存放在后台数据库中,便于修改、更新和信息隐藏,因此,将E-R图转换成关系模型,即在数据库中建立实体关系表。(1)用户表用户表具有用户昵称、密码、电话、等基本信息。设置uid为主键,主键的生成策略采用自动生成方式。用户的属性图如图3-10所示:用户用户ID密码用户昵称等级性别余额手机号码图3-10用户属性图根据图3-10可定义出用户的数据表user,用户表用来保存所有用户的信息。结构如表3-11:表3-11用户表列名数据类型说明useridIntprimarykeyauto_increment用户IDusernamevarchar用户昵称pwdvarchar密码phonevarchar用户手机号码Power1varchar等级sexvarchar性别Yu_eInt余额(2)商品表商品表具有商品名称、数量、价格、图片等基本信息。设置pid为主键,-98- 主键的生成策略采用自动生成方式。商品的属性图如图3-12所示:商品商品ID数量商品名称规格价格描述图片图3-12商品属性图根据图3-12可定义出商品的数据表product,商品表用来保存所有商品的信息。结构如表3-13:表3-13商品表列名数据类型说明idIntprimarykeyauto_increment商品IDNamevarchar名称fujiavarchar规格jiaqianInt价格shuliangvarchar数量tupianvarchar图片miaoshuvarchar描述(1)订单表订单表具有用户昵称、用户姓名、商品名称、电话、地址、订单日期、订单处理状态等基本信息。设置sid为主键,主键的生成策略采用自动生成方式。订单的属性图如图3-14所示:-98- 用户订单ID用户姓名时间总价收获地址订单明细电话订单处理状态图3-14订单属性图根据图3-14可定义出订单的数据表salesorder,订单表用来保存所有订单的信息。结构如表3-15:表3-15订单表列名数据类型说明IdIntprimarykeyauto_increment订单IDshijianvarchar订单时间kewuvarchar客户shouhuodizhivarchar收获地址Jin_eint总价mingxivarchar订单明细zhuangtaivarchar状态phonevarchar电话3.7本章小结第三章中介绍了程序的基本流程和框架。对手机商城基本框架等做了详细叙述。具体算法的代码实现和详细流程将在下章介绍。-98- 4.课题详细设计4.1总体流程概要设计用户通过登录进入系统,可以进行修改自己的信息,浏览、订购商品,查看、取消订单等操作。通过管理员的权限可以进入后台管理系统分别对商品信息管理、订单信息管理、进行添加、删除、修改和查看等操作。系统工作流程图如图4-1所示。管理员用户登入后台登入客户端订单管理商品管理注册、登录浏览商品数据库购物车图4-1系统工作流程图4.2Android系统客户端逻辑结构设计及其内容编码4.2.1客户端登陆功能内容调用HttpClient这个类,实现与后台数据库的连接。运用sql语句查询数据库中用户的信息,与登入界面中输入的信息相匹配,如果匹配错误,则提示错误,如匹配正确,便可实例化一个Intent对象,并调用其方法,实现登录界面的成功跳转。如图4-2所示:-98- 客户端将输入内容以字节流发送至客户端服务器输入用户名,密码用户名,密码判断TrueFalse客户端接收数据,做相应跳转图4-2客户端登陆流程图登陆功能内容编码的翻译解释packagecom.shopping;--这个类放在了com.shopping这个文件夹下面importandroid.app.Activity;--引入Activity这个类,因为之后会用到这个类中的一些方法importandroid.content.Intent;--Android系统起步开机importandroid.content.SharedPreferences;--SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态importandroid.content.SharedPreferences.Editor;--设置Android信息的保存和读取importandroid.os.Bundle;--引入Bundle这个类,Android使用Bundle进行数据传递分析importandroid.os.StrictMode;--规定android的模式importandroid.preference.PreferenceManager;--引入PreferenceManager类,用来保存简单的数据类型importandroid.view.View;Android.view.view--应该是android的封装类,引入后就可以用view中的方法了importandroid.view.View.OnClickListener;--引入onClickListener类,是一种处理的是点击事件的接口。importandroid.widget.Button;--引入widget.Button这个类,就可以使用该类中按钮的一些使用方法importandroid.widget.EditText;--引入widget.EditText这个类,即可以在下面程序中使用编辑文本框中的方法了importandroid.widget.Toast;--引入widget.Toast这个类,作用是实现在界面上弹出一个悬浮提示框importcom.http.httpclient;--引入HttpClient这个类,HttpClient是ApacheJakartaCommon下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,Java应用程序需要直接通过HTTP协议来访问网络资源。-98- publicclassloginextendsActivity{privateButtonb1;--定义按钮b1privateButtonb2;--定义按钮b2privateEditTexte1;--定义一个编辑文本框e1privateEditTexte2;--定义一个编辑文本框e2SharedPreferencessh;--项目中需要对用户输入的信息进行存储,然后在后续程序中读取使用,利用到了SharedPreferences类。Editore;--编辑器@OverridepublicvoidonCreate(BundlesavedInstanceState)--这是Activity建立的时候一定会调用的onCreate()方法{super.onCreate(savedInstanceState);--继承onCreate()方法setContentView(R.layout.login);--载入登录页面这个视图internet();sh=PreferenceManager.getDefaultSharedPreferences(this);--拿到控件在SharedPreferences中存储的数值e=sh.edit();b1=(Button)findViewById(R.id.login_button1);--从R文件下调出登录页面的button1的按钮符b2=(Button)findViewById(R.id.login_button2);--从R文件下调出登录页面的button2的按钮符e1=(EditText)findViewById(R.id.login_editText1);--从R文件下调出登录页面editText1编辑文本框e2=(EditText)findViewById(R.id.login_editText2);--从R文件下调出登录页面editText2编辑文本框这段代码为用户“登录”操作代码会出现4种结果:1、显示“用户名不存在”2、登录成功并显示用户信息;包括1、用户名;2、余额3、显示“密码错误”-98- 4、如果没填写用户名或密码则显示“您是不是有东西没填啊”b1.setOnClickListener(newOnClickListener(){--设置一个登录按钮publicvoidonClick(Viewv){--点击这个“登录”按钮并执行该按钮下的操作if(!e1.getText().toString().equals("")||!e2.getText().toString().equals("")){httpclienthc=newhttpclient("l=1&sql=select@*@from@user1@where@username='"+e1.getText().toString()+"';");//"+e1.getText().toString()+"--访问网络资源,用户通过填写用户名,以及登录密码进行登录操作,后台将该用户的用户名及密码进行验证操作Stringstr=hc.getshuju();--得到数据信息//Log.d("Jersey",str);--输出数据str,且数据颜色为蓝色if(str.equals("")){Toast.makeText(login.this,"用户名不存在!",Toast.LENGTH_LONG).show();--如果str为空集,弹出一个文本框显示信息“用户名不存在”return;--返回结果}else{String[]str1=str.split(",");--将得到的信息以,分隔开if(e2.getText().toString().equals(str1[2])){e.putString("id",str1[0]);e.putString("name",str1[1]);e.putString("yu_e",str1[6]);e.commit();--当str不为空集,可能出现的情况1:则显示用户的id号码,名字,余额信息,并将信息以“,”分隔开Inteni=newIntent(login.this,ShoppingActivity.class);--切换到新的界面startActivity(i);--执行跳转到新界面的操作login.this.finish();--登录操作完成}else{Toast.makeText(login.this,"密码错误!",Toast.LENGTH_LONG).show();--当str不为空集,可能出现的情况2:弹出一个文本框,显示“密码错误”}}}else{Toast.makeText(login.this,"您是不是有点东西没填啊!",Toast.LENGTH_LONG).show();-98- --当str不为空集时,可能出现的情况3:弹出一个文本框显示“您是不是有点东西没填啊”即可能是用户名没填,或者登录密码没有填写}}});如果未注册则点击注册按钮先进行注册b2.setOnClickListener(newOnClickListener(){--设立一个注册按钮publicvoidonClick(Viewv){--点击“注册”按钮,并执行该按钮下的操作Intenti=newIntent(login.this,zhuce.class);--切换到注册界面startActivity(i);--执行跳转新界面的操作login.this.finish();--完成操作}});}这段程序是用来实现连接网络的功能;android系统固定模块程序privatevoidinternet(){StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath().build());}}4.2.2客户端注册功能内容同样是调用HttpClient这个类,连接到数据库,将输入的信息插入到后台数据库中,两次密码输入一致便可实现注册,如不一样,需重新输入。信息输入正确后实例化Intent对象,调用其方法,并跳转到登入界面。如图4-3所示:-98- 密码判断客户端将输入内容以字节流发送至客户端服务器输入注册信息truefalse客户端接收数据,做相应的跳转图4-3客户端注册流程图注册功能内容编码和部分解释packagecom.shopping;--这个类放在了com.shopping这个文件夹下面importandroid.app.Activity;--引入Activity这个类,因为之后会用到这个类中的一些方法importandroid.content.Intent;--引入Intent类,用于Android系统起步开机操作importandroid.os.Bundle;--引入Bundle这个类,Android使用Bundle进行数据传递分析importandroid.os.StrictMode;--规定android的模式importandroid.view.View;--android.view.view应该是android的封装类,引入后就可以用view中的方法了importandroid.view.View.OnClickListener;--引入onClickListener类,是一种处理的是点击事件的接口。importandroid.widget.Button;--引入widget.Button这个类,就可以使用该类中按钮的一些使用方法importandroid.widget.EditText;--引入widget.EditText这个类,即可以在下面程序中使用编辑文本框中的方法了importandroid.widget.RadioGroup;--调用可以给用户提供多选一机制的实现方法importandroid.widget.Toast;--引入widget.Toast这个类,作用是实现在界面上弹出一个悬浮提示框importcom.http.httpclient;--引入HttpClient这个类,HttpClient是ApacheJakartaCommon下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,Java应用程序需要直接通过HTTP协议来访问网络资源。publicclasszhuceextendsActivity{-98- privateButtonb1;--定义按钮b1privateEditTexte1;--定义一个编辑文本框e1privateEditTexte2;--定义一个编辑文本框e2privateEditTexte3;--定义一个编辑文本框e3privateEditTexte4;--定义一个编辑文本框e4privateRadioGroupr1;--定义一个多选一机制菜单r1privateStringsex;--定义性别参量@OverridepublicvoidonCreate(BundlesavedInstanceState){--这是Activity建立的时候一定会调用的onCreate()方法super.onCreate(savedInstanceState);--继承这个方法setContentView(R.layout.zhuce);--载入zhuce(注册页面)这个视图internet();--连接网络b1=(Button)findViewById(R.id.zhuce_button1);--从R文件下调出注册页面的button1按钮e1=(EditText)findViewById(R.id.zhuce_editText1);--从R文件调出注册页面的editText1编辑文本框1e2=(EditText)findViewById(R.id.zhuce_editText2);--从R文件调出注册页面的editText1编辑文本框1e3=(EditText)findViewById(R.id.zhuce_editText3);--从R文件调出注册页面的editText1编辑文本框1e4=(EditText)findViewById(R.id.zhuce_editText4);--从R文件调出注册页面的editText1编辑文本框1r1=(RadioGroup)findViewById(R.id.radioGroup1);--从R文件调出注册页面的radioGroup1多选一机制菜单r1设立一个注册按钮,点击该页面上的注册按钮后可进入页面填写注册信息------可能的结果:1、注册成功;2、注册失败原因:两次密码输入不一致;3、注册失败原因:您是不是有东西没填啊b1.setOnClickListener(newOnClickListener(){--设立一个可点击的注册按钮publicvoidonClick(Viewv){--点击这个“注册”按钮,并执行该按钮下的操作if(!e1.getText().toString().equals("")&&!e2.getText().toString().equals("")&&!e3.getText().toString().equals("")&&!e4.getText().toString().equals("")){-98- f(e2.getText().toString().equals(e3.getText().toString())){--点击注册按钮后,进入注册页面,填写该页面上需要填写的信息内容if(r1.getCheckedRadioButtonId()==R.id.radio0)sex="男";elsesex="女";--该页中有二选一按钮,性别可以选择“男”或者“女”其中一个选项httpclienthc=newhttpclient("l=2&sql=insert@into@user1(username,pwd,phone,power1,sex)@values('"+e1.getText().toString()+"','"+e2.getText().toString()+"','"+e4.getText().toString()+"',2,'"+sex+"');"--访问网络资源,将注册用户的名字,电话,性别等信息加入到数据库中Stringstr=hc.getshuju();--得到到数据并放到str中if(str.equals("1")){--如果str=1Toast.makeText(zhuce.this,"注册成功!",Toast.LENGTH_LONG).show();--注册操作成功并弹出文本框显示提示信息为“注册成功”Intenti=newIntent(zhuce.this,login.class);--切换到新的界面startActivity(i);--执行跳转新界面的操作zhuce.this.finish();--完成注册操作}}else{当str不等于1时会出现下面两种情况Toast.makeText(zhuce.this,"两次密码没填对!",Toast.LENGTH_LONG).show();--情况1:注册时需要填写两次密码,两次密码填写必须一致,如果不一致则弹出文本框显示提示信息为“两次密码没填对”}}else{Toast.makeText(zhuce.this,"您是不是有点东西没填啊!",Toast.LENGTH_LONG).show();--情况2:当注册信息有的项目没有填写时,则弹出文本框显示提示信息为“您是不是有点东西没填啊!”}}});}-98- 这段程序是用来实现连接网络的(android固定模块程序)privatevoidinternet(){StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath().build());}}4.2.3客户端商品和搜索功能内容会员用户在客户端选择具体商品显示商品详细信息选择数量,加入购物车,并购买图4-4客户端商品搜索流程图商品搜索的sql语句在ListInfo类中,调用这个类的方法,实例一个List>集合,将搜索出来的商品保存在这个集合中,实例SimpleAdapter对象,List集合中的商品,以列表的形式显示在页面中。1.商品搜索功能内容编码和部分解释packagecom.shopping;--这个类放在了com.shopping这个文件夹下面importjava.util.HashMap;--引入util.HashMap这个类,可以调用HashMap中的“链接”方法importjava.util.List;--引入util.List这个类,可以使用list进行批量数据序列操作importandroid.app.ListActivity;--引入ListActivity这个类,该类是绑定到一个数据源,用来显示这一串数据的importandroid.content.Intent;--引入Inrent类,用来实现Android系统起步开机操作importandroid.os.Bundle;--引入Bundle这个类,Android使用Bundle进行数据传递分-98- 析importandroid.view.View;--android.view.view应该是android的封装类,引入后就可以用view中的方法了importandroid.view.View.OnClickListener;--引入onClickListener类,是一种处理的是点击事件的接口。importandroid.widget.ArrayAdapter;--引入widget.ArrayAdapter,可以使用将数据放到一个数据以便使用的方法importandroid.widget.Button;--引入widget.Button这个类,就可以使用该类中按钮的一些使用方法importandroid.widget.EditText;--引入widget.EditText这个类,即可以在下面程序中使用编辑文本框中的方法了importandroid.widget.ListView;--引入widget.ListView这个类,该类的作用是可以实现以列表的形式展示具体内容,并且能够根据数据的长度自适应显示importandroid.widget.SimpleAdapter;--引入Simple.Adapter这个类,可以将静态数据映射到XML文件中定义好的视图importandroid.widget.Spinner;--引入Spinner类,用来实现Spinner就是下拉菜单的操作importandroid.widget.TextView;--引入TextView类,该类具有用来显文本框的作用importandroid.widget.Toast;--引入widget.Toast这个类,作用是实现在界面上弹出一个悬浮提示框importcom.adapter.ImageSimpleAdapter;--引入ImageSimpleAdapter类,可以实现将静态图片数据映射到XML文件中定义好的视图importcom.list.listinfo;--引入listinfo类,之后会用到该类中的一些方法publicclasssousuoextendsListActivity{privatestaticfinalString[]m={"服装","包包","电视","运动鞋","手机"};--定义5个字符串分别是:“服装”、“包包”、“电视”、“运动鞋”、“手机”privateEditTexte1;--定义一个编辑文本框e1privateButtonb1;--定义一个按钮b1privateSpinnerspinner;--定义一个下拉菜单privateArrayAdapteradapter;--定义一个数据和视图之间的桥梁,数据在adapter中做处理,然后显示到视图上面@Override-98- 从R.java文件中调出sousuo页面所需要的文本框TextView:1、name名字;2、miaoshu描述;3、shuliang数量;4、lujing路径;5、jiage价格;6、id;7:biaoming表明protectedvoidonListItemClick(ListViewl,Viewv,intposition,longid){--是ListView对应的响应事件,一共有四个参数:ListView就是用户单击项所在的列表;View就是我们单击项的视图;Position单击在列表的位置;Id单击项的idTextViewt1=(TextView)v.findViewById(R.id.text1);--从R文件中调出文本框t1TextViewt2=(TextView)v.findViewById(R.id.yin_miaoshu);--从R文件中调出描述商品的文本框t2TextViewt3=(TextView)v.findViewById(R.id.yin_shuliang);--从R文件中调出显示商品数量的文本框t3TextViewt6=(TextView)v.findViewById(R.id.yin_id);--从R文件中调出显示商品id的文本框t6TextViewt7=(TextView)v.findViewById(R.id.yin_biaoming);--从R文件中调出显示表明信息的文本框t7TextViewt4=(TextView)v.findViewById(R.id.yin_lujing);--从R文件中调出显示商品路径信息的文本框t4TextViewt5=(TextView)v.findViewById(R.id.text3);--从R文件中调出文本框t5Intenti=newIntent(sousuo.this,shangpin.class);--切换到搜索后的新界面i.putExtra("name",t1.getText());--文本框t1中显示搜索到的商品的名字i.putExtra("miaoshu",t2.getText());--文本框t2显示搜索的商品的描述信息i.putExtra("shuliang",t3.getText());--文本框t3显示搜索到的商品的库存数量i.putExtra("lujing",t4.getText().toString().substring(8));--文本框t4,显示搜索到的商品的路径信息i.putExtra("jiage",t5.getText());--文本框t5显示搜索的商品的价格信息i.putExtra("id",t6.getText());--文本框t6显示搜索到的商品的idi.putExtra("biaoming",t7.getText());--文本框t7显示搜索到的商品的表明信息startActivity(i);--执行跳转新界面的操作}从R.java文件中调出sousuo页面所需的EditText编辑文本框(可输入搜索信息的文本框),搜索button按钮。并按照R.layout中对sousuo页面的布局方式进行布局@Override-98- protectedvoidonCreate(BundlesavedInstanceState){--这是Activity建立的时候一定会调用的onCreate()方法//TODOAuto-generatedmethodstub--自动生成该语句super.onCreate(savedInstanceState);--继承这个方法setContentView(R.layout.sousuo);--载入登录页面这个视图e1=(EditText)findViewById(R.id.sousuo_editText1);--调出R文件下搜索页面所需的编辑文本框e1b1=(Button)findViewById(R.id.sousuo_button1);--调出R文件下搜索页面所需的按钮b1搜索:1、包包;2、服装;3、电视;4、运动鞋;5、手机的搜索程序------搜索结果:1、没有找到该商品;2、找到该商品并且按照预先设定好的布局方式将商品信息显示在页面中b1.setOnClickListener(newOnClickListener(){--设立一个“搜索”按钮publicvoidonClick(Viewv){--点击“搜索”按钮,并执行该按钮下的操作Strings=spinner.getSelectedItem().toString();--返回一个字符串Strings1=null;--定义s1为空集if(s.equals("包包"))--当s等于“包包”时s1="baobao";--s1的集合即为“包包”类所有商品elseif(s.equals("服装"))--如果s等于“服装”时s1="fuzhuang";--s1的集合即为“服装”类所有的商品elseif(s.equals("电视"))--如果s等于“电视”s1="dianshi";--s1的集合即为“电视”类所有的商品elseif(s.equals("运动鞋"))--如果s等于“运动鞋”s1="xiezi";--s1的集合即为“鞋子”类所有的商品elseif(s.equals("手机"))--如果s等于“手机”s1="shouji";--s1的集合即为“手机”类所有的商品Strings2=e1.getText().toString();listinfol=newlistinfo(s1,s2);List>list=l.list1();--在编辑文本框e1中输入要搜索的商品名称if(list==null){--如果列表list等于空集toast("没有找到和["+s2+"]相关的商品");-98- --则弹出文本框显示信息为“没有找到和搜索内容相关的商品”}else{SimpleAdaptersa=newImageSimpleAdapter(sousuo.this,list,R.layout.show_list_item,newString[]{--如果list不等于空集则找到与搜索内容相关的商品,布置搜索到的商品展示页面"product_item_image","text1","text2","text3","list_idex","yin_miaoshu",yin_shuliang","yin_lujing"},newint[]{--文本框1显示的是商品的描述信息,文本框2显示的是商品的数量信息,文本框3显示的是商品的路径信息R.id.product_item_image,R.id.text1,R.id.text2,R.id.text3,R.id.list_idex,R.id.yin_miaoshu,R.id.yin_shuliang,R.id.yin_lujing});setListAdapter(sa);--设立文本框1、文本框2即文本框3在搜索页面上的视图方式}}});spinner=(Spinner)findViewById(R.id.sousuo_spinner1);--从R文件中调出搜索页面所用的下拉菜单1adapte=newArrayAdapter(this,ndroid.R.layout.simple_spinner_item,m);--设置该下拉菜单的视图方式adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);--调用setDropDownViewResourc中的方法,以XML的方式定义下拉菜单要显示的模样spinner.setAdapter(adapter);--将adapter添加到下拉菜单spinner中去}publicvoidtoast(Stringstr){Toast.makeText(sousuo.this,str,Toast.LENGTH_SHORT).show();--显示提示信息文本框}}2.数据库文件中商品信息编码和部分解释-98- 下面这段代码主要是设置数据库文件中商品素材信息packagecom.SQL;--这个类放在了com.SQL这个文件夹下面publicclassshangpinBean{publicStringgetKucun(){returnkucun;--这里是定义了一个string变量Kucun名字,并为该变量提供了获取方式。这样的定义方式使得其他的地方只能获取Kucun的值而不能再设置Kucun的值}publicvoidsetKucun(Stringkucun){this.kucun=kucun;--setKucun就是给Kucun设置一个值,也就是通过外部调用该方法给商品的对象中的Kucun赋值,所以外部方法肯定需要传入一个String作为参数。而this.kucun=kucun;便是赋值的部分,赋值之后不需要有返回值。}publicstaticfinalStringID="_id";--定义一个字符串常量IDpublicstaticfinalStringNAME="name";--定义一个字符串常NAMEpublicstaticfinalStringSHULIANG="shuliang";--定义一个字符串常量SHULIANGpublicstaticfinalStringJIAGE="jiage";--定义一个字符串常量JIAGEpublicstaticfinalStringKUCUN="kucun";--定义一个字符串常量KUCUNpublicstaticfinalStringSHANGID="shangid";--定义一个字符串常量SHANGIDpublicstaticfinalStringBIAOMING="biaoming";--定义一个字符串常量BIAOMINGprivateStringid;--定义一个字符串参量---idprivateStringname;--定义一个字符串参量---名字privateStringshuliang;--定义一个字符串参量---数量privateStringjiage;--定义一个字符串参量---价格privateStringkucun;--定义一个字符串参量库存publicStringgetId(){returnid;--这里是定义了一个string变量id,并为该变量提供了获取方式。这样的定义方式使得其他的地方只能获取id的值而不能再设置id的值}publicvoidsetId(Stringid){this.id=id;-98- --setId就是给id设置一个值,也就是通过外部调用该方法给商品的对象中的id号码赋值,所以外部方法肯定需要传入一个String作为参数。而this.id=id;便是赋值的部分,赋值之后不需要有返回值。}publicStringgetName(){returnname;--这里是定义了一个string变量Name名字,并为该变量提供了获取方式。这样的定义方式使得其他的地方只能获取Name的值而不能再设置Nane的值}publicvoidsetName(Stringname){this.name=name;}--setName就是给name设置一个值,也就是通过外部调用该方法给商品的对象中的name赋值,所以外部方法肯定需要传入一个String作为参数。而this.name=name;便是赋值的部分,赋值之后不需要有返回值。publicStringgetShuliang(){returnshuliang;--这里是定义了一个string变量Shuangliang数量,并为该变量提供了获取方式。这样的定义方式使得其他的地方只能获取数量的值而不能再设置数量的值}publicvoidsetShuliang(Stringshuliang){this.shuliang=shuliang;--setShuliang就是给shuliang设置一个值,也就是通过外部调用该方法给商品的对象中的shuliang赋值,所以外部方法肯定需要传入一个String作为参数。而this.shuliang=shuliang;便是赋值的部分,赋值之后不需要有返回值。}publicStringgetJiage(){returnjiage;--这里是定义了一个string变量Jiage价格,并为该变量提供了获取方式。这样的定义方式使得其他的地方只能获取价格的值而不能再设置价格的值}publicvoidsetJiage(Stringjiage){this.jiage=jiage;-98- --setJiage就是给jiage设置一个值,也就是通过外部调用该方法给商品的对象中的jiage赋值,所以外部方法肯定需要传入一个String作为参数。而this.jiage=jiage;便是赋值的部分,赋值之后不需要有返回值。}}3.设置4个menu菜单按钮和服装;电视;手机;包包;鞋子这五个图片按钮编码和部分解释packagecom.shopping;--这个类放在了com.shopping这个文件夹下面importandroid.app.Activity;--引入Activity这个类,因为之后会用到这个类中的一些方法importandroid.app.AlertDialog;--引入AlertDialog这个类,可以引用该类中对话框的方法importandroid.content.DialogInterface;--引入DialogInterface这个类,可以引用该类中加入对话框的操作方法importandroid.content.Intent;--引入Intent类,用来进行Android系统起步开机操作importandroid.os.Bundle;--Android使用Bundle进行数据传递分析importandroid.os.StrictMode;--规定android的模式importandroid.view.Menu;--引入Menu类,作用是会用到该类中动态菜单的操作方法importandroid.view.MenuItem;--引入MenuItem类,一个在Menu控件中显示的菜单项的方法importandroid.view.View;--android.view.view应该是android的封装类,引入后就可以用view中的方法了importandroid.view.View.OnClickListener;--引入onClickListener类,是一种处理的是点击事件的接口。importandroid.widget.ImageButton;--引入widget.ImageButton这个类,就可以使用该类中图片按钮的一些使用方法importandroid.widget.Toast;--引入widget.Toast这个类,作用是实现在界面上弹出一个悬浮提示框importcom.list.listinfo;--引入listinfo类,之后会用到该类中的一些方法publicclassShoppingActivityextendsActivity{退出商城的程序:出现一个对话框:1、点击确定按钮即可退出商城-98- 2、点击取消按钮即继续购物@Overridepublicvoidfinish(){AlertDialog.Builderdialog02=newAlertDialog.Builder(ShoppingActivity.this);--创建一个对话框dialog02.setTitle("提示");--建立对话框标题显示“提示”dialog02.setIcon(R.drawable.ic_launcher);--为这个对话框设置图标,图标从R文件中调用dialog02.setMessage("确定要退出网上商城?");--对话框中的内容显示为“确定要退出网上商城?”的语句dialog02.setPositiveButton("确定",newDialogInterface.OnClickListener(){--设立一个“确定”按钮publicvoidonClick(DialogInterfacedialoginterface,intwhich){--点击该“确定”按钮,并执行该按钮下的操作finish1();--完成该操作}});dialog02.setNegativeButton("取消",newDialogInterface.OnClickListener(){--设立一个“取消”按钮publicvoidonClick(DialogInterfacedialoginterface,intwhich){--点击“取消”按钮,并执行该按钮下的操作return;}});dialog02.create().show();--显示这个对话框}一、设置4个menu菜单按钮1、UPDATE购物车;2、ABOUT关于;3、GEREN个人;4、EXIT退出四个按钮;二、并从R.java文件下调出:1、服装;2、电视;3、手机;4、包包;5、鞋子这五个图片按钮三、并按照R.layout中对于main页面即主页面的布局进行布局-98- privatestaticfinalintUPDATE=1;--定义UPDATE的值为1privatestaticfinalintABOUT=2;--定义ABOUT的值为2privatestaticfinalintGEREN=3;--定义GEREN的值为3privatestaticfinalintEXIT=4;--定义EXIT等于的值为4privateImageButtonImageButton1;--定义一个图片按钮1privateImageButtonImageButton2;--定义一个图片按钮2privateImageButtonImageButton3;--定义一个图片按钮3privateImageButtonImageButton4;--定义一个图片按钮4privateImageButtonImageButton5;--定义一个图片按钮5publicvoidonCreate(BundlesavedInstanceState){--这是Activity建立的时候一定会调用的onCreate()方法super.onCreate(savedInstanceState);--继承该方法setContentView(R.layout.main);--载入购物商城的主页面这个视图//internet();//4.0兼容//获得控件ImageButton1=(ImageButton)findViewById(R.id.imageButton1);--从R文件中调出图片按钮1ImageButton2=(ImageButton)findViewById(R.id.imageButton2);--从R文件中调出图片按钮2ImageButton3=(ImageButton)findViewById(R.id.imageButton3);--从R文件中调出图片按钮3ImageButton4=(ImageButton)findViewById(R.id.imageButton4);--从R文件中调出图片按钮4ImageButton5=(ImageButton)findViewById(R.id.imageButton5);--从R文件中调出图片按钮5//绑定控件的监听器ImageButton1.setOnClickListener(newibocl1());--设置图片按钮1ImageButton2.setOnClickListener(newibocl2());--设置图片按钮2ImageButton3.setOnClickListener(newibocl3());--设置图片按钮3ImageButton4.setOnClickListener(newibocl4());--设置图片按钮4ImageButton5.setOnClickListener(newibocl5());--设置图片按钮5}-98- publicbooleanonCreateOptionsMenu(Menumenu){--初始化选项菜单的操作//设置menu按钮menu.add(0,UPDATE,1,R.string.gouwu);--设置购物菜单按钮menu.add(0,GEREN,2,R.string.geren);--设置个人菜单按钮menu.add(1,ABOUT,3,R.string.about);--设置关于菜单按钮menu.add(1,EXIT,4,R.string.exit);--设置退出菜单按钮returnsuper.onCreateOptionsMenu(menu);}--创建Menu菜单的项目publicbooleanonOptionsItemSelected(MenuItemitem){--处理菜单被选择运行后的事件处理操作//点击购物按钮if(item.getItemId()==UPDATE){--如果点击的是购物按钮Intenti=newIntent(ShoppingActivity.this,car.class);--切换到购物按钮下新的界面startActivity(i);--执行调转到新界面的操作}//点击关于按钮elseif(item.getItemId()==ABOUT){--点击“关于”按钮,并执行该按钮下的操作}//点击个人按钮elseif(item.getItemId()==GEREN){--点击“个人”按钮,并执行该按钮下的操作Intenti=newIntent(ShoppingActivity.this,geren.class);--切换到个人按钮下的界面startActivity(i);--执行跳转新界面的操作}//点击退出按钮elseif(item.getItemId()==EXIT){--点击“退出”按钮this.finish();--完成购物操作}returnsuper.onOptionsItemSelected(item);--返回menu菜单页面}//服装classibocl1implementsOnClickListener{--点击手机商城主页面上服装图片按钮publicvoidonClick(Viewv){--点击“服装”的图片按钮,并执行该按钮下的操作-98- listinfol=newlistinfo("fuzhuang");l.list1();--以列表形式显示服装类商品信息Intenti=newIntent(ShoppingActivity.this,show.class);--跳转到点击服装按钮之后的新界面i.putExtra("show","fuzhuang");--显示所有服装类商品startActivityForResult(i,0);--回传服装类商品的数据}}//电视classibocl2implementsOnClickListener{--点击手机购物商城主页面上的电视图片按钮publicvoidonClick(Viewv){--点击“电视”的图片按钮,并执行该按钮下的操作Intenti=newIntent(ShoppingActivity.this,show.class);--跳转到点击电视图片按钮之后的新界面i.putExtra("show","dianshi");--显示所有电视类商品startActivityForResult(i,0);--回传所有电视类商品的数据}}//手机classibocl3implementsOnClickListener{--点击手机购物商城主页面上的手机图片按钮publicvoidonClick(Viewv){--点击“手机”图片按钮,并执行该按钮下的操作Intenti=newIntent(ShoppingActivity.this,show.class);--跳转到点击手机图片按钮之后的新界面i.putExtra("show","shouji");--显示所有手机类商品startActivityForResult(i,0);--回传所有手机类商品的数据}}//包包classibocl4implementsOnClickListener{--点击手机购物商城主页面上的包包图片按钮publicvoidonClick(Viewv){-98- --点击“包包”图片按钮,并执行该按钮下的操作Intenti=newIntent(ShoppingActivity.this,show.class);--跳转到点击包包图片按钮之后的新界面i.putExtra("show","baobao");--显示所有包包类商品startActivityForResult(i,0);--回传所有包包类商品的数据}}//鞋子classibocl5implementsOnClickListener{--点击手机购物商城主页面上的鞋子图片按钮publicvoidonClick(Viewv){--点击“鞋子”图片按钮,并执行该按钮下的操作Intenti=newIntent(ShoppingActivity.this,show.class);--跳转到点击鞋子图片按钮之后的新界面i.putExtra("show","xiezi");--显示所有鞋子类商品startActivityForResult(i,0);--回传所有鞋子类商品的数据}}privatevoidfinish1(){super.finish();--完成上述操作}}4.展示所需商品信息的编码和部分解释packagecom.shopping;--这个类放在了com.shopping这个文件夹下面importjava.util.HashMap;--引入util.HashMap这个类,可以调用HashMap中的“链接”方法importjava.util.List;--引入List类,可以在下面程序中进行使用list进行批量数据序列操作importandroid.app.ListActivity;--ListActivity是一个绑定到一个数据源,并且用来显示这一串数据的Activityimportandroid.content.Intent;--引入Intent类,引入Android系统起步开机的操作方法importandroid.os.Bundle;--Android使用Bundle进行数据传递分析-98- importandroid.view.View;--android.view.view应该是android的封装类,引入后就可以用view中的方法了importandroid.widget.ListView;--引入widget.ListView这个类,该类的作用是可以实现以列表的形式展示具体内容,并且能够根据数据的长度自适应显示importandroid.widget.SimpleAdapter;--引入Simple.Adapter这个类,可以将静态数据映射到XML文件中定义好的视图importandroid.widget.TextView;--引入TextView类,该类具有用来显文本框的作用importcom.adapter.ImageSimpleAdapter;--引入ImageSimpleAdapter类,可以实现将静态图片数据映射到XML文件中定义好的视图importcom.list.listinfo;--引入listinfo类,之后会用到该类中的一些方法publicclassshowextendsListActivity{@Override这段代码是从R.java文件中调出所需的文本框TextView:1、name名字;2、miaoshu描述;3、shuliang数量;4、lujing路径;5、jiage价格;6、id;7、biaoming表明protectedvoidonListItemClick(ListViewl,Viewv,intposition,longid){--是ListView对应的响应事件,一共有四个参数:ListView就是用户单击项所在的列表;View就是我们单击项的视图;Position单击在列表的位置;Id单击项的idTextViewt1=(TextView)v.findViewById(R.id.text1);--从R文件中调出文本框t1TextViewt2=(TextView)v.findViewById(R.id.yin_miaoshu);--从R文件中调出描述商品信息的文本框t2TextViewt3=(TextView)v.findViewById(R.id.yin_shuliang);--从R文件中调出显示商品数量信息的文本框t3TextViewt6=(TextView)v.findViewById(R.id.yin_id);--从R文件中调出显示商品id信息的文本框t6TextViewt7=(TextView)v.findViewById(R.id.yin_biaoming);--从R文件中调出表明商品信息的文本框t7TextViewt4=(TextView)v.findViewById(R.id.yin_lujing);--从R文件中调出显示商品路径信息的文本框t4TextViewt5=(TextView)v.findViewById(R.id.text3);-98- --从R中调出text3文本框t5Intenti=newIntent(show.this,shangpin.class);切换到显示商品信息的新界面i.putExtra("name",t1.getText());--显示商品名称i.putExtra("miaoshu",t2.getText());--显示商品的描述信息i.putExtra("shuliang",t3.getText());--显示商品的数量信息i.putExtra("lujing",t4.getText().toString().substring(8));--显示商品的路径信息i.putExtra("jiage",t5.getText());--显示商品的价格信息i.putExtra("id",t6.getText());--显示商品的id号码i.putExtra("biaoming",t7.getText());--显示商品的表明信息startActivity(i);--执行跳转新界面的操作}/**Calledwhentheactivityisfirstcreated.*/这段代码是设置展示所需商品信息的方式,即show商品的方式@OverridepublicvoidonCreate(BundlesavedInstanceState){--这是Activity建立的时候一定会调用的onCreate()方法super.onCreate(savedInstanceState);--继承该类方法setContentView(R.layout.show);--载入购物展示页面的视图Intenti=getIntent();--是将检索出来的intent赋值给一个Intent类型的变量iListinfol=newlistinfo(i.getStringExtra("show"));List>list=l.list1();--以列表的形式显示商品的信息SimpleAdaptersa=newImageSimpleAdapter(this,list,R.layout.show_list_item,--设置需要展示的商品信息的布局方式newString[]{"product_item_image","text1","text2","text3","list_idex","yin_miaoshu","yin_shuliang","yin_lujing","yin_id","yin_biaoming"},newint[]{R.id.product_item_image,R.id.text1,R.id.text2,R.id.text3,R.id.list_idex,R.id.yin_miaoshu,R.id.yin_shuliang,R.id.yin_lujing,R.id.yin_id,R.id.yin_biaoming});-98- setListAdapter(sa);--设置show页面上文本框,图片的视图方式}4.2.4客户端购物车功能内容在搜索的商品添加一个监听器,实现onListItemClick方法,在点击商品,实例Intent对象,将画面跳转到购物车的画面,同理用onListItemClick方法,实现商品的购买功能的实现。如图4-5所示:客户端本地请求,读取本地文件,造型为对象点击购物车Tab将列表中元素在客户端显示点击结算,将数据写成字节流,发送至服务器服务器读取数据,写入数据库图4-5客户端购物车流程图1.将所选商品加入购物车功能编码和部分解释packagecom.shopping;--这个类放在了com.shopping这个文件夹下面importandroid.app.Activity;--引入Activity这个类,因为之后会用到这个类中的一些方法importandroid.app.AlertDialog;--引入AlertDialog这个类,可以引用该类中对话框的方法importandroid.content.DialogInterface;--引入DialogInterface这个类,可以引用该类中加入对话框的操作方法importandroid.content.Intent;--Android系统起步开机importandroid.graphics.Bitmap;--引入Bitmap类,可以调用该类中对图片排序的方法importandroid.graphics.BitmapFactory;--引入BitmapFactory类,可以调用该类中设置图片大小的方法importandroid.os.Bundle;--Android使用Bundle进行数据传递分析importandroid.os.Environment;--引入这个类,设置java运行环境importandroid.util.Log;--引入Log这个类,-98- 能够查看你想要知道的一些参数数据,而且可以帮找到程序的运行出错的位置importandroid.view.View;--android.view.view应该是android的封装类,引入后就可以用view中的方法了importandroid.view.View.OnClickListener;--引入onClickListener类,是一种处理的是点击事件的接口。importandroid.widget.Button;--引入widget.Button这个类,就可以使用该类中按钮的一些使用方法importandroid.widget.EditText;--引入widget.EditText这个类,即可以在下面程序中使用编辑文本框中的方法了importandroid.widget.ImageView;--引入widget.ImageView这个类,即可以在下面程序中使用图片信息的方法了importandroid.widget.LinearLayout;--引入LinearLayout类,该类是线性布局控件,它包含的子控件将以横向或竖向的方式排列importandroid.widget.RatingBar;--引入RatingBar,用星形来显示等级评定的方法importandroid.widget.TextView;--引入TextView类,该类具有用来显文本框的作用importandroid.widget.Toast;--引入widget.Toast这个类,作用是实现在界面上弹出一个悬浮提示框importcom.SQL.sql;--这个类放在了com..SQL这个文件夹下面publicclassshangpinextendsActivity{privateButtonbutton2;--定义一个按钮button2TextViewtextview3;//库存--定义一个文本框3显示商品库存数量TextViewtextview1;//描述--定义一个文本框1显示描述商品的信息TextViewtextview9;//价格--定义一个文本框9.显示商品的价格信息EditTexteditText1;//购买数量--定义一个编辑文本框,用来输入购买商品的数量ImageViewiv;--定义一个图片ivLinearLayoutll;--定义一个布局方式llRatingBarrb;--定义一个显示用户等级的方法llIntentin;--定义一个能够映射和传递给能够处理特定任务的组件in-98- @Override从R.java文件中调出商品页面所需的文本框textview:1、数量;2、描述;3、价格和编辑文本框editText,一个加入购物车的按钮button。并按照R.layout设定好的shangpin页面的布局方式进行布局publicvoidonCreate(BundlesavedInstanceState){--这是Activity建立的时候一定会调用的onCreate()方法super.onCreate(savedInstanceState);--继承该类方法setContentView(R.layout.shangpin);--载入购物商品页面的视图textview3=(TextView)findViewById(R.id.textView3);--从R文件中调出文本框3textview1=(TextView)findViewById(R.id.textView1);--从R中调出文本框1textview9=(TextView)findViewById(R.id.textView9);--从R中调出文本框9editText1=(EditText)findViewById(R.id.shangpin_editText1);--从R中调出编辑文本框1in=getIntent();--是将检索出来的intent赋值给一个Intent类型的变量intextview3.setText(in.getStringExtra("shuliang"));--设置文本框以显示商品数量信息textview1.setText(in.getStringExtra("miaoshu"));--设置文本框1显示商品的描述信息textview9.setText(in.getStringExtra("jiage"));--设置文本框9显示商品的价格信息ll=(LinearLayout)findViewById(R.id.ll1);--从R文件中调出该页面的布局方式ll.setOnClickListener(newOnClickListener(){--添加一个OnClickListener接口的匿名实例/对象11publicvoidonClick(Viewv){--当点击事件发生时会调用这个onclick方法System.out.println("haha");--显示所有haha商品的信息}});将所选商品加入购物车:1、如果购买数量大于库存-------则显示“库存量不够啊”;2、如果购买数量小于库存-------则成功加入购物车------之后会出现一个对话框可选择:1、去购物车;2、再逛逛button2=(Button)findViewById(R.id.button2);--从R文件中调出按钮2-98- button2.setOnClickListener(newOnClickListener(){--设立一个“加入购物车”按钮publicvoidonClick(Viewv){--点击加入购物车的这个按钮,并执行该按钮下的操作inta=(int)Double.parseDouble(textview3.getText().toString());--将数据类型转换成整数型,a代表库存量intb=(int)Double.parseDouble(editText1.getText().toString());--将数据类型转换成整数型,b代表购买数量if(ab){Toast.makeText(car.this,"库存量不够啊!亲!",Toast.LENGTH_LONG).show();}--当购买商品的数量>商品的库存数量,则弹出提示信息显示“库存量不够啊!亲!”Stringd=Integer.parseInt(str1)*Integer.parseInt(jiage.getText().toString())+"";--将购买数量转换成整数型放入d中dialog1(name.getText().toString(),str1,d,kucun.getText().toString(),t.getText().toString());}else{Toast.makeText(car.this,"请输入数量!",Toast.LENGTH_LONG).show();--当购买商品的数量<商品的库存数量时,弹出提示框显示信息为“请输入数量”}}});dialog07.setNegativeButton("取消",newDialogInterface.OnClickListener()--对话框中设置一个“取消”按钮{publicvoidonClick(DialogInterfacedialog,intwhichButton){--点击这个“取消”按钮,并执行这个按钮的操作}});dialog07.create().show();--显示对话框}-98- 这段代码是执行删除购物车中商品的操作else{TextViewt=(TextView)v1.findViewById(R.id.car_list_item_id);--从R文件中调出购物车所需的文本框tsqlsql3=newsql(car.this,"shangpin");--购物车中购买商品的信息放到sql3中SQLiteDatabasedb=sql3.getdb();db.delete("shangpin",shangpinBean.ID+"="+t.getText().toString(),null);--删除购物车中所选的商品SimpleAdaptersa=list1();setListAdapter(sa);--更新购物车页面中列表的元素zong();}}});dialog06.create().show();--显示对话框}/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){--这是Activity建立的时候一定会调用的onCreate()方法super.onCreate(savedInstanceState);--继承该方法setContentView(R.layout.car);--载入购物车页面的视图zong();SimpleAdaptersa=list1();setListAdapter(sa);--更新购物车页面中列表的元素button1=(Button)findViewById(R.id.car_button1);--从R文件中购物车页面所需的按钮1button1.setOnClickListener(newOnClickListener(){--设立这个“结算”按钮publicvoidonClick(Viewv){--点击“结算”按钮,并执行该按钮下的操作Intenti=newIntent(car.this,jiesuan.class);--从购物车页面切换到结算页面-98- i.putExtra("qian",car_textView2.getText().toString());--在文本框2中显示所需要交付的亲属startActivity(i);--开始执行切换界面的操作}});button2=(Button)findViewById(R.id.car_button2);--从R文件中调出购物车页面所需的按钮2button2.setOnClickListener(newOnClickListener(){--设立“清空”按钮publicvoidonClick(Viewv){--点击“清空”按钮,并执行该按钮下的操作Log.d("Jersey","清空");--蓝色显示“清空”内容sqlsql3=newsql(car.this,"shangpin");--将购物车中商品信息放入sql3中Cursorc=sql3.select("");--将随机选出的数放入c中SQLiteDatabasedb=sql3.getdb();c.moveToFirst();--将c数值定位到第一行while(!c.isAfterLast()&&(c.getString(1)!=null)){db.delete("shangpin",shangpinBean.ID+"="+c.getString(0),null);--删除购物车中的商品c.moveToNext();--c的数值定位到下一行}SimpleAdaptersa=list1();setListAdapter(sa);--购物车中的信息是以列表形式展示的,更新购物车页面的列表zong();}});}privateImageSimpleAdapterlist1(){--列表中显示图片sqlsql1=newsql(this,"shangpin");--将购物车中商品信息放到sql1中List>list=newArrayList>();Cursorc=sql1.select("");--将sql1中菜单的值放到c中-98- c.moveToFirst();--c值定位到第一行while(!c.isAfterLast()&&(c.getString(1)!=null)){HashMapmap=newHashMap();map.put("car_list_item_id",c.getString(0));--购物车页面中首行显示id信息map.put("car_list_item_shangid",c.getString(1));--购物车页面中第一行显示商品id信息map.put("car_list_item_biaoming",c.getString(2));--购物车页面中第二行的商品表明信息内容map.put("car_list_item_textView1",c.getString(3));--购物车页面第三行显示文本框1中商品名字map.put("car_list_item_textView2",c.getString(4));--购物车页面第四行显示文本框2中商品价格map.put("car_list_item_textView3",c.getString(5));--购物车页面第五行显示文本框3中购买商品数量map.put("car_list_item_kucun",c.getString(6));--购物车页面第六行显示商品库存数量list.add(map);c.moveToNext();--c值定位到下一行}ImageSimpleAdaptersa1=newImageSimpleAdapter(this,list,R.layout.car_list_item,newString[]{"car_list_item_textView1","car_list_item_textView2","car_list_item_textView3","car_list_item_kucun","car_list_item_id","car_list_item_shangid","car_list_item_biaoming"},newint[]{R.id.car_list_item_textView1,R.id.car_list_item_textView2,R.id.car_list_item_textView3,R.id.car_list_item_kucun,R.id.car_list_item_id,R.id.car_list_item_shangid,R.id.car_list_item_shangid});returnsa1;--该段程序是用来安排购物车页面中所有图片、文本框等在该页面的布局与视图方式}显示购物车页面上所需的图片及文本框并按在R.java文件中预先设定好的布局方式布局购物车页面privatevoiddialog1(Stringname,Stringshuliang,Stringjiage,Stringkucun,Stringid){-98- sqlsql2=newsql(this,"shangpin");--将商品信息放到sql2中sql2.update(name,shuliang,jiage,kucun,id);--修改sql2中商品的信息,包括商品的名称,商品的数量,商品的价格,商品的库存量以及商品的id号SimpleAdaptersa=list1();setListAdapter(sa);--修改完成后,更新购物车页面的列表内容zong();}privatevoidzong(){sqlsql1=newsql(this,"shangpin");--将商品信息存放到sql1中intq=0;--初始化q值Cursorc=sql1.select("");c.moveToFirst();--将c值定位到第一行while(!c.isAfterLast()&&(c.getString(1)!=null)){q+=Integer.parseInt(c.getString(5));--转换商品数量信息的数据类型,q值即为购物商品的数量值c.moveToNext();--c值定位到下一行}car_textView2=(TextView)findViewById(R.id.car_textView2);--从R文件中调出购物车页面所需的文本框2car_textView2.setText(q+"");--购物车页面中文本框2显示修改后的商品购买数量}}4.2.5客户端订单功能内容连接到后台数据库,将填写的订单信息插入到数据库中,通过后台来实现对订单的管理,管理员在发货后,数据库中将订单状态更改为已发,前台页面中,返回数据库中订单状态。如图4-6所示:将订单请求发送至客户端服务器点击订单Tab服务器响应请求,将搜索结果列表造型,发送信息至客户端将列表中元素在客户端显示-98- 图4-6客户端订单流程图订单结算编码和部分解释packagecom.shopping;--这个类放在了com.shopping这个文件夹下面importandroid.app.Activity;--引入Activity这个类,因为之后会用到这个类中的一些方法importandroid.content.Intent;--Android系统起步开机importandroid.content.SharedPreferences;--SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,importandroid.database.Cursor;--引入Cursor类,作用就是用于临时存储从数据库中提取的数据块importandroid.database.sqlite.SQLiteDatabase;--引入SQLiteDatabase类,用来引用数据库的操作方法importandroid.os.Bundle;--引入Bundle这个类,Android使用Bundle进行数据传递分析importandroid.preference.PreferenceManager;--引入PreferenceManager类,用来保存简单的数据类型importandroid.util.Log;--引入Log这个类,能够查看你想要知道的一些参数数据,而且可以帮找到程序的运行出错的位置importandroid.view.View;--android.view.view应该是android的封装类,引入后就可以用view中的方法了importandroid.view.View.OnClickListener;--引入onClickListener类,是一种处理的是点击事件的接口。importandroid.widget.Button;--引入widget.Button这个类,就可以使用该类中按钮的一些使用方法importandroid.widget.EditText;--引入widget.EditText这个类,即可以在下面程序中使用编辑文本框中的方法了importandroid.widget.TextView;--引入TextView类,该类具有用来显文本框的作用importandroid.widget.Toast;--引入widget.Toast这个类,作用是实现在界面上弹出一个悬浮提示框importcom.SQL.shangpinBean;--引入shangpinBean类,用于引用商品素材importcom.SQL.sql;--引入sql类,用于引用数据库操作方法-98- importcom.http.httpclient;--引入HttpClient这个类,HttpClient是ApacheJakartaCommon下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,Java应用程序需要直接通过HTTP协议来访问网络资源。publicclassjiesuanextendsActivity{结算privateTextViewt1;--定义一个结算页面的文本框t1privateTextViewt2;--定义一个结算页面的文本框t1privateTextViewt8;--定义一个结算页面的文本框t8privateEditTexte1;--定义一个结算页面的编辑文本框e1privateEditTexte2;--定义一个结算页面的编辑文本框e2privateEditTexte3;--定义一个结算页面的编辑文本框e3privateButtonb1;--定义一个结算页面所需的按钮b1privateButtonb2;--定义一个结算页面所需的按钮b2SharedPreferencessp;--定义一个数据存储方式Intenti;--定义一个专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦调出结算页面所需要所需要的图标、文本框textview、可编辑的文本框edittext、结算按钮buttonpublicvoidonCreate(BundlesavedInstanceState){--这是Activity建立的时候一定会调用的onCreate()方法super.onCreate(savedInstanceState);--继承该类方法setContentView(R.layout.jiesuan);--载入结算页面视图sp=PreferenceManager.getDefaultSharedPreferences(this);t1=(TextView)findViewById(R.id.jiesuan_textView1);--从R文件中调出结算页面所需的文本框t1t2=(TextView)findViewById(R.id.jiesuan_textView2);--从R文件中调出结算页面所需的文本框t2t8=(TextView)findViewById(R.id.jiesuan_textView8);--从R文件中调出结算页面所需的文本框t8e1=(EditText)findViewById(R.id.jiesuan_editText1);--从R文件中调出结算页面所需的编辑文本框e1-98- e2=(EditText)findViewById(R.id.jiesuan_editText2);--从R文件中调出结算页面所需的编辑文本框e2e3=(EditText)findViewById(R.id.jiesuan_editText3);--从R文件中调出结算页面所需的编辑文本框e3b2=(Button)findViewById(R.id.jiesuan_button2);--从R文件中调出结算页面所需的按钮b2i=getIntent();--将intent值传递给调用的组件,并且完成组件的调用Strings=sp.getString("yu_e",null);--将用户余额信息存到s中t2.setText(s);--文本框t2显示用户账户余额t1.setText(i.getStringExtra("qian"));--文本框t1中显示需要结算的价钱inta=Integer.parseInt(i.getStringExtra("qian"));--将需要交付的钱转换为整数型intb=Integer.parseInt(s);--将用户余额钱数也转换成整数型if(a>b){--当需要交付的钱数>用户账户中的余额时t8.setVisibility(1);--显示文本框t8中的内容b2.setVisibility(1);--显示b2按钮}b1=(Button)findViewById(R.id.jiesuan_button1);--从R文件中调出结算页面所需的b1结算按钮b1.setOnClickListener(newOnClickListener(){--设立b1结算按钮publicvoidonClick(Viewv){--点击“结算”按钮,并执行该按钮的操作Strings1=sp.getString("id",null);--将id号存放到字符串s1中//Log.d("Jersey",s1);--蓝色字体显示s1的内容httpclienthc=newhttpclient("l=3&sql=select@pwd@from@user1@where@userid="+s1+";");--通过HTTP协议访问网络资源Strings2=hc.getshuju();--得到数据,并将数据放到字符串s2中//Log.d("Jersey",s2);--看色字体显示s2内容结算完成后更新用户数据---即得到余额信息-98- if(s2.equals(e3.getText().toString())){--当s2中存放的内容等于编辑文本框e3中的内容时httpclienthc1=newhttpclient("l=4&sql=update@user1@set@yu_e=yu_e-"+i.getStringExtra("qian")+"@where@userid="+s1+";");--完成结算,并通过HTTP协议访问网络资源,修改用户账户余额信息hc1.getshuju();--得到修改后的数据添加订单数据包括订单的1、时间;2、客户名;3、收货地址;4、金额;5、状态;6、电话httpclienthc2=newhttpclient("l=2&sql=insert@into@dingdang(shijian,kehu,shouhuodizhi,jin_e,zhuangtai,phone)@values(now(),'"+sp.getString("name",null)+"','"+e1.getText().toString()+"',"+t1.getText().toString()+",'已付款','"+e2.getText().toString()+"');");--通过HTTP协议访问网络资源来添加订单信息,包括订单的时间、客户、收货地址、金额、状态、电话Strings5=hc2.getshuju();--将添加后的数据信息放到字符串s5中Log.d("Jersey",s5);--蓝色字体显示字符串s5的信息修改购买商品的数量sqlsql3=newsql(jiesuan.this,"shangpin");--将结算页面中商品信息放到sql3中Cursorc=sql3.select("");--将sql3中的值放到c中SQLiteDatabasedb=sql3.getdb();c.moveToFirst();--将c的值定位到第一行while(!c.isAfterLast()&&(c.getString(1)!=null)){Stringshangid=c.getString(1);Stringbm=c.getString(2);Stringshuliang=c.getString(4);httpclienthc3=newhttpclient("l=4&sql=update@"+bm+"@set@shuliang=shuliang-"+shuliang+"@where@id="+shangid+";");--通过HTTP协议访问网络资源修改订单中商品的数量Strings=hc3.getshuju();--得到修改后的数据放到字符串s中db.delete("shangpin",shangpinBean.ID+"="+c.getString(0),null);--执行删除商品的操作//Log.d("Jersey",s);--蓝色显示字符串s的信息-98- c.moveToNext();--c值定位到下一行}结算操作两种结果:1、购买成功2、密码错误Toast.makeText(jiesuan.this,"购买成功!",Toast.LENGTH_LONG).show();--提示文本框中显示内容为“购买成功”Intenti=newIntent(jiesuan.this,ShoppingActivity.class);--切换到结算页面startActivity(i);--开始执行切换新界面的操作jiesuan.this.finish();--完成结算}else{Toast.makeText(jiesuan.this,"密码错误!",Toast.LENGTH_LONG).show();--如果结算不成功,则提示文本框中显示“密码错误”}}});b2.setOnClickListener(newOnClickListener(){--设立“结算”按钮publicvoidonClick(Viewv){--点击“结算”按钮,并执行该按钮的操作}});}}4.2.6客户端httpclienthttpclient是用来支持HTTP协议的客户端编程工具包;HTTP协议:允许超文本标记语言(HTML)文档从Web服务器传送到Web浏览器。HTML是一种用于创建文档的标记语言,这些文档包含到相关信息的链接。点击该链接可访问文档,图片或多媒体对象httpclient文档从服务器传送到web浏览器编码packagecom.http;--这个类放在了com.http这个文件夹下面Importjava.io.BufferedReader;-98- --引入BufferedReader类,该类是从缓冲区中读取内容,所有的输入的字节数据都将放在缓冲区之中如果要想接收任意长度的数据,而且避免乱码产生importjava.io.InputStream;--引入InputStream类,该类的作用是标志哪些从不同数据起源产生输入的类importjava.io.InputStreamReader;--引入InputStreamReader类,它是字节转换为字符的桥梁importorg.apache.http.HttpEntity;--引入HttpEntity类,用于包装内容的相关的编码格式,长度importorg.apache.http.HttpResponse;--引入HttpResponse类,封装来自ASP.NET操作的HTTP响应信息importorg.apache.http.client.HttpClient;--引入HttpClient这个类,HttpClient是ApacheJakartaCommon下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,Java应用程序需要直接通过HTTP协议来访问网络资源。importorg.apache.http.client.methods.HttpGet;--引入HttpGet类,这个类用来提交HTTP GET请求importorg.apache.http.impl.client.DefaultHttpClient;--引入DefaultHttpClient,用来访问网络的方法publicclasshttpclient{Stringurl1="http://192.168.0.102:8080/houtai/xiazai.php?";--统一资源定位符URL是www网页的网址,是对可以从因特网上得到的资源的位置和访问方法的一种简洁的表示,只要能够对资源定位,系统就可以对资源进行各种操作,如存取、更新、替换和查找其属性;192.168.0.102为主机名;8080为端口号Stringurl=null;--定义统一资源定位符url为空集privateHttpResponsehttpResponse=null;--定义响应信息为空集privateHttpEntityhttpEntity=null;--定义编码格式为空集publichttpclient(Stringurl2){url=url1+url2;}publicStringgetshuju(){--获得数据--使用HttpGet都必须通过如下3步来访问HTTP资源HttpGethttpGet=newHttpGet(url);-98- --第一步:创建HttpGett对象,将要请求的URL通过构造方法传入HttpGet对象。HttpClienthttpClient=newDefaultHttpClient();InputStreaminputStream=null;Stringresult="";try{httpResponse=httpClient.execute(httpGet);--第二步:使用DefaultHttpClient类的execute方法发送HTTP GET请求,并返回HttpResponse对象httpEntity=httpResponse.getEntity();--第三步:通过HttpResponse接口的getEntity方法返回响应信息,并进行相应的处理inputStream=httpEntity.getContent();--得到数据流BufferedReaderreader=newBufferedReader(newInputStreamReader(inputStream));--就是把输入流作为参数,构建一个读取数据用的InputStreamReader流,然后再把刚才构建的流对象做个包装,包装成BufferedReader流,最后把它赋值给brStringline="";while((line=reader.readLine())!=null){result=result+line;--调用readLine方法,并将返回值赋给line变量。然后赋值语句会生成一个值-----要赋值表达式的值即result=result+line的值。所以可以使用一个关系操作符来比较一个赋值结果,并最终生成一个布尔结果即true或false;如果赋值为null,则赋值表达式result=result+line即为null,与null比较的结果将为true}System.out.println(result);--输出结果}catch(Exceptione){--抛出异常e.printStackTrace();--输出异常}finally{try{inputStream.close();--关闭输入流}catch(Exceptione){--抛出异常e.printStackTrace();--输出异常-98- }}returnresult;--返回结果值}}4.3系统后台逻辑结构设计及其内容编码后台系统主要有用户信息管理,商品信息管理,订单管理。其中用户信息管理,商品信息管理,订单管理功能基本相似。4.3.1系统后台管理员和用户登录程序内容管理员和用户在后台进行登入,输入的账号密码,将发送到数据库进行验证,如果正确,将直接登入到主界面中,如果错误,将进行重新登入。如图4-7所示:向服务器发送请求,校验密码登陆TrueFalse登入重新登入图4-7后台登陆系统后台管理员和用户登录程序编码和部分解释packagecom.shop.action;--这个类放在了com.shop.action这个文件夹下面importjava.util.Map;--引入Map类,提供了一个更通用的元素存储方法importcom.shop.dao.BaseDao;--引入BaseDAO类,提供从数据库增加、删除、修改记录、查询所有记录、查询符合某个条件记录、取得某条记录等方法的底层数据操作自定义类importcom.shop.util.BaseAction;--引入BaswAction类,增加了请求处理的灵活性@SuppressWarnings("serial")publicclassLoginActionextendsBaseAction{privateMapadminMap;--对得到的信息内容进行排序privateStringloginName;--定义登录名字参数字符串privateStringloginPass;--定义登录密码参数字符串-98- privateStringinfo;--定义信息参数字符串privateStringflg;--定义flg变量/***@return*@throwsException*/管理员登录程序输入username用户名和loginpass登录密码两种可能:1、成功登陆2、登录失败(用户名或密码错误)publicStringadminLogin()throwsException{BaseDaobaseDao=newBaseDao();--创建新类this.adminMap=baseDao.selectOne("user1","userid,username,pwd,phone,power1,sex,yu_e","username='"+this.loginName+"'andpwd='"+this.loginPass+"'andpower1=1");--登录操作需要输入,管理员用户名,登录密码;登录成功后以列表形式显示用户名,用户id号,用户电话,用户性别,账户余额等用户信息if((this.adminMap!=null)&&(this.adminMap.size()>0)){--当满足这个两个条件时getHttpSession().setAttribute("admin",this.adminMap);--查询到该管理员信息return"adminLogin";--成功登录}this.info="登录失败!!!";return"adminLoginFalse";--不满足((this.adminMap!=null)&&(this.adminMap.size()>0))这个条件时,则管理员登录失败并显示登录失败}/****@return*/管理员注销程序publicStringadminLogout(){getHttpSession().setAttribute("admin",null);--查询到的管理员名字为空集this.info="成功注销!!!";--则成功注销管理员-98- return"adminLogout";}/*****@return*@throwsException*用户登录程序,输入用户登录名loginname和登陆密码loginpass两种可能结果:1、成功登陆2、登录失败(用户名或密码错误)publicStringuserLogin()throwsException{BaseDaobaseDao=newBaseDao();this.adminMap=baseDao.selectOne("user1","userid,username,pwd,phone,power1,sex,yu_e","username='"+this.loginName+"'andpwd='"+this.loginPass+"'andpower1=0");--登录操作需要输入,用户的用户名,登录密码;登录成功后以列表形式显示用户名,用户id号,用户电话,用户性别,账户余额等用户信息if((this.adminMap!=null)&&(this.adminMap.size()>0)){--当满足这个两个条件时getHttpSession().setAttribute("user",this.adminMap);--查询到用户信息return"userLogin";--用户登录成功}this.info="登录失败!!!";if((this.flg!=null)&&(this.flg.equals("0"))){--当flg值不等于空集且flg值为0时outJson(this.adminMap,null);--查询到想要登录的用户为空集,即不存在return"none";}return"userLoginFalse";--用户登录失败}/*****@return*/-98- 用户注销程序publicStringuserLogout(){getHttpSession().setAttribute("user",null);--当查询到用户信息为空集时this.info="成功注销!!!";--用户实现成功注销操作if((this.flg!=null)&&(this.flg.equals("0"))){--当flg不等于空集且flg等于0outJson(this.info,null);--用户信息为空集return"none";--返回空集}return"userLogin";--返回用户登录}publicMapgetAdminMap(){returnthis.adminMap;--这里是定义了一个string变量Object,并为该变量提供了获取方式。这样的定义方式使得其他的地方只能获取AdminMap的值而不能再设置AdminMap的值}publicvoidsetAdminMap(MapadminMap){this.adminMap=adminMap;--setAdminMap就是给AdminMap设置一个值,也就是通过外部调用该方法给商品的对象中的AdminMap赋值,所以外部方法肯定需要传入一个String作为参数。而this.adminMap=adminMap;便是赋值的部分,赋值之后不需要有返回值}publicStringgetLoginName(){returnthis.loginName;--这里是定义了一个string变量LoginName,并为该变量提供了获取方式。这样的定义方式使得其他的地方只能获取LoginName的值而不能再设置LoginName的值}publicvoidsetLoginName(StringloginName){this.loginName=loginName;--setLoginName就是给LoginName设置一个值,也就是通过外部调用该方法给商品的对象中的LoginName赋值,所以外部方法肯定需要传入一个String作为参数。而this.loginName=loginName;便是赋值的部分,赋值之后不需要有返回值}-98- publicStringgetLoginPass(){returnthis.loginPass;--这里是定义了一个string变量LoginPass,并为该变量提供了获取方式。这样的定义方式使得其他的地方只能获取LoginPass的值而不能再设置LoginPass的值}publicStringgetInfo(){returnthis.info;--这里是定义了一个string变量Info,并为该变量提供了获取方式。这样的定义方式使得其他的地方只能获取Info的值而不能再设置Info的值}publicvoidsetInfo(Stringinfo){this.info=info;--setInfo就是给Info设置一个值,也就是通过外部调用该方法给商品的对象中的Info赋值,所以外部方法肯定需要传入一个String作为参数。而this.info=info;便是赋值的部分,赋值之后不需要有返回值}publicvoidsetLoginPass(StringloginPass){this.loginPass=loginPass;--setLoginPass就是给LoginPass设置一个值,也就是通过外部调用该方法给商品的对象中的LoginPass赋值,所以外部方法肯定需要传入一个String作为参数。而this.loginPass=loginPass;便是赋值的部分,赋值之后不需要有返回值}}4.3.2系统后台商品管理程序内容在管理员点击商品列表的时候,数据库将所有商品信息显示在页面中,管理员可对商品进行增加,修改,删除,查询的功能。如图4-8所示:向数据库发送请求,将数据显示到页面中商品列表查询删除增加修改-98- 图4-8后台商品管理图系统后台商品管理程序编码和部分解释packagecom.shop.action;--这个类放在了com.shop.action这个文件夹下面importjava.util.List;--引入util.List这个类,可以使用list进行批量数据序列操作importjava.util.Map;--引入Map类,提供了一个更通用的元素存储方法importcom.shop.dao.BaseDao;--引入BaseDAO类,提供从数据库增加、删除、修改记录、查询所有记录、查询符合某个条件记录、取得某条记录等方法的底层数据操作自定义类importcom.shop.util.BaseAction;--引入BaswAction类,增加了请求处理的灵活性@SuppressWarnings("serial")publicclassProductActionextendsBaseAction{privateList>objList;--对得到的信息内容进行排序privateMapobjMap;--对得到的信息内容进行排序privateBaseDaobaseDao;--定义一个baseDao类privateStringwhereStr="1=1";--用于连接sql语句privateStringid;--定义一个字符串参数---idprivateStringname;--定义一个字符串参数---名字privateStringtupian;--定义一个字符串参量---图片privateStringbiao;--定义一个字符串参量---表privateStringjiaqian;--定义一个字符串参数---价钱privateStringshuliang;--定义一个字符串参数---数量privateStringmiaoshu;--定义一个字符串参量---描述privateStringfujia;--定义一个字符串参量---附加privateStringptype;--定义一个字符串变量---ptypeprivateStringpdesc;--定义一个字符串变量---pdescprivateStringflg;--定义一个字符串变量---flg/***查询所有**@return*@throwsException*/-98- 查询所有商品这段程序是以biao表商品为例,当输入biao(表)时,即显示所有表商品的信息;可能的结果:1、无biao商品2、查到biao商品信息,并显示出来商品信息包括1、商品ID号;2、商品名称;3、商品的附加信息;4、商品的价钱;5、商品的数量;6、商品的图片;7、对商品的描述publicStringfindAll()throwsException{System.out.println(biao);--输出所有表商品的信息this.baseDao=newBaseDao();if((this.name!=null)&&(!this.name.equals(""))){--当输入的商品名字不为空集且name值等于“”时this.whereStr=(this.whereStr+"andnamelike'%"+this.name+"%'");--查询所有满足条件的商品信息}this.whereStr+="orderbyiddesc";--将查询到的商品按降序排列this.objList=this.baseDao.select(biao,"id,name,fujia,jiaqian,shuliang,tupian,miaoshu",this.whereStr);--列表中显示表类商品的id号码,名字,商品的附加信息,商品的价钱,商品的数量,商品的图片,商品的描述信息if((this.flg!=null)&&(this.flg.equals("0"))){--当flg字不为空集且flg值等于0时outJson(this.objList,null);--想要查询的该商品为空集returnNONE;}if((this.flg!=null)&&(this.flg.equals("1"))){--当flg不等于空集且flg的值等于1时return"AdminFindAll";--查询到所有满足该条件的商品}return"findAll";}/****-98- *@return*@throwsException*/保存商品信息修改后的信息(商品信息的更新和修改)商品信息包括(商品名称,图片,价钱,附加信息,数量,商品描述内容,商品ID号码)publicStringsave()throwsException{this.baseDao=newBaseDao();--创建一个新的BaseDao类if((this.id!=null)&&(!this.id.equals("")))--当id不等于空集且id值等于“”时this.baseDao.update(this.biao,"name='"+this.name+"',tupian='"+this.tupian+"',jiaqian="+this.jiaqian+",fujia='"+this.fujia+"',shuliang="+this.shuliang+",miaoshu='"+this.miaoshu+"'","id="+this.id);--修改该商品的名字,图片信息,价钱,附加信息,商品数量,对商品的描述信息else{this.baseDao.insert(biao,"name,fujia,jiaqian,shuliang,tupian,miaoshu","'"+this.name+"','"+this.fujia+"',"+this.jiaqian+","+this.shuliang+",'"+this.tupian+"','"+this.miaoshu+"'");}--当不满足条件:“id不等于空集且id值等于“”的条件时,可以增加商品信息,包括商品的名字,商品的附加信息,商品的图片,商品的描述信息if((this.flg!=null)&&(this.flg.equals("0"))){--当满足flg不等于空集,且flg的值为0时getResponse().getWriter().write("{success:true}");--对修改或增加的商品信息数据没有保存成功returnNONE;}if((this.flg!=null)&&(this.flg.equals("1"))){--当flg不等于空集且flg值为1时return"AdminSave";--对修改或增加的商品信息数据保存成功}return"save";}-98- /****@return*@throwsException*/根据商品的ID号来查询商品可能的结果:1、查无此商品2、查到商品并显示商品信息(商品ID号、商品名称、商品附加信息、商品价钱、商品数量、商品的图片、商品的描述信息)publicStringgetById()throwsException{this.baseDao=newBaseDao();--创建一个新的基础BaseDao类this.whereStr=(this.whereStr+"andid="+this.id);--通过商品的id号码查询商品信息this.objMap=this.baseDao.selectOne(biao,"id,name,fujia,jiaqian,shuliang,tupian,miaoshu",this.whereStr);--列出显示查询到的商品信息,包括商品的id号码,商品的名称,商品的附加信息,商品的价钱,商品的数量,商品的图片,对商品的描述信息if((this.flg!=null)&&(this.flg.equals("0"))){--当flg不等于空集且flg值为0时outJson(this.objMap,null);--通过id号想要查询到的商品为空集returnNONE;}if((this.flg!=null)&&(this.flg.equals("1"))){--当flg不等于空集,且flg的值为1时return"AdminGetById";--通过商品的id号成功查询到该商品的信息}return"getById";}/*****@return*@throwsException*/-98- 删除某商品的程序操作结果:1、删除不成功2、成功删除该商品publicStringdelete()throwsException{this.baseDao=newBaseDao();--创建一个新的BaseDao类this.baseDao.delete(biao,"ID="+this.id);--删除想要删除的商品的操作程序if((this.flg!=null)&&(this.flg.equals("0"))){--如果flg不等于空集,且flg的值为0时getResponse().getWriter().write("{success:true}");--删除商品的操作不成功,即没有实现删除该商品returnNONE;}if((this.flg!=null)&&(this.flg.equals("1"))){--当flg不等于空集且flg的值为1时return"AdminDelete";--成功删除该商品}return"delete";}4.3.3系统后台订单管理程序内容管理员点击订单列表,页面显示出所有客户的订单,而管理员可以操作这些订单,实现订单状态的修改,发货或关闭交易。如图4-9所示:向数据库发送请求,将数据显示到页面中订单列表关闭交易发货图4-9后台订单管理图系统后台订单管理程序编码和部分解释-98- packagecom.shop.action;--这个类放在了com.shop.action这个文件夹下面importjava.text.SimpleDateFormat;--引入SimpleDateFormat类,可以调用格式化日期的操作方法importjava.util.Date;--引入Date类,可以操作日期和时间各组成部分的方法importjava.util.HashMap;--引入util.HashMap这个类,可以调用HashMap中的“链接”方法importjava.util.List;--引入util.List这个类,可以使用list进行批量数据序列操作importjava.util.Map;--引入Map类,引用以按键/数值对的形式存储数据的方法importjava.util.UUID;--引入UUID类,目的是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要透过中央控制端来做辨识资讯的指定importjavax.servlet.http.HttpSession;--引入HttpSession类,调用客户端与服务器端通信的方法importcom.shop.dao.BaseDao;--引入BaseDAO类,提供从数据库增加、删除、修改记录、查询所有记录、查询符合某个条件记录、取得某条记录等方法的底层数据操作自定义类importcom.shop.util.BaseAction;--引入BaswAction类,增加了请求处理的灵活性@SuppressWarnings("serial")publicclassOrderActionextendsBaseAction{privateList>objList;--对得到的信息内容进行排序privateMapobjMap;--对得到的信息内容进行排序privateMap>cartMap;--对得到的信息内容进行排序privateBaseDaobaseDao;--定义一个BaseDao类privateStringwhereStr="1=1";--连接数据库语句privateStringid;--定义一个字符串参量---idprivateStringkehu;--定义一个字符串参量---客户privateStringprice;--定义一个字符串参量---价格privateStringaddress;--定义一个字符串参量---地址privateStringphone;--定义一个字符串参量---电话privateStringshijian;--定义一个字符串参量---时间privateStringmingxi;--定义一个字符串参量---明细privateStringzhuangtai;--定义一个字符串参量---状态privateStringinfo;--定义一个字符串变量---info-98- privateStringflg;--定义一个字符串变量---flg**@return*@throwsException*/管理员根据订单关键字查询订单publicStringfindByKey()throwsException{this.baseDao=newBaseDao();--创建一个新的BaseDao类if(id!=null&&!id.equals("")){--当id不等于空集,且id等于“”时whereStr+="andid='"+id+"'";--找到与该关键字有关的订单信息this.objList=this.baseDao.select("dingdang","id,shijian,kehu",this.whereStr);--列出信息,包括订单的id号,订单的时间以及这个订单的客户}return"findByKey";}/*****@return*@throwsException*/@SuppressWarnings("unchecked")管理员查询某客户所有订单管理员需先登录才能进行查询查询结果:1、无订单2、查到订单并显示订单信息,包括:1、订单id号;2、订单时间;3、客户名称;4、收货地址;5、金额;6、订单明细;7、订单状态;8、客户电话publicStringfindAll()throwsException{this.baseDao=newBaseDao();--创建一个新的BaseDao类if((this.id!=null)&&(!this.id.equals(""))){--当满足条件id不等于空集,且id等于“”时-98- this.whereStr=(this.whereStr+"andono='"+this.id+"'");--查找到该id号的订单信息}if((this.kehu!=null)&&(!this.kehu.equals(""))){--当客户信息不等于空集,且客户信息等于“”时this.whereStr=(this.whereStr+"andkehu='"+this.kehu+"'");--查找到该客户的所有订单信息}if((this.id!=null)){--当id值不等于空集时Mapmap=(Map)getRequest().getSession().getAttribute("user");--执行输入的请求,并得到响应if((map==null)||(map.size()<=0)){--当map等于空集,且map的大小小于等于0值时this.info="您还没有登录!!!请您先进行登录...";--显示提示信息“您还没有登录!!!请您先进行登录”return"userLoginFalse";--返回用户登录失败}Stringid=map.get("ID").toString();this.whereStr=(this.whereStr+"andid='"+id+"'");}this.whereStr+="orderbyiddesc";--将查询到的信息按降序排列this.objList=this.baseDao.select("dingdang","id,shijian,kehu,shouhuodizhi,jin_e,mingxi,zhuangtai,phone",this.whereStr);--列举显示出订单信息,包括订单的id号,订单的时间,订单的客户,订单的收货地址,订单的金额,订单的明细内容,订单的状态,订单客户的电话if((this.flg!=null)&&(this.flg.equals("0"))){--当flg不等于空集且flg的值等于0时outJson(this.objList,null);--则没有查询到想要查询的订单信息returnNONE;}if((this.flg!=null)&&(this.flg.equals("1"))){--当flg不等于空集,且flg的值等于1时-98- return"AdminFindAll";--查询操作成功,查询到所有满足条件的订单信息}return"findAll";}/*****@return*@throwsException*/4.4本章小结本章主要介绍了手机网络商城设计的详细过程,还对其重要部分的编程和代码进行了分析和讲解.系统是如何实现的会在下一章体现出来-98- 5.系统的具体实现5.1前台android主要功能的实现5.1.1登入界面;如图5-1所示图5-1前台登入这是用户登陆的实现界面;用户登陆时需要输入注册的账号密码和用户名,填入正确后便可登入到主界面。调出R.java文件下login页面所需的按钮button,编辑文本框EditText,按照R.layout对login页面所设定好的布局方式进行布局。操作时会出现以下4种情况结果:1、显示“用户名不存在”2、登录成功并显示用户信息;包括1、用户名;2、余额3、显示“密码错误”4、如果没填写用户名或密码则显示“您是不是有东西没填啊”如果登陆之前未注册则需要点击注册按钮先进行注册,注册完成后才可以进行登陆。主要是判断了用户输入的信息,并对其进行验证,如果正确,可直接登入到主界面,如果错误,或者有些内容没填,会出现相应的提示。-98- 5.1.2注册界面;如图5-2所示图5-2前台注册这是用户注册页面;用户注册时需要填入用户名和对应的密码,并且需要再次输入密码来保证密码的正确和有效,还需填写用户的手机号码,以便未来密码忘记的时候可以及时地找回,并且还需填写性别。以上填写确认无误后方可注册成功。从R.java文件中调出注册页面所需的Button注册按钮;EditText编辑文本框设立一个注册按钮,点击该页面上的注册按钮后可进入页面填写注册信息------可能的结果:1、注册成功;2、注册失败原因:两次密码输入不一致;3、注册失败原因:您是不是有东西没填啊;主要解释了在用户注册时,读取用户所填写的信息,并将这些信息插入到后台数据库中。用户在密码填写时必须保持前后一致,如果不一致并会出现提示。5.1.3商品主界面;如图5-3所示:-98- 图5-3前台主界面这是商城商品的主页面;进入网上商城主页面,可点击服装、电视机、手机、包包、运动鞋这五个图片按钮进入该类商品详细页面进行浏览。从R.java文件中调出sousuo页面所需要的文本框TextView:1、name名字;2、miaoshu描述;3、shuliang数量;4、lujing路径;5、jiage价格;6、id;7:biaoming表明从R.java文件中调出sousuo页面所需的EditText编辑文本框(可输入搜索信息的文本框),搜索button按钮。并按照R.layout中对sousuo页面的布局方式进行布局-98- 搜索:1、包包;2、服装;3、电视;4、运动鞋;5、手机的搜索程序搜索结果:1、没有找到该商品;2、找到该商品并且按照预先设定好的布局方式将商品信息显示在页面中退出商城的程序:出现一个对话框:1、点击确定按钮即可退出商城2、点击取消按钮即继续购物设置4个menu菜单按钮1、UPDATE购物车;2、ABOUT关于;3、GEREN个人;4、EXIT退出四个按钮;并从R.java文件下调出:1、服装;2、电视;3、手机;4、包包;5、鞋子这五个图片按钮;并按照R.layout中对于main页面即主页面的布局进行布局。点击四个menu菜单按钮的操作程序。点击5个图片按钮的操作程序,点击后即显示该类商品信息展示所需商品信息的编码和部分解释这段代码是设置展示所需商品信息的方式,即show商品的方式@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.show);Intenti=getIntent();listinfol=newlistinfo(i.getStringExtra("show"));List>list=l.list1();SimpleAdaptersa=newImageSimpleAdapter(this,list,R.layout.show_list_item,newString[]{"product_item_image","text1","text2","text3","list_idex","yin_miaoshu","yin_shuliang","yin_lujing","yin_id","yin_biaoming"},newint[]{R.id.product_item_image,R.id.text1,R.id.text2,R.id.text3,R.id.list_idex,R.id.yin_miaoshu,R.id.yin_shuliang,R.id.yin_lujing,R.id.yin_id,R.id.yin_biaoming});setListAdapter(sa);}5.1.4商品服装的详细页面;如图5-4所示-98- 图5-4服装商品浏览列表从5个商品按钮中选择按钮点击商品按钮便可跳转到此页面,点击其中一类商品服装,即可跳转到相关商品浏览此商品的详细信息信息。当点击服装图片按钮时则出现服装的详细页面classibocl1implementsOnClickListener{publicvoidonClick(Viewv){listinfol=newlistinfo("fuzhuang");l.list1();Intenti=newIntent(ShoppingActivity.this,show.class);i.putExtra("show","fuzhuang");startActivityForResult(i,0);}}点击其中一类商品手机,可跳转到相关商品的浏览信息如图5-5所示:-98- 图5-5手机商品浏览列表当点击手机图片按钮后出现以上页面classibocl3implementsOnClickListener{publicvoidonClick(Viewv){Intenti=newIntent(ShoppingActivity.this,show.class);i.putExtra("show","shouji");startActivityForResult(i,0);}}5.1.5htc手机商品的详细界面和将想要购买的加入购物车界面如图5-6和图5-7所示:-98- 图5-6htc商品详细信息图5-7商品加入购物车点击选中的商品中手机htc,便可以出现此款手机的具体信息,详细界面中显示出该商品的具体信息,其中有价格,描述,库存以及用户想要购买的数量等等。用户可将选购好的想要购买的商品加入购物车从R.java文件中调出商品页面所需的文本框textview:1、数量;2、描述;3、价格和编辑文本框editText,一个加入购物车的按钮button。并按照R.layout设定好的shangpin页面的布局方式进行布局将所选商品加入购物车,会出现两种情况:1、如果购买数量大于库存-------则显示“库存量不够啊”;2、如果购买数量小于库存-------则成功加入购物车------之后会出现一个对话框可选择:1、去购物车;2、再逛逛图片从SD卡中调出商品的图片并显示在shangpin页面上结算价格的程序:intc=a*b总价格=商品价格*购买数量是在购物车中,对购买的商品信息的修改,主要是对购买数量的修改。如果客户不想购买这件商品,也可进行删除操作。5.1.6购物车界面;如图5-8所示-98- 图5-8购物车界面打开购物车页面,可以看到已加入购物车中的商品,可以继续购物还可以选择去结算按钮或者清空按钮进行操作。购物车界面还会显示商品的总价格。对购物车中的内容进行修改1、代表所购买的数量;1、代表库存修改购物车操作会出现3种情况1.如果a大于b则显示“库存量不够”2.如果a小于b则修改操作成功3.也可取消修改操作也可以执行删除购物车中商品的操作,显示购物车页面上所需的图片及文本框并按在R.java文件中预先设定好的布局方式布局购物车页面5.1.7订单结算界面;如图5-9所示-98- 图5-9商品订单结算图在付款页面中,用户需要填入相关信息,如收货地址和联系电话,并且还需要填写注册时用户会员设置的密码,填写正确后,便可生产订单。调出结算页面所需要所需要的图标、文本框textview、可编辑的文本框edittext、结算按钮button结算完成后更新用户数据---即显示用户的余额添加订单数据,包括订单的1、时间2、客户名3、收货地址4、金额5、状态6、电话,购买后可以更新购买商品的数量。结算操作是会出现两种结果:1、购买成功2、密码错误这张图片实现主要是读取用户填写的订单信息,并插入到数据库中生成订单表,最后一项要填写密码,是用户的登入密码,填写错误会出现提示并重新填写,正确后会有个提示信息,购买成功。5.2后台web端主要功能实现5.2.1后台登入界面;如图5-10所示:-98- 图5-10后台登入界面这是后台管理员登陆页面;管理员在后台进行登入,需要输入正确的账号和密码,输入的帐号的密码将发送到数据库进行验证,如果正确,将直接登入到主界面中,如果错误,将进行重新登入。管理员登录程序输入username用户名和loginpass登录密码两种可能:1、成功登陆2、登录失败(用户名或密码错误)用户登录程序输入用户登录名loginname和登陆密码loginpass两种可能结果:1、成功登陆2、登录失败(用户名或密码错误)5.2.2后台主界面;如图5-11所示图5-11后台主界面5.2.3商品列表界面;如图5-12所示-98- 图5-12商品列表信息图在管理员点击商品列表的时候,数据库将所有商品信息显示在页面中,管理员可对商品进行增加,修改,删除,查询等的功能。查询所有商品是以biao表商品为例,当输入biao(表)时,即显示所有表商品的信息;可能产生的结果:1、无biao商品2、查到biao商品信息,并显示出来商品信息包括1、商品ID号;2、商品名称;3、商品的附加信息;4、商品的价钱;5、商品的数量;6、商品的图片;7、对商品的描述可以保存商品信息修改后的信息(商品信息的更新和修改)商品信息包括(商品名称,图片,价钱,附加信息,数量,商品描述内容,商品ID号码)根据商品的ID号可以来查询商品可能产生的结果:1、查无此商品2、查到商品并显示商品信息(商品ID号、商品名称、商品附加信息、商品价钱、商品数量、商品的图片、商品的描述信息)删除某商品的程序会出现一下两种操作结果:1、删除不成功2、成功删除该商品5.2.4后台添加商品界面;如图5-13所示:-98- 图5-13订单商品添加界面点击添加商品,填入商品的具体信息,如商品名称;附加信息;图片的来源地址;商品价格;库存等等信息,即可实现商品的添加。这段代码是对商品添加的实现,通过insert这个方法,将信息插入到数据库中。订单商品添加界面代码的具体的实现和部分代码的解释如下:publicintinsert(StringtableName,Stringfields,Stringvalues)throwsException{intresult=0;StringBuildersql=newStringBuilder();try{sql.append("insertinto").append(tableName).append("(").append(fields).append(")").append("values(").append(values).append(")");System.out.println(sql);result=executeUpdate(sql.toString());}catch(Exceptione){e.printStackTrace();thrownewException("执行添加sql语句:"+sql.toString()+"错误!");}finally{this.closeAll();}returnresult;}-98- 5.2.5后台编辑商品界面;如图5-14所示:图5-14后台商品编辑界面对某一商品可进行编辑,可以更改商品的属性,如商品名称;商品的附加标注;商品的图片来源地址;商品价格;库存量;商品的描述以及商品的类型。便可在数据库中实现更改。后台商品编辑界面代码的具体的实现和部分代码的解释如下:publicintupdate(StringtableName,Stringsettings,StringwhereStr)throwsException{intresult=0;StringBuildersql=newStringBuilder();try{sql.append("update").append(tableName).append("set").append(settings);if((whereStr!=null)&&(!"".equals(whereStr))){sql.append("where").append(whereStr);}System.out.println(sql);result=executeUpdate(sql.toString());}catch(Exceptione){e.printStackTrace();thrownewException("执行修改sql语句:"+sql.toString()+"错误!");-98- }finally{this.closeAll();}returnresult;}5.2.6后台订单管理界面;如图5-15所示:图5-15后台订单界面管理员从后台查询所有订单,处理用户的订单,点击发货,或关闭交易,改变订单的状态。管理员可以查询某客户所有订单,管理员需先登录才能进行查询根据订单的ID号码来查询订单信息结果两种结果:1、查无此订单2、查到订单并显示订单信息。订单信息包括:1、订单ID号码;2、时间;3、客户名称;4、收货地址;5、金额;6、订单明细;7、订单状态;8、客户电话修改订单状态,根据this.zhuangtai.equals(“”)值得改变修改订单状态订单的状态有:equals(“1”)已发货equals(“2”)客户已付款equals(“3”)关闭(交易完成)可以保存订单修改后的状态1、已发货2、客户已付款3、关闭-98- 5.3本章小结第五章中在Eclipse开发平台下,使用Andriod模拟器对该手机购物商城系统进行测试实现。从中找出不足之处,予以改进。-98- 6.总结与展望6.1基于Android平台的移动手机商城的设计回顾此次毕业设计采用了Android和JavaWeb的技术,难度比想象中要大的多,是本人目前做过的最大的,也是难度最高的程序。.因此在完成的过程中并没有做到最完美。在设计初期,遇到了很多难题,但经过自己的努力和指导老师的帮助,其中的问题很快的都得到了解决。本次设计的主要思想还是注重于商品从浏览到购买这一系列流程,并实现前台到后台数据间的交互。前台主要是用了android的界面框架来设计,通过列表视图来显示出商品,并连接到后台,实现商品的第一时间更新。后台运用了JSP+SSH的MVC模型来设计管理页面,主要是针对商品的增,删,改,查和对订单的处理。客户端连接服务器,服务器链接数据库;客户端连接数据库是网络连接,基于TCP/IP连接.服务器是通过jdbc接口与数据库实现连接的。在此次设计中,有着很多的不足之处,各个模块的功能并没有设计的太全面,由于技术方面的问题,也只能将一些复杂的问题简单化。在这次的设计中让我学到了很多知识,尤其是android方面的,让我对移动通信方面的技术产生了很大的兴趣,对android的开发有了一个更深的认识,相信在以后的学习或工作中,都能带给我许多帮助!6.2Android平台的移动手机商城的设计经验总结1.对Java语言有一定了解是必要的,而Java语言本身是面向对象编程的一种语言,因此,对类与对象的概念要有必要的了解,而这些内容在论文中就不进行介绍了。2.要对开发环境进行很深和更透彻的了解3.关于Activity:如果把Activity看作MVC中的Control。它负责管理用户的输入,虽然说一个Activity通常对应一个屏幕,但事实上,我们是可以只用一个Activity管理多个不同的View来实现简单的逻辑。4.关于Intent的使用:Intent分为两大类,显性的(Explicit)和隐性的(Implicit)。一般来说,intent要定位事件的目的地,无外乎需要以下几个信息:(1).种类(category)(2).类型(type)(3).组件(component)(4).附加数据(extras)其实,如果是在一个应用内部,这种隐性的intent实在有点别扭,个人觉得,这种实现方法,只适用于那些较大的系统或者多个不同的应用之间的调用。-98- 6.3本章小结第六章中回顾了基于Android平台的移动手机商城设计过程中的遇到的难题,总结了设计过程中得到的经验与启示。-98- 参考文献[1]公磊,周聪.基于Android的移动终端应用程序开发与研究.计算机与现代化,2008[2]夏昕.Spring开发指南[M].北京:电子工业出版社,2004.[3]高焕堂.Android的开发入门与实战.人民邮电出版社.2012年4月[4]傅鹂.基于Struts+Spring+Hibernate+Ajax技术的科研管理系统设计[J].软件导刊,2009,8(1):134-136.[5]夏昕,曹晓钢.深入浅出Hibernate[M].北京:电子工业出版社,2005.[6]马越.Android的架构与应用[D].北京:中国地质大学(北京)硕士学位论文,2008:9-20.[7]何玉洁.数据库原理与应用教程.机械工业出版社2005.12[8]刘卫国姚昱禹.Android的架构与应用开发研究.中南大学信息科学与工程学院计算机系统应用2008-11[9]孙晓宇.Android手机界面管理系统的设计与实现.北京邮电大学.2009年[10]曹大有.基于Struts和Spring框架技术的Web应用的开发过程[J].计算机应用与软件,2008,25(8):203-204.[11-98- ]孙强.基于Struts+Spring+iBATIS的轻量级Web应用框架研究[J].计算机应用与软件,2008,25(10):135-137.[12]刘平.Android手机访问服务器的一种数据交互方法.西安财经学院网络与现在教育技术中心2010-09[13]陈天河.Struts,Hibernate,Spring集成开发宝典[M].北京:电子工业出版社,2007.[14]黄志明.基于Spring+Struts+Hibernate的报备系统的设计与实现[J].电脑知识与技术,2008,4(Z2):40-41..[15]邓子云.基于Struts2+Hibernate3+Spring2的物流数据交换平台[J].计算机应用与软件,2009,26(10):88-100.[16]赵少卡.基于Struts+Spring+Hibernate架构的信息交流平台的设计与实现[J].计算机与现代化,2009(2):62-66..[17]郝玉龙.安卓程序设计基础清华大学出版社2011[18]邸烁,Android手机平台揭秘和未来发展趋势2008[19]马越.Android的架构与应用[D].北京:中国地质大学(北京)硕士学位论文,2008:9-20.[20]孙更新,Android从入门到精通电子工业出版社2011[21]鲁霞.基于Struts_Spring_Hibernate架构的综合积分系统的研究与实现[D].成都:西南交通大学硕士学位论文,2008.[22]吴善财,Android基础开发与实践清华大学出版社2012[23]开放手机联盟.Android[DB/OL].2008-07-30.[24]韩超,Android经典应用程序开发电子工业出版社2012[25]李刚.Struts2权威指南——基于WebWork核心的MVC开发[M].北京:电子工业出版社,2007.[26]汪永松,Android平台开发之旅机械工业出版社2010[27]高焕堂.Android应用框架原理与程式设计36技[M/OL].Google公司,2008:132-150.[28]杨丰盛,Android应用开发揭秘机械工业出版社2010年9月[29]陈天河.Struts,Hibernate,Spring集成开发宝典[M].北京:电子工业出版社,2007.-98- [30]CHENYu-fen. Mapspatialcognitionresearchandspatialinformationvisualization.,Informationsystem,2009,23(6),532-541[31]孙卫琴.Java面向对象编程.电子工业出版社,2006.7[32]阎宏.《JAVA与模式》电子工业出版社2002.10[33]赵能.基于Eclipse的嵌入式软件开发平台若干关键技术研究.浙江大学硕士学位论文2007.6[34]王世江,盖索林.GoogleAndroid开发人门指南[M].北京:人民邮电出版社,2009[35]李兴华Java开发实战经典[M].北京:清华大学出版社,2009[36]杨丰盛.Android技术内幕[M].北京:机械工业出版社,2011.[37]刘帅旗.Android移动开发从入门到精通.北京.中国铁道出版社,2012.3.386-409[38]简朝阳.MySQL性能调优与架构设计.北京.电子工业出版社,2009.121-155[39]余志龙,郑名杰.AndroidSDK开发范例大全(第二版).北京.人民邮电出版社,2010.36-43[40]ErichGamma,KentBeck.ContributingtoEclipse中国屯力出版社,2005-01-98-

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭