diff --git a/3.0 pages rollcall.js b/3.0 pages rollcall.js new file mode 100644 index 0000000..a1a9f90 --- /dev/null +++ b/3.0 pages rollcall.js @@ -0,0 +1,208 @@ +const db = wx.cloud.database(); +const app = getApp(); + +Page({ + data: { + students: [], + selectedStudent: null, + score: '', + questionRepeatedCorrectly: false, + additionalScore: 0, + doublePoints: false, + updatedScore: null + }, + + onLoad: function() { + this.getStudents(); + }, + + // 获取学生列表 + getStudents: function() { + const MAX_LIMIT = 20; + db.collection('students').count().then(res => { + const total = res.total; + const batchTimes = Math.ceil(total / MAX_LIMIT); + const tasks = []; + for (let i = 0; i < batchTimes; i++) { + const promise = db.collection('students').skip(i * MAX_LIMIT).limit(MAX_LIMIT).get(); + tasks.push(promise); + } + Promise.all(tasks).then(results => { + const students = results.reduce((acc, cur) => { + return acc.concat(cur.data); + }, []); + this.setData({ + students: students + }); + app.globalData.students = students; + console.log('Students retrieved:', students); + }).catch(err => { + console.error('Failed to get students:', err); + wx.showToast({ + title: '获取学生信息失败', + icon: 'none' + }); + }); + }).catch(err => { + console.error('Failed to count students:', err); + wx.showToast({ + title: '获取学生数量失败', + icon: 'none' + }); + }); + }, + + // 随机点名 + randomRollCall: function() { + const students = this.data.students; + if (students.length === 0) { + wx.showToast({ + title: '没有学生信息', + icon: 'none' + }); + return; + } + + const totalPoints = students.reduce((sum, student) => sum + Math.max(0, 10 - student.points), 0); + let randomPoint = Math.random() * totalPoints; + let cumulativePoint = 0; + + let selectedStudent = null; + for (const student of students) { + cumulativePoint += Math.max(0, 10 - student.points); + if (randomPoint <= cumulativePoint) { + selectedStudent = student; + break; + } + } + + if (selectedStudent) { + this.setData({ + selectedStudent: selectedStudent + }); + wx.showModal({ + title: '点名成功', + content: `点到的同学是:${selectedStudent.name} (${selectedStudent.id})`, + showCancel: false + }); + + // 触发双倍积分事件 + this.triggerDoublePointsEvent(selectedStudent); + + // 初始积分更新:到达课堂 +1 分 + this.updateInitialPoints(1); + } else { + wx.showToast({ + title: '点名失败', + icon: 'none' + }); + } + }, + + // 触发双倍积分事件 + triggerDoublePointsEvent: function(student) { + const probability = 0.1; // 10%的概率触发双倍积分 + if (Math.random() < probability) { + this.setData({ + doublePoints: true + }); + wx.showToast({ + title: '双倍积分!', + icon: 'success' + }); + } else { + this.setData({ + doublePoints: false + }); + } + }, + + // 输入评分 + inputScore: function(e) { + this.setData({ + additionalScore: parseFloat(e.detail.value) + }); + }, + + // 初始积分更新函数 + updateInitialPoints: function(baseScore) { + const student = this.data.selectedStudent; + student.points += baseScore; + this.saveStudentPoints(student); + }, + + // 更新积分 + updatePoints: function() { + const student = this.data.selectedStudent; + let score = 1; // 基础到达课堂积分+1 + console.log(`Initial score: ${score}`); + + // 判断是否能准确重复所提问的问题 + if (this.data.questionRepeatedCorrectly) { + score += 0.5; + console.log('Accurate repetition: +0.5'); + // 如果准确回答问题,输入要加的分数 + score += this.data.additionalScore; + console.log(`Accurate answer score: +${this.data.additionalScore}`);//调试 + } else { + score -= 1; + console.log('Inaccurate repetition: -1');//调试 + } + + console.log(`Score before double points: ${score}`);//调试 + // 如果触发双倍积分事件,积分加倍 + if (this.data.doublePoints) { + score *= 2; + console.log('Double points applied'); + } + + console.log(`Final computed score: ${score}`); + student.points += score; + this.setData({ updatedScore: student.points }); + this.saveStudentPoints(student); + }, + + // 学生未到 + studentAbsent: function() { + const student = this.data.selectedStudent; + let score = -1; // 学生未到,扣1分 + + student.points += score; + this.setData({ updatedScore: student.points }); + this.saveStudentPoints(student); + }, + + // 保存学生积分 + saveStudentPoints: function(student) { + db.collection('students').doc(student._id).update({ + data: { + points: student.points + } + }).then(() => { + this.getStudents(); + wx.showToast({ + title: '积分更新成功', + icon: 'success' + }); + }).catch(err => { + console.error('Failed to update student points:', err); + wx.showToast({ + title: '积分更新失败', + icon: 'none' + }); + }); + }, + + // 设置回答问题的情况 + setQuestionRepeatedCorrectlyTrue: function() { + this.setData({ + questionRepeatedCorrectly: true + }); + }, + + setQuestionRepeatedCorrectlyFalse: function() { + this.setData({ + questionRepeatedCorrectly: false + }); + } +});