小爱课程表导入课程表功能开发(正方教务系统)

前言

昨天开始了小爱课程表的开发,主要实现的功能是导入本校的教务系统课程表。今天完成并自测通过了,就等审核通过上线啦。现在就来记录一下这次开发。
在这里插入图片描述

具体的流程就不多说了,直接看开发者文档吧https://ldtu0m3md0.feishu.cn/docs/doccnhZPl8KnswEthRXUz8ivnhb#line-38

主要记录一下我的代码和思路

代码

主要是写scheduleHtmlProvider.js和scheduleHtmlParser.js这两文件

Provider 是用来获取html的函数,将获取到的html传给 Parser 进行数据处理,截取出对应的课程信息,再封装为规定的json格式数据返回。最后执行函数,便可以导入成功啦!

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

在这里插入图片描述

执行函数后弹出了的窗口包括了课程表信息,就代表截取成功啦!如下图

在这里插入图片描述

接下来就可以编写 Parser 函数了,最后按指定格式返回就行了

注意:Parser函数里不能使用document和window对象,因为这部分是在服务端解析的,用到了cheerio的环境,这点很重要,昨天搞了很久没成功,找不到原因,就是因为用了document(泪目)
所以开发之前仔细看文档真的很重要!

既然用不了原生的,那就只能用Cheerio了,附上Cheerio官方文档翻译 https://juejin.im/post/6844904135767097352

scheduleHtmlParser.js

function scheduleHtmlParser(html) {
    var jsonArray = [];
    var $ = cheerio.load(html, { decodeEntities: false });

    $("#Table1 tr").each(function(i){
        if(i > 1){
            $(this).children('td').each(function(j){
                if($(this).text().length <= 4 && $(this).text().length > 0){

                } else{
                    jsonArray = getCourseInfos($(this).html(),jsonArray)
                }
            })
        }
    })

    var jsonArray1 = JSON.stringify(jsonArray);
    var time = [
        {"section": 1,"startTime": "08:30","endTime": "09:15"},
        {"section": 2,"startTime": "09:30","endTime": "10:10"},
        {"section": 3,"startTime": "10:30","endTime": "11:15"},
        {"section": 4,"startTime": "11:25","endTime": "12:10"},
        {"section": 5,"startTime": "14:30","endTime": "15:15"},
        {"section": 6,"startTime": "15:25","endTime": "16:10"},
        {"section": 7,"startTime": "16:25","endTime": "17:10"},
        {"section": 8,"startTime": "17:20","endTime": "18:05"},
        {"section": 9,"startTime": "19:30","endTime": "20:15"},
        {"section": 10,"startTime": "20:25","endTime": "21:10"},
    ]
    var time1 = JSON.stringify(time);
    var conss = new Object();
    conss.courseInfos = JSON.parse(jsonArray1);
    conss.sectionTimes = JSON.parse(time1);
    var json2 = JSON.stringify(conss);
    console.info(JSON.parse(json2));
    return JSON.parse(json2);
}

function getJson(s) {
    var str = (s||'').split("<br>")
    if(str.length == 1)
        return null;
    var num = (str[2]||'').split(",")[1].substring(0,1)
    var name = str[0];
    var cDay = ""
    if(str[0]!="")
        cDay = str[2].substring(1,2);
    var day=0;
    var position=str[4];
    var teacher=str[3];
    var matchReg = /(?<={).*?(?=})/;    //截取{}之间的内容
    var cWeek = "";
    if(str[0]!="")
        cWeek = str[2].match(matchReg);
    var cWeeks = (cWeek[0]||'').split("|");
    var startWeek = ""
    var endWeek = ""
    if(cWeeks[0]!=""){
        startWeek = parseInt((cWeeks[0]||'').split("-")[0].replace(/[^0-9]/ig,""));
        endWeek = parseInt((cWeeks[0]||'').split("-")[1].replace(/[^0-9]/ig,""));
    }
    var singleOrDouble = cWeeks[1];
    var weekArray = [];
    for (var j = startWeek,k=0;j <= endWeek;j++,k++) {
        if(singleOrDouble=="单周"){
            if(j % 2 == 0) {
                k--;
                continue;
            }
        } else if(singleOrDouble=="双周"){
            if(j % 2 == 1) {
                k--
                continue;
            }
        }
        weekArray[k] = j;
    }

    switch (cDay) {
        case '一':
            day = 1;
            break;
        case '二':
            day = 2;
            break;
        case '三':
            day = 3;
            break;
        case '四':
            day = 4;
            break;
        case '五':
            day = 5;
            break;
        case '六':
            day = 6;
            break;
        case '七':
            day = 7;
            break;
    }


    for (var i = 0;i < str.length;i++) {
        if (str[i]=="")
            continue;
    }

    var con = new Object();
    con.name = name;
    con.position = position;
    con.teacher = teacher;
    con.weeks = weekArray;
    con.day = day;
    if(num-1 == 1)
        con.sections = [{"section":num-1 ,"startTime": "08:30","endTime": "09:15"},{"section":num-1+1,"startTime": "09:25","endTime": "10:10"}]
    if(num-1 == 3)
        con.sections = [{"section":num-1 ,"startTime": "10:30","endTime": "11:15"},{"section":num-1+1,"startTime": "11:25","endTime": "12:10"}]
    if(num-1 == 5)
        con.sections = [{"section":num-1 ,"startTime": "14:30","endTime": "15:15"},{"section":num-1+1,"startTime": "15:25","endTime": "16:10"}]
    if(num-1 == 7)
        con.sections = [{"section":num-1 ,"startTime": "16:25","endTime": "17:10"},{"section":num-1+1,"startTime": "17:20","endTime": "18:05"}]
    if(num-1 == 9)
        con.sections = [{"section":num-1 ,"startTime": "19:30","endTime": "20:15"},{"section":num-1+1,"startTime": "20:25","endTime": "21:10"}]

    var json = JSON.stringify(con)
    return JSON.parse(json);

}

function getCourseInfos(s,jsonArray) {
    var lesson = (s||'').split("<br><br>");
    var json1 = new Object();
    for(var i = 0;i < lesson.length;i++) {
        json1 = getJson(lesson[i],3);
        if(json1 != null && json1.name != "")
            jsonArray.push(json1);
    }
    return jsonArray;
}

最后弹出所返回的json数据,并且控制台显示 All run successfully 代表成功
在这里插入图片描述
在这里插入图片描述

测试

接下来就可以上传然后在手机上进行导入测试啦
在这里插入图片描述
测试了好几个不同专业同学的课程表,都导入成功啦!
坐等审核通过上线(生怕有bug又打回来)

2020/09/19 审核通过啦
在这里插入图片描述

  • 16
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
正方教务课表可以通过将课程数据存储为JSON格式来实现转换。根据引用中提供的信息,课表数据可以存储在一个JSONArray数组中,每个元素代表一节课。具体的存储方式如下: - 数据存储在JSONArray数组中,命名为data。 - 数组中的每个元素data[i]代表第i+1节课。 - 周一到周日分别对应X轴的week1到week7。 - 每节课的具体内容可以使用空格分隔,每四个空格为一个阶段上的课程。 例如,如果星期一的第一、二节课在1-10周上高数,11-14周上动漫文化,15-18周上社交礼仪,那么在JSON中可以表示为: ``` { "data": [ "1-10 高数", "11-14 动漫文化", "15-18 社交礼仪", ... ] } ``` 这样,通过JSON格式的存储,可以将正方教务系统的课表数据转换为可供其他应用程序调用的结构化数据。使用这种方式,可以方便地进行课表的存储和显示。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java实现从正方教务系统抓取数据(三)--Android客户端](https://blog.csdn.net/sinat_18127633/article/details/50489767)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Java实现从正方教务系统抓取数据(三)--android客户端](https://download.csdn.net/download/sinat_18127633/9397566)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [小爱课程表导入课程表功能开发正方教务系统)](https://blog.csdn.net/weixin_43723877/article/details/108667994)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值