Upload files to "/"
This commit is contained in:
361
课堂随机点名v1.6.html
Normal file
361
课堂随机点名v1.6.html
Normal file
@@ -0,0 +1,361 @@
|
||||
<!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>
|
||||
Reference in New Issue
Block a user