青果教务系统适配小爱课程表

本文介绍了一种课程表DOM解析方法,包括从网页抓取课程信息、解析DOM结构并提取关键数据的过程。同时,文章还展示了如何根据不同季节调整课程时间配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

课程表的适配主要是对dom层的提取归类处理,本人技术水平较低,这里简单分享下自己的代码

仓库地址小爱课程表

过程:

课程表的适配主要是通过操作scheduleHtmlProvider,scheduleHtmlParser,scheduleTimer函数完成的,他们的作用分别是获取dom,处理dom,设置课表节次时间。

首先获取课程表内容,这里我使用js获取接口内容。

scheduleHtmlProvider函数:

在这里插入图片描述

function scheduleHtmlProvider(iframeContent = "", frameContent = "", dom = document) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://jwgl.hist.edu.cn/wsxk/xkjg.ckdgxsxdkchj_data10319.jsp?params=eG49MjAyMiZ4cT0wJnhoPTIwMjEwMDAwNTExMg==', false);
    xhr.send();
    return xhr.responseText;

}
scheduleHtmlParser函数:
function scheduleHtmlParser(html){
    let course = [];
    const $ = cheerio.load(html, {decodeEntities: false}); // 避免中文乱码
    $(' tbody>tr ').each(function () {
        //大杂烩
        var name = $(this).eq(0).children(":eq(1)").text();
        //这是课程名字
        console.log("name"+name)
        var teacher = $(this).eq(0).children(":eq(5)").text();
        //这是教师名字
        var allData = $(this).eq(0).children(":eq(8)").text();
        //数据位置大杂烩
        var sumTime = allData.split(",");
        var sumLength = sumTime.length;
        //时间个数
        console.log("输出时间个数:"+sumLength);


        if (sumLength == 1) {

            console.log("allTime"+allTime)

            //在这里提前取出来单双周
            var flag = 0;

            if (sumTime[0].search("单")!=-1){
                flag = 1;
                sumTime[0]=sumTime[0].replace('(单)', '');
            }
            else if (sumTime[0].search("双")!=-1) {
                flag =2;
                sumTime[0]=sumTime[0].replace('(双)', '');
            }
            console.log("flag的值"+flag);
            var allTime = sumTime[0].split(" ");
            var weeks = getWeeks(sumTime[0],flag);
            var day = getDay(sumTime[0]);
            var sections = getSection(sumTime[0]);
            var position = allTime[allTime.length-1];



            var obj = {
                name: name,
                position: position,
                teacher: teacher,
                weeks: weeks,
                day: day,
                sections: sections,
            }
            course.push(obj);


        }
        else if (sumLength > 1) {
            var i = 0;
            while (i <= sumLength-1) {
                console.log("第i段时间"+i);

                //在这里提前取出来单双周
                var flag = 0;

                if (sumTime[i].search("单")!=-1){
                    flag = 1;
                    sumTime[i]=sumTime[i].replace('(单)', '');
                }
                else if (sumTime[i].search("双")!=-1) {
                    flag =2;
                    sumTime[i]=sumTime[i].replace('(双)', '');
                }
                var allTime = sumTime[i].split(" ");
                var weeks = getWeeks(allTime[0],flag);
                var day = getDay(allTime[i]);
                var sections = getSection(sumTime[i]);
                var position = allTime[allTime.length-1];

                var obj = {
                    name: name,
                    position: position,
                    teacher: teacher,
                    weeks: weeks,
                    day: day,
                    sections: sections,
                }
                course.push(obj);
                i++;


            }
        }
    })
    console.log(course)
    return course;
}


function getDay(strDay){
        var chineseDay = strDay.slice(0,1);
        if (chineseDay.search("一") != -1 ){
            return 1;
        }
        else if (chineseDay.search("二") != -1){
            return 2;
        }
        else if (chineseDay.search("三") != -1){
            return 3;
        }
        else if (chineseDay.search("四") != -1){
            return 4;
        }
        else if (chineseDay.search("五") != -1){
            return 5;
        }
        else if (chineseDay.search("六") != -1){
            return 6;
        }
        else if (chineseDay.search("日") != -1){
            return 7;
        }

    }


function getWeeks(weekStr,flag){
    var week = [];
    weekStr = weekStr.replace('周','');

    if (flag == 1) {
        week = weekStr2IntList(weekStr).filter(v => v % 2 != 0);
    } else if (flag == 2) {
        week = weekStr2IntList(weekStr).filter(v => v % 2 == 0);
    } else {
        week = weekStr2IntList(weekStr);
    }
    return week;

}
function weekStr2IntList(week) {
    // 将全角逗号替换为半角逗号
    var a = week.split('-');
    var index = a[0];
    var end = a[1];
    let weeks =[];
    for(i = index;i<=end;i++){
        weeks.push(i);
    }
    return weeks;

}


function getSection(strSection){
    var sections = [];
    var indexSection = strSection.search("[");
    var section = strSection.slice(indexSection+1,indexSection+2);
    console.log("section"+section)
    sections.push(parseInt(section),parseInt(section)+1);
    return sections;
}
scheduleTimer函数:

这个函数主要是进行了夏冬两季的时间填充,通过时间返回夏冬的课程表时间。

/**
 * 时间配置函数,此为入口函数,不要改动函数名
 */
async function scheduleTimer({
                                 providerRes,
                                 parserRes
                             } = {}) {

    var selections=[];
    var sumSections = [
        { section: 1, startTime: "08:00", endTime: "08:45" },
        { section: 2, startTime: "08:88", endTime: "9:40" },
        { section: 3, startTime: "10:10", endTime: "10:55" },
        { section: 4, startTime: "11:05", endTime: "11:50" },
        { section: 5, startTime: "15:00", endTime: "15:45" },
        { section: 6, startTime: "15:55", endTime: "16:40" },
        { section: 7, startTime: "17:10", endTime: "17:55" },
        { section: 8, startTime: "18:05", endTime: "18:50" },
        { section: 9, startTime: "20:00", endTime: "20:45" },
        { section: 10, startTime: "20:55", endTime: "21:40"}
    ]
    var winSections=[
        { section: 1, startTime: "08:00", endTime: "08:45" },
        { section: 2, startTime: "08:88", endTime: "9:40" },
        { section: 3, startTime: "10:10", endTime: "10:55" },
        { section: 4, startTime: "11:05", endTime: "11:50" },
        { section: 5, startTime: "14:30", endTime: "15:15" },
        { section: 6, startTime: "15:25", endTime: "16:10" },
        { section: 7, startTime: "16:40", endTime: "16:10" },
        { section: 8, startTime: "17:35", endTime: "18:20" },
        { section: 9, startTime: "19:30", endTime: "20:15" },
        { section: 10, startTime: "20:25", endTime: "21:10"}

    ]
    var myDate = new Date();//获取系统当前时间
    var nowMonth=myDate.getMonth();
    if(nowMonth>=5&&nowMonth<=9){
        selections=sumSections;
    }
    else {
        selections=winSections;
    }
    return {
        totalWeek: 20, // 总周数:[1, 30]之间的整数
        startSemester: '', // 开学时间:时间戳,13位长度字符串,推荐用代码生成
        startWithSunday: false, // 是否是周日为起始日,该选项为true时,会开启显示周末选项
        showWeekend: true, // 是否显示周末
        forenoon: 4, // 上午课程节数:[1, 10]之间的整数
        afternoon: 4, // 下午课程节数:[0, 10]之间的整数
        night: 2, // 晚间课程节数:[0, 10]之间的整数
        sections:sumSections, // 课程时间表,注意:总长度要和上边配置的节数加和对齐
    }

}

导入成功:

因为能力有限,不能适配的很完美,一起学习一起进步。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只会写bug的靓仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值