Quellcode durchsuchen

修复时间槽

- CFEC:时间槽改为硬编码常量
- ECJTU:补上 savePresetTimeSlots + 硬编码作息时间
- ZJUT:时间槽改为硬编码常量
- WENHUA:修复 parseTimeSlots 字段 jcmc→jcdm
glxgo vor 1 Monat
Ursprung
Commit
2c2876acdf
4 geänderte Dateien mit 49 neuen und 77 gelöschten Zeilen
  1. 19 40
      resources/CFEC/CFEC.js
  2. 14 5
      resources/ECJTU/ecjtu_01.js
  3. 1 6
      resources/WENHUA/wenhua_01.js
  4. 15 26
      resources/ZJUT/zjut_01.js

+ 19 - 40
resources/CFEC/CFEC.js

@@ -1,7 +1,22 @@
 const BASE = `${window.location.origin}/jwglxt`;
 const INDEX_PATH = '/kbcx/xskbcx_cxXskbcxIndex.html?gnmkdm=N2151&layout=default';
 const COURSE_API_PATH = '/kbcx/xskbcx_cxXsgrkb.html?gnmkdm=N2151';
-const TIME_API_PATH = '/kbcx/xskbcx_cxRjc.html?gnmkdm=N2151';
+
+const TIME_SLOTS = [
+  { number: 1, startTime: '08:10', endTime: '08:50' },
+  { number: 2, startTime: '09:00', endTime: '09:40' },
+  { number: 3, startTime: '09:50', endTime: '10:30' },
+  { number: 4, startTime: '10:40', endTime: '11:20' },
+  { number: 5, startTime: '11:30', endTime: '12:10' },
+  { number: 6, startTime: '14:10', endTime: '14:50' },
+  { number: 7, startTime: '15:00', endTime: '15:40' },
+  { number: 8, startTime: '15:50', endTime: '16:30' },
+  { number: 9, startTime: '16:40', endTime: '17:20' },
+  { number: 10, startTime: '18:30', endTime: '19:10' },
+  { number: 11, startTime: '19:20', endTime: '20:00' },
+  { number: 12, startTime: '20:10', endTime: '20:50' },
+  { number: 13, startTime: '21:00', endTime: '21:40' },
+];
 
 async function req(url, method = 'GET', body) {
   const res = await fetch(url, {
@@ -151,66 +166,30 @@ function parseCourses(data) {
   return { courses: [...deduped.values()], xqhId };
 }
 
-function parseTimeSlots(data) {
-  if (!Array.isArray(data) || !data.length) throw new Error('未获取到节次时间数据');
-  return data.map((item) => ({
-    number: Number(item.jcmc),
-    startTime: String(item.qssj || '').trim(),
-    endTime: String(item.jssj || '').trim()
-  })).filter(item => item.number > 0 && item.startTime && item.endTime);
-}
-
 async function fetchCourses(xnm, xqm) {
   const body = `xnm=${encodeURIComponent(xnm)}&xqm=${encodeURIComponent(xqm)}&kzlx=ck&xsdm=&kclbdm=&kclxdm=`;
   const text = await req(`${BASE}${COURSE_API_PATH}`, 'POST', body);
   return JSON.parse(text);
 }
 
-async function fetchTimeSlots(xnm, xqm, xqhId) {
-  const body = `xnm=${encodeURIComponent(xnm)}&xqm=${encodeURIComponent(xqm)}&xqh_id=${encodeURIComponent(xqhId || '1')}`;
-  const text = await req(`${BASE}${TIME_API_PATH}`, 'POST', body);
-  return parseTimeSlots(JSON.parse(text));
-}
-
-function validateSemesterStartDateInput(input) {
-  const value = String(input || '').trim();
-  if (!value) return false;
-  return /^\d{4}-\d{2}-\d{2}$/.test(value) ? false : '请输入 YYYY-MM-DD,例如 2026-02-24';
-}
-
-async function selectSemesterStartDate(xnm, xqm) {
-  const defaultDate = xqm === '3' ? `${xnm}-09-01` : `${Number(xnm) + 1}-03-01`;
-  const picked = await window.AndroidBridgePromise.showPrompt(
-    '选择开学日期',
-    '请输入开学日期(YYYY-MM-DD)',
-    defaultDate,
-    'validateSemesterStartDateInput'
-  );
-  if (picked === null) return null;
-  const value = String(picked).trim();
-  return value || null;
-}
-
 async function run() {
   try {
     const { xnm, xqm } = await resolveTerm();
     AndroidBridge.showToast('正在解析课表数据...');
 
     const rawData = await fetchCourses(xnm, xqm);
-    const { courses, xqhId } = parseCourses(rawData);
+    const { courses } = parseCourses(rawData);
     if (!courses.length) throw new Error('未获取到课表数据');
 
-    const semesterStartDate = await selectSemesterStartDate(xnm, xqm);
-    const timeSlots = await fetchTimeSlots(xnm, xqm, xqhId);
     const allWeeks = courses.flatMap(course => course.weeks);
     const semesterTotalWeeks = allWeeks.length ? Math.max(...allWeeks) : 20;
 
     await window.AndroidBridgePromise.saveCourseConfig(JSON.stringify({
       semesterTotalWeeks,
-      semesterStartDate,
+      semesterStartDate: null,
       firstDayOfWeek: 1
     }));
-    await window.AndroidBridgePromise.savePresetTimeSlots(JSON.stringify(timeSlots));
+    await window.AndroidBridgePromise.savePresetTimeSlots(JSON.stringify(TIME_SLOTS));
     await window.AndroidBridgePromise.saveImportedCourses(JSON.stringify(courses));
 
     AndroidBridge.showToast(`导入成功:${courses.length} 门`);

+ 14 - 5
resources/ECJTU/ecjtu_01.js

@@ -1,8 +1,3 @@
-// 文件: ECJTU_01.js
-// 功能:从华东交通大学系统获取课程表,解析后导入到拾光课程表
-// 适配:华东交通大学教务系统
-// 维护者:glxgo
-
 const BASE = window.location.origin;
 const SCHEDULE_PATHS = [
   '/Schedule/Schedule_getUserSchedume.action?item=0207',
@@ -10,6 +5,19 @@ const SCHEDULE_PATHS = [
   '/Schedule/Schedule_getUserSchedume.action'
 ];
 
+const TIME_SLOTS = [
+  { number: 1, startTime: '08:00', endTime: '08:45' },
+  { number: 2, startTime: '08:55', endTime: '09:40' },
+  { number: 3, startTime: '10:05', endTime: '10:50' },
+  { number: 4, startTime: '10:55', endTime: '11:40' },
+  { number: 5, startTime: '14:30', endTime: '15:15' },
+  { number: 6, startTime: '15:25', endTime: '16:10' },
+  { number: 7, startTime: '16:40', endTime: '17:25' },
+  { number: 8, startTime: '17:35', endTime: '18:20' },
+  { number: 9, startTime: '19:00', endTime: '19:45' },
+  { number: 10, startTime: '19:55', endTime: '20:40' },
+];
+
 function cleanText(value) {
   return String(value || '')
     .replace(/[​-‍]/g, '')
@@ -252,6 +260,7 @@ async function runImportFlow() {
       semesterStartDate: null,
       firstDayOfWeek: 1
     }));
+    await window.AndroidBridgePromise.savePresetTimeSlots(JSON.stringify(TIME_SLOTS));
     await window.AndroidBridgePromise.saveImportedCourses(JSON.stringify(courses));
 
     AndroidBridge.showToast(`导入成功:共 ${courses.length} 门课程`);

+ 1 - 6
resources/WENHUA/wenhua_01.js

@@ -1,8 +1,3 @@
-// 文件: WENHUA_01.js
-// 功能:从文华学院正方教务系统获取课程表,解析后导入到拾光课程表
-// 适配:文华学院正方教务系统
-// 维护者:glxgo
-
 const BASE = `${window.location.origin}/jwglxt`;
 const INDEX_PATH = '/kbcx/xskbcx_cxXskbcxIndex.html?gnmkdm=N2151&layout=default';
 const COURSE_API_PATH = '/kbcx/xskbcx_cxXsgrkb.html?gnmkdm=N2151';
@@ -159,7 +154,7 @@ function parseCourses(data) {
 function parseTimeSlots(data) {
   if (!Array.isArray(data) || !data.length) throw new Error('未获取到节次时间数据');
   return data.map((item) => ({
-    number: Number(item.jcmc),
+    number: Number(item.jcdm || item.jcmc),
     startTime: String(item.qssj || '').trim(),
     endTime: String(item.jssj || '').trim()
   })).filter(item => item.number > 0 && item.startTime && item.endTime);

+ 15 - 26
resources/ZJUT/zjut_01.js

@@ -1,13 +1,20 @@
-// 文件: ZJUT_01.js
-// 功能:从浙江工业大学正方教务系统获取课程表,解析后导入到拾光课程表
-// 适配:浙江工业大学正方教务系统
-// 维护者:glxgo
-
 const BASE = `${window.location.origin}/jwglxt`;
 const GNMKDM = 'N253508';
 const INDEX_PATH = `/kbcx/xskbcx_cxXskbcxIndex.html?gnmkdm=${GNMKDM}&layout=default`;
 const COURSE_API_PATH = `/kbcx/xskbcx_cxXsgrkb.html?gnmkdm=${GNMKDM}`;
-const TIME_API_PATH = `/kbcx/xskbcx_cxRjc.html?gnmkdm=${GNMKDM}`;
+
+const TIME_SLOTS = [
+  { number: 1, startTime: '08:00', endTime: '08:45' },
+  { number: 2, startTime: '08:55', endTime: '09:40' },
+  { number: 3, startTime: '09:55', endTime: '10:40' },
+  { number: 4, startTime: '10:50', endTime: '11:35' },
+  { number: 5, startTime: '11:45', endTime: '12:30' },
+  { number: 6, startTime: '13:30', endTime: '14:15' },
+  { number: 7, startTime: '14:25', endTime: '15:10' },
+  { number: 8, startTime: '15:25', endTime: '16:10' },
+  { number: 9, startTime: '16:20', endTime: '17:05' },
+  { number: 10, startTime: '18:30', endTime: '21:30' },
+];
 
 async function req(url, method = 'GET', body) {
   const res = await fetch(url, {
@@ -157,36 +164,20 @@ function parseCourses(data) {
   return { courses: [...deduped.values()], xqhId };
 }
 
-function parseTimeSlots(data) {
-  if (!Array.isArray(data) || !data.length) throw new Error('未获取到节次时间数据');
-  return data.map((item) => ({
-    number: Number(item.jcmc),
-    startTime: String(item.qssj || '').trim(),
-    endTime: String(item.jssj || '').trim()
-  })).filter(item => item.number > 0 && item.startTime && item.endTime);
-}
-
 async function fetchCourses(xnm, xqm) {
   const body = `xnm=${encodeURIComponent(xnm)}&xqm=${encodeURIComponent(xqm)}&kzlx=ck&xsdm=&kclbdm=&kclxdm=`;
   const text = await req(`${BASE}${COURSE_API_PATH}`, 'POST', body);
   return JSON.parse(text);
 }
 
-async function fetchTimeSlots(xnm, xqm) {
-  const body = `xnm=${encodeURIComponent(xnm)}&xqm=${encodeURIComponent(xqm)}`;
-  const text = await req(`${BASE}${TIME_API_PATH}`, 'POST', body);
-  return parseTimeSlots(JSON.parse(text));
-}
-
 async function run() {
   try {
     const { xnm, xqm } = await resolveTerm();
     AndroidBridge.showToast('正在解析课表数据...');
 
     const rawData = await fetchCourses(xnm, xqm);
-    const { courses, xqhId } = parseCourses(rawData);
+    const { courses } = parseCourses(rawData);
     if (!courses.length) throw new Error('未获取到课表数据');
-    const timeSlots = await fetchTimeSlots(xnm, xqm).catch(() => null);
 
     const allWeeks = courses.flatMap(course => course.weeks);
     const semesterTotalWeeks = allWeeks.length ? Math.max(...allWeeks) : 20;
@@ -196,9 +187,7 @@ async function run() {
       semesterStartDate: null,
       firstDayOfWeek: 1
     }));
-    if (timeSlots && timeSlots.length) {
-      await window.AndroidBridgePromise.savePresetTimeSlots(JSON.stringify(timeSlots));
-    }
+    await window.AndroidBridgePromise.savePresetTimeSlots(JSON.stringify(TIME_SLOTS));
     await window.AndroidBridgePromise.saveImportedCourses(JSON.stringify(courses));
 
     AndroidBridge.showToast(`导入成功:${courses.length} 门`);