小爱课程表APP是小米小爱同学旗下推出的手机课表应用,首次采用AI技术,赋予课程表智能体征。高颜值、操作方便是小爱课程表的重要特征,你只需要通过手机拍照,就能将纸质的课程表快速到导入到小爱中,无论是老师还是学生都可以轻松管理课表,所有课程信息一目了然。

【功能介绍】
【拍照导入课表】:点开“拍照导入”扫一扫课程表,即可快速自动识别课程名称、上课地点和授课教师,并智能编辑后导入手机
【从教务系统导入课表】:能将学校课表的课程名称、上课地点和授课教师信息直接导入app
【智能动态表格】:根据课程多少,大中学生不同情况动态响应
【分享导入课表】:一人编辑,全班分享,点开同学分享的链接即可导入课程表
【课程提醒】:一键设置课程闹钟,智能提醒用户上课时间
【轻松编辑课程信息】:丰富自定义,单节课时长、课程节数均可自定义,修改后小爱课程表将智能推算一天安排
【个性化设置】支持自定义课程颜色
【课程表数据云同步】:数据绑定小米账号后即可支持跨设备查询,可同步到小爱音箱、小爱同学语音助手
【课程表分享】:支持将课程通过链接分享给他人
但是这么好用的课程表软件居然没有适配我的学校,于是心血来潮做了淮南联合大学的教务系统适配:
【scheduleHtmlProvider.js】
function scheduleHtmlProvider(iframeContent = "", frameContent = "", dom = document) {
// 以下可编辑
const ifrs = dom.getElementsByTagName("iframe");
const frs = dom.getElementsByTagName("frame");
if (ifrs.length) {
for (let i = 0; i < ifrs.length; i++) {
const dom = ifrs[i].contentDocument.body.parentElement;
iframeContent += scheduleHtmlProvider("", "", dom); // 递归调用时传递空字符串
}
}
if (frs.length) {
for (let i = 0; i < frs.length; i++) {
const dom = frs[i].contentDocument.body.parentElement;
frameContent += scheduleHtmlProvider("", "", dom); // 递归调用时传递空字符串
}
}
if (!ifrs.length && !frs.length) {
const tables = dom.querySelectorAll('table');
tables.forEach(table => {
frameContent += table.outerHTML;
});
}
if (dom === document) {
return frameContent + iframeContent; // 在最外层文档中合并内容
}
return iframeContent + frameContent; // 在递归调用中合并内容
}
【scheduleHtmlParser.js】
function scheduleHtmlParser(html) {
function parseWeeks(weeksStr) {
let weeks = [];
let pattern = /(\d+)-?(\d*)/g;
let match = pattern.exec(weeksStr);
while (match != null) {
let start = Math.max(1, parseInt(match[1])); // 确保开始周数不小于 1
let end = match[2] !== '' ? Math.min(30, parseInt(match[2])) : start; // 如果没有结束周数,则结束周数为开始周数
for (let i = start; i <= end; i++) {
weeks.push(i);
}
match = pattern.exec(weeksStr);
}
return weeks;
}
function parseDay(dayStr) {
let dayMap = {
'一': 1,
'二': 2,
'三': 3,
'四': 4,
'五': 5,
'六': 6,
'日': 7
};
return dayMap[dayStr];
}
function parseSections(sectionsStr) {
let sections = [];
let pattern = /(\d+)-(\d+)/g;
let match = pattern.exec(sectionsStr);
while (match != null) {
let start = Math.max(1, parseInt(match[1])); // 确保开始节次不小于 1
let end = Math.min(30, parseInt(match[2])); // 确保结束节次不超过 30
for (let i = start; i <= end; i++) {
sections.push(i);
}
match = pattern.exec(sectionsStr);
}
return sections;
}
let result = [];
let table = $(html).find('table tbody tr');
for (let i = 0; i < table.length; i++) {
let row = table[i];
let courseName = $(row).find('td:eq(4)').text().replace(/\[.*?\]/g, '').trim();
let position = $(row).find('td:eq(19)').text().trim();
let teacher = $(row).find('td:eq(13)').text().replace(/\[.*?\]/g, '').trim();
let weeksStr = $(row).find('td:eq(16)').text().trim();
let weeks = parseWeeks(weeksStr);
let dayStr = $(row).find('td:eq(18)').text().trim().charAt(0); // 只获取星期几的第一个字符
let day = parseDay(dayStr);
let sectionsStr = $(row).find('td:eq(18)').text().trim();
let sections = parseSections(sectionsStr);
// 添加条件判断,如果课程信息不为空,则将其加入结果列表中
if (courseName !== '' || position !== '' || teacher !== '' || weeks.length > 0 || day !== undefined || sections
.length > 0) {
result.push({
name: courseName,
position: position,
teacher: teacher,
weeks: weeks,
day: day,
sections: sections
});
}
}
return result;
}
【scheduleTimer.js】
async function scheduleTimer({
providerRes,
parserRes
} = {}) {
return {
totalWeek: 18, // 总周数:[1, 30]之间的整数
startSemester: '', // 开学时间:时间戳,13位长度字符串,推荐用代码生成
startWithSunday: false, // 是否是周日为起始日,该选项为true时,会开启显示周末选项
showWeekend: true, // 是否显示周末
forenoon: 5, // 上午课程节数:[1, 10]之间的整数
afternoon: 4, // 下午课程节数:[0, 10]之间的整数
night: 3, // 晚间课程节数:[0, 10]之间的整数
sections: [{
section: 1,
startTime: '08:00',
endTime: '08:40',
}, {
section: 2,
startTime: '08:50',
endTime: '09:30',
}, {
section: 3,
startTime: '09:40',
endTime: '10:20',
}, {
section: 4,
startTime: '10:30',
endTime: '11:10',
}, {
section: 5,
startTime: '11:20',
endTime: '12:00',
}, {
section: 6,
startTime: '14:30',
endTime: '15:10',
}, {
section: 7,
startTime: '15:20',
endTime: '16:00',
}, {
section: 8,
startTime: '16:10',
endTime: '16:50',
}, {
section: 9,
startTime: '17:00',
endTime: '17:40',
}, {
section: 10,
startTime: '19:00',
endTime: '19:40',
}, {
section: 11,
startTime: '19:50',
endTime: '20:30',
}, {
section: 12,
startTime: '20:40',
endTime: '21:20',
}],
}
}

