接上篇博文,这篇主要描述练习模块的代码逻辑,其中包括test页面,答题detail页面以及提交答题后答卷answer页面。

一、test页面


test页面其实就是从服务器获得章节练习题的内容,然后统计分类并显示,当用户点击对应的章节时跳转到答题detail页面并把该类题目信息传给detail页面。代码不多,如下:


var Bmob = require("../../utils/Bmob-1.6.3.min.js");

var Util = require("../../utils/util.js");

var that;

var app = getApp();

 

Page({

 

data: {

grids: [{

name: '概述',

path: "./detail/detail",

chapter: "第一章",

num: 0

},

{

name: '物理层',

path: "./detail/detail",

chapter: "第二章",

num: 0

},

{

name: '数据链路层',

path: "./detail/detail",

chapter: "第三章",

num: 0

},

{

name: '网络层',

path: "./detail/detail",

chapter: "第四章",

num: 0

},

{

name: '运输层',

path: "./detail/detail",

chapter: "第五章",

num: 0

},

{

name: '应用层',

path: "./detail/detail",

chapter: "第六章",

num: 0

},

{

name: '网络安全',

path: "./detail/detail",

chapter: "第七章",

num: 0

},

{

name: '音视频服务',

path: "./detail/detail",

chapter: "第八章",

num: 0

},

{

name: '无线移动网络',

path: "./detail/detail",

chapter: "第九章",

num: 0

},

{

name: '下一代因特网',

path: "./detail/detail",

chapter: "第十章",

num: 0

}

],

weChatUserInfo: wx.getStorageSync('weChatUserInfo'),

bmobUserInfo: wx.getStorageSync('bmobUserInfo'),

testChooseItems: {},

answerInfo: {}

},

onLoad: function() {

that = this;

that.getTestChooseItems();

},

onShow: function() {

that.getAnswerInfo();

},

// 获得排名信息

getAnswerInfo: function() {

wx.showToast({

title: '加载中..',

icon: 'loading',

duration: 10000

})

let query = Bmob.Query('test_error_item');

query.find().then(res => {

let userArray = [];

let correctCount = 0;

res.forEach((item, index) => {

if (item.userId.objectId == that.data.bmobUserInfo.objectId) {

if (item.result) correctCount += 1;

userArray.unshift(item);

}

});

wx.hideToast();

that.setData({

answerInfo: {

correctCount: correctCount,

itemCount: userArray.length,

correctE: (correctCount / userArray.length).toFixed(2)

}

});

}).catch();

},

getTestChooseItems: function() {

wx.showToast({

title: '加载中..',

icon: 'loading',

duration: 10000

})

let query = Bmob.Query('choose_item');

// 过滤掉课堂测试和模拟测试题目

query.equalTo("type", "!=", "课堂测试");

query.equalTo("type", "!=", "模拟测试");

query.find().then(res => {

//console.log(res);

for (var i = 0; i < that.data.grids.length; i++) {

let chapterChooseItems = []

for (var j = 0; j < res.length; j++) {

if (that.data.grids[i].chapter == res[j].series) {

chapterChooseItems.unshift(res[j]);

}

}

that.data.testChooseItems[that.data.grids[i].chapter] = chapterChooseItems;

that.data.grids[i].num = chapterChooseItems.length;

that.data.grids[i].path += '?ChooseItems=' +
JSON.stringify(chapterChooseItems);

}

that.setData({

grids: that.data.grids,

testChooseItems: that.data.testChooseItems

});

//获得答题结果信息

that.getAnswerInfo();

});

}

})

二、答题detail页面

1、获得test页面传过来的题目信息

2、解析并适配题目array object

3、解析用户提交的表单信息

4、因为后续还有错题练习,所以对表单信息分正确和错误类

5、遍历解析后的array,先从服务器删除已经存在的题目,然后上传新的答题


// pages/test/detail/detail.js

 

var Bmob = require("../../../utils/Bmob-1.6.3.min.js");

var Util = require("../../../utils/util.js");

var that;

var app = getApp();

 

Page({

 

/**

* 页面的初始数据

*/

data: {

bmobUserInfo: wx.getStorageSync('bmobUserInfo'),

chooseItemArray: [],

chooseType: null,

chooseSeries: null,

error_answers: [],

correct_answers: []

},

 

/**

* 生命周期函数--监听页面加载

*/

onLoad: function(options) {

that = this;

// 获得题目信息

var items = Util.sortArrayObject(JSON.parse(options.ChooseItems), 'number_id');

 

var choose_items = new Array();

for (var i = 0; i < items.length; i++) {

if (i == 0) {

that.setData({

chooseType: items[0].type,

chooseSeries: items[0].series

});

}

choose_items[i] = {

objectId: items[i].objectId,

number_id: items[i].number_id,

title: items[i].title,

answer: items[i].answer,

complain: items[i].complain,

chooseItems: [{

name: 'a',

value: items[i].choose_item_a

},

{

name: 'b',

value: items[i].choose_item_b

},

{

name: 'c',

value: items[i].choose_item_c

},

{

name: 'd',

value: items[i].choose_item_d

}

]

}

}

that.setData({

chooseItemArray: choose_items

});

},

formSubmit: function(e) {

let answers = e.detail.value;

for (var keyname in answers) {

if (answers[keyname] == "") {

wx.showToast({

title: '还有题没答噢~',

duration: 3000

});

return;

}

}

let index = 0;

let error_answers = [];

let correct_answers = [];

for (var answer in answers) {

if (answers[answer] != that.data.chooseItemArray[index].answer) {

error_answers.unshift({

userId: that.data.bmobUserInfo.objectId,

choose_item_id: that.data.chooseItemArray[index].objectId,

answer: answers[answer],

number_id: that.data.chooseItemArray[index].number_id,

complain: that.data.chooseItemArray[index].complain,

result: false

});

} else {

correct_answers.unshift({

userId: that.data.bmobUserInfo.objectId,

choose_item_id: that.data.chooseItemArray[index].objectId,

answer: answers[answer],

number_id: that.data.chooseItemArray[index].number_id,

complain: that.data.chooseItemArray[index].complain,

result: true

});

}

index += 1;

}

that.setData({

error_answers: error_answers,

correct_answers: correct_answers

});

// 开始上传题目

that.deleteItems(that.data.correct_answers, that.data.error_answers);

},

/**

* 把答对的题目从错误表删除再上传错误的题目

* correct_answers是答对的题目

* error_answers是答错的题目

*/

deleteItems: function(correct_answers, error_answers) {

wx.showToast({

title: '提交中...',

icon: 'loading',

duration: 10000

});

let answers = correct_answers.concat(error_answers);

 

answers.forEach((answer, index) => {

//console.log(index);

let query = Bmob.Query('test_error_item');

// 设置用户关联对象

let userIdPointer = Bmob.Pointer('_User');

let pointerUserId = userIdPointer.set(answer.userId);

// 设置选择题关联对象

let chooseItemIdPointer = Bmob.Pointer('choose_item'); //关联字段

let pointerIdChooseItemId = chooseItemIdPointer.set(answer.choose_item_id);

query.equalTo('userId', '==', pointerUserId);

query.equalTo('choose_item_id', '==', pointerIdChooseItemId);

query.find().then(res => {

if (res.length > 0)

res.destroyAll().then(res1 => {

//console.log(answers.length);

if (index == answers.length - 1) {

//console.log('if' + index);

// 全部删除相同的题目后上传新的题目

that.uploadItems(correct_answers, error_answers);

}

}).catch(err => {

wx.hideToast();

wx.showToast({

title: '提交失败',

duration: 2500

})

})

else {

if (index == answers.length - 1) {

// 全部删除相同的题目后上传新的题目

that.uploadItems(correct_answers, error_answers);

}

}

}).catch(err => {

wx.hideToast();

//console.log(err);

wx.showToast({

title: '提交失败',

duration: 2500

})

});

});

},

//上传答题信息

uploadItems: function(correct_answers, error_answers) {

var answers = correct_answers.concat(error_answers);

let query = Bmob.Query('test_error_item');

answers.forEach((answer, index) => {

query.set('answer', answer.answer);

query.set('result', answer.result);

query.save().then(res => {

query.get(res.objectId).then(res1 => {

// 设置用户关联对象

var userIdPointer = Bmob.Pointer('_User');

var pointerUserId = userIdPointer.set(answer.userId);

res1.set('userId', pointerUserId);

// 设置选择题关联对象

var chooseItemIdPointer = Bmob.Pointer('choose_item'); //关联字段

var pointerIdChooseItemId = chooseItemIdPointer.set(answer.choose_item_id);

res1.set('choose_item_id', pointerIdChooseItemId);

res1.save();

// 如果到数组的最后一个

if (index == answers.length - 1) {

wx.hideToast();

wx.showToast({

title: '提交成功...',

duration: 2500

});

setTimeout(function() {

var mAnswers = Util.sortArrayObject(answers, 'number_id');

 

// 结束当前页面转到

wx.redirectTo({

url: '../answer/answer?mAnswers=' + JSON.stringify({

chooseType: that.data.chooseType,

chooseSeries: that.data.chooseSeries,

chooseItemArray: that.data.chooseItemArray,

answers: mAnswers

})

});

}, 2500);

}

}).catch();

}).catch();

});

}

})

三、答卷answer页面

1、解析detail页面传过来的信息

2、计算答对的题目,在渲染时计算答题获得的分数


// pages/test/answer/answer.js

 

var Bmob = require("../../../utils/Bmob-1.6.3.min.js");

var Util = require("../../../utils/util.js");

var that;

var app = getApp();

Page({

/**

* 页面的初始数据

*/

data: {

mAnswers:null,

correctAnswerCount:null

},

/**

* 生命周期函数--监听页面加载

*/

onLoad: function (options) {

that = this;

that.setData({mAnswers:JSON.parse(options.mAnswers)});

let correctCount = 0;

that.data.mAnswers.answers.forEach((item)=>{

if (item.result) correctCount += 1;

});

that.setData({ correctAnswerCount: correctCount});

}

})

test页面的功能模块就是这样了,比较简单。下篇更新“我的”模块的页面设计以个人信息的修改。