Delete 课堂随机点名v1.6.html

This commit is contained in:
2025-04-27 08:58:08 +08:00
parent d33c389ad3
commit 3a2026b561

View File

@@ -1,361 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>课堂随机点名系统</title>
<style>
body {
margin: 0;
padding: 20px;
background: linear-gradient(135deg, #ff9a9e 0%, #fad0c4 100%);
font-family: 'Comic Sans MS', cursive;
min-height: 100vh;
}
.container {
max-width: 800px;
margin: 0 auto;
text-align: center;
}
#title {
color: #6a1b9a;
font-size: 2.5em;
text-shadow: 2px 2px 4px rgba(0,0,0,0.2);
margin-bottom: 30px;
}
#display {
height: 200px;
background: rgba(255,255,255,0.9);
border-radius: 20px;
box-shadow: 0 8px 16px rgba(0,0,0,0.2);
margin: 20px 0;
display: flex;
align-items: center;
justify-content: center;
font-size: 2.2em;
color: #2c3e50;
transition: all 0.3s ease;
flex-direction: row;
gap: 20px;
white-space: nowrap;
padding: 0 20px;
overflow-x: auto;
}
.controls {
display: flex;
flex-direction: column;
gap: 15px;
align-items: center;
}
.button-group {
display: flex;
gap: 15px;
align-items: center;
}
button {
padding: 12px 30px;
font-size: 1.2em;
border: none;
border-radius: 25px;
background: #3498db;
color: white;
cursor: pointer;
transition: transform 0.2s;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
}
button:hover {
transform: translateY(-2px);
background: #2980b9;
}
#speedControl {
width: 200px;
margin: 10px 0;
}
.highlight {
background-color: #f1c40f !important;
color: #c0392b !important;
transform: scale(1.1);
}
.student-id {
font-size: 0.8em;
color: #6a1b9a;
font-weight: bold;
}
.pinyin {
font-size: 0.6em;
color: #7f8c8d;
font-style: italic;
}
.export-btn {
background: #27ae60 !important;
margin-top: 10px;
}
.clear-btn {
background: #e74c3c !important;
margin-top: 10px;
}
.mark-absent-btn {
background: #e67e22 !important;
}
@media (max-width: 480px) {
#display {
font-size: 1.8em;
gap: 10px;
}
.button-group {
flex-direction: column;
}
}
</style>
</head>
<body>
<div class="container">
<h1 id="title">课堂点名系统</h1>
<div id="display">点击开始</div>
<div class="controls">
<input type="range" id="speedControl" min="1" max="10" value="5">
<div class="button-group">
<button onclick="toggleRoll()">开始点名</button>
<button onclick="markAbsent()" class="mark-absent-btn">标记未到场</button>
</div>
<button class="export-btn" onclick="exportAbsentList()">导出未到场名单</button>
<button class="clear-btn" onclick="clearStorage()">清空考勤数据</button>
</div>
</div>
<script>
let names = [
{ id: "3216217112", name: "戴旭斌", pinyin: "Dài Xùbīn" },
{ id: "3225201002", name: "张翔", pinyin: "Zhāng Xiáng" },
{ id: "3225303021", name: "沈镐棚", pinyin: "Shěn Gàopéng" },
{ id: "3226217001*", name: "艾力坎木·麦麦提", pinyin: "Àilǐkǎnmù·Màimàití" },
{ id: "3226217002", name: "王诚嘉仪", pinyin: "Wáng Chéngjiāyí" },
{ id: "3226217003", name: "陈亭文", pinyin: "Chén Tíngwén" },
{ id: "3226217004", name: "周慧琳", pinyin: "Zhōu Huìlín" },
{ id: "3226217005", name: "蔡启轩", pinyin: "Cài Qǐxuān" },
{ id: "3226217007", name: "蔡慧敏", pinyin: "Cài Huìmǐn" },
{ id: "3226217008", name: "林淑雯", pinyin: "Lín Shùwén" },
{ id: "3226217011", name: "林莹", pinyin: "Lín Yíng" },
{ id: "3226217012", name: "王钦昊", pinyin: "Wáng Qínhào" },
{ id: "3226217013", name: "刘恒", pinyin: "Liú Héng" },
{ id: "3226217015", name: "连征宇", pinyin: "Lián Zhēngyǔ" },
{ id: "3226217017", name: "陈王斌", pinyin: "Chén Wángbīn" },
{ id: "3226217019", name: "张旺", pinyin: "Zhāng Wàng" },
{ id: "3226217020", name: "陈锦杨", pinyin: "Chén Jǐnyáng" },
{ id: "3226217021", name: "张柏宗", pinyin: "Zhāng Bǎizōng" },
{ id: "3226217024", name: "许昊", pinyin: "Xǔ Hào" },
{ id: "3226217025", name: "高健", pinyin: "Gāo Jiàn" },
{ id: "3226217026", name: "陈鸿铭", pinyin: "Chén Hóngmíng" },
{ id: "3226217027", name: "艾志龙", pinyin: "Ài Zhìlóng" },
{ id: "3226217029", name: "吴文翔", pinyin: "Wú Wénxiáng" },
{ id: "3226217030", name: "邱炜彬", pinyin: "Qiū Wěibīn" },
{ id: "3226217031", name: "童伟烽", pinyin: "Tóng Wěifēng" },
{ id: "3226217032", name: "杨家蓥", pinyin: "Yáng Jiāyíng" },
{ id: "3226217033", name: "范龙翔", pinyin: "Fàn Lóngxiáng" },
{ id: "3226217034", name: "柳晓鑫", pinyin: "Liǔ Xiǎoxīn" },
{ id: "3226217035", name: "韩俊阳", pinyin: "Hán Jùnyáng" },
{ id: "3226217038", name: "谢楸荣", pinyin: "Xiè Qiūróng" },
{ id: "3226217040", name: "杨嘉正", pinyin: "Yáng Jiāzhèng" },
{ id: "3226217042", name: "何世杰", pinyin: "Hé Shìjié" },
{ id: "3226217043", name: "范志强", pinyin: "Fàn Zhìqiáng" },
{ id: "3226217044", name: "沈金豪", pinyin: "Shěn Jīnháo" },
{ id: "3225602050", name: "张智翔", pinyin: "Zhāng Zhìxiáng" },
{ id: "3226217045*", name: "肖凯提·吾布力", pinyin: "Xiào Kǎidī·Wūbùlì" },
{ id: "3226217046", name: "张成鑫", pinyin: "Zhāng Chéngxīn" },
{ id: "3226217047", name: "余晨湘", pinyin: "Yú Chénxiāng" },
{ id: "3226217048", name: "夏仲晨", pinyin: "Xià Zhòngchén" },
{ id: "3226217050", name: "夏敏鑫", pinyin: "Xià Mǐnxīn" },
{ id: "3226217054", name: "杨珮孺", pinyin: "Yáng Pèirú" },
{ id: "3226217055", name: "杨光辉", pinyin: "Yáng Guānghuī" },
{ id: "3226217057", name: "郑泽煜", pinyin: "Zhèng Zéyù" },
{ id: "3226217058", name: "林怡恒", pinyin: "Lín Yíhén" },
{ id: "3226217059", name: "杨益坤", pinyin: "Yáng Yìkūn" },
{ id: "3226217062", name: "陈申恒", pinyin: "Chén Shēnhéng" },
{ id: "3226217063", name: "林弘毅", pinyin: "Lín Hóngyì" },
{ id: "3226217065", name: "赵子睿", pinyin: "Zhào Zǐruì" },
{ id: "3226217068", name: "王哲", pinyin: "Wáng Zhé" },
{ id: "3226217069", name: "卢榕平", pinyin: "Lú Róngpíng" },
{ id: "3226217070", name: "林德尧", pinyin: "Lín Déyáo" },
{ id: "3226217074", name: "邱林冰", pinyin: "Qiū Lín Bīng" },
{ id: "3226217078", name: "陈斌", pinyin: "Chén Bīn" },
{ id: "3226217079", name: "林忠阳", pinyin: "Lín Zhōngyáng" },
{ id: "3226217080", name: "徐桓煊", pinyin: "Xú Huánxuān" },
{ id: "3226217081", name: "许益忠", pinyin: "Xǔ Yìzhōng" },
{ id: "3226217082", name: "陈其锋", pinyin: "Chén Qífēng" },
{ id: "3226217084", name: "林成烁", pinyin: "Lín Chéngshuò" },
{ id: "3226217087", name: "叶宇晨", pinyin: "Yè Yǔchén" },
{ id: "3226217089", name: "罗举汉", pinyin: "Luó Jǔhàn" },
{ id: "3226217090", name: "雷贺棋", pinyin: "Léi Hèqí" },
{ id: "3226217095", name: "陈佳垚", pinyin: "Chén Jiāyáo" },
{ id: "3226217097", name: "李诗燕", pinyin: "Lǐ Shīyàn" },
{ id: "3226217099", name: "叶荫华", pinyin: "Yè Yīnhuá" },
{ id: "3226217103", name: "寿高弘", pinyin: "Shòu Gāohóng" },
{ id: "3226217105", name: "杨俊龙", pinyin: "Yáng Jùnlóng" },
{ id: "3226217109", name: "郑力天", pinyin: "Zhèng Lìtiān" },
{ id: "3226217110", name: "杨松涛", pinyin: "Yáng Sōngtāo" },
{ id: "3226217111", name: "王俊仁", pinyin: "Wáng Jùnrén" },
{ id: "3226217113", name: "钟梓健", pinyin: "Zhōng Zǐjiàn" },
{ id: "3196202063*", name: "闫丁", pinyin: "Yán Dīng" },
{ id: "3226217114", name: "周兴城", pinyin: "Zhōu Xīngchéng" },
{ id: "3226217117", name: "李庚儒", pinyin: "Lǐ Gēngrú" },
{ id: "3226217119", name: "杨锦", pinyin: "Yáng Jǐn" },
{ id: "3226217121", name: "林志", pinyin: "Lín Zhì" },
{ id: "3226217122", name: "郑如龙", pinyin: "Zhèng Rúlóng" },
{ id: "3226217123", name: "林雨盛", pinyin: "Lín Yǔshèng" },
{ id: "3226217127", name: "肖镇国", pinyin: "Xiào Zhènguó" },
{ id: "3226217129", name: "陈佳玮", pinyin: "Chén Jiāwěi" },
{ id: "3226217130", name: "陈昊", pinyin: "Chén Hào" },
{ id: "3226217131", name: "余少宇", pinyin: "Yú Shǎoyǔ" },
{ id: "3226217134", name: "何恒康", pinyin: "Hé Héngkāng" },
{ id: "3226217135", name: "李雨蝶", pinyin: "Lǐ Yǔdié" },
{ id: "3226217138", name: "李蓥", pinyin: "Lǐ Yíng" },
{ id: "3226217142", name: "缪宇昕", pinyin: "Miù Yǔxīn" },
{ id: "3226217145", name: "刘智洋", pinyin: "Liú Zhìyáng" },
{ id: "3226217146", name: "周祺政", pinyin: "Zhōu Qízhèng" },
{ id: "3226217147", name: "杨振邦", pinyin: "Yáng Zhènbāng" },
{ id: "3226217148", name: "黄以平", pinyin: "Huáng Yǐpíng" },
{ id: "3226217149", name: "李麒炫", pinyin: "Lǐ Qíxuàn" },
{ id: "3226217150", name: "李明坤", pinyin: "Lǐ Míngkūn" },
{ id: "3226217151", name: "许书杰", pinyin: "Xǔ Shūjié" },
{ id: "3226217152", name: "郑文斌", pinyin: "Zhèng Wénbīn" },
{ id: "3226217153", name: "黄朝阳", pinyin: "Huáng Zhāoyáng" },
{ id: "3226217155", name: "余浩扬", pinyin: "Yú Hàoyáng" },
{ id: "3226217157", name: "周炫", pinyin: "Zhōu Xuàn" },
{ id: "3226217158", name: "吴荆", pinyin: "Wú Jīng" },
{ id: "3226217159", name: "赖兴翀", pinyin: "Lài Xīngchōng" },
{ id: "3226217160", name: "刘城滨", pinyin: "Liú Chéngbīn" },
{ id: "3226217161", name: "陈豪", pinyin: "Chén Háo" },
{ id: "3226217162", name: "郭霄楗", pinyin: "Guō Xiāojiàn" },
{ id: "3226217164", name: "林城超", pinyin: "Lín Chéngchāo" },
{ id: "3226217166", name: "朱晓阳", pinyin: "Zhū Xiǎoyáng" },
{ id: "3226217169", name: "叶斌杰", pinyin: "Yè Bīnjié" },
{ id: "3226217172", name: "李兴奕", pinyin: "Lǐ Xīngyì" },
{ id: "3226217173", name: "林泽棋", pinyin: "Lín Zéqí" },
{ id: "3226217174", name: "柯沁阳", pinyin: "Kē Qìnyáng" },
{ id: "3227623034", name: "林迪文", pinyin: "Lín Díwén" }
];
let isRolling = false;
let intervalId;
let currentStudent = null;
const display = document.getElementById('display');
const speedControl = document.getElementById('speedControl');
// 初始化加载本地存储数据
document.addEventListener('DOMContentLoaded', () => {
const savedData = localStorage.getItem('attendanceData');
if (savedData) {
names = JSON.parse(savedData);
}
const customTitle = prompt("请输入课堂名称:") || "杨老师的课堂";
document.getElementById('title').textContent = `${customTitle}点名系统`;
});
function toggleRoll() {
!isRolling ? startRoll() : stopRoll();
}
function startRoll() {
const availableStudents = names.filter(student => !student.absent);
if (availableStudents.length === 0) {
alert("所有学生都已标记为未到场!");
return;
}
isRolling = true;
document.querySelector('button').textContent = "暂停点名";
const speed = 100 - (speedControl.value * 8);
intervalId = setInterval(() => {
currentStudent = availableStudents[Math.floor(Math.random() * availableStudents.length)];
display.innerHTML = `
<span class="student-id">${currentStudent.id}</span>
<span>${currentStudent.name}</span>
<span class="pinyin">(${currentStudent.pinyin})</span>
`;
}, speed);
}
function stopRoll() {
isRolling = false;
clearInterval(intervalId);
document.querySelector('button').textContent = "开始点名";
display.classList.add('highlight');
setTimeout(() => display.classList.remove('highlight'), 2000);
}
function markAbsent() {
if (!currentStudent) {
alert('请先开始点名!');
return;
}
const targetStudent = names.find(s => s.id === currentStudent.id);
if (targetStudent && !targetStudent.absent) {
targetStudent.absent = true;
localStorage.setItem('attendanceData', JSON.stringify(names));
alert(`已标记 ${targetStudent.name} 为未到场`);
if (isRolling) startRoll(); // 如果正在点名则立即更新名单
}
}
function exportAbsentList() {
const absentStudents = names.filter(student => student.absent);
if (absentStudents.length === 0) {
alert("当前没有未到场学生");
return;
}
// 生成CSV格式内容带BOM头解决中文乱码
const csvContent = [
"\uFEFF学号,姓名",
...absentStudents.map(s => `${s.id},${s.name}`)
].join('\r\n');
const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8' });
const url = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = '未到场名单.csv';
link.style.display = 'none';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(url);
}
function clearStorage() {
if (confirm('确定要清空所有考勤数据吗?此操作不可恢复!')) {
names.forEach(student => delete student.absent);
localStorage.removeItem('attendanceData');
alert('考勤数据已重置!');
currentStudent = null;
display.textContent = "点击开始";
}
}
speedControl.addEventListener('input', () => {
if (isRolling) {
clearInterval(intervalId);
startRoll();
}
});
</script>
</body>
</html>