You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

599 lines
20 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>课堂随机点名系统</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: "Microsoft YaHei", sans-serif;
}
body {
background-color: #f0f0f0;
color: #333;
line-height: 1.5;
}
.container {
max-width: 1200px;
margin: 0 auto;
background: white;
min-height: 100vh;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
/* 标题栏样式 */
.title-bar {
background: #2e7d32;
color: white;
padding: 8px 15px;
display: flex;
justify-content: space-between;
align-items: center;
-webkit-app-region: drag;
}
.title-text {
font-size: 16px;
font-weight: bold;
}
.window-controls {
display: flex;
-webkit-app-region: no-drag;
}
.window-control {
width: 12px;
height: 12px;
border-radius: 50%;
margin-left: 8px;
cursor: pointer;
}
.minimize { background: #ffbd2e; }
.maximize { background: #28ca42; }
.close { background: #ff5f57; }
/* 标签页样式 */
.tabs {
display: flex;
background: #f5f5f5;
border-bottom: 1px solid #ddd;
}
.tab {
padding: 10px 20px;
cursor: pointer;
border-bottom: 3px solid transparent;
transition: all 0.3s;
}
.tab.active {
background: white;
border-bottom-color: #2e7d32;
color: #2e7d32;
font-weight: bold;
}
.tab-content {
display: none;
padding: 20px;
}
.tab-content.active {
display: block;
}
/* 通用卡片样式 */
.card {
background: white;
border: 1px solid #e0e0e0;
border-radius: 4px;
margin-bottom: 20px;
overflow: hidden;
}
.card-header {
background: #f5f5f5;
padding: 10px 15px;
border-bottom: 1px solid #e0e0e0;
font-weight: bold;
}
.card-body {
padding: 15px;
}
/* 按钮样式 */
.btn {
padding: 6px 12px;
border: 1px solid #ccc;
border-radius: 4px;
background: #f9f9f9;
cursor: pointer;
font-size: 14px;
margin-right: 8px;
margin-bottom: 8px;
}
.btn:hover {
background: #e9e9e9;
}
.btn-primary {
background: #2e7d32;
color: white;
border-color: #2e7d32;
}
.btn-primary:hover {
background: #1b5e20;
}
/* 表格样式 */
table {
width: 100%;
border-collapse: collapse;
}
th, td {
padding: 8px 12px;
text-align: left;
border-bottom: 1px solid #e0e0e0;
}
th {
background: #f5f5f5;
font-weight: bold;
}
tr:hover {
background: #f9f9f9;
}
/* 点名模块特定样式 */
.rollcall-display {
text-align: center;
padding: 20px 0;
}
.student-name {
font-size: 24px;
font-weight: bold;
margin: 10px 0;
}
.student-info {
font-size: 14px;
color: #666;
margin-bottom: 20px;
}
.mode-selector {
display: flex;
justify-content: center;
margin: 15px 0;
}
.mode-btn {
padding: 8px 16px;
border: 1px solid #ccc;
background: #f9f9f9;
cursor: pointer;
}
.mode-btn:first-child {
border-radius: 4px 0 0 4px;
}
.mode-btn:last-child {
border-radius: 0 4px 4px 0;
}
.mode-btn.active {
background: #2e7d32;
color: white;
border-color: #2e7d32;
}
/* 表单元素样式 */
.form-group {
margin-bottom: 15px;
}
.form-label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}
.form-control {
width: 100%;
padding: 6px 12px;
border: 1px solid #ccc;
border-radius: 4px;
}
.checkbox-group {
display: flex;
align-items: center;
margin-bottom: 10px;
}
.checkbox-group input {
margin-right: 8px;
}
/* 统计信息样式 */
.stats-container {
display: flex;
flex-wrap: wrap;
margin-bottom: 20px;
}
.stat-item {
flex: 1;
min-width: 150px;
background: #f9f9f9;
border: 1px solid #e0e0e0;
border-radius: 4px;
padding: 10px;
margin: 0 10px 10px 0;
text-align: center;
}
.stat-value {
font-size: 20px;
font-weight: bold;
color: #2e7d32;
}
.stat-label {
font-size: 12px;
color: #666;
}
/* 图表容器样式 */
.chart-container {
height: 300px;
background: #f9f9f9;
border: 1px solid #e0e0e0;
border-radius: 4px;
margin-top: 15px;
position: relative;
}
.chart-placeholder {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: #999;
text-align: center;
}
.chart-controls {
display: flex;
align-items: center;
margin-bottom: 10px;
}
.chart-controls select {
margin-right: 10px;
}
/* 状态栏样式 */
.status-bar {
background: #f5f5f5;
border-top: 1px solid #e0e0e0;
padding: 5px 15px;
font-size: 12px;
color: #666;
}
</style>
</head>
<body>
<div class="container">
<!-- 标题栏 -->
<div class="title-bar">
<div class="title-text">课堂随机点名系统</div>
<div class="window-controls">
<div class="window-control minimize"></div>
<div class="window-control maximize"></div>
<div class="window-control close"></div>
</div>
</div>
<!-- 标签页导航 -->
<div class="tabs">
<div class="tab active" data-tab="rollcall">点名</div>
<div class="tab" data-tab="students">学生管理</div>
<div class="tab" data-tab="scores">积分管理</div>
<div class="tab" data-tab="visualization">数据可视化</div>
</div>
<!-- 点名模块 -->
<div id="rollcall" class="tab-content active">
<div class="card">
<div class="card-header">课堂点名</div>
<div class="card-body">
<div class="mode-selector">
<div class="mode-btn active">随机点名</div>
<div class="mode-btn">顺序点名</div>
</div>
<div class="rollcall-display">
<div class="student-name">陈四</div>
<div class="student-info">
学号2021012 | 专业:计算机科学 | 当前积分8.2
</div>
<button class="btn btn-primary">开始点名</button>
</div>
<div class="form-group">
<div class="card-header">记录点名结果</div>
<div class="card-body">
<div class="checkbox-group">
<input type="checkbox" id="arrived" checked>
<label for="arrived">学生已到达</label>
</div>
<div class="form-group">
<label class="form-label">重复问题得分0.00分</label>
<input type="range" min="0" max="1" step="0.1" value="0" class="form-control">
<small>(0-1不能重复0未测试0.5:准确重复)</small>
</div>
<div class="form-group">
<label class="form-label">回答问题得分0.00分</label>
<input type="range" min="0" max="3" step="0.1" value="0" class="form-control">
<small>(0-3分根据回答情况)</small>
</div>
<button class="btn btn-primary">提交记录</button>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-header">最近点名记录</div>
<div class="card-body">
<p style="text-align: center; color: #999;">暂无记录</p>
</div>
</div>
</div>
<!-- 学生管理模块 -->
<div id="students" class="tab-content">
<div class="card">
<div class="card-header">学生管理</div>
<div class="card-body">
<div style="margin-bottom: 15px;">
<button class="btn">导入Excel</button>
<button class="btn">刷新</button>
<button class="btn">删除选中</button>
</div>
<table>
<thead>
<tr>
<th>ID</th>
<th>学号</th>
<th>姓名</th>
<th>专业</th>
<th>总积分</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>2021001</td>
<td>张三</td>
<td>软件工程</td>
<td>4.7</td>
</tr>
<tr>
<td>2</td>
<td>2021012</td>
<td>陈四</td>
<td>计算机科学</td>
<td>8.2</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- 积分管理模块 -->
<div id="scores" class="tab-content">
<div class="card">
<div class="card-header">积分管理</div>
<div class="card-body">
<div class="stats-container">
<div class="stat-item">
<div class="stat-value">2</div>
<div class="stat-label">总学生数</div>
</div>
<div class="stat-item">
<div class="stat-value">11</div>
<div class="stat-label">总点名次数</div>
</div>
<div class="stat-item">
<div class="stat-value">6.45</div>
<div class="stat-label">平均积分</div>
</div>
<div class="stat-item">
<div class="stat-value">8.20</div>
<div class="stat-label">最高积分</div>
</div>
<div class="stat-item">
<div class="stat-value">4.70</div>
<div class="stat-label">最低积分</div>
</div>
</div>
<div style="margin-bottom: 15px;">
<button class="btn">导出积分详单</button>
<button class="btn">刷新</button>
</div>
<table>
<thead>
<tr>
<th>排名</th>
<th>学号</th>
<th>姓名</th>
<th>专业</th>
<th>总积分</th>
<th>随机点名次数</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>2021012</td>
<td>陈四</td>
<td>计算机科学</td>
<td>8.20</td>
<td>5</td>
</tr>
<tr>
<td>2</td>
<td>2021001</td>
<td>张三</td>
<td>软件工程</td>
<td>4.70</td>
<td>2</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- 数据可视化模块 -->
<div id="visualization" class="tab-content">
<div class="card">
<div class="card-header">数据可视化</div>
<div class="card-body">
<div class="chart-controls">
<select class="form-control" style="width: auto;">
<option>显示前10名</option>
</select>
<select class="form-control" style="width: auto;">
<option>柱形图</option>
</select>
<button class="btn">刷新</button>
</div>
<div class="chart-container">
<div class="chart-placeholder">
<p>积分排名可视化</p>
<p>总积分(柱形图)和随机点名次数(折线图)</p>
<p>学生1: 陈四 - 总积分: 8.2 - 随机点名次数: 5</p>
<p>学生2: 张三 - 总积分: 4.7 - 随机点名次数: 2</p>
</div>
</div>
</div>
</div>
</div>
<!-- 状态栏 -->
<div class="status-bar">就绪</div>
</div>
<script>
// 标签页切换功能
document.querySelectorAll('.tab').forEach(tab => {
tab.addEventListener('click', function() {
// 移除所有激活状态
document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
document.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active'));
// 添加当前激活状态
this.classList.add('active');
const tabId = this.getAttribute('data-tab');
document.getElementById(tabId).classList.add('active');
});
});
// 点名模式切换
document.querySelectorAll('.mode-btn').forEach(btn => {
btn.addEventListener('click', function() {
document.querySelectorAll('.mode-btn').forEach(b => b.classList.remove('active'));
this.classList.add('active');
});
});
// 开始点名按钮功能
document.querySelector('.btn-primary').addEventListener('click', function() {
const students = [
{ name: "张三", id: "2021001", major: "软件工程", score: "4.7" },
{ name: "陈四", id: "2021012", major: "计算机科学", score: "8.2" },
{ name: "王五", id: "2021005", major: "人工智能", score: "7.5" },
{ name: "赵六", id: "2021010", major: "数据科学", score: "6.8" }
];
// 随机选择学生
const randomStudent = students[Math.floor(Math.random() * students.length)];
// 更新显示
document.querySelector('.student-name').textContent = randomStudent.name;
document.querySelector('.student-info').textContent =
`学号:${randomStudent.id} | 专业:${randomStudent.major} | 当前积分:${randomStudent.score}`;
// 添加点名记录
const now = new Date();
const timeString = `${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}`;
const historyContainer = document.querySelector('#rollcall .card:last-child .card-body');
historyContainer.innerHTML = `
<table>
<thead>
<tr>
<th>时间</th>
<th>学生</th>
<th>状态</th>
</tr>
</thead>
<tbody>
<tr>
<td>${timeString}</td>
<td>${randomStudent.name}</td>
<td>已点名</td>
</tr>
</tbody>
</table>
`;
});
// 窗口控制按钮功能
document.querySelector('.close').addEventListener('click', function() {
if (confirm('确定要关闭应用吗?')) {
window.close(); // 注意:这通常只在特定环境下有效
}
});
document.querySelector('.minimize').addEventListener('click', function() {
// 最小化窗口逻辑(在浏览器中无法真正最小化,这里只是示例)
console.log('最小化窗口');
});
document.querySelector('.maximize').addEventListener('click', function() {
// 最大化/还原窗口逻辑
if (!document.fullscreenElement) {
document.documentElement.requestFullscreen();
} else {
document.exitFullscreen();
}
});
</script>
</body>
</html>