|
|
|
let originalData = [];
|
|
|
|
let updatedData = [];
|
|
|
|
let workbook;
|
|
|
|
let sheetName;
|
|
|
|
let skippedStudents = [];
|
|
|
|
// 导入学生名单
|
|
|
|
document.getElementById('excelFileInput').addEventListener('change', function (e) {
|
|
|
|
var file = e.target.files[0];
|
|
|
|
if (!file) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
var reader = new FileReader();
|
|
|
|
reader.onload = function (e) {
|
|
|
|
var data = new Uint8Array(e.target.result);
|
|
|
|
workbook = XLSX.read(data, { type: 'array' });
|
|
|
|
sheetName = workbook.SheetNames[0];
|
|
|
|
var worksheet = workbook.Sheets[sheetName];
|
|
|
|
originalData = XLSX.utils.sheet_to_json(worksheet);
|
|
|
|
updatedData = JSON.parse(JSON.stringify(originalData));
|
|
|
|
var displayDiv = document.getElementById('excelDataDisplay');
|
|
|
|
// 添加表头
|
|
|
|
displayDiv.innerHTML = '<div style="display: flex; justify-content: space-between;"><span>学号</span><span>姓名</span><span>积分</span></div>';
|
|
|
|
updatedData.forEach(function (row) {
|
|
|
|
var rowDiv = document.createElement('div');
|
|
|
|
Object.keys(row).forEach(key => {
|
|
|
|
var cellDiv = document.createElement('span');
|
|
|
|
cellDiv.textContent = row[key] + ' ';
|
|
|
|
rowDiv.appendChild(cellDiv);
|
|
|
|
});
|
|
|
|
displayDiv.appendChild(rowDiv);
|
|
|
|
});
|
|
|
|
console.log("导入学生名单成功。");
|
|
|
|
};
|
|
|
|
reader.readAsArrayBuffer(file);
|
|
|
|
});
|
|
|
|
|
|
|
|
// 点名按钮
|
|
|
|
document.getElementById('callButton').addEventListener('click', function () {
|
|
|
|
console.log("点名按钮被点击。");
|
|
|
|
// 去除上一次的高亮
|
|
|
|
var displayDiv = document.getElementById('excelDataDisplay');
|
|
|
|
Array.from(displayDiv.children).forEach(child => child.style.backgroundColor = '');
|
|
|
|
|
|
|
|
// 过滤掉因上次回答问题得分超过 2.5 而跳过的学生
|
|
|
|
let eligibleStudents = updatedData.filter(student => !skippedStudents.includes(student));
|
|
|
|
|
|
|
|
// 计算总积分
|
|
|
|
let totalPoints = eligibleStudents.reduce((acc, student) => {
|
|
|
|
let pointsKey = Object.keys(student).find(key => key.includes('积分'));
|
|
|
|
return acc + (pointsKey ? parseFloat(student[pointsKey]) : 0);
|
|
|
|
}, 0);
|
|
|
|
|
|
|
|
// 确保总积分不为零
|
|
|
|
if (totalPoints === 0) {
|
|
|
|
// 如果总积分为零,可以随机选择一个学生或者采取其他处理方式
|
|
|
|
let randomIndex = Math.floor(Math.random() * eligibleStudents.length);
|
|
|
|
let selectedStudent = eligibleStudents[randomIndex];
|
|
|
|
var displayDiv = document.getElementById('excelDataDisplay');
|
|
|
|
var rows = Array.from(displayDiv.children).slice(1);
|
|
|
|
var selectedRow = rows.find(row => row.querySelector('span').textContent.trim() === selectedStudent[Object.keys(selectedStudent)[0]]);
|
|
|
|
selectedRow.style.backgroundColor = 'lightblue';
|
|
|
|
// 获取选中行的学号和姓名并显示在主页面
|
|
|
|
var studentInfo = selectedRow.querySelectorAll('span');
|
|
|
|
var studentId = studentInfo[0].textContent.trim();
|
|
|
|
var studentName = studentInfo[1].textContent.trim();
|
|
|
|
var selectedStudentDiv = document.getElementById('selectedStudentInfo');
|
|
|
|
selectedStudentDiv.innerHTML = `<p>点到的学生学号:${studentId},姓名:${studentName}</p>`;
|
|
|
|
console.log(`随机选择了学生,学号:${studentId},姓名:${studentName}`);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// 计算每个学生被选中的概率(总积分越高,被点到的概率越低)
|
|
|
|
let probabilities = eligibleStudents.map(student => {
|
|
|
|
let pointsKey = Object.keys(student).find(key => key.includes('积分'));
|
|
|
|
let studentPoints = pointsKey ? parseFloat(student[pointsKey]) : 0;
|
|
|
|
return 1 / (studentPoints + 1) / totalPoints;
|
|
|
|
});
|
|
|
|
|
|
|
|
// 使用 Math.random 和 Date.now 作为种子
|
|
|
|
let randomValue = Math.random() + Date.now() % 1000 / 1000;
|
|
|
|
let cumulativeProbability = 0;
|
|
|
|
let selectedStudent;
|
|
|
|
for (let i = 0; i < eligibleStudents.length; i++) {
|
|
|
|
cumulativeProbability += probabilities[i];
|
|
|
|
if (randomValue < cumulativeProbability) {
|
|
|
|
selectedStudent = eligibleStudents[i];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (selectedStudent) {
|
|
|
|
var displayDiv = document.getElementById('excelDataDisplay');
|
|
|
|
var rows = Array.from(displayDiv.children).slice(1);
|
|
|
|
var selectedRow = rows.find(row => row.querySelector('span').textContent.trim() === selectedStudent[Object.keys(selectedStudent)[0]]);
|
|
|
|
selectedRow.style.backgroundColor = 'lightblue';
|
|
|
|
// 获取选中行的学号和姓名并显示在主页面
|
|
|
|
var studentInfo = selectedRow.querySelectorAll('span');
|
|
|
|
var studentId = studentInfo[0].textContent.trim();
|
|
|
|
var studentName = studentInfo[1].textContent.trim();
|
|
|
|
var selectedStudentDiv = document.getElementById('selectedStudentInfo');
|
|
|
|
selectedStudentDiv.innerHTML = `<p>点到的学生学号:${studentId},姓名:${studentName}</p>`;
|
|
|
|
console.log(`通过概率选择点到了学生,学号:${studentId},姓名:${studentName}`);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// 到达教室按钮
|
|
|
|
document.getElementById('arriveClassroom').addEventListener('click', function () {
|
|
|
|
console.log("到达教室按钮被点击。");
|
|
|
|
var displayDiv = document.getElementById('excelDataDisplay');
|
|
|
|
var rows = Array.from(displayDiv.children).slice(1);
|
|
|
|
if (rows.length > 0) {
|
|
|
|
var selectedRow = rows.find(row => row.style.backgroundColor === 'lightblue');
|
|
|
|
if (selectedRow) {
|
|
|
|
var studentInfo = selectedRow.querySelectorAll('span');
|
|
|
|
var studentId = studentInfo[0].textContent.trim();
|
|
|
|
var studentName = studentInfo[1].textContent.trim();
|
|
|
|
// 查找对应的学生并增加积分
|
|
|
|
var student = updatedData.find(student => student[Object.keys(student)[0]] === studentId && student[Object.keys(student)[1]] === studentName);
|
|
|
|
if (student) {
|
|
|
|
let pointsKey = Object.keys(student).find(key => key.includes('积分'));
|
|
|
|
if (pointsKey) {
|
|
|
|
let originalPoints = parseFloat(student[pointsKey]);
|
|
|
|
student[pointsKey] = originalPoints + 1;
|
|
|
|
// 更新显示
|
|
|
|
var rowSpans = selectedRow.querySelectorAll('span');
|
|
|
|
rowSpans[rowSpans.length - 1].textContent = student[pointsKey];
|
|
|
|
console.log(`学生${studentName}(学号:${studentId})到达教室,积分从${originalPoints}增加到${student[pointsKey]}`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// 准确重复所提问的问题
|
|
|
|
document.getElementById('repeatedQuestionYes').addEventListener('click', function () {
|
|
|
|
console.log("准确重复问题按钮被点击。");
|
|
|
|
var displayDiv = document.getElementById('excelDataDisplay');
|
|
|
|
var rows = Array.from(displayDiv.children).slice(1);
|
|
|
|
if (rows.length > 0) {
|
|
|
|
var selectedRow = rows.find(row => row.style.backgroundColor === 'lightblue');
|
|
|
|
if (selectedRow) {
|
|
|
|
var studentInfo = selectedRow.querySelectorAll('span');
|
|
|
|
var studentId = studentInfo[0].textContent.trim();
|
|
|
|
var studentName = studentInfo[1].textContent.trim();
|
|
|
|
// 查找对应的学生并增加积分
|
|
|
|
var student = updatedData.find(student => student[Object.keys(student)[0]] === studentId && student[Object.keys(student)[1]] === studentName);
|
|
|
|
if (student) {
|
|
|
|
let pointsKey = Object.keys(student).find(key => key.includes('积分'));
|
|
|
|
if (pointsKey) {
|
|
|
|
let originalPoints = parseFloat(student[pointsKey]);
|
|
|
|
student[pointsKey] = originalPoints + 0.5;
|
|
|
|
// 更新显示
|
|
|
|
var rowSpans = selectedRow.querySelectorAll('span');
|
|
|
|
rowSpans[rowSpans.length - 1].textContent = student[pointsKey];
|
|
|
|
console.log(`学生${studentName}(学号:${studentId})准确重复问题,积分从${originalPoints}增加到${student[pointsKey]}`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// 不能准确重复所提问的问题
|
|
|
|
document.getElementById('repeatedQuestionNo').addEventListener('click', function () {
|
|
|
|
console.log("不能准确重复问题按钮被点击。");
|
|
|
|
var displayDiv = document.getElementById('excelDataDisplay');
|
|
|
|
var rows = Array.from(displayDiv.children).slice(1);
|
|
|
|
if (rows.length > 0) {
|
|
|
|
var selectedRow = rows.find(row => row.style.backgroundColor === 'lightblue');
|
|
|
|
if (selectedRow) {
|
|
|
|
var studentInfo = selectedRow.querySelectorAll('span');
|
|
|
|
var studentId = studentInfo[0].textContent.trim();
|
|
|
|
var studentName = studentInfo[1].textContent.trim();
|
|
|
|
// 查找对应的学生并减少积分
|
|
|
|
var student = updatedData.find(student => student[Object.keys(student)[0]] === studentId && student[Object.keys(student)[1]] === studentName);
|
|
|
|
if (student) {
|
|
|
|
let pointsKey = Object.keys(student).find(key => key.includes('积分'));
|
|
|
|
if (pointsKey) {
|
|
|
|
let originalPoints = parseFloat(student[pointsKey]);
|
|
|
|
student[pointsKey] = originalPoints - 1;
|
|
|
|
// 更新显示
|
|
|
|
var rowSpans = selectedRow.querySelectorAll('span');
|
|
|
|
rowSpans[rowSpans.length - 1].textContent = student[pointsKey];
|
|
|
|
console.log(`学生${studentName}(学号:${studentId})不能准确重复问题,积分从${originalPoints}减少到${student[pointsKey]}`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// 增加自定义分数
|
|
|
|
document.getElementById('addScoreButton').addEventListener('click', function () {
|
|
|
|
console.log("增加自定义分数按钮被点击。");
|
|
|
|
var inputScore = parseFloat(document.getElementById('addScoreInput').value);
|
|
|
|
if (inputScore >= 0.5 && inputScore <= 3 && !isNaN(inputScore)) {
|
|
|
|
var displayDiv = document.getElementById('excelDataDisplay');
|
|
|
|
var rows = Array.from(displayDiv.children).slice(1);
|
|
|
|
if (rows.length > 0) {
|
|
|
|
var selectedRow = rows.find(row => row.style.backgroundColor === 'lightblue');
|
|
|
|
if (selectedRow) {
|
|
|
|
var studentInfo = selectedRow.querySelectorAll('span');
|
|
|
|
var studentId = studentInfo[0].textContent.trim();
|
|
|
|
var studentName = studentInfo[1].textContent.trim();
|
|
|
|
// 查找对应的学生并增加积分
|
|
|
|
var student = updatedData.find(student => student[Object.keys(student)[0]] === studentId && student[Object.keys(student)[1]] === studentName);
|
|
|
|
if (student) {
|
|
|
|
let pointsKey = Object.keys(student).find(key => key.includes('积分'));
|
|
|
|
if (pointsKey) {
|
|
|
|
let originalPoints = parseFloat(student[pointsKey]);
|
|
|
|
student[pointsKey] = originalPoints + inputScore;
|
|
|
|
// 更新显示
|
|
|
|
var rowSpans = selectedRow.querySelectorAll('span');
|
|
|
|
rowSpans[rowSpans.length - 1].textContent = student[pointsKey];
|
|
|
|
|
|
|
|
// 如果得分超过 2.5 分,将该学生加入跳过列表
|
|
|
|
if (student[pointsKey] > 2.5) {
|
|
|
|
skippedStudents.push(student);
|
|
|
|
}
|
|
|
|
console.log(`学生${studentName}(学号:${studentId})增加自定义分数${inputScore},积分从${originalPoints}增加到${student[pointsKey]}`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
alert('输入的分数应在 0.5 到 3 之间且为有效数字。');
|
|
|
|
}
|
|
|
|
});
|
|
|
|
// 按积分从高到低排序
|
|
|
|
document.getElementById('sortByPointsButton').addEventListener('click', function () {
|
|
|
|
updatedData.sort((a, b) => {
|
|
|
|
let pointsKeyA = Object.keys(a).find(key => key.includes('积分'));
|
|
|
|
let pointsKeyB = Object.keys(b).find(key => key.includes('积分'));
|
|
|
|
return (pointsKeyB ? parseFloat(b[pointsKeyB]) : 0) - (pointsKeyA ? parseFloat(a[pointsKeyA]) : 0);
|
|
|
|
});
|
|
|
|
var displayDiv = document.getElementById('excelDataDisplay');
|
|
|
|
displayDiv.innerHTML = '<div style="display: flex; justify-content: space-between;"><span>学号</span><span>姓名</span><span>积分</span></div>';
|
|
|
|
updatedData.forEach(function (row) {
|
|
|
|
var rowDiv = document.createElement('div');
|
|
|
|
Object.keys(row).forEach(key => {
|
|
|
|
var cellDiv = document.createElement('span');
|
|
|
|
cellDiv.textContent = row[key] + ' ';
|
|
|
|
rowDiv.appendChild(cellDiv);
|
|
|
|
});
|
|
|
|
displayDiv.appendChild(rowDiv);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
// 按学号从小到大排序
|
|
|
|
document.getElementById('sortByStudentIdButton').addEventListener('click', function () {
|
|
|
|
updatedData.sort((a, b) => {
|
|
|
|
return a[Object.keys(a)[0]] - b[Object.keys(b)[0]];
|
|
|
|
});
|
|
|
|
var displayDiv = document.getElementById('excelDataDisplay');
|
|
|
|
displayDiv.innerHTML = '<div style="display: flex; justify-content: space-between;"><span>学号</span><span>姓名</span><span>积分</span></div>';
|
|
|
|
updatedData.forEach(function (row) {
|
|
|
|
var rowDiv = document.createElement('div');
|
|
|
|
Object.keys(row).forEach(key => {
|
|
|
|
var cellDiv = document.createElement('span');
|
|
|
|
cellDiv.textContent = row[key] + ' ';
|
|
|
|
rowDiv.appendChild(cellDiv);
|
|
|
|
});
|
|
|
|
displayDiv.appendChild(rowDiv);
|
|
|
|
});
|
|
|
|
});
|