基于Android高校智慧公寓选房APP的设计与实现_报名选房系统开发过程模块-程序员宅基地

技术标签: jvm  android  

基于Android高校智慧公寓选房APP的设计与实现                                

摘  要

学生宿舍选房是大学新生入学必须面临的问题。能够统计各宿舍的分配使用情况,清楚查看宿舍状态,图像化展示,一目了然。并与其它系统共用一个数据中心,共享信息,避免了数据的错漏、数据的重复冗余以及网络资源的浪费。

本系统通过Android系统的设计的宿舍选房系统,主要包含系统管理、个人信息管理,学生信息管理、选房信息管理、选房信息查询等五大模块,通过sqlite数据库缓存用户信息以及房源信息,学生可以通过app快速查看自己的宿舍位置以及选择心仪的宿舍,减少了跑腿次数以及选房流程,信息化完成选房过程。

本文对学生宿舍选房设计与实现开发原理,具体功能以及功能的特点app开发效果图和设计进行了介绍。

关键词:Android应用;选宿舍;app设计开发

Design and implementation of student dormitory selection based on Android system

Abstract

Student dormitory selection is a problem that college freshmen must face when entering. Be able to count the distribution and use of each dormitory, clearly check the status of the dormitory, and visualize it at a glance. It also shares a data center with other systems to share information, avoiding data errors, data redundancy and waste of network resources.

The dormitory selection system designed by the Android system mainly includes five modules: system management, personal information management, student information management, room selection information management, and room selection information query. The system caches user information and room source information through the sqlite database. Students can quickly view their dormitory location and select their favorite dormitory through the app, reducing the number of errands and the room selection process, Informatization completes the house selection process.

This paper introduces the design and implementation of student dormitory room selection, the principle of development, the specific functions and the characteristics of the functions, and the design and effect of app development.

Key words: Android application; Select dormitory; App design and developme

1 绪论

1.1系统开发的背景

  如今互联网的行业的成熟,网上最早出现在20世纪90年代末期,13年广国内使用移动智能手机的也越来越流行。涉及到各行各业,在校园里面也丰富多样,校园外卖app,校园一网通,校园通讯录,图书app等等,但是在学生入学选宿舍这块不是很丰富,需要由更丰富的校园通讯模块,所以开发此app。

目前移动应用开发已逐渐覆盖。但目前校园统一的app在我国并未成气候,很多大学都是通过学生的实训作品应用的作为开发的app,缺少运营以及维护,很多都是通过现场的安排宿舍,目前操作有点太高的成本,效率也比较低,有些违背信息化的初衷。

在国外,信息化教育领域具有战略上的远见卓识和策略上的求新务实。多年来,美国,英国利用雄厚的综合国力,充分发挥各方优势,大力强化信息基础设施建设,积极发挥信息化教育的人才优势,努力开发利用丰富的信息资源,大大促进了整个社会信息化程度的全面提升,英国的全国学习网络已经成为欧洲最大的教育信息化,而且具备强大的信息化教育。国外的信息化水平处于世界领先,普及力度也是超前。

总的说来,单独的移动化应用在校园内部还是很有必要的。目前的状况是规模还不算普及,新生入学的选房需要走动在宿舍才能安排选房,不需要宿管的情况,直接自动化安排,所以特意开发此系统;

1.2系统开发的意义

     该课题旨在设计实现一个基于Android的学生宿舍管理系统,采用Android平台,让学生选宿舍变得及时、方便、易于操作和管理。该系统具有学生基础数据管理、学生选宿舍以及用户管理等功能。使得教师或者管理员人员只需在Android手机上就可以很方便地及做好入学的准备,并且领导、教师和学生都可以随时查询自己所需要的相关情况。

高校信息化管理的高速发展,不仅解决了手工管理出现的众多问题,还提高了各项工作的效率。对于高校新生,入校时最关心的一个问题就是住宿问题。因此,每年在新生报到之前,高校学生公寓管理相关部门都会将新生的住宿手动安排好,但是这种方式已经不适应高校采取大类招生的发展趋势,也不利于当代学生的个性发展需求,因此,高校智慧公寓选房APP的开发具有重要意义

  

1.3 系统实现的目标

本系统是基于Android系统实现的宿舍选房系统,使用Android SDK以及轻量级数据库SQLite,本系统设计主要包含,依据设计的总体架构对各个功能模块进行划分,并分别对各个模块作详细设计。同时,设计完成数据库的逻辑结构,以配合功能模块的数据处理,使得此系统的运营会更加方便,能够灵活的让新生应用起来;

主要包含系统管理、个人信息管理,学生信息管理、选房信息管理、选房信息查询等五大模块,通过sqlite数据库缓存用户信息以及房源信息,学生可以通过app快速查看自己的宿舍位置以及选择心仪的宿舍;

1.4 论文的组织结构

   本论文是关于基于Android系统的学生宿舍选房设计与实现,通过计算机Android 应用设计开发,sqlite统等技术的融合,实现对移动应用的设计以及部署,能够快速让用户使用本设备。

第一章:绪论。首先分析了本课题的研究背景及意义,再对该领域的研究现状做了一定讲解,最后介绍了本文的研究内容与论文安排。

第二章:相关理论及技术介绍。从课题内容出发,设计系统所需功能模块,并由此延伸出整个系统的方案设计。

第三章:需求分析。介绍了系统硬件层面上各个模块的设计逻辑及安排,为后续软件层面的开发提供良好基础。

第四章:软件设计。从人机交互模块出发,分析系统所需流程及具体界面设计,从图像识别模块的基本实现步骤出发,设计适合本系统使用场景的图像识别程序。

第五章:详细设计与实现。根据上几章的相关设计,Android应用上选房系统样品并调试。

第六章:

第七章:总结与展望。总结本系统制作过程中的得失,并对该领域往后的发展提出自己的观点。

   

2 相关理论及技术介绍

2.1相关理论介绍

面向对象方法是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,是建立在“对象”概念基础上的方法学。对象是由数据和容许的操作组成的封装体,与客观实体有直接对应关系,一个对象类定义了具有相似性质的一组对象。

基本思想:尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界、解决问题的方法与过程, 也就是使描述问题的问题空间与实现解法的求解空间在结构上尽可能一致

本系统是基于Android 系统开发,Android Studio 是 Android 的官方 IDE。它专为 Android 而打造,可以加快您的开发速度,帮助您为每款 Android 设备构建最高品质的应用;每个 SDK 平台版本都包含以下软件包:Android SDK 平台软件包。您必须拥有此软件包,才能针对相应版本编译您的应用。多个 System Image 软件包。您必须至少拥有其中一个软件包,才能在 Android 模拟器上运行相应版本。

SQLite 是一个轻量级数据库,它是D. Richard Hipp建立的公有领域项目,在2000年发布了第一个版本。它的设计目标是嵌入式的,而且占用资源非常低,在内存中只需要占用几百kB的存储空间,这也是Android移动设备采用SQLite数据库的重要原因之一。

SQLite 是遵守ACID的关系型数据库管理系统。这里的ACID是指数据库事务正确执行的4个基本要素,即原子性(Atomicity)、致性 ( Consistency)、 隔离性( lolation). 持久性( Durabilily )。它能够支持Windows/Linux/UNIX等主流的操作系统,能够跟很多程序语言,例如Tcl、C#、PHP、 Java等相结合。比起Mysql、PostgreSQL 这两款开源数据库管理系统来讲,SQLite的处理速度更快。

2.3 配置系统开发环境 

   导入工程如下图,在Android studio中file 选择open选项,然后选择需要导入工程即可

    Android studio版本:Android Studio Dolphin | 2021.3.1 Patch 1

    Gradle版本:classpath "com.android.tools.build:gradle:4.1.2"

3 需求分析

3.1 需求分析概述

本课题基于Android系统开发一款智慧公寓APP,主要功能模块包括:系统管理(用户管理、角色权限管理)、学生信息管理、选房信息管理(宿舍区域管理、宿舍楼管理、房间管理、床位管理)、选房情况查询(选房情况查询、自动安排床位)、个人中心等。

本系统是基于Android系统开发,对Android应用设计开发需要有一定移动端app的设计思路,,使用Android SDK以及轻量级数据库SQLite,本系统设计主要包含,依据设计的总体架构对各个功能模块进行划分,并分别对各个模块作详细设计。同时,设计完成数据库的逻辑结构,以配合功能模块的数据处理;

   设计完成数据库的逻辑结构,以配合功能模块的数据处理,开发设计图如下:

3.2系统功能需求分析

    项目主要是包含的功能有:系统管理(用户管理、角色权限管理)、学生信息管理、选房信息管理(宿舍区域管理、宿舍楼管理、房间管理、床位管理)、选房情况查询(选房情况查询、自动安排床位)、个人中心等。

  • 系统管理(用户管理、角色权限管理),注册登录验证:对登陆用户进行验证。

用户信息图

  • 学生信息管理,基本的学生信息管理,添加学生学生信息;通过Android的列表recycleview展示列表信息
  • 选房信息管理(宿舍区域管理、宿舍楼管理、房间管理、床位管理)对宿舍的基本信息进行查询。
  • 宿舍事务管理:学生可以对宿管人员发应宿舍中的事务。
  •  个人信息,包含登录者的信息以及修改相关信息,展示我的宿舍信息
  • 选房查询情况

其他帮助功能:显示系统用法。

3.3 系统非功能需求分析

   口数据安全的保证过程,主要体现在这几个方面:一个就是数据传输过程中的安全,还有就是数据到达服务端,如何识别数据,最后一点就是数据存储的安全性;

Sqlite数据库缓存数据也较为安全的一种,存在自己的系统内部缓存,是有一点安全行的;

都是需要用户登录的。那么如果是非登录接口,是如何确保安全,如何确认用户身份的呢?可以使用token授权机制。

token的授权认证方案:用户在客户端输入用户名和密码,点击登录后,服务器会校验密码成功,会给客户端返回一个唯一值token,并将token以键值对的形式存放在缓存(一般是Redis)中。后续客户端对需要授权模块的所有操作都要带上这个token,服务器端接收到请求后,先进行token验证,如果token存在,才表明是合法请求。

token登录授权流程图如下:

用户输入用户名和密码,发起登录请求

服务端校验密码,如果校验通过,生成一个全局唯一的token。

将token存储在redis中,其中key是token,value是userId或者是用户信息,设置一个过期时间。

把这个token返回给客户端

用户发起其他业务请求时,需要带上这个token

后台服务会统一拦截接口请求,进行token有效性校验,并从中获取用户信息,供后续业务逻辑使用。如果token不存在

4 总体设计

4.1 系统概要设计

4.1.1 系统流程图

启动app之后判断是否注册过,注册之后需要登录,登录校验成功之后将进入首页,进入选房以及查看选房

4.1.2 系统整体框架图

 智慧公寓APP,主要功能模块包括:系统管理(用户管理、角色权限管理)、学生信息管理、选房信息管理(宿舍区域管理、宿舍楼管理、房间管理、床位管理)、选房情况查询(选房情况查询、自动安排床位)、个人中心等模块,如下是系统设计的框架图:

4.2 系统功能设计 

4.2.1 用户管理模块

   用户主要分为学生和管理员角色,管理员可以对房源信息管理, 

4.2.2 个人中心

对应的用户可以展示信息以及修改个人信息,查看个人的选房情况

4.2.3学生信息管理

   管理员将新生入学的信息登记,学生的院系和个人资料等

4.2.4选房信息管理

    将选学校的宿舍管理

4.2.5 选房情况查询

    查看用户登录的选房信息

4.3 系统接口设计

4.3.1 面向对象的接口设计原则

六大设计原则主要是指:

单一职责原则(Single Responsibility Principle);

开闭原则(Open Closed Principle);

里氏替换原则(Liskov Substitution Principle);

迪米特法则(Law of Demeter),又叫“最少知道法则”;

接口隔离原则(Interface Segregation Principle);

依赖倒置原则(Dependence Inversion Principle)。

把这 6 个原则的首字母(里氏替换原则和迪米特法则的首字母重复,只取一个)联合起来就是:SOLID(稳定的),其代表的含义也就是把这 6 个原则结合使用的好处:建立稳定、灵活、健壮的设计。

4.3.2

4.4 数据库设计

4.4.1本系统是使用Android 轻量级的数据库 sqlite数据库,根据数据库的特征,将使用的数据实体类创建数据表

User 表

表名称:User表

字段名称

字段类型(长度)

字段说明

Id

Int

主键(id)

name

String

名称

pwd

String

密码

Phone

String

电话

room

string

房号

Dep

String

院系

addListTime

String

最后修改时间

duration

long

Room表

表名称:room表

字段名称

字段类型(长度)

字段说明

Id

Int

主键

dep

String

院系名称

Build

String

楼栋

Story

String

层数

Count

string

人数

Roomnum

String

房号

Select

String

已选

Time

时间

院系表

表名称:dep表

字段名称

字段类型(长度)

字段说明

Id

Int

主键

dep

String

院系名称

Build

String

楼栋

Story

String

层数

Count

string

人数

Roomnum

String

房号

Select

String

已选

Time

时间

4.4.2 数据库创建

public class DatabaseOpenHelper {

    private final String TAG = DatabaseOpenHelper.class.getSimpleName();

    private DbManager.DaoConfig daoConfig;

    private static DbManager dbManager;

    private final String DB_NAME = "home.db";

    private final int DB_VERSION = 1;

    private DatabaseOpenHelper() {

        daoConfig = new DbManager.DaoConfig()

                .setDbName(DB_NAME)

                .setDbVersion(DB_VERSION)

                .setDbOpenListener(db -> db.getDatabase().enableWriteAheadLogging())

                .setDbUpgradeListener((db, oldVersion, newVersion) -> {

                }).setTableCreateListener((db, table) -> {

                });

        dbManager = x.getDb(daoConfig);

    }

    public static DbManager getInstance() {

        if (dbManager == null) {

            DatabaseOpenHelper databaseOpenHelper = new DatabaseOpenHelper();

        }

        return dbManager;

    }

创建数据库home.db 文件,db操作辅助类的,需要打开数据以及更新数据库的数据,需要修改字段将升级字段即可

5 详细设计与实现

5.1详细设计

5.1.1 类图

   

5.2实现效果

    登录注册页面

登录注册部分代码

public class LoginActivity  extends AppCompatActivity {

    ActivityLoginStuBinding loginBinding;

    private String type = "";

    @Override

    protected void onCreate(@Nullable Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        loginBinding = ActivityLoginStuBinding.inflate(getLayoutInflater());

        setContentView(loginBinding.getRoot());

        initView();

    }

    private void initView(){

        loginBinding.editAddress.getText();

        loginBinding.editPwd.getText();

        loginBinding.radioGroupUnassured.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {

            @Override

            public void onCheckedChanged(RadioGroup group, int checkedId) {

                //获取被选中的radiobutton的id

                RadioButton rcheck = (RadioButton) findViewById(checkedId);

                //获取

                String checkText = rcheck.getText().toString();

                type = checkText;

                SharePrefUtils.setLoginType(type);

                Toast.makeText(LoginActivity.this, "您选中的是:" + checkText, Toast.LENGTH_SHORT).show();

            }

        });

    }

        public void loginClick(View v) {

            int i = v.getId();

            if (i == R.id.btn_login) {

                loginBinding.progressCircular.setVisibility(View.VISIBLE);

//                try {

                   Thread.sleep(2500);

//                } catch (InterruptedException e) {

//                    e.printStackTrace();

//                }

                if(TextUtils.isEmpty(type)){

                    Toast.makeText(LoginActivity.this,"请选择用户类型",Toast.LENGTH_LONG).show();

                    return;

                }

                if(!TextUtils.isEmpty(loginBinding.editAddress.getText().toString())&&loginBinding.editAddress.getText().toString().equals("admin")){

                    if(!TextUtils.isEmpty(loginBinding.editPwd.getText().toString())&&loginBinding.editPwd.getText().toString().equals("admin123")){

                        Intent intent = new Intent(LoginActivity.this, MainActivity.class);

                        intent.putExtra("user", "admin");

                        startActivity(intent);

                    }

                }else {

                    if (TextUtils.isEmpty(loginBinding.editAddress.getText().toString())) {

                        Toast.makeText(LoginActivity.this, "用户名不能为空", Toast.LENGTH_LONG).show();

                        return;

                    } else if (TextUtils.isEmpty(loginBinding.editPwd.getText().toString())) {

                        Toast.makeText(LoginActivity.this, "密码不能为空", Toast.LENGTH_LONG).show();

                        return;

                    }

                    UserDao userDao = new UserDao();

                    UserBean userBean = userDao.getUser(loginBinding.editAddress.getText().toString());

                    if (userBean != null) {

                        if (userBean.getName().toString().equals(loginBinding.editAddress.getText().toString())

                                && userBean.getPwd().toString().equals(loginBinding.editPwd.getText().toString())) {

                            Intent intent = new Intent(LoginActivity.this, MainActivity.class);

                            intent.putExtra("user", userBean.getName().toString());

                            startActivity(intent);

                            loginBinding.progressCircular.setVisibility(View.GONE);

                        } else {

                            loginBinding.progressCircular.setVisibility(View.GONE);

                            Toast.makeText(LoginActivity.this, "类型不对或者密码错误!", Toast.LENGTH_LONG).show();

                        }

                    } else {

                        loginBinding.progressCircular.setVisibility(View.GONE);

                        Toast.makeText(LoginActivity.this, "还未注册 ,请先注册!", Toast.LENGTH_LONG).show();

                    }

                }

//                    }

//                });

            } else if (i == R.id.btn_register) {

                Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);

                startActivity(intent);

            } else if (i == R.id.btn_forget_pwd) {

//                forgetPwd();

            } else if (i == R.id.btn_tip) {

//                forwardTip();

            }

    }

}

宿舍选择页面

选房部分代码

public class SelectHomeTabFragment extends Fragment {

    private RecyclerView recyclerView;

    private EditText editText;

    BollUserAdapter bollUserAdapter;

    List<UserBean> contextBeanArrayList = new ArrayList<>();

    UserDao userDao = new UserDao();

    private static final String TAG = "TabFragment";

    private Button mBtn;

    public SelectHomeTabFragment() {

//        Bundle b = new Bundle();

//        b.putString("key", str);

//        setArguments(b);

    }

    @SuppressLint("MissingInflatedId")

    @Override

    public View onCreateView(LayoutInflater inflater, ViewGroup container,

                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_done_tab_stu, container, false);

        recyclerView = view.findViewById(R.id.lv_data);

        editText = view.findViewById(R.id.edit_sea);

        contextBeanArrayList = userDao.getContactAll();

        mBtn = view.findViewById(R.id.pp);

        return view;

    }

    @Override

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {

//                houseListAdapter = new BollInfoListAdapter();

//                List<HomeInfoBean> houseBeans= new ArrayList<>();

//                for (int i = 0; i < 20; i++) {

//                    HomeInfoBean houseBean= new HomeInfoBean();

//

//                    houseBeans.add(houseBean);

//                }

//                houseListAdapter.setDataList(getContext(),contextBeanArrayList);

//                recyclerView.setAdapter(houseListAdapter);

    }

    @Override

    public void onCreate(@Nullable Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

    }

    @Override

    public void onResume() {

        super.onResume();

        Log.e(TAG, "onCreate: -------------------" );

        bollUserAdapter = new BollUserAdapter();

        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

        recyclerView.setAdapter(bollUserAdapter);

        bollUserAdapter.setDataList(getContext(),contextBeanArrayList);

        mBtn.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

//                Random random = new Random();

//                int a=random.nextInt(contextBeanArrayList.size());

//                showNormalDialog(a);

                startActivity(new Intent(getActivity(), DeBollActivity.class));

            }

        });

        bollUserAdapter.setOnItemClickListener(new BollUserAdapter.OnItemClickListener() {

            @Override

            public void onItemClick(int position) {

//                showNormalDialogBF(position);

                if (MainActivity.USER.equals(contextBeanArrayList.get(position).getName())){

                    new Intent(getContext(), MeActivity.class);

                }

            }

            @Override

            public void onClickMoreOp(int position, View view, HomeInfoBean houseBean) {

            }

            @Override

            public void onClickConnectPrint(int position, HomeInfoBean houseBean) {

            }

        });

        editText.addTextChangedListener(new TextWatcher() {

            @Override

            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override

            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override

            public void afterTextChanged(Editable editable) {

            }

        });

    }

    private void showNormalDialog(final int position){

        /* @setIcon 设置对话框图标

         * @setTitle 设置对话框标题

         * @setMessage 设置对话框消息提示

         * setXXX方法返回Dialog对象,因此可以链式设置属性

         */

        final AlertDialog.Builder normalDialog =  new AlertDialog.Builder(getContext());

        normalDialog.setTitle("匹配成功");

        normalDialog.setMessage("是否邀请"+contextBeanArrayList.get(position).getName()+"一起打球");

        normalDialog.setPositiveButton("确定",  new DialogInterface.OnClickListener() {

            @Override

            public void onClick(DialogInterface dialog, int which) {

                //...To-do

//                Toast.makeText(getContext(),"删除成功",Toast.LENGTH_LONG).show();

//                contextBeanArrayList.remove(position);

//                houseListAdapter.setDataList(getContext(),contextBeanArrayList);

            }

        });

        normalDialog.setNegativeButton("取消",  new DialogInterface.OnClickListener() {

            @Override

            public void onClick(DialogInterface dialog, int which) {

               dialog.dismiss();

            }

        });

        // 显示

        normalDialog.show();

    }

    private void showNormalDialogBF(final int position){

        /* @setIcon 设置对话框图标

         * @setTitle 设置对话框标题

         * @setMessage 设置对话框消息提示

         * setXXX方法返回Dialog对象,因此可以链式设置属性

         */

        final AlertDialog.Builder normalDialog =  new AlertDialog.Builder(getContext());

        normalDialog.setTitle("评分");

        normalDialog.setMessage("对手的球技是怎么样的呢?");

        normalDialog.setPositiveButton("比我强",  new DialogInterface.OnClickListener() {

            @Override

            public void onClick(DialogInterface dialog, int which) {

                UserBean userBean= userDao.getUser(MainActivity.USER);

                userBean.setLevel(userBean.getLevel());

                userDao.addOrUpdate(userBean);

                Toast.makeText(getContext(),MainActivity.USER+"球技分加5分",Toast.LENGTH_LONG).show();

                contextBeanArrayList = userDao.getContactAll();

                bollUserAdapter.setDataList(getContext(),contextBeanArrayList);

            }

        });

        normalDialog.setNegativeButton("比我弱",  new DialogInterface.OnClickListener() {

            @Override

            public void onClick(DialogInterface dialog, int which) {

                UserBean userBean = userDao.getUser(contextBeanArrayList.get(position).getName());

                userBean.setLevel(userBean.getLevel()+5);

                userDao.addOrUpdate(userBean);

                Toast.makeText(getContext(),userBean.getName()+"球技分加5分",Toast.LENGTH_LONG).show();

               dialog.dismiss();

               contextBeanArrayList = userDao.getContactAll();

               bollUserAdapter.setDataList(getContext(),contextBeanArrayList);

            }

        });

        // 显示

        normalDialog.show();

    }

}

我的页面

6 系统测试

6.1 测试目的

1、提高软件的质量

软件测试的首要目的就是提高软件的质量,也就是让用户对产品有更好的体验,保证软件的高质量。

2、保证软件的安全

软件测试的第二大目的就是保证软件的安全,有一些软件是经过数据加密的,比如各大银行系统的APP。涉及到资金的支出和存入,对软件的安全性要求是特别高的。所以要通过反复测试来提高产品的安全性,保证产品在上线之后不会出现bug,尤其对于金融方面的APP来说,任何漏洞都是致命的。

3、降低软件开发成本

软件测试的另外一个目的就是降低软件的开发成本,在开发过程中发现bug及时调整,这样的损失是很小的,一旦产品上线或是即将完成开发而发现bug,那么可能会造成产品大改动,这样就意味着以往的精力全部白费。因此测试的存在就是为了降低开发成本。比如迪士尼的一款狮子王的软件,借着狮子王的名声,预期本应是好评如潮,也能通过这款软件获益不匪。但因为在很多系统上都无法使用,所以造成了大量的用户投诉和下线、卸载等。对成本造成了非常大的损失。那如果当时这款软件能够在不同的系统上进行测试,在上线前将所有的问题全部解决掉,肯定会大大降低成本。

4、降低企业风险

除了降低开发成本,还可以降低企业风险,试想,如果软件存在的问题过多,毫无疑问会影响企业的信誉,最终直接导致企业的合作企业变少,直接损害公司的收益。但如果有测试人员在中间严格把关,就完全不会出现这样的问题。

5、提升用户体验感

开发人员在开发过程中都是以顺向思维来写程序代码的,所以很少有开发人员能够站在用户角度去思考,但测试人员不一样,测试要以逆向思维来思考程序会在哪一步有问题,站在用户的角度进行测试,这样上线的产品将很符合用户的需求,用户使用时也比较顺手,增加用户体验感

6.2 测试计划

根据设计的需求编写测试计划

测试计划如下表2-1所示。

表2-1  测试计划

测试模式

测试功能

测试步骤

期望效果

功能测试

注册登录

启动项目 注册用户  然后登录

实现验证成功

页面能否跳转

单击页面

页面实现跳转

选房

展示宿舍列表可以进行选择

显示正常

查看个人信息

不进入我的页面

个人信息展示正常

6.2.1测试方法

测试方法包括黑盒测试、白盒测试、灰盒测试、手动测试和自动化测试。 黑盒测试就是把软件系统当作一个“黑箱”,无法了解或使用系统的内部结构及知识,进行的测试。 一般刚入门的测试都是从黑盒测试开始的。 白盒测试就是设计者可以看到软件系统的内部结构,并且使用软件的内部知识来指导测试数据及方法的测试

6.2.2测试流程

一、项目测试流程步骤有哪些?

1. 测试需求提取与分析。根据需求说明书分析测试功能点,功能是否能够满足用户的实际使用场景,产出测试点。

2. 测试设计。把测试需求转化为具体的测试工作,可以通过等价类划分法等测试设计方法进行业务逻辑设计,搭建测试框架等。

3. 测试用例执行与回归。根据测试用例执行功能测试、性能测试等工作,对有缺陷的模块进行回归测试等。

4. Bug管理。测试过程中记录bug发现过程,bug对系统造成的影响,进行bug管理。

5. 总结。对项目测试过程进行总结归纳,为以后碰到同样的bug提供依据

6.2.3测试用例

注册模块,注册账号是否成功

登录模块,登录是否正常

选房模块,是否可以选房

个人信息模块,展示个人信息

6.3 测试实施

当设计好用例、数据准备好后,就可以将设计好的成果应用于软件,如果在执行用例的过程中,发现软件执行的结果和测试用例中的预期结果不一致,那么,这就是软件缺陷即我们通常听到的软件bug,我们需要把该缺陷报告给相关开发人员进行修改,如何报告呢,即需要记录缺陷,也就是我们通常所说的缺陷报告。那么缺陷报告包含哪些内容;缺陷严重程度:表示软件缺陷所造成的危害的恶劣程度 。缺陷严重程度的分类在不同的软件公司,分类有的也不同,在此给出一种分类,内容如下:

Fatal:致命的错误,造成系统或应用程序崩溃、死机、系统悬挂,或造成数据丢失、主要功能完全丧失等。

Critical:严重错误,主要指功能或特性没有实现,主要功能部分丧失,次要功能完全丧失,或致命的错误声明。

Major:主要错误,这样的缺陷虽然不影响系统的使用,但没有很好的实现功能,没有达到预期效果。如提示信息不太准确,或用户界面差,操作时间长等。

Minor:一些小问题,对功能几乎没有影响,产品及属性仍可使用。

Suggestion:一些友好的建议。

缺陷优先级:表示修复缺陷的先后次序的指标。优先级的分类在不同的软件公司,分类也不尽相同,一般优先级的划分用ABCD或数字1—4表示,A或1表示最高级别,D或4表示最低级别。

最高优先级:立即修复,停止进一步测试。

 次高优先级:在产品发布之前必须修复。

 中等优先级:如果时间允许应该修复。

n最低优先级:可能会修复,但是也能不修复。

6.4 测试评价

测试是为了避免使用过程中出现一些影响用户使用产品的问题,尽量发现项目中存在的问题;

7 结论

7.1 总结

首页感谢老师的培养和教导,此项目得与开发还是离不开老师的教导,在开发过程遇到不少问题也是在老师的帮助下完成,主要体现在sqlite数据库的应用,解决疑难问题,调式过程中经常卡克,另外需要感谢同学的鼓励和帮助,是他们一起学习生活中渡过一段时光,在枯燥乏味的日子,同学们的欢声笑语滋润了心田,是他们的一起前行中学习到了每个知识点,课外经常讨论不明白的问题,梳理了不少疑惑。

    

7.2 体会 

此项目离使用还存在很多的不足,希望能在积累知识点的同时继续完善功能,尽量满足每一个功能,能够达到投入使用的状态,解决用户学习英语的需求,主要问题是云交互阶段和跨端的调式,也是我需要继续挖掘和学习的地方;

此项目虽然不是很完美,但是从中学习到了一个项目的整体设计和实现过程,把理论知识应用到实践中,提升实践能力

参考文献

[1]李刚彪.数据库加密技术的研讨与完成[D].太原理工大学,2010:18-78.

[2]杨云君.Android的设计与完成[M].北京:机械工业出版社,2013:5-65.

[3]秦明甫.基于混沌实际的数字图像加密研讨[D].重庆大学,2009:34-48.

[4]柯除夕.Android内核分析[M].北京:电子工业出版社,2011:67-98.

[5]李刚.疯狂Android讲义[M].北京:电子工业出版社,2013:12-87.

[6]吴明航.DES和RSA混合加密算法的研讨[D].哈尔滨工业大学,2013:13-56.

[7]顶峰.Linux内存管理的设计与完成[D].沈阳工业大学,2007:45-89

[8]陈最.基于Android平台挪动终端通明加密零碎的研讨与完成[D].重庆理工大学,2012:108-150.

[9]佟晓筠,王翥,杜宇,岳银亮.基于软件平安混合加密技术的研讨[J].计算机工程,2004,23(33):98-100.

[10]程庭,张明慧,石公营.一种基于DES和RSA算法的数据加密方案及完成[J].河南教育学院学报(自然迷信版),2003,22(3):69-71.

[11]XinChen,SongweiMa,BingliGuo,YanWang,JuhaoLi,ZhangyuanChen,YongqiHe.Anovelfragmentation-awarespectrumallocationalgorithminflexiblebandwidthopticalnetworks[J].OpticalSwitchingandNetworking,2014(12):6-22.

[12]廉士国,李忠新,王执铨.两种基于局部加密的图像和视频加密方案[J].计算机工程,2004,4(11):11-34.

[13]Zhu,ZhiwuLiu,XuLi,Xiangyu.RatchetingBehaviorsoftheCarbonFiberReinforcedPEEKComposites:ExperimentalStudyandNumericalSimulation[J].Polymers&PolymerComposite,2014,(221)

致  谢

在老师的耐心指导下完成了此项目及论文,为了保证我们毕业设计的正常进行,学院抽调了优秀的老师指导我们进行毕业设计,并且不时地询问我们毕业设计的进展情况。没有老师们的细心指导我的论文与系统就不可能顺利的完成,再次对你们表示衷心地感谢。老师认真负责的工作态度、严谨的治学风格,使我深受启发;同时也很感谢帮助过我和我一同探讨问题的同学们。为我们这次设计的正常开展提供了必要的基础。本次毕业设计,就要画上一个句号了。

感谢学院给我提供学习的平台,让我在这里接受了系统的学习。

感谢所有关心、支持、帮助过我的良师益友。

最后,向在百忙中抽出时间对本文进行评审并提出宝贵意见的各位老师表示衷心地感谢!

附录1

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qxf865618770/article/details/132845998

智能推荐

VS中添加lIb库及头文件(外部依赖项)的步骤_vs项目中依赖库的头文件-程序员宅基地

文章浏览阅读4.5k次。VS中添加LIb库及头文件(外部依赖项)的步骤:1、添加工程的头文件目录:工程—属性—配置属性—c/c+±–常规—附加包含目录:加上头文件存放目录。2、添加文件引用的lib静态库路径:工程—属性—配置属性—链接器—常规—附加库目录:加上lib文件存放目录。然后添加工程引用的lib文件名:工程---属性---配置属性---链接器---输入---附加依赖项:加上lib文件名。3、添加工程引用..._vs项目中依赖库的头文件

互动抽奖背后的随机性与算法实现-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏7次。背景抽奖,是一种典型的互动玩法形式。无论是大V的粉丝抽奖,还是活动会场的参与抽奖,这种起源于彩票开奖的互动玩法,同时兼顾了高期待感和低预期的特征,让活动在成本控制之余又能有惊喜和引爆点,这样的优势让其在各种运营场景中幻化万千,大行其道。在闲鱼各种互动场与营销活动中,抽奖自然也是一个相当高频使用的互动玩法。众所周知,越是经典的玩法,业务需求就越发别出机杼,在参与条件、开奖展示、奖品规则等各方面千变万..._随机中奖逻辑

HSV颜色相似度-程序员宅基地

文章浏览阅读1.1w次,点赞2次,收藏8次。一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本色中对应的HSV分量需要给定一个严格的范围,下面是通过实验计算的模糊范围(准确的范围在网上都没有给出)。H: 0 — 180S: 0 — 255V: 0 — 255此处把部分红色归为紫色范围:目前在计算机视觉领域存在着_hsv颜色相似度

cox回归模型python实现_生存分析Cox回归模型(比例风险模型)的spss操作实例-程序员宅基地

文章浏览阅读1.7k次。一、生存分析基本概念1、事件(Event)指研究中规定的生存研究的终点,在研究开始之前就已经制定好。根据研究性质的不同,事件可以是患者的死亡、疾病的复发、仪器的故障,也可以是下岗工人的再就业等等。2、生存时间(Survival time)指从某一起点到事件发生所经过的时间。生存是一个广义的概念,不仅仅指医学中的存活,也可以是机器出故障前的正常运行时间,或者下岗工人再就业前的待业时间等等。有的时候甚..._cox比例风险回归模型spss

git commit --amend_git commit --amend 之后还要push吗-程序员宅基地

文章浏览阅读144次。使用场景用于修改上次提交,可修改上次提交的commit message信息,也可修改commit 的内容用法上次commit 内容不满意,代码并未合并,需要有改动的地方:修改文件git addgit commit – amendgit push以上修改并不产生新的commit id但是如果修改文件git addgit commit “”git push此办法会产生新的commit id,合并的人需要将两次commit id合并..._git commit --amend 之后还要push吗

九度OJ-程序员宅基地

文章浏览阅读891次。1.1016这是一道简单题,主要要考虑到,比如说108,8,2这种类似的情况,其中8被认为是08,所以最后两位相同,输出-1。#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){char a[20], b[20], *p, *q;int k, a1, b1, len1, len2, a2, b2;while (scanf("%s%s%d", a, b, &a..._九度oj

随便推点

HTML5基于flash实现播放RTMP协议视频_网页使用flash播放rtsp-程序员宅基地

文章浏览阅读3.1w次,点赞6次,收藏28次。HTML5实现播放RTMP协议视频<!doctype html><html><head><meta charset="utf-8"><title>Video.js 7</title> <link href="css/video-js.min.css" rel="stylesheet"> <sty..._网页使用flash播放rtsp

Error opening data file Tesseract-OCR\tessdata/eng.traineddata问题 解决_error opening data file ./eng.traineddata-程序员宅基地

文章浏览阅读1.2w次,点赞23次,收藏19次。在安装完tesseract, pytesseract后执行测试命令,发现打印如下错误:Error opening data file \Program Files (x86)\Tesseract-OCR\tessdata/eng.traineddata Please make sure the TESSDATA_PREFIX environment variable is set to the..._error opening data file ./eng.traineddata

杂项总结 vue sass less vue-router_vue使用less还是sass好-程序员宅基地

文章浏览阅读92次。// 通用修饰符 // stop 实现阻止冒泡的修饰符// prevent 实现阻止默认行为的修饰符// once 表示单次触发的修饰符// self 表示绑定事件的元素与触发事件的元素是同一个元素// 鼠标修饰符// left 鼠标点击左键// right 鼠标点击右键// middle 鼠标中间件// 辅助修饰符// ctrl 点击 ctrl 辅助键// shift 点击 shift 辅助键盘// alt 点击 alt 辅助键// meta_vue使用less还是sass好

html5 accept encoding,html - How to Specify a Vary: Accept-Encoding header? - Stack Overflow-程序员宅基地

文章浏览阅读79次。I found a helpful post to speed up wordpress website or blog https://www.keycdn.com/blog/speed-up-wordpress/With some other optimizations, I am also using below code on my site in .htaccess file (usua..._html5设置accept-encoding

在docker容器内 获取swarm节点IP_docker swarm 指定容器ip-程序员宅基地

文章浏览阅读566次。想在应用内获取当前swarm节点的IP使用.net 6框架 vs2022开发工具。_docker swarm 指定容器ip

国产的文档开发控件,spire.office新版本,一起来看看~_spire.office developer subscription(开发版本)-程序员宅基地

文章浏览阅读922次。Spire.Office 8.6.0更新已发布。在该版本中,Spire.PDF支持转换多页PDF文档为单个SVG文件;Spire.XLS新增了优化删除行的速度的方法;Spire.Presentation支持为TextFrame设置栏数。此外,许多已知问题也在该版本中被成功修复。_spire.office developer subscription(开发版本)

推荐文章

热门文章

相关标签