Просмотр исходного кода

Merge pull request #426 from XingHeYuZhuan/pending

星河欲转 3 дней назад
Родитель
Сommit
5621cfe476
3 измененных файлов с 122 добавлено и 1 удалено
  1. 6 1
      index/root_index.yaml
  2. 9 0
      resources/NIIT/adapters.yaml
  3. 107 0
      resources/NIIT/niit.js

+ 6 - 1
index/root_index.yaml

@@ -666,4 +666,9 @@ schools:
   - id: "GUC"
     name: "吉利学院"
     initial: "J"
-    resource_folder: "GUC"
+    resource_folder: "GUC"
+
+  - id: "NIIT"
+    name: "南京工业职业技术大学"
+    initial: "N"
+    resource_folder: "NIIT"

+ 9 - 0
resources/NIIT/adapters.yaml

@@ -0,0 +1,9 @@
+# resources/NIIT/adapters.yaml
+adapters:
+  - adapter_id: "NIIT"
+    adapter_name: "南京工业职业技术大学教务"
+    category: "BACHELOR_AND_ASSOCIATE"
+    asset_js_path: "niit.js"
+    import_url: "https://jwxt.niit.edu.cn/"
+    maintainer: "nifs1729"
+    description: "点击统一身份认证登录,登录后直接点击导入即可"

+ 107 - 0
resources/NIIT/niit.js

@@ -0,0 +1,107 @@
+// 文件: 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) { }
+})();