SSM+maven实现答题管理系统(四)

我们之前三篇文章实现了模板+题目+选项的增删,现在我们要完成答题管理系统的答题模块啦。

一.UI及功能设计

既然是用户答题,就要有一张表专门用来存放用户答题的答案。我的设想是这样的,我们点击答题按钮的时候,就显示出第一题,判断是否是模板下最后一题,来显示名为next按钮的字体样式为下一题还是完成。并且,对后台传过来的qsn_type进行区分,type=0的单选显示单选框,type=1的多选显示复选框,type=2的问答显示文本域,大概是如下效果。


单选.PNG
多选.PNG
问答.PNG

为此,next按钮要返回的json格式数据如下。


构建json.PNG

用PHP构造一个二维关联数组,其中二维数组中,还有一个二维数组,第一索引表示题目的order_num排序,第二索引表示option_num选项内容以及order_num选项排序号,最后将这个内层二维数组与别的参数使用PHP的array_merge函数进行数组合并,返回给html页面。

二.数据库表设计(psg_qsn_r表)

image.png

主要的就是choose对应用户选择的选项,1,2,3...对应A,B,C,如果是问答,存的就是一串字符串。

三.代码实现

首先是answer答题按钮的点击监听:

 $('#btn-answer').click(function() {
                // alert(id_array);
                layer.msg('加载中', {
                    icon: 16,
                    shade: 0.01,
                    time: '9999999'
                });
             var url = "survey/answer_list";
                var data = {
                    model_id: id_array //这里将当前的model_id数组传到后端
                }
                $.post(url, data, function(data) {
                    layer.close(layer.index); //关闭正在加载中弹出层
                    console.log(id_array);
                    if (data.code == 1) {
                        // alert(data.data[0].option_num);
                        if (data.data.bool_num == true) {
                            $('#next').text("完成");
                        }
                        $('#set-answer label[name="qsn_content1"]').css("width", "200px");
                        $('#set-answer label[name="qsn_content1"]').text(data.data.content);
                        if (data.data.qsn_type == 1) {
                            $.each(data.data, function(i, item) {
                                if (item.order_num == null) return false; //function中无法用break跳出 我们用return
                                //这边要将type也传过来 然后根据type来往anser_list中添加值

                                $('#answer_list').append(
                                    // ' <br/><label class="layui-form-label">' + item.order_num + ':</label>' +
                                    '<div class ="layui-input-block"><input type="checkbox" lay-skin="primary" name="checkbox[]" value="' + item.order_num + '" title="' + letter[item.order_num - 1] + ' : ' + item.option_num + '"></div>'

                                )
                            });
                            form.render('checkbox');
                        } else if (data.data.qsn_type == 0) {
                            $.each(data.data, function(i, item) {
                                if (item.order_num == null) return false; //function中无法用break跳出 我们用return
                                //这边要将type也传过来 然后根据type来往anser_list中添加值

                                $('#answer_list').append(
                                    // ' <br/><label class="layui-form-label">' + item.order_num + ':</label>' +
                                    '<div class ="layui-input-block"><input type="radio" lay-skin="primary" name="checkbox[]" value="' + item.order_num + '" title="' + letter[item.order_num - 1] + ' : ' + item.option_num + '"></div>'
                                )
                            });
                            form.render('radio');
                        } else if (data.data.qsn_type == 2) {

                            // if (item.order_num == null) return false; //function中无法用break跳出 我们用return
                            //这边要将type也传过来 然后根据type来往anser_list中添加值

                            $('#answer_list').append(
                                // ' <br/><label class="layui-form-label">' + item.order_num + ':</label>' +
                                ' <div class ="layui-input-block"><textarea name="text" id="text" required lay-verify="required" placeholder="请输入" class="layui-textarea"></textarea>'
                            )
                            form.render();

                        }



                        // alert(data.data.order_num);
                        getqsn_type(data.data.qsn_type);
                        getmodel_id(data.data.model_id);
                        getorder_num(data.data.order_num);
                        layer.open({
                            type: 1,
                            skin: 'layui-layer-rim', //加上边框
                            area: ['660px', '350px'], //宽高
                            content: $('#set-answer'),
                            cancel: function(index, layero) {
                                $('#answer_list').empty();
                                $('#next').text("下一题");
                                layer.close(index)
                                return false;
                            },
                            end: function() {
                                $('#answer_list').empty();
                                $('#next').text("下一题");
                                layer.closeAll();
                            }
                        });
                    } else {
                        layer.msg(data.msg, {
                            icon: 5
                        });
                    }
                }, "json");

            });

其中有对问题类型进行判别,并且对next样式作更改,然后是其对应的Controller层:

 @RequestMapping(value="Index/survey/answer_list")
    @ResponseBody
    public Map<String,Object> firstAnswer(HttpServletRequest req) throws IOException{
        String[] arr_modelId = req.getParameterValues("modelId[]");
        Map map=new HashMap();
        if (arr_modelId.length==0)
            return api.returnJson(3,"请选择模板答题");
        String modelId=arr_modelId[0];
        List<Qsn> qsnList=qsnService.findQsnList(modelId);
        if (qsnList.isEmpty()){
            return api.returnJson(2,"暂无题目");
        }
        boolean bool_num=false;
        //判断这套模板的第一道题目是否是最后一题
        if(qsnList.get(0).getOrderNum()==qsnService.findMaxOrderNum(modelId))
        bool_num=true;

        //不管是不是最后一题,都查询选项
        List<Detail> optionList=detailService.findOptionList(qsnList.get(0).getQsnId());

        if (!qsnList.get(0).getQsnType().equals(2)){//单选/多选
            map.put("qsn_type",qsnList.get(0).getQsnType());
            map.put("content",qsnList.get(0).getContent());
            map.put("modelId",qsnList.get(0).getModelId());
            map.put("orderNum",qsnList.get(0).getOrderNum());
            map.put("qsnId",qsnList.get(0).getQsnId());
            map.put("bool_num",bool_num);
            for (int i = 0; i <optionList.size() ; i++) {
                map.put(i,optionList.get(i));
            }
            return  api.returnJson(1,"success",map);

        }else{//问答题
            map.put("qsn_type",qsnList.get(0).getQsnType());
            map.put("content",qsnList.get(0).getContent());
            map.put("modelId",qsnList.get(0).getModelId());
            map.put("orderNum",qsnList.get(0).getOrderNum());
            map.put("qsnId",qsnList.get(0).getQsnId());
            map.put("bool_num",bool_num);
            for (int i = 0; i <optionList.size() ; i++) {
                map.put(i,optionList.get(i));
            }
            return  api.returnJson(1,"success",map);
//            return  api.returnJson(2,"此路不通");
        }

    }

然后是View层next按钮的监听事件,跟这个差不多。

 $('#next').click(function() {
                var qsn_type = t_qsn_type;

                var is_answered = false;
                if (qsn_type == 1) {
                    var count = $("#set-answer input[type='checkbox']:checked").length
                    if (count == 0) {
                        is_answered = true;
                    }
                    $("#set-answer input[type='checkbox']:checked").each(function() {
                        choice.push($(this).val());
                    });
                } else if (qsn_type == 0) {
                    var count = $("#set-answer input[type='radio']:checked").length
                    if (count == 0) {
                        is_answered = true;
                    }
                    $("#set-answer input[type='radio']:checked").each(function() {
                        choice.push($(this).val());
                    });
                } else if (qsn_type == 2) {
                    var count = $("#set-answer #text").length
                    if (count == 0) {
                        is_answered = true;
                    }
                    $("#set-answer #text").each(function() {
                        choice.push($(this).val());
                    });
                }
                if (is_answered == true) {
                    layer.msg('请选择答案');
                    return;
                }
                alert(choice);
                layer.msg('加载中', {
                    icon: 16,
                    shade: 0.01,
                    time: '9999999'
                });
                alert(choice);
              var url = "survey/next_qsn";
                var t_choice = choice;
                var model_id = t_model_id;
                var order_num = t_order_num;
                var data = {
                    model_id: model_id,
                    order_num: order_num,
                    choice: t_choice,
                    qsn_type: qsn_type
                }
                $.post(url, data, function(data) {
                    layer.close(layer.index); //关闭正在加载中弹出层
                    form.render(null, 'answer');
                    choice = [];
                    console.log(id_array);
                    if (data.code == 1) {
                        if (data.data.bool_num == true) {
                            $('#next').text("完成");
                        }
                        // alert(data.data[0].option_num);
                        $('#answer_list').empty();
                        $('#set-answer label[name="qsn_content1"]').text(data.data.content);
                        // alert(data.data.order_num);
                        if (data.data.qsn_type == 1) {
                            $.each(data.data, function(i, item) {
                                if (item.order_num == null) return false; //function中无法用break跳出 我们用return
                                $('#answer_list').append(
                                    // ' <br/><label class="layui-form-label">' + item.order_num + ':</label>' +
                                    '<div class ="layui-input-block"><input type="checkbox" lay-skin="primary" name="sex" value="' + item.order_num + '" title="' + letter[item.order_num - 1] + ' : ' + item.option_num + '"></div>'

                                )


                            });
                            form.render('checkbox');
                        } else if (data.data.qsn_type == 0) {
                            $.each(data.data, function(i, item) {
                                if (item.order_num == null) return false; //function中无法用break跳出 我们用return
                                //这边要将type也传过来 然后根据type来往anser_list中添加值

                                $('#answer_list').append(
                                    // ' <br/><label class="layui-form-label">' + item.order_num + ':</label>' +
                                    '<div class ="layui-input-block"><input type="radio" lay-skin="primary" name="checkbox[]" value="' + item.order_num + '" title="' + letter[item.order_num - 1] + ' : ' + item.option_num + '"></div>'
                                )
                            });
                            form.render('radio');
                        } else if (data.data.qsn_type == 2) {
                            $('#answer_list').append(
                                // ' <br/><label class="layui-form-label">' + item.order_num + ':</label>' +
                                ' <div class ="layui-input-block"><textarea name="text" id="text"  lay-verify="required" placeholder="请输入" class="layui-textarea"></textarea>'
                            )
                            form.render();

                        }
                        getqsn_type(data.data.qsn_type);
                        getmodel_id(data.data.model_id);
                        getorder_num(data.data.order_num);

                    } else if (data.code == 2) {
                        layer.msg(data.msg, {
                            icon: 6
                        });
                        setTimeout('layer.closeAll()', 2000);
                    } else if (data.code == 3) {
                        layer.msg(data.msg, {
                            icon: 5
                        });
                    }
                }, "json");

然后是Controller层代码。

   //下一题 这题答题录入 并返回下一题数据
//    modelId
//    orderNum
//    choice//数组
//    qsn_type
    @RequestMapping(value="Index/survey/next_qsn")
    @ResponseBody
    public Map<String,Object> answerRecord(HttpServletRequest req) throws IOException{
        String modelId = req.getParameter("modelId");
        String str_orderNum = req.getParameter("orderNum");
        String qsnType = req.getParameter("qsn_type");
        String[] choose = req.getParameterValues("array[]");
        Map map=new HashMap();
        short orderNum=Short.parseShort(str_orderNum);
        if(choose.length==0)
            return api.returnJson(3,"请答题");
        Qsn qsn=qsnService.findByOrderNum(orderNum,modelId);
        Choose c=new Choose();
        c.setQsnId(qsn.getQsnId());
        c.setModelId(qsn.getModelId());
        c.setFlightId(qsn.getFlightId());
        c.setQsnType(qsn.getQsnType());

        if (!qsnType.equals(2)) {
            String str_choose = StringUtils.join(choose, ",");

            List<Detail> optionList = detailService.findOptionList(qsn.getQsnId());
            for (int i = 0; i < choose.length; i++) {
                c.setDetailId(optionList.get(i).getDetailId());
                c.setChoose(choose[i]);
                UUID uuid = UUID.randomUUID();
                String psgQsnId = uuid.toString();
                c.setPsgQsnRId(psgQsnId);
                int isInsert = chooseService.InsertChoose(c);
            }
        }else{//如果是2的话 那就是整个录入进去
            String str_choose=choose[0];
            List<Detail> optionList = detailService.findOptionList(qsn.getQsnId());
            c.setDetailId(optionList.get(0).getDetailId());
            c.setChoose(str_choose);
            UUID uuid = UUID.randomUUID();
            String psgQsnId = uuid.toString();
            c.setPsgQsnRId(psgQsnId);
            int isInsert = chooseService.InsertChoose(c);
        }

        //然后我们要返回下一题的数据 这里注意orderNum+=1和orderNum=orderNum+1
        short s=1;
        orderNum=(short) (orderNum+s);
        Qsn qsnNext=qsnService.findByOrderNum(orderNum,modelId);
        boolean bool_num=false;
        if (qsnNext==null){
            return  api.returnJson(2,"恭喜您完成了答题");
        }
        if (qsnNext.getOrderNum()==qsnService.findMaxOrderNum(modelId)){
            bool_num=true;
        }


        //然后我们查询选项
        List<Detail> optionList1=detailService.findOptionList(qsnNext.getQsnId());
        if (!qsnNext.getQsnType().equals(2)){//单选/多选
            map.put("qsn_type",qsnNext.getQsnType());
            map.put("content",qsnNext.getContent());
            map.put("modelId",qsnNext.getModelId());
            map.put("orderNum",qsnNext.getOrderNum());
            map.put("qsnId",qsnNext.getQsnId());
            map.put("bool_num",bool_num);
            for (int i = 0; i <optionList1.size() ; i++) {
                map.put(i,optionList1.get(i));
            }
            return  api.returnJson(1,"success",map);

        }else {//问答题
            map.put("qsn_type", qsnNext.getQsnType());
            map.put("content", qsnNext.getContent());
            map.put("modelId", qsnNext.getModelId());
            map.put("orderNum", qsnNext.getOrderNum());
            map.put("qsnId", qsnNext.getQsnId());
            map.put("bool_num", bool_num);
            for (int i = 0; i < optionList1.size(); i++) {
                map.put(i, optionList1.get(i));
            }
            return api.returnJson(1, "success", map);
        }
    }

除了上一节提供的qsn和detail的Service层代码 这里还需要chooseService的代码:
chooseService:

package com.sl.example.service;

import com.sl.example.pojo.Choose;

import java.util.List;

public interface ChooseService {
    public List<Choose> findChooseByModelId(String modelId);

    List<Choose> countDataBy2Id(String qsnId,String detailId);

    public int InsertChoose(Choose record);

    List<Choose> findByQsnId(String qsnId);
}

chooseServiceImpl:

package com.sl.example.service;

import com.sl.example.dao.ChooseMapper;
import com.sl.example.dao.ModelMapper;
import com.sl.example.pojo.Choose;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

@Service("chooseService")
@Transactional
public class ChooseServiceImpl implements ChooseService{

    @Resource
    private ChooseMapper chooseMapper;
    @Override
    public List<Choose> findChooseByModelId(String modelId) {
        return chooseMapper.selectByModelId(modelId);
    }

    @Override
    public List<Choose> countDataBy2Id(String qsnId, String detailId) {
        return chooseMapper.selectByQsnIdDetailId(qsnId,detailId);
    }

    @Override
    public int InsertChoose(Choose record) {
        return chooseMapper.insertSelective(record);
    }

    @Override
    public List<Choose> findByQsnId(String qsnId) {
        return chooseMapper.selectByQsnId(qsnId);
    }
}

然后我们看看最终的效果。

四.效果一览

1.gif

OK,完成啦

项目仅供测试学习使用,拒绝任何形式的商业用途,转侵删。
项目源码关注公众号Code In Java,回复"答题管理系统"即可获取。除此之外,还有Java学习图谱,数据结构与算法资料等各种资料都可以在后台获取。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容

  • 我们之前三篇文章实现了模板+题目+选项的增删,现在我们要完成答题管理系统的答题模块啦。 一.UI及功能设计 既然是...
    秋笙fine阅读 3,091评论 0 10
  • 板块一 “不寒暄、不客套,开门见山、直奔主题”是我们这个课题组的闪亮特色!这不,今天的研讨主题就从一篇朴实无华...
    小力强阅读 789评论 0 2
  • 文/沉小安 -01- Bonbi姐是我的亲姐,在朋友圈放出照片的时候一大波人刷“你和你姐好像!” 事实上,我觉得我...
    沉小安阅读 447评论 0 2
  • 喜欢就是,在茫茫人海中一眼就能就认出你。
    月转长廊阅读 75评论 0 0