├── Tjxk.js ├── images ├── common.png ├── console.png ├── gl1.png ├── gl2.png ├── myc.png ├── result.png ├── url1.png ├── xuanke.png ├── xuanke1.png ├── xuanke10.png ├── xuanke11.png ├── xuanke2.png ├── xuanke3.png ├── xuanke4.png ├── xuanke5.png ├── xuanke6.png ├── xuanke7.png ├── xuanke8.png └── xuanke9.png ├── main.js ├── readme.md └── rober.js /Tjxk.js: -------------------------------------------------------------------------------- 1 | function xkViewLoad_exe() { 2 | var arr = new Array(); 3 | xkrsMap = top.getJxbXkrs(); 4 | var xklcObj = top.xklcObjMap[top.xkLcbh], 5 | sfzyxk = top.xkszObjMap["XKSZ_SFQYZYXK"]; 6 | for (jxbid in xkJxbList) { 7 | var jxbObj = xkJxbList[jxbid], 8 | jgObj = top.xkJxbFilter(jxbObj), 9 | xkView = "", 10 | vXkzy = " "; 11 | 12 | //TODO: 13 | if (jxbObj.gljxbList.length == 0) { 14 | xkView = "
添加抢课事件
" 15 | } else { 16 | xkView = "
显示关联课表
" 17 | } 18 | // var xkView = "", 19 | //TODO: 20 | 21 | if (sfzyxk == "1") vXkzy = top.getXkzyView(jxbObj.jxbid, jxbObj.kcxzdm); 22 | if (eval(jgObj.isYx)) continue; 23 | var tYxkrs = (xkrsMap[jxbid] != null && xkrsMap[jxbid] != "") ? xkrsMap[jxbid] : 0, 24 | vXkrs = jxbObj.krl + "/" + tYxkrs; 25 | if (xklcObj.xkmsdm != "01" && parseInt(tYxkrs) >= parseInt(jxbObj.krl)) vXkrs = "\u5df2\u6ee1"; 26 | var vCtxx = ""; 27 | if (jgObj.ctMsg != null && jgObj.ctMsg != "") { 28 | jxbXkctList[jxbid] = jgObj.ctMsg; 29 | vCtxx = "\u51b2\u7a81" 30 | } 31 | var vSksj = "", 32 | vSkdd = ""; 33 | for (idx in jxbObj.pkxxList) { 34 | var pkxxObj = jxbObj.pkxxList[idx]; 35 | if (vSksj != "") vSksj += "
"; 36 | var jcxx = ""; 37 | if (pkxxObj.ksjcmc != null && pkxxObj.ksjcmc != "" && pkxxObj.jsjcmc != null && pkxxObj.jsjcmc != "") jcxx = pkxxObj.ksjcmc + "-" + pkxxObj.jsjcmc; 38 | var skxq = ""; 39 | if (pkxxObj.skxq != null && pkxxObj.skxq != "") skxq = top.xqObjMap[pkxxObj.skxq]; 40 | vSksj += skxq + " " + jcxx + " " + pkxxObj.zcmc; 41 | if (vSkdd != "") vSkdd += "
"; 42 | vSkdd += pkxxObj.jsmc 43 | } 44 | var data = new Array(); 45 | data[0] = jxbObj.jxbid; 46 | data[1] = jxbObj.kch; 47 | data[2] = jxbObj.kcm; 48 | data[3] = "" + jxbObj.kxh + ""; 49 | data[4] = (jxbObj.jxbmc == null || jxbObj.jxbmc == "") ? " " : jxbObj.jxbmc; 50 | data[5] = jxbObj.xs; 51 | data[6] = jxbObj.xf; 52 | data[7] = (jxbObj.jhxndm == null || jxbObj.jhxndm == "") ? " " : jxbObj.jhxndm; 53 | var jhxnmc = top.jhxnObjMap[jxbObj.jhxndm]; 54 | data[8] = (jhxnmc == null || jhxnmc == "") ? " " : jhxnmc; 55 | data[9] = (jxbObj.jhxqdm == null || jxbObj.jhxqdm == "") ? " " : jxbObj.jhxqdm; 56 | var jhxqmc = top.jhxqObjMap[jxbObj.jhxqdm]; 57 | data[10] = (jhxqmc == null || jhxqmc == "") ? " " : jhxqmc; 58 | data[11] = jxbObj.kclbdm; 59 | var kclbmc = top.kclbObjMap[jxbObj.kclbdm]; 60 | data[12] = (kclbmc == null || kclbmc == "") ? " " : kclbmc; 61 | data[13] = jxbObj.kcxzdm; 62 | var kcxzmc = top.kcxzObjMap[jxbObj.kcxzdm]; 63 | data[14] = (kcxzmc == null || kcxzmc == "") ? " " : kcxzmc; 64 | data[15] = jxbObj.kkdwdm; 65 | var kkdwmc = top.yxObjMap[jxbObj.kkdwdm]; 66 | data[16] = (kkdwmc == null || kkdwmc == "") ? " " : kkdwmc; 67 | data[17] = jxbObj.xaqh; 68 | var xaqhmc = top.xaqObjMap[jxbObj.xaqh]; 69 | data[18] = (xaqhmc == null || xaqhmc == "") ? " " : xaqhmc; 70 | data[19] = (top.strTrim(vSksj) == "") ? " " : vSksj; 71 | data[20] = (top.strTrim(vSkdd) == "") ? " " : vSkdd; 72 | var skjs = jxbObj.skjs; 73 | if (skjs != undefined) data[21] = skjs.length > 6 ? skjs.substring(0, 6) + "  ...." : (skjs + " "); 74 | else data[21] = " "; 75 | data[22] = " "; 76 | data[23] = vXkrs; 77 | data[24] = vXkzy; 78 | var vXksm = vCtxx; 79 | if (jxbObj.gljxbList != null && jxbObj.gljxbList != "" && (jxbObj.gljxbList).length > 0) { 80 | if (vXksm != "") vXksm += "
"; 81 | vXksm += "\u542b\u5173\u8054\u73ed" 82 | } 83 | if (jxbObj.xkwzsm != null && jxbObj.xkwzsm != "") { 84 | if (vXksm != "") vXksm += "
"; 85 | vXksm += "\u9009\u8bfe\u8bf4\u660e" 86 | } 87 | if (jxbObj.xxkc != null && jxbObj.xxkc != "") { 88 | if (vXksm != "") vXksm += "
"; 89 | vXksm += "\u5148\u4fee\u8bf4\u660e" 90 | } 91 | data[25] = (vXksm == "") ? " " : vXksm; 92 | data[26] = xkView; 93 | arr[arr.length] = data 94 | } 95 | createXkView("mainBody", arr, false) 96 | } 97 | xkViewLoad_exe() 98 | -------------------------------------------------------------------------------- /images/common.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xql799/SCUEC_AutoRobClass/04496f7198f81a4444303ce2d4236130d6e1d1c7/images/common.png -------------------------------------------------------------------------------- /images/console.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xql799/SCUEC_AutoRobClass/04496f7198f81a4444303ce2d4236130d6e1d1c7/images/console.png -------------------------------------------------------------------------------- /images/gl1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xql799/SCUEC_AutoRobClass/04496f7198f81a4444303ce2d4236130d6e1d1c7/images/gl1.png -------------------------------------------------------------------------------- /images/gl2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xql799/SCUEC_AutoRobClass/04496f7198f81a4444303ce2d4236130d6e1d1c7/images/gl2.png -------------------------------------------------------------------------------- /images/myc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xql799/SCUEC_AutoRobClass/04496f7198f81a4444303ce2d4236130d6e1d1c7/images/myc.png -------------------------------------------------------------------------------- /images/result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xql799/SCUEC_AutoRobClass/04496f7198f81a4444303ce2d4236130d6e1d1c7/images/result.png -------------------------------------------------------------------------------- /images/url1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xql799/SCUEC_AutoRobClass/04496f7198f81a4444303ce2d4236130d6e1d1c7/images/url1.png -------------------------------------------------------------------------------- /images/xuanke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xql799/SCUEC_AutoRobClass/04496f7198f81a4444303ce2d4236130d6e1d1c7/images/xuanke.png -------------------------------------------------------------------------------- /images/xuanke1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xql799/SCUEC_AutoRobClass/04496f7198f81a4444303ce2d4236130d6e1d1c7/images/xuanke1.png -------------------------------------------------------------------------------- /images/xuanke10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xql799/SCUEC_AutoRobClass/04496f7198f81a4444303ce2d4236130d6e1d1c7/images/xuanke10.png -------------------------------------------------------------------------------- /images/xuanke11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xql799/SCUEC_AutoRobClass/04496f7198f81a4444303ce2d4236130d6e1d1c7/images/xuanke11.png -------------------------------------------------------------------------------- /images/xuanke2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xql799/SCUEC_AutoRobClass/04496f7198f81a4444303ce2d4236130d6e1d1c7/images/xuanke2.png -------------------------------------------------------------------------------- /images/xuanke3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xql799/SCUEC_AutoRobClass/04496f7198f81a4444303ce2d4236130d6e1d1c7/images/xuanke3.png -------------------------------------------------------------------------------- /images/xuanke4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xql799/SCUEC_AutoRobClass/04496f7198f81a4444303ce2d4236130d6e1d1c7/images/xuanke4.png -------------------------------------------------------------------------------- /images/xuanke5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xql799/SCUEC_AutoRobClass/04496f7198f81a4444303ce2d4236130d6e1d1c7/images/xuanke5.png -------------------------------------------------------------------------------- /images/xuanke6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xql799/SCUEC_AutoRobClass/04496f7198f81a4444303ce2d4236130d6e1d1c7/images/xuanke6.png -------------------------------------------------------------------------------- /images/xuanke7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xql799/SCUEC_AutoRobClass/04496f7198f81a4444303ce2d4236130d6e1d1c7/images/xuanke7.png -------------------------------------------------------------------------------- /images/xuanke8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xql799/SCUEC_AutoRobClass/04496f7198f81a4444303ce2d4236130d6e1d1c7/images/xuanke8.png -------------------------------------------------------------------------------- /images/xuanke9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xql799/SCUEC_AutoRobClass/04496f7198f81a4444303ce2d4236130d6e1d1c7/images/xuanke9.png -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | function getGljxbData(zJxbid) { 2 | var datas = eval("(" + $.ajax({ 3 | url: "loadData.xk?method=getGljxb", 4 | data: { 5 | jxbid: zJxbid 6 | }, 7 | async: false 8 | }).responseText + ")"); 9 | if (datas == null || datas == "") return ""; 10 | var xklcObj = top.xklcObjMap[top.xkLcbh], 11 | arr = new Array(); 12 | for (var seq = 0; seq < datas.length; seq++) { 13 | var ysbObj = datas[seq]; 14 | createGljxbList(ysbObj); 15 | var pkxxList = $.parseJSON(ysbObj.pkxx), 16 | sksjTxt = "", 17 | skddTxt = ""; 18 | for (var yxIndex in pkxxList) { 19 | var pkxxObj = pkxxList[yxIndex]; 20 | if (sksjTxt != "") sksjTxt += "
"; 21 | if (pkxxObj.skxq != null && pkxxObj.skxq != "" && pkxxObj.ksjc != null && pkxxObj.ksjc != "" && pkxxObj.jsjc != null && pkxxObj.jsjc != "") sksjTxt += top.xqObjMap[pkxxObj.skxq] + " " + top.jcObjMap[pkxxObj.ksjc].jcmc + "-" + top.jcObjMap[pkxxObj.jsjc].jcmc + " " + " " + pkxxObj.zcmc + " "; 22 | if (skddTxt != "") skddTxt += "
"; 23 | skddTxt += pkxxObj.jsmc 24 | } 25 | if (sksjTxt == "") sksjTxt = " "; 26 | if (skddTxt == "") skddTxt = " "; 27 | var vXkrs = ysbObj.krl + "/" + ysbObj.xkrs; 28 | if (xklcObj.xkmsdm != "01" && parseInt(ysbObj.xkrs) >= parseInt(ysbObj.krl)) vXkrs = "\u5df2\u6ee1"; 29 | var vCtxx = "", 30 | ctMsg = getConflictMsg(ysbObj); 31 | if (ctMsg != null && ctMsg != "") { 32 | glJxbXkctList[ysbObj.jxbid] = ctMsg; 33 | vCtxx = "\u51b2\u7a81\uff1a" + "\u67e5\u770b" 34 | } 35 | var vXksm = vCtxx; 36 | if (ysbObj.sfxzxb == "1") { 37 | if (vXksm != "") vXksm += "
"; 38 | vXksm += "\u9650\u5236\u9009\u8bfe\uff1a\u7537" + ysbObj.nsrs + "\u4eba\uff0c\u5973" + ysbObj.nvsrs + "\u4eba" 39 | } 40 | if (ysbObj.xxkc != null && ysbObj.xxkc != "") { 41 | if (vXksm != "") vXksm += "
"; 42 | vXksm += "\u8981\u6c42\uff1a\u9700\u5148\u4fee\u8bfb[" + ysbObj.xxkc + "]\u8bfe\u7a0b" 43 | } 44 | if (ysbObj.xkwzsm != null && ysbObj.xkwzsm != "") { 45 | if (vXksm != "") vXksm += "
"; 46 | vXksm += "\u8bf4\u660e\uff1a" + ysbObj.xkwzsm 47 | } 48 | var data = new Array(); 49 | data[0] = ysbObj.jxbid; 50 | data[1] = ysbObj.kch; 51 | data[2] = ysbObj.kcm; 52 | data[3] = ysbObj.kxh; 53 | data[4] = ysbObj.xs; 54 | data[5] = ysbObj.xf; 55 | data[6] = ysbObj.xaqh; 56 | data[7] = ysbObj.kkdwdm; 57 | var kkdwmc = top.yxObjMap[ysbObj.kkdwdm]; 58 | data[8] = (kkdwmc == null || kkdwmc == "") ? " " : kkdwmc; 59 | data[9] = (top.strTrim(sksjTxt) == "") ? " " : sksjTxt; 60 | data[10] = (top.strTrim(skddTxt) == "") ? " " : skddTxt; 61 | data[11] = ysbObj.skjs == null ? " " : ysbObj.skjs; 62 | data[12] = vXkrs; 63 | data[13] = (vXksm == "") ? " " : vXksm; 64 | //data[14] = ""; 65 | data[14] = xkView = "
添加抢课事件
" 66 | arr[arr.length] = data 67 | } 68 | return arr 69 | } 70 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # 游览器控制台实现自动抢课 2 | 通过Chrome,Microsoft Edge游览器的DevTools实现SCUEC选课系统的自动抢课 3 | 4 | 为了减少错误,建议大家看看选课的大概原理 5 | ## 选课原理大概 6 | ![选课](https://img-blog.csdnimg.cn/20210228011934128.png) 7 | 8 | ## 自动抢课的实现原理 9 | 选课的最重要的一步是**向选课系统发送特定的请求** 10 | 每次点击"选课"按钮并确定后便会发送一次选课请求 11 | 12 | 发送特定的请求可以理解为访问**特定的地址**,如下图: 13 | ![选课成功](https://img-blog.csdnimg.cn/20210227225441989.png) 14 | ![选课失败](https://img-blog.csdnimg.cn/20210227225547523.png) 15 | 因此可通过下段JS代码实现自动抢课(courseList按照格式里更改为自己的课程) 16 | 17 | ``` 18 | //以下按照格式补充自己的课程 19 | coursesList = [ 20 | { 21 | "name": "英语国家社会与文化", //自行填写课程 22 | "url": "http://xk.scuec.edu.cn/xsxk/xkOper.xk?method=handleTjxk&jxbid=2020-2021-220W10000151805&glJxbid=" //下文有介绍地址如何获取 23 | }, 24 | { 25 | "name": "学术英语阅读与写作", 26 | "url": "http://xk.scuec.edu.cn/xsxk/xkOper.xk?method=handleTjxk&jxbid=2020-2021-220W10000101803&glJxbid=" 27 | } 28 | ] 29 | 30 | //定义抢课函数 31 | function rob() { 32 | //解析课程 33 | courses = new Array(coursesList.length) 34 | for (let index in coursesList) { 35 | courses[index] = { 36 | 'name' : coursesList[index].name, 37 | 'url' : coursesList[index].url, 38 | 'request' : new XMLHttpRequest(), 39 | 'robEvent': null 40 | } 41 | } 42 | 43 | //注册抢课事件 44 | for (let index in courses) { 45 | courses.robEvent = setInterval( 46 | function () { 47 | courses 48 | courses[index].request.open("GET", courses[index].url, true) 49 | courses[index].request.send() 50 | courses[index].request.onreadystatechange = function() { 51 | if (courses[index].request.readyState == 4 && courses[index].request.status == 200) { 52 | console.log(courses[index].name + courses[index].request.responseText) 53 | if(courses[index].request.responseText.success = 'True') { 54 | clearInterval(courses[index].robEvent); //取消抢课事件 55 | } 56 | } 57 | } 58 | }, 59 | 1000 //此处为每一门选课的选课周期 4000为4s 60 | ) 61 | } 62 | return '开始执行抢课' 63 | } 64 | ``` 65 | 66 | ### 脚本的执行 67 | **登陆选课之后**在任意的页面按下F12打开DevTools **(注意游览器关闭后需要重新登陆选课系统)** 68 | ![DevTools内执行代码](https://img-blog.csdnimg.cn/20210227231651418.png) 69 | 70 | 下图为效果图: 71 | 72 | ![效果图](https://img-blog.csdnimg.cn/20210227233712876.png) 73 | 74 | ## 请求地址的获取 75 | 76 | 先分析一下**推荐选课**的请求地址,例如 77 | 78 | > http://xk.scuec.edu.cn/xsxk/xkOper.xk?method=handleTjxk&jxbid=20202021221110001461804&glJxbid= 79 | 80 | 可拆解为以下几个部分 81 | 82 | - *http:///xk.scuec.edu.cn/xsxk/xkOper.xk* 83 | - *method=**handleTjxk*** 84 | - *jxbid=**20202021221110001461804*** 85 | - *glJxbid=* 86 | 87 | 改为自己需要的 **method** 和 **jxbid** 便可拼接出需要的请求地址 88 | 89 | 下图为可能出现的 **method(方法)** 和 **jxbid之类的参数** 90 | |method|对应选课|所需参数| 91 | |---|----|----| 92 | |handleTjxk|推荐选课|jxbid glJxbid| 93 | |handleBfakc|方案内选课|jxbid glJxbid| 94 | |handleKzyxk|方案外选课|jxbid glJxbid| 95 | |handleCxxk|重修选课|jxbid glJxbid| 96 | |handleTykxk(暂未测试)|体育选择选课|jxbid(暂未测试)| 97 | |handleQxgxk|通识课程选修|jxbid glJxbid xkzy (**注意:补选时不需要xkzy**)| 98 | |handleCxcy|创新创业类选课|jxbid| 99 | 100 | 下图为出现的参数代表的意义 101 | |参数名|意义|备注| 102 | |---|----|----| 103 | |jxbid|教学班ID|每个课程都有一个ID| 104 | |glJxbid|关联教学班ID|若非关联班则值为'空'| 105 | |xkzy|志愿等级|*这个应该用不上*| 106 | 107 | ### jxbid 的获取 108 | ![jxbid1](https://img-blog.csdnimg.cn/20210228004616359.png) 109 | ![jxbid2](https://img-blog.csdnimg.cn/20210228004616292.png) 110 | 111 | ### glJxbid 的获取 112 | 113 | #### 方法① 114 | 115 | **适用于在选课未开始时,提前查看关联课信息** 116 | 117 | 分析一下 **获取关联课表格** 时的请求 118 | > http://xk.scuec.edu.cn/xsxk/loadData.xk?method=getGljxb&jxbid=20202021220610003861801 119 | 120 | - *http:///xk.scuec.edu.cn/xsxk/loadData.xk* 121 | - *method=**getGljxb*** 122 | - *jxbid=**20202021220610003861801*** 123 | 124 | 将jxbid改换后,访问地址可以获取关联班信息,如图: 125 | 126 | ![glJxbid](https://img-blog.csdnimg.cn/20210228004616139.png) 127 | 128 | **重要的数据:** 129 | 130 | ![glJxbid](https://img-blog.csdnimg.cn/20210228005816447.png) 131 | 132 | **实际图关联课表对比** 133 | 134 | ![glJxbid](https://img-blog.csdnimg.cn/20210228005816358.png) 135 | 136 | #### 方法② 137 | 138 | **类似jxbid的获取,但一般用不上** 139 | 140 | ![glJxbid](https://img-blog.csdnimg.cn/20210228010844528.png) 141 | 142 | 143 | 144 | ### 检验自己写的请求地址是否正确的方法 145 | ![check](https://img-blog.csdnimg.cn/20210228011436953.png) 146 | 147 | **PS:选课开始之前可以通过这个方法检验URL是否正确** 148 | 149 | 150 | ### 最后 151 | 152 | 希望大家能选上最想要的课 153 | 154 | 有问题欢迎来联系我 155 | 156 | 157 | -------------------------------------------------------------------------------- /rober.js: -------------------------------------------------------------------------------- 1 | var timer = 200; 2 | box = window.frames[0]; 3 | Tjxk = window.frames[0][0]; 4 | xkJxbList = Tjxk.xkJxbList; 5 | var robConsole = $(`
`); 6 | $("body").append(robConsole); 7 | $("#robConsole").css({ 8 | "margin-top": "10px", 9 | "display": "flex", 10 | "flex-direction": "column", 11 | "font-size": "8px", 12 | "position": "fixed", 13 | "top": "0", 14 | "left": "0", 15 | "width": "560px" 16 | }); 17 | 18 | function addRob(jxbid, glJxbid) { 19 | var JxbObj = top.xkJxbList[jxbid]; 20 | //判断是否有关联班 21 | if ("undefined" == typeof glJxbid) { 22 | //判断是否注册抢课事件 23 | if ("undefined" == typeof JxbObj.robEvent) { 24 | 25 | //robInfo——显示的信息 26 | JxbObj.robInfo = $("
"); 27 | JxbObj.robInfo.css({ 28 | "margin": "10px", 29 | "color": "red", 30 | "border": "1px solid", 31 | "width": "560px", 32 | "background-color": "black" 33 | }); 34 | JxbObj.robInfo.click(function () { 35 | clearInterval(JxbObj.robEvent); 36 | JxbObj.robEvent = undefined; 37 | JxbObj.robInfo.remove(); 38 | }) 39 | robConsole.append(JxbObj.robInfo); 40 | 41 | //robEvent——抢课事件 42 | JxbObj.robEvent = setInterval(() => { 43 | $.ajax({ 44 | type: "POST", 45 | url: "http://xk.scuec.edu.cn/xsxk/xkOper.xk", 46 | async: true, // 异步请求 47 | data: { 48 | method: 'handleTjxk', 49 | jxbid: jxbid, 50 | glJxbid: glJxbid 51 | }, 52 | datatype: "json", 53 | success: function (data) { 54 | //TODO:更多信息 55 | JxbObj.robInfo[0].innerText = "课程号:" + JxbObj.jxbid + "课程名:" + JxbObj.kcm + "抢课结果:" + data; 56 | } 57 | }) 58 | }, timer) 59 | } 60 | //没有关联班的情况 61 | } else { 62 | if ("undefined" == typeof JxbObj.robEvents) { 63 | JxbObj.robEvents = []; 64 | JxbObj.robInfos = []; 65 | } 66 | 67 | //未注册抢课则开始注册 68 | if ("undefined" == typeof JxbObj.robEvents[glJxbid]) { 69 | 70 | //robInfo——显示的信息 71 | JxbObj.robInfos[glJxbid] = $("
"); 72 | JxbObj.robInfos[glJxbid].css({ 73 | "margin": "10px", 74 | "color": "red", 75 | "border": "1px solid", 76 | "width": "560px", 77 | "background-color": "black" 78 | }); 79 | JxbObj.robInfos[glJxbid].click(function () { 80 | clearInterval(JxbObj.robEvent); 81 | JxbObj.robEvent = undefined; 82 | JxbObj.robInfo.remove(); 83 | }) 84 | robConsole.append(JxbObj.robInfos[glJxbid]); 85 | 86 | //robEvent——抢课事件 87 | JxbObj.robEvents[glJxbid] = setInterval(() => { 88 | $.ajax({ 89 | type: "POST", 90 | url: "http://xk.scuec.edu.cn/xsxk/xkOper.xk", 91 | async: true, // 异步请求 92 | data: { 93 | method: 'handleTjxk', 94 | jxbid: jxbid, 95 | glJxbid: glJxbid 96 | }, 97 | datatype: "json", 98 | success: function (data) { 99 | //TODO:更多信息 100 | JxbObj.robInfos[glJxbid][0].innerText = "课程号:" + JxbObj.jxbid + "课程名:" + JxbObj.kcm + "抢课结果:" + data; 101 | } 102 | }) 103 | }, timer) 104 | } 105 | } 106 | } 107 | 108 | box.getGljxbData = function (zJxbid) { 109 | var datas = eval("(" + $.ajax({ 110 | url: "loadData.xk?method=getGljxb", 111 | data: { 112 | jxbid: zJxbid 113 | }, 114 | async: false 115 | }).responseText + ")"); 116 | if (datas == null || datas == "") return ""; 117 | var xklcObj = top.xklcObjMap[top.xkLcbh], 118 | arr = new Array(); 119 | for (var seq = 0; seq < datas.length; seq++) { 120 | var ysbObj = datas[seq]; 121 | box.createGljxbList(ysbObj); 122 | var pkxxList = $.parseJSON(ysbObj.pkxx), 123 | sksjTxt = "", 124 | skddTxt = ""; 125 | for (var yxIndex in pkxxList) { 126 | var pkxxObj = pkxxList[yxIndex]; 127 | if (sksjTxt != "") sksjTxt += "
"; 128 | if (pkxxObj.skxq != null && pkxxObj.skxq != "" && pkxxObj.ksjc != null && pkxxObj.ksjc != "" && pkxxObj.jsjc != null && pkxxObj.jsjc != "") sksjTxt += top.xqObjMap[pkxxObj.skxq] + " " + top.jcObjMap[pkxxObj.ksjc].jcmc + "-" + top.jcObjMap[pkxxObj.jsjc].jcmc + " " + " " + pkxxObj.zcmc + " "; 129 | if (skddTxt != "") skddTxt += "
"; 130 | skddTxt += pkxxObj.jsmc 131 | } 132 | if (sksjTxt == "") sksjTxt = " "; 133 | if (skddTxt == "") skddTxt = " "; 134 | var vXkrs = ysbObj.krl + "/" + ysbObj.xkrs; 135 | if (xklcObj.xkmsdm != "01" && parseInt(ysbObj.xkrs) >= parseInt(ysbObj.krl)) vXkrs = "\u5df2\u6ee1"; 136 | var vCtxx = "", 137 | ctMsg = box.getConflictMsg(ysbObj); 138 | if (ctMsg != null && ctMsg != "") { 139 | box.glJxbXkctList[ysbObj.jxbid] = ctMsg; 140 | vCtxx = "\u51b2\u7a81\uff1a" + "\u67e5\u770b" 141 | } 142 | var vXksm = vCtxx; 143 | if (ysbObj.sfxzxb == "1") { 144 | if (vXksm != "") vXksm += "
"; 145 | vXksm += "\u9650\u5236\u9009\u8bfe\uff1a\u7537" + ysbObj.nsrs + "\u4eba\uff0c\u5973" + ysbObj.nvsrs + "\u4eba" 146 | } 147 | if (ysbObj.xxkc != null && ysbObj.xxkc != "") { 148 | if (vXksm != "") vXksm += "
"; 149 | vXksm += "\u8981\u6c42\uff1a\u9700\u5148\u4fee\u8bfb[" + ysbObj.xxkc + "]\u8bfe\u7a0b" 150 | } 151 | if (ysbObj.xkwzsm != null && ysbObj.xkwzsm != "") { 152 | if (vXksm != "") vXksm += "
"; 153 | vXksm += "\u8bf4\u660e\uff1a" + ysbObj.xkwzsm 154 | } 155 | var data = new Array(); 156 | data[0] = ysbObj.jxbid; 157 | data[1] = ysbObj.kch; 158 | data[2] = ysbObj.kcm; 159 | data[3] = ysbObj.kxh; 160 | data[4] = ysbObj.xs; 161 | data[5] = ysbObj.xf; 162 | data[6] = ysbObj.xaqh; 163 | data[7] = ysbObj.kkdwdm; 164 | var kkdwmc = top.yxObjMap[ysbObj.kkdwdm]; 165 | data[8] = (kkdwmc == null || kkdwmc == "") ? " " : kkdwmc; 166 | data[9] = (top.strTrim(sksjTxt) == "") ? " " : sksjTxt; 167 | data[10] = (top.strTrim(skddTxt) == "") ? " " : skddTxt; 168 | data[11] = ysbObj.skjs == null ? " " : ysbObj.skjs; 169 | data[12] = vXkrs; 170 | data[13] = (vXksm == "") ? " " : vXksm; 171 | //data[14] = ""; 172 | data[14] = xkView = "
添加抢课事件
" 173 | arr[arr.length] = data 174 | } 175 | return arr 176 | } 177 | 178 | Tjxk.xkViewLoad_exe = function () { 179 | var arr = new Array(); 180 | xkrsMap = top.getJxbXkrs(); 181 | var xklcObj = top.xklcObjMap[top.xkLcbh], 182 | sfzyxk = top.xkszObjMap["XKSZ_SFQYZYXK"]; 183 | for (jxbid in xkJxbList) { 184 | var jxbObj = xkJxbList[jxbid], 185 | jgObj = top.xkJxbFilter(jxbObj), 186 | xkView = "", 187 | vXkzy = " "; 188 | 189 | //TODO: 190 | if (jxbObj.gljxbList.length == 0) { 191 | xkView = "
添加抢课事件
" 192 | } else { 193 | xkView = "
显示关联课表
" 194 | } 195 | // var xkView = "", 196 | //TODO: 197 | 198 | if (sfzyxk == "1") vXkzy = top.getXkzyView(jxbObj.jxbid, jxbObj.kcxzdm); 199 | if (eval(jgObj.isYx)) continue; 200 | var tYxkrs = (xkrsMap[jxbid] != null && xkrsMap[jxbid] != "") ? xkrsMap[jxbid] : 0, 201 | vXkrs = jxbObj.krl + "/" + tYxkrs; 202 | if (xklcObj.xkmsdm != "01" && parseInt(tYxkrs) >= parseInt(jxbObj.krl)) vXkrs = "\u5df2\u6ee1"; 203 | var vCtxx = ""; 204 | if (jgObj.ctMsg != null && jgObj.ctMsg != "") { 205 | this.jxbXkctList[jxbid] = jgObj.ctMsg; 206 | vCtxx = "\u51b2\u7a81" 207 | } 208 | var vSksj = "", 209 | vSkdd = ""; 210 | for (idx in jxbObj.pkxxList) { 211 | var pkxxObj = jxbObj.pkxxList[idx]; 212 | if (vSksj != "") vSksj += "
"; 213 | var jcxx = ""; 214 | if (pkxxObj.ksjcmc != null && pkxxObj.ksjcmc != "" && pkxxObj.jsjcmc != null && pkxxObj.jsjcmc != "") jcxx = pkxxObj.ksjcmc + "-" + pkxxObj.jsjcmc; 215 | var skxq = ""; 216 | if (pkxxObj.skxq != null && pkxxObj.skxq != "") skxq = top.xqObjMap[pkxxObj.skxq]; 217 | vSksj += skxq + " " + jcxx + " " + pkxxObj.zcmc; 218 | if (vSkdd != "") vSkdd += "
"; 219 | vSkdd += pkxxObj.jsmc 220 | } 221 | var data = new Array(); 222 | data[0] = jxbObj.jxbid; 223 | data[1] = jxbObj.kch; 224 | data[2] = jxbObj.kcm; 225 | data[3] = "" + jxbObj.kxh + ""; 226 | data[4] = (jxbObj.jxbmc == null || jxbObj.jxbmc == "") ? " " : jxbObj.jxbmc; 227 | data[5] = jxbObj.xs; 228 | data[6] = jxbObj.xf; 229 | data[7] = (jxbObj.jhxndm == null || jxbObj.jhxndm == "") ? " " : jxbObj.jhxndm; 230 | var jhxnmc = top.jhxnObjMap[jxbObj.jhxndm]; 231 | data[8] = (jhxnmc == null || jhxnmc == "") ? " " : jhxnmc; 232 | data[9] = (jxbObj.jhxqdm == null || jxbObj.jhxqdm == "") ? " " : jxbObj.jhxqdm; 233 | var jhxqmc = top.jhxqObjMap[jxbObj.jhxqdm]; 234 | data[10] = (jhxqmc == null || jhxqmc == "") ? " " : jhxqmc; 235 | data[11] = jxbObj.kclbdm; 236 | var kclbmc = top.kclbObjMap[jxbObj.kclbdm]; 237 | data[12] = (kclbmc == null || kclbmc == "") ? " " : kclbmc; 238 | data[13] = jxbObj.kcxzdm; 239 | var kcxzmc = top.kcxzObjMap[jxbObj.kcxzdm]; 240 | data[14] = (kcxzmc == null || kcxzmc == "") ? " " : kcxzmc; 241 | data[15] = jxbObj.kkdwdm; 242 | var kkdwmc = top.yxObjMap[jxbObj.kkdwdm]; 243 | data[16] = (kkdwmc == null || kkdwmc == "") ? " " : kkdwmc; 244 | data[17] = jxbObj.xaqh; 245 | var xaqhmc = top.xaqObjMap[jxbObj.xaqh]; 246 | data[18] = (xaqhmc == null || xaqhmc == "") ? " " : xaqhmc; 247 | data[19] = (top.strTrim(vSksj) == "") ? " " : vSksj; 248 | data[20] = (top.strTrim(vSkdd) == "") ? " " : vSkdd; 249 | var skjs = jxbObj.skjs; 250 | if (skjs != undefined) data[21] = skjs.length > 6 ? skjs.substring(0, 6) + "  ...." : (skjs + " "); 251 | else data[21] = " "; 252 | data[22] = " "; 253 | data[23] = vXkrs; 254 | data[24] = vXkzy; 255 | var vXksm = vCtxx; 256 | if (jxbObj.gljxbList != null && jxbObj.gljxbList != "" && (jxbObj.gljxbList).length > 0) { 257 | if (vXksm != "") vXksm += "
"; 258 | vXksm += "\u542b\u5173\u8054\u73ed" 259 | } 260 | if (jxbObj.xkwzsm != null && jxbObj.xkwzsm != "") { 261 | if (vXksm != "") vXksm += "
"; 262 | vXksm += "\u9009\u8bfe\u8bf4\u660e" 263 | } 264 | if (jxbObj.xxkc != null && jxbObj.xxkc != "") { 265 | if (vXksm != "") vXksm += "
"; 266 | vXksm += "\u5148\u4fee\u8bf4\u660e" 267 | } 268 | data[25] = (vXksm == "") ? " " : vXksm; 269 | data[26] = xkView; 270 | arr[arr.length] = data 271 | } 272 | this.createXkView("mainBody", arr, false) 273 | } 274 | 275 | Tjxk.xkViewLoad_exe() 276 | --------------------------------------------------------------------------------