Update 课堂随机点名v1.7.html

This commit is contained in:
2025-04-25 20:39:35 +08:00
parent 47342b9eea
commit 542d97ed20

View File

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