uzz_01.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. const UZZ_BASE_URL = window.location.origin;
  2. function parseWeeks(weekStr) {
  3. if (!weekStr) return [];
  4. const segments = weekStr.split(',');
  5. let weeks = [];
  6. const segmentRegex = /(\d+)(?:-(\d+))?\s*周?(\([单双]\))?/g;
  7. for (const segment of segments) {
  8. segmentRegex.lastIndex = 0;
  9. let match;
  10. while ((match = segmentRegex.exec(segment)) !== null) {
  11. const start = parseInt(match[1]);
  12. const end = match[2] ? parseInt(match[2]) : start;
  13. const flagStr = match[3] || '';
  14. let flag = 0;
  15. if (flagStr.includes('单')) flag = 1;
  16. else if (flagStr.includes('双')) flag = 2;
  17. for (let i = start; i <= end; i++) {
  18. if (flag === 1 && i % 2 !== 1) continue;
  19. if (flag === 2 && i % 2 !== 0) continue;
  20. if (!weeks.includes(i)) weeks.push(i);
  21. }
  22. }
  23. }
  24. return weeks.sort((a, b) => a - b);
  25. }
  26. function parseJsonData(jsonData) {
  27. if (!jsonData || !Array.isArray(jsonData.kbList)) return [];
  28. const finalCourseList = [];
  29. for (const item of jsonData.kbList) {
  30. const weeks = parseWeeks(item.zcd);
  31. const sectionParts = item.jcs.split('-');
  32. const startSection = parseInt(sectionParts[0]);
  33. const endSection = parseInt(sectionParts[sectionParts.length - 1]);
  34. const day = parseInt(item.xqj);
  35. if (weeks.length > 0 && !isNaN(day)) {
  36. finalCourseList.push({
  37. name: item.kcmc.trim(),
  38. teacher: item.xm ? item.xm.trim() : "未知",
  39. position: item.cdmc ? item.cdmc.trim() : "未知",
  40. day: day,
  41. startSection: startSection,
  42. endSection: endSection,
  43. weeks: weeks
  44. });
  45. }
  46. }
  47. return finalCourseList;
  48. }
  49. const TimeSlots = [
  50. { number: 1, startTime: "08:00", endTime: "08:50" },
  51. { number: 2, startTime: "08:50", endTime: "09:40" },
  52. { number: 3, startTime: "10:10", endTime: "11:00" },
  53. { number: 4, startTime: "11:00", endTime: "11:50" },
  54. { number: 5, startTime: "14:30", endTime: "15:20" },
  55. { number: 6, startTime: "15:20", endTime: "16:10" },
  56. { number: 7, startTime: "16:40", endTime: "17:30" },
  57. { number: 8, startTime: "17:30", endTime: "18:20" },
  58. { number: 9, startTime: "19:30", endTime: "20:20" },
  59. { number: 10, startTime: "20:20", endTime: "21:10" }
  60. ];
  61. async function runImportFlow() {
  62. const $ = window.jQuery;
  63. // 强拦截:由于正方系统的 gnmkdm 模块会话校验,必须要求用户在课表页面才能请求 API
  64. if (!$ || !$('#xnm').length || !$('#xqm').length) {
  65. await window.AndroidBridgePromise.showAlert(
  66. "导入提示",
  67. "正方教务系统限制:请务必先点击进入【正方教务管理系统】->【个人课表查询】页面后,再点击一键导入!",
  68. "我知道了"
  69. );
  70. return;
  71. }
  72. AndroidBridge.showToast("正在获取当前页面课表数据...");
  73. // 直接静默提取页面上已经选好的学年和学期
  74. const xnm = $('#xnm').val();
  75. const xqm = $('#xqm').val();
  76. try {
  77. const apiUrl = `${UZZ_BASE_URL}/jwglxt/kbcx/xskbcx_cxXsgrkb.html?gnmkdm=N2151`;
  78. const body = `xnm=${xnm}&xqm=${xqm}&kzlx=ck&xsdm=&kclbdm=`;
  79. const response = await fetch(apiUrl, {
  80. method: 'POST',
  81. headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' },
  82. body: body
  83. });
  84. const json = await response.json();
  85. const courses = parseJsonData(json);
  86. if (courses.length === 0) {
  87. await window.AndroidBridgePromise.showAlert("导入失败", "该学年学期未找到课程数据,请确认页面上显示的课表是否为空。", "确定");
  88. return;
  89. }
  90. await window.AndroidBridgePromise.saveImportedCourses(JSON.stringify(courses));
  91. await window.AndroidBridgePromise.savePresetTimeSlots(JSON.stringify(TimeSlots));
  92. AndroidBridge.showToast(`成功导入 ${courses.length} 门课程!`);
  93. AndroidBridge.notifyTaskCompletion();
  94. } catch (e) {
  95. await window.AndroidBridgePromise.showAlert("导入失败", "接口请求异常,请确认教务系统网络通畅。", "确定");
  96. console.error(e);
  97. }
  98. }
  99. runImportFlow();