| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- // 文件: courseImportApi.js
- // 南京工业职业技术大学(jwxt.niit.edu.cn)「我的课表」API 方案适配脚本(金智教育 WIS 平台)
- // 全自动:自动确定当前学期,直接调用教务后端接口获取课表并导入,无任何人工输入。
- const SCHOOL = {
- api: "https://jwxt.niit.edu.cn/jwapp/sys/wdkb/modules/xskcb/cxxszhxqkb.do"
- };
- // 本校作息时间表(11 节)
- const PRESET_TIME_SLOTS = [
- { number: 1, startTime: "08:00", endTime: "08:45" },
- { number: 2, startTime: "08:55", endTime: "09:40" },
- { number: 3, startTime: "10:00", endTime: "10:45" },
- { number: 4, startTime: "10:55", endTime: "11:40" },
- { number: 5, startTime: "13:30", endTime: "14:15" },
- { number: 6, startTime: "14:25", endTime: "15:10" },
- { number: 7, startTime: "15:30", endTime: "16:15" },
- { number: 8, startTime: "16:25", endTime: "17:10" },
- { number: 9, startTime: "18:15", endTime: "19:00" },
- { number: 10, startTime: "19:10", endTime: "19:55" },
- { number: 11, startTime: "20:05", endTime: "20:50" }
- ];
- // 自动确定当前学期,优先取页面学期标签,其次取当前日期
- function currentTerm() {
- try {
- var t = document.querySelector("#dqxnxq2");
- if (t && t.getAttribute("value")) return t.getAttribute("value");
- } catch (e) { }
- var y = new Date().getFullYear();
- return (new Date().getMonth() >= 1 && new Date().getMonth() <= 6)
- ? (y - 1) + "-" + y + "-2"
- : y + "-" + (y + 1) + "-1";
- }
- // POST 请求教务接口(复用登录 Cookie)
- async function fetchCourseRows() {
- var resp = await fetch(SCHOOL.api, {
- method: "POST",
- headers: {
- "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
- "x-requested-with": "XMLHttpRequest"
- },
- body: "XNXQDM=" + currentTerm(),
- credentials: "include"
- });
- return (await resp.json()).datas;
- }
- // 从 datas 中定位课程 rows(键名可能不同,做兜底)
- function pluckRows(datas) {
- for (var k in datas) {
- var v = datas[k];
- if (v && Array.isArray(v.rows)) return v.rows;
- if (Array.isArray(v)) return v;
- }
- return [];
- }
- // 解析一条排课;周次串"111...000..."逐位为1即在第i+1周上课
- function parseCourse(r) {
- var day = parseInt(r.SKXQ, 10);
- var startSection = parseInt(r.KSJC, 10);
- var endSection = parseInt(r.JSJC, 10);
- if (!r.KCM || isNaN(day) || isNaN(startSection) || isNaN(endSection)) return null;
- var weeks = [];
- (r.SKZC || "").split("").forEach(function (c, i) { if (c === "1") weeks.push(i + 1); });
- if (!weeks.length) return null;
- var name = r.KCM;
- var teacher = (r.SKJS || "待定").split("/")[0];
- var position = r.JASMC || "待定";
- // 去重 key:星期+节次+课程+教师+教室;并合并同 key 的周次
- var key = day + "|" + startSection + "|" + endSection + "|" + name + "|" + teacher + "|" + position;
- return { key: key, course: { name: name, teacher: teacher, position: position, day: day, startSection: startSection, endSection: endSection, weeks: weeks } };
- }
- // 主流程
- (async function () {
- if (!(window.AndroidBridgePromise && window.AndroidBridgePromise.saveImportedCourses)) return;
- var datas = await fetchCourseRows();
- var rows = pluckRows(datas);
- console.log("[课程API导入] 接口返回行数:", rows.length, rows);
- var index = {}, courses = [];
- for (var i = 0; i < rows.length; i++) {
- var p = parseCourse(rows[i]);
- if (!p) continue; // 只识别完整学期课表,不做调课/补课/停课过滤
- if (index[p.key] === undefined) {
- index[p.key] = courses.length;
- courses.push(p.course);
- } else {
- var ex = courses[index[p.key]];
- p.course.weeks.forEach(function (w) { if (ex.weeks.indexOf(w) === -1) ex.weeks.push(w); });
- }
- }
- courses.forEach(function (c) { c.weeks.sort(function (a, b) { return a - b; }); });
- if (!courses.length) return;
- var totalWeeks = 0;
- for (var j = 0; j < rows.length; j++) totalWeeks = Math.max(totalWeeks, String(rows[j].SKZC || "").length);
- await window.AndroidBridgePromise.savePresetTimeSlots(JSON.stringify(PRESET_TIME_SLOTS));
- await window.AndroidBridgePromise.saveCourseConfig(JSON.stringify({ semesterStartDate: null, semesterTotalWeeks: totalWeeks || 20, firstDayOfWeek: 1 }));
- await window.AndroidBridgePromise.saveImportedCourses(JSON.stringify(courses));
- try { window.AndroidBridge.notifyTaskCompletion(); } catch (e) { }
- })();
|