diff --git a/android/app/build.gradle b/android/app/build.gradle
index 5cb6f8a..4c919da 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -29,16 +29,19 @@ def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
- compileSdkVersion 31
+ compileSdkVersion 32
lintOptions {
disable 'InvalidPackage'
+ disable "Instantiatable"
+ checkReleaseBuilds false
+ abortOnError false
}
defaultConfig {
applicationId "com.lilystudio.wheretosleepinnju"
minSdkVersion 23
- targetSdkVersion 31
+ targetSdkVersion 32
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
diff --git a/android/build.gradle b/android/build.gradle
index d652a29..78d035f 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -8,7 +8,7 @@ buildscript {
}
dependencies {
- classpath 'com.android.tools.build:gradle:4.1.1'
+ classpath 'com.android.tools.build:gradle:4.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
gradle.projectsEvaluated {
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
index c69d51d..ca2bbd5 100644
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
\ No newline at end of file
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-all.zip
\ No newline at end of file
diff --git a/api/complete.json b/api/complete.json
index 83922e2..7dae8f3 100644
--- a/api/complete.json
+++ b/api/complete.json
@@ -1,9 +1,7 @@
{
- "version": 1,
- "title": "用户协议与隐私政策",
- "content": "
版本生效日期:2021-10-01
感谢使用南哪课表!本应用由idealclover开发与发布。我们非常重视用户的隐私保护,绝不会在未经允许的情况下收集您的任何隐私内容。本文尽可能简短,强烈建议您认真阅读。
我们收集的数据
应用崩溃时产生的日志信息,以便于我们定位bug和改善应用健壮性;
我们不会收集的数据
用户在APP内进行登录操作时输入的账号与密码,如果您使用记住密码功能,我们会将这些信息存储在用户本地,不会上传至服务器;
用户的个人信息与课程信息将同样会存储在用户本地,不会上传至服务器;
特殊地,如果使用课表分享功能,课程信息将在服务器按期限进行暂存,如果添加由南哪助手(原NJU助手)提供的讲座信息,您的添加行为将被匿名记录以实现「X人已添加」功能;
集成的第三方 SDK
集成友盟+SDK,友盟+SDK需要收集您的设备Mac地址、唯一设备识别码(IMEI/android ID/IDFA/OPENUDID/GUID、SIM 卡 IMSI 信息)以提供统计分析服务,并通过地理位置校准报表数据准确性,提供基础反作弊能力。
",
- "isForce": false,
- "confirm_text_first_install": "同意协议,开始导入",
- "confirm_text_for_upgrade": "同意协议,开始使用",
- "cancel_text": "不同意并退出"
-}
\ No newline at end of file
+ "title": "欢迎使用南哪课表!",
+ "content": "2022.02\n恍惚之间又一年啊\n今年也为南哪课表做了不少工作,推出了讲座系统,支持了自由时间课程,也做了课表的官网和宣传视频,希望大家能喜欢鸭!\n\n2021.08\n又是新的学期啦\n21届的新同学都要来了,瞬间有种自己太老了的感觉hhhhhh\n\n2021.2\n不知不觉小作文更新这么长了~\n\n又是新的一年,新的一学期了。\n\n过去的这一年或许大家都经历了很多,疫情来了,翠翠毕业了,紫荆站关闭了。或许,哪次教务系统更新之后,南哪课表就再也用不起来了。\n\n所以,如果南哪课表还不错,可以在它还在的时候,一起安利给周围的小伙伴吗~\n\n过去的时光,我们都辛苦了,未来,一起加油。\n\n“敬自己一杯,因为值得。”\n\n2020.9\n这是翠翠离开南大的第一个秋天。不过放心,南哪课表还在维护。\n\n离开校园,其实想说的话有很多,但却又不知道从哪里说起,说些什么,却总会在被社会毒打的时候怀念起在南大的快乐时光。\n\n大概,衷心希望学弟学妹们珍惜大学生活w\n\n2020.5\n在付出了另一个¥688后,南哪课表终于上线 APP Store 啦!感谢大家一直以来的支持!\n\n2020.2\n2020年2月全部投喂收入将捐赠以支援湖北疫情\n(2020.3补充:已捐赠)\n\n2019.9\nHi!我是项目作者傻翠~\n\n看起来你已经导入我南教务处成功啦!撒花撒花!\n\n建议大家还是和自己教务系统中的课表对一下~避免出现什么bug~如果有bug的话欢迎反馈给我!设置-反馈中有交流群的群号~\n\n坦率地讲,从安卓移植到全平台是一个痛苦的过程。之前的APP多少是建立在开源项目的基础上,而这个重构项目算是自己从零开始搭起来的。其中也做了不少取舍与妥协,还有可能出现之前所没有过的bug,如果不巧遇到bug,欢迎向我反馈。\n\n写这个项目是一个吃力不讨好的事。单是苹果的开发者账号就要688/年,更不用提为了开发iOS版而单独买的MacBook。所以如果小伙伴想让这个项目持续下去的话,欢迎投喂傻翠。\n\n放心,这个弹框每次导入只会弹出一次,所以不会影响你的正常使用。\n\n希望南哪课表可以陪伴学弟学妹们走过每一学期ww\n\n傻翠",
+ "content_html": "2022.02
恍惚之间又一年啊
今年也为南哪课表做了不少工作,推出了讲座系统,支持了自由时间课程,也做了课表的官网和宣传视频,希望大家能喜欢鸭!
2021.08
又是新的学期啦
21届的新同学都要来了,瞬间有种自己太老了的感觉hhhhhh
2021.2
不知不觉小作文更新这么长了~
又是新的一年,新的一学期了。
过去的这一年或许大家都经历了很多,疫情来了,翠翠毕业了,紫荆站关闭了。或许,哪次教务系统更新之后,南哪课表就再也用不起来了。
所以,如果南哪课表还不错,可以在它还在的时候,一起安利给周围的小伙伴吗~
过去的时光,我们都辛苦了,未来,一起加油。
“敬自己一杯,因为值得。”
2020.9
这是翠翠离开南大的第一个秋天。不过放心,南哪课表还在维护。
离开校园,其实想说的话有很多,但却又不知道从哪里说起,说些什么,却总会在被社会毒打的时候怀念起在南大的快乐时光。
大概,衷心希望学弟学妹们珍惜大学生活w
2020.5
在付出了另一个¥688后,南哪课表终于上线 APP Store 啦!感谢大家一直以来的支持!
2020.2
2020年2月全部投喂收入将捐赠以支援湖北疫情
(2020.3补充:已捐赠)
2019.9
Hi!我是项目作者傻翠~
看起来你已经导入我南教务处成功啦!撒花撒花!
建议大家还是和自己教务系统中的课表对一下~避免出现什么bug~如果有bug的话欢迎反馈给我!设置-反馈中有交流群的群号~
坦率地讲,从安卓移植到全平台是一个痛苦的过程。之前的APP多少是建立在开源项目的基础上,而这个重构项目算是自己从零开始搭起来的。其中也做了不少取舍与妥协,还有可能出现之前所没有过的bug,如果不巧遇到bug,欢迎向我反馈。
写这个项目是一个吃力不讨好的事。单是苹果的开发者账号就要688/年,更不用提为了开发iOS版而单独买的MacBook。所以如果小伙伴想让这个项目持续下去的话,欢迎投喂傻翠。
放心,这个弹框每次导入只会弹出一次,所以不会影响你的正常使用。
希望南哪课表可以陪伴学弟学妹们走过每一学期ww
傻翠
",
+ "semester_start_monday": "2022-09-05",
+ "delay": 10
+}
diff --git a/api/importVisibility.json b/api/importVisibility.json
new file mode 100644
index 0000000..e65e848
--- /dev/null
+++ b/api/importVisibility.json
@@ -0,0 +1,7 @@
+{
+ "data": [
+ true,
+ true,
+ false
+ ]
+}
\ No newline at end of file
diff --git a/api/schoolList.json b/api/schoolList.json
index f44e38d..b800750 100644
--- a/api/schoolList.json
+++ b/api/schoolList.json
@@ -1,18 +1,18 @@
{
"data": [
{
- "title": "南京大学本科生选课系统(beta)",
+ "title": "南京大学本科生统一认证",
"pinyin": "nanjingdaxuebenke",
- "description": "测试中,请确保APP版本>=3.1.0!",
- "page_title": "选课系统登录",
+ "description": "内置导入不成功时可以试试这个",
+ "page_title": "教务系统登录",
"initialUrl": "https://authserver.nju.edu.cn/authserver/login?service=http%3A%2F%2Felite.nju.edu.cn%2Fjiaowu%2Fcaslogin.jsp",
"redirectUrl": "http://elite.nju.edu.cn/jiaowu/login.do",
"targetUrl": "http://elite.nju.edu.cn/jiaowu/student/teachinginfo/courseList.do?method=currentTermCourse",
"preExtractJS": "",
"delayTime": 3,
"extractJS": "",
- "extractJSfileAndroid": "https://cdn.idealclover.cn/Projects/wheretosleepinnju/production/tools/njubksxk_android.js",
- "extractJSfileiOS": "https://cdn.idealclover.cn/Projects/wheretosleepinnju/production/tools/njubksxk.js",
+ "extractJSfileAndroid": "https://cdn.idealclover.cn/Projects/wheretosleepinnju/production/tools/njubksjw.js",
+ "extractJSfileiOS": "https://cdn.idealclover.cn/Projects/wheretosleepinnju/production/tools/njubksjw.js",
"banner_content": "注意:如加载失败,请连接南京大学VPN\n试试浏览器访问教务网,没准教务系统又抽风了\n听起来有点离谱,不过在南京大学,倒也正常",
"banner_action": "下载南京大学VPN",
"banner_url": "https://vpn.nju.edu.cn",
@@ -20,9 +20,29 @@
"isGrey3.1.0": false
},
{
- "title": "南京大学研究生选课系统(alpha)",
+ "title": "南京大学本科生选课系统(beta)",
+ "pinyin": "nanjingdaxuebenke",
+ "description": "新选课系统,可能不太稳定",
+ "page_title": "选课系统登录",
+ "initialUrl": "https://xk.nju.edu.cn",
+ "redirectUrl": "",
+ "targetUrl": "https://xk.nju.edu.cn/xsxkapp/sys/xsxkapp/*default/grablessons.do",
+ "preExtractJS": "document.getElementsByClassName('yxkc-window-btn')[0].click();document.getElementsByClassName('jqx-tabs-titleContentWrapper ')[0].click();",
+ "delayTime": 3,
+ "extractJS": "",
+ "extractJSfileAndroid": "https://cdn.idealclover.cn/Projects/wheretosleepinnju/production/tools/njubksxk.js",
+ "extractJSfileiOS": "https://cdn.idealclover.cn/Projects/wheretosleepinnju/production/tools/njubksxk.js",
+ "banner_content": "注意:如加载失败,请连接南京大学VPN\n试试浏览器访问教务网,没准系统又抽风了\n听起来有点离谱,不过在南京大学,倒也正常",
+ "banner_action": "下载南京大学VPN",
+ "banner_url": "https://vpn.nju.edu.cn",
+ "isGrey": true,
+ "isGrey3.1.0": false,
+ "semester_start_monday": "2022-09-05"
+ },
+ {
+ "title": "南京大学研究生选课系统",
"pinyin": "nanjingdaxueyanjiu",
- "description": "测试中,请确保APP版本>=3.1.0!",
+ "description": "研究生同学的课表导入方式",
"page_title": "选课系统登录",
"initialUrl": "https://yjsxk.nju.edu.cn/yjsxkapp/sys/xsxkapp/index_nju.html",
"redirectUrl": "https://yjsxk.nju.edu.cn/yjsxkapp/sys/xsxkapp/course_nju.html",
@@ -30,7 +50,7 @@
"preExtractJS": "",
"delayTime": 3,
"extractJS": "",
- "extractJSfileAndroid": "https://cdn.idealclover.cn/Projects/wheretosleepinnju/production/tools/njuyjsxk_android.js",
+ "extractJSfileAndroid": "https://cdn.idealclover.cn/Projects/wheretosleepinnju/production/tools/njuyjsxk.js",
"extractJSfileiOS": "https://cdn.idealclover.cn/Projects/wheretosleepinnju/production/tools/njuyjsxk.js",
"banner_content": "导入方式:登陆后点击「我的选课」进入选课页\n注意:如加载失败,请连接南京大学VPN\n试试浏览器访问教务网,没准教务系统又抽风了\n听起来有点离谱,不过在南京大学,倒也正常",
"banner_action": "下载南京大学VPN",
diff --git a/api/tools/njubksjw.js b/api/tools/njubksjw.js
new file mode 100644
index 0000000..db2db72
--- /dev/null
+++ b/api/tools/njubksjw.js
@@ -0,0 +1,91 @@
+function scheduleHtmlParser() {
+ let WEEK_WITH_BIAS = [
+ "",
+ "周一",
+ "周二",
+ "周三",
+ "周四",
+ "周五",
+ "周六",
+ "周日",
+ ];
+ let name = document.querySelector(
+ "body > div:nth-child(10) > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(1)"
+ ).textContent;
+ let rst = { name: name, courses: [] };
+ let table_1 = document.getElementsByClassName("TABLE_TR_01");
+ let table_2 = document.getElementsByClassName("TABLE_TR_02");
+ let table = table_1.concat(table_2);
+ table.forEach((e) => {
+ let state = e.children[6].innerText;
+ if (state.includes("已退选")) return;
+ let course_name = e.children[1].innerText;
+ let class_number = e.children[0].innerText;
+ let teacher = e.children[3].innerText;
+ let test_time = e.children[8].innerText;
+ let test_location = e.children[9].innerText;
+ let course_info = e.children[10].innerText;
+ let info_str = e.children[4].innerText;
+ let info_list = info_str.split("\n");
+ info_list.forEach((i) => {
+ let week_time = 0;
+ let strs = i.split(" ");
+ let start_time = 0;
+ let time_count = 0;
+ let weeks = [];
+ for (let z = 0; z < WEEK_WITH_BIAS.length; z++) {
+ if (WEEK_WITH_BIAS[z] == strs[0]) week_time = z;
+ }
+ let pattern1 = new RegExp("第(\\d{1,2})-(\\d{1,2})节", "i");
+ strs.forEach((w) => {
+ let r = pattern1.exec(w);
+ if (r) {
+ start_time = parseInt(r[1]);
+ time_count = parseInt(r[2]) - parseInt(r[1]);
+ }
+ });
+ let pattern2 = new RegExp("(\\d{1,2})-(\\d{1,2})周", "i");
+ strs.forEach((x) => {
+ let s = pattern2.exec(x);
+ if (s) {
+ if (strs.includes("单周")) {
+ for (let z = parseInt(s[1]); z <= parseInt(s[2]); z += 2)
+ weeks.push(z);
+ } else if (strs.includes("双周")) {
+ for (let z = parseInt(s[1]); z <= parseInt(s[2]); z += 2)
+ weeks.push(z);
+ } else {
+ for (let z = parseInt(s[1]); z <= parseInt(s[2]); z++)
+ weeks.push(z);
+ }
+ }
+ });
+ let pattern3 = new RegExp("第(\\d{1,2})周", "i");
+ strs.forEach((y) => {
+ let t = pattern3.exec(y);
+ if (t) {
+ weeks.push(parseInt(t[1]));
+ }
+ });
+ let classroom = strs[strs.length - 1];
+ rst["courses"].push({
+ name: course_name,
+ classroom: classroom,
+ class_number: class_number,
+ teacher: teacher,
+ test_time: test_time,
+ test_location: test_location,
+ link: null,
+ weeks: weeks,
+ week_time: week_time,
+ start_time: start_time,
+ time_count: time_count,
+ import_type: 1,
+ info: course_info,
+ data: null,
+ });
+ });
+ });
+ return encodeURIComponent(JSON.stringify(rst));
+}
+scheduleHtmlParser();
diff --git a/api/tools/njubksxk.js b/api/tools/njubksxk.js
index d1c23e5..a5bd116 100644
--- a/api/tools/njubksxk.js
+++ b/api/tools/njubksxk.js
@@ -1,3 +1,37 @@
+function getWeekSeriesString(info) {
+ let weekList = [];
+ let strs = [];
+ try {
+ info = info.split(" ")[2];
+ strs = info.split(",");
+ } catch (e) {
+ return "[]";
+ }
+
+ for (let i = 0; i < strs.length; i++) {
+ var rst4 = strs[i].match(/^(\d{1,2})周$/);
+ if (rst4 != null) {
+ weekList.push(rst4[1]);
+ }
+
+ var rst2 = strs[i].match(/(\d{1,2})-(\d{1,2})周/);
+ if (rst2 != null) {
+ let startWeek = parseInt(rst2[1]);
+ let endWeek = parseInt(rst2[2]);
+ if (strs[i].includes("单") || strs[i].includes("双")) {
+ for (let j = startWeek; j <= endWeek; j = j + 2) {
+ weekList.push(j);
+ }
+ } else {
+ for (let j = startWeek; j <= endWeek; j++) {
+ weekList.push(j);
+ }
+ }
+ }
+ }
+ return weekList;
+}
+
function scheduleHtmlParser() {
let WEEK_WITH_BIAS = [
"",
@@ -9,83 +43,110 @@ function scheduleHtmlParser() {
"周六",
"周日",
];
- let name = document.querySelector(
- "body > div:nth-child(10) > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(1)"
- ).textContent;
- let rst = { name: name, courses: []};
- let table_1 = document.getElementsByClassName("TABLE_TR_01");
- let table_2 = document.getElementsByClassName("TABLE_TR_02");
- let table = table_1.concat(table_2);
- table.forEach((e) => {
- let state = e.children[6].innerText;
- if (state.includes("已退选")) return;
- let course_name = e.children[1].innerText;
- let class_number = e.children[0].innerText;
- let teacher = e.children[3].innerText;
- let test_time = e.children[8].innerText;
- let test_location = e.children[9].innerText;
- let course_info = e.children[10].innerText;
- let info_str = e.children[4].innerText;
- let info_list = info_str.split("\n");
- info_list.forEach((i) => {
- let week_time = 0;
- let strs = i.split(" ");
- let start_time = 0;
- let time_count = 0;
- let weeks = [];
- for (let z = 0; z < WEEK_WITH_BIAS.length; z++) {
- if (WEEK_WITH_BIAS[z] == strs[0]) week_time = z;
- }
- let pattern1 = new RegExp("第(\\d{1,2})-(\\d{1,2})节", "i");
- strs.forEach((w) => {
- let r = pattern1.exec(w);
- if (r) {
- start_time = parseInt(r[1]);
- time_count = parseInt(r[2]) - parseInt(r[1]);
- }
- });
- let pattern2 = new RegExp("(\\d{1,2})-(\\d{1,2})周", "i");
- strs.forEach((x) => {
- let s = pattern2.exec(x);
- if (s) {
- if (strs.includes("单周")) {
- for (let z = parseInt(s[1]); z <= parseInt(s[2]); z += 2)
- weeks.push(z);
- } else if (strs.includes("双周")) {
- for (let z = parseInt(s[1]); z <= parseInt(s[2]); z += 2)
- weeks.push(z);
- } else {
- for (let z = parseInt(s[1]); z <= parseInt(s[2]); z++)
- weeks.push(z);
+ let WEEK_NUM = 17;
+
+ let name = document.getElementsByClassName("currentTerm")[0].innerHTML;
+ let rst = { name: name, courses: [] };
+ let tableHead = document.getElementsByClassName("course-head")[1];
+ let headElements = tableHead.children[0].children;
+ let infoIndex = 3;
+ let courseNameIndex = 1;
+ let courseTeacherIndex = 2;
+ let courseInfoIndex = 6;
+ for (let i = 0; i < headElements.length; i++) {
+ // console.log(headElements[i].innerHTML);
+ if (headElements[i].innerHTML.includes("时间地点")) {
+ infoIndex = i;
+ } else if (headElements[i].innerHTML.includes("课程名")) {
+ courseNameIndex = i;
+ } else if (headElements[i].innerHTML.includes("教师")) {
+ courseTeacherIndex = i;
+ } else if (headElements[i].innerHTML.includes("备注")) {
+ courseInfoIndex = i;
+ }
+ }
+ let table = document.getElementsByClassName("course-body")[1];
+ let elements = table.children;
+
+ for (let i = 0; i < elements.length; i++) {
+ // console.log(elements[i]);
+ //退选课程
+ // String state = e.children[6].innerHtml.trim();
+ // if(state.contains('已退选')) continue;
+
+ if (elements[i].className.includes("wdbm-course-tr")) continue;
+ // print(e.className);
+
+ // Time and Place
+ let infos = elements[i].children[infoIndex].children;
+ let courseName = elements[i].children[courseNameIndex].innerHTML;
+ let courseTeacher = elements[i].children[courseTeacherIndex].innerHTML;
+ let courseInfo =
+ elements[i].children[courseInfoIndex].attributes["title"].value;
+
+ // console.log(infos);
+ for (let j = 0; j < infos.length; j++) {
+ let info = infos[j].innerHTML;
+ if (info == "") continue;
+ // console.log(info);
+
+ let strs = info.split(" ");
+
+ //自由时间缺省值
+ let weekTime = 0;
+ let startTime = 0;
+ let timeCount = 0;
+ if (!info.includes("自由时间")) {
+ // Get WeekTime
+ let weekStr = info.substring(0, 2);
+ for (let k = 0; k < WEEK_WITH_BIAS.length; k++) {
+ if (WEEK_WITH_BIAS[k] == weekStr) {
+ weekTime = k;
}
}
- });
- let pattern3 = new RegExp("第(\\d{1,2})周", "i");
- strs.forEach((y) => {
- let t = pattern3.exec(y);
- if (t) {
- weeks.push(parseInt(t[1]));
+ }
+
+ let weekSeries;
+ // console.log(info)
+
+ let time = info.match(/(\d{1,2})-(\d{1,2})节/);
+ // console.log(time);
+ // var time = patten1.firstMatch(info);
+ if (time) {
+ startTime = parseInt(time[1]);
+ timeCount = parseInt(time[2]) - startTime;
+ weekSeries = getWeekSeriesString(info);
+ }
+ if (weekSeries == null) {
+ weekSeries = [];
+ for (let j = 1; j <= WEEK_NUM; j++) {
+ weekSeries.push(j);
}
- });
- let classroom = strs[strs.length - 1];
+ }
+
+ // Get ClassRoom
+ let classRoom = strs[strs.length - 1];
+
+ // console.log(weekTime);
rst["courses"].push({
- name: course_name,
- classroom: classroom,
- class_number: class_number,
- teacher: teacher,
- test_time: test_time,
- test_location: test_location,
+ name: courseName,
+ classroom: classRoom,
+ // class_number: class_number,
+ teacher: courseTeacher,
+ // test_time: test_time,
+ // test_location: test_location,
link: null,
- weeks: weeks,
- week_time: week_time,
- start_time: start_time,
- time_count: time_count,
+ weeks: weekSeries,
+ week_time: weekTime,
+ start_time: startTime,
+ time_count: timeCount,
import_type: 1,
- info: course_info,
+ info: courseInfo,
data: null,
});
- });
- });
+ }
+ }
+ // return rst;
return encodeURIComponent(JSON.stringify(rst));
}
scheduleHtmlParser();
diff --git a/api/tools/njuyjsxk.js b/api/tools/njuyjsxk.js
index f990890..a84413a 100644
--- a/api/tools/njuyjsxk.js
+++ b/api/tools/njuyjsxk.js
@@ -46,6 +46,9 @@ function scheduleHtmlParser() {
} else if (strs[4] == '双') {
for (let z = parseInt(strs[1]); z <= parseInt(strs[3]); z += 2)
weeks.push(z);
+ } else if (typeof(strs[2]) == 'undefined') {
+ // Just a single weak ...
+ weeks.push(parseInt(strs[1]));
} else {
for (let z = parseInt(strs[1]); z <= parseInt(strs[3]); z++)
weeks.push(z);
diff --git a/lib/Models/CourseTableModel.dart b/lib/Models/CourseTableModel.dart
index 5a59fb4..b189eca 100644
--- a/lib/Models/CourseTableModel.dart
+++ b/lib/Models/CourseTableModel.dart
@@ -77,7 +77,7 @@ class CourseTableProvider {
return rst.toList();
}
- Future> getclassTimeList(int id) async {
+ Future> getClassTimeList(int id) async {
await open();
List