西柚ii

导航

 

 

 

基于Android二手交易系统的设计与实现

一、项目背景

随着社会经济的发展,人们节约意识的提高。二手物品,已不再是以往废品次品的代名词,人们已经逐渐接收了二手物品买卖的概念。随着生活水平的提高,人们的物质生活的追求也越来越来地向高档次发展。一些日常使用的物品也出现了在本身没有瑕疵的情况下被淘汰的情况。身边越来越多的人们经济条件变得宽裕,随之带来了更大的购买力,更多物品的购买必然导致更多的物品多余,必然会产生资源的浪费。既然有资源的多余,就不可避免地有关于剩余资源处理的问题。

而二手物品交易系统是一个服务于广大用户的交易系统,通过系统用户可自由增删改查商品,为广大用户提供了平等互利、方便快捷的交易空间。二手交易系统从客观上提高在人们的生活水平。比起传统的二手交易,网上二手交易更加迅捷,实时性强,信息充裕,发展空间巨大。 

二、系统需求分析

2.1功能需求分析

本系统要求是支持Android手机的二手交易系统。以满足用户能随时随地管理店铺需求,实现功能如下。
(1)可以根据商品种类浏览所需商品
(2)可以对店铺商品进行入库、删除商品、添加商品、修改商品信息等操作
(3)可以查看个人资料,如微信、所在地区等

(4) 可以通过按钮进行退出程序操作。

2.2功能描述

登陆界面:打开程序,进入程序,用户登录。

主菜单界面根据所需分类浏览商品

管理界面对商品进行入库、删除不需要的商品、修改商品库存、查询商品信息

我的资料:可以浏览个人信息,如微信号、所在地区等

2.3用例分析

  用例图如2.3所示

              

图2.3 二手交易系统用例图

 

(1) 用例名称:登录

说明:登录系统,请求结果是成功登陆界面或登录失败。

(2) 用例名称:主页

说明:登陆成功后,会进入主页,看见商品类别,根据自己所需进行商 品的浏览。

(3) 用例名称:管理界面

说明:进入管理界面可以输入商品名称、库存、单价、种类等信息,对    商品进行入库、删除、修改、查询等操作。

(4) 用例名称:我的资料

说明:这个界面可以设置管理者的微信、昵称、设置备注、电话号码、   地区以及个性签名,在这个界面也可以进行退出程序的操作。

三、系统设计

3.1数据逻辑模型

二手交易管理系统E-R图如图2.1所示

                                                  

图3.1二手交易系统E-R图

 

3.2.系统总体设计

在使用二手交易系统的时候是要求先登录的,在登录之后就可以使用上图所示功能,允许管理员对商品进行管理包括商品入库、修改商品信息、删除商品和查询商品信息等操作。允许管理员对商品进行浏览、分类处理。管理员还可以查看到自己的个人资料设置个性签名、昵称等操作,还有一个退出系统的功能。

                                                

 

 

 

图3.2 二手交易系统功能图

3.3系统数据库设计

根据前面E-R图设计出实现系统功能所需要的数据库表的结构,并以表格的形式列出每一个数据库表的表结构,即字段名、类型、长度、小数位数、是否主键、索引、是否允许为空、说明等。并介绍表与表之间的逻辑关系。如下表所示:

information表结构

字段名

数据类型

长度

主键

索引

外键

说明

Name

Varchar

20

 

姓名

Kucun

Varchar

20

 

库存

Danjia

Varchar

20

 

单价

Jianjie

Varchar

20

 

种类

四、系统实现
4.1 .1欢迎界面

进入系统设计了一个欢迎界面,持续时长为三秒,之后将显示到登陆界面。效果图如下:

                                                                                       

关键代码如下:

public class WelcomeActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_welcome);
        //欢迎界面3秒后跳转到登陆界面
        handler.sendEmptyMessageDelayed(0,3000);
    }
//单独线程计时器。避免线程错误
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            getHome();
            super.handleMessage(msg);
        }
    };
    public void getHome(){
        Intent intent = new Intent(WelcomeActivity.this, LoginActivity.class);
        startActivity(intent);
        finish();
    }

}

4.1.2登陆界面

关键代码如下:

package com.example.administrator.secondhandtrade;

import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class LoginActivity extends Activity implements View.OnClickListener {
    private static final String TAG = "login";
    Button loginBtn = null;
    EditText useridEt = null;
    EditText passEt = null;
    TextView promptText = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        loginBtn = (Button) findViewById(R.id.loginBtn);
        loginBtn.setOnClickListener(this);
        useridEt = (EditText) findViewById(R.id.userId);
        passEt = (EditText) findViewById(R.id.pass);
        promptText = (TextView) findViewById(R.id.promptText);

    }
    //点击登录的时候做出判断、账户名或者密码不能为空
    //用户名为:admin
    //密码为:admin
    @Override
    public void onClick(View v) {
        String userid = useridEt.getText().toString().trim();
        String pass = passEt.getText().toString().trim();
        if(userid.equals("")){
            promptText.setText("用户名不能为空。");
            return ;
        }
        if(pass.equals("")){
            promptText.setText("密码不能为空。");
            return ;
        }
        if (userid.equals("admin") && pass.equals("admin")) {
            Toast.makeText(this, "登录成功", Toast.LENGTH_LONG).show();
            Intent intent_hello = new Intent(this,MainActivity .class);
            startActivity(intent_hello);
            LoginActivity.this.finish();
        } else {
            Toast.makeText(this,"登录失败", Toast.LENGTH_LONG).show();
        }

    }
}

4.1.3 系统主页界面

                                                 

 

 

 

关键代码如下:

public class MainActivity extends AppCompatActivity
        implements View.OnClickListener
{

    private TexextMessage;
    private ListView lv1;
    MyHelper myHelper;
    private EditText etName;
    private EditText etPhone;
    private TextView TvShow;
    private EditText etPwd;
    private EditText etAdress;
    private Button btnAdd;
    private Button btnQuery;
    private Button btnUpdate;
    private Button btnDelete;
    private LinearLayout layout1;
    private LinearLayout layout2;
    private LinearLayout layout3;
    private Button bt6;
    //初始化主页的图标
    private String[] names = { "书籍","日杂","电器"};

    private int[]  icons = {R.drawable.sj,R.drawable.zh,R.drawable.dq};
    public static List<Activity> activityList = new LinkedList();

    private TextView mTextMessage;
    //点击底部导航栏跳转
    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {

        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()) {
                //点击底部导航栏的跳转事件
                case R.id.navigation_home:
                    layout1.setVisibility(View.VISIBLE);
                    layout2.setVisibility(View.GONE);
                    layout3.setVisibility(View.GONE);
                    return true;
                case R.id.navigation_dashboard:
                    layout2.setVisibility(View.VISIBLE);
                    layout1.setVisibility(View.GONE);
                    layout3.setVisibility(View.GONE);
                    return true;
                case R.id.navigation_notifications:
                    layout3.setVisibility(View.VISIBLE);
                    layout2.setVisibility(View.GONE);
                    layout1.setVisibility(View.GONE);
                    return true;
            }
            return false;
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MainActivity.activityList.add(this);
        mTextMessage = (TextView) findViewById(R.id.message);
        layout1=findViewById(R.id.layout1);
        layout2=findViewById(R.id.layout2);
        layout3=findViewById(R.id.layout3);
        layout1.setVisibility(View.VISIBLE);
        layout2.setVisibility(View.GONE);
        layout3.setVisibility(View.GONE);
        mTextMessage = (TextView) findViewById(R.id.message);
        BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);

        init();

        myHelper = new MyHelper(this);
        lv1 = (ListView) findViewById(R.id.lv_sp);
        //Adapter 的注册命名
        MyBaseAdapter mAdapter = new MyBaseAdapter();
        // 添加Adapter
        lv1.setAdapter(mAdapter);
        lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View view, int position,
                                    long id) {
                switch (position) {
                    case 0:
                        Intent intent=new Intent(MainActivity.this,BookActivity.class);
                        startActivity(intent);
                        break;
                    case 1:
                        Intent intent1=new Intent(MainActivity.this,RzActivity.class);
                        startActivity(intent1);
                        break;
                    case 2:
                        Intent intent2=new Intent(MainActivity.this,DqActivity.class);
                        startActivity(intent2);
                        break;
                    default:
                        break;
                }
            }
        });
    

4.1.4分类查看

          

关键代码如下:

public class BookActivity extends AppCompatActivity {

    private String[] names = new String[]{"阳光", "红尘往事", "奥运的人文价值","阳光", "红尘往事", "奥运的人文价值","阳光", "红尘往事", "奥运的人文价值","阳光", "红尘往事", "奥运的人文价值"};
    private int[]  icons = {R.drawable.yg,R.drawable.hc,R.drawable.ay,R.drawable.yg,R.drawable.hc,R.drawable.ay,R.drawable.yg,R.drawable.hc,R.drawable.ay,R.drawable.yg,R.drawable.hc,R.drawable.ay};
    private ListView mListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_book);
        mListView = (ListView) findViewById(R.id.book);
        MyBaseAdapter mAdapter = new MyBaseAdapter();
        mListView.setAdapter(mAdapter);
    }
    class MyBaseAdapter extends BaseAdapter {

        public int getCount() {
            return names.length;
        }

        public Object getItem(int position) {
            return names[position];
        }

        // Item的id
        public long getItemId(int position) {
            // ListView Item id
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            // list_item.xml布局View
            View view = View.inflate(BookActivity.this, R.layout.list_item,
                    null);
            // 联系list_item.xml的TextView
            TextView mTextView = (TextView) view.findViewById(R.id.tv_list);
            ImageView imageView = (ImageView) view.findViewById(R.id.image);
            mTextView.setText(names[position]);
            imageView.setBackgroundResource(icons[position]);
            return view;
        }
    }

4.1.5管理界面

 

 

 

 

 

关键代码如下:

public void onClick(View v) {
    SQLiteDatabase db;
    ContentValues values;
    switch(v.getId()) {
        case R.id.btn_add:
            String name = this.etName.getText().toString();
            String shuliang = this.etPhone.getText().toString();
            String pwd = this.etPwd.getText().toString();
            String jianjie = this.etAdress.getText().toString();
            db = this.myHelper.getWritableDatabase();
            values = new ContentValues();
            values.put("name", name);
            values.put("kucun", shuliang);
            values.put("danjia", pwd);
            values.put("jianjie", jianjie);
            db.insert("information", (String)null, values);
            Toast.makeText(this, "添加信息成功", 0).show();
            db.close();
            break;
        case R.id.btn_query:
            db = this.myHelper.getReadableDatabase();
            Cursor cursor = db.query("information", (String[])null, (String)null, (String[])null, (String)null, (String)null, (String)null);
            if(cursor.getCount() == 0) {
                this.TvShow.setText("");
                Toast.makeText(this, "没有这条数据", 0).show();
            } else {
                cursor.moveToFirst();
                this.TvShow.setText("名称 :  " + cursor.getString(1) + " ,库存 :  " + cursor.getString(2) + ",单价:" + cursor.getString(3) + ",种类 :" + cursor.getString(4));
            }

            while(cursor.moveToNext()) {
                this.TvShow.append("\n名称 :  " + cursor.getString(1) + " ,库存 :  " + cursor.getString(2) + ",单价:" + cursor.getString(3) + ",种类 :" + cursor.getString(4));
            }

            cursor.close();
            db.close();
            break;
        case R.id.btn_update:
            db = this.myHelper.getWritableDatabase();
            values = new ContentValues();
            values.put("kucun", this.etPhone.getText().toString());
            values.put("danjia", this.etPwd.getText().toString());
            values.put("jianjie", this.etAdress.getText().toString());
            db.update("information", values, "name=?", new String[]{this.etName.getText().toString()});
            db.update("information", values, "danjia=?", new String[]{this.etPwd.getText().toString()});
            db.update("information", values, "jianjie=?", new String[]{this.etAdress.getText().toString()});
            Toast.makeText(this, "信息已修改", 0).show();
            db.close();
            break;
        case R.id.btn_delete:
            db = this.myHelper.getWritableDatabase();
            db.delete("information", "name=?", new String[]{this.etName.getText().toString()});
            Toast.makeText(this, "信息已删除", 0).show();
            this.TvShow.setText("");
            db.close();
    }

}

class MyBaseAdapter extends BaseAdapter {

        public int getCount() {
            return names.length;
        }

        public Object getItem(int position) {
            return names[position];
        }


        public long getItemId(int position) {

            return position;
        }


        public View getView(int position, View convertView, ViewGroup parent) {

            // 用item的布局用在listview中。
            View view = View.inflate(MainActivity.this, R.layout.item,
                    null);
            TextView mTextView = (TextView) view.findViewById(R.id.tv_list);
            ImageView imageView = (ImageView) view.findViewById(R.id.image1);
            mTextView.setText(names[position]);
            imageView.setBackgroundResource(icons[position]);
            return view;
        }
    }

}

4.1 .6我的资料

                                                 

 

 

 

 

 

关键代码如下:

 

//点击按钮bt6退出程序

bt6.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                exit();
            }
        });

    }

//布局如下:

<LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:gravity="center"
                    android:text="我的资料"
                    android:textColor="#ffffff"
                    android:textSize="18sp" />
            </LinearLayout>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"></LinearLayout>
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="70dp"
            android:layout_marginBottom="20dp"
            android:layout_marginTop="10dp"
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/touxiang"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_marginBottom="10dp"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="20dp"
                android:layout_marginTop="10dp"
                android:src="@drawable/a" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="70dp"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/name"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="wenwen"
                    android:textSize="20sp" />

                <TextView
                    android:id="@+id/weixin"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="微信:*******"
                    android:textSize="15sp" />

                <TextView
                    android:id="@+id/nichen"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="昵称:wuwuwu"
                    android:textSize="15sp" />
            </LinearLayout>
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="90dp"
            android:orientation="vertical">

            <TextView
                android:id="@+id/bt2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="0.1dp"
                android:gravity="left"
                android:paddingTop="15dp"
                android:text="设置备注:***"
                android:textSize="20sp" />

            <TextView
                android:id="@+id/bt3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="left"
                android:paddingTop="15dp"
                android:text="电话号码:177**********"
                android:textSize="20sp" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="140dp"
            android:orientation="vertical">

            <TextView
                android:id="@+id/bt4"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="0.1dp"
                android:gravity="left"
                android:paddingTop="15dp"
                android:text="地区:中国"
                android:textSize="20sp" />


            <TextView
                android:id="@+id/bt66"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="left"
                android:paddingTop="15dp"
                android:text="个性签名:如果感到快乐你就拍拍手。
"
                android:textSize="20sp" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="140dp"
            android:layout_marginTop="30dp"
            android:orientation="vertical">

            <Button
                android:id="@+id/bt6"
                android:layout_width="300dp"
                android:layout_height="40dp"
                android:layout_gravity="center_horizontal"
                android:background="#7d6cd2"
                android:gravity="center"
                android:text="退出程序"
                android:textSize="20sp" />
        </LinearLayout>
    </LinearLayout>

 

五、 系统测试

5.1测试实例的选择
  明确测试需求后制定出合适的测试计划和测试策略,做好测试前的准备,将会使系统的测试工作更加有秩序且顺利进行。通过测试,验证成果是否达到设计要求,是否存在bug且性能是否良好,是否稳定安全,并针对测试结果做出相应的解决措施。
解忧杂货铺系统的测是试基本依照下面的几种类型来进行:

(1)数据和数据库完整性测试
  利用特殊数据对数据库反复进行增删改查等操作的测试,测试数据在软件上是否能够用有效且正确地显示,确保数据在数据库的逻辑上能保持一致性和相容性,确保数据在数据库上能够正确有效地运行。
(2)功能测试
功能测试,也叫黑盒测试,即不用去研究程序里面的内部构造和运行原理,编写测试用例来验正测试结果是否与预计结果保持一致,从而判断软件是否达到预期效果或是否存在bug等,来确保各功能模块的正常运行。
(3)整体界面测试
通过测试保证用户能够更好的使用软件提供的服务。该测试主要包括:软件整体界面的美观性和是否具有特色,功能使用的简易性,操作是否简单,按键位置是否顺手等。通过界面测试,确保用户有更好的使用体验。


5.2实例测试
确定好测试环境和测试方法后,便可以开始为杂货铺系统进行测试。下面将以表格的形式列出测试工作过程中儿项测试内容和测试结果,并将测试结果与预期结果作比较,分析出得到最终结果的原因。

6.1 实例一

测试目的:测试管理员能否正常登陆。

测试过程:

预期结果:

登录时用户名和密码不写

不能登陆

登录账号不存在

不能登陆

登陆密码错误

不能登陆

登陆密码和用户名都正确

正常登陆

测试实际结果:

登录时用户名和密码不写,会提示用户名不能为空。

登录账号不存在,会提示登陆失败。

登陆密码错误,会提示密码不能为空。

登陆密码和用户名都正确,正常登陆。


6.2 实例二

测试目的:测试增、删、改、查功能。

测试过程:

预期结果:

在管理页面查看已经入库商品

可以查找到

修改商品的种类、库存、单价等信息

成功修改

增加新的商品

成功添加

删除指定商品

删除成功

测试实际结果:

添加多个商品后,无法查看后续加入的商品。(调试方法:将换行去掉后可看到后面的商品信息)

商品信息录入不全时,则未填写的信息处无任何数据。

所有功能全部实现。

 

测试结果截图如下:

        

 

 

             

          成功登陆                            登录失败

         

 

 

                商品入库                                     查询商品信息

 

        

   修改商品信息                                  删除商品信息

  

 

 商品入库                            查询商品信息

六、总结

经过一段时间的努力,基本实现了商品信息查询、商品入库,商品信息的修改以及删除商品的功能。总体上基本符合预期要达到的需求和效果。
  由于原本自己基础较差,编程能力和动手实践能力都比较弱,所以完成本次课题花费了较大的时间去学习所需要的知识。本次课题虽然基本实现了功能,但还是存在着许多不足的地方,如细节处理不够好,功能不够完善只实现了基本的功能。代码冗余量也相对比较大,重复性的工作比较多。但是从总体上讲,该二手交易系统基本上完成了需求,达到了预期的效果。
  通过这次课程设计,对于系统设计的理念更为明确,对Android studio这款软件的运用真的熟悉掌握了不少。相信在以后的系统设计中,我能够吸取经验和教训,能力不断提高。多自学一点,不要老是为自己的懒找借口。在这次开发过程中,我不仅巩固了原有的知识,还学到了许多以前所不知道的知识与技能。现时,我的编程能力和动手实践能力也得到了大幅度的提高。在这个过程中,会遇到许多料想不到的问题。面对这些问题,我也不再像以前那样手足无措,而是学会了如何去思考,分析问题并解决问题。因此在解决问题的过程中我查阅文献和资料的能力也得到了很大的提高。有时候遇到bug,在老师同学的帮助下也能够顺利解决,这让我懂得了团队协作在一个项目过程中的重要性。在这次课程设计设计过程中,我学到了许多东西,受益匪浅,我相信这对我今后的工作学习生活中会给我带来莫大的帮助。

附件1

课设题目二手交易系统

技术说明

本设计实现了基于Android的二手交易系统。系统采用JAVA语言编写,以嵌入式数据库SQLite保存数据,主要包括对商品名称、数量、单价、种类的增删改查操作,已实现店铺里商品的管理工作。

UML类图

 

 

 

 

 

代码

清单文件:

 

 

 

 

 

布局文件:

  

 

 

 

 

 

 

 

 

 

 

Java原码

 

 

 

 

类说明

WelcomeActivity:欢迎界面3秒后跳转到登陆界面

LoginActivity输入账号密码,点击登录的时候做出判断、账户名或者密码能为空登陆成功后跳转至MainActivity

MainActivity:包含三个按钮,分别为主页、管理、我的。

(1)主页中含有三个监听事件书籍、日杂、电器。点击书籍、日杂、电器   会分别跳转至BookActivity、RzActivity、DqActivity。通过Intent,   Android发出请求,并通过调用现有方法激活一个新的Activity。

(2)管理界面中名称、库存、单价、种类后面添加监听事件 点击入库、删   除、修改按钮将数据库的information表的数据进行增加,删除或修    改。点击查询按钮在界面下方显示数据库中的商品信息。

(3)我的界面中显示‘我的资料’,还设置有退出程序按钮,点击按钮将   退出程序

BookActivity、RzActivity、DqActivity:通过adapter将数据传输到listview上,显示不同种类的商品信息

 

posted on 2019-12-05 22:54  西柚ii  阅读(417)  评论(0编辑  收藏  举报