|
|
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
|
|
|
});
|
|
|
}
|
|
|
});
|