最近学校要求应五四青年节做一个微信端的线上答题,苦逼学生党在网上没找到合适的源码,又没钱买微擎的模块,只能琢磨着自己做一个。。首先前端选择用weui,后台选择tp5开发,数据库mysql。。。开发过程中也遇到了些问题,所以记录下来,源码在文章最后,如有问题可添加wx:x947955250
先上效果图
数据库设计
tk表:题库
导入数据
user表:用户
插入测试的数据
问题一:实现随机答题功能
思路一:
比如答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