小爱课程表适配-正方教务

适配沈师2022新生课程表

鄙人新生,开发能力有限,js只会一点点

本代码一定存在很多缺陷,或者有地方处理的很麻烦

欢迎大神赐教

小白向,不喜勿喷,本项目纯属练习

本代码部分参考网络

小爱课程表开发文档:Document


provider.js

首先执行scheduleHtmlProvider抓取教务系统源代码

function scheduleHtmlProvider(iframeContent = "", frameContent = "", dom = document) {
    return dom.querySelector('#iframeautoheight').contentWindow.document.body.innerHTML;
}

parser.js

执行scheduleHtmlParser函数,传参为scheduleHtmlProvider抓取的教务系统源代码

function scheduleHtmlParser(html) {
	//定义最终result数组
	var result=[];
    var $ = cheerio.load(html, { decodeEntities: false });
	//遍历每一横排tr
	$("#Table1 tr").each(
	function (i) {
		//i>1意味着索引2即从第三行开始
		if (i > 1) {
		//遍历每横排的每个格子,七天加一个表头共8列,故j输出(0,7),正好对应星期
		//大学两节课连上,目前只能截取1,3,5,7,9课,稍后合并1,2...
			$(this).children('td').each(function (j) {
				//因为存在合并单元格,所以上午,下午,晚上的第一节课(1,5,9)对应这一横行的2索引,而3,7节对应1索引,所以下面要添加一个判断
				 if ((i - 1) == 1 || (i - 1) == 5 || (i - 1) == 9) {
					if ((j - 1) > 0) {
						console.log("第"+(i-1)+"节课,星期"+(j-1)+"课程名称:"+$(this).html());
							//执行课程解析函数
						var classObj = getClass($(this).html(), (j-1), (i - 1));
						//拼接到result里面,判断是否为空,如果为空,getClass不执行,所以不添加classObj到里面result
						if(typeof(classObj)!="undefined"){
								console.log(classObj.length);//同一课程不同教室会大于1
							if (classObj.length>1){//双课程
								console.log("这是双课程");
								//分别加到result里面
								result.push(classObj[0]);
								result.push(classObj[1]);
							}
							else{//普通课程
								result.push(classObj);
								console.log("这是普通课程");
							}
										
						}
					}
				}
				 else if ((i - 1) == 3 || (i - 1) == 7) {
					if (j > 0) {
						console.log("第"+(i-1)+"节课,星期"+(j)+"课程名称:"+$(this).html());
						//执行课程解析函数
						var classObj = getClass($(this).html(), j, (i - 1));
						//拼接到result里面,判断是否为空,如果为空,getClass不执行,所以不添加classObj到result里面
						if(typeof(classObj)!="undefined"){
							console.log(classObj.length);//同一课程不同教室会返回2
							if (classObj.length>1){//双课程
								console.log("这是双课程");
								result.push(classObj[0]);
								result.push(classObj[1]);
							}
							else{//普通课程
								result.push(classObj);
								console.log("这是普通课程");
							}
						}
					}
				}

			}
			)
		}
    }
    )
	//返回最终result
	return result;
}




//定义课程解析函数
function getClass(classHtml, day, section) {
    var classs = classHtml.split('<br>');
	//console.log(classs);
	//这里判断是否一个课程根据单双周不一个教室(双课程),上面是单,下面是双
    if (classs.length < 6&&classs.length>1) { //防止空课,空nbsp长度为1
		console.log("这是单课程");
		//这里严格遵守返回格式
		var classObj = {};
		classObj.name = classs[0];
		classObj.position = classs[4];
		classObj.teacher = classs[3];
		classObj.weeks = getWeeks(classs[2]);
		classObj.day = day;
		classObj.sections = [];
		//一节课时间是两节,这里进行合并
		classObj.sections.push(section);
		classObj.sections.push(section+1);
		return classObj;			 
    }
	else if (classs.length > 6){
		console.log("这是双课程");
		//console.log(classs);
		//默认上面为单周
		var classObj = {};
		classObj.name = classs[0];
		classObj.position = classs[4];
		classObj.teacher = classs[3];
		classObj.weeks = getWeeks(classs[2]);
		classObj.day = day;
		classObj.sections = [];
		//一节课时间是两节,这里进行合并
		classObj.sections.push(section);
		classObj.sections.push(section+1);

		// //双周向里面添加数据
		var class2 = {};
		class2.name = classs[6];
		class2.position = classs[10];
		class2.teacher = classs[9];
		class2.weeks = getWeeks(classs[8]);
		class2.day = day;
		class2.sections = [];
		//一节课时间是两节,这里进行合并
		class2.sections.push(section);
		class2.sections.push(section+1);
		//把双周class2字典加入classObj里面
		var classObj1=[classObj,class2];
		return classObj1;		
	}   
}



//单双周
function getWeeks(weeksHtml) {
	var weeks=[];//定义weeks数组
	var weeksStr = weeksHtml;
	//开始分割
	var data1=weeksHtml.split("{");
	var data2=data1[1].split("}");
	//data2[0]格式为  第5-18周|单周或第5-18周,下面需要判断是否单双周
	 //不需要正则去掉“第”和“周”,用"-"分割
	 data3=data2[0].split("第");
	 data4=data3[1].split("周");
	 data5=data4[0].split("-");
	 week_start=parseInt(data5[0]);//转化整型以遍历
	 week_end=parseInt(data5[1])+1;
	if(data2[0].indexOf('|') == -1){//正常周
		console.log("这是正常周");
		//开始遍历
		for(var i=0;i<week_end;i++){
			if(i>=week_start){
				weeks.push(i);
			}
		}
	}
	else{
		if (data2[0].indexOf('单') != -1){
			console.log("这是单周");
			for(var i=1;i<week_end;i=i+2){
				if(i>=week_start){
					weeks.push(i);
				}
			}
		}
		else{
			console.log("这是双周");
			for(var i=0;i<week_end;i=i+2){
				if(i>=week_start){
				weeks.push(i);
				}
			}	
		}
	}
	return weeks;
}

timer.js

/**
 * 时间配置函数,此为入口函数,不要改动函数名
 */
 async function scheduleTimer({
    providerRes,
    parserRes
} = {}) {
    return {
        totalWeek: 18, // 总周数:[1, 30]之间的整数
        startSemester: '1661702400000', // 开学时间:时间戳,13位长度字符串,推荐用代码生成
        startWithSunday: false, // 是否是周日为起始日,该选项为true时,会开启显示周末选项
        showWeekend: true, // 是否显示周末
        forenoon: 4, // 上午课程节数:[1, 10]之间的整数
        afternoon: 4, // 下午课程节数:[0, 10]之间的整数
        night: 2, // 晚间课程节数:[0, 10]之间的整数
        sections: [
            { section: 1, startTime: "08:20", endTime: "09:05" },
            { section: 2, startTime: "09:10", endTime: "9:55" },
            { section: 3, startTime: "10:10", endTime: "10:55" },
            { section: 4, startTime: "11:00", endTime: "11:45" },
            { section: 5, startTime: "13:15", endTime: "14:00" },
            { section: 6, startTime: "14:05", endTime: "14:50" },
            { section: 7, startTime: "15:00", endTime: "15:45" },
            { section: 8, startTime: "15:50", endTime: "16:35" },
            { section: 9, startTime: "17:30", endTime: "18:15" },
            { section: 10, startTime: "18:25", endTime: "19:10" }
        ], // 课程时间表,注意:总长度要和上边配置的节数加和对齐
    }

}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值