基于java的Spring Boot框架的在线问卷调查系统

博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,博客中有上百套程序可供参考,欢迎共同交流学习。

🍅文末点击卡片获取联系🍅

技术:springboot+mysql+vue+tomcat

目录

1 系统介绍

2 系统背景

2.1 课题背景

2.2 课题意义

3 系统功能结构

3.1 管理员

3.2 用户

4 数据库结构

5 系统功能

5.1 管理员功能实现

5.1.1 问卷管理

5.1.2 问卷调查管理

5.1.3 题目管理

5.1.4 用户管理

5.1.5 新闻资讯管理

5.2 用户功能实现

5.2.1 问卷列表

5.2.2 问卷调查

5.2.3 新闻资讯

5.2.4 问卷调查记录

6 系统测试

6.1 功能测试

6.1.1 登录功能测试

6.1.2 修改密码功能测试

6.2 系统测试结果

7 总结


1 系统介绍

如今社会上各行各业,都在用属于自己专用的软件来进行工作,互联网发展到这个时候,人们已经发现离不开了互联网。互联网的发展,离不开一些新的技术,而新技术的产生往往是为了解决现有问题而产生的。针对于问卷调查信息管理方面的不规范,容错率低,管理人员处理数据费工费时,采用新开发的在线问卷调查系统可以从根源上规范整个数据处理流程的正规性和合法性。

在线问卷调查系统能够实现问卷管理,用户管理,题目管理,问卷调查管理,新闻资讯管理等功能。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。

在线问卷调查系统可以提高问卷调查信息管理问题的解决效率,优化问卷调查信息处理流程,并且能够保证存储数据的安全,它是一个非常可靠,非常安全的应用程序。

2 系统背景

2.1 课题背景

二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。时代进步的标志,就是让人们过上更好的生活。在互联网诞生之前,地域位置往往是人们思想上不可跨域的鸿沟,信息的传播速度极慢,信息处理的速度和要求还是通过人们骑马或者是信鸽传递,这些信息传递都是不可控制的,中间很有可能丢失,信息的传递水平决定了人们生活的水平。现如今,大家都在用互联网来实现自己的目的,从内部管理设置计算机管理,提高内部信息管理水平,从外部市场也可以用计算机获取相关数据进行处理,如今各行各业已经严重依赖于计算机了。

本课题研究和开发在线问卷调查系统,让安装在计算机上的该系统变成管理人员的小帮手,提高问卷调查信息处理速度,规范问卷调查信息处理流程,让管理人员的产出效益更高。

2.2 课题意义

传统处理数据,必须是一张张纸,然后处理完毕又是统计在一张张纸上面,不断的重复处理,最终有个结果给最高层作为参考,这个模式在互联网没有出现之前,是一种常见的事情,信息管理的效率提不上去,那就用人才,人多力量大,是一个以前人们的常识。计算机的诞生就是发现了人多力量大的不足,比如高端计算人才的培养已经跟不上使用了,所以人们研究出专门帮助人们计算的机器,就是计算机的前身,到了互联网时代,人们发现完全可以让程序供应商提供解决方案,自己挑选自己合适的方案来提高自己的产出比。于是市面上就出现了各种各样的依靠程序处理信息的解决方案。

本课题研发的在线问卷调查系统,就是提供问卷调查信息处理的解决方案,它可以短时间处理完信息,并且只需要使用者动动鼠标和键盘就能获取自己需要的信息,并且这些信息都有专门的存储设备,而且数据的备份和迁移都可以设定为无人值守,从人力角度和信息处理角度以及信息安全角度,在线问卷调查系统是完胜传统纸质操作的,所以在线问卷调查系统就是如此的值得信赖。

3 系统功能结构

3.1 管理员

3.2 用户

4 数据库结构

本小节主要任务即是根据上述内容进行数据存储结构的设计,也就是在数据库中设计存放本系统的数据的数据表,设计数据表时,需要对各个字段进行确定,通常来说,一个实体与一张数据表相对应,实体的属性就用来表示字段名称,不同的字段表示的数据类型以及取值都不相同,这里需要根据系统实际数据的情况进行设置,同时也需要在具体表中确定该表的主键,以及该表各个字段是否能够保持空等进行说明,设计完成一张数据表的结构之后,在保存时同样要命名,尽量选择英文名称进行命名并保存,方便今后系统对数据表进行数据存储访问时,在提高数据存储效率的同时,还不容易导致系统出错。接下来就对设计的数据表进行展示。

表4.1 问卷表

字段

注释

类型

id (主键)

主键

int(20)

exampaper_name

问卷名称

varchar(200)

exampaper_date

时长(分钟)

int(11)

exampaper_jieshuyu

结束语

varchar(255)

exampaper_types

问卷状态

int(11)

create_time

创建时间

timestamp

表4.2 题目表

字段

注释

类型

id (主键)

主键

int(20)

exampaper_id

所属问卷id(外键)

int(20)

examquestion_name

试题名称

varchar(200)

examquestion_options

选项

longtext

examquestion_types

试题类型

int(20)

examquestion_sequence

试题排序,值越大排越前面

int(20)

create_time

创建时间

timestamp

表4.3 问卷调查记录表

字段

注释

类型

id (主键)

主键

int(20)

examrecord_uuid_number

问卷调查编号

varchar(200)

yonghu_id

问卷调查用户

int(20)

exampaper_id

所属问卷id(外键)

int(20)

insert_time

问卷调查时间

timestamp

create_time

创建时间

timestamp

表4.4 管理员表

字段

注释

类型

id (主键)

主键

bigint(20)

username

用户名

varchar(100)

password

密码

varchar(100)

role

角色

varchar(100)

addtime

新增时间

timestamp

表4.5 新闻资讯表

字段

注释

类型

id (主键)

主键

int(11)

news_name

新闻资讯名称

varchar(200)

news_types

新闻类型

int(11)

news_photo

新闻资讯图片

varchar(200)

insert_time

新闻资讯时间

timestamp

news_content

新闻资讯详情

text

create_time

创建时间

timestamp

表4.6 答题详情表

字段

注释

类型

id (主键)

主键

int(20)

examredetails_uuid_number

问卷编号

varchar(200)

yonghu_id

用户id

int(20)

examquestion_id

试题id(外键)

int(20)

examredetails_myanswer

用户选项

varchar(200)

create_time

创建时间

timestamp

表4.7 用户表

字段

注释

类型

id (主键)

主键

int(11)

username

账户

varchar(200)

password

密码

varchar(200)

yonghu_name

用户姓名

varchar(200)

sex_types

性别

int(11)

yonghu_id_number

身份证号

varchar(200)

yonghu_phone

手机号

varchar(200)

yonghu_photo

照片

varchar(200)

create_time

创建时间

timestamp

5 系统功能

编程人员在搭建的开发环境中,运用编程技术实现本系统设计的各个操作权限的功能。在本节中,就展示部分操作权限的功能与界面。

5.1 管理员功能实现

5.1.1 问卷管理

图5.1 即为编码实现的问卷管理界面,管理员在该界面中可以对已有问卷进行启用或禁用,可以新增问卷,编辑更改已有问卷的资料,包括问卷名称,结束语等信息,可以删除需要删除的问卷,可以根据问卷名称,问卷的状态来获取需要的问卷信息。

图5.1 问卷管理界面

核心代码:

    /**

    * 后端修改

    */

    @RequestMapping("/update")

    public R update(@RequestBody ExampaperEntity exampaper, HttpServletRequest request){

        logger.debug("update方法:,,Controller:{},,exampaper:{}",this.getClass().getName(),exampaper.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));

        if(StringUtil.isEmpty(role))

            return R.error(511,"权限为空");

        //根据字段查询是否有相同数据

        Wrapper<ExampaperEntity> queryWrapper = new EntityWrapper<ExampaperEntity>()

            .notIn("id",exampaper.getId())

            .andNew()

            .eq("exampaper_name", exampaper.getExampaperName())

            .eq("exampaper_date", exampaper.getExampaperDate())

            .eq("exampaper_types", exampaper.getExampaperTypes())

            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());

        ExampaperEntity exampaperEntity = exampaperService.selectOne(queryWrapper);

        if(exampaperEntity==null){

            //  String role = String.valueOf(request.getSession().getAttribute("role"));

            //  if("".equals(role)){

            //      exampaper.set

            //  }

            exampaperService.updateById(exampaper);//根据id更新

            return R.ok();

        }else {

            return R.error(511,"表中有相同数据");

        }

    }

    /**

    * 删除

    */

    @RequestMapping("/delete")

    public R delete(@RequestBody Integer[] ids){

        logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());

        exampaperService.deleteBatchIds(Arrays.asList(ids));

        return R.ok();

    }

5.1.2 问卷调查管理

图5.2 即为编码实现的问卷调查管理界面,管理员在该界面中对用户提交的问卷调查信息进行查看,管理员可以直接查看每条问卷调查的调查详情信息,同时可以删除问卷调查信息。

图5.2 问卷调查管理界面

核心代码:

/**

     * 批量上传

     */

    @RequestMapping("/batchInsert")

    public R save( String fileName){

        logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);

        try {

            List<ExampaperEntity> exampaperList = new ArrayList<>();//上传的东西

            Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段

            Date date = new Date();

            int lastIndexOf = fileName.lastIndexOf(".");

            if(lastIndexOf == -1){

                return R.error(511,"该文件没有后缀");

            }else{

                String suffix = fileName.substring(lastIndexOf);

                if(!".xls".equals(suffix)){

                    return R.error(511,"只支持后缀为xls的excel文件");

                }else{

                    URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径

                    File file = new File(resource.getFile());

                    if(!file.exists()){

                        return R.error(511,"找不到上传文件,请联系管理员");

                    }else{

                        List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件

                        dataList.remove(0);//删除第一行,因为第一行是提示

                        for(List<String> data:dataList){

                            //循环

                            ExampaperEntity exampaperEntity = new ExampaperEntity();

//                            exampaperEntity.setExampaperName(data.get(0));                    //问卷名称 要改的

//                            exampaperEntity.setExampaperDate(Integer.valueOf(data.get(0)));   //时长(分钟) 要改的

//                            exampaperEntity.setExampaperTypes(Integer.valueOf(data.get(0)));   //问卷状态 要改的

//                            exampaperEntity.setCreateTime(date);//时间

                            exampaperList.add(exampaperEntity);

                            //把要查询是否重复的字段放入map中

                        }

                        //查询是否重复

                        exampaperService.insertBatch(exampaperList);

                        return R.ok();

                    }

                }

            }

        }catch (Exception e){

            return R.error(511,"批量插入数据异常,请联系管理员");

        }

    }

    /**

    * 前端列表

    */

    @IgnoreAuth

    @RequestMapping("/list")

    public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){

        logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));

        // 没有指定排序字段就默认id倒序

        if(StringUtil.isEmpty(String.valueOf(params.get("orderBy")))){

            params.put("orderBy","id");

        }

        PageUtils page = exampaperService.queryPage(params);

        //字典表数据转换

        List<ExampaperView> list =(List<ExampaperView>)page.getList();

        for(ExampaperView c:list)

            dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段

        return R.ok().put("data", page);

    }

    /**

    * 前端详情

    */

    @RequestMapping("/detail/{id}")

    public R detail(@PathVariable("id") Long id, HttpServletRequest request){

        logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id);

        ExampaperEntity exampaper = exampaperService.selectById(id);

            if(exampaper !=null){

                //entity转view

                ExampaperView view = new ExampaperView();

                BeanUtils.copyProperties( exampaper , view );//把实体数据重构到view中

                //修改对应字典表字段

                dictionaryService.dictionaryConvert(view, request);

                return R.ok().put("data", view);

            }else {

                return R.error(511,"查不到数据");

            }

    }

5.1.3 题目管理

图5.3 即为编码实现的题目管理界面,管理员在该界面中可以导出题目,可以新增题目,可以对指定的题目信息进行修改,删除,同时可以查看用户对各个题目选项的统计信息,该统计信息是以饼图进行展示。

图5.3 题目管理界面

核心代码:

 /**

    * 后端详情

    */

    @RequestMapping("/info/{id}")

    public R info(@PathVariable("id") Long id, HttpServletRequest request){

        logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);

        ExamquestionEntity examquestion = examquestionService.selectById(id);

        if(examquestion !=null){

            //entity转view

            ExamquestionView view = new ExamquestionView();

            BeanUtils.copyProperties( examquestion , view );//把实体数据重构到view中

                //级联表

                ExampaperEntity exampaper = exampaperService.selectById(examquestion.getExampaperId());

                if(exampaper != null){

                    BeanUtils.copyProperties( exampaper , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段

                    view.setExampaperId(exampaper.getId());

                }

            //修改对应字典表字段

            dictionaryService.dictionaryConvert(view, request);

            return R.ok().put("data", view);

        }else {

            return R.error(511,"查不到数据");

        }

    }

    /**

    * 后端保存

    */

    @RequestMapping("/save")

    public R save(@RequestBody ExamquestionEntity examquestion, HttpServletRequest request){

        logger.debug("save方法:,,Controller:{},,examquestion:{}",this.getClass().getName(),examquestion.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));

        if(StringUtil.isEmpty(role))

            return R.error(511,"权限为空");

        Wrapper<ExamquestionEntity> queryWrapper = new EntityWrapper<ExamquestionEntity>()

            .eq("exampaper_id", examquestion.getExampaperId())

            .eq("examquestion_name", examquestion.getExamquestionName())

            .eq("examquestion_options", examquestion.getExamquestionOptions())

            .eq("examquestion_types", examquestion.getExamquestionTypes())

            .eq("examquestion_sequence", examquestion.getExamquestionSequence())

            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());

        ExamquestionEntity examquestionEntity = examquestionService.selectOne(queryWrapper);

        if(examquestionEntity==null){

            examquestion.setCreateTime(new Date());

            examquestionService.insert(examquestion);

            return R.ok();

        }else {

            return R.error(511,"表中有相同数据");

        }

    }

5.1.4 用户管理

图5.4 即为编码实现的用户管理界面,管理员在该界面中为用户重置密码,修改用户基本信息,新增用户,删除需要删除的用户信息。

图5.4 用户管理界面

核心代码:

 /**

    * 后端修改

    */

    @RequestMapping("/update")

    public R update(@RequestBody YonghuEntity yonghu, HttpServletRequest request){

        logger.debug("update方法:,,Controller:{},,yonghu:{}",this.getClass().getName(),yonghu.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));

        if(StringUtil.isEmpty(role))

            return R.error(511,"权限为空");

        //根据字段查询是否有相同数据

        Wrapper<YonghuEntity> queryWrapper = new EntityWrapper<YonghuEntity>()

            .notIn("id",yonghu.getId())

            .andNew()

            .eq("username", yonghu.getUsername())

            .or()

            .eq("yonghu_id_number", yonghu.getYonghuIdNumber())

            .or()

            .eq("yonghu_phone", yonghu.getYonghuPhone())

            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());

        YonghuEntity yonghuEntity = yonghuService.selectOne(queryWrapper);

        if("".equals(yonghu.getYonghuPhoto()) || "null".equals(yonghu.getYonghuPhoto())){

                yonghu.setYonghuPhoto(null);

        }

        if(yonghuEntity==null){

            //  String role = String.valueOf(request.getSession().getAttribute("role"));

            //  if("".equals(role)){

            //      yonghu.set

            //  }

            yonghuService.updateById(yonghu);//根据id更新

            return R.ok();

        }else {

            return R.error(511,"账户或者手机号或者身份证号已经被使用");

        }

    }

5.1.5 新闻资讯管理

图5.5 即为编码实现的新闻资讯管理界面,管理员在该界面中负责发布新闻资讯,更改新闻资讯的部分信息,删除需要删除的新闻资讯信息。

图5.5 新闻资讯管理界面

核心代码:

 /**

    * 后端列表

    */

    @RequestMapping("/page")

    public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){

        logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));

        String role = String.valueOf(request.getSession().getAttribute("role"));

        if(StringUtil.isEmpty(role))

            return R.error(511,"权限为空");

        else if("用户".equals(role))

            params.put("yonghuId",request.getSession().getAttribute("userId"));

        if(params.get("orderBy")==null || params.get("orderBy")==""){

            params.put("orderBy","id");

        }

        PageUtils page = newsService.queryPage(params);

        //字典表数据转换

        List<NewsView> list =(List<NewsView>)page.getList();

        for(NewsView c:list){

            //修改对应字典表字段

            dictionaryService.dictionaryConvert(c, request);

        }

        return R.ok().put("data", page);

    }

5.2 用户功能实现

5.2.1 问卷列表

图5.6 即为编码实现的问卷列表界面,用户在该界面中选择问卷并参与问卷调查。

图5.6 问卷列表界面

核心代码:

/**

    * 前端列表

    */

    @IgnoreAuth

    @RequestMapping("/list")

    public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){

        logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));

        // 没有指定排序字段就默认id倒序

        if(StringUtil.isEmpty(String.valueOf(params.get("orderBy")))){

            params.put("orderBy","id");

        }

        PageUtils page = examrecordService.queryPage(params);

        //字典表数据转换

        List<ExamrecordView> list =(List<ExamrecordView>)page.getList();

        for(ExamrecordView c:list)

            dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段

        return R.ok().put("data", page);

    }

    /**

    * 前端详情

    */

    @RequestMapping("/detail/{id}")

    public R detail(@PathVariable("id") Long id, HttpServletRequest request){

        logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id);

        ExamrecordEntity examrecord = examrecordService.selectById(id);

            if(examrecord !=null){

                //entity转view

                ExamrecordView view = new ExamrecordView();

                BeanUtils.copyProperties( examrecord , view );//把实体数据重构到view中

                //级联表

                    ExampaperEntity exampaper = exampaperService.selectById(examrecord.getExampaperId());

                if(exampaper != null){

                    BeanUtils.copyProperties( exampaper , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段

                    view.setExampaperId(exampaper.getId());

                }

                //级联表

                    YonghuEntity yonghu = yonghuService.selectById(examrecord.getYonghuId());

                if(yonghu != null){

                    BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段

                    view.setYonghuId(yonghu.getId());

                }

                //修改对应字典表字段

                dictionaryService.dictionaryConvert(view, request);

                return R.ok().put("data", view);

            }else {

                return R.error(511,"查不到数据");

            }

    }

5.2.2 问卷调查

图5.7 即为编码实现的问卷调查界面,用户在该界面中主要根据问卷调查题目信息进行选项答题,答题结束可以选择界面顶端的结束问卷调查按钮离开问卷调查界面。

图5.7 问卷调查界面

核心代码:

/**

    * 前端详情

    */

    @RequestMapping("/detail/{id}")

    public R detail(@PathVariable("id") Long id, HttpServletRequest request){

        logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id);

        ExamredetailsEntity examredetails = examredetailsService.selectById(id);

            if(examredetails !=null){

                //entity转view

                ExamredetailsView view = new ExamredetailsView();

                BeanUtils.copyProperties( examredetails , view );//把实体数据重构到view中

                //级联表

                    ExamquestionEntity examquestion = examquestionService.selectById(examredetails.getExamquestionId());

                if(examquestion != null){

                    BeanUtils.copyProperties( examquestion , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段

                    view.setExamquestionId(examquestion.getId());

                }

                //级联表

                    YonghuEntity yonghu = yonghuService.selectById(examredetails.getYonghuId());

                if(yonghu != null){

                    BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段

                    view.setYonghuId(yonghu.getId());

                }

                //修改对应字典表字段

                dictionaryService.dictionaryConvert(view, request);

                return R.ok().put("data", view);

            }else {

                return R.error(511,"查不到数据");

            }

    }

5.2.3 新闻资讯

图5.8 即为编码实现的新闻资讯界面,用户在该界面中浏览新闻资讯,在界面右上角的搜索框中编辑新闻标题可以获取匹配的新闻资讯信息。

图5.8 新闻资讯界面

核心代码:

  /**

    * 前端详情

    */

    @RequestMapping("/detail/{id}")

    public R detail(@PathVariable("id") Long id, HttpServletRequest request){

        logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id);

        NewsEntity news = newsService.selectById(id);

            if(news !=null){

                //entity转view

                NewsView view = new NewsView();

                BeanUtils.copyProperties( news , view );//把实体数据重构到view中

                //修改对应字典表字段

                dictionaryService.dictionaryConvert(view, request);

                return R.ok().put("data", view);

            }else {

                return R.error(511,"查不到数据");

            }

    }

5.2.4 问卷调查记录

图5.9 即为编码实现的问卷调查记录界面,用户在该界面中可以对参与问卷调查的记录信息进行查看。

图5.9 问卷调查记录界面

核心代码:

    @RequestMapping("/saveExamredetails")

    public R saveExamredetails(@RequestBody ExamredetailsEntity examredetails,Integer examrecordId, HttpServletRequest request){

        logger.debug("save方法:,,Controller:{},,examredetails:{}",this.getClass().getName(),examredetails.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));

        if(StringUtil.isEmpty(role)){

            return R.error(511,"权限为空");

        }else if(role.contains("用户id")){

            examredetails.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));

        }

        examredetails.setCreateTime(new Date());

        boolean insert = examredetailsService.insert(examredetails);

        if(!insert){

            return R.error();

        }

        return R.ok();

    }

6 系统测试

当系统测试环节开始的时候,也就说明对于系统的编码已经弄得大致通顺了,剩下来需要对一些模块和功能进行测试,这个环节就叫系统测试。在程序开发过程中,系统测试是整个开发过程必不可少的一个环节。原因很简单,系统开发人员在面对各种需求需要对各个模块进行编码,开发人员编写过程中,对于程序的理解全部都在编码里面,一人计短,当一个人去做一些事情的时候,把自己的理解变成成果,很有可能会出现理解偏差,甚至是理解错误,这个在程序开发过程中很常见。程序开发人员在面对复杂的逻辑,没有想象中的多么清晰,开发过程就是面对着一堆代码,不断的变换数据类型,并且对各种操作用计算机编程语言进行实现,这些很容易实现程序开发人员的想法,但是如果是比较复杂的逻辑,很可能会出现各种问题,这是无法避免的。所以说,需要额外的人员进行系统测试编写,不要站在程序开发人员的角度去思考问题,要站在用户使用的角度去发现问题,这样开发与测试的分离,有助于系统开发的强壮,让程序表达的更完美一些。之所以把系统测试安排到程序开发过程中的原因在于,当测试发现问题,就可以直接反馈到程序开发人员手里,可以以最快的时间解决问题,这样能大大的提高开发效率。总的来说,在整个软件开发过程中,系统测试这个环节也必须要重视的,所以必须在系统测试环节做好应该做好的事情,让程序开发从开始到结束都有一个完美的流程。

6.1 功能测试

本节主要选择一些功能进行具体测试描述,在相应的功能里面,根据不同的合法与不合法条件输入看程序是否设定的有相关的判断,能否达到使用效果。以下会描述部分功能的测试过程和结果。

6.1.1 登录功能测试

登录是一个常规功能,虽然是常规功能,但是用处很大,可以拒绝非法用户访问,只有合法用户才可以访问对应的功能,这样能保证程序设定的功能符合安全性要求。

表6.1 管理员登录功能测试表

管理员账号

管理员密码

结果

uuu

uuu

成功登录系统

yyy

uuu

登录失败

uuu

yyy

登录失败

只有正确的账号密码才会进行跳转到对应的功能区,如果输入的账号密码不对的话,肯定会有相关提示,用来提示操作人员注意输入正确的账号密码,这样有助于提高用户体验。这里以使用者提交错误的账号为“yyy”,正确的密码为“uuu”为例进行测试,具体反馈结果看下面。

6.1.2 修改密码功能测试

任何用户角色都有安全性要求,那么对应的密码最好是经常更改,只有经常更改才会降低坏人的有机可乘几率,达到密码保护的最低要求,当然,如果用户登录人离开了,为了防止其他人乘机篡改密码,那么也会设定旧密码要求,只有输入正确的旧密码才可以进行密码的修改。下面就是测试过程。

表6.2 修改密码功能测试表

之前的旧密码

设置的新密码

结果

uuu

yyy

成功修改密码

hhh

yyy

修改密码失败

uuu

修改密码失败

不管是旧密码错误还是新密码不合规,都会提示相应的要求,下面就是关于旧密码输入错误的提示。

6.2 系统测试结果

对在线问卷调查系统进行了各种检测,包含功能检测和性能检测,甚至是系统的操作性方面也进行了检测,以及兼容性检测,通过各方面检测结果来判定系统是符合设计目标,达到开发预期。系统是可以实现所开发的功能,并且在扩展性或者是稳定性上面,也有很好的表现,能完全的满足用户需求。

7 总结

由于本人学习的是计算机方面的专业,对于计算机软件方面的相关知识也进行过课堂上的学习以及课后的实际操作练习,因此,对于开发一款已经确定了课题的在线问卷调查系统,从功能需求,功能模块划分,数据库的选择,数据库的设计,编程语言的确定,系统界面的布局和设计等知识,我都有个大致的思路。所以,在参照软件设计思想以及设计流程的基础上,我运用已经具备的理论知识,加上后期从网络渠道获取的相关技术知识,我能够根据制定的系统开发时间安排完成各个阶段性的开发任务。并能够在系统完成开发后期,编写相应的系统文档。

在线问卷调查系统制作期间,我也遇到过一些难题,在最开始的时候,我并不知道该系统具体要设计几个功能模块,以及数据表需要设计几张表,还有对于开发技术的深度理论学习还不充分等,值得庆幸的是,我在面临这些困难时,我能够通过网络或者通过学院提供的图书馆寻求解决办法。比如在不知道具体功能的情况下,我从网上下载了很多的与在线问卷调查系统相关的程序,分析了它们的功能之后,我再结合即将开发的在线问卷调查系统进行综合分析,选取了适合在线问卷调查系统的功能部分,再结合实际情况以及使用者的需求确定本系统功能。对于数据表的设计,我先是在图书馆借阅了一本数据库方面的书籍进行查看,然后查看相似系统对于数据表的结构设计等知识,然后在本系统功能确定的情况下,结合本系统设计了配套的数据表,对于难度最大的开发技术部分,我花费了很多的时间研究网络上的相似系统的功能模块上的代码,一般都是对基础数据的增加,更新,查询或修改方面的代码,然后把本系统能够运用的代码部分在简单更改后进行使用,在完成了一个功能模块以及又一个功能模块之后,又经过了简单的测试工作,最终呈现出一个完整的能够解决用户实际问题的在线问卷调查系统。该系统唯一不足的就是代码方面还有很多重复的部分,不够精简,还有用户操作本系统,对于用户的误操作行为,本系统还不能及时反馈,这也是一大缺点。

在线问卷调查系统完成了,其相应的配套文档也需要进行编写,该文档主要描述在线问卷调查系统是如何进行分析,设计以及实现的,让其他阅读本文档的人增加对该系统的了解,编写文档过程中,由于自己平时对于办公软件的操作不是很频繁,根据学院要求的文档排版格式进行编辑也花了很多时间,在不断学习排版技巧以及对本系统配套文档的反复修改之后,最终在学院规定的时间内进行了文档定稿。

毕业项目各个工作进行到此,我也是收获颇丰,正因为自己努力学习知识,积极寻求解决办法,才让我能够提交一个完整的作品。制作毕业项目让我又得到了成长,不仅是专业知识的增加,也包括解决问题的能力得到了提高,很感谢学院给的制作毕业项目的机会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这是程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值