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

news2024/11/23 15:14:23

基于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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1006058.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PDF怎么转图片?四种转换方法分享

PDF文件是一种非常常见的文档格式&#xff0c;然而&#xff0c;有时候我们需要将PDF文件转换成图片格式。比如我们可能需要将PDF文件中的某些页面或图表转换成图片格式以便于编辑或分享。在这篇文章中&#xff0c;我们将介绍四种将PDF文件转换成图片的方法。 方法一&#xff1a…

源代码加密

需求背景 随着各行各业业务数据信息化发展&#xff0c;各类产品研发及设计等行业&#xff0c;都有关乎自身发展的核心数据&#xff0c;包括业务数据、代码数据、机密文档、用户数据等敏感信息&#xff0c;这些信息数据有以下共性&#xff1a; 属于核心机密资料&#xff0c;万…

程序员面试金典16.20: T9键盘

题目&#xff1a; 在老式手机上&#xff0c;用户通过数字键盘输入&#xff0c;手机将提供与这些数字相匹配的单词列表。每个数字映射到0至4个字母。给定一个数字序列&#xff0c;实现一个算法来返回匹配单词的列表。你会得到一张含有有效单词的列表。映射如下图所示&#xff1…

图片怎么转成PDF?分享三个转换方法

在日常工作中&#xff0c;我们经常需要将图片转换成PDF格式&#xff0c;方便存储和共享。下面分享三种转换方法&#xff0c;帮助大家快速完成转换。 方法1&#xff1a;使用在线转换工具 我们可以在电脑上打开PDF转换应用&#xff0c;进入后再左侧找到文件转PDF列表&#xff0c…

面试:如何实现分布式锁?看清楚,不是实现分布式事务!!

面试复盘&#xff1a;如何实现分布式锁&#xff1f; 目录 面试复盘&#xff1a;如何实现分布式锁&#xff1f; 1.分布式锁要求 2.实现方案 3.数据库分布式锁 3.1 悲观锁 3.2 乐观锁 4.Zookeeper 分布式锁 4.1 引入 Curator 和 ZooKeeper 4.2 配置 ZooKeeper 连接 4.3 编…

Geekbench 6 for Mac性能测试软件

Geekbench 6是一款跨平台的系统性能测试软件&#xff0c;可以对处理器和内存等硬件进行评测&#xff0c;并提供了单核和多核两种测试模式。该软件适用于 Windows、macOS、Linux 和 iOS 等多种操作系统平台。 Geekbench 6 测试可以帮助用户快速准确地了解自己设备的性能表现&…

vue3中el-tree的使用及后端传参

实现效果&#xff1a; 如上图所示&#xff0c;实现el-tree的基本使用&#xff0c;回显及联调。 1.点击弹框弹出样式&#xff0c;node-key是id,与后端字段名对应 <Dialog v-model"menuVisible" title"菜单分配"><el-tree:data"treeData&qu…

笔记本开启WiFi

笔记本开启WiFi 为了节省流量&#xff1a;笔记本开启WiFi 条件 支持热点的电脑&#xff1b;我的是华硕飞行堡垒7。 注意事项 笔记本连接公司网络&#xff0c;公司网络通常都在监管下的&#xff0c;手机连接wifi后&#xff0c;刷抖音、购物网站&#xff0c;公司后台会捕获你…

windows使用supervisor-win部署flask项目

安装supervisor-win 截止目前最新版本为4.7.0 pip install supervisor-win 配置文件 保存名为supervisor-win.ini的配置文件&#xff0c;其中port*:9001代表监控所有IP地址&#xff0c;由于windows没有办法使用uwsgi&#xff0c;所以这里配置了两个program&#xff1a;[pro…

Log4Qt日志框架(2)-深入分析和使用

Log4Qt日志框架&#xff08;2&#xff09;-深入分析和使用 0 源码1 核心类及其关系2 深入分析 0 源码 支持自动创建默认properties文件如果默认不满足需求&#xff0c;也支持自定义配置文件在原有的log4qt基础单独封装类&#xff0c;在程序开始出初始化后&#xff0c;可以在任何…

AP9196 DC-DC升降 升降压 6A 恒流DEMO原理图

应用范围 户外照明 智能照明 带锂电应用方案 太阳能路灯 补光灯

解密01背包问题:如何在有限空间中实现最大价值?

文章目录 01背包 - 问题分析01背包题目第一问1. 状态表示2. 分析状态转移方程3. 初始化4. 填表顺序5. 返回值 第二问1. 状态表示2. 状态转移⽅程3. 初始化4. 填表顺序5. 返回值 C运行代码 01背包 - 问题分析 01背包是指在一个有容积限制&#xff08;或者重量限制&#xff09;的…

了解消息中间件的基础知识

为什么要使用消息中间件&#xff1f; 解耦&#xff1a;消息中间件可以使不同的应用程序通过解耦的方式进行通信&#xff0c;减少系统间的依赖关系提供异步通信&#xff1a;消息中间件可以实现异步消息传递&#xff0c;提高系统的响应性能。流量削峰&#xff1a;消息中间件可以…

vue项目实现table表格竖向

先上图 思路&#xff1a;使用element ui 自带的栅格&#xff0c;通过控制el-col 的span 属性来设置每行展示多少行&#xff08;竖着的字段&#xff09;&#xff0c;超过就自动换行&#xff1b; content1 是表头 content2是返回的数据 getTable()函数是将返回的正常数据进行处理…

SQL12 高级操作符练习(2)

描述 题目&#xff1a;现在运营想要找到学校为北大或GPA在3.7以上(不包括3.7)的用户进行调研&#xff0c;请你取出相关数据&#xff08;使用OR实现&#xff09; 示例&#xff1a;user_profile iddevice_idgenderageuniversitygpa12138male21北京大学3.423214male复旦大学4.03…

【SpringMVC】工作流程入门案例的使用

目录 一、什么是SpringMVC 二、SpringMVC的请求流程 三、SpringMVC的优点 四、Spring MVC的主要组件 五、SpringMVC常用注解 六、入门案例演示 6.1.添加pom.xml 6.2.创建spring-mvc.xml 6.3.配置web.xml 6.4.SpringMVC配置Web 6.5.JSP页面编写 七、扩展 7.1.Spring…

全科医学科常用评估量表汇总,建议收藏!

根据全科医学科医生的量表使用情况&#xff0c;笔者整理了10个常用的全科医学科量表&#xff0c;可在线评测直接出结果&#xff0c;可转发使用&#xff0c;可生成二维码使用&#xff0c;可创建项目进行数据管理&#xff0c;有需要的小伙伴赶紧收藏&#xff01; 日常生活能力量表…

HarmonyOS Codelab 优秀样例——溪村小镇(ArkTS)

一、介绍 溪村小镇是一款展示溪流背坡村园区风貌的应用&#xff0c;包括园区内的导航功能&#xff0c;小火车行车状态查看&#xff0c;以及各区域的风景展览介绍&#xff0c;主要用于展示HarmonyOS的ArkUI能力和动画效果。具体包括如下功能&#xff1a; 打开应用时进入启动页&a…

白灯和黄灯哪个对眼睛好?那些专家推荐的护眼灯

随着电子产品普及&#xff0c;虽然给我们生活带来了很多便利&#xff0c;不过也因此有不少人用眼过度导致近视。尤其是孩子&#xff0c;如今不少小孩小小年纪就戴上了眼镜&#xff0c;究其原因&#xff0c;除了繁重的课业还有户外运动的缺失、环境光照的不足、用眼卫生和习惯的…

SpringMVC系列(一)之SpringMVC入门详细介绍

一. SpringMVC简介 Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;通过把Model&#xff0c;View&#xff0c;Controller分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂的web应用分成逻辑清晰的几部分&#xff0c;简化开发&a…