Pārlūkot izejas kodu

add:枣庄学院教务系统适配 (#257)

sLingli 2 dienas atpakaļ
vecāks
revīzija
edc8469115
3 mainītis faili ar 129 papildinājumiem un 0 dzēšanām
  1. 5 0
      index/root_index.yaml
  2. 9 0
      resources/UZZ/adapters.yaml
  3. 115 0
      resources/UZZ/uzz_01.js

+ 5 - 0
index/root_index.yaml

@@ -421,3 +421,8 @@ schools:
     name: "中南民族大学"
     initial: "Z"
     resource_folder: "SCUEC"
+
+  - id: "UZZ"
+    name: "枣庄学院"
+    initial: "Z"
+    resource_folder: "UZZ"

+ 9 - 0
resources/UZZ/adapters.yaml

@@ -0,0 +1,9 @@
+# resources/UZZ/adapters.yaml
+adapters:
+  - adapter_id: "UZZ_01"
+    adapter_name: "枣庄学院正方教务"
+    category: "BACHELOR_AND_ASSOCIATE"
+    asset_js_path: "uzz_01.js"
+    import_url: "https://iam.uzz.edu.cn/esc-sso/login/page"
+    maintainer: "素绫理"
+    description: "枣庄学院方正教务系统课表适配,登陆后点击【正方教务管理系统】,再点击【个人课表查询】,最后点击【执行导入】即可,导入后不要忘记设置本学期的开学日期"

+ 115 - 0
resources/UZZ/uzz_01.js

@@ -0,0 +1,115 @@
+const UZZ_BASE_URL = window.location.origin;
+
+function parseWeeks(weekStr) {
+    if (!weekStr) return [];
+    const segments = weekStr.split(',');
+    let weeks = [];
+    const segmentRegex = /(\d+)(?:-(\d+))?\s*周?(\([单双]\))?/g;
+    for (const segment of segments) {
+        segmentRegex.lastIndex = 0;
+        let match;
+        while ((match = segmentRegex.exec(segment)) !== null) {
+            const start = parseInt(match[1]);
+            const end = match[2] ? parseInt(match[2]) : start;
+            const flagStr = match[3] || '';
+            let flag = 0;
+            if (flagStr.includes('单')) flag = 1;
+            else if (flagStr.includes('双')) flag = 2;
+
+            for (let i = start; i <= end; i++) {
+                if (flag === 1 && i % 2 !== 1) continue;
+                if (flag === 2 && i % 2 !== 0) continue;
+                if (!weeks.includes(i)) weeks.push(i);
+            }
+        }
+    }
+    return weeks.sort((a, b) => a - b);
+}
+
+function parseJsonData(jsonData) {
+    if (!jsonData || !Array.isArray(jsonData.kbList)) return [];
+    const finalCourseList = [];
+    for (const item of jsonData.kbList) {
+        const weeks = parseWeeks(item.zcd);
+        const sectionParts = item.jcs.split('-');
+        const startSection = parseInt(sectionParts[0]);
+        const endSection = parseInt(sectionParts[sectionParts.length - 1]);
+        const day = parseInt(item.xqj);
+
+        if (weeks.length > 0 && !isNaN(day)) {
+            finalCourseList.push({
+                name: item.kcmc.trim(),
+                teacher: item.xm ? item.xm.trim() : "未知",
+                position: item.cdmc ? item.cdmc.trim() : "未知",
+                day: day,
+                startSection: startSection,
+                endSection: endSection,
+                weeks: weeks
+            });
+        }
+    }
+    return finalCourseList;
+}
+
+const TimeSlots = [
+    { number: 1, startTime: "08:00", endTime: "08:50" },
+    { number: 2, startTime: "08:50", endTime: "09:40" },
+    { number: 3, startTime: "10:10", endTime: "11:00" },
+    { number: 4, startTime: "11:00", endTime: "11:50" },
+    { number: 5, startTime: "14:30", endTime: "15:20" },
+    { number: 6, startTime: "15:20", endTime: "16:10" },
+    { number: 7, startTime: "16:40", endTime: "17:30" },
+    { number: 8, startTime: "17:30", endTime: "18:20" },
+    { number: 9, startTime: "19:30", endTime: "20:20" },
+    { number: 10, startTime: "20:20", endTime: "21:10" }
+];
+
+async function runImportFlow() {
+    const $ = window.jQuery;
+    
+    // 强拦截:由于正方系统的 gnmkdm 模块会话校验,必须要求用户在课表页面才能请求 API
+    if (!$ || !$('#xnm').length || !$('#xqm').length) {
+        await window.AndroidBridgePromise.showAlert(
+            "导入提示", 
+            "正方教务系统限制:请务必先点击进入【正方教务管理系统】->【个人课表查询】页面后,再点击一键导入!", 
+            "我知道了"
+        );
+        return;
+    }
+
+    AndroidBridge.showToast("正在获取当前页面课表数据...");
+    
+    // 直接静默提取页面上已经选好的学年和学期
+    const xnm = $('#xnm').val();
+    const xqm = $('#xqm').val();
+
+    try {
+        const apiUrl = `${UZZ_BASE_URL}/jwglxt/kbcx/xskbcx_cxXsgrkb.html?gnmkdm=N2151`;
+        const body = `xnm=${xnm}&xqm=${xqm}&kzlx=ck&xsdm=&kclbdm=`;
+
+        const response = await fetch(apiUrl, {
+            method: 'POST',
+            headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' },
+            body: body
+        });
+
+        const json = await response.json();
+        const courses = parseJsonData(json);
+
+        if (courses.length === 0) {
+            await window.AndroidBridgePromise.showAlert("导入失败", "该学年学期未找到课程数据,请确认页面上显示的课表是否为空。", "确定");
+            return;
+        }
+
+        await window.AndroidBridgePromise.saveImportedCourses(JSON.stringify(courses));
+        await window.AndroidBridgePromise.savePresetTimeSlots(JSON.stringify(TimeSlots));
+
+        AndroidBridge.showToast(`成功导入 ${courses.length} 门课程!`);
+        AndroidBridge.notifyTaskCompletion();
+    } catch (e) {
+        await window.AndroidBridgePromise.showAlert("导入失败", "接口请求异常,请确认教务系统网络通畅。", "确定");
+        console.error(e);
+    }
+}
+
+runImportFlow();