Android课设报告 123 赵乾

时间:2022-06-20 06:36:29

基于Android的天喵购物系统设计与实现

,选题目的及意义

随着智能手机的普及,基于Android平台的应用软件需求也越来越多。通过计算机系统的设计与开发,验证和扩展本科前三年所学相关课程的理论知识,在实践中深入理解其中的重点和难点,提高基本理论水平,巩固基础知识体系,掌握计算机系统设计与开发的基本技能,培养灵活运用理论知识分析和解决实际问题的能力。

当下我们处于大数据网络时代,无疑,网上购物脱颖而出,即马云阿里巴巴成立以来,网上购物成为人民日益需求的购物来源,而其简单便捷,足不出户便能买到自己喜欢的物品,深受大众喜爱。所以我在此选题制作天喵购物系统。

  1. 使用的技术

(1) UI设计:用于页面设计。

(2) SQLite数据库:用于购物车功能的实现,并加入增删改查功能。

(3) Activity组件的应用:用于多Activity的切换。

(4) ListView的使用:用于页面布局。

(5) MD5算法的使用:用于用户注册。

 

字段名

数据类型

长度

主键

索引

外键

Name

Char

50

 

Balance

Int

11

 

 

 

 

 

二,系统需求分析

2.1 用户需求

天喵购物系统,可用于电子商务等电商的卖货平台,提供一个网上交易的机会,并支持更新与维护,使用方便,易用性强。该系统实现的大致功能;用户注册登陆。提供了货物信息的查询,添加,修改,删除;用户信息的录入,修改,删除,查询等功能。管理员管理拥有最高的权限。

2.2 功能需求

1.系统登录:在开始界面中添加三个底部导航按钮,能够分别进入物品分类界面和我的管理界面,我管理界面分别布置了三个按钮,分别进行用户登录注册,用户个人信息及购物车页面,然后通过activity之间的互相跳转实现各模块功能。

2.添加商品信息:可在我的购物车界面打开显示,通过输入已添加的物品信息快速查询商品信息。

3.修改商品信息:设计思路与添加商品信息类似,可以对已经添加的商品信息进行修改。

4、删除商品信息:选择想要删除的商品信息后点击垃圾桶按钮即可完成删除功能,可以删除已经添加的商品信息。

 

 

 

2.3 UML类图

                                            天喵购物系统

 

 

 

 

 Android课设报告 123 赵乾

 

 

 

 三.系统的设计,实现和测试

1.系统的设计

 

1.1例图分析

 

 Android课设报告 123 赵乾

 

 

 3.1天喵购物系统E-R图

 

1.2文件列表

 

 Android课设报告 123 赵乾Android课设报告 123 赵乾

 

 

 

 

 

 

 

 

 

 

 2.系统的实现

原文件代码

 

Java MainActivity原码

package com.neusoft.constellation;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {


    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {

        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            Intent intent = null;
            switch (item.getItemId()) {
                case R.id.navigation_home:
                    return true;
                case R.id.navigation_dashboard:
                    intent = new Intent(MainActivity.this, ShopActivity.class);
                    startActivity(intent);
                    return true;
                case R.id.navigation_notifications:
                    intent = new Intent(MainActivity.this, MyActivity.class);
                    startActivity(intent);
                    return true;
            }
            return false;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
    }

}

 

类说明:主页面即通过底部导航跳转到其他页面

 

Java Main2Activity原码

 

package com.neusoft.constellation;

import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;


public class Main2Activity extends AppCompatActivity {
    private String userName,psw,spPsw;
    private EditText et_user_name,et_psw;
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        init();
    }

    private void init() {
        TextView tv_register = (TextView) findViewById(R.id.tv_register);
        TextView tv_find_psw = (TextView) findViewById(R.id.tv_find_psw);
        Button btn_login = (Button) findViewById(R.id.btn_login);
        et_user_name= (EditText) findViewById(R.id.et_user_name);
        et_psw= (EditText) findViewById(R.id.et_psw);

        tv_register.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent=new Intent(com.neusoft.constellation.Main2Activity.this, RegisterActivity.class);
                startActivityForResult(intent, 1);
            }
        });

        tv_find_psw.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(com.neusoft.constellation.Main2Activity.this, LostFindndActivity.class));
            }
        });

        btn_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                userName = et_user_name.getText().toString().trim();
                psw = et_psw.getText().toString().trim();

                String md5Psw = MD5Utils.md5(psw);

                spPsw = readPsw(userName);

                if (TextUtils.isEmpty(userName)) {
                    Toast.makeText(com.neusoft.constellation.Main2Activity.this, "请输入用户名", Toast.LENGTH_SHORT).show();
                } else if (TextUtils.isEmpty(psw)) {
                    Toast.makeText(com.neusoft.constellation.Main2Activity.this, "请输入密码", Toast.LENGTH_SHORT).show();

                } else if (md5Psw.equals(spPsw)) {
                    Toast.makeText(com.neusoft.constellation.Main2Activity.this, "登录成功", Toast.LENGTH_SHORT).show();
                    saveLoginStatus(true, userName);
                    Intent data = new Intent();
                    data.putExtra("isLogin", true);
                    setResult(RESULT_OK, data);
                    com.neusoft.constellation.Main2Activity.this.finish();
                    startActivity(new Intent(com.neusoft.constellation.Main2Activity.this, MainActivity.class));
                } else if ((spPsw != null && !TextUtils.isEmpty(spPsw) && !md5Psw.equals(spPsw))) {
                    Toast.makeText(com.neusoft.constellation.Main2Activity.this, "输入的用户名和密码不一致", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(com.neusoft.constellation.Main2Activity.this, "此用户名不存在", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    private String readPsw(String userName){
        SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE);
        return sp.getString(userName , "");
    }
    private void saveLoginStatus(boolean status,String userName){
        SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE);
        SharedPreferences.Editor editor=sp.edit();
        editor.putBoolean("isLogin", status);
        editor.putString("loginUserName", userName);
        editor.apply();
    }

    @Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(data!=null){
            String userName=data.getStringExtra("userName");
            if(!TextUtils.isEmpty(userName)){
                et_user_name.setText(userName);
                et_user_name.setSelection(userName.length());
            }
        }
    }
}

 

 

类说明:实现的用户登录及跳转到注册页面或我的页面

Java RegisterActivity原码

 

 

 

package com.neusoft.constellation;

import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.Toast;


public class RegisterActivity extends AppCompatActivity {
    private EditText et_user_name,et_psw,et_psw_again;
    private String userName,psw,pswAgain;
    private RadioGroup Sex;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        init();
    }

    private void init() {
        Button btn_register = (Button) findViewById(R.id.btn_register);
        et_user_name= (EditText) findViewById(R.id.et_user_name);
        et_psw= (EditText) findViewById(R.id.et_psw);
        et_psw_again= (EditText) findViewById(R.id.et_psw_again);
        Sex= (RadioGroup) findViewById(R.id.SexRadio);
        btn_register.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                getEditString();
                int sex;
                int sexChoseId = Sex.getCheckedRadioButtonId();
                switch (sexChoseId) {
                    case R.id.mainRegisterRdBtnFemale:
                        sex = 0;
                        break;
                    case R.id.mainRegisterRdBtnMale:
                        sex = 1;
                        break;
                    default:
                        sex = -1;
                        break;
                }

                if(TextUtils.isEmpty(userName)){
                    Toast.makeText(com.neusoft.constellation.RegisterActivity.this, "请输入用户名", Toast.LENGTH_SHORT).show();
                }else if(TextUtils.isEmpty(psw)){
                    Toast.makeText(com.neusoft.constellation.RegisterActivity.this, "请输入密码", Toast.LENGTH_SHORT).show();
                }else if(TextUtils.isEmpty(pswAgain)) {
                    Toast.makeText(com.neusoft.constellation.RegisterActivity.this, "请再次输入密码", Toast.LENGTH_SHORT).show();
                } else if (sex<0){
                    Toast.makeText(com.neusoft.constellation.RegisterActivity.this, "请选择性别", Toast.LENGTH_SHORT).show();
                }else if(!psw.equals(pswAgain)){
                    Toast.makeText(com.neusoft.constellation.RegisterActivity.this, "输入两次的密码不一样", Toast.LENGTH_SHORT).show();
                }else if(isExistUserName(userName)){
                    Toast.makeText(com.neusoft.constellation.RegisterActivity.this, "此账户名已经存在", Toast.LENGTH_SHORT).show();

                }else{
                    Toast.makeText(com.neusoft.constellation.RegisterActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
                    saveRegisterInfo(userName, psw);
                    Intent data = new Intent();
                    data.putExtra("userName", userName);
                    setResult(RESULT_OK, data);
                    com.neusoft.constellation.RegisterActivity.this.finish();
                }
            }
        });
    }
    private void getEditString(){
        userName=et_user_name.getText().toString().trim();
        psw=et_psw.getText().toString().trim();
        pswAgain=et_psw_again.getText().toString().trim();
    }
    private boolean isExistUserName(String userName){
        boolean has_userName=false;
        SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE);
        String spPsw=sp.getString(userName, "");
        if(!TextUtils.isEmpty(spPsw)) {
            has_userName=true;
        }
        return has_userName;
    }
    private void saveRegisterInfo(String userName,String psw){
        String md5Psw = MD5Utils.md5(psw);
        SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE);
        SharedPreferences.Editor editor=sp.edit();
        editor.putString(userName, md5Psw);
        editor.apply();
    }
}

 

 

 

 

 

 

 

类说明:实现的注册及返回登陆页面

 

Java MD5Utils原码

 

package com.neusoft.constellation;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Utils {
    public static String md5(String text) {
        MessageDigest digest = null;
        try {
            digest = MessageDigest.getInstance("md5");
            byte[] result = digest.digest(text.getBytes());
            StringBuffer sb = new StringBuffer();
            for (byte b : result){
                int number = b & 0xff;
                String hex = Integer.toHexString(number);
                if (hex.length() == 1){
                    sb.append("0" hex);
                }else {
                    sb.append(hex);
                }
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return "";
        }
    }
}

 

 

 

类说明:运用MD5算法实现注册

 

Java DbHelper原码

 

package com.neusoft.constellation;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DbHelper extends SQLiteOpenHelper {
    public DbHelper(Context context) {
        super(context, "fruit.db", null, 2);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        System.out.println("OnCreate");
        db.execSQL("Create TABLE fruit(id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20), balance INTEGER)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        System.out.println("OnUpgrade");
    }
}

 

 

类说明:建立SQL数据库

 

Java FruitDao原码

 

package com.neusoft.constellation;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.util.ArrayList;
import java.util.List;

public class FruitDao {
    private DbHelper dbHelper;

    public FruitDao(Context context) {
        dbHelper =new DbHelper(context);
    }
    public void insert(Fruit fruit){
        SQLiteDatabase db =dbHelper.getWritableDatabase();
        ContentValues values =new ContentValues();
        values.put("name",fruit.getName());
        values.put("balance",fruit.getBalance());
        long id = db.insert("fruit",null,values);
        fruit.setId(id);
        db.close();
    }
    public  int delete(long id){
        SQLiteDatabase db =dbHelper.getWritableDatabase();
        int count=db.delete("fruit","_id=?",new String[]{id ""});
        db.close();
        return count;
    }
    public List<Fruit> getAll(){
        SQLiteDatabase db =dbHelper.getReadableDatabase();
        Cursor c =db.query("fruit",null,null,null,null,null,"balance DESC");
        List<Fruit> list =new ArrayList<>();
        while (c.moveToNext()){
            long id =c.getLong(c.getColumnIndex("id"));
            String name = c.getString(1);
            int balance =c.getInt(2);
            list.add(new Fruit(id,name,balance));
        }
        c.close();
        db.close();
        return list;
    }
}

 

类说明:实现数据库的增删改查功能

 

  1. 系统的测试

3.1测试环境

1.设计环境:Android studio

2.测试环境:Android studio虚拟机及真机调试

3.2测试过程

  1. 测试能否正常运行程序
  2. 测试添加页面能否正常添加商品
  3. 测试能否查询商品信息
  4. 测试能否修改商品信息
  5. 测试能否删除商品信息
  6. 测试能否实现用户登录和注册

测试结果

  1. 测试能否正常运行程序

 Android课设报告 123 赵乾

 

 

 

2.测试添加页面能否正常添加商品

 Android课设报告 123 赵乾

 

 

 

3.测试能否查询商品信息

 Android课设报告 123 赵乾

 

 

4.测试能否修改商品信息

 Android课设报告 123 赵乾

 

 

 

5.测试能否删除商品信息

 

 Android课设报告 123 赵乾

 

 

6. 测试能否实现用户登录和注册

 Android课设报告 123 赵乾Android课设报告 123 赵乾

 

 

 

 

四. 课程设计总结

此系统是我做的一个简单的天喵购物城系统,用到了Android和Java以及之前所学到的相关知识。它的优点在于简单明了,容易上手操作,便于实现功能,从系统代码也比较容易修改,缺点是功能不是很完善,而且代码有些地方比较繁琐,仅仅是一个设计,在实际用途中还是有一定的技术差距。

在设计中我深知自己掌握的知识还远远不够,掌握的一些理论知识应用到实践中去,总会出现这样的问题,光知道书本上的知识是远远不够的,一定要把理论知识和实践结合起来。把学到的知识应用到时间中去,多做多练,才可以把理论的精华发挥出来,知识不是知道,了解就好,而是要去应用并且发展它,让它得到充分的应用,从而解决一些问题,这才是学习的根本目的。在这次课程设计中,得到了老师和同学们很多的帮助,学到了很多书本上学不到的知识,今后,我还要加强学习,努力使自己成为一位专业的计算机人员,为我今后从事的工作。

 最后,感谢学校和老师给了我这次锻炼的机会,希望以后还有这样锻炼自己的机会。