微信小程序(看文档写实例九)微信小程序课堂宝APP实现练习模块逻辑代码

接上篇博文,这篇主要描述练习模块的代码逻辑,其中包括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页面的功能模块就是这样了,比较简单。下篇更新“我的”模块的页面设计以个人信息的修改。

全部评论

相关推荐

03-15 14:55
已编辑
门头沟学院 golang
bg:双非学院本&nbsp;ACM银&nbsp;go选手timeline:3.1号开始暑期投递3.7号第二家公司离职顽岩科技&nbsp;ai服务中台方向&nbsp;笔试➕两轮面试,二面挂(钱真的好多😭)厦门纳克希科技&nbsp;搞AI的,一面OC猎豹移动&nbsp;搞AIGC方向&nbsp;一面OC北京七牛云&nbsp;搞AI接口方向&nbsp;一面OC上海古德猫宁&nbsp;搞AIGC方向&nbsp;二面OC上海简文&nbsp;面试撞了直接拒深圳图灵&nbsp;搞AIGC方向一面后无消息懒得问了,面试官当场反馈不错其他小厂没记,通过率80%,小厂杀手😂北京字节&nbsp;具体业务不方便透露也是AIGC后端方向2.28约面&nbsp;(不知道怎么捞的我,我也没在别的地方投过字节简历哇)3.6一面&nbsp;一小时&nbsp;半小时拷打简历(主要是AIGC部分)剩余半小时两个看代码猜结果(经典go问题)➕合并二叉树(秒a,但是造case造了10分钟哈哈)一天后约二面3.12&nbsp;二面,让我挑简历上两个亮点说,主要说的docker容器生命周期管理和raft协议使用二分法优化新任leader上任后与follower同步时间。跟面试官有共鸣,面试官还问我docker底层cpu隔离原理和是否知道虚拟显存。之后一道easy算法,(o1空间解决&nbsp;给定字符串含有{和}是否合法)秒a,之后进阶版如何用10台机加快构建,想五分钟后a出来。面试官以为45分钟面试时间,留了18分钟让我跟他随便聊,后面考了linux&nbsp;top和free的部分数据说什么意思(专业对口了只能说,但是当时没答很好)。因为当时手里有7牛云offer,跟面试官说能否快点面试,马上另外一家时间到了。10分钟后约hr面3.13,上午hr面,下午走完流程offer到手3.14腾讯技术运营约面,想直接拒😂感受:&nbsp;因为有AIGC经验所以特别受AI初创公司青睐,AIGC后端感觉竞争很小(指今年),全是简历拷打,基本没有人问我八股(八股吟唱被打断.jpeg),学的东西比较广的同时也能纵向深挖学习,也运气比较好了哈哈可能出于性格原因,没有走主流Java路线,也没有去主动跟着课写项目,项目都是自己研究和写的哈哈
烤点老白薯:你根本不是典型学院本的那种人,贵了你这能力
查看7道真题和解析
点赞 评论 收藏
分享
03-30 19:30
石家庄学院 Java
野蛮的柯基在游泳:都能入股了,还得是Java
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务