近来百无聊赖,遂抽空做了一个答题小程序的系列教程,以及分享源码,是用云开发搭建的微信答题小程序v1.0。

界面截图

该答题小程序大抵如下图:

构造层级

次要程序由3个界面组成,别离是index,test以及result,构造层级如下图所示:

index:蕴含开始答题界面的页面布局与款式,以及js逻辑;
test:蕴含答题界面的页面布局与款式,以及js逻辑;
results:蕴含答题问题界面的页面布局与款式,以及js逻辑;
app:全局配置文件,全局变量等;
style:微信小程序的根本UI款式;
云开发数据库:存储相干题目数据。

1、index开始界面

次要性能是首页大图和信息的展现、按钮跳转以及分享。

(1)按钮跳转要害代码,就是catchtap点击事件与goToTest事件处理函数。

.wxml

<view catchtap="goToTest">    <button class='cu-btn bg-red round block lg'>开始答题</button></view>

.js

//事件处理函数  goToTest: function() {    wx.navigateTo({      url: '../test/test'    })  },

(2)分享实现,在button上应用open-type="share"属性,并且在页面js外面配置onShareAppMessage。

.wxml

<button class="cu-btn line-red round block lg margin-top" open-type="share"> 举荐给好友 </button>

.js

onShareAppMessage(res) {    return {      title: '@你,快来参加消防安全常识答题流动吧~'    }  },

2、test答题界面

答题界面须要做的事件有:

  • 与数据库连贯,获取题目数据;
  • 选中选项的前端交互;
  • 点击切换到下一题;
  • 零碎主动断定答题后果,计算得分 ;
  • 提交得分到数据库进行保留;
  • 答题完结,跳转至答题问题界面。

(1)与数据库连贯,获取题目数据;

// 获取题库-函数定义  getQuestionList() {    // 显示 loading 提示框    wx.showLoading({      title: '拼命加载中'    });    // 构建查问条件    activityQuestion.where({      // 指定查问条件,返回带新查问条件的新的汇合援用      true: _.exists(true)    })    .get()    .then(res => {      // 获取汇合数据,或获取依据查问条件筛选后的汇合数据。      console.log('[云数据库] [activityQuestion] 查问胜利')      console.log(res.data)      let data = res.data || [];            // 将数据从逻辑层发送到视图层,艰深的说,也就是更新数据到页面展现      this.setData({        questionList:data,        index: 0      });      // 暗藏 loading 提示框      wx.hideLoading();    })  },

(2)选中选项的前端交互;

.wxml

<radio-group class="radio-group" bindchange="radioChange">      <label class="radio my-choosebox" wx:for="{{questionList[index].option}}" wx:for-index="key"  wx:for-item="value" wx:key="index">        <radio value="{{key}}" checked="{{questionList[index].checked}}" />        <text class="margin-left-xs">{{value}}</text>      </label>    </radio-group>

.js

// 选中选项事件  radioChange(e){    this.data.chooseValue[this.data.index] = e.detail.value;  },

(3)点击切换到下一题;

.wxml

<button bindtap='nextSubmit' class="cu-btn bg-red round lg" wx:else>下一题</button>

.js

// 下一题/提交 按钮  nextSubmit(){    // 如果没有抉择    if (this.data.chooseValue[this.data.index] == undefined || this.data.chooseValue[this.data.index].length == 0) {        return wx.showToast({        title: '请抉择答案!',        icon: 'none',        duration: 2000      })    }    // 判断所抉择的选项是否为正确答案    this.chooseJudge();    // 判断是不是最初一题    this.lastJudge();  },// 判断是不是最初一题  lastJudge(){    if (this.data.index < this.data.questionList.length - 1) {      // 如果不是最初一题,则切换下一题      let index = this.data.index + 1;      this.setData({        index      })    } else {      // 如果是最初一题,则提交答卷      this.addExamRecord()    }  },

(4)零碎主动断定答题后果,计算得分 ;

// 判断所抉择的选项是否为正确答案  chooseJudge(){    var trueValue = this.data.questionList[this.data.index]['true'];    var chooseVal = this.data.chooseValue[this.data.index];    if (chooseVal.toString() != trueValue.toString()) {      // 答错则记录错题      this.data.wrong++;      this.data.wrongListSort.push(this.data.index);      this.data.wrongList.push(this.data.questionList[this.data.index]._id);    }else{      // 答对则累计总分      this.setData({        totalScore: this.data.totalScore + 5      })    }  },

(5)提交得分到数据库进行保留;

// 提交答卷  addExamRecord(){    wx.showLoading({      title: '提交答卷中'    });    let examResult = {      wrong: this.data.wrong,      totalScore: this.data.totalScore    };    activityRecord.add({      data: {        ...examResult,        createDate: db.serverDate()      }    }).then(res => {      // 跳转到答题后果页,查看问题      wx.redirectTo({        url: '../results/results?id=' + res._id      });      wx.hideLoading();    })  }

(6)答题完结,跳转至答题问题界面。

// 跳转到答题后果页,查看问题 wx.redirectTo({     url: '../results/results?id=' + res._id });

3、results答题问题界面

次要是查问答题状况和显示得分。在答题页面的时候,实现了提交得分到数据库进行保留。那么这里就能够从数据库中获取了。

.js

Page({  data: {    totalScore: null,    wrong: 0,    zql: null  },  onLoad(options) {    // 查看答题问题    this.getExamResult(options.id);  },  // 零碎主动判分  getExamResult(id){    wx.showLoading({      title: '零碎判分中'    });    activityRecord    .doc(id)    .get()    .then(res => {      let examResult = res.data;            let { wrong, totalScore } = examResult;      this.setData({        totalScore,        wrong,        zql: (20-wrong)/20*100      })      wx.hideLoading();    })  },})

好了,用云开发搭建的微信答题小程序,v1.0版本至此完结,源码曾经提交到gitee,撒花~

下一个版本v2.0正在在在开发中......