基于thinkphp5开发的微信线上答题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/x947955250/article/details/80197220

最近学校要求应五四青年节做一个微信端的线上答题,苦逼学生党在网上没找到合适的源码,又没钱买微擎的模块快哭了,只能琢磨着自己做一个。。首先前端选择用weui,后台选择tp5开发,数据库mysql。。。开发过程中也遇到了些问题,所以记录下来,源码在文章最后,如有问题可添加wx:x947955250

先上效果图



数据库设计

tk表:题库


导入数据



user表:用户

扫描二维码关注公众号,回复: 3096894 查看本文章


插入测试的数据




问题一:实现随机答题功能

    思路一:

    比如答20道题,先从数据库随机抽取20道题,用tp5的{volist}标签一次性循环出来,并给每道题目加上style="display:none",先隐藏起来,每道题目分配一个id,id是循环出来的键值k,写个if条件 if k=1 说明是第一题,用jquery去掉display:none。。这样可以实现点击答案后显示下一题。 

        如何判断用户选择的答案是否正确? 我们循环tk表中的trueoption字段,在答题的html 放一个input标签,value值为循坏出来的正确答案,type设为hidden,由于是在微信端,我选择了直接用在js判断答案是否正确。等用户答完全部的题目再将结果传到控制器中处理。    

<!DOCTYPE html>
<html>
  <head>
    <title>答题</title>
    <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">



<link rel="stylesheet" href="__CSS__/weui.css">
<link rel="stylesheet" href="__CSS__/jquery-weui.css">
<link rel="stylesheet" href="__CSS__/demos.css">
<style>
#userimg img{border-radius:55px}

.b1{
 
  width:90%;
  height:480px;
  margin: auto;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;

} 

.title{
  text-align: center;
  padding-top: 25px;
  padding-bottom: 20px;
  font-size: 20px;
  font-weight: bold;
}
.ms{
  margin-top: 35px;
}
.weui_btn_plain_primary {
    color: #04be02;
    border: 1px solid #04be02;
}
.btnq{
  margin-top: 5%;
  height:300px;
}
.true{
  background-color:#90EE90;
}
.false{
  background-color:#FA8072;
}
body{
  background-image:url("__STATIC__/img/tbg.jpg");
  background-repeat:no-repeat;
  background-size:100% 100%;-moz-background-size:100% 100%;
}

</style>
<script type="text/javascript">
    // 对浏览器的UserAgent进行正则匹配,不含有微信独有标识的则为其他浏览器
    var useragent = navigator.userAgent;
    if (useragent.match(/MicroMessenger/i) != 'MicroMessenger') {
        //这里警告框会阻塞当前页面继续加载
       alert('已禁止本次访问:您必须在微信内访问本页面!');
        //以下代码是用javascript强行关闭当前页面
        var opened = window.open('about:blank', '_self');
        opened.opener = null;
        opened.close();
    }

</script>
  </head>

  <body ontouchstart>

   {volist name="res" id="vo" key="k" }
        {if condition="$k eq '1'"}
            <div class="b1"id="t{$k}">
            {else /}<div class="b1" style="display:none;"  id="t{$k}">
          {/if}
        <div class="weui-panel weui-panel_access" style="background-color:#000000;background-color:rgba(0,0,0,0.2);border-left:1px solid #E5E5E5;border-right:1px solid #E5E5E5;">
        <div class="weui-panel__hd">单选题 <span style="float:right">当前第{$k}题/共{$num}题</span></div>
        <hr>
        <div class="weui-panel__bd" style="margin-top:3%" >
          <input type="hidden" id="openid" value="{$openid}">

           <input type="hidden" id="a{$k}" value="{$vo.trueoption}">   <!-- 正确答案 -->
           
            <div class="weui-media-box__bd" style="margin-bottom:3%">
              <h4 class="weui-media-box__title" style="margin-left:3%;font-size:16px;color:#fff">{$k}.{$vo.title}</h4>
              
            </div>
          
         
        </div>
      </div>

      <div class="btnq">
        {if condition="$vo.optiona neq ''"}
        <a id="A" class="weui-btn weui_btn_plain_primary" style="width:90%;font-size:14px;text-align:left" href="javascript:void(0)">{$vo.optiona}</a>
        {/if}
        {if condition="$vo.optionb neq ''"}
        <a id="B" class="weui-btn weui_btn_plain_primary" style="width:90%;font-size:14px;text-align:left" href="javascript:void(0)">{$vo.optionb}</a>
        {/if}
        {if condition="$vo.optionc neq ''"}
        <a id="C" class="weui-btn weui_btn_plain_primary" style="width:90%;font-size:14px;text-align:left" href="javascript:void(0)">{$vo.optionc}</a>
        {/if}
        {if condition="$vo.optiond neq ''"}
        <a id="D" class="weui-btn weui_btn_plain_primary" style="width:90%;font-size:14px;text-align:left" href="javascript:void(0)">{$vo.optiond}</a>
        {/if}
      </div>



    </div>



    {/volist}
    
    <script src="__JS__/jquery-2.1.4.js"></script>
<script src="__JS__/fastclick.js"></script>
<script>
  $(function() {
    FastClick.attach(document.body);
       
    var j=1;
    var k=0;
    var a = new Array();  //用户判断第几题
    for(var i=0;i<20;i++)
    {
      a[i]=i+1;
    }
    var score=0;  //分数
    var ts=0;     //题数
    // console.log(openid);
  
  

    $("a").click(function (e){ 
        var id=e.target.id;  
        var as=$("#a"+a[k]).val();   //正确答案的值

        if(id==as)
        {
          $(this).addClass("true");    //添加绿色css效果 表示答对
          score=score+5;
          ts++;
        
          
        }else{
          $(this).addClass("false");
          
        }
        $(this).parents("div").delay(50).hide(0); //延迟隐藏,避免css效果显示不处理

        var next='t'+a[j];
        $("#"+next).delay(60).show(0);
        j++;
        k++;
        
        //console.log(k);
        if($.inArray(k+1, a)==-1)     //判断是否回答完毕
        {
          var openid=$("#openid").val();
          //alert("你的得分是"+score);
          window.location.href='http://这里改为你的域名.cn/dt/public/index/zf/index/?ts='+ts+'&score='+score+'&openid='+openid; 
          return;
        }
        
        
    });
});


</script>

<script src="__JS__/jquery-weui.js"></script>

  </body>
</html>


    思路二:

    用ajax将答案传到控制器判断是否是正确答案,并随机抽取下一题渲染到模板,循坏这个过程。由于当时时间有点急,我并没有选择这种方案,有兴趣的老铁可以试试


问题二:答题样式重叠

    这个问题是在上线后才发现的,是因为用户手速过快,hide延迟函数没来得及执行完就显示下一题(顺便吐槽一句,法克,点这么快是要去投胎吗)大概是这样的

                                                      

 这个只要将延迟函数的数值调小一点就可以了

$(this).parents("div").delay(50).hide(0); //调成合适的数值

问题三:最后一题显示不出来

    这个问题也是上线后才发现的,(当初找bug找得心态都爆炸了)抽取了20题,用户反映答到19题,第二十题显示不出来

    这个问题是因为数据库的tk表题库的id不连续造成的,当初我是随便上网找了个算法来实现随机取数据库题,算法本身没什么毛病,至于怎么找到这个bug的,就从算法所在的控制器中找,结果取出来之后,直接print_r($xxx);die; 再看下数据库就能发现了


就是少了个id为5的题目,只要将题库最后一题的id改为5就行了


使用方法

 我的公众号是授权了腾讯微校,所以在腾讯微校的拓展里添加扩展功能就行了



最后附上源码

https://gitee.com/gdhsxuan/dt

猜你喜欢

转载自blog.csdn.net/x947955250/article/details/80197220