这是一个高校饮用水配送项目,是一个毕业设计,去年的,包括了服务端和客户端,是一个不错的项目,分享一下:
随着通讯行业的迅猛发展,我国的手机用户也在不断的增加。据信息部的统计数据显示,我国已有接近7.4亿手机用户。随着手机群体的日益壮大,Android系统的出现,给移动互联网时代带来了新的发展。为了适应现代信息时代的需求,采用新信息技术,研究设计了一个基于Android平台的高校饮用水配送管理系统。
基于Android平台的高校饮用水配送管理系统是手机的一款网络应用软件,目的在于为高校广大学生提供便利,通过手机支付宝或微信进行支付,管理端接收订单,安排派送。这样大大便利了学生的生活。
前面这些废话不多说,直接进入系统开发环节:
一、 系统设计
本节将详细介绍系统的整体设计。
下面是的整体系统架构图
饮水宝主要设计采用滚雪球的开发模式,不多说了。
1 . 用户模块
用户模块的设计思路主要是为了方便用户在线订水而设计,该模块又划分为6个子模块,分别是在线订水、订单查询、信息管理、在线支付、服务评价、查询评论,下面对这几个模块具体介绍:
(1) 在线订水
在线订水主要是为了满足在校大学生可以足不出户就可以完成订水的需求,可以大大方便学生的生活。
(2) 订单查询
订单查询模块,主要是满足用户在线查询自己订单情况,及时掌握预定的桶装水的位置及送达的时间
(3) 信息管理
信息管理模块主要是满足用户修改自己的信息,包括宿舍号,电话号码,密码等等
(4) 在线支付
在线支付模块用于支付订单信息,可以实现交易无纸化,该模块预期完成微信和支付宝两种主流在线支付模式的接口对接
(5) 服务评价
服务评价模块主要是为了方便用户对饮水公司的服务情况进行反馈,一是方便广大用户满足自己发声的需求,另一方面也可以方便饮水公司改进自己的服务质量
(6) 查询评论
查询评论这一模块主要是为了方便用户查看其他用户对饮水公司的评价,以实现消费前货比三家的消费习惯,帮助自己决策是否购买该饮水公司的饮用水。
2. 管理员模块
管理员模块实际上提供给饮水公司使用的模块,通过这个模块,饮水公司可以在线管理订单,及时发水给学生。方便快捷,还可以对库存进行管理。特别方便实用。该模块主要分为管理订单,查看评论,库存管理三个模块,下面分别进行介绍:
(1) 管理订单
管理订单模块主要是为了方便饮水公司在线管理自己的订单,通过管理订单可以做到及时发货,以满足学生们的饮水需求
(2) 查看评论
查看评论模块主要是为了方便饮水公司搜集用户满意度,以给自己做出服务方式转变的决策提供依据,不断提高服务水平。
(3) 库存管理
库存管理模块可以方便饮水公司对自己的库存量进行管理,以满足科学管理,平衡供求关系的目的。
二、系统实现
在系统设计的基础上,下面具体讲解每一个模块的详细实现过程。
- 数据库设计与实现
数据库是整个系统的最基础的部分,包括用户信息,订单信息,库存信息,评论信
息等都包含在数据库里面,所以这里首先讲解数据库的设计与实现。
首先是,数据库表的设计:
表1 : User
说明:User表存放的是用户有关信息
列名 |
类型 |
是否主键 |
说明 |
Id |
Int |
是 |
主键,自动增长 |
Name |
Text |
否 |
用户登录账户 |
Pwd |
Text |
|
密码 |
address |
Text |
|
地址 |
Tel |
Text |
|
电话 |
表2 : Dingdan
说明:Dingdan表存放的是订单的信息
列名 |
类型 |
是否主键 |
说明 |
Id |
Int |
是 |
主键,自动增长 |
Name |
Text |
否 |
客户 |
Num |
Int |
|
数量 |
address |
Text |
|
地址 |
Tel |
Text |
|
电话 |
表3 : KuCun
说明:KuCun表放的是有关库存的信息
列名 |
类型 |
是否主键 |
说明 |
Num |
Int |
否 |
总量 |
Ok |
Int |
否 |
完好的库存 |
Old |
Int |
否 |
损坏的库存 |
表4 : Commnet
说明:Comment存放的是用户评论信息
列名 |
类型 |
是否主键 |
说明 |
Id |
Int |
是 |
编号 |
Name |
Text |
否 |
发布评论的人 |
Content |
Text |
否 |
评论的内容 |
以上便是数据库的设计,下面介绍一下实现过程,数据库的实现代码位于工程文件的”com.ysb.dao”包下的MyDBHelper.java文件,这里的数据库主要采用Sqlile数据库,是一个轻量级的数据库,使用极为方便,下面简要介绍主要实现代码:
数据库的创建,建立数据库,创建表:
public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub db.execSQL("CREATE db.execSQL("CREATE TABLE IF NOT EXISTS USER (_ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT,PWD TEXT,ADDRESS TEXT,TELEPHONE TEXT)"); db.execSQL("CREATE TABLE IF NOT EXISTS DINGDAN (_ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT,TEL TEXT,ADDRESS TEXT,NUM TEXT,THETIME TEXT)"); db.execSQL("CREATE TABLE IF NOT EXISTS YUANGONG (_ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT,SEX TEXT,TELEPHONE TEXT)"); } |
插入数据,以插入用户数据为例:
public void insertUser(ContentValues values){ SQLiteDatabase db=getWritableDatabase(); db.insert("USER", null, values); db.close(); } |
查询数据,以查询评论信息为例:
public Cursor queryComment(){ SQLiteDatabase db=getWritableDatabase(); Cursor c=db.query("COMMENT",null,null,null,null,null,null); return c; } |
有了数据库的基础,在接着继续完成其他功能。
- 登陆模块实现
登陆模块没有在在整体设计里面体现,因为这个模块式独立于整体,和管理员和用户都有关系,所以在这里单独拿出来进行分析。登陆模块主要是完成登陆的判定,判断用户类型,判断用户密码,用户名是否正确,和数据库的查询链接紧密。下面详细讲解登陆模块的设计,主要分为UI设计和逻辑功能设计
(1) UI界面设计
设计采用XML分离布局技术,UI设计和逻辑设计分离开来,使得代码更加可控,
下面简要介绍一下界面的代码,以一个按钮为例,由于代码较多,故在后面的模块分析中就不一一展示代码了:
以登陆按钮的控制代码为例:
android:id="@+id/btnLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/layout06" android:layout_marginLeft="10dip" android:layout_marginRight="10dip" android:layout_marginTop="10dip" android:orientation="horizontal" >
|
下面是UI设计的效果图:
逻辑设计,
首先判断用户类型,在通过数据库查询是否是合法用户,确保其通过。下面是实现代码:
@Override public void onClick(View arg0) { // TODO Auto-generated method stub String mStr_name = userName.getText().toString(); String mStr_pwd = userPwd.getText().toString(); User user = User.getInstance(mStr_name,mStr_pwd); //查询是否有这个用户 //MyDBHelper helper=new MyDBHelper(this);
if(mStr_name.equals("admin") && mStr_pwd.equals("admin")){ Intent intent=new Intent(getApplicationContext(),AdminMainActivity.class); user.setName("管理员"); startActivity(intent); }else{ Cursor c = helper.queryUser(); if(c.moveToFirst()){ for(int i=0;i c.move(i); String name=c.getString(1); String pwd=c.getString(2); if(mStr_name.equals(name)&&mStr_pwd.equals(pwd)){ //登陆成功 //写入用户信息 user.setName(name); user.setAddress(c.getString(3)); user.setTelephone(c.getString(4)); Toast.makeText(getApplicationContext(), "登陆成功", Toast.LENGTH_SHORT).show(); Intent intent=new Intent(getApplicationContext(), UserActivity.class); startActivity(intent); finish(); return; }else{ //Toast.makeText(getApplicationContext(), "登陆失败", Toast.LENGTH_SHORT).show(); } } } Toast.makeText(getApplicationContext(), "登陆失败,用户名或密码错误", Toast.LENGTH_SHORT).show(); } //Toast.makeText(getApplicationContext(), "登陆失败", Toast.LENGTH_SHORT).show(); } |
2 . 用户模块
用户模块的设计思路主要是为了方便用户在线订水而设计,该模块又划分为6个子模块,分别是在线订水、订单查询、信息管理、在线支付、服务评价、查询评论,下面对这几个模块具体介绍:
(1) 在线订水
在线订水主要是为了满足在校大学生可以足不出户就可以完成订水的需求,可以大大方便学生的生活。
UI设计:
逻辑设计:
将订单存放到数据库之中:
ublic class ApplyWaterActivity extends AbActivity { private EditText userName = null; private EditText waterNum = null; private EditText userAddress=null; private EditText userTel=null; private EditText userTime=null; private Button btnYD=null; private MyDBHelper helper=null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setAbContentView(R.layout.applywater); //application = (MyApplication)abApplication; this.setTitleText("当前用户:"+User.getInstance().getName()); this.setLogo(R.drawable.button_selector_back); this.setTitleLayoutBackground(R.drawable.top_bg); this.setTitleTextMargin(10, 0, 0, 0); this.setLogoLine(R.drawable.line); helper=new MyDBHelper(getApplicationContext()); userName=(EditText)findViewById(R.id.userNameapply); userTel=(EditText)findViewById(R.id.userTelapply); userAddress=(EditText)findViewById(R.id.userAddressapply); waterNum=(EditText)findViewById(R.id.userNumapply); userTime=(EditText)findViewById(R.id.userNumapplytime); btnYD=(Button)findViewById(R.id.Btnapply);
btnYD.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View arg0) { // TODO Auto-generated method stub ContentValues cv=new ContentValues(); cv.put("name", userName.getText().toString()); cv.put("tel", userTel.getText().toString()); cv.put("address", userAddress.getText().toString()); cv.put("num", waterNum.getText().toString()); cv.put("thetime", userTime.getText().toString());
helper.insertDingdan(cv); Toast.makeText(getApplicationContext(), "预定成功,请支付", Toast.LENGTH_SHORT).show(); finish(); } }); } } |
(2) 订单查询
订单查询模块,主要是满足用户在线查询自己订单情况,及时掌握预定的桶装水的位置及送达的时间
UI设计:
订单查询模块在UI设计上采用白班,在逻辑代码中动态加载,因为订单可以有,也可以没有,故直接介绍逻辑设计
逻辑设计:
订单查询这一项是将数据从数据库中取出来,展示到界面中,供用户查询,采用了List链表的数据结构,所以看到的结果是一个列表,主要实现代码如下:
//查看所有订单 public class LookDDActivity extends AbActivity{ private MyDBHelper helper=null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setAbContentView(R.layout.main); this.setTitleText("当前用户:"+User.getInstance().getName()); this.setLogo(R.drawable.button_selector_back); this.setTitleLayoutBackground(R.drawable.top_bg); this.setTitleTextMargin(10, 0, 0, 0); this.setLogoLine(R.drawable.line); helper=new MyDBHelper(getApplicationContext());
//获取ListView对象 ListView mListView = (ListView)this.findViewById(R.id.mListView);
//ListView数据 List Map Cursor c = helper.queryDingdan(); if(c.moveToFirst()){ for(int i=0;i c.move(i); int id=c.getInt(0); String name=c.getString(1); String tel=c.getString(2); String address=c.getString(3); int num=c.getInt(4); String time=c.getString(5); map = new HashMap map.put("itemsIcon",R.drawable.tong); map.put("itemsTitle", "订单"+id); map.put("itemsText", "订单者:"+name+"\n电话:"+tel+"\n地址:"+address+"\n数量:"+num+"桶"+"\n送水时间:"+time); list.add(map); } } //使用自定义的Adapter MyListViewAdapter myListViewAdapter = new MyListViewAdapter(this, list,R.layout.list_items, new String[] { "itemsIcon", "itemsTitle","itemsText" }, new int[] { R.id.itemsIcon, R.id.itemsTitle,R.id.itemsText }); mListView.setAdapter(myListViewAdapter); } } |
(3) 信息管理
信息管理模块主要是满足用户修改自己的信息,包括宿舍号,电话号码,密码等等,
UI设计:
信息修改由于和注册界面有很大的相似度,故直接沿用注册界面的UI代码,做到了代码复用,大大提高了开发效率。
逻辑设计:
在信息管理模块中,将用户信息从数据库中取出,展示到界面中,然后用户修改之,点击确认修改,即可将更新的数据放入数据库,主要代码如下:
public class ModifyInfoActivity extends AbActivity{ private EditText userName = null; private EditText userPwd = null; private EditText userAddress=null; private EditText userTel=null; private Button btnRegister=null; private MyDBHelper helper=null; private TextView textView=null; private User user; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setAbContentView(R.layout.register); this.setTitleText("当前用户:"+User.getInstance().getName()); this.setLogo(R.drawable.button_selector_back); this.setTitleLayoutBackground(R.drawable.top_bg); this.setTitleTextMargin(10, 0, 0, 0); this.setLogoLine(R.drawable.line); helper=new MyDBHelper(this); user=User.getInstance();
userName=(EditText)findViewById(R.id.userNameRegister); userPwd=(EditText)findViewById(R.id.userPwdRegister); userAddress=(EditText)findViewById(R.id.userAddressRegister); userTel=(EditText)findViewById(R.id.userTelRegister); btnRegister=(Button)findViewById(R.id.BtnRegister); textView=(TextView)findViewById(R.id.registerTitle); textView.setText("用户信息修改"); btnRegister.setText("确认修改"); userName.setText(user.getName()); userPwd.setText(user.getPassword()); userAddress.setText(user.getAddress()); userTel.setText(user.getTelephone());
// btnRegister.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View arg0) { // TODO Auto-generated method stub ContentValues cv=new ContentValues(); cv.put("name", userName.getText().toString()); cv.put("pwd", userPwd.getText().toString()); cv.put("address", userAddress.getText().toString()); cv.put("telephone", userTel.getText().toString()); helper.updateUser(cv); Toast.makeText(getApplicationContext(), "信息修改成功", Toast.LENGTH_SHORT).show(); finish(); } });
} } |
(7) 在线支付
在线支付模块用于支付订单信息,可以实现交易无纸化,该模块预期完成微信和支付宝两种主流在线支付模式的接口对接,这里调用的是支付宝盒微信的接口,直接利用现有接口,大大减轻了开发难度,下面是效果:
(8) 服务评价
服务评价模块主要是为了方便用户对饮水公司的服务情况进行反馈,一是方便广大用户满足自己发声的需求,另一方面也可以方便饮水公司改进自己的服务质量,在这一章中,和之前的设计思路相似,这里只展示部分逻辑代码:
ListView mListView = (ListView)this.findViewById(R.id.mListView);
//ListView数据 List Map Cursor c = helper.queryComment(); if(c.moveToFirst()){ for(int i=0;i c.move(i); String name=c.getString(1); String content=c.getString(2); map = new HashMap map.put("itemsIcon",R.drawable.image_bg); map.put("itemsTitle", "评论人"+name); map.put("itemsText", "内容:"+content); list.add(map); } } //使用自定义的Adapter MyListViewAdapter myListViewAdapter = new MyListViewAdapter(this, list,R.layout.list_items, new String[] { "itemsIcon", "itemsTitle","itemsText" }, new int[] { R.id.itemsIcon, R.id.itemsTitle,R.id.itemsText }); mListView.setAdapter(myListViewAdapter); |
(9) 查询评论
查询评论这一模块主要是为了方便用户查看其他用户对饮水公司的评价,以实现消费前货比三家的消费习惯,帮助自己决策是否购买该饮水公司的饮用水。在这一个模块里面和订单查询的设计思路基本一致,不在做过多介绍
2. 管理员模块
管理员模块实际上提供给饮水公司使用的模块,通过这个模块,饮水公司可以在线管理订单,及时发水给学生。方便快捷,还可以对库存进行管理。特别方便实用。该模块主要分为管理订单,查看评论,库存管理三个模块,由于管理员模块和用户模块有很多相似的地方,故这里就只做简要介绍,不再展示代码了。
(4) 管理订单
管理订单模块主要是为了方便饮水公司在线管理自己的订单,通过管理订单可以做到及时发货,以满足学生们的饮水需求
(5) 查看评论
查看评论模块主要是为了方便饮水公司搜集用户满意度,以给自己做出服务方式转变的决策提供依据,不断提高服务水平。
(6) 库存管理
库存管理模块可以方便饮水公司对自己的库存量进行管理,以满足科学管理,平衡供求关系的目的。
系统测试
软件测试的目的主要是测试软件的界面是否与设计的效果吻合、运行效果是否良好、功能是否完善、性能是否稳定。软件的测试内容主要包括功能测试、兼容性测试两项。
测试环境如表所示。
测试环境表
软件环境(相关软件、操作系统等) |
操作平台:Windows 7 |
JDK:1.7 |
Android SDK:2.3 |
编程软件:Eclipse KEPLER |
硬件环境(网络、设备等) |
手机:HTC g14 |
内存:512M |
系统:Android 2.3.2 |
驱动:HTC g14手机驱动 |
硬件:带有USB2.0接口的台式一台、装有Android4.0系统的魅族M9手机一部、USB线一根,手机USB接口与电脑的USB接口通过USB保持线相连并处于同步状态。
软件:Eclipse KEPLER、Android ADT 17集成开发环境、Android 2.3 SDK、HTC g14手机驱动。
在电脑系统调试状态,可以使电脑与HTC g14手机连接后保持同步。通过Eclipse中DDMS的Device可以对软件的运行画面截屏,通过集成环境的LogCat可以对软件的运行情况进行分析。
功能测试
功能测试也叫黑盒测试或数据驱动测试,只需考虑各个功能,不需要考虑整个软件程序的内部结构及代码,一般从软件的界面、架构出发,编写测试用例进行操作,在预期结果和实际结果之间进行评测,进而提出更改策略,使产品达到软件说明书定义的要求。
软件的功能测试需要测试软件的功能是否完整、各项功能是否与预期相符等。功能测试如表所示
测试目标 |
通过测试达到以下目标: 测试软件是否达到设计的要求,包括各功能模块是否已实现,业务流程是否正确。 系统运行是否稳定,性能是否在可接受范围。 |
测试范围 |
在需求中明确给出的功能模块。 |
技术 |
通过设计测试用例,采用黑盒测试执行各个用例来进行测试。 |
开始标准 |
用户开启高校饮用水配送管理系统主界面,正常进行使用 |
完成标准 |
功能流程及操作使用达到预期设计标准。 |
测试重点和优先级 |
测试重点:软件兼容性和数据库数据。 优先级:软件兼容性>数据库数据>其他功能 |
需考虑的特殊事项 |
运行时是否出现异常退出情况 |
主要对软件的运行环境和功能进行了测试,通过测试,证明软件运行良好,与预期基本相符。
以上是论文截取部分比较关键内容:
代码之间工作室,专业计算机程序设计。
技术交流QQ群:439261058
商务合作加QQ:1215714557