微信小程序实现答题功能

 更新时间:2022年06月30日 08:51:45   作者:kleinBlue.  
这篇文章主要为大家详细介绍了微信小程序实现答题功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了微信小程序实现答题功能的具体代码,供大家参考,具体内容如下

view

<view class="topnav">
  <image src="../../image/top.jpg"></image>
  <view class="back" bindtap="back"><image src="../../image/left.png"></image></view>
  <view class="sousuo">
   科普答题
  </view>
</view>
<view class="ioioi"></view>
<!-- 问答 -->
<!--pages/wenda/wenda.wxml--> 
<view class="heat">
  <view class="heatengo">
    <text>共计{{nums}}道题</text>
    <text>第{{curret}}道题</text>
    <text>每道题{{scoreFen}}分,总计:{{nums*scoreFen}}分</text>
  </view>
</view>
<view class="jingdutiao"> 
    <progress class="jingdu" font-size="24rpx"   percent="{{percent}}"  color="#29aeef" show-info stroke-width="8" border-radius="5" ></progress>
  </view>
<view class="contd">
  <!-- <image src="../../image/cont.png"></image> -->
  <view class="oik">
     <view class="tixing">{{subject.type}}</view>
<view class="heads">
<view class="page-section-title">{{curret}}.{{subject.title}}</view>
<view class="page-section" wx:if="{{zongfen>-1}}">
  <!-- <text> 用户得分:{{zongfen}}分</text>
  <text>总计答对题:{{score}}道题</text> -->
</view>
</view> 
  </view>
</view>
<view class="bottdi">
  <checkbox-group class="raadl" bindchange="checkboxChange" >
          <view class="timu" wx:for="{{subject['answer-options']}}" wx:key="index">
            <checkbox value="{{item.code}}" checked="{{isSelect}}" disabled="{{isdisable}}" />
              <text>{{item.code}}.{{item.content}}</text>
          </view>
      </checkbox-group>  
      <button  bindtap="submit" disabled="{{btndis}}">提交答案</button>
</view>
<view class="cuowudemo" wx:if="{{zongfen>-1}}">
<!--button-->
<view class="btn" bindtap="powerDrawer" data-statu="open">查看结果</view>
<!--mask-->
<view class="drawer_screen" bindtap="powerDrawer" data-statu="close" wx:if="{{showModalStatus}}"></view>
<!--content-->
<!--使用animation属性指定需要执行的动画-->
<view animation="{{animationData}}" class="drawer_box" wx:if="{{showModalStatus}}">
 <!--drawer content-->
 <view class="drawer_title">答题结果</view>
 <view class="drawer_content">
   <view class="jieguo">
    <text>总计:{{nums}}道题</text> 
    <text>总分:{{nums*scoreFen}}分</text>
    <text></text>
  </view>
  <view class="jieguo"> 
     <text> 得分:{{zongfen}}分</text>
      <text>总计答对题:{{score}}道题</text> 
  </view>
  <view class="jieguodibu">
    <view class="code"> 
       <view><image bindtap="tiku" src="../../image/moku1.png"></image>
       <text>合格率</text>
      </view>
       <view ><image bindtap="cuoti" src="../../image/moku2.png"></image>
       <text>查看错题</text>
      </view>
    </view>
  </view>
 </view>
 <view class="btn_ok" bindtap="powerDrawer" data-statu="close">取消</view>
</view>
</view>

 js

// pages/index2/index2.js
const app = getApp()
//打错的题目放到erroroption
let erroroption=[]
Page({
  data: {
    shuju: [],
    curret: 1, //第几题
    nums: '', //题库题目的总数量
    isSelect: false, 
    subject: null,
    scoreFen: 2, //定义每道单选题的分值
    percent: 0, //进度条数量计算
    userSelect: '', //用户选择的题目个数
    score: 0, //用户答对的题目数量
    curt: '', //如果用户有选择就更新进度条
    zongfen: -1, //用户的总分
    btndis: false, //最后一题checked停止
    totalerrow: 0 ,//用户答错题的个数
    suiji:'00',
    suiji1:"00",
    jifen:0,
  },
  back(){
    wx.navigateBack({
      delta: 0,
    })
  }, 
  onLoad: function (options) {
    wx.removeStorageSync('daui')
    var that = this;
    wx.request({
      url: 'XXXXXXXX?page=1&rows=10', //题目接口
      data: {
        
      },
      header: {
        'content-type': 'application/json' // 默认值
      },
      success(res) {
        that.setData({
          //shuju:JSON.stringify(res.data.data.rows)
          shuju: res.data.data.rows,
          subject: res.data.data.rows[that.data.curret - 1],
          nums: res.data.data.rows.length
        })
 
      }
    })
  },
  checkboxChange(e) {
    this.setData({
      userSelect: e.detail.value
    })
  },
  submit() {
    wx.setStorageSync('leng1', this.data.shuju.length)
    //1.获取用户选项,并判空
    let userSelect = this.data.userSelect;
    if (!userSelect || userSelect < 1) {
      wx.showToast({
        icon: 'none',
        title: '您还没有选择答案!',
      })
      return
    }
 
 //随机数答题
    var random = Math.floor(Math.random() * 10);
    this.setData({
      suiji: random
    })
  //  console.log("出现的随机数",this.data.suiji)
 
    //2.如果用户有选择就更新进度条
    let curt = this.data.curret; //2
    //进度条
    this.setData({
      percent: (curt / this.data.shuju.length * 100).toFixed(2),
    })
    //判断所选择的答案是否在正确答案中
    let daan = this.data.subject.answer_choices;
    let a = []
    daan.forEach(item => {
      a.push(item.content)
    })
    console.log("正确答案是:", a)
    let leng = daan.length;
    console.log("多选题选择了", userSelect)
    //选择答案的个数和长度
    let daan2 = userSelect;
    let leng2 = daan2.length;
    //3.判断用户是否答对
  if(a.sort().toString()==daan2.sort().toString()){
     let score = this.data.score+1;
    //  console.log("答对了:",score)
     this.setData({
      score:score
     })
  }else{
  //4.记录用户答错的题,帮用户查漏补缺
    let subjectNon  = this.data.subject;
     subjectNon.userSelect = userSelect;
     //将用户答错的题放到常量erroroption
     erroroption.push(subjectNon)
    //  console.log("错题",erroroption)
  }
   //判断是否答题结束4
    if(curt+1>this.data.shuju.length){
      //5.在用户答完最后一道题的时候对用户进行打分
      let userScore = this.data.score;
      let scoreFen = this.data.scoreFen;
      this.setData({
        zongfen:scoreFen*userScore,
        totalerrow:erroroption.length
      })
      wx.showToast({
        icon:'none',
        title: '已经是最后一题了!',
      })
      this.setData({
        btndis:true
      })
       //数据缓存
       wx.setStorageSync('errodat', erroroption)
 
       //数据读取
       let name = wx.getStorageSync('xingming');
       let phone = wx.getStorageSync('phone');
      let daui = wx.getStorageSync('daui');
      let chang = this.data.shuju.length;
     var that = this
      if(daui/chang*100>=80){
       let num = this.data.jifen
        let jifen = num+4
        console.log("加4分")
        console.log(jifen)
 
        that.setData({
          jifen:jifen
        })
      }else if(daui/chang*100>=60){
       let num = this.data.jifen
        console.log("加2分")
        let jifen = num+2
        console.log(jifen)
        that.setData({
          jifen:jifen
        })
      }else if(daui/chang*100<60){
       let num = this.data.jifen
        console.log("不加分")
        let jifen = num+1
        console.log(jifen)
        that.setData({
          jifen:jifen
        })
      }
       let integral = this.data.jifen;
       wx.setStorageSync('integral', integral)
       console.log(name)
       console.log(phone)
       console.log(integral)
       //向后端提交数据
       wx.request({
         url: 'url',
         header:{
           "Content-Type":"application/x-www-form-urlencoded"
         },
         method:"POST",
         data:{name:name,phone:phone,integral:integral},
         success:function(res){
            console.log(res.data)
            if (res.data.status == 0) {
              wx.showToast({
                title: '提交失败!!!',
                icon: 'loading',
                duration: 1500
              })
            }else{
              wx.showToast({
               title: '提交成功!!!',//这里打印出登录成功
                icon: 'success',
                duration: 1000
              })
            }
         },
         fail:function(){
 
         }
       })
      return
  }
  //  数据佳佳
  if (this.data.curret < this.data.shuju.length) {
    this.setData({
      userSelect:'',
      subject: this.data.shuju[this.data.suiji],
      curret: ++this.data.curret,
      isSelect:false
    })
    console.log("题目:",this.data.subject)
    return
  }
  },
  //自定义弹框
  powerDrawer: function (e) {
    var currentStatu = e.currentTarget.dataset.statu;
    this.util(currentStatu)
   },
   util: function(currentStatu){
    /* 动画部分 */
    // 第1步:创建动画实例
    var animation = wx.createAnimation({
     duration: 200, //动画时长
     timingFunction: "linear", //线性
     delay: 0 //0则不延迟
    });  
    // 第2步:这个动画实例赋给当前的动画实例
    this.animation = animation;
    // 第3步:执行第一组动画
    animation.opacity(0).rotateX(-100).step();
    // 第4步:导出动画对象赋给数据对象储存
    this.setData({
     animationData: animation.export()
    })
    // 第5步:设置定时器到指定时候后,执行第二组动画
    setTimeout(function () {
     // 执行第二组动画
     animation.opacity(1).rotateX(0).step();
     // 给数据对象储存的第一组动画,更替为执行完第二组动画的动画对象
     this.setData({
      animationData: animation
     })  
     //关闭
     if (currentStatu == "close") {
      this.setData(
       {
        showModalStatus: false
       }
      );
     }
    }.bind(this), 200)
    // 显示
    if (currentStatu == "open") {
     this.setData(
      {
       showModalStatus: true
      }
     );
    }
   },
   //查看成绩
   tiku(){
     wx.switchTab({
       url: '/pages/school/school',
     })
   },
   //6.查看错题
   cuoti(){
      //1.跳页之前存数据
    
      //2.用全局变量的,将数据传给全局
      //app.globalData.globalerror = erroroption;
       //如果页面有tabbar,跳转就要改成 wx.switchTab()跳转
       wx.navigateTo({   
         url: '/pages/errowoption/errowoption',   
       })
   }
})

css

.topnav{
  width: 100%;
  height: 160rpx;
  z-index: 9999;
  box-sizing: border-box;
  overflow: hidden;
  white-space: nowrap;
  position: fixed;
  top: 0;
}
.ioioi{
  width: 100%;
  height: 160rpx;
}
.topnav>image{
  width: 100%;
  height: 162rpx;
  position: absolute;
  z-index: -333;
}
.back{
  width: 60rpx;
  height: 60rpx;
  position: absolute;
  left: 10rpx;
  top: 80rpx;
}
.back>image{
  width: 60rpx;
  height: 60rpx;
}
.sousuo{
  width: 60%;
  height: 64rpx;
  position: absolute;
   bottom: 20rpx;
   border-radius: 50rpx;
   color: white;
   font-size: 30rpx;
   text-align: left;
   line-height: 64rpx;
   left: 96rpx;
}
/* asfasfasf */
page{
  background-color: white;
}
.heat{
  width: 100%;
  height: 140rpx;
}
.heatengo{
  margin: auto;
  width: 612rpx;
  height: 40rpx;
  background-color: #ccc;
  border-radius: 10rpx;
  margin-top: 60rpx;
  display: flex;
  justify-content: space-around;
  border-radius: 20rpx;
}
.heatengo>text{
  font-size: 26rpx;
}
.contd{
  height: 400rpx;
  width: 100%;
  position: relative;
}
.jingdutiao{
  width: 100%;
  height: 30rpx;
}
.jingdu{
  color:#29aeef;
}
.oik{
  z-index: 999;
  position: absolute;
  width: 75%;
  height:260rpx ;
  margin-left:75rpx ;
  margin-top: 85rpx;
}
.tixing{
  width: 100%;
  height: 60rpx;
  text-align: center;
  color: black;
}
.bottdi{
  width: 80%;
  height: auto;
  margin: auto;
}
.page-section-title{
  text-align: left;
  width: 100%;
  height: auto;
}
.timu{
   width: 90%;
   height: 70rpx;
   background-color: #ccc;
   border-radius: 20rpx;
   margin-top: 30rpx;
   line-height: 70rpx;
   padding: 0 25rpx;
  }
  .bottdi>button{
    margin-top: 60rpx;
    background-color: #29aeef;
    color: white;
    width: 300rpx;
    border-radius: 20rpx;
  }
  .page-section{
    width: 100%;
    height: 40rpx;
    display: flex;
    justify-content: space-around;
  }
  .cuowudemo{
    width: 100%;
    height: 160rpx;
    display: flex;
    justify-content: space-around;
    margin-top: 30rpx;
  }
   /*button*/
.btn {
  width: 75%;
  padding: 20rpx 0;
  border-radius: 20rpx;
  text-align: center;
  margin: 40rpx 10%;
  background: #006ead;
  color: #fff;
 }
  
 /*mask*/
 .drawer_screen {
  width: 100%;
  height: 100%;
  position: fixed;
  top: 0;
  left: 0;
  z-index: 1000;
  background: #000;
  opacity: 0.75;
  overflow: hidden;
 }
  
 /*content*/
 .drawer_box {
  width: 650rpx;
  overflow: hidden;
  position: fixed;
  top: 50%;
  left: 0;
  z-index: 1001;
  background: #FAFAFA;
  margin: -150px 50rpx 0 50rpx;
  border-radius: 15px;
 }
  
 .drawer_title{
  padding:15px;
  font: 20px "microsoft yahei";
  text-align: center;
  font-size: 30rpx;
 }
 .drawer_content {
  height: 210px;
  overflow-y: scroll; /*超出父盒子高度可滚动*/
 }
 .btn_ok{
  padding: 10px;
  font: 30rpx "microsoft yahei";
  text-align: center;
  border-top: 1px solid #E8E8EA;
  color: #3CC51F;
 }
  
 .top{
   padding-top:8px;
 }
 .bottom {
   padding-bottom:8px;
 }
 .title {
   height: 30px;
   line-height: 30px;
   width: 160rpx;
   text-align: center;
   display: inline-block;
   font: 300 28rpx/30px "microsoft yahei";
 }
 
 .input_base {
   border: 2rpx solid #ccc;
   padding-left: 10rpx;
   margin-right: 50rpx;
 }
 .input_h30{
   height: 30px;
   line-height: 30px;
 }
 .input_h60{
   height: 60px;
 }
 .input_view{
   font: 12px "microsoft yahei";
   background: #fff;
   color:#000;
   line-height: 30px;
 }
  
 input {
   font: 12px "microsoft yahei";
   background: #fff;
   color:#000 ;
 }
 radio{
   margin-right: 20px;
 }
 .grid { display: -webkit-box; display: box; }
 .col-0 {-webkit-box-flex:0;box-flex:0;}
 .col-1 {-webkit-box-flex:1;box-flex:1;}
 .fl { float: left;}
 .fr { float: right;}
 .jieguo{
   width: 580rpx;
   height: 60rpx;
   display: flex;
   justify-content: space-around;
   background-color: #29aeef;
   line-height: 60rpx;
   border-radius: 20rpx;
   color: white;
   margin: auto;
   margin-top: 18rpx;
 }
 .jieguodibu{
   width: 100%;
   height: 240rpx;
   display: flex;
 }
 .code{
  width: 520rpx;
  height: 240;
  margin: auto;
  display: flex;
  justify-content: space-between;
}
.code>view{
  width: 230rpx;
  height: 200;
  position: relative;
}
.code>view>text{
  position: absolute;
  font-size: 24rpx;
  bottom: 14rpx;
  left: 50rpx;
  color: white;
}
.code>view>image{
  width: 192rpx;
  height: 189rpx;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

相关文章

最新评论