ExamSchedule/notification/scripts/courseSchedule.js
MKStoler1024 a47e31faa2
feat: 时间广播初步实现
* docs: 更新README,添加考试看板和时间广播功能说明,优化界面截图

* docs: 在README中添加广播模式说明及相关截图

* refactor&fix&feat: 已知问题修复,加上暗色模式,还有拆分css

* feat: 更新课程安排和提醒设置功能,支持导入导出配置

* feat: 添加考试信息展示,更新课程表加载逻辑,优化样式

* feat: 更新考试提醒设置,优化音频选择和配置加载逻辑

* feat: 优化提醒设置处理逻辑,支持临时生效配置导入
2025-03-22 23:35:25 +08:00

173 lines
7.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

var courseSchedule = [];
// 将fetch移动到函数中以便控制初始化顺序
function loadCourseSchedule() {
return fetch('course_schedule.json')
.then(response => response.json())
.then(data => {
courseSchedule = data.examInfos || [];
document.title = data.examName || '考试看板';
document.getElementById('examTitle').textContent = data.examName || '考试看板';
document.getElementById('examMessage').textContent = data.message || '';
document.getElementById('timeDescription').textContent = data.room ? '考场: ' + data.room : '';
updateScheduleTable();
// 检查Cookie是否存在
const reminderCookie = getCookie("reminders");
if (!reminderCookie && data.reminders && Array.isArray(data.reminders)) {
// 如果Cookie不存在加载配置文件中的提醒设置
fetch('audio_files.json')
.then(response => response.json())
.then(audioFiles => {
const validAudioTypes = Object.keys(audioFiles);
const defaultAudio = validAudioTypes[0];
// 验证并修复音频设置
const reminders = data.reminders.map(reminder => {
if (!validAudioTypes.includes(reminder.audio)) {
reminder.audio = defaultAudio;
}
return reminder;
});
// 填充提醒表格
var table = document.getElementById('reminderTable');
while (table.rows.length > 2) {
table.deleteRow(1);
}
reminders.forEach(reminder => {
var row = table.insertRow(table.rows.length - 1);
let audioOptions = validAudioTypes
.map(audio => `<option value="${audio}" ${reminder.audio === audio ? 'selected' : ''}>${audio}</option>`)
.join('');
row.innerHTML = `
<td>
<select>
<option value="beforeStart" ${reminder.condition === 'beforeStart' ? 'selected' : ''}>当距离考试开始时间还有</option>
<option value="beforeEnd" ${reminder.condition === 'beforeEnd' ? 'selected' : ''}>当距离考试结束时间还有</option>
<option value="afterEnd" ${reminder.condition === 'afterEnd' ? 'selected' : ''}>当考试结束后</option>
<option value="start" ${reminder.condition === 'start' ? 'selected' : ''}>当考试开始时</option>
<option value="end" ${reminder.condition === 'end' ? 'selected' : ''}>当考试结束时</option>
</select>
</td>
<td><input type="number" value="${reminder.time}" placeholder="${reminder.condition === 'start' || reminder.condition === 'end' ? '-' : '分钟'}" ${reminder.condition === 'start' || reminder.condition === 'end' ? 'disabled' : ''}></td>
<td>
<select name="audioSelect">
${audioOptions}
</select>
</td>
<td><button onclick="removeReminder(this)">删除</button></td>
`;
row.cells[0].querySelector('select').addEventListener('change', function() {
row.cells[1].querySelector('input').disabled = this.value === 'start' || this.value === 'end';
row.cells[1].querySelector('input').placeholder = this.value === 'start' || this.value === 'end' ? '-' : '分钟';
});
});
// 更新提醒队列并保存到Cookie
loadRemindersToQueue(reminders);
saveSettingsToCookies();
});
}
return courseSchedule;
})
.catch(error => {
errorSystem.show('加载课程表失败: ' + error.message, 'error');
return [];
});
}
function parseTime(timeStr) {
try {
return new Date(timeStr);
} catch (e) {
errorSystem.show('时间解析错误: ' + e.message, 'info', 'error');
return new Date();
}
}
function updateCourseStatus() {
try {
var now = new Date();
currentCourse = null;
for (var i = 0; i < courseSchedule.length; i++) {
var course = courseSchedule[i],
start = parseTime(course.start),
end = parseTime(course.end);
if (end < start) end.setDate(end.getDate() + 1);
if (now >= start && now <= end) {
currentCourse = course;
break;
}
}
if (currentCourse !== lastCourse) {
handleStatusChange();
lastCourse = currentCourse;
}
} catch (e) {
errorSystem.show('课程状态更新失败: ' + e.message, 'error');
}
}
function handleStatusChange() {
// 处理状态变化的逻辑
console.log('课程状态已更改:', currentCourse);
}
function getNextCourse() {
try {
var now = new Date();
for (var i = 0; i < courseSchedule.length; i++) {
var start = parseTime(courseSchedule[i].start);
if (start > now) return courseSchedule[i];
}
return null;
} catch (e) {
errorSystem.show('获取下一节课失败: ' + e.message, 'error');
return null;
}
}
// 修改更新表格函数,增加数据检查
function updateScheduleTable() {
try {
if (!Array.isArray(courseSchedule)) {
errorSystem.show('课程表数据格式错误', 'error');
return;
}
var now = new Date();
var table = document.getElementById('scheduleTable');
// 清空现有行,保留表头
while (table.rows.length > 1) {
table.deleteRow(1);
}
courseSchedule.forEach(function(course) {
var row = table.insertRow(-1);
row.innerHTML = '<td>' + course.name + '</td>' +
'<td>' + formatDateTime(course.start) + ' - ' + formatDateTime(course.end) + '</td>' +
'<td></td>';
var start = parseTime(course.start);
var end = parseTime(course.end);
if (now >= start && now <= end) {
row.className = 'current-class';
row.cells[2].textContent = '进行中';
} else if (now < start) {
row.className = 'future-class';
row.cells[2].textContent = '即将开始';
} else {
row.className = 'past-class';
row.cells[2].textContent = '已结束';
}
});
} catch (e) {
errorSystem.show('课程表更新失败: ' + e.message, 'error');
}
}