├── logo_new.png ├── logo_new_128.png ├── assets └── contributing-qrcode.png ├── content_script ├── library │ ├── jquery-ui-1.12.0.structure.css │ └── jquery-ui-1.12.0.min.js ├── page │ ├── login.js │ ├── gpa.js │ ├── eduction_list.js │ ├── index.js │ ├── core_course.js │ ├── score.js │ ├── eval.js │ ├── frame.js │ ├── nhce.js │ └── lesson.js ├── data │ ├── score_map.js │ └── lesson_data.js ├── patch │ └── DOMElementPatch.js └── core │ ├── option.js │ └── load.js ├── .gitignore ├── recommend.json ├── background └── main.html ├── README.md ├── popup └── popup.html ├── manifest.json ├── CHANGELOG ├── library ├── electsys.js └── option.js └── option └── option.html /logo_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laohyx/electsys/HEAD/logo_new.png -------------------------------------------------------------------------------- /logo_new_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laohyx/electsys/HEAD/logo_new_128.png -------------------------------------------------------------------------------- /assets/contributing-qrcode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laohyx/electsys/HEAD/assets/contributing-qrcode.png -------------------------------------------------------------------------------- /content_script/library/jquery-ui-1.12.0.structure.css: -------------------------------------------------------------------------------- 1 | .ui-draggable-handle { 2 | -ms-touch-action: none; 3 | touch-action: none; 4 | } 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # http://www.gnu.org/software/automake 2 | 3 | Makefile.in 4 | 5 | *.zip 6 | 7 | # http://www.gnu.org/software/autoconf 8 | 9 | /autom4te.cache 10 | /aclocal.m4 11 | /compile 12 | /configure 13 | /depcomp 14 | /install-sh 15 | /missing 16 | .idea/electsys-master.iml 17 | .idea/vcs.xml 18 | .idea/modules.xml 19 | .idea/workspace.xml 20 | -------------------------------------------------------------------------------- /recommend.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 2, 3 | "start_time": "2017-04-10 00:00:00", 4 | "end_time": "2017-04-17 00:00:00", 5 | "content": "选课插件
贡献指南
", 6 | "image": "https://raw.githubusercontent.com/laohyx/electsys/master/assets/contributing-qrcode.png", 7 | "url": "https://github.com/laohyx/electsys/issues/28" 8 | } -------------------------------------------------------------------------------- /background/main.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /content_script/page/login.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Electsys++ Project 3 | * ---------------------------- 4 | * 登录优化模块 5 | */ 6 | 7 | function set_index_page(){ 8 | return; 9 | jQuery("tr[align=center]").slice(3,4).html('
'); 10 | if(option.get("uid", "").length > 3) 11 | jQuery("#save_account").attr("checked","1"); 12 | jQuery("#Button1").click(function(){ 13 | check_submit(); 14 | }); 15 | 16 | 17 | return; 18 | } 19 | 20 | 21 | function check_submit(){ 22 | if(jQuery("#save_account").attr("checked")){ 23 | option.set("uid", jQuery("#txtUserName").val()); 24 | option.set("password", jQuery("#txtPwd").val()); 25 | }else{ 26 | 27 | } 28 | this.form.submit(); 29 | 30 | 31 | } 32 | -------------------------------------------------------------------------------- /content_script/data/score_map.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Electsys++ Project 3 | * ---------------------------- 4 | * 成绩 / GPA 转换 5 | */ 6 | 7 | function score_fix(score, fix_pass) { 8 | // 对于 P 的处理待改进 9 | switch (score) { 10 | case "成绩": return "绩点"; 11 | case "A+": return 95; 12 | case "A": return 90; 13 | case "A-": return 85; 14 | case "B+": return 80; 15 | case "B": return 75; 16 | case "B-": return 70; 17 | case "C+": return 67; 18 | case "C": return 65; 19 | case "C-": return 63; 20 | case "D": return 60; 21 | case "F": return 0; 22 | case "通过": return (fix_pass ? 85 : score); 23 | default: return score; 24 | } 25 | } 26 | 27 | function score2gpa(score) { 28 | if (score >= 0) { 29 | if (score >= 95) return 4.30; 30 | if (score >= 90) return 4.00; 31 | if (score >= 85) return 3.70; 32 | if (score >= 80) return 3.30; 33 | if (score >= 75) return 3.00; 34 | if (score >= 70) return 2.70; 35 | if (score >= 67) return 2.30; 36 | if (score >= 65) return 2.00; 37 | if (score >= 63) return 1.70; 38 | if (score >= 60) return 1.00; 39 | return 0.00; 40 | } 41 | return score; 42 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Electsys++ 2 | 3 | [![Chrome Web Store](https://img.shields.io/chrome-web-store/d/ilmpacenmcgknoogkhpigakpoocpjmpl.svg)](https://chrome.google.com/webstore/detail/electsys%20%20-%E4%BA%A4%E5%A4%A7%E9%80%89%E8%AF%BE%E6%8F%92%E4%BB%B6/ilmpacenmcgknoogkhpigakpoocpjmpl) 4 | 5 | Electsys++ SJTU electsys optimizer. 6 | 上海交通大学本科教学信息服务网优化插件。 7 | 8 | 本着交流学习、方便同学的目的将此插件建设为**开源项目**!本项目遵循 GPL v3 协议,欢迎各位同学参与贡献!您可以提交[问题反馈](https://github.com/laohyx/electsys/issues),也可以提交 [Pull Request](https://github.com/laohyx/electsys/pulls) 帮助完善代码。 9 | 10 | 11 | ### 安装 12 | 13 | #### 通过 Chrome Webstore(推荐) 14 | 15 | 请访问 Chrome Webstore(被墙)安装插件: 16 | 17 | https://chrome.google.com/webstore/detail/electsys%20%20-%E4%BA%A4%E5%A4%A7%E9%80%89%E8%AF%BE%E6%8F%92%E4%BB%B6/ilmpacenmcgknoogkhpigakpoocpjmpl 18 | 19 | #### 通过 crx 文件 20 | 21 | 1. 在 [Release](https://github.com/laohyx/electsys/releases) 页面下载最新的 crx 文件 22 | 2. 点击右上角 __菜单->更多工具->扩展程序__ 23 | 3. 将 crx 文件从资源管理器中 __拖入“扩展程序”窗口__ 即可 24 | 4. 如安装失败,请确认 (1) 操作是否正确 (2) crx 文件是否来自 [Release](https://github.com/laohyx/electsys/releases) 页面或网上应用店 25 | 26 | ### 其他浏览器上的插件 27 | 28 | #### Safari 29 | https://github.com/dyweb/electsys-safari 30 | 31 | #### Firefox 32 | https://github.com/hczhcz/electsys 33 | 34 | #### Edge 35 | 36 | 1. 在 [Release](https://github.com/laohyx/electsys/releases) 页面下载最新版本的 __Source Code__ 压缩包并在本地解压缩 37 | 2. 在 https://www.microsoft.com/en-us/store/p/microsoft-edge-extension-toolkit/9nblggh4txvb 安装 __Microsoft Edge Extension Toolkit__ 38 | 3. 打开 Toolkit ,点击 __Load extension to convert__ ,选择刚才解压的文件夹载入,等待载入完成(完成后页面中间会有提示 __Your extension is ready for testing__) 39 | 4. 打开 Edge ,在地址栏输入并访问 `about:flags` 40 | 5. 勾选 __“启用开发人员扩展功能(这可能让设备处于危险之中) ”__ 41 | 6. 点击右上角 __菜单(...)->扩展->加载扩展__ 42 | 7. 选择插件所在的文件夹即可载入 43 | 44 | (由于插件没有上线到应用商店,浏览器启动时会提示已关闭来自未知源的扩展;可以从 __菜单(...)->扩展__ 进行启用) 45 | 46 | ### 更新日志 47 | 48 | 请参阅 [CHANGELOG](CHANGELOG) 文件。 49 | 50 | ### 开源许可 51 | 52 | **GPL v3** 或更新的版本。详情请参阅 [LICENSE](LICENSE) 文件。 53 | -------------------------------------------------------------------------------- /content_script/patch/DOMElementPatch.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Electsys++ Project 3 | * ---------------------------- 4 | * Sys.UI.DomElement 补丁 5 | * 修复了页面滚动后滑条失效的问题 6 | */ 7 | 8 | function patch_fix_dom_element() { 9 | jQuery(document).ready(function () { 10 | // Apply patch into original scripts 11 | jQuery('body').append(` 12 | 44 | `); 45 | }); 46 | } -------------------------------------------------------------------------------- /popup/popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 83 | 84 | 85 | 86 | 87 | 88 |
89 | Electsys++ 90 | 91 |   92 | 选项 93 | 94 | 95 |
96 |
97 |

Updated everytime.

98 | 99 | laohyx© 2011-2013 100 |
101 | tq5124© 2014-? 102 | GitHub 103 |
104 | 105 |
106 | 107 | 108 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "update_url": "http://clients2.google.com/service/update2/crx", 3 | "name": "Electsys++ 交大选课插件", 4 | "author": "laohyx", 5 | "version": "2.6.2", 6 | "icons": { 7 | "48": "logo_new.png", 8 | "128": "logo_new_128.png" 9 | }, 10 | "description": "上海交通大学选课网优化工具", 11 | "homepage_url": "https://github.com/laohyx/electsys", 12 | "browser_action": { 13 | "default_icon": { 14 | "48": "logo_new.png", 15 | "128": "logo_new_128.png" 16 | }, 17 | "default_title": "Electsys++", 18 | "default_popup": "popup/popup.html" 19 | }, 20 | "options_page": "option/option.html", 21 | "content_scripts": [ 22 | { 23 | "matches": [ 24 | "*://*.sjtu.edu.cn/*" 25 | ], 26 | "js": [ 27 | "content_script/library/jquery-3.1.1.min.js", 28 | "content_script/library/jquery-ui-1.12.0.min.js", 29 | 30 | "content_script/data/lesson_data.js", 31 | "content_script/data/score_map.js", 32 | 33 | "content_script/patch/DOMElementPatch.js", 34 | 35 | "content_script/core/option.js", 36 | 37 | "content_script/page/lesson.js", 38 | "content_script/page/nhce.js", 39 | "content_script/page/eval.js", 40 | "content_script/page/score.js", 41 | "content_script/page/gpa.js", 42 | "content_script/page/login.js", 43 | "content_script/page/eduction_list.js", 44 | "content_script/page/core_course.js", 45 | "content_script/page/index.js", 46 | "content_script/page/frame.js", 47 | 48 | "content_script/core/load.js", 49 | 50 | "content_script/page/captcha.js" 51 | ], 52 | "css": [ 53 | "content_script/library/jquery-ui-1.12.0.structure.css" 54 | ], 55 | "run_at": "document_start", 56 | "all_frames": true 57 | } 58 | ], 59 | "permissions": [ 60 | "*://*.sjtu.edu.cn/*", 61 | "notifications", 62 | "storage" 63 | ], 64 | "minimum_chrome_version": "49", 65 | "manifest_version": 2, 66 | "web_accessible_resources": [ 67 | "manifest.json" 68 | ] 69 | } -------------------------------------------------------------------------------- /content_script/page/gpa.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Electsys++ Project 3 | * ---------------------------- 4 | * GPA 查询优化模块 5 | */ 6 | 7 | 8 | function optimize_gpa_query() { 9 | if (!inUrl("/edu/StudentScore/StudentScoreQuery.aspx") 10 | || !option.getBool('enable_gpa_query', true)) 11 | return; 12 | 13 | // 更新下拉框学期(与成绩模块共用) 14 | score_update_semester(); 15 | 16 | // 没有成绩时返回(与成绩模块共用) 17 | if (!score_has_result_table()) 18 | return; 19 | 20 | // 插入样式表(与成绩模块共用) 21 | score_insert_css(); 22 | 23 | // 解析数据 24 | let course_list = gpa_scan_gpa(); 25 | 26 | // 启用筛选(与成绩模块共用) 27 | score_enable_select(course_list); 28 | } 29 | 30 | /** 31 | * 读取课程数据 32 | * @return array 课程数组 33 | */ 34 | function gpa_scan_gpa() { 35 | let table = score_get_table(); 36 | if (!table) { 37 | return []; 38 | } 39 | 40 | let course_list = []; 41 | let course_index = 0; 42 | 43 | // 遍历所有行 44 | table.find('tr') 45 | .css("height", "25px") 46 | .each(function () { 47 | let row = jQuery(this); 48 | let row_info = gpa_parse_row(row); 49 | 50 | // 表头 51 | if (row_info.is_head) { 52 | row.attr('data-electsys-id', 0); 53 | return true; 54 | } 55 | 56 | // 成绩行 57 | if (row_info.credit > 0) { 58 | ++course_index; 59 | course_list[course_index] = row_info; 60 | row.attr('data-electsys-id', course_index); 61 | return true; 62 | } 63 | }); 64 | 65 | return course_list; 66 | } 67 | 68 | /** 69 | * 解析一行课程数据 70 | * @return object 课程数据 71 | */ 72 | function gpa_parse_row(row) { 73 | // 初始化 74 | let row_info = { 75 | is_head: false, 76 | is_selected: false, 77 | is_final: true, 78 | course_id: '', 79 | score: 0, 80 | full_score: 100, 81 | percent_score: 0, 82 | credit: 0, 83 | gpa: 0 84 | }; 85 | 86 | let columns = row.children('td'); 87 | 88 | // 判断是否为表头 89 | if (columns.length == 0 || row.hasClass('tdtit')) { 90 | row_info.is_head = true; 91 | return row_info; 92 | } 93 | 94 | // 解析数据 95 | row_info.course_id = columns.eq(0).text().trim(); 96 | row_info.score = columns.eq(2).text() - 0; 97 | row_info.credit = columns.eq(3).text() - 0; 98 | row_info.gpa = columns.eq(4).text() - 0; 99 | 100 | // 无效数据不列入计算 101 | if (isNaN(row_info.gpa - 0) || isNaN(row_info.score - 0)) { 102 | row_info.gpa = 0; 103 | row_info.score = 0; 104 | row_info.credit = 0; 105 | } 106 | 107 | // 兼容成绩模块 108 | row_info.percent_score = row_info.score; 109 | 110 | return row_info; 111 | } 112 | 113 | -------------------------------------------------------------------------------- /content_script/core/option.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Electsys++ Project 3 | * ---------------------------- 4 | * 设置模块 5 | */ 6 | 7 | // Support both Chrome & other browsers 8 | if (!browser && chrome) { 9 | var browser = chrome; 10 | } 11 | 12 | (function (window, browser) { 13 | 'use strict'; 14 | 15 | let option = {}; 16 | let cachedOptions = Object.create(null); 17 | 18 | /** 19 | * 初始化缓存 20 | * @return Promise 21 | */ 22 | option.init = function () { 23 | return new Promise(resolve => browser.storage.local.get(resolve)) 24 | .then(data => { 25 | cachedOptions = data; 26 | }); 27 | }; 28 | 29 | /** 30 | * 从缓存获取设置值 31 | * @param String key 32 | * @param Object default_val 33 | * @return Object 34 | */ 35 | option.get = function (key, default_val) { 36 | let val = cachedOptions[key]; 37 | default_val = default_val || null; 38 | 39 | if (val == null) { 40 | val = default_val; 41 | } 42 | 43 | // 获取最新的值供下次使用 44 | option.getAsync(key); 45 | return val; 46 | }; 47 | 48 | /** 49 | * 异步获取设置值 50 | * @param String key 51 | * @param Object default_val 52 | * @return Promise 53 | */ 54 | option.getAsync = function (key, default_val) { 55 | //console.log('get', key, default_val); 56 | return new Promise(resolve => browser.storage.local.get(key, resolve)) 57 | .then(data => { 58 | let val = data[key]; 59 | cachedOptions[key] = val; 60 | 61 | default_val = default_val || null; 62 | 63 | return (val == null) ? default_val : val; 64 | }) 65 | .catch(() => default_val); 66 | }; 67 | 68 | /** 69 | * 获取设置的布尔值 70 | * @param String key 71 | * @param Boolean default_val 72 | * @return Promise 73 | */ 74 | option.getBool = function (key, default_val) { 75 | //console.log(option.get(key, default_val || false)); 76 | return Boolean(option.get(key, default_val || false)); 77 | }; 78 | 79 | /** 80 | * 设置指定项 81 | * @param String key 82 | * @param Object value 83 | * @return Promise 84 | */ 85 | option.set = function (key, value) { 86 | //console.log('set', key, value); 87 | cachedOptions[key] = value; 88 | return new Promise(resolve => { 89 | let obj = {}; 90 | obj[key] = value; 91 | browser.storage.local.set(obj, resolve); 92 | }); 93 | }; 94 | 95 | /** 96 | * 判断指定项是否存在 97 | * @param String key 98 | * @return Promise 99 | */ 100 | option.has = function (key) { 101 | //console.log('has', key); 102 | return this.get(key, null) != null; 103 | }; 104 | 105 | /** 106 | * 清空设置 107 | */ 108 | option.clear = function () { 109 | cachedOptions = Object.create(null); 110 | return new Promise(resolve => { 111 | browser.storage.local.clear(resolve); 112 | }); 113 | }; 114 | 115 | window.option = option; 116 | }(window, (browser || chrome))); 117 | -------------------------------------------------------------------------------- /content_script/core/load.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Electsys++ Project 3 | * ---------------------------- 4 | * 初始化模块 5 | */ 6 | 7 | // Support both Chrome & other browsers 8 | if (!browser && chrome) { 9 | var browser = chrome; 10 | } 11 | 12 | jQuery.getJSON( 13 | browser.extension.getURL("manifest.json"), 14 | function(data){ 15 | option.set("extension_version", data["version"]); 16 | } 17 | ); 18 | 19 | 20 | 21 | jQuery.extend(jQuery, { 22 | inJSON: function(json, key){ 23 | var hit, hits = []; 24 | jQuery.each(json, function(k,v){ 25 | if (k === key) 26 | hits.push(v); 27 | if (typeof(v) === "string"){ 28 | return true; 29 | } else if (jQuery.isArray(v) || jQuery.isPlainObject(v)) { 30 | var r = jQuery.inJSON(v, key); 31 | if (r.length > 0) 32 | hits = hits.concat(r); 33 | } 34 | }); 35 | return hits; 36 | } 37 | }); 38 | 39 | 40 | Array.prototype.distinct = function() { 41 | var a = {}, c = [], l = this.length; 42 | for (var i = 0; i < l; i++) { 43 | var b = this[i]; 44 | var d = (typeof b) + b; 45 | if (a[d] === undefined) { 46 | c.push(b); 47 | a[d] = 1; 48 | } 49 | } 50 | return c; 51 | } 52 | 53 | function inUrl(url){ 54 | // Iterate if url is an array 55 | if(Array.isArray(url)) { 56 | var len = url.length; 57 | for (var i = 0; i < len; ++i) { 58 | if (inUrl(url[i])) { 59 | return true; 60 | } 61 | } 62 | 63 | return false; 64 | } 65 | 66 | return (document.URL.toLowerCase().indexOf(url.toLowerCase()) != -1); 67 | } 68 | 69 | opscore_year = "2012-2013"; 70 | opscore_semester = "1"; 71 | 72 | function getSemester(){ 73 | var day = new Date(); 74 | var y = day.getFullYear(); 75 | var m = day.getMonth() + 1; 76 | 77 | if (m < 3){ 78 | opscore_year = (y-1) + "-" + y; 79 | opscore_semester = "1"; 80 | }else if (m < 9){ 81 | opscore_year = (y-1) + "-" + y; 82 | opscore_semester = "2"; 83 | }else{ 84 | opscore_year = y + "-" + (y+1); 85 | opscore_semester = "1"; 86 | } 87 | return; 88 | } 89 | 90 | getSemester(); 91 | 92 | function main() 93 | { 94 | jQuery.noConflict(); 95 | 96 | base_url = document.URL.slice(0,document.URL.indexOf("sjtu.edu.cn") + 11); 97 | 98 | // 初始化设置 99 | option.init().then(function () { 100 | //设置首页checkbox 101 | set_index_page(); 102 | //优化左边菜单栏 103 | set_left_scroll(); 104 | //优化左边折叠栏 105 | optimize_sdtleft(); 106 | //优化上栏 107 | optimize_flattop(); 108 | optimize_flattop_content(); 109 | //优化选课(重点) 110 | optimize_elect(); 111 | optimize_elect_warning(); 112 | 113 | //成绩查询 114 | optimize_score_query(); 115 | //绩点查询 116 | optimize_gpa_query(); 117 | //修业查看中计算总绩点 118 | optimize_my_eduction_list(); 119 | 120 | //核心课程追加绩点 121 | optimize_core_course(); 122 | 123 | //首页 124 | optimize_index(); 125 | 126 | //快速评教 127 | fast_eval_index(); 128 | fast_eval_process(); 129 | 130 | //快速评教,期中 131 | fast_eval_midterm_index(); 132 | fast_eval_midterm_process(); 133 | 134 | // NHCE - - 135 | nhce_main(); 136 | }); 137 | } 138 | 139 | 140 | jQuery(document).ready(function () { 141 | main(); 142 | }); 143 | -------------------------------------------------------------------------------- /CHANGELOG: -------------------------------------------------------------------------------- 1 | 更新日志(从 1.9.5 才开始写): 2 | 3 | 2.6.2 - 2019/6/15 4 | 提升验证码识别流程的稳定性 (#39) 5 | 6 | 2.6.1 - 2019/3/17 7 | 修复验证码功能无法关闭的问题 8 | 修复部分情况拖动评教页面滚动条数值无响应的问题 9 | 修复了新版 jAccount 页面验证码无法识别的问题 (#38) 10 | 更新项目许可证为 GPL v3 11 | 12 | 2.6 - 2017/4/10 13 | 增加 jAccount 自动登录 (#26) 14 | 修复夏季学期选课小课表无法显示的问题 (#27) 15 | 16 | 2.5.4 - 2017/1/17 17 | 暂时关闭首页成绩查询 18 | 19 | 2.5.3 - 2016/12/25 20 | 更新通识课列表 21 | 22 | 2.5.2 - 2016/12/13 23 | 修复小课表无法折叠和功能开关失效的问题 24 | 修复从推荐课表选课时点击教师时会自动跳转的问题 (#24) 25 | 修复在推荐课表页面会出现推荐课表的小课表的问题 26 | 27 | 2.5.1 - 2016/12/12 28 | 修复评教页面滑条失效的问题 (#17) 29 | 30 | 2.5 - 2016/11/3 31 | 升级至 jQuery 3.1 32 | 增加插件配置页面 33 | 恢复首页成绩查询 34 | 优化成绩和绩点查询筛选 35 | 优化代码架构 36 | 修复成绩和绩点查询中等第制成绩无法计算的问题 (#14) 37 | 38 | 2.4.2 - 2016/9/18 39 | 增加核心课程成绩页面的 GPA 计算 40 | 更新通识课列表 41 | 在选课页面查看课程安排时可优先使用点击“查”按钮时时缓存的页面 42 | 修复修业查看中正在修读课程列入 GPA 计算的问题 (#11) 43 | 44 | 2.4.1 - 2016/9/4 45 | 去除了广告。发布到了应用商店。 46 | 47 | 2.4 - 2014/1/27 48 | tq5124, 更新日志改写在git中 49 | 在”修业查看“页面中增加所有课程的 GPA 和各小项的 GPA 的显示 50 | 修复小学期选课页面通识课没有高亮标注的问题 51 | 更新通识课列表 52 | 优化选课前的注意事项页面 53 | 从 2.4 开始将只支持 Chrome 49+ 版本,请及时升级浏览器 54 | 55 | 2.3.19 - 2013/12/11 56 | 优化处理队列,加大间隔,增加错误重试 57 | 58 | 2.3.18 - 2013/12/11 59 | 选课网限制刷新频率,修改为手动点查 60 | 61 | 2.3.14 - 2012/12/26 62 | 修改“刷新信息”按钮的样式。 63 | 计划下一版本开源啊! 64 | 65 | 2.3.13 - 2012/11/12 66 | (为什么空下那么多版本号?) 67 | 修复查积点的小bug。(招安= =他们还懒得搞呢) 68 | 69 | 70 | 2.3.8/2.2.9 - 2012/06/28 71 | 关闭左边菜单栏优化。(唉,被招安了。。) 72 | 73 | 2.3.7 - 2012/06/23 74 | 修改版本号显示方式,同步与插件版本更新。 75 | 76 | 2.3.6 - 2012/06/22 77 | 修改查任选课中的一个经典BUG(竟然将POST data中的‘$’文本替换成了jQuery...) 78 | 增加对于无安排的课程出现“无”的提示。 79 | 姑娘21号晚回家了。祝她有个美好的周末~ 80 | 81 | 2.3.5 - 2012/06/21 82 | 美化一下logo。 83 | 增加了删除老插件的功能,成功避免冲突。 84 | 85 | 2.3.3 - 2012/06/20 86 | 修改logo。 87 | 修复“参数错误的bug”,在读取满不满时点击查询,不会出现“参数错误”的提示。 88 | 89 | 2.3.1 - 2012/06/18 (WebStore分支,难道开创了奇偶数版本的时代?) 90 | 取2.1.9的查课程代码,并加以修改,更快速稳定。 91 | (还是靠学校开放接口啊…………) 92 | 93 | 2.2.6 - 2012/06/16 94 | 修复首页成绩显示的BUG。 95 | 96 | 2.2.5 - 2012/06/11 97 | 不做测试悔死人啊!! 98 | 官网链接竟然不分大小写的- - 99 | 100 | 2.2.4 - 2012/06/11 101 | 不做测试悔死人啊!! 102 | 修正一小小bug。。。 103 | 2.2.3 - 2012/06/11 104 | 首页出现本学期的成绩。 105 | 106 | 2.2.2 - 2012/06/05 107 | NHCE 第三册、第四册的听力部分ok 108 | 甚至修改了Next按键的链接,直接跳过说的部分。 109 | 110 | 2.2.1 - 2012/06/04 111 | 划时代地加入了NCHE(新视野大学英语)网站的答题功能。 112 | 第三册的听力部分全部自动答题,s和n键可以用来用为Submit和Next. 113 | 在纠结用不用把第二册和第四册做掉呢。。。。。 114 | 115 | 2.2.0 - 2012/05/25 116 | 2012-2013第一学期选课开始 117 | 他们关闭了查课,那么我就用我自己的网站来查! 118 | 修改lesson.js里post函数链接,直接从electsys.net得到。 119 | 120 | 2.1.17 - 2012/05/09 121 | 暑假小学期第一次更新,功能不多,把“满不满”样式恢复到传统模式。。。 122 | 求JWC给我点接口什么的…… 123 | 124 | 2.1.14 - 2012/04/01 125 | 愚人节快乐! 126 | 127 | 2.1.10 - 2012/02/12 128 | 选课网增加对POST频率的检测机制,暂时关闭POST功能。 129 | 尼玛难道要做不下去了么? 130 | 131 | 2.1.9 - 2012/01/?? 132 | 不知道做了些什么。。 133 | 134 | 2.1.8 - 2011/12/21 135 | 那个问题果然没解决,手动去掉关闭功能。 136 | 137 | 2.1.7 - 2011/12/19 138 | 修改控制页面的链接,解决缓存问题(也不知能不能解决) 139 | 140 | 2.1.5 - 2011/12/10 141 | 根据jwc通知增加冲抵通识课的任选课列表。 142 | 增强域名兼容性。 143 | 144 | 2.1.4 - 2011/12/8 145 | 修改部分代码改为jQuery API,增强兼容性。 146 | 增加lesson_enable_check功能,可以选择开关功能,避免抢选时增加服务器压力。 147 | 148 | 2.1.3 - 2011/12/6 早晨 149 | 修改颜色块的样式,好看多了吧…… 150 | 修改统计链接的增加方式,减少性能消耗。 151 | 152 | 2.1.2 - 2011/12/5 晚上 153 | 修改draw div的位置,使得其绘制不影响表格各列的宽度。 154 | 155 | 2.1.1 - 2011/12/5 晚上 156 | 修复bug:electsys0下post数据到electsys.sjtu.edu.cn 增加base_url解决 157 | 修改推广链接,到electsys.net,总比分享到人人好吧…… 158 | 159 | 2.1.0 - 2011/12/5 下午 160 | 增加了好多功能啊。。 161 | 修改选课时标记颜色,比原来的柔和多了…… 162 | 点课程的单选圆圈就可以查看课程安排了! 163 | 在课程安排中显示该老师的评教数据! 164 | 165 | 2.0.5 - 2011/12/1 晚上 166 | 修正2.0.4增加的联动功能没用的bug - -# 167 | Bug reported by Popacai.(专业测试员~) 168 | 169 | 2.0.4 - 2011/12/1 下午 170 | 增加分数联动功能,但是分数太整齐... 171 | 172 | 2.0.3 - 2011/12/1 173 | 优化判断链接,支持electsys0 和不带0的 174 | 增加“快速评教功能” 175 | 纪念下,2011年11月29日,electsys.net上线 176 | 177 | 2.0.2 - 2011/11/22 178 | 将判断链接由electsys0.sjtu.edu.cn/*改为electsys.sjtu.edu.cn/* 179 | 180 | 2.0.1 - 2011/10/22 (from 2011/9/10) 181 | 修改后台为异步post方式。 182 | 在登录后停止后台查询。 183 | //在首页支持记录账号数据。(关闭) 184 | 185 | 2.0.0 - 2011/8/3 (未发布) 186 | 增加后台查成绩功能。 187 | 增加工具栏图标,有各种小提示。。。 188 | 189 | 1.9.5 - 2011/7/18 190 | 将dom操作全部改为jquery API,增加可移植性。 191 | 将load.js分解成四个文件,方便管理。 192 | 修复算平均分时遇到字母时出错的bug。 193 | 增加算平均分全选的功能。 194 | -------------------------------------------------------------------------------- /content_script/page/eduction_list.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Electsys++ Project 3 | * ---------------------------- 4 | * 修业查看优化模块 5 | */ 6 | 7 | let edulist_gpa_global = { 8 | "bixiu": 0, 9 | "xianxuan": 0, 10 | "tongshi": 0, 11 | "gexinghua": 0, 12 | "tiyu": 0, 13 | "liangke": 0, 14 | "units": 0, 15 | "grades": 0, 16 | "scores": 0 17 | }; 18 | 19 | function optimize_my_eduction_list() { 20 | if (!inUrl("/edu/GradAudit/MyGradList2013.aspx") || 21 | !option.getBool('optimize_edulist', true)) 22 | return 0; 23 | // 修复照片失效 24 | edulist_fix_photo(); 25 | 26 | // 初始化 27 | edulist_gpa_global["units"] = 0; 28 | edulist_gpa_global["grades"] = 0; 29 | edulist_gpa_global["scores"] = 0; 30 | edulist_gpa_global["bixiu"] = edulist_gpa_column("#dgBX1", "#lbBxxf2", [6, 5, 7]); //必修 31 | edulist_gpa_global["tiyu"] = edulist_gpa_column("#dgPE", "#lbPE1", [6, 5, 7]); //体育 32 | edulist_gpa_global["liangke"] = edulist_gpa_column("#dgTH", "#lbTH1", [6, 5, 7]); //两课 33 | edulist_gpa_global["xianxuan"] = edulist_gpa_column("#dgXX2", "#lbXxxf1", [7, 6, 8]); //限选 34 | edulist_gpa_global["tongshi"] = edulist_gpa_column("#dgTsk2", "#lbTSK1", [7, 6, 9]); //通识 35 | edulist_gpa_global["gexinghua"] = edulist_gpa_column("#dgGxh2", "#lbGxxf1", [6, 5, 7]); //任选 36 | 37 | // 将统计结果显示在最上方的总表格中 38 | const p = `共修${edulist_gpa_global['units']}学分,` + 39 | `平均分为${(edulist_gpa_global["scores"] / edulist_gpa_global["units"]).toFixed(2)},` + 40 | `GPA为${(edulist_gpa_global["grades"] / edulist_gpa_global["units"]).toFixed(2)}`; 41 | 42 | jQuery("#form1 > table > tbody > tr:nth-child(6)") 43 | .after(` 44 | 45 |
46 | 所有课程分数情况(由electsys++提供) 47 | 48 |

${p}

49 |
50 |
51 | 52 | `); 53 | } 54 | 55 | function edulist_gpa_column(table, title, colomn) { 56 | /** 57 | @table: 成绩表格的id 58 | @title: 标题 59 | @colomn: 代表“成绩”,“学分”,“备注”所在列 60 | */ 61 | let gpa_all = 0; 62 | let unit_all = 0; 63 | let score_all = 0; 64 | jQuery(table).find("tr").each(function () { 65 | const score = jQuery(this).find("td:nth-child(" + colomn[0] + ")").html(); 66 | const unit = parseInt(jQuery(this).find("td:nth-child(" + colomn[1] + ")").html()); 67 | const comment = jQuery(this).find("td:nth-child(" + colomn[2] + ")").html(); 68 | const fixed_score = score_fix(score); 69 | let gpa = score2gpa(fixed_score); 70 | if (typeof (gpa) == "number" && 71 | comment != "无需关注" && 72 | comment != "尚未修读" && 73 | comment != "正在修读" && 74 | gpa >= 0 75 | ) { 76 | gpa_all += gpa * unit; 77 | unit_all += unit; 78 | score_all += fixed_score * unit; 79 | edulist_gpa_global["scores"] += fixed_score * unit; 80 | edulist_gpa_global["units"] += unit; 81 | edulist_gpa_global["grades"] += gpa * unit; 82 | 83 | // Convert gpa to string 84 | gpa = gpa.toFixed(1); 85 | } else if (gpa != "绩点") { 86 | gpa = "未计入计算"; 87 | } 88 | jQuery(this).append("" + gpa + ""); 89 | }); 90 | 91 | //项目数量最小为 1 92 | unit_all = Math.max(1, unit_all); 93 | const gpa_avg = gpa_all / unit_all; 94 | const score_avg = score_all / unit_all; 95 | jQuery(title).parent() 96 | .append(`本部分课程GPA为:${gpa_avg.toFixed(2)},平均分为:${score_avg.toFixed(2)}`); 97 | } 98 | 99 | function edulist_fix_photo() { 100 | jQuery('#imgPhoto') 101 | .on('error', function () { 102 | let img = jQuery(this); 103 | let rawUrl = img.attr('src'); 104 | let matchResult = rawUrl.match(/xh=([0-9]+)/); 105 | 106 | // 图片有效,不作替换 107 | if (this.naturalHeight > 1 || this.naturalWidth > 1) { 108 | return; 109 | } 110 | 111 | if (!matchResult) { 112 | return; 113 | } 114 | 115 | let newUrl = `/edu/StuStatusMange/StuPhoto.aspx?xh=${matchResult[1]}`; 116 | // 验证替换地址有效性后再替换图片 117 | jQuery.get(newUrl, function () { 118 | img.attr('src', newUrl); 119 | }); 120 | }) 121 | // 解决 on('error') 有时不起作用的问题 122 | .attr('onerror', 'console.log("Avatar broken")'); 123 | } 124 | -------------------------------------------------------------------------------- /content_script/page/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Electsys++ Project 3 | * ---------------------------- 4 | * 首页优化模块 5 | */ 6 | 7 | /** 8 | * 模块入口 9 | */ 10 | function optimize_index() { 11 | if (!inUrl("newsBoard/newsInside.aspx")) 12 | return 0; 13 | 14 | //optimize_index_score_query(); 15 | } 16 | 17 | /** 18 | * 首页插入成绩 19 | */ 20 | function optimize_index_score_query() { 21 | let l = jQuery("#Form1").children().length; 22 | jQuery("#Form1") 23 | .children().slice(l - 1, l) 24 | .append(` 25 | 26 | 27 | 本学期成绩 28 | 折叠/展开 29 | 30 | 31 | 32 |
33 |

点击此处查询

34 |
35 | 36 | `); 37 | 38 | jQuery('#fold_index_score').click(function () { 39 | option.set('fold_index_socre', jQuery("#index_score_div").css("display") != "none"); 40 | //console.log(localStorage['fold_index_socre']); 41 | //console.log(jQuery("#index_score_div").height()); 42 | jQuery("#index_score_div").slideToggle(); 43 | }); 44 | 45 | if (option.getBool('fold_index_socre', true)) { 46 | jQuery("#index_score_div").slideToggle(0); 47 | index_show_score_register_click(); 48 | } else { 49 | jQuery("#index_score_div > p").text('正在查询成绩……'); 50 | index_show_score_query(); 51 | } 52 | } 53 | 54 | /** 55 | * 注册点击事件 56 | */ 57 | function index_show_score_register_click() { 58 | jQuery('#index_score_div span').click(function (e) { 59 | jQuery(this).parent().text('正在查询成绩……'); 60 | index_show_score_query(); 61 | 62 | e.preventDefault(); 63 | }); 64 | } 65 | 66 | /** 67 | * 加载成绩 68 | */ 69 | function index_show_score_query() { 70 | jQuery.get(base_url + '/edu/StudentScore/B_StudentScoreQuery.aspx') 71 | // 使用 Promise 避免回调地狱 72 | .then(function (html) { 73 | html = jQuery(html); 74 | //console.log(html); 75 | let vs = html.find('#__VIEWSTATE').val(); 76 | let vg = html.find('#__VIEWSTATEGENERATOR').val(); 77 | let ev = html.find('#__EVENTVALIDATION').val(); 78 | 79 | return jQuery.post( 80 | base_url + '/edu/StudentScore/B_StudentScoreQuery.aspx', 81 | { 82 | '__EVENTVALIDATION': ev, 83 | '__VIEWSTATE': vs, 84 | '__VIEWSTATEGENERATOR': vg, 85 | 'ddlXN': opscore_year, 86 | 'ddlXQ': opscore_semester, 87 | 'txtKCDM': '', 88 | 'btnSearchDetail': '查询明细成绩单' 89 | } 90 | ); 91 | }) 92 | .then(function (html) { 93 | html = jQuery(html); 94 | let score_table = html.find('#dgScore'); 95 | if (score_table.length == 0) { 96 | throw new Error('Incorrect page loaded'); 97 | } 98 | 99 | // 删除非最终成绩行 100 | score_table.find('tr') 101 | .filter(function (index) { 102 | // 删除无用列 103 | jQuery(this).children('td').eq(-1).remove(); 104 | 105 | // 表头 106 | if (index == 0) 107 | return false; 108 | 109 | let not_final = jQuery(this).children('td').eq(-1).text().trim() != '是'; 110 | return not_final; 111 | }) 112 | .remove(); 113 | 114 | // 补偿样式 115 | score_table.find('tbody > tr:nth-child(odd)') 116 | .removeClass('tdcolour2') 117 | .addClass('tdcolour1'); 118 | score_table.find('tbody > tr:nth-child(even)') 119 | .removeClass('tdcolour1') 120 | .addClass('tdcolour2'); 121 | 122 | // 插入表格到页面中 123 | jQuery('#index_score_div') 124 | .empty() 125 | .append(score_table); 126 | }) 127 | .catch(function () { 128 | jQuery('#index_score_div') 129 | .empty() 130 | .append(`

加载失败,请稍后重试~

`); 131 | 132 | index_show_score_register_click(); 133 | }); 134 | } 135 | 136 | function index_insert_ad() { 137 | 138 | } 139 | -------------------------------------------------------------------------------- /library/electsys.js: -------------------------------------------------------------------------------- 1 | function Electsys(input_uid, input_password){ 2 | var _this = this; 3 | var uid; 4 | var password; 5 | var confirmed; 6 | _this.viewstate = ""; 7 | _this.eventvalidation = ""; 8 | var html; 9 | var init = function(){ 10 | uid = input_uid; 11 | password = input_password; 12 | confirmed = 0 ; 13 | } 14 | init(); 15 | 16 | _this.login = function(){ 17 | //得到首页信息 18 | $.ajax({ 19 | type: 'GET', 20 | url: "http://electsys0.sjtu.edu.cn/edu/index.aspx", 21 | data: {}, 22 | async:true, 23 | success: function(data){ 24 | html = $(data); 25 | _this.viewstate = $("#__VIEWSTATE",html).val(); 26 | _this.eventvalidation = $("#__EVENTVALIDATION",html).val(); 27 | var post_data = {"__VIEWSTATE": _this.viewstate, "__EVENTVALIDATION": _this.eventvalidation, "txtUserName": uid, "txtPwd": password, "rbtnLst_1": "1", "Button1": "登陆"}; 28 | 29 | //登录 30 | $.ajax({ 31 | type: 'POST', 32 | url: "http://electsys0.sjtu.edu.cn/edu/index.aspx", 33 | data: post_data, 34 | async: true, 35 | success: function(data){ 36 | if(data.indexOf("frameset") > -1) 37 | localStorage["account_confirmed"] = 1; 38 | else{ 39 | localStorage["account_confirmed"] = 0; 40 | } 41 | if(localStorage["account_confirmed"] == 0){ 42 | chrome.browserAction.setBadgeBackgroundColor({"color":[255, 0, 0, 255]}); 43 | chrome.browserAction.setBadgeText({"text":"x"}); 44 | }else{ 45 | //正确,向background发出请求 46 | chrome.browserAction.setBadgeBackgroundColor({"color":[0, 255, 0, 255]}); 47 | chrome.browserAction.setBadgeText({"text":"ok"}); 48 | } 49 | get_lesson(); 50 | }, 51 | dataType: "html" 52 | });//end of $.ajax 53 | }, 54 | dataType: "html" 55 | });//end of $.ajax 56 | }//end of _this.login 57 | 58 | _this.get = function(url){ 59 | //得到首页信息 60 | $.ajax({ 61 | type: 'GET', 62 | url: url, 63 | data: {}, 64 | async:false, 65 | 66 | success: function(data){ 67 | html = $(data); 68 | _this.viewstate = $("#__VIEWSTATE",html).val(); 69 | _this.eventvalidation = $("#__EVENTVALIDATION",html).val(); 70 | html = data; 71 | }, 72 | dataType: "html" 73 | });//end of $.ajax 74 | return html; 75 | 76 | }//end of _this.get 77 | _this.post = function(url, postfield){ 78 | $.ajax({ 79 | type: 'POST', 80 | url: url, 81 | data: postfield, 82 | async: false, 83 | success: function(data){ 84 | html = data; 85 | }, 86 | dataType: "html" 87 | });//end of $.ajax 88 | return html; 89 | 90 | }//end of _this.post 91 | 92 | 93 | 94 | } 95 | 96 | 97 | 98 | function checkAccount() { 99 | if(localStorage["uid"] == undefined) 100 | return; 101 | if (localStorage["uid"] != localStorage["last_valid_uid"]){ 102 | localStorage.removeItem("score_info"); 103 | localStorage.removeItem("unread_score_info"); 104 | } 105 | if (localStorage["uid"].length < 3) 106 | return ; 107 | 108 | var ele = new Electsys(localStorage["uid"], localStorage["password"]); 109 | var html = ele.get("http://electsys0.sjtu.edu.cn/edu/student/sdtleft.aspx"); 110 | html = $(html); 111 | // cancel the query action while you are logged in. 112 | if($("#lblXm",html).text().length > 1){ 113 | // console.log("logged in and we don't login again."); 114 | // console.log($("#lblXm",html).text()); 115 | return; 116 | } 117 | // console.log("login action"); 118 | var result = ele.login(); 119 | } 120 | 121 | 122 | 123 | 124 | function get_lesson(){ 125 | //chrome.browserAction.setBadgeBackgroundColor({"color":[255, 0, 0, 255]}); 126 | //chrome.browserAction.setBadgeText({"text":"~"}); 127 | var year = "2010-2011"; 128 | var semester = "2"; 129 | 130 | var ele = new Electsys(localStorage["uid"], localStorage["password"]); 131 | result = ele.get("http://electsys0.sjtu.edu.cn/edu/StudentScore/B_StudentScoreQuery.aspx"); 132 | result = ele.post("http://electsys0.sjtu.edu.cn/edu/StudentScore/B_StudentScoreQuery.aspx", 133 | {"__VIEWSTATE": ele.viewstate, "__EVENTVALIDATION": ele.eventvalidation, "txtKCDM": "", "ddlXN": year, "ddlXQ": semester, "btnSearch": " 查 询 "}); 134 | var dom = $(result); 135 | localStorage["temp"] = result; 136 | var score_tr_list = $("tr[style$=height\\:25px\\;]", dom); 137 | 138 | var lsn_score = []; 139 | var unit; 140 | var score; 141 | for(var x = 0; x < score_tr_list.length; x++){ 142 | var tr = score_tr_list.slice(x,x+1); 143 | var id = tr.children().slice(0,1).text().trim(); 144 | var name = tr.children().slice(1,2).text().trim(); 145 | var score = tr.children().slice(3,4).text().trim(); 146 | lsn_score.push({"id":id,"name":name,"score":score}); 147 | 148 | } 149 | if(!localStorage["score_info"]){ 150 | localStorage["score_info"] = JSON.stringify({"2010-2011-2" : lsn_score}); 151 | }else{ 152 | var score_json = JSON.parse(localStorage["score_info"]); 153 | if(lsn_score.length > score_json["2010-2011-2"].length){ 154 | //提示 155 | chrome.browserAction.setBadgeBackgroundColor({"color":[255, 0, 0, 255]}); 156 | chrome.browserAction.setBadgeText({"text": String(lsn_score.length - JSON.parse(localStorage["score_info"])["2010-2011-2"].length)}); 157 | //将未读的存至localStorage["unread_score_info"] 158 | var former_score = JSON.parse(localStorage["score_info"])["2010-2011-2"]; 159 | var unread_score = []; 160 | for(var x = 0; x < lsn_score.length; x++){ 161 | var lsn_id = lsn_score[x]["id"]; 162 | var next = 0; 163 | for(var y = 0; y < former_score.length; y++){ 164 | if(former_score[y]["id"] == lsn_id){ 165 | next = 1; 166 | break; 167 | } 168 | } 169 | if(next == 0){//是新的成绩 170 | unread_score.push(lsn_score[x]); 171 | } 172 | } 173 | localStorage["unread_score_info"] = JSON.stringify({"2010-2011-2" : unread_score}); 174 | } 175 | } 176 | localStorage["last_valid_uid"] = localStorage["uid"]; 177 | 178 | } 179 | 180 | $(document).ready(function(){ 181 | 182 | $.getJSON( 183 | chrome.extension.getURL("manifest.json"), 184 | function(data) { 185 | $("#version_span").text(data["version"]); 186 | } 187 | ); 188 | 189 | });//document.ready 190 | -------------------------------------------------------------------------------- /option/option.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | electsys++ 设置 6 | 7 | 8 | 9 | 10 | 11 | 12 | 45 | 46 | 47 | 48 |
49 |
50 |

electsys++

51 |

上海交通大学选课网优化工具

52 |
53 | 54 |

选课

55 | 56 |
57 |
58 |
59 | 60 | 61 |
62 |
63 |
64 |
65 | 67 | 68 |
69 |
70 |
71 |
72 | 73 | 74 |
75 |
76 |
77 | 78 |

优化

79 | 80 |
81 |
82 |
83 | 84 | 85 |
86 |
87 |
88 |
89 | 90 | 91 |
92 |
93 |
94 |
95 | 96 | 97 |
98 |
99 |
100 |
101 | 102 | 103 |
104 |
105 |
106 |
107 | 108 | 109 |
110 |
111 |
112 |
113 | 114 | 115 |
116 |
117 |
118 |
119 | 120 | 121 |
122 |
123 | 124 | 125 | 126 | 已保存 127 |
128 |
129 |
130 |
131 | 132 |
133 | 134 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | -------------------------------------------------------------------------------- /library/option.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Electsys++ Project 3 | * ---------------------------- 4 | * 设置页面 5 | */ 6 | 7 | (function (window, document, $) { 8 | 'use strict'; 9 | 10 | let option = window.option; 11 | 12 | function initVersion() { 13 | $.getJSON(chrome.extension.getURL('manifest.json')) 14 | .then(function (data) { 15 | $('#ext-version').text(data['version']); 16 | }); 17 | } 18 | 19 | function initOptions() { 20 | $('input[type=checkbox]').each(function () { 21 | let checkbox = $(this); 22 | let key = checkbox.data('key'); 23 | let val_checked = checkbox.data('checked'); 24 | let val_unchecked = checkbox.data('unchecked'); 25 | let val_default = checkbox.data('default'); 26 | let val_enabled = checkbox.data('enabled-key') || ''; 27 | console.log(key, val_checked, val_unchecked, val_default, val_enabled); 28 | if (!key || 29 | val_checked === undefined || 30 | val_unchecked === undefined || 31 | val_default === undefined) { 32 | return true; 33 | } 34 | try { 35 | val_checked = JSON.parse(val_checked); 36 | val_unchecked = JSON.parse(val_unchecked); 37 | val_default = JSON.parse(val_default); 38 | } catch (e) { } 39 | 40 | option.getAsync(key).then(function (val) { 41 | //console.log(key,val); 42 | if (val == null) { 43 | val = val_default; 44 | option.set(key, val); 45 | } 46 | 47 | checkbox.prop('checked', (val === val_checked)); 48 | 49 | checkbox.change(function () { 50 | let val = checkbox.prop('checked') ? val_checked : val_unchecked; 51 | 52 | $(`*[data-enabled-key=${key}]`).trigger('change-enable', [val]); 53 | 54 | option.set(key, val) 55 | .then(function () { 56 | if (chrome.runtime.lastError) { 57 | console.log(chrome.runtime.lastError); 58 | } 59 | }); 60 | }); 61 | }); 62 | 63 | if (val_enabled != '') { 64 | checkbox.on('change-enable', function (event, val) { 65 | checkbox.prop('disabled', !(val)); 66 | 67 | $(`*[data-enabled-key=${key}]`).trigger('change-enable', 68 | [val && checkbox.prop('checked') ? val_checked : val_unchecked]); 69 | }); 70 | 71 | checkbox.prop('disabled', $(`input[data-key=${val_enabled}]`).prop('disabled') || 72 | !option.getBool(val_enabled, 73 | $(`input[data-key=${val_enabled}]`).data('data-checked'))); 74 | } 75 | }); 76 | } 77 | 78 | function initInput() { 79 | $('input[type=text],input[type=password]').each(function () { 80 | let input = $(this); 81 | let key = input.data('key'); 82 | let val_default = input.data('default'); 83 | let val_enabled = input.data('enabled-key') || ''; 84 | console.log(key, val_default, val_enabled); 85 | if (!key || 86 | val_default === undefined) { 87 | return true; 88 | } 89 | try { 90 | val_default = JSON.parse(val_default); 91 | } catch (e) { } 92 | 93 | option.getAsync(key).then(function (val) { 94 | console.log(key, val); 95 | if (val == null) { 96 | val = val_default; 97 | option.set(key, val); 98 | } 99 | input.val(val || ''); 100 | 101 | input.on('save', function () { 102 | option.set(key, input.val() || '') 103 | .then(function () { 104 | if (chrome.runtime.lastError) { 105 | console.log(chrome.runtime.lastError); 106 | } 107 | }); 108 | }); 109 | }); 110 | 111 | if (val_enabled != '') { 112 | input.on('change-enable', function (event, val) { 113 | input.prop('disabled', !(val)); 114 | }); 115 | 116 | input.prop('disabled', $(`input[data-key=${val_enabled}]`).prop('disabled') || 117 | !option.getBool(val_enabled, 118 | $(`input[data-key=${val_enabled}]`).data('data-checked'))); 119 | } 120 | }); 121 | } 122 | 123 | function initButton() { 124 | $('#reset-btn').click(function () { 125 | option.clear(); 126 | initOptions(); 127 | initInput(); 128 | }); 129 | 130 | $('button').each(function () { 131 | let button = $(this); 132 | let val_enabled = button.data('enabled-key') || ''; 133 | let save_keys = button.data('save-keys'); 134 | let success_msg = button.data('success-msg'); 135 | 136 | if (val_enabled != '') { 137 | button.on('change-enable', function (event, val) { 138 | console.log(val); 139 | button.prop('disabled', !(val)); 140 | }); 141 | 142 | button.prop('disabled', $(`input[data-key=${val_enabled}]`).prop('disabled') || 143 | !option.getBool(val_enabled, 144 | $(`input[data-key=${val_enabled}]`).data('data-checked'))); 145 | } 146 | 147 | if (save_keys === undefined || 148 | success_msg === undefined) { 149 | return true; 150 | } 151 | 152 | try { 153 | save_keys = save_keys.split(','); 154 | success_msg = $(success_msg); 155 | } catch (e) {} 156 | 157 | success_msg.removeClass('in'); 158 | 159 | button.click(function () { 160 | success_msg.addClass('in'); 161 | 162 | setTimeout(function () { 163 | success_msg.removeClass('in'); 164 | }, 2000); 165 | 166 | save_keys.forEach(function (key) { 167 | $(`input[data-key=${key}]`).trigger('save'); 168 | }); 169 | }); 170 | }); 171 | } 172 | 173 | $(document).ready(function () { 174 | initVersion(); 175 | 176 | option.init() 177 | .then(function () { 178 | initOptions(); 179 | initInput(); 180 | initButton(); 181 | }); 182 | }); 183 | }(window, document, $)); 184 | -------------------------------------------------------------------------------- /content_script/page/core_course.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Electsys++ Project 3 | * ---------------------------- 4 | * 核心课程成绩优化模块 5 | */ 6 | 7 | /** 8 | * 样式表 9 | */ 10 | const core_course_css = ` 11 | 41 | `; 42 | 43 | /** 44 | * 核心课程优化入口 45 | */ 46 | function optimize_core_course() { 47 | if (!inUrl('/edu/student/CoreCourses.aspx') || 48 | !option.getBool('optimize_core_course', true)) { 49 | return; 50 | } 51 | 52 | // 插入样式表 53 | core_course_insert_css(); 54 | 55 | // 添加 GPA 列 56 | let course_list = core_course_append_gpa(); 57 | 58 | // 启用筛选 59 | core_course_enable_select(course_list); 60 | } 61 | 62 | /** 63 | * 添加核心课程 CSS 64 | */ 65 | function core_course_insert_css() { 66 | jQuery('body').append(core_course_css); 67 | } 68 | 69 | /** 70 | * 添加核心课程的 GPA 显示 71 | * @return array 核心课程数组 72 | */ 73 | function core_course_append_gpa() { 74 | let table = core_course_get_table(); 75 | if (!table) { 76 | return []; 77 | } 78 | 79 | let course_list = []; 80 | 81 | // 遍历所有行 82 | table.find('tr').each(function () { 83 | let row = jQuery(this); 84 | let row_info = core_course_parse_row(row); 85 | 86 | // 表头 87 | if (row_info.is_head) { 88 | row.append('绩点'); 89 | row.attr('data-electsys-id', row_info.id); 90 | return true; 91 | } 92 | 93 | // 成绩行 94 | if (row_info.id > 0) { 95 | course_list[row_info.id] = row_info; 96 | row.append('' + row_info.gpa.toFixed(1) + ''); 97 | row.attr('data-electsys-id', row_info.id); 98 | return true; 99 | } 100 | }); 101 | 102 | return course_list; 103 | } 104 | 105 | /** 106 | * 获取核心课程所在的表格 107 | */ 108 | function core_course_get_table() { 109 | let table = jQuery('table#dgSet'); 110 | return table.length > 0 ? table : null; 111 | } 112 | 113 | /** 114 | * 解析一行课程数据 115 | * @return object 课程数据 116 | */ 117 | function core_course_parse_row(row) { 118 | // 初始化 119 | let row_info = { 120 | is_head: false, 121 | is_selected: false, 122 | id: 0, 123 | course_id: '', 124 | score: 0, 125 | credit: 0, 126 | gpa: 0 127 | }; 128 | 129 | let columns = row.children('td'); 130 | 131 | // 判断是否为表头 132 | if (columns.length == 0 || !columns.first().text().match(/\d+/)) { 133 | row_info.is_head = true; 134 | return row_info; 135 | } 136 | 137 | // 解析数据 138 | row_info.id = columns.eq(0).text() - 0; 139 | row_info.course_id = columns.eq(-3).text().trim(); 140 | row_info.score = score_fix(columns.eq(-2).text().trim()); // 使用 score_fix 转换等第成绩 141 | row_info.credit = columns.eq(-1).text() - 0; 142 | 143 | // P 和 F 等其他等第不列入计算 144 | if (isNaN(row_info.score - 0)) { 145 | row_info.credit = 0; 146 | } 147 | 148 | // 计算 GPA 149 | row_info.gpa = score2gpa(row_info.score); 150 | 151 | return row_info; 152 | } 153 | 154 | /** 155 | * 启用筛选功能 156 | * @param course_list 课程数组 157 | */ 158 | function core_course_enable_select(course_list) { 159 | let table = core_course_get_table(); 160 | if (!table) { 161 | return; 162 | } 163 | 164 | // 插入结果栏 165 | let tipTemplate = ` 166 |
167 | 选中课程GPA:0.00 168 | 选中课程学积分:0.00分 169 | 全选 170 |
171 | `; 172 | table.before(tipTemplate); 173 | 174 | // 遍历所有行 175 | table.find('tr[data-electsys-id!=0]') 176 | .css('background-color', '') // 移除默认背景颜色 177 | .addClass('electsys-course') // 添加自定义样式类 178 | .click(function () { 179 | let row = jQuery(this); 180 | core_course_select_one(course_list, row); 181 | }); 182 | 183 | // 处理全选按钮 184 | jQuery('#electsys-select-all').click(function () { 185 | let select_value = jQuery(this).text() == '全选'; 186 | core_course_select_all(course_list, select_value); 187 | return false; 188 | }); 189 | } 190 | 191 | /** 192 | * 选中单行课程 193 | * @param course_list 课程列表 194 | * @param row 当前行 195 | */ 196 | function core_course_select_one(course_list, row) { 197 | let row_id = row.attr('data-electsys-id') - 0; 198 | if (row_id <= 0) { 199 | return; 200 | } 201 | 202 | // 更新状态 203 | let is_selected = !(course_list[row_id].is_selected); 204 | course_list[row_id].is_selected = is_selected; 205 | core_course_update_color(row, is_selected); 206 | 207 | // 更新分数 208 | core_course_update_score(course_list); 209 | } 210 | 211 | /** 212 | * 选中所有课程 213 | * @param course_list 课程列表 214 | * @param select_value 全选 (true) 还是全不选 (false) 215 | */ 216 | function core_course_select_all(course_list, select_value) { 217 | let table = core_course_get_table(); 218 | if (!table) { 219 | return; 220 | } 221 | 222 | table.find('tr[data-electsys-id!=0]') 223 | .each(function () { 224 | let row = jQuery(this); 225 | let row_id = row.attr('data-electsys-id') - 0; 226 | 227 | course_list[row_id].is_selected = select_value; 228 | core_course_update_color(row, select_value); 229 | }); 230 | 231 | core_course_update_score(course_list); 232 | } 233 | 234 | /** 235 | * 更新当前行颜色 236 | * @param row 当前行 237 | * @param is_selected 当前行是否选中 238 | */ 239 | function core_course_update_color(row, is_selected) { 240 | let row_id = row.attr('data-electsys-id') - 0; 241 | if (row_id <= 0) { 242 | return; 243 | } 244 | 245 | row.removeClass('selected'); 246 | if (is_selected) { 247 | row.addClass('selected'); 248 | } 249 | } 250 | 251 | /** 252 | * 更新分数 253 | * @param course_list 课程列表 254 | */ 255 | function core_course_update_score(course_list) { 256 | let total_credit = 0; 257 | let total_gpa = 0; 258 | let total_score = 0; 259 | let selected_count = 0; 260 | 261 | course_list.forEach(function (course) { 262 | if (course.is_selected) { 263 | ++selected_count; 264 | total_credit += course.credit; 265 | total_gpa += course.gpa * course.credit; 266 | total_score += course.score * course.credit; 267 | } 268 | }); 269 | 270 | // 避免被零除 271 | total_credit = Math.max(0.5, total_credit); 272 | 273 | // 计算结果并显示 274 | let average_gpa = total_gpa / total_credit; 275 | let average_score = total_score / total_credit; 276 | 277 | jQuery('#electsys-gpa').text(average_gpa.toFixed(2)); 278 | jQuery('#electsys-score').text(average_score.toFixed(2)); 279 | 280 | // 更新按钮文字 281 | jQuery('#electsys-select-all').text(selected_count > 0 ? '全不选' : '全选'); 282 | } 283 | -------------------------------------------------------------------------------- /content_script/page/score.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Electsys++ Project 3 | * ---------------------------- 4 | * 成绩查询优化模块 5 | */ 6 | 7 | /** 8 | * 样式表 9 | */ 10 | const score_css = ` 11 | 47 | `; 48 | 49 | function optimize_score_query() { 50 | if(!inUrl("/edu/StudentScore/B_StudentScoreQuery.aspx") || 51 | !option.getBool('optimize_score', true)) 52 | return; 53 | 54 | // 更新下拉框学期 55 | score_update_semester(); 56 | 57 | // 没有成绩时返回 58 | if (!score_has_result_table()) 59 | return; 60 | 61 | // 插入样式表 62 | score_insert_css(); 63 | 64 | // 解析数据 65 | let course_list = score_scan_gpa(); 66 | 67 | // 启用筛选 68 | score_enable_select(course_list); 69 | } 70 | 71 | function score_update_semester() { 72 | if (jQuery("#ddlXN").val() == "2010-2011" && jQuery("#ddlXQ").val() == "1" && !score_has_result_table()) { 73 | jQuery("#ddlXQ").find("[selected=selected]").prop("selected", false); 74 | jQuery("#ddlXN").find("[selected=selected]").prop("selected", false); 75 | 76 | jQuery("#ddlXN").find("option[value=" + opscore_year + "]").prop("selected", true); 77 | jQuery("#ddlXQ").find("option[value=" + opscore_semester + "]").prop("selected", true); 78 | } 79 | } 80 | 81 | function score_has_result_table() { 82 | return jQuery("span#lblTitle").text().length > 1; 83 | } 84 | 85 | /** 86 | * 添加 CSS 87 | */ 88 | function score_insert_css() { 89 | jQuery('body').append(score_css); 90 | } 91 | 92 | /** 93 | * 读取课程数据 94 | * @return array 课程数组 95 | */ 96 | function score_scan_gpa() { 97 | let table = score_get_table(); 98 | if (!table) { 99 | return []; 100 | } 101 | 102 | let course_list = []; 103 | let course_index = 0; 104 | 105 | // 遍历所有行 106 | table.find('tr') 107 | .css("height", "25px") 108 | .each(function () { 109 | let row = jQuery(this); 110 | let row_info = score_parse_row(row); 111 | 112 | // 表头 113 | if (row_info.is_head) { 114 | row.attr('data-electsys-id', 0); 115 | return true; 116 | } 117 | 118 | // 成绩行 119 | if (row_info.credit > 0) { 120 | ++course_index; 121 | course_list[course_index] = row_info; 122 | row.attr('data-electsys-id', course_index); 123 | row.addClass((row_info.percent_score < 60 ? 'failed' : 'passed')); 124 | return true; 125 | } 126 | }); 127 | 128 | return course_list; 129 | } 130 | 131 | /** 132 | * 获取课程所在的表格 133 | */ 134 | function score_get_table() { 135 | let table = jQuery('table#dgScore'); 136 | return table.length > 0 ? table : null; 137 | } 138 | 139 | /** 140 | * 解析一行课程数据 141 | * @return object 课程数据 142 | */ 143 | function score_parse_row(row) { 144 | // 初始化 145 | let row_info = { 146 | is_head: false, 147 | is_selected: false, 148 | is_final: false, 149 | course_id: '', 150 | score: 0, 151 | full_score: 100, 152 | percent_score: 0, 153 | credit: 0, 154 | gpa: 0 155 | }; 156 | 157 | let columns = row.children('td'); 158 | 159 | // 判断是否为表头 160 | if (columns.length == 0 || row.hasClass('tdtit')) { 161 | row_info.is_head = true; 162 | return row_info; 163 | } 164 | 165 | // 解析数据 166 | row_info.course_id = columns.eq(0).text().trim(); 167 | row_info.credit = columns.eq(2).text() - 0; 168 | row_info.score = columns.eq(3).text(); 169 | row_info.full_score = columns.eq(5).text().replace(/分/, '') - 0; 170 | row_info.is_final = columns.eq(6).text().trim() == '是'; 171 | 172 | // 无效数据不列入计算 173 | if (isNaN(row_info.full_score)) { 174 | row_info.score = 0; 175 | row_info.full_score = 100; 176 | row_info.credit = 0; 177 | } 178 | 179 | // 修正等第制成绩(包括 P 项) 180 | if (isNaN(row_info.score)) { 181 | row_info.score = score_fix(row_info.score, true) * row_info.full_score / 100; 182 | 183 | // 无效数据不列入计算 184 | if (isNaN(row_info.score - 0)) { 185 | row_info.score = 0; 186 | row_info.credit = 0; 187 | } 188 | } 189 | 190 | // 计算百分制成绩和 GPA 191 | row_info.percent_score = row_info.score * 100 / row_info.full_score; 192 | row_info.gpa = score2gpa(row_info.percent_score); 193 | 194 | return row_info; 195 | } 196 | 197 | /** 198 | * 启用筛选功能 199 | * @param course_list 课程数组 200 | */ 201 | function score_enable_select(course_list) { 202 | let table = score_get_table(); 203 | if (!table) { 204 | return; 205 | } 206 | 207 | // 插入结果栏 208 | let tipTemplate = ` 209 |
210 | 选中课程平均成绩:0.00分   211 | 选中课程GPA:0.00 212 | 全选 213 |
214 | `; 215 | table.before(tipTemplate); 216 | 217 | // 遍历所有行 218 | table.find('tr[data-electsys-id!=0]') 219 | .addClass('electsys-course') // 添加自定义样式类 220 | .click(function () { 221 | let row = jQuery(this); 222 | score_select_one(course_list, row); 223 | }); 224 | 225 | // 处理全选按钮 226 | jQuery('#electsys-select-all').click(function () { 227 | let select_value = jQuery(this).text() == '全选'; 228 | score_select_all(course_list, select_value); 229 | return false; 230 | }); 231 | } 232 | 233 | /** 234 | * 选中单行课程 235 | * @param course_list 课程列表 236 | * @param row 当前行 237 | */ 238 | function score_select_one(course_list, row) { 239 | let row_id = row.attr('data-electsys-id') - 0; 240 | if (row_id <= 0) { 241 | return; 242 | } 243 | 244 | // 更新状态 245 | let is_selected = !(course_list[row_id].is_selected); 246 | course_list[row_id].is_selected = is_selected; 247 | score_update_color(row, is_selected); 248 | 249 | // 更新分数 250 | score_update_score(course_list); 251 | } 252 | 253 | /** 254 | * 选中所有课程 255 | * @param course_list 课程列表 256 | * @param select_value 全选 (true) 还是全不选 (false) 257 | */ 258 | function score_select_all(course_list, select_value) { 259 | let table = score_get_table(); 260 | if (!table) { 261 | return; 262 | } 263 | 264 | table.find('tr[data-electsys-id!=0]') 265 | .each(function () { 266 | let row = jQuery(this); 267 | let row_id = row.attr('data-electsys-id') - 0; 268 | 269 | course_list[row_id].is_selected = select_value; 270 | score_update_color(row, select_value); 271 | }); 272 | 273 | score_update_score(course_list); 274 | } 275 | 276 | /** 277 | * 更新当前行颜色 278 | * @param row 当前行 279 | * @param is_selected 当前行是否选中 280 | */ 281 | function score_update_color(row, is_selected) { 282 | let row_id = row.attr('data-electsys-id') - 0; 283 | if (row_id <= 0) { 284 | return; 285 | } 286 | 287 | row.removeClass('selected'); 288 | if (is_selected) { 289 | row.addClass('selected'); 290 | } 291 | } 292 | 293 | /** 294 | * 更新分数 295 | * @param course_list 课程列表 296 | */ 297 | function score_update_score(course_list) { 298 | let total_credit = 0; 299 | let total_gpa = 0; 300 | let total_score = 0; 301 | let selected_count = 0; 302 | 303 | course_list.forEach(function (course) { 304 | if (course.is_selected && course.is_final) { 305 | ++selected_count; 306 | total_credit += course.credit; 307 | total_gpa += course.gpa * course.credit; 308 | total_score += course.percent_score * course.credit; 309 | } 310 | }); 311 | 312 | // 避免被零除 313 | total_credit = Math.max(0.5, total_credit); 314 | 315 | // 计算结果并显示 316 | let average_gpa = total_gpa / total_credit; 317 | let average_score = total_score / total_credit; 318 | 319 | jQuery('#electsys-gpa').text(average_gpa.toFixed(2)); 320 | jQuery('#electsys-score').text(average_score.toFixed(2)); 321 | 322 | // 更新按钮文字 323 | jQuery('#electsys-select-all').text(selected_count > 0 ? '全不选' : '全选'); 324 | } 325 | -------------------------------------------------------------------------------- /content_script/page/eval.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Electsys++ Project 3 | * ---------------------------- 4 | * 评教优化模块 5 | */ 6 | 7 | // 快速评教,不用蛋疼点下一步了~ 8 | function fast_eval_index () { 9 | if (!inUrl("/edu/N10_pingjiao/N4_pingjiaoXKLB.aspx")) 10 | return; 11 | 12 | var eval_table = jQuery("table").slice(3,4).find("table"); 13 | var trs = eval_table.find("tr"); 14 | for (var i = 1; i < trs.length; i++) { 15 | trs.slice(i,i+1).children().slice(2,3).css("width","120px"); 16 | var alink = trs.slice(i,i+1).children().slice(2,3).children().clone(true); 17 | 18 | alink.text("快速评教"); 19 | alink.css("margin-left","1em"); 20 | alink.attr("href",alink.attr("href") + "#laohyx_fast_eval"); 21 | trs.slice(i,i+1).children().slice(2,3).append(alink); 22 | }; 23 | } 24 | 25 | function fast_eval_process () { 26 | if(!inUrl("#laohyx_fast_eval")) 27 | return; 28 | if (!inUrl("/edu/N10_pingjiao/N4_pingjiao.aspx")) 29 | return; 30 | patch_fix_dom_element(); 31 | 32 | //增加分数联动功能 33 | jQuery("#sBoundControl_1_1").parent().css("width","120px"); 34 | jQuery("#sBoundControl_1_1").parent().append('分数联动'); 35 | 36 | 37 | document.intervalID = setInterval(function(){ 38 | if(jQuery('.ui-label').text() == "100%"){ 39 | clearInterval(document.intervalID); 40 | jQuery("#sText_1_1_railElement").mouseup(function(){ 41 | document.intervalID = setInterval(()=>{ 42 | clearInterval(document.intervalID); 43 | jQuery("#sBoundControl_1_1").trigger("change"); 44 | },10) 45 | //jQuery("#sBoundControl_1_1").trigger("change"); 46 | }); 47 | jQuery("#sBoundControl_1_1").on('change', function(){ 48 | var first_eval = jQuery(this).val(); 49 | fast_eval_interlock(first_eval); 50 | }); 51 | } 52 | 53 | //显示全部表单 54 | jQuery("input").removeAttr("disabled"); 55 | areaSelector = "#t1,#t2,#t3"; 56 | areas = jQuery(areaSelector); 57 | heads = areas.prev(); 58 | areas.children("tbody").children("tr").show(); 59 | heads.show(); 60 | areas.show(); 61 | jQuery(".ui-progress").animate({width: '100%'}, 62 | {duration: 500,easing: 'swing'}); 63 | jQuery(".ui-progress").children().text("100%"); 64 | },300); 65 | } 66 | 67 | function fast_eval_interlock(eval_num){ 68 | console.log(jQuery("#fast_eval_interlock").prop("checked")); 69 | if(!jQuery("#fast_eval_interlock").prop("checked")) 70 | return; 71 | var eval1 = parseInt(eval_num); 72 | var eval2 = Math.round(eval1 / 10); 73 | jQuery("#sText_1_2").val(eval1); 74 | jQuery("#sText_1_3").val(eval1); 75 | jQuery("#sText_2_1").val(eval2); 76 | jQuery("#sText_2_2").val(eval2); 77 | jQuery("#sText_2_3").val(eval2); 78 | jQuery("#sText_2_4").val(eval2); 79 | jQuery("#sText_2_5").val(eval2); 80 | jQuery("#sText_2_6").val(eval2); 81 | jQuery("#sText_2_7").val(eval2); 82 | jQuery("#sText_2_8").val(eval2); 83 | jQuery("#sText_2_9").val(eval2); 84 | jQuery("#sText_2_10").val(eval2); 85 | 86 | jQuery("#sBoundControl_1_2").val(eval1); 87 | jQuery("#sBoundControl_1_3").val(eval1); 88 | jQuery("#sBoundControl_2_1").val(eval2); 89 | jQuery("#sBoundControl_2_2").val(eval2); 90 | jQuery("#sBoundControl_2_3").val(eval2); 91 | jQuery("#sBoundControl_2_4").val(eval2); 92 | jQuery("#sBoundControl_2_5").val(eval2); 93 | jQuery("#sBoundControl_2_6").val(eval2); 94 | jQuery("#sBoundControl_2_7").val(eval2); 95 | jQuery("#sBoundControl_2_8").val(eval2); 96 | jQuery("#sBoundControl_2_9").val(eval2); 97 | jQuery("#sBoundControl_2_10").val(eval2); 98 | 99 | var width1 = Number(jQuery("#sText_1_2_handleImage").parent().parent().css("width").slice(0,-2)); 100 | var width2 = Number(jQuery("#sText_2_1_handleImage").parent().parent().css("width").slice(0,-2)); 101 | 102 | eval1 = Math.min(100, eval1 + 1); 103 | eval2 = Math.min(10, eval2 + 1); 104 | jQuery("#sText_1_2_handleImage").parent().css("left",eval1 / 101 * width1 + "px"); 105 | jQuery("#sText_1_3_handleImage").parent().css("left",eval1 / 101 * width1 + "px"); 106 | jQuery("#sText_2_1_handleImage").parent().css("left",eval2 / 11 * width2 + "px"); 107 | jQuery("#sText_2_2_handleImage").parent().css("left",eval2 / 11 * width2 + "px"); 108 | jQuery("#sText_2_3_handleImage").parent().css("left",eval2 / 11 * width2 + "px"); 109 | jQuery("#sText_2_4_handleImage").parent().css("left",eval2 / 11 * width2 + "px"); 110 | jQuery("#sText_2_5_handleImage").parent().css("left",eval2 / 11 * width2 + "px"); 111 | jQuery("#sText_2_6_handleImage").parent().css("left",eval2 / 11 * width2 + "px"); 112 | jQuery("#sText_2_7_handleImage").parent().css("left",eval2 / 11 * width2 + "px"); 113 | jQuery("#sText_2_8_handleImage").parent().css("left",eval2 / 11 * width2 + "px"); 114 | jQuery("#sText_2_9_handleImage").parent().css("left",eval2 / 11 * width2 + "px"); 115 | jQuery("#sText_2_10_handleImage").parent().css("left",eval2 / 11 * width2 + "px"); 116 | 117 | 118 | 119 | } 120 | 121 | 122 | 123 | // 快速评教 for 期中 124 | function fast_eval_midterm_index () { 125 | if (!inUrl("/edu/N10_pingjiao/Midterm_pingjiaoXKLB.aspx")) 126 | return; 127 | console.log("midterm"); 128 | var eval_table = jQuery("table").slice(3,4).find("table"); 129 | var trs = eval_table.find("tr"); 130 | for (var i = 1; i < trs.length; i++) { 131 | trs.slice(i,i+1).children().slice(2,3).css("width","120px"); 132 | var alink = trs.slice(i,i+1).children().slice(2,3).children().clone(true); 133 | 134 | alink.text("快速评教"); 135 | alink.css("margin-left","1em"); 136 | alink.attr("href",alink.attr("href") + "#laohyx_fast_eval"); 137 | trs.slice(i,i+1).children().slice(2,3).append(alink); 138 | }; 139 | } 140 | 141 | 142 | function fast_eval_midterm_process () { 143 | if(!inUrl("#laohyx_fast_eval")) 144 | return; 145 | if (!inUrl("/edu/N10_pingjiao/Midterm_pingjiao.aspx")) 146 | return; 147 | 148 | //增加分数联动功能 149 | jQuery("#sBoundControl_2_1").parent().css("width","120px"); 150 | jQuery("#sBoundControl_2_1").parent().append('分数联动'); 151 | 152 | console.log("midterm_process"); 153 | 154 | document.intervalID = setInterval(function(){ 155 | console.log("not readey"); 156 | if(jQuery("#sText_2_1_railElement").length == 1){ 157 | clearInterval(document.intervalID); 158 | console.log("clear"); 159 | jQuery("#sText_2_1_railElement").click(function(){ 160 | jQuery("#sBoundControl_2_1").trigger("change"); 161 | }); 162 | 163 | jQuery("#sBoundControl_2_1").on('change', function(){ 164 | var first_eval = jQuery(this).val(); 165 | fast_eval_midterm_interlock(first_eval); 166 | }); 167 | 168 | } 169 | 170 | },300); 171 | 172 | 173 | } 174 | 175 | 176 | function fast_eval_midterm_interlock(eval_num){ 177 | console.log(jQuery("#fast_eval_interlock").prop("checked")); 178 | if(!jQuery("#fast_eval_interlock").prop("checked")) 179 | return; 180 | var eval1 = eval_num; 181 | var eval2 = Math.max(0, Math.round(eval1)); 182 | jQuery("#sText_2_2").val(eval2); 183 | jQuery("#sText_2_3").val(eval2); 184 | jQuery("#sText_2_4").val(eval2); 185 | jQuery("#sText_2_5").val(eval2); 186 | jQuery("#sText_2_6").val(eval2); 187 | jQuery("#sText_2_7").val(eval2); 188 | jQuery("#sText_2_8").val(eval2); 189 | jQuery("#sText_2_9").val(eval2); 190 | jQuery("#sText_2_10").val(eval2); 191 | 192 | jQuery("#sBoundControl_2_2").val(eval2); 193 | jQuery("#sBoundControl_2_3").val(eval2); 194 | jQuery("#sBoundControl_2_4").val(eval2); 195 | jQuery("#sBoundControl_2_5").val(eval2); 196 | jQuery("#sBoundControl_2_6").val(eval2); 197 | jQuery("#sBoundControl_2_7").val(eval2); 198 | jQuery("#sBoundControl_2_8").val(eval2); 199 | jQuery("#sBoundControl_2_9").val(eval2); 200 | jQuery("#sBoundControl_2_10").val(eval2); 201 | var width2 = Number(jQuery("#sText_2_1_handleImage").parent().parent().css("width").slice(0,-2)); 202 | 203 | eval2 = Math.min(10, eval2 + 1); 204 | jQuery("#sText_2_2_handleImage").parent().css("left",eval2 / 11 * width2 + "px"); 205 | jQuery("#sText_2_3_handleImage").parent().css("left",eval2 / 11 * width2 + "px"); 206 | jQuery("#sText_2_4_handleImage").parent().css("left",eval2 / 11 * width2 + "px"); 207 | jQuery("#sText_2_5_handleImage").parent().css("left",eval2 / 11 * width2 + "px"); 208 | jQuery("#sText_2_6_handleImage").parent().css("left",eval2 / 11 * width2 + "px"); 209 | jQuery("#sText_2_7_handleImage").parent().css("left",eval2 / 11 * width2 + "px"); 210 | jQuery("#sText_2_8_handleImage").parent().css("left",eval2 / 11 * width2 + "px"); 211 | jQuery("#sText_2_9_handleImage").parent().css("left",eval2 / 11 * width2 + "px"); 212 | jQuery("#sText_2_10_handleImage").parent().css("left",eval2 / 11 * width2 + "px"); 213 | 214 | 215 | 216 | } 217 | -------------------------------------------------------------------------------- /content_script/page/frame.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Electsys++ Project 3 | * ---------------------------- 4 | * 布局细节优化模块 5 | * 优化选课网细节部分 6 | * 上栏,左边栏等 7 | */ 8 | 9 | const frame_css = ` 10 | 111 | `; 112 | 113 | const ad_tmpl = ` 114 |
115 | %ad% 116 |
117 | 118 |
119 |
120 | `; 121 | 122 | //左边的滚动条 123 | function set_left_scroll() { 124 | /* if (!inUrl('/edu/student/sdtMain.aspx')) 125 | return 0; 126 | 127 | 128 | frameset1 = jQuery('frameset')[0]; 129 | frameset2 = jQuery('frameset',frameset1)[0]; 130 | frameset2.outerHTML = ''; 131 | */ 132 | } 133 | function optimize_sdtleft() { 134 | if (!inUrl('/edu/student/sdtleft.aspx')) 135 | return 0; 136 | 137 | //增加查询绩点 138 | if (option.getBool('enable_gpa_query', true)) { 139 | var score_line = jQuery('td[colspan=2]').slice(8, 9).parent(); 140 | var append_string = ` 141 | 142 | 143 | 144 | 145 | 146 | 查询绩点 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | `; 155 | score_line.after(jQuery(append_string)); 156 | } 157 | 158 | //分享到人人 159 | var last_line = jQuery('td[colspan=2]').slice(1, 2).parent(); 160 | var line_string = ` 161 | 162 | 163 | `; 164 | var share_link = ` 165 | 166 | 167 | 168 | 169 | 170 |
171 | 我爱选课 172 |
173 | 174 | `; 175 | last_line.after(jQuery(share_link + line_string)); 176 | 177 | 178 | /* 179 | //可展开、折叠 180 | var toggle_links = jQuery('a[href=#]'); 181 | var KB = {}; 182 | var KB_name = ''; 183 | for(x = 0; x < toggle_links.length; x++){ 184 | KB_name = toggle_links.slice(x,x+1).attr('onclick').substr(10,3); 185 | KB[KB_name] = 0; 186 | toggle_links.slice(x,x+1).click(function(){ 187 | var KB_name = jQuery(this).attr('onclick').substr(10,3); 188 | jQuery('div#' + KB_name + 'Child').slideToggle('fast'); 189 | }); 190 | } 191 | //预先折叠几个。。。 192 | 193 | jQuery('div#KB2Child').slideToggle(0); 194 | jQuery('div#KB3Child').slideToggle(0); 195 | jQuery('div#KB4Child').slideToggle(0); 196 | jQuery('div#KB7Child').slideToggle(0); 197 | jQuery('div#KB5Child').slideToggle(0); 198 | */ 199 | } 200 | 201 | function optimize_flattop_content() { 202 | if (!inUrl('/edu/include/flattop.htm')) 203 | return 0; 204 | } 205 | 206 | function optimize_flattop() { 207 | if (!inUrl('/edu/student/sdtMain.aspx')) 208 | return 0; 209 | 210 | // 插入 CSS 211 | jQuery('html').append(frame_css); 212 | 213 | let ad = {}, now = new Date(); 214 | if ((ad = option.get('ad')) != null && 215 | new Date(ad.start_time) <= now && 216 | new Date(ad.end_time) >= now) { 217 | if (option.getBool('show_ad', true)) { 218 | jQuery('html').append( 219 | ad_tmpl.replace(/%ad%/, ad.content) 220 | .replace(/%pic%/, ad.image) 221 | .replace(/%url%/, ad.url) 222 | ); 223 | } 224 | 225 | var optimize_flattop_fixed_div = jQuery( 226 | `
隐藏/显示推荐
`); 227 | jQuery('html').append(optimize_flattop_fixed_div); 228 | } 229 | 230 | fetch_latest_ad(); 231 | 232 | var optimize_bottom_fixed_div = jQuery(` 233 |
234 | Optimized by electsys++ ${option.get('extension_version')} - 235 | electsys++ Project 236 |
`); 237 | jQuery('html').append(optimize_bottom_fixed_div); 238 | jQuery('#optimize_bottom_fixed_div').click(function () { 239 | jQuery(this).hide(); 240 | }); 241 | 242 | jQuery('#optimize_flattop_fixed_div').click(function () { 243 | option.set('show_ad', !option.getBool('show_ad', true)); 244 | window.location.reload(); 245 | }); 246 | } 247 | 248 | function fetch_latest_ad() { 249 | let update_time = new Date(option.get('ad_update_time')); 250 | if (update_time >= new Date()) { 251 | return; 252 | } 253 | 254 | let old_ad = option.get('ad', {id: 0}); 255 | 256 | // 1 day 257 | const update_cycle = 24 * 3600 * 1000; 258 | 259 | jQuery.getJSON('https://raw.githubusercontent.com/laohyx/electsys/master/recommend.json') 260 | .then(function (data) { 261 | option.set('ad', data); 262 | if (old_ad.id != data.id) { 263 | option.set('show_ad', true); 264 | } 265 | }) 266 | .always(function () { 267 | update_time = new Date(Date.now() + update_cycle); 268 | option.set('ad_update_time', update_time.toISOString()); 269 | }); 270 | } 271 | 272 | /* 273 | function flattopToggle(){ 274 | theta = 0; 275 | } 276 | 277 | function optimize_flattop(){ 278 | if (!inUrl("/edu/student/sdtMain.aspx")) 279 | return 0; 280 | var optimize_flattop_fixed_div = jQuery('
展开/收起上栏
'); 281 | jQuery("html").append(optimize_flattop_fixed_div); 282 | 283 | var optimize_bottom_fixed_div = jQuery('
Optimized by electsys++ ' + localStorage['extension_version'] + ' - electsys++ Project
'); 284 | jQuery("html").append(optimize_bottom_fixed_div); 285 | jQuery("#optimize_bottom_fixed_div").click(function(){ 286 | jQuery(this).hide(); 287 | }); 288 | 289 | if (localStorage["flattop_slide"] < 0){ 290 | jQuery("frameset").slice(0,1).attr("rows", "25,*"); 291 | jQuery("#optimize_flattop_fixed_div").css("top","0"); 292 | }else{ 293 | localStorage["flattop_slide"] = 1; 294 | } 295 | jQuery("#optimize_flattop_fixed_div").click(function(){ 296 | flattopToggle(500); 297 | localStorage["flattop_slide"] *= -1; 298 | }); 299 | } 300 | 301 | function flattopToggle(time){ 302 | theta = 0; 303 | if(jQuery("frameset").slice(0,1).attr("rows") == "105,*") 304 | { 305 | slide_id = setInterval("slide_flattop(-1);",time / 100); 306 | }else{ 307 | slide_id = setInterval("slide_flattop(1);",time / 100); 308 | } 309 | 310 | } 311 | function slide_flattop(height_direction){ 312 | delta_h = Math.sin((theta - 0.5) * Math.PI) * (40 * height_direction) + 65; 313 | theta += 0.01; 314 | jQuery("#optimize_flattop_fixed_div").css("top",delta_h - 25); 315 | jQuery("frameset").slice(0,1).attr("rows", delta_h + ",*"); 316 | if(theta > 0.98) 317 | { 318 | jQuery("#optimize_flattop_fixed_div").css("top",40 + 40 * height_direction); 319 | jQuery("frameset").slice(0,1).attr("rows", 65 + 40 * height_direction + ",*"); 320 | clearInterval(slide_id); 321 | } 322 | } 323 | */ -------------------------------------------------------------------------------- /content_script/page/nhce.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Electsys++ Project 3 | * ---------------------------- 4 | * nhce 辅助模块 5 | * For 苏文. 2012/06/04 6 | */ 7 | 8 | function nhce_main(){ 9 | if (!inUrl("202.120.59.230")) 10 | return 0; 11 | 12 | 13 | answer03 = {"1": {"1": ["C", "D", "A", "D", "B", "A", "D", "C", "A", "B"], "2": ["A", "C", "B", "B", "D"], "3": ["B", "A", "C", "C", "C"], "4": ["a journalism degree", "pretty good", "about what she has", "you just want more", "protective of his family"], "5": ["C", "C", "A", "D", "B"], "6": ["A", "C", "D", "C", "D"], "7": ["slice", "misunderstandings", "beautiful", "benefits", "wellness", "range", "explicit", "has been tracking more than a million subjects since 1979", "have fewer heart attacks and lower cancer rates", "a strong sense of connection to others and in satisfying relationship"]}, "2": {"1": ["C", "C", "B", "A", "D", "B", "C", "D", "A", "A"], "2": ["D", "C", "A", "B", "A"], "3": ["B", "D", "D", "C", "A"], "4": ["the quality of school menus", "moving into the neighbourhood", "eats fast food", "the Chicago study", "children's eating habits"], "5": ["A", "B", "C", "D", "B"], "6": ["A", "B", "D", "C", "D"], "7": ["advancements", "physical", "depression", "condition", "mentioned", "admit", "combat", "high-fiber and vitamin-rich foods, such as vegetables and fruits", "should give up smoking if they haven't already done so", "No section of the population can benefit from exercise."]}, "3": {"1": ["D", "C", "B", "C", "C", "B", "A", "C", "B", "A"], "2": ["B", "C", "A", "B", "D"], "3": ["A", "B", "A", "C", "A"], "4": ["is studying for a doctorate in religion", "is marked by chance encounters", "only knew a little Italian", "was attacked by an intruder in her home", "began to live a life with vivid moments"], "5": ["C", "D", "D", "A", "B"], "6": ["B", "B", "C", "D", "B"], "7": ["experience", "indicate", "distinguish", "Successful", "long-term", "achievements", "follow", "unsuccessful people just let life happen by accident", "and they aren't difficult for people to attain", "what to go after and in what direction to aim your life"]}, "4": {"1": ["B", "B", "C", "D", "A", "B", "D", "C", "D", "A"], "2": ["C", "D", "B", "B", "A"], "3": ["B", "A", "D", "D", "B"], "4": ["for decades", "healthy and active lifestyle", "meet consumer demands","spur competitiveness"], "5": ["D", "C", "C", "B", "B"], "6": ["C", "A", "B", "D", "B"], "7": ["studios", "counterparts", "emphasize", "innovation", "specialized", "energized", "filmmakers", "They began playing with and contradicting the conversations of Hollywood", "Furthermore, their considerable financial success and crossover into popular culture", "Some people have taken advantage of this rise in popularity"]}, "5": {"1": ["B", "C", "D", "A", "B", "B", "B", "A", "D", "D"], "2": ["B", "C", "D", "D", "A"], "3": ["A", "C", "B", "C", "C"], "4": ["do it at pains", "I love you", "their appearance", "you don't want to answer", "think of her in your heart"], "5": ["D", "A", "A", "B", "C"], "6": ["B", "D", "C", "A", "A"], "7": ["Yet", "elaborated", "outward", "kneel", "embarrassed", "express", "gathered", "but over time, I started to enjoy them more and more", "Now that I've talked to you, I feel ten years younger.", "people shouldn't live their lives always thinking about the past."]}, "6": {"1": ["D", "D", "D", "B", "C", "A", "C", "C", "A", "C"], "2": ["A", "C", "B", "B", "D"], "3": ["C", "D", "C", "D", "A"], "4": ["Islamabad", "a tall Islamabad building", "the Kashmirian Mountains", "a heavily militarized region", "India"], "5": ["A", "B", "C", "D", "A"], "6": ["A", "A", "B", "D", "A"], "7": ["thickness", "frightened", "swallowed", "disappeared", "floods", "revisit", "landslide", "keep us away from mountains the rest of our lives", "something like the Yellowstone earthquake does not happen very often", "few of us will suffer because of such a disaster."]}, "7": {"1": ["C", "A", "C", "B", "D", "A", "B", "B", "A", "C"], "2": ["A", "B", "B", "C", "D"], "3": ["A", "A", "D", "C", "B"], "4": ["The Day to Day", "To try to go after the online music business", "Apple", "It has been negotiating licenses for songs", "Gate's leaving will benefit it"], "5": ["D", "C", "D", "D", "A"], "6": ["D", "C", "B", "C", "A"], "7": ["industry", "option", "preferable", "starve", "blame", "occupations", "force", "But if we admit tradition more than we should", "insist on trying to plot the future by the past", "to accept the help which tradition can bring"]}, "8": {"1": ["B", "D", "C", "A", "A", "A", "C", "C", "A", "B"], "2": ["A", "A", "D", "D", "C"], "3": ["D", "C", "A", "B", "C"], "4": ["human beings", "maternal twins", "genes that cause disease", "manny disease", "an environmental component"], "5": ["B", "C", "B", "C", "D"], "6": ["C", "A", "B", "C", "C"], "7": ["ethics", "prediction", "technique", "adapted", "artificial", "urgent", "inconsistencies", "\"Genetic engineering is very exciting and important technology\"", "but you have to ask fundamental questions before it is too late", "the way the technology is racing far ahead of public understanding"]}, "9": {"1": ["B", "D", "A", "C", "A", "B", "C", "C", "D", "D"], "2": ["A", "B", "D", "C", "D"], "3": ["D", "D", "A", "C", "A"], "4": ["her benefits were fabulous", "really, really tough", "got a part-time job", "on the Internet/online", "lazy"], "5": ["C", "A", "B", "B", "C"], "6": ["D", "C", "C", "C", "B"], "7": ["university", "expect", "marriage", "mature", "exaggerating", "Undergraduates", "candidates", "The answer to whether or not marriage in school should be allowed.", "As for those who are attending universities at an older age.", "the marriage of some undergraduates will inevitably influence other students"]}, "10": {"1": ["A", "B", "B", "C", "D", "A", "B", "D", "C", "D"], "2": ["B", "D", "C", "A", "C"], "3": ["A", "C", "B", "D", "A"], "4": ["in 1776", "They worked together for the same goal", "Fifty years", "No ,he was ailing", "Yes, they did."], "5": ["C", "A", "B", "D", "B"], "6": ["D", "A", "A", "D", "B"], "7": ["organisms", "untreated", "occurences", "agriculture", "encouraged", "administrations", "attributed", "Some things have been done to address this problem", "in an effort to raise the public's awareness of environmental protection", "to punish enterprises that drain untreated wastes into the rivers and oceans"]}}; 14 | 15 | answer04 = {"1": {"1": ["A", "C", "B", "B", "D", "B", "A", "C", "C", "D"], "2": ["A", "B", "A", "C", "B"], "3": ["A", "A", "D", "B", "C"], "4": ["married in St. Paul's Cathedral", "was a guest at the wedding ceremony", "wore a hat with flowers at the wedding", "is remembered as having been naughty", "was one of the designers of the wedding dress"], "5": ["D", "A", "B", "B", "A"], "6": ["C", "A", "B", "B", "A"], "7": ["shortage", "assigned", "centered", "hospitalization", "treatment", "colleague", "decentralized", "There are nurse-managers instead of head-nurses", "decide among themselves who will work what shifts and when", "an equal with other vice presidents of the hospital"]}, "2": {"1": ["D", "D", "D", "C", "B", "A", "A", "B", "C", "D"], "2": ["D", "A", "B", "B", "A"], "3": ["B", "C", "D", "A", "C"], "4": ["C", "A", "A", "C", "D"], "5": ["D", "A", "B", "B", "A"], "6": ["B", "D", "A", "C", "A"], "7": ["sketch", "shadow", "paintings", "abroad", "Europe", "jewels", "exquisite", "pictures of rooms with handsomely dressed people in them", "not just their clothes or the lines of their faces", "but he was far greater than they would ever become"]}, "3": {"1": ["C", "D", "C", "B", "B", "B", "A", "C", "A", "B"], "2": ["A", "B", "D", "C", "B"], "3": ["A", "B", "D", "B", "C"], "4": ["An Australian scientist who won the Nobel Prize.", "The mysterious field of infectious diseases.", "By accident.", "It was probably extremely significant.", "He couldn't handle all that."], "5": ["B", "C", "A", "D", "C"], "6": ["B", "A", "C", "B", "C"], "7": ["September", "retire", "retirement", "reduction", "practical", "pensions", "leisure", "The club arranges discussion groups and handicraft sessions", "a member can attend any course held there free of charge", "the financial section on Mondays and Wednesdays between six and eight p.m."]}, "4": {"1": ["B", "A", "D", "D", "A", "D", "C", "C", "A", "A"], "2": ["C", "B", "B", "B", "C"], "3": ["A", "C", "B", "A", "C"], "4": ["became Bill Gates' greatest contribution", "makes use of Gates' system", "was the plaything of nerds", "became a business tool", "made it a wish to dominate like Bill Gates", "was not fit to comment on upcoming innovation"], "5": ["B", "A", "B", "C", "A"], "6": ["A", "A", "B", "B", "A"], "7": ["fundamental", "dramatically", "majority", "workplace", "self-employed", "breadth", "notions", "its applications in personal computers, digital communications, and factory robots", "still unimagined technology could produce a similar wave of dramatic changes", "will have the greatest advantage and produce the most wealth"]}, "5": {"1": ["A", "D", "D", "D", "B", "C", "D", "C", "A", "D"], "2": ["B", "B", "A", "C", "C"], "3": ["D", "A", "B", "B", "A"], "4": ["how they are turning men off", "an idea in one's head about what the perfect man looks like", "a much younger version of yourself", "more advice on dating and relationships", "burning the perfect man checklist"], "5": ["C", "D", "A", "B", "D"], "6": ["A", "C", "A", "C", "D"], "7": ["emerging", "residents", "participants", "companionship", "soldiers", "isolated", "extraordinary", "who happen to live by themselves die at twice the rate of those live with others", "It's clear that reaching out to others can help our bodies thrive", "only 5 percent of U.S. households consisted of one person living alone"]}, "6": {"1": ["C", "B", "C", "D", "B", "C", "A", "D", "D", "B"], "2": ["A", "B", "C", "C", "D"], "3": ["C", "D", "D", "A", "B"], "4": ["Centennial Olympic Park", "North Cardwell, New Jersey", "Oklahoma City, Oklahoma", "the FBI laboratories", "ground zero", "an Atlanta abortion clinic"], "5": ["D", "C", "B", "A", "A"], "6": ["C", "B", "C", "A", "D"], "7": ["impeach", "scandal", "gambling", "Representatives", "accusations", "procedures", "opposition", "resigned as Secretary of Social Welfare and urged the President to resign", "five economic advisers to the President have resigned", "the Judicial Committee and Economic Affairs Committee in the House of Representatives"]}, "7": {"1": ["B", "C", "A", "A", "D", "C", "B", "D", "A", "B"], "2": ["D", "A", "C", "C", "B"], "3": ["C", "C", "D", "B", "B"], "4": ["shows God's part in creating the universe", "shows the existence of a man thousands of years ago", "shows messages inscribed in DNA", "shows a court opinion against Intelligent Design", "shows God's existence"], "5": ["D", "D", "A", "B", "B"], "6": ["A", "C", "B", "A", "D"], "7": ["would-be", "intelligence", "genes", "athletic", "medical", "disclosed", "consideration", "the sum American egg donors expect to be paid", "plus all the costs of medical treatment and insurance", "almost half the cost of fees for the students\u2019 four-year college course."]}, "8": {"1": ["C", "A", "A", "B", "C", "D", "D", "A", "C", "B"], "2": ["D", "A", "A", "B", "A"], "3": ["D", "A", "B", "B", "A"], "4": ["Bill Gates", "Warren Buffet", "KP Singh", "Martha Stewart", "Ronald Lauder", "Luisa Kroll"], "5": ["A", "C", "D", "B", "C"], "6": ["A", "D", "B", "B", "B"], "7": ["greeted", "freshman", "spite", "fluke", "agitated", "faculty", "particularly", "I had the highest average in the freshman class", "Then, she took out a copy of the examination paper", "I was so angry that I started punding her"]}, "9": {"1": ["A", "C", "B", "D", "C", "D", "A", "A", "B", "C"], "2": ["D", "A", "B", "B", "A"], "3": ["D", "B", "B", "C", "C"], "4": ["His brother's two daughters.", "They drove there.", "Children under three.", "They watched the parade.", "He sat down and had a rest for a few minutes."], "5": ["C", "B", "A", "C", "D"], "6": ["B", "A", "D", "C", "B"], "7": ["Authorities", "grant", "opera", "not traditional", "staged", "journalists", "tunnel", "Critics, performers and audience alike were especially excited about the new introduction to the story", "who kills all suitors who cannot answer her three riddles", "Some Chinese critics have complained that the princess has none of the grace of a true Chinese lady"]}, "10": {"1": ["D", "B", "A", "C", "B", "B", "B", "C", "B", "A"], "2": ["D", "B", "C", "A", "B"], "3": ["C", "B", "D", "D", "A"], "4": ["is something not known for sure", "is trying to figure out how dreams help in solving problems", "is something everyone should do", "is important in interpreting dreams", "is something a person might be afraid of"], "5": ["C", "D", "C", "A", "A"], "6": ["A", "D", "C", "B", "A"], "7": ["rarely", "consulting", "renting", "agent", "appointment", "exchange", "praises", "the people who work there actually know where things are and they'll take you right to them", "I will tell you what I really like about Publix", "There's a different grocery store near my house, but all that the employees do there is to grunt"]}}; 16 | 17 | pattern = new RegExp(".*?book/book25/dj(.*?).php\\?UnitID=(\\d*).*","ig"); 18 | matches = pattern.exec(document.URL); 19 | // console.log(matches); 20 | 21 | if(matches != undefined && matches.length == 3) 22 | nhce_fill_blank_3(matches[1],matches[2]); 23 | 24 | pattern = new RegExp(".*?book/book26/dj(.*?).php\\?UnitID=(\\d*).*","ig"); 25 | matches = pattern.exec(document.URL); 26 | // console.log(matches); 27 | 28 | if(matches != undefined && matches.length == 3) 29 | nhce_fill_blank_4(matches[1],matches[2]); 30 | 31 | if(document.URL.indexOf("dj24.php") > 0) 32 | jQuery(".next").attr("href",jQuery(".next").attr("href").replace("dj33.php","dj51.php")); 33 | /* 34 | if(document.URL.indexOf("dj53.php") > 0){ 35 | jQuery(".next").attr("href",jQuery(".next").attr("href").replace("dj56.php","dj21.php")); 36 | jQuery(".next").attr("href",jQuery(".next").attr("href").replace("UnitID="+matches[2],"UnitID="+String(Number(matches[2])+1))); 37 | 38 | }*/ 39 | jQuery(document).keydown(function(){ 40 | if(window.event.keyCode == 78) 41 | jQuery(".next")[0].click(); 42 | 43 | }); 44 | jQuery("body").attr("onkeydown","javascript: if(window.event.keyCode==83)djSubmit();"); 45 | 46 | 47 | } 48 | 49 | function nhce_fill_blank_3(part,unit){ 50 | // Listening - Short Conversation 51 | if(part == "21"){ 52 | var kid = 1; 53 | pattern = new RegExp(".*KidID=(\\d*).*","ig"); 54 | matches = pattern.exec(document.URL); 55 | if(matches != undefined && matches.length == 2) 56 | kid = Number(matches[1]); 57 | 58 | console.log("kid:"); 59 | console.log(kid); 60 | 61 | console.log("answer:"); 62 | ans = answer03[unit]["1"][kid-1]; 63 | console.log(ans); 64 | jQuery("input[value="+ans+"]").attr("checked","checked"); 65 | jQuery("input[value="+ans+"]").parent().parent().css("background-color","yellow"); 66 | 67 | return; 68 | 69 | } 70 | 71 | // Listening - Long Conversation 72 | if(part == "22"){ 73 | 74 | console.log("answer:"); 75 | ans = answer03[unit]["2"]; 76 | console.log(ans); 77 | for(x = 1; x <= ans.length; x++){ 78 | var start_id = Number(jQuery("input[type=radio]").slice(0,1).attr("name").slice(5)); 79 | radio = jQuery("#Item_"+String(start_id-1+x)+"_"+ans[x-1]); 80 | radio.attr("checked","checked"); 81 | radio.parent().parent().css("background-color","yellow"); 82 | } 83 | return; 84 | } 85 | // Listening - Passage 86 | if(part == "23"){ 87 | 88 | console.log("answer:"); 89 | ans = answer03[unit]["3"]; 90 | console.log(ans); 91 | for(x = 1; x <= ans.length; x++){ 92 | var start_id = Number(jQuery("input[type=radio]").slice(0,1).attr("name").slice(5)); 93 | radio = jQuery("#Item_"+String(start_id-1+x)+"_"+ans[x-1]); 94 | radio.attr("checked","checked"); 95 | radio.parent().parent().css("background-color","yellow"); 96 | } 97 | return; 98 | } 99 | 100 | // Listening - Radio Program 101 | if(part == "24"){ 102 | 103 | console.log("answer:"); 104 | ans = answer03[unit]["4"]; 105 | console.log(ans); 106 | for(x = 1; x <= ans.length; x++){ 107 | radio = jQuery("input[name=Item_"+String(x-1)+"]"); 108 | radio.val(ans[x-1]); 109 | radio.css("background-color","yellow"); 110 | } 111 | return; 112 | } 113 | 114 | // Homework - Long Conversation 115 | if(part == "51"){ 116 | 117 | console.log("answer:"); 118 | ans = answer03[unit]["5"]; 119 | console.log(ans); 120 | for(x = 1; x <= ans.length; x++){ 121 | radio = jQuery("#Item_"+String(0+x)+"_"+ans[x-1]); 122 | radio.attr("checked","checked"); 123 | radio.parent().parent().css("background-color","yellow"); 124 | } 125 | return; 126 | } 127 | // Homework - Passage 128 | if(part == "52"){ 129 | 130 | console.log("answer:"); 131 | ans = answer03[unit]["6"]; 132 | console.log(ans); 133 | for(x = 1; x <= ans.length; x++){ 134 | radio = jQuery("#Item_"+String(0+x)+"_"+ans[x-1]); 135 | radio.attr("checked","checked"); 136 | radio.parent().parent().css("background-color","yellow"); 137 | } 138 | return; 139 | } 140 | 141 | // Homework - Compound Dictation 142 | if(part == "53"){ 143 | 144 | console.log("answer:"); 145 | ans = answer03[unit]["7"]; 146 | console.log(ans); 147 | for(x = 1; x <= ans.length; x++){ 148 | radio = jQuery("input[name=Item_"+String(x-1)+"]"); 149 | radio.val(ans[x-1]); 150 | radio.css("background-color","yellow"); 151 | } 152 | return; 153 | } 154 | 155 | 156 | 157 | 158 | } 159 | 160 | 161 | function nhce_fill_blank_4(part,unit){ 162 | // Listening - Short Conversation 163 | if(part == "21"){ 164 | var kid = 1; 165 | pattern = new RegExp(".*KidID=(\\d*).*","ig"); 166 | matches = pattern.exec(document.URL); 167 | if(matches != undefined && matches.length == 2) 168 | kid = Number(matches[1]); 169 | 170 | console.log("kid:"); 171 | console.log(kid); 172 | 173 | console.log("answer:"); 174 | ans = answer04[unit]["1"][kid-1]; 175 | console.log(ans); 176 | jQuery("input[value="+ans+"]").attr("checked","checked"); 177 | jQuery("input[value="+ans+"]").parent().parent().css("background-color","yellow"); 178 | 179 | return; 180 | 181 | } 182 | 183 | // Listening - Long Conversation 184 | if(part == "22"){ 185 | 186 | console.log("answer:"); 187 | ans = answer04[unit]["2"]; 188 | console.log(ans); 189 | for(x = 1; x <= ans.length; x++){ 190 | var start_id = Number(jQuery("input[type=radio]").slice(0,1).attr("name").slice(5)); 191 | radio = jQuery("#Item_"+String(start_id-1+x)+"_"+ans[x-1]); 192 | radio.attr("checked","checked"); 193 | radio.parent().parent().css("background-color","yellow"); 194 | } 195 | return; 196 | } 197 | // Listening - Passage 198 | if(part == "23"){ 199 | 200 | console.log("answer:"); 201 | ans = answer04[unit]["3"]; 202 | console.log(ans); 203 | for(x = 1; x <= ans.length; x++){ 204 | var start_id = Number(jQuery("input[type=radio]").slice(0,1).attr("name").slice(5)); 205 | radio = jQuery("#Item_"+String(start_id-1+x)+"_"+ans[x-1]); 206 | radio.attr("checked","checked"); 207 | radio.parent().parent().css("background-color","yellow"); 208 | } 209 | return; 210 | } 211 | 212 | // Listening - Radio Program 213 | if(part == "24"){ 214 | 215 | console.log("answer:"); 216 | ans = answer04[unit]["4"]; 217 | console.log(ans); 218 | for(x = 1; x <= ans.length; x++){ 219 | radio = jQuery("input[name=Item_"+String(x-1)+"]"); 220 | radio.val(ans[x-1]); 221 | radio.css("background-color","yellow"); 222 | } 223 | return; 224 | } 225 | 226 | // Homework - Long Conversation 227 | if(part == "51"){ 228 | 229 | console.log("answer:"); 230 | ans = answer04[unit]["5"]; 231 | console.log(ans); 232 | for(x = 1; x <= ans.length; x++){ 233 | radio = jQuery("#Item_"+String(0+x)+"_"+ans[x-1]); 234 | radio.attr("checked","checked"); 235 | radio.parent().parent().css("background-color","yellow"); 236 | } 237 | return; 238 | } 239 | // Homework - Passage 240 | if(part == "52"){ 241 | 242 | console.log("answer:"); 243 | ans = answer04[unit]["6"]; 244 | console.log(ans); 245 | for(x = 1; x <= ans.length; x++){ 246 | radio = jQuery("#Item_"+String(0+x)+"_"+ans[x-1]); 247 | radio.attr("checked","checked"); 248 | radio.parent().parent().css("background-color","yellow"); 249 | } 250 | return; 251 | } 252 | 253 | // Homework - Compound Dictation 254 | if(part == "53"){ 255 | 256 | console.log("answer:"); 257 | ans = answer04[unit]["7"]; 258 | console.log(ans); 259 | for(x = 1; x <= ans.length; x++){ 260 | radio = jQuery("input[name=Item_"+String(x-1)+"]"); 261 | radio.val(ans[x-1]); 262 | radio.css("background-color","yellow"); 263 | } 264 | return; 265 | } 266 | 267 | 268 | 269 | 270 | } -------------------------------------------------------------------------------- /content_script/library/jquery-ui-1.12.0.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.12.0 - 2016-09-14 2 | * http://jqueryui.com 3 | * Includes: widget.js, data.js, scroll-parent.js, widgets/draggable.js, widgets/mouse.js 4 | * Copyright jQuery Foundation and other contributors; Licensed MIT */ 5 | 6 | (function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){t.ui=t.ui||{},t.ui.version="1.12.0";var e=0,i=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},l=e.split(".")[0];e=e.split(".")[1];var h=l+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][h.toLowerCase()]=function(e){return!!t.data(e,h)},t[l]=t[l]||{},n=t[l][e],o=t[l][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:l,widgetName:e,widgetFullName:h}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var s,n,o=i.call(arguments,1),a=0,r=o.length;r>a;a++)for(s in o[a])n=o[a][s],o[a].hasOwnProperty(s)&&void 0!==n&&(e[s]=t.isPlainObject(n)?t.isPlainObject(e[s])?t.widget.extend({},e[s],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,s){var n=s.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=i.call(arguments,1),l=this;return a?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(l=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(l=i&&i.jquery?l.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new s(o,this))})),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(i,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=e++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),i),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var l=s.match(/^([\w:-]*)\s*(.*)$/),h=l[1]+o.eventNamespace,c=l[2];c?n.on(h,c,r):i.on(h,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var s=!1;t(document).on("mouseup",function(){s=!1}),t.widget("ui.mouse",{version:"1.12.0",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!s){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,n=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return n&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),s=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,s=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.ui.safeActiveElement=function(t){var e;try{e=t.activeElement}catch(i){e=t.body}return e||(e=t.body),e.nodeName||(e=t.body),e},t.ui.safeBlur=function(e){e&&"body"!==e.nodeName.toLowerCase()&&t(e).trigger("blur")},t.widget("ui.draggable",t.ui.mouse,{version:"1.12.0",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this._addClass("ui-draggable"),this._setHandleClassName(),this._mouseInit()},_setOption:function(t,e){this._super(t,e),"handle"===t&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(e){var i=this.options;return this._blurActiveElement(e),this.helper||i.disabled||t(e.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(e),this.handle?(this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(e){this.iframeBlocks=this.document.find(e).map(function(){var e=t(this);return t("
").css("position","absolute").appendTo(e.parent()).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(e){var i=t.ui.safeActiveElement(this.document[0]),s=t(e.target);this._getHandle(e)&&s.closest(i).length||t.ui.safeBlur(i)},_mouseStart:function(e){var i=this.options;return this.helper=this._createHelper(e),this._addClass(this.helper,"ui-draggable-dragging"),this._cacheHelperProportions(),t.ui.ddmanager&&(t.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===t(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(e),this.originalPosition=this.position=this._generatePosition(e,!1),this.originalPageX=e.pageX,this.originalPageY=e.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",e)===!1?(this._clear(),!1):(this._cacheHelperProportions(),t.ui.ddmanager&&!i.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this._mouseDrag(e,!0),t.ui.ddmanager&&t.ui.ddmanager.dragStart(this,e),!0)},_refreshOffsets:function(t){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:t.pageX-this.offset.left,top:t.pageY-this.offset.top}},_mouseDrag:function(e,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(e,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",e,s)===!1)return this._mouseUp(new t.Event("mouseup",e)),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),!1},_mouseStop:function(e){var i=this,s=!1;return t.ui.ddmanager&&!this.options.dropBehaviour&&(s=t.ui.ddmanager.drop(this,e)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||t.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?t(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",e)!==!1&&i._clear()}):this._trigger("stop",e)!==!1&&this._clear(),!1},_mouseUp:function(e){return this._unblockFrames(),t.ui.ddmanager&&t.ui.ddmanager.dragStop(this,e),this.handleElement.is(e.target)&&this.element.trigger("focus"),t.ui.mouse.prototype._mouseUp.call(this,e)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp(new t.Event("mouseup",{target:this.element[0]})):this._clear(),this},_getHandle:function(e){return this.options.handle?!!t(e.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this._addClass(this.handleElement,"ui-draggable-handle")},_removeHandleClassName:function(){this._removeClass(this.handleElement,"ui-draggable-handle")},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper),n=s?t(i.helper.apply(this.element[0],[e])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_isRootNode:function(t){return/(html|body)/i.test(t.tagName)||t===this.document[0]},_getParentOffset:function(){var e=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var t=this.element.position(),e=this._isRootNode(this.scrollParent[0]);return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+(e?0:this.scrollParent.scrollTop()),left:t.left-(parseInt(this.helper.css("left"),10)||0)+(e?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options,o=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[t(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,t(window).scrollLeft()+t(window).width()-this.helperProportions.width-this.margins.left,t(window).scrollTop()+(t(window).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,t(o).width()-this.helperProportions.width-this.margins.left,(t(o).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=t(n.containment),s=i[0],s&&(e=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(e?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(e?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)},_convertPositionTo:function(t,e){e||(e=this.position);var i="absolute"===t?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:e.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:e.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(t,e){var i,s,n,o,a=this.options,r=this._isRootNode(this.scrollParent[0]),l=t.pageX,h=t.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),e&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,t.pageX-this.offset.click.lefti[2]&&(l=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(h=i[3]+this.offset.click.top)),a.grid&&(n=a.grid[1]?this.originalPageY+Math.round((h-this.originalPageY)/a.grid[1])*a.grid[1]:this.originalPageY,h=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-a.grid[1]:n+a.grid[1]:n,o=a.grid[0]?this.originalPageX+Math.round((l-this.originalPageX)/a.grid[0])*a.grid[0]:this.originalPageX,l=i?o-this.offset.click.left>=i[0]||o-this.offset.click.left>i[2]?o:o-this.offset.click.left>=i[0]?o-a.grid[0]:o+a.grid[0]:o),"y"===a.axis&&(l=this.originalPageX),"x"===a.axis&&(h=this.originalPageY)),{top:h-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:l-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}},_clear:function(){this._removeClass(this.helper,"ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(e,i,s){return s=s||this._uiHash(),t.ui.plugin.call(this,e,[i,s,this],!0),/^(drag|start|stop)/.test(e)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),t.Widget.prototype._trigger.call(this,e,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),t.ui.plugin.add("draggable","connectToSortable",{start:function(e,i,s){var n=t.extend({},i,{item:s.element});s.sortables=[],t(s.options.connectToSortable).each(function(){var i=t(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",e,n))})},stop:function(e,i,s){var n=t.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,t.each(s.sortables,function(){var t=this;t.isOver?(t.isOver=0,s.cancelHelperRemoval=!0,t.cancelHelperRemoval=!1,t._storedCSS={position:t.placeholder.css("position"),top:t.placeholder.css("top"),left:t.placeholder.css("left")},t._mouseStop(e),t.options.helper=t.options._helper):(t.cancelHelperRemoval=!0,t._trigger("deactivate",e,n))})},drag:function(e,i,s){t.each(s.sortables,function(){var n=!1,o=this;o.positionAbs=s.positionAbs,o.helperProportions=s.helperProportions,o.offset.click=s.offset.click,o._intersectsWith(o.containerCache)&&(n=!0,t.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==o&&this._intersectsWith(this.containerCache)&&t.contains(o.element[0],this.element[0])&&(n=!1),n})),n?(o.isOver||(o.isOver=1,s._parent=i.helper.parent(),o.currentItem=i.helper.appendTo(o.element).data("ui-sortable-item",!0),o.options._helper=o.options.helper,o.options.helper=function(){return i.helper[0]},e.target=o.currentItem[0],o._mouseCapture(e,!0),o._mouseStart(e,!0,!0),o.offset.click.top=s.offset.click.top,o.offset.click.left=s.offset.click.left,o.offset.parent.left-=s.offset.parent.left-o.offset.parent.left,o.offset.parent.top-=s.offset.parent.top-o.offset.parent.top,s._trigger("toSortable",e),s.dropped=o.element,t.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,o.fromOutside=s),o.currentItem&&(o._mouseDrag(e),i.position=o.position)):o.isOver&&(o.isOver=0,o.cancelHelperRemoval=!0,o.options._revert=o.options.revert,o.options.revert=!1,o._trigger("out",e,o._uiHash(o)),o._mouseStop(e,!0),o.options.revert=o.options._revert,o.options.helper=o.options._helper,o.placeholder&&o.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(e),i.position=s._generatePosition(e,!0),s._trigger("fromSortable",e),s.dropped=!1,t.each(s.sortables,function(){this.refreshPositions()}))})}}),t.ui.plugin.add("draggable","cursor",{start:function(e,i,s){var n=t("body"),o=s.options;n.css("cursor")&&(o._cursor=n.css("cursor")),n.css("cursor",o.cursor)},stop:function(e,i,s){var n=s.options;n._cursor&&t("body").css("cursor",n._cursor)}}),t.ui.plugin.add("draggable","opacity",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("opacity")&&(o._opacity=n.css("opacity")),n.css("opacity",o.opacity)},stop:function(e,i,s){var n=s.options;n._opacity&&t(i.helper).css("opacity",n._opacity)}}),t.ui.plugin.add("draggable","scroll",{start:function(t,e,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(e,i,s){var n=s.options,o=!1,a=s.scrollParentNotHidden[0],r=s.document[0];a!==r&&"HTML"!==a.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+a.offsetHeight-e.pageY=0;d--)l=s.snapElements[d].left-s.margins.left,h=l+s.snapElements[d].width,c=s.snapElements[d].top-s.margins.top,u=c+s.snapElements[d].height,l-g>_||m>h+g||c-g>b||v>u+g||!t.contains(s.snapElements[d].item.ownerDocument,s.snapElements[d].item)?(s.snapElements[d].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=!1):("inner"!==f.snapMode&&(n=g>=Math.abs(c-b),o=g>=Math.abs(u-v),a=g>=Math.abs(l-_),r=g>=Math.abs(h-m),n&&(i.position.top=s._convertPositionTo("relative",{top:c-s.helperProportions.height,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left)),p=n||o||a||r,"outer"!==f.snapMode&&(n=g>=Math.abs(c-v),o=g>=Math.abs(u-b),a=g>=Math.abs(l-m),r=g>=Math.abs(h-_),n&&(i.position.top=s._convertPositionTo("relative",{top:c,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left)),!s.snapElements[d].snapping&&(n||o||a||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=n||o||a||r||p)}}),t.ui.plugin.add("draggable","stack",{start:function(e,i,s){var n,o=s.options,a=t.makeArray(t(o.stack)).sort(function(e,i){return(parseInt(t(e).css("zIndex"),10)||0)-(parseInt(t(i).css("zIndex"),10)||0)});a.length&&(n=parseInt(t(a[0]).css("zIndex"),10)||0,t(a).each(function(e){t(this).css("zIndex",n+e)}),this.css("zIndex",n+a.length))}}),t.ui.plugin.add("draggable","zIndex",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("zIndex")&&(o._zIndex=n.css("zIndex")),n.css("zIndex",o.zIndex)},stop:function(e,i,s){var n=s.options;n._zIndex&&t(i.helper).css("zIndex",n._zIndex)}}),t.ui.draggable}); -------------------------------------------------------------------------------- /content_script/page/lesson.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Electsys++ Project 3 | * ---------------------------- 4 | * 选课优化模块 5 | */ 6 | 7 | const INTERVAL_DEFAULT = 1600; 8 | const INTERVAL_STEP = 200; 9 | 10 | function post(url,data,lid) 11 | { 12 | /* if (localStorage["lesson_enable"] == undefined || localStorage["lesson_enable"] == 0) { 13 | return 0; 14 | }; 15 | */ 16 | g_ajax_sending = true; 17 | jQuery.ajax({ 18 | type: 'POST', 19 | url: url, 20 | data: data, 21 | async: true, 22 | success: function (data, res) { 23 | g_ajax_sending = false; 24 | processArrangement(data, lid, url); 25 | }, 26 | error: function (data) { 27 | g_ajax_sending = false; 28 | console.log("error", data); 29 | }, 30 | dataType: "html" 31 | }); 32 | 33 | return 0; 34 | } 35 | 36 | 37 | //颜色对照表 38 | color = []; 39 | color[0] = ["#84C1FF","#84C1FF","#84C1FF","#84C1FF","#84C1FF","#84C1FF","#84C1FF"] 40 | color[1] = ["#ff7575","#ff7575","#ff7575","#ff7575","#ff7575","#ff7575","#ff7575"] 41 | border_color = []; 42 | border_color[0] = "blue"; 43 | border_color[1] = "red"; 44 | 45 | //查询缓存 46 | var g_arrange_cache = {}; 47 | var g_last_query_success = new Date().getTime() - INTERVAL_DEFAULT; 48 | var g_ajax_sending = false; 49 | 50 | function lesson_enable_check () { 51 | 52 | // enable the function 53 | var timestamp = Date.parse(new Date())/1000; 54 | if (!(option.get("lesson_enable_timestamp", 0) > 10)) 55 | option.set("lesson_enable_timestamp", 100); 56 | if (timestamp - option.get("lesson_enable_timestamp", 0) > 60 * 5) { 57 | jQuery.ajax({ 58 | type: 'GET', 59 | url: "http://1.laohyxwebauth.sinaapp.com/electsys_lesson_enable.php", 60 | data: {}, 61 | async: true, 62 | success: function (data) { 63 | option.set("lesson_enable", data["enable"]); 64 | console.log(data["enable"]); 65 | }, 66 | error: function (data) { 67 | console.log("error"); 68 | }, 69 | dataType: "json" 70 | }); 71 | option.set("lesson_enable_timestamp", timestamp); 72 | } 73 | 74 | } 75 | 76 | //选课提醒页面 77 | function optimize_elect_warning() 78 | { 79 | if(!inUrl("/edu/student/elect/electwarning.aspx") || 80 | !option.getBool('optimize_lesson', true)) { 81 | return; 82 | } 83 | 84 | //选中“我已阅读” 85 | jQuery("input[type=\"checkbox\"]").prop('checked', true); 86 | 87 | //为“继续”按钮设置焦点 88 | jQuery("#btnContinue").focus(); 89 | } 90 | 91 | function optimize_elect() 92 | { 93 | 94 | document = document; 95 | //在课程安排中获取老师评教 96 | show_teacher_eval(); 97 | if(!inUrl("/edu/student/elect") || 98 | !option.getBool('optimize_lesson', true)) 99 | { 100 | return 0; 101 | } 102 | 103 | //不需要应用优化的页面 104 | var black_list = [ 105 | "/edu/student/elect/viewLessonTbl.aspx", 106 | "/edu/student/elect/electResultOuter.aspx", 107 | "/edu/student/elect/electwarning.aspx", 108 | "/edu/student/elect/RecommandTblOuter.aspx", 109 | "/edu/student/elect/selectRecommandLesson.aspx" 110 | ]; 111 | if(inUrl(black_list)) { 112 | return 0; 113 | } 114 | 115 | title = jQuery(".tit",document); 116 | title.removeAttr("width"); 117 | /* 118 | if (localStorage["lesson_enable"] == undefined || localStorage["lesson_enable"] == 0) { 119 | jQuery("table").slice(2,3).before('
为减少服务器压力,抢选高峰暂时关闭部分功能。请使用electsys.net查询课程:)
') 120 | 121 | }; 122 | */ 123 | //插入小课表 124 | prepend_smalltable(); 125 | title[0].innerHTML += " Electsys++ " + option.get('extension_version'); 126 | jQuery('body').append('
'); 127 | 128 | type = "tongshi"; 129 | 130 | if(inUrl("/edu/student/elect/speltyRequiredCourse.aspx")) 131 | type = "bixiu"; 132 | if(inUrl("/edu/student/elect/speltyCommonCourse.aspx")) 133 | type = "tongshi"; 134 | if(inUrl("/edu/student/elect/outSpeltyEP.aspx")) 135 | type = "renxuan"; 136 | if(inUrl("/edu/student/elect/ShortSession.aspx")) 137 | type = "xiaoxueqi"; 138 | 139 | radiogroup = jQuery("[name=myradiogroup]",document); 140 | for(radio_index = 0; radio_index < radiogroup.length ; radio_index++){ 141 | jQuery(radiogroup[radio_index]).click(function () { 142 | var lid = this.value; 143 | var me = this; 144 | 145 | // 有缓存的情况下直接加载缓存页面 146 | //console.log(g_arrange_cache, lid); 147 | if (option.getBool('optimize_lesson_query_cache', true) && 148 | g_arrange_cache.hasOwnProperty(lid)) { 149 | var cache = g_arrange_cache[lid]; 150 | var now = new Date().getTime(); 151 | //console.log(cache.expire > now); 152 | if (cache.expire > now) { 153 | // 更改 pushstate 154 | window.history.replaceState({lid: lid}, 'speltyGeneralCourse', url); 155 | window.history.pushState(null, 'viewLesson', url); 156 | 157 | // 页面回退 158 | window.onpopstate = function(event) { 159 | if (event.state.lid) { 160 | jQuery('#Table1').show(); 161 | jQuery('#st_fixed_div').show(); 162 | jQuery('#electsys_view_lesson').html(''); 163 | 164 | // 清除原先加的提示颜色 165 | clearDraw_lid(lid); 166 | jQuery(me).parent().parent().parent() 167 | .attr('style', '') 168 | .removeAttr('clicked'); 169 | // 取消选中 170 | jQuery(me).prop('checked', false); 171 | } 172 | }; 173 | 174 | // 处理新页面 175 | var body = cache.html 176 | .replace(/\.\.\//g, '../../') 177 | .replace(/(viewLessonArrange).aspx/g, '../../lesson/$1.aspx'); 178 | var bodyStart = body.indexOf('
'); 180 | body = body.substring(bodyStart, bodyEnd + '
'.length); 181 | 182 | // 加载新页面 183 | jQuery('#electsys_view_lesson').html(body); 184 | jQuery('#Table1').hide(); 185 | jQuery('#st_fixed_div').hide(); 186 | 187 | return; 188 | } 189 | } 190 | 191 | setTimeout(function () { 192 | jQuery("input[value=课程安排]").trigger("click"); 193 | }, 400); 194 | }) 195 | var lid = radiogroup[radio_index].value; 196 | //console.log(radio_index + "~~" + lid); 197 | radio = radiogroup[radio_index]; 198 | lesson_name = radio.parentElement.parentElement.parentElement.children[1].innerHTML.toString().trim(); 199 | 200 | var type_name = ""; 201 | if(type == "xiaoxueqi") { 202 | type_name = radio.parentElement.parentElement.parentElement.children[3].innerHTML.toString().trim(); 203 | } 204 | 205 | GE_table = ["other","人文学科","社会科学","自然科学与工程技术","数学或逻辑学"]; 206 | var GE_type = jQuery.inJSON(GE_list,lesson_name); 207 | 208 | if(type == "renxuan" && GE_type.length > 0){ // 普通选课 209 | radio.parentElement.parentElement.parentElement.children[1].innerHTML = "" + lesson_name + "(2015级及以前可冲抵通识:" + GE_table[GE_type[0]] + ")"; 210 | } 211 | else if(type == "xiaoxueqi" && type_name != "通识" && GE_type.length > 0){ // 小学期选课 212 | radio.parentElement.parentElement.parentElement.children[1].innerHTML = "" + lesson_name + "(2015级及以前可冲抵通识:" + GE_table[GE_type[0]] + ")"; 213 | } 214 | else{ 215 | //radio.parentElement.parentElement.parentElement.children[1].innerHTML = "" + lesson_name + ""; 216 | } 217 | //console.log(lesson_name); 218 | 219 | } 220 | 221 | var html = jQuery("[name=myradiogroup]",document).slice(0,1).parent().parent().parent().prev().children().slice(0,1).html(); 222 | jQuery("[name=myradiogroup]",document).slice(0,1).parent().parent().parent().prev().children().slice(0,1).css({"background-color":"#83A9C9", "background-image":"none"}); 223 | jQuery("[name=myradiogroup]",document).slice(0,1).parent().parent().parent().prev().children().slice(0,1).html("【刷新信息】"); 224 | 225 | document.processInterval = INTERVAL_DEFAULT; 226 | init_query_list(); 227 | 228 | jQuery('.refresh_list').click(function(){ 229 | clearAllInterval(); 230 | jQuery(".fullspan,.attrtag").remove(); 231 | var radiogroup = jQuery("[name=myradiogroup]",document).get().reverse(); 232 | document.lids = []; 233 | for(radio_index = 0; radio_index < radiogroup.length ; radio_index++){ 234 | //在列表上添加是否空的span - fullspan 235 | var lid = radiogroup[radio_index].value; 236 | document.lids[radio_index] = [lid,type]; 237 | jQuery(radiogroup[radio_index]).parent().after('  '); 238 | } 239 | 240 | setInterval("processLidQueue();", document.processInterval); 241 | }); 242 | 243 | } 244 | function init_query_list(){ 245 | jQuery(".fullspan,.attrtag").remove(); 246 | var radiogroup = jQuery("[name=myradiogroup]",document).get().reverse(); 247 | document.lids = []; 248 | for(radio_index = 0; radio_index < radiogroup.length ; radio_index++){ 249 | var lid = radiogroup[radio_index].value; 250 | jQuery(radiogroup[radio_index]).parent().after('  '); 251 | jQuery(radiogroup[radio_index]).parent().before(''); 252 | } 253 | jQuery('.lesson_query').click(function(event){ 254 | event.stopPropagation(); 255 | jQuery(this).parent().find('.fullspan').html('  '); 256 | var lid = jQuery(this).attr('lid'); 257 | document.lids[document.lids.length] = [lid,type]; 258 | clearAllInterval(); 259 | var now = new Date().getTime(); 260 | var diff = g_last_query_success + document.processInterval - now; 261 | if (g_ajax_sending) { 262 | diff += document.processInterval; 263 | } 264 | 265 | // 如果没有在限制频率内,则直接查询,加快速度 266 | setTimeout(function () { 267 | processLidQueue(); // POST first 268 | setInterval("processLidQueue();", document.processInterval); 269 | }, Math.max(0, diff) + 100); 270 | }); 271 | } 272 | 273 | function prepend_smalltable() 274 | { 275 | 276 | st_fixed_div = jQuery('
课程表(展开/收起)
electsys++(' + option.get('extension_version', '') + ') by laohyx(拖动)
'); 277 | jQuery("body").prepend(st_fixed_div); 278 | jQuery("#st_fixed_div").draggable({handle:"#smalltable_handle"}); 279 | jQuery("#LessonTbl1_spanContent_small").append(jQuery(".alltab",document)[jQuery(".alltab",document).length - 1].outerHTML); 280 | let malltable_slide = option.getBool("malltable_slide", true); 281 | 282 | if (!malltable_slide) { 283 | jQuery("#smalltable_container").slideToggle(0); 284 | } else { 285 | option.set("malltable_slide", malltable_slide); 286 | } 287 | 288 | jQuery(".smalltable_title").click(function(){ 289 | jQuery("#smalltable_container").slideToggle("slow"); 290 | malltable_slide = !malltable_slide; 291 | option.set("malltable_slide", malltable_slide); 292 | }); 293 | 294 | } 295 | 296 | 297 | 298 | 299 | function processLidQueue() 300 | { 301 | if (document.lids.length == 0) { 302 | clearAllInterval(); 303 | return; 304 | }; 305 | // 取栈顶 306 | var args = document.lids[document.lids.length - 1]; 307 | document.lids = document.lids.slice(0, document.lids.length - 1); 308 | var lid = args[0]; 309 | var type = args[1]; 310 | // console.log(lid, type); 311 | var data = {}; 312 | data = {"__VIEWSTATE":jQuery('#__VIEWSTATE',document).val(),"__EVENTVALIDATION":jQuery('#__EVENTVALIDATION',document).val()} 313 | if(type == "renxuan") 314 | { 315 | data["OutSpeltyEP1$dpYx"]=jQuery("#OutSpeltyEP1_dpYx",document).val(); 316 | data["OutSpeltyEP1$dpNj"]=jQuery("#OutSpeltyEP1_dpNj",document).val(); 317 | } 318 | 319 | data["myradiogroup"] = lid; 320 | sub_button = jQuery('[value=课程安排]',document) 321 | data[sub_button.attr("name")] = sub_button.val(); 322 | input_elements = jQuery("[type=hidden]",document); 323 | 324 | form = jQuery("form",document); 325 | url = base_url + "/edu/student/elect/" + form.attr("action"); 326 | post(url,data,lid); 327 | return 0; 328 | 329 | } 330 | function clearAllInterval(){ 331 | var highestIntervalId = setInterval(";", 100000); 332 | for (var i = 0 ; i <= highestIntervalId ; i++) { 333 | clearInterval(i); 334 | } 335 | 336 | } 337 | function getArrangement(lid,type) 338 | { 339 | data = {}; 340 | data = {"__VIEWSTATE":jQuery('#__VIEWSTATE',document).val(),"__EVENTVALIDATION":jQuery('#__EVENTVALIDATION',document).val()} 341 | if(type == "renxuan") 342 | { 343 | data["OutSpeltyEP1jQuerydpYx"]=jQuery("#OutSpeltyEP1_dpYx",document).val(); 344 | data["OutSpeltyEP1jQuerydpNj"]=jQuery("#OutSpeltyEP1_dpNj",document).val(); 345 | } 346 | data["myradiogroup"] = lid; 347 | sub_button = jQuery('[value=课程安排]',document) 348 | data[sub_button.attr("name")] = sub_button.val(); 349 | input_elements = jQuery("[type=hidden]",document); 350 | 351 | form = jQuery("form",document); 352 | url = base_url + "/edu/student/elect/" + form.attr("action"); 353 | 354 | post(url,data,lid); 355 | return 0; 356 | 357 | } 358 | 359 | function processArrangement(html, lid, url) 360 | { 361 | //判断是否有错误提示 362 | var error_pattern = new RegExp("(.*?)"); 363 | var error_match = error_pattern.exec(html); 364 | if(error_match != null) 365 | { 366 | var error_message = error_match[1]; 367 | console.log(error_message); 368 | 369 | if(error_message.indexOf("不能继续增加通识课") > -1){ 370 | // 记录接受到响应的时间 371 | g_last_query_success = new Date().getTime(); 372 | 373 | error_message = "通识达上限"; 374 | document.lids = []; 375 | //在列表上添加是否空的提示 376 | lessontr = jQuery("input[value=" + lid + "]",document).parent().parent().parent(); 377 | fullspan = lessontr.find(".fullspan")[0]; 378 | fullspan.setAttribute("style","color:gray"); 379 | fullspan.innerHTML = error_message; 380 | return; 381 | } 382 | 383 | // 其他情况(比如提示查询频繁) 384 | // 把该lid加回去 385 | document.lids[document.lids.length] = [lid, type]; 386 | document.processInterval += INTERVAL_STEP; 387 | console.log(document.processInterval); 388 | clearAllInterval(); 389 | setInterval("processLidQueue();", document.processInterval); 390 | 391 | return; 392 | } 393 | 394 | // 记录接受到响应的时间 395 | g_last_query_success = new Date().getTime(); 396 | // 缓存查询结果 397 | g_arrange_cache[lid] = { 398 | url: url, 399 | html: html, 400 | expire: g_last_query_success + document.processInterval 401 | }; 402 | 403 | // 开始处理html,并绘制至课表中 404 | // 这段代码是我大二写的,已经是2011年的事了。。。相信它会运行很久 405 | 406 | var lessons = []; 407 | tablelsn = jQuery("#LessonTime1_gridMain",html)[0]; 408 | 409 | 410 | trs = jQuery("tr",tablelsn).slice(1); 411 | // console.log(lid); 412 | for(x = 0; x < trs.length; x++){ 413 | var l = {"lid" : lid, "now" : Number(trs.slice(x,x+1).children().slice(8,9).text()), "max" : Number(trs.slice(x,x+1).children().slice(5,6).text()) }; 414 | l.arrange = Trim(trs.slice(x,x+1).children().slice(9,10).text(),"g") 415 | l.times = [] 416 | pattern = new RegExp("星期(.*?)第(.*?)节--第(.*?)节","ig"); 417 | matches = l.arrange.match(pattern); 418 | 419 | 420 | matches = matches.distinct(); 421 | for (i = 0 ; i < matches.length;i++) 422 | { 423 | pattern = new RegExp("星期(.*?)第(.*?)节--第(.*?)节","ig"); 424 | txt = matches[i]; 425 | //console.log(txt); 426 | match = pattern.exec(txt); 427 | //console.log(match); 428 | switch(match[1]){ 429 | case "一": 430 | day = 1; break; 431 | case "二": 432 | day = 2; break; 433 | case "三": 434 | day = 3; break; 435 | case "四": 436 | day = 4; break; 437 | case "五": 438 | day = 5; break; 439 | case "六": 440 | day = 6; break; 441 | case "日": 442 | day = 7; break; 443 | default: 444 | day = 7; } 445 | if(l.max - l.now > 0) 446 | full = 0; 447 | else 448 | full = 1; 449 | //console.log(l.lid); 450 | time = {"day":day,"from":Number(match[2]),"to":Number(match[3]),"full":full} 451 | l.times.push(time); 452 | } 453 | //n个老师 454 | lessons.push(l); 455 | } 456 | 457 | 458 | //保存lessons信息到tr中,用隐藏的div存储 459 | lessontr = jQuery("input[value=" + lid + "]",document).parent().parent().parent(); 460 | // console.log(lessons); 461 | 462 | lessontr.attr("lid",lid); 463 | var full_identifier = 1; 464 | for(x=0; x < lessons.length; x++){ 465 | times = lessons[x].times; 466 | //console.log(time); 467 | for(y=0; y < times.length;y++) 468 | { 469 | time = times[y]; 470 | if(time.full == 0) 471 | full_identifier = 0; 472 | attrtag = document.createElement("div"); 473 | attrtag.setAttribute("class","attrtag"); 474 | attrtag.setAttribute("day",time.day); 475 | attrtag.setAttribute("from",time.from); 476 | attrtag.setAttribute("to",time.to); 477 | attrtag.setAttribute("full",time.full); 478 | attrtag.setAttribute("hidden","true"); 479 | attrtag.setAttribute("teacher_order",x); 480 | lessontr.slice(0,1).append(attrtag); 481 | } 482 | } 483 | 484 | //在列表上修改是否空的提示 485 | fullspan = lessontr.find(".fullspan")[0]; 486 | // console.log(lessons); 487 | if(lessons.length == 0){ 488 | fullspan.setAttribute("style","color:gray"); 489 | fullspan.innerHTML = "无"; 490 | return; 491 | } 492 | 493 | if(full_identifier == 1) 494 | { 495 | fullspan.setAttribute("style","color:gray"); 496 | fullspan.innerHTML = "满"; 497 | } 498 | else 499 | { 500 | fullspan.setAttribute("style","color:blue"); 501 | fullspan.innerHTML = "未满"; 502 | } 503 | if(jQuery("tr",tablelsn).length < 2 ) 504 | { 505 | jQuery("#loadimg_"+lid,document).remove(); 506 | return 0; 507 | } 508 | 509 | //lessontr.slice(0,1).children().slice(0,1).append(fullspan); 510 | 511 | 512 | 513 | 514 | lessontr.mouseover(function(){ 515 | if(jQuery(this).attr("clicked") != "1"){ 516 | jQuery(this).css("background-color","#CFC"); 517 | draw_lesson(jQuery(this).attr("lid"),0); 518 | } 519 | }); 520 | 521 | lessontr.click(function(){ 522 | jQuery(this).css("background-color","#FC9"); 523 | if(jQuery(this).attr("clicked") == "1"){ 524 | jQuery(this).attr("clicked","0"); 525 | clearDraw_lid(jQuery(this).attr("lid")); 526 | }else{ 527 | clearDraw_lid(jQuery(this).attr("lid")); 528 | draw_lesson(jQuery(this).attr("lid"),1); 529 | jQuery(this).attr("clicked","1"); 530 | } 531 | 532 | }); 533 | jQuery("input[value=" + lid + "]",document).parent().parent().parent().mouseout(function(){ 534 | if(jQuery(this).attr("clicked") != "1"){ 535 | jQuery(this).attr("style",""); 536 | clearDraw_lid(jQuery(this).attr("lid")); 537 | } 538 | 539 | }) 540 | 541 | return 0; 542 | } 543 | 544 | 545 | 546 | 547 | //获取元素的纵坐标 548 | function getTop(e){ 549 | var offset=e.offsetTop; 550 | if(e.offsetParent!=null) offset+=getTop(e.offsetParent); 551 | return offset; 552 | } 553 | //获取元素的横坐标 554 | function getLeft(e){ 555 | var offset=e.offsetLeft; 556 | if(e.offsetParent!=null) offset+=getLeft(e.offsetParent); 557 | return offset; 558 | } 559 | 560 | function draw_lesson(lid,clicked) 561 | { 562 | lessontr = jQuery("tr[lid=" + lid + "]",document); 563 | lessons = jQuery("div[hidden=true]",lessontr); 564 | for(x=0; x < lessons.length; x++){ 565 | lesson = lessons[x]; 566 | day = lesson.getAttribute("day"); 567 | from = lesson.getAttribute("from"); 568 | to = lesson.getAttribute("to"); 569 | full= lesson.getAttribute("full"); 570 | teacher_order = Number(lesson.getAttribute("teacher_order")) + 1; 571 | draw(day,from,to,full,lid,clicked,teacher_order); 572 | } 573 | 574 | 575 | 576 | } 577 | 578 | 579 | function draw(weekday,hour_from,hour_to,isFull,lid,clicked,t_order) 580 | { 581 | //动态处理表格宽度 582 | //document = parent.window.frames[2]; 583 | document = document; 584 | 585 | //课表的处理 586 | 587 | //Summer session 588 | if(inUrl("/edu/student/elect/ShortSession.aspx")){ 589 | //table_span = jQuery("#LessonTbl1_span1",document); 590 | table = jQuery(".alltab",document)[jQuery(".alltab",document).length - 1]; 591 | } 592 | else{ 593 | table_span = jQuery("#LessonTbl1_spanContent,#lessonTbl_spanContent",document); 594 | table = jQuery(".alltab",table_span)[0]; 595 | } 596 | 597 | 598 | 599 | tbody = table.children[0]; 600 | tablex = getTop(table); 601 | tabley = getLeft(table); 602 | 603 | //trlist,0是表头,1~15是14节课 604 | trlist = tbody.children; 605 | 606 | //每行高度,0为表头 607 | cellheight = new Array(); 608 | for(var n = 0;n < 15;n++){ 609 | cellheight[n] = trlist[n].clientHeight; 610 | } 611 | 612 | //每格宽度,0为序号单元 613 | cellwidth = new Array(); 614 | for(var n=0;n<8;n++) 615 | { 616 | cellwidth[n]=trlist[0].children[n].clientWidth+2; 617 | } 618 | //动态处理表格宽度 over 619 | 620 | 621 | posx=cellwidth[0]; 622 | posy=0; 623 | 624 | weekday = Number(weekday); 625 | hour_from = Number(hour_from); 626 | hour_to = Number(hour_to); 627 | isFull = Number(isFull); 628 | clicked = Number(clicked); 629 | 630 | 631 | for(var n=1;n < weekday;n++) 632 | posx += cellwidth[n]; 633 | for ( var n = 0; n < hour_from; n++) { 634 | posy += cellheight[n]; 635 | } 636 | draw_height = 0; 637 | for ( var n = hour_from; n <= hour_to ; n++){ 638 | draw_height += cellheight[n]; 639 | 640 | } 641 | draw_width = cellwidth[weekday]; 642 | 643 | if(t_order > 5) 644 | { 645 | draw_color = color[isFull][6 - 1]; 646 | } 647 | else 648 | { 649 | draw_color = color[isFull][t_order - 1]; 650 | } 651 | 652 | draw_obj = document.createElement("div"); 653 | draw_id = "draw"+weekday+hour_from+hour_to+isFull; 654 | draw_obj.setAttribute("class","lsntable_draw"); 655 | draw_obj.setAttribute("class",draw_id); 656 | draw_obj.setAttribute("lid",lid); 657 | draw_obj.setAttribute("clicked",clicked); 658 | draw_obj.innerHTML = lid + "_" + t_order; 659 | if(isFull == 0) 660 | draw_obj.innerHTML += "
未满"; 661 | else 662 | draw_obj.innerHTML += "
满"; 663 | 664 | jQuery("#LessonTbl1_spanContent,#lessonTbl_spanContent").append(draw_obj); 665 | //jQuery("#"+draw_id).css({"width":draw_width-border_width,"height":draw_height-border_width,"position":"absolute","top":posy+getTop(table),"left":posx+getLeft(table)+border_width,"border":border_width+"px solid "+draw_color}) 666 | jQuery("."+draw_id,document).css({"width":draw_width - 3,"height":draw_height - 3 ,"position":"absolute","top":posy+getTop(table)+2,"left":posx+getLeft(table)+2,"background":draw_color,"font-size":"12px","opacity":"0.8","text-align":"center","border":"1px solid "+border_color[isFull]}); 667 | 668 | 669 | 670 | 671 | 672 | 673 | /**************************************************** 674 | * 675 | * 676 | * 画小课表 677 | * 678 | * 679 | * 680 | */ 681 | 682 | //动态处理表格宽度 683 | document = document; 684 | smalltable_span = jQuery("#LessonTbl1_spanContent_small",document); 685 | //课表的处理 686 | table = jQuery(".alltab",smalltable_span)[0]; 687 | 688 | 689 | tbody = table.children[0]; 690 | tablex = getTop(table); 691 | tabley = getLeft(table); 692 | 693 | 694 | //trlist,0是表头,1~15是14节课 695 | trlist = tbody.children; 696 | 697 | //每行高度,0为表头 698 | cellheight = new Array(); 699 | for(var n = 0;n < 15;n++){ 700 | cellheight[n] = trlist[n].clientHeight; 701 | } 702 | 703 | //每格宽度,0为序号单元 704 | cellwidth = new Array(); 705 | for(var n=0;n<8;n++) 706 | { 707 | cellwidth[n]=trlist[0].children[n].clientWidth+2; 708 | } 709 | //动态处理表格宽度 over 710 | 711 | 712 | posx=cellwidth[0]; 713 | posy=0; 714 | 715 | weekday = Number(weekday); 716 | hour_from = Number(hour_from); 717 | hour_to = Number(hour_to); 718 | isFull = Number(isFull); 719 | clicked = Number(clicked); 720 | 721 | 722 | for(var n=1;n < weekday;n++) 723 | posx += cellwidth[n]; 724 | for ( var n = 0; n < hour_from; n++) { 725 | posy += cellheight[n]; 726 | } 727 | draw_height = 0; 728 | for ( var n = hour_from; n <= hour_to ; n++){ 729 | draw_height += cellheight[n]; 730 | 731 | } 732 | draw_width = cellwidth[weekday]; 733 | if(t_order > 5) 734 | { 735 | draw_color = color[isFull][6 - 1]; 736 | } 737 | else 738 | { 739 | draw_color = color[isFull][t_order - 1]; 740 | } 741 | 742 | draw_obj = document.createElement("div"); 743 | draw_id = "draw"+weekday+hour_from+hour_to+isFull; 744 | draw_obj.setAttribute("class","lsntable_draw"); 745 | draw_obj.setAttribute("class",draw_id+"_small"); 746 | draw_obj.setAttribute("lid",lid); 747 | draw_obj.setAttribute("clicked",clicked); 748 | draw_obj.innerHTML = lid + "_" + t_order; 749 | if(isFull == 0) 750 | draw_obj.innerHTML += "
未满"; 751 | else 752 | draw_obj.innerHTML += "
满"; 753 | tbody.appendChild(draw_obj); 754 | //这里与画大课表上的div不同,它已经有相对位置,因此只要加25的title高就ok 755 | jQuery("."+draw_id+"_small",document).css({"width":draw_width -3 ,"height":draw_height - 3,"position":"absolute","top":posy + 25 + 2,"left":posx + 2,"background":draw_color,"font-size":"12px","opacity":"0.8","text-align":"center","border":"1px solid "+border_color[isFull]}); 756 | 757 | } 758 | 759 | 760 | 761 | 762 | function clearDraw_lid(lid) 763 | { 764 | tables = jQuery("#LessonTbl1_spanContent,#LessonTbl_spanContent,#LessonTbl1_spanContent_small",document); 765 | jQuery("div[lid=" + lid + "]",tables).remove(); 766 | 767 | //jQuery(".lsntable_draw").remove(); 768 | } 769 | 770 | function clearDraw(clicked) 771 | { 772 | tables = jQuery("#LessonTbl1_spanContent,#LessonTbl_spanContent,#LessonTbl1_spanContent_small",document); 773 | if(clicked == 0) 774 | jQuery("div[clicked=0]",tables).remove(); 775 | else 776 | jQuery("div[clicked=1]",tables).remove(); 777 | //jQuery(".lsntable_draw").remove(); 778 | } 779 | function Trim(str,is_global) 780 | { 781 | var result; 782 | result = str.replace(/(^\s+)|(\s+jQuery)/g,""); 783 | if(is_global.toLowerCase()=="g") 784 | result = result.replace(/\s/g,""); 785 | return result; 786 | } 787 | 788 | function show_teacher_eval () { 789 | if(!inUrl("/edu/lesson/viewLessonArrange.aspx")) 790 | return; 791 | var lesson_tr = jQuery("#LessonTime1_gridMain").children().children().slice(1); 792 | for (var i = 0; i < lesson_tr.length; i++) { 793 | var name = lesson_tr.slice(i,i+1).children().slice(1,2).text(); 794 | var app_str = name + " ("; 795 | if (eval_list[name] == undefined) { 796 | app_str += "N/A)"; 797 | }else{ 798 | app_str += eval_list[name].slice(0,5) + ")"; 799 | } 800 | lesson_tr.slice(i,i+1).children().slice(1,2).text(app_str); 801 | } 802 | 803 | } 804 | -------------------------------------------------------------------------------- /content_script/data/lesson_data.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Electsys++ Project 3 | * ---------------------------- 4 | * 课程评教数据 5 | */ 6 | 7 | // 通识课列表 8 | // from http://www.jwc.sjtu.edu.cn/web/sjtu/198015-1980000004260.htm 9 | // updated on 2016/12/21 10 | 11 | var GE_list = { 12 | '时装文化与流行鉴赏': 1, 13 | '创新与创业': 1, 14 | '创新与创业(2)': 1, 15 | '建筑艺术欣赏': 1, 16 | '艺术哲学': 1, 17 | '中西方建筑文化': 1, 18 | '中国美术史': 1, 19 | '认知艺术': 1, 20 | '生命伦理学': 1, 21 | '中医药与中华传统文化': 1, 22 | '认知科学与语言': 1, 23 | '大学语文': 1, 24 | '清代文祸与文化': 1, 25 | '精神分析与文学': 1, 26 | '文学与人生': 1, 27 | '中国传统经典的阅读与翻译': 1, 28 | '《论语》导读': 1, 29 | '中国古典小说名著解读': 1, 30 | '唐诗讲读': 1, 31 | '宋词经典赏析': 1, 32 | '小说与人生': 1, 33 | '中国现代文学与文化': 1, 34 | '中国古诗词': 1, 35 | '古典诗文选读': 1, 36 | '中国的世界文化与自然遗产': 1, 37 | '中国现代诗歌导读': 1, 38 | '文字中国': 1, 39 | '中国艺术史': 1, 40 | '古典诗文名篇选读': 1, 41 | '唐诗宋词人文解读': 1, 42 | '文字中国': 1, 43 | '红楼梦研究': 1, 44 | '汉字文化': 1, 45 | '中国古典小说名著欣赏': 1, 46 | '唐宋诗词鉴赏': 1, 47 | '外国文学史(B类)': 1, 48 | '中国古代文学史': 1, 49 | '当代西方人文艺术思潮': 1, 50 | '西方宗教文化概论': 1, 51 | '中日科技文化交流': 1, 52 | '外国人眼里的中国与百年来的中外交流': 1, 53 | '韩国道德教育文化漫谈': 1, 54 | '文学与文化': 1, 55 | '台湾文学与文化': 1, 56 | '欧亚文化节庆研讨': 1, 57 | '遗产学--世界艺术史及遗产在21世纪的全球性挑战': 1, 58 | '文学人类学': 1, 59 | '世界华文文学专题': 1, 60 | '书法艺术': 1, 61 | '篆刻艺术': 1, 62 | '翻译有"道"': 1, 63 | '英语写作': 1, 64 | '上海城的电影和音乐': 1, 65 | '电影美学导论': 1, 66 | '影视艺术理论及鉴赏': 1, 67 | '美国电影文化专题': 1, 68 | '海外华语电影鉴赏': 1, 69 | '影视文化与艺术': 1, 70 | '享受古典': 1, 71 | '动画导论': 1, 72 | '与风景的对话——中外园林艺术欣赏': 1, 73 | '德国社会史': 1, 74 | '西方音乐文化史': 1, 75 | '中国现代史重大问题研究': 1, 76 | '通俗明史': 1, 77 | '当代中国外交史': 1, 78 | '清史演义': 1, 79 | '外国美术史': 1, 80 | '晚期帝制中国:1279-1911': 1, 81 | '影像与历史': 1, 82 | '中西文化交流': 1, 83 | '世界历史名人评传': 1, 84 | '古罗马文明': 1, 85 | '日本近现代史': 1, 86 | '世界文明中的科学技术': 1, 87 | '欧洲文明史概论': 1, 88 | '中国儒学史': 1, 89 | '日本现代史': 1, 90 | '回忆录、口述史与二十世纪中国': 1, 91 | '城市文明史': 1, 92 | '欧洲中世纪城市研究': 1, 93 | '20世纪欧洲史': 1, 94 | '世界艺术史(1600年前)': 1, 95 | '新双城记:从上海看近代中国之历史与文明': 1, 96 | '近代世界发展史': 1, 97 | '1700-2000年新中国新历史': 1, 98 | '东京审判': 1, 99 | '美国历史上的重大问题': 1, 100 | '20世纪的世界': 1, 101 | '科学技术史': 1, 102 | '美国简史': 1, 103 | '认识自己': 1, 104 | '美学概论': 1, 105 | '从世界文学的视野反思中国现代文学': 1, 106 | '交响音乐鉴赏': 1, 107 | '古典音乐欣赏': 1, 108 | '欧洲古典音乐': 1, 109 | '音乐鉴赏': 1, 110 | '音乐鉴赏(B)': 1, 111 | '佛教与中国传统文化': 1, 112 | '宇宙论的历史与哲学': 1, 113 | '20世纪哲学': 1, 114 | '中西方医学哲学思想之比较': 1, 115 | '美学': 1, 116 | '西方哲学史': 1, 117 | '虚构的时代——对古典时期哲学的解读': 1, 118 | '哲学导论': 1, 119 | '国花、市花鉴赏': 1, 120 | '积极心理学': 1, 121 | '现代心理学': 1, 122 | '欧洲文明史': 1, 123 | '中国改革开放史': 1, 124 | '非洲文明': 1, 125 | '中国民俗': 1, 126 | '中国文化通论': 1, 127 | '中国历史地理': 1, 128 | '20世纪西方思想文化潮流': 1, 129 | '士人与中国社会': 1, 130 | '现代中国传媒与知识分子': 1, 131 | '全球化时代的英语学习与跨文化研究': 1, 132 | '民俗与中国文化': 1, 133 | '由李约瑟难题看中国传统科技文明': 1, 134 | '建国以来重大历史问题研究': 1, 135 | '伦理范畴的演绎及现代应用伦理的发展': 1, 136 | '本科生精神境况研究': 1, 137 | '欧美文化史': 1, 138 | '表演艺术欣赏与批评': 1, 139 | '英语视听说': 1, 140 | '英语写作能力的自我培养与提高': 1, 141 | '大学生传媒素养研究(B)': 1, 142 | '影视艺术': 1, 143 | '艺术设计': 1, 144 | '交响音乐的内涵与外延发展研讨': 1, 145 | '大学生传媒素养': 1, 146 | '体育锻炼与生活方式': 1, 147 | '国花、市花鉴赏': 1, 148 | '现代西方哲学': 1, 149 | '我和“大师”面对面——追寻科学大家的成功轨迹': 1, 150 | '传播心理学': 1, 151 | '中国现代史': 1, 152 | '科学史上的竞争学说个案研讨': 1, 153 | '如何思考和解答李约瑟难题': 1, 154 | '西方美术与创新思维': 1, 155 | '艺术与科学:数字与信息化时代的艺术特征': 1, 156 | '美苏冷战争霸史': 1, 157 | '中国早期思想经典选读': 1, 158 | '西方现代文化思潮': 1, 159 | '美国华人简史': 1, 160 | '创意思维与设计': 1, 161 | '管理基础': 2, 162 | '微观经济学': 2, 163 | '电子商务基础': 2, 164 | 'WTO法律文件选读': 2, 165 | '网络环境下的文科信息检索': 2, 166 | '知识管理理论与实务': 2, 167 | '工程技术管理': 2, 168 | '中国管理智慧': 2, 169 | '管理经济学(A类)': 2, 170 | '国学与领导力发展': 2, 171 | '大学生创业基础': 2, 172 | '创新方法与实践': 2, 173 | '领导学': 2, 174 | '领导学(A类)': 2, 175 | '消费者行为学(A)': 2, 176 | '管理哲学': 2, 177 | '消费者行为学': 2, 178 | '从居住文化看世界史': 2, 179 | '遗传与社会': 2, 180 | '性与健康': 2, 181 | '普通心理学': 2, 182 | '市场营销学(A类)': 2, 183 | '管理心理学(B类)': 2, 184 | '市场调查与分析': 2, 185 | '技术经济学(B类)': 2, 186 | '管理学': 2, 187 | '项目管理': 2, 188 | '企业伦理学': 2, 189 | '风险管理': 2, 190 | '《论语》、《孟子》选讲': 2, 191 | '当代消费文化': 2, 192 | '文化多元主义与领导学': 2, 193 | '《论语》、《孟子》选讲': 2, 194 | '微观经济学(B类)': 2, 195 | '网络经济与管理': 2, 196 | '环境经济与管理(B类)': 2, 197 | '宏观经济学(B类)': 2, 198 | '西方经济学(B类)': 2, 199 | '工程经济学(F类)': 2, 200 | '发展经济学专题': 2, 201 | '一周财经评论': 2, 202 | '英文经济指标与指数阅读': 2, 203 | '经济学': 2, 204 | '中国经济专题': 2, 205 | '中国医疗保险制度转型(B类)': 2, 206 | '生态安全与生态文明': 2, 207 | '环保产业发展与卓越工程教育': 2, 208 | '金融学(A类)': 2, 209 | '证券投资学': 2, 210 | '证券投资分析(B类)': 2, 211 | '国际金融(A类)': 2, 212 | '证券投资分析': 2, 213 | '上海社会史专题': 2, 214 | '新闻与传播概论': 2, 215 | '大众传播与社会问题': 2, 216 | '网络传播学': 2, 217 | '两岸税制改革比较': 2, 218 | '知识产权管理': 2, 219 | '中国宪法的实施及其保障': 2, 220 | '国际法与国际秩序': 2, 221 | '大学生劳动就业中的法律问题探究': 2, 222 | '普通心理学': 2, 223 | '跨文化沟通心理学': 2, 224 | '市场营销学(C类)': 2, 225 | '城市管理概论': 2, 226 | '社会学概论': 2, 227 | '大国战略': 2, 228 | '当代中国外交经典案例分析': 2, 229 | '社会保障:理论基础与热点解读': 2, 230 | '中俄关系:过去、现在与未来': 2, 231 | '民族主义与族群政治': 2, 232 | '西方福利国家研究': 2, 233 | '现代城市发展论': 2, 234 | '当代国际社会热点问题透视': 2, 235 | '当代美国公共经济': 2, 236 | '政府与市场': 2, 237 | '中国政治思想史': 2, 238 | '全球化的政治经济学': 2, 239 | '国际安全': 2, 240 | '危机与公共关系': 2, 241 | '电影与政治': 2, 242 | '中国政治制度': 2, 243 | '公民社会与非政府组织': 2, 244 | '当代中国外交热点议题分析': 2, 245 | '政府公共关系原理与实践': 2, 246 | '国际关系学导论': 2, 247 | '当代中国政治发展': 2, 248 | '发展的政治经济学分析': 2, 249 | '国际关系理论导读': 2, 250 | '美国现代城市规划': 2, 251 | '当代中国的政治经济学': 2, 252 | '战后政府角色的变更': 2, 253 | '社会运动概论': 2, 254 | '宗教与社会': 2, 255 | '博弈论初基': 2, 256 | '社会观察与探索': 2, 257 | '政治社会学导论': 2, 258 | '领导力学习与实践': 2, 259 | '比较政治学导论': 2, 260 | '比较政治分析': 2, 261 | '治理之善:公共行政热点解析': 2, 262 | '新形势下的两岸关系专题研究': 2, 263 | '公共关系学概论': 2, 264 | '当代美国外交决策实例': 2, 265 | '现代日本政治': 2, 266 | '社会心理学': 2, 267 | '社会人口学': 2, 268 | '先锋艺术和城市': 2, 269 | '冷战与中国': 2, 270 | '日本社会与近代化': 2, 271 | '社会学与生活': 2, 272 | '日本社会与现代化': 2, 273 | '职业生涯发展与规划': 2, 274 | '科技伦理专题': 2, 275 | '美国社会与文化': 2, 276 | '上海社会与文化': 2, 277 | '社会学': 2, 278 | '管理理论与实践': 2, 279 | '国际关系与全球化问题刍议': 2, 280 | '台湾政治变化与两岸关系的前景(B)': 2, 281 | '环境热点专题': 2, 282 | '英美报刊时事评介': 2, 283 | '高跟鞋踩碎小猫脑袋:多学科的法律分析': 2, 284 | '知识产权的多维视角': 2, 285 | '国际金融法': 2, 286 | '多元化纠纷解决机制': 2, 287 | '台湾政治变化与两岸关系的前景': 2, 288 | '公共管理艺术探究': 2, 289 | '国际传播与对外报道(研讨)': 2, 290 | '政府治理危机与改革分析': 2, 291 | '叶利钦、普京与俄罗斯': 2, 292 | '中国崛起进程中的战争与战略问题': 2, 293 | '医药创新在国民经济中的角色': 2, 294 | '叶利钦、普京与俄罗斯(A)': 2, 295 | '活动策划组织艺术': 2, 296 | '现代中日关系': 2, 297 | '管理哲学研讨': 2, 298 | '政府治理转型与公民社会成长': 2, 299 | '不确定情况下的决策问题': 2, 300 | '经济学的思维方式': 2, 301 | '中国汽车制造业如何从大国走向强国': 2, 302 | '知识创新--新媒体时代的视角': 2, 303 | '多维视角看法律': 2, 304 | '中国新闻解读与中国问题研究': 2, 305 | '城市学入门': 2, 306 | '低碳发展的经济性思考': 2, 307 | '什么是数字新媒体产业(TMT)': 2, 308 | '商务沟通与道德': 2, 309 | '群体认知与群体行为': 2, 310 | '时政评论': 2, 311 | '反恐怖战略研究': 2, 312 | '经济全球化的分析视野': 2, 313 | '生物医药科技领域的创新与创业': 2, 314 | '生物产业的职业发展机会': 2, 315 | '绩效管理何以致胜:从个人、组织到区域': 2, 316 | '创业管理': 2, 317 | '孙子兵法': 2, 318 | '珠宝鉴赏': 3, 319 | '信息素养': 3, 320 | '创新方法': 3, 321 | '航空航天概论': 3, 322 | '化学电源的现状和未来展望': 3, 323 | '空气污染控制与洁净技术': 3, 324 | '生命科学导论实验': 3, 325 | '生命科学发展史': 3, 326 | '生物技术概论': 3, 327 | '微生物的世界': 3, 328 | '从脑到行为': 3, 329 | '生物工程导论': 3, 330 | '植物育性、花发育和生物技术': 3, 331 | '脑的真相': 3, 332 | '生物信息学概论': 3, 333 | '从脑到行为': 3, 334 | '极端环境中的微生物生命': 3, 335 | '地球生命': 3, 336 | '社会精神医学': 3, 337 | '传统医学与人类健康': 3, 338 | '诺贝尔医学奖': 3, 339 | '现代医学导论': 3, 340 | '急救与自救技能': 3, 341 | '中国功夫与经络': 3, 342 | '信息与感知': 3, 343 | '光电科技与生活应用': 3, 344 | '工程实践与科技创新2A': 3, 345 | '工程实践与科技创新2B': 3, 346 | '工程实践与科技创新Ⅱ-A': 3, 347 | '工程实践与科技创新Ⅱ-B': 3, 348 | '材料力学发展、计算力学、哈密顿体系': 3, 349 | '环境工程导论(A类)': 3, 350 | '环境与健康': 3, 351 | '绿色技术的可持续发展分析': 3, 352 | '人与环境:可持续发展': 3, 353 | '企业信息化与知识工程': 3, 354 | '系统建模方法与应用': 3, 355 | '随机优化': 3, 356 | '数学之旅': 3, 357 | '工程技术拓展': 3, 358 | '现代制造中的质量管理与统计方法': 3, 359 | '汽车文化': 3, 360 | '制造创新': 3, 361 | '人类与核科技发展': 3, 362 | '宇宙科学导论': 3, 363 | '地球科学': 3, 364 | '主宰世界的七个方程': 3, 365 | '能源物理': 3, 366 | '物理异想': 3, 367 | '果壳中的量子场:起始编': 3, 368 | '科学前沿与哲学': 3, 369 | '中药学通论': 3, 370 | '杏林探宝---带你走进中药': 3, 371 | '新能源技术及应用': 3, 372 | '能源与可持续发展': 3, 373 | '科技传播与科普创作': 3, 374 | '科技前沿与热点': 3, 375 | '自然界中的混沌与分岔': 3, 376 | '可再生能源的高效转换与利用': 3, 377 | '核能与环境': 3, 378 | '先进核能系统': 3, 379 | '人与室内环境': 3, 380 | '奇妙的低温世界': 3, 381 | '从细胞到分子': 3, 382 | '植物生物技术——过去、现在和未来': 3, 383 | '植物嫁接理论与技术': 3, 384 | '原子核的内部结构': 3, 385 | '功能氧化物材料制备及晶体生长科学': 3, 386 | '探索复杂网络': 3, 387 | '普适数字学习': 3, 388 | '从环境监测谈科学研究': 3, 389 | '生态问题与研究': 3, 390 | '纳米世界的科学与艺术': 3, 391 | '动物运动和生长中的力学奥秘': 3, 392 | '生命科学热点': 3, 393 | '生物信息学、计算生物学前沿研讨': 3, 394 | '社会发展对生物工程的挑战': 3, 395 | '体验化学的魅力': 3, 396 | '能源化学工程': 3, 397 | '电化学能量储存与转化': 3, 398 | '研究者的乐趣和资质-以船、海工程为例': 3, 399 | '镁合金及其成形技术': 3, 400 | '21世纪工程人才的能力建设': 3, 401 | '植物病害诊断技术': 3, 402 | '材料科学的基本研究方法': 3, 403 | '多彩的纳米世界': 3, 404 | '走进纳米世界': 3, 405 | '神经科学前沿问题及信息学方法': 3, 406 | '遗传毒理与疾病': 3, 407 | '生命的奥秘-生物信息学前沿研讨': 3, 408 | '生物智能与生物计算机': 3, 409 | '走近生命科学技术领域': 3, 410 | '数学在水资源和环境科学研究中的价值': 3, 411 | '光子学与信息技术': 3, 412 | '核能发展与展望': 3, 413 | '全球气候变暖与二氧化碳减排': 3, 414 | '航空航天技术历史与展望': 3, 415 | '服务计算研讨': 3, 416 | '量子信息与移动通信': 3, 417 | '竞技运动中的科学技术': 3, 418 | '智能维护系统中的若干关键问题探讨': 3, 419 | '光纤通信与全光网技术的发展': 3, 420 | '在你身边的系统科学': 3, 421 | '人工心脏辅助系统初探': 3, 422 | '化学产品设计与实践': 3, 423 | '绝对零度的奇迹:超流与超导': 3, 424 | '智能材料、结构、系统与应用': 3, 425 | '生物智能与生物信息学': 3, 426 | '能源与环境': 3, 427 | '神奇的催化剂—新能源开发和环境净化中的催化技术': 3, 428 | '全球天然气发展与展望': 3, 429 | '健康与植物': 3, 430 | '吃出美丽和健康——食物营养与健康研讨': 3, 431 | '低温科学和技术': 3, 432 | '核能与环境(A)': 3, 433 | '科学与自然中的研究思想和方法探讨(A)': 3, 434 | '体验介孔材料': 3, 435 | '心血管力学生物学导论': 3, 436 | '中枢神经系统高级功能研究的最新进展': 3, 437 | '体验虚拟现实': 3, 438 | '超导体及其应用': 3, 439 | '基因追踪': 3, 440 | '高等植物中的信号转导': 3, 441 | '创新思维与现代设计': 3, 442 | '宇宙、自然与人类': 3, 443 | '系统生物学前沿研讨': 3, 444 | '生物医学制造与人工器官': 3, 445 | '新概念热学及其在过程优化中的应用': 3, 446 | '从手工创意到数字模型:技术与实践': 3, 447 | '未来工厂数字化运作管理系统': 3, 448 | '工业与环境微生物技探讨': 3, 449 | '药学、化学山海经': 3, 450 | '探测微观世界的手段和方法': 3, 451 | '现代农业与生态文明': 3, 452 | '农业有害生物防控的基因设计': 3, 453 | '汽车文化与设计哲学': 3, 454 | '元素揭秘': 3, 455 | '人造器官与再生医学': 3, 456 | '生命科学中的化学反应:分子生物信息学前沿研讨': 3, 457 | '宇宙、自然与人类(A)': 3, 458 | '医工交叉学科前沿研讨': 3, 459 | '生命科学研究艺术': 3, 460 | '遗传发育与精神神经疾病': 3, 461 | '计算生物学与人体健康研究': 3, 462 | '“酶”的进化历程与未来': 3, 463 | '生物技术与我们的生活': 3, 464 | '微生物海洋学与极端生命': 3, 465 | '工业与环境微生物技术': 3, 466 | '分子信息学前沿研讨': 3, 467 | '功能氧化物材料制备及晶体生长科学(A)': 3, 468 | '介孔材料': 3, 469 | '元素揭秘': 3, 470 | '组合优化入门': 3, 471 | '基因与人': 3, 472 | '21世纪企业制造模式-精益生产': 3, 473 | '汽车文化与设计哲学(A)': 3, 474 | '工程科学研究方法': 3, 475 | '摇橹船的力学': 3, 476 | '科学与自然中的研究思想与方法探讨': 3, 477 | '超临界流体的奇妙世界': 3, 478 | '多彩的纳米世界(A)': 3, 479 | '核燃料循环': 3, 480 | '纳米科技与未来世界': 3, 481 | '奇妙的低温世界(A)': 3, 482 | '汽车安全的技术与法律基础': 3, 483 | '汽车节能环保与清洁能源': 3, 484 | '体验虚拟现实(A)': 3, 485 | '生命科学中的计算化学:分子生物信息学前沿研讨': 3, 486 | '微生物基因组学与抗菌素耐药性': 3, 487 | '生命科学史': 3, 488 | '学习记忆及神经精神疾病的神经生物学': 3, 489 | '海洋科学': 3, 490 | '纳米生物材料': 3, 491 | '心血管疾病生物学': 3, 492 | '随机性、复杂性初探': 3, 493 | '新船型研究与探索': 3, 494 | '交通运输工程前沿': 3, 495 | '现代无线通信系统架构及新型应用': 3, 496 | '数字视频及其应用': 3, 497 | '信息技术百年回顾与展望': 3, 498 | '电化学与新能源汽车的未来': 3, 499 | '能源与环境系统工学导论': 3, 500 | '现代车辆新技术及发展趋势': 3, 501 | '脑的奥秘与精神健康': 3, 502 | '创新能力培养': 3, 503 | '营养、菌群与健康': 3, 504 | '现代社会发展中的人类健康问题之思考': 3, 505 | '从设计创意到数字模型:技术与实践': 3, 506 | '聚合物电介质': 3, 507 | '绝对零度的奇迹:超流与超导': 3, 508 | '探访生命科学': 3, 509 | '物理学:传统与文化': 3, 510 | '材料的乐趣': 3, 511 | '行为遗传学研讨': 3, 512 | '数字图像处理': 3, 513 | '分形与混沌:复动力系统': 3, 514 | '汽车文化': 3, 515 | '生物医学制造与人工器官': 3, 516 | '食品、营养与健康': 3, 517 | '工业工程与管理艺术': 3, 518 | '能源与环境问题研讨': 3, 519 | '材料加工智能化发展引论': 3, 520 | '土木建筑与可持续发展': 3, 521 | '3S技术——遥感、导航与地理信息系统': 3, 522 | '信息光子学导论': 3, 523 | '植物信号转导及调控机制': 3, 524 | '干细胞与组织工程': 3, 525 | '微生物海洋学与极端生命': 3, 526 | '酶分子进化历程及其应用': 3, 527 | '全球天然气发展与展望': 3, 528 | '二氧化碳资源化利用技术进展': 3, 529 | '自然启迪的材料制备科学': 3, 530 | '材料人生': 3, 531 | '核能及核安全': 3, 532 | '汽车概论': 3, 533 | '走进神秘的番茄世界': 3, 534 | '探索奇妙的蛋白质世界': 3, 535 | '多孔材料': 3, 536 | '能量转换——从瓦特蒸汽机到燃气轮机': 3, 537 | '车联网与智慧城市': 3, 538 | '新概念汽车探讨与设计': 3, 539 | '都市现代农业工程': 3, 540 | '纳米生物材料': 3, 541 | '海洋环境、生命与技术': 3, 542 | '电子废物-资源-环境': 3, 543 | '热物理学的建立与演化': 3, 544 | '智能材料、结构、系统与应用': 3, 545 | '先进核能系统材料:挑战与展望': 3, 546 | '植物生物技术:过去、现在和未来': 3, 547 | '全球变化概论:原因和应对策略': 3, 548 | '生命科学前沿新技术及其产业化': 3, 549 | '环境修复与人类健康': 3, 550 | '食品与工业微生物学': 3, 551 | '生物统计与医疗健康大数据前沿': 3, 552 | '转化医学研究中的生物统计': 3, 553 | '旅游地理学': 3, 554 | '数学史(A类)': 4, 555 | '符号动力系统与编码(A)': 4, 556 | '模糊数学及其应用': 4, 557 | '算法图论': 4, 558 | 'Mathematical Discovery': 4, 559 | '代数学及其在信息科学中的应用': 4, 560 | '数学赏析与唐诗格律': 4, 561 | '关于无穷性的数学考察': 4, 562 | '区间图,弦图以及其它': 4, 563 | '从区间谈起': 4, 564 | '二元域上的算术': 4, 565 | '组合数学选讲': 4, 566 | '': 0 567 | }; 568 | 569 | var eval_list = { 570 | "Duane": "91.4786", 571 | "Susan": "82.6492", 572 | "Zimmer": "89.7963", 573 | "丁兴华": "92.0468", 574 | "丁希凡": "93.0307", 575 | "丁晓萍": "85.3117", 576 | "丁玲娣": "92.8125", 577 | "万德成": "94.545", 578 | "严亚贤": "96.346", 579 | "乐经良": "97.7043", 580 | "乔树通": "78.053", 581 | "于文灏": "90.9283", 582 | "于杨": "95.185", 583 | "于江": "96.4805", 584 | "于洪洁": "82.6345", 585 | "于红妍": "97.2455", 586 | "于随然": "93.718", 587 | "井淼": "95.1623", 588 | "仇毅翔": "92.4745", 589 | "仇璘": "94.724", 590 | "付宇卓": "94.625", 591 | "仰书纲": "83.073", 592 | "任吉存": "88.198", 593 | "任天辉": "94.312", 594 | "任奇志": "95.2075", 595 | "任庆生": "94.9975", 596 | "任玉雪": "89.8741", 597 | "伍芳林": "93.648", 598 | "何卫峰": "95.397", 599 | "何圣兵": "92.732", 600 | "何小刚": "96.818", 601 | "何浩": "92.623", 602 | "何涪嘉": "88.4267", 603 | "何渊": "93.217", 604 | "何艳": "96.3401", 605 | "何迪": "92.858", 606 | "何铭": "98.9085", 607 | "余军扬": "91.8233", 608 | "余征跃": "93.756", 609 | "余文胜": "97.0447", 610 | "余晓蔚": "93.741", 611 | "余莉": "92.022", 612 | "余颖": "95.584", 613 | "佴怀青": "97.658", 614 | "侯建荣": "90.443", 615 | "俞勇": "98.0387", 616 | "俞晖": "97.6495", 617 | "俞炜": "92.283", 618 | "倪安宁": "86.322", 619 | "倪邦辉": "88.37", 620 | "傅亚平": "91.945", 621 | "傅学良": "81.9205", 622 | "傅炯": "86.7117", 623 | "傅育熙": "93.514", 624 | "全林": "84.9652", 625 | "关增建": "94.1445", 626 | "其木提": "96.5357", 627 | "冯仕猛": "95.9645", 628 | "冯正平": "95.004", 629 | "冯霞": "92.4315", 630 | "凌德祥": "95.446", 631 | "凌惠琴": "93.566", 632 | "凌金铸": "88.8615", 633 | "刘世前": "93.654", 634 | "刘世勇": "96.354", 635 | "刘东": "93.35", 636 | "刘为": "89.492", 637 | "刘乃实": "97.3283", 638 | "刘伟": "98.608", 639 | "刘佑军": "92.571", 640 | "刘佳林": "86.8753", 641 | "刘军荣": "83.269", 642 | "刘功申": "88.502", 643 | "刘华": "94.229", 644 | "刘士林": "90.6617", 645 | "刘小凯": "94.5277", 646 | "刘帮成": "86.982", 647 | "刘建华": "80.9023", 648 | "刘振华": "92.7055", 649 | "刘文江": "95.545", 650 | "刘春颖": "94.5355", 651 | "刘杨": "91.532", 652 | "刘桦": "90.921", 653 | "刘海涛": "89.7237", 654 | "刘涛": "94.2145", 655 | "刘滢": "87.975", 656 | "刘立萍": "96.97", 657 | "刘统": "98.4685", 658 | "刘美香": "94.2389", 659 | "刘群录": "93.8185", 660 | "刘萍": "96.63", 661 | "刘西拉": "98.189", 662 | "刘龙根": "89.904", 663 | "匡波": "95.0115", 664 | "卓建伟": "95.8633", 665 | "单世联": "96.087", 666 | "单娟": "94.5693", 667 | "卢俊国": "87.6015", 668 | "卢小军": "94.7064", 669 | "卢文发": "96.1533", 670 | "卫淑芝": "94.6648", 671 | "史为临": "96.3288", 672 | "史子兴": "92.257", 673 | "史小宁": "91.848", 674 | "史清华": "89.198", 675 | "史益敏": "92.618", 676 | "叶冠林": "96.839", 677 | "叶强": "95.2665", 678 | "叶汉忠": "95.1134", 679 | "司梅": "85.548", 680 | "吉小军": "96.451", 681 | "向光辉": "95.079", 682 | "吕忆松": "97.657", 683 | "吕晓俊": "88.5185", 684 | "吕智国": "96.067", 685 | "吕浩": "93.153", 686 | "吕爱民": "87.441", 687 | "吴亚妮": "97.5015", 688 | "吴保华": "91.7525", 689 | "吴冲锋": "96.8555", 690 | "吴刚": "96.5493", 691 | "吴剑锋": "76.2313", 692 | "吴勇军": "91.7095", 693 | "吴卫生": "89.599", 694 | "吴天行": "91.466", 695 | "吴家春": "91.6545", 696 | "吴德意": "92.605", 697 | "吴忠英": "89.476", 698 | "吴慧英": "95.5655", 699 | "吴新忠": "89.2684", 700 | "吴明媛": "95.32", 701 | "吴爱平": "90.0015", 702 | "吴耀琨": "96.5975", 703 | "吴诗玉": "90.9123", 704 | "吴越": "93.286", 705 | "吴迪": "95.954", 706 | "吴静怡": "93.0212", 707 | "周丕生": "86.321", 708 | "周国华": "96.0722", 709 | "周国强": "89.47", 710 | "周宏": "91.2085", 711 | "周岸勤": "93.4443", 712 | "周希朗": "91.6253", 713 | "周年国": "81.3486", 714 | "周建国": "95.4352", 715 | "周憬宇": "84.6425", 716 | "周拥军": "90.3798", 717 | "周春琴": "96.7885", 718 | "周朝民": "92.5083", 719 | "周栋焯": "96.499", 720 | "周泽红": "91.731", 721 | "周玉燕": "95.7893", 722 | "周玲玲": "98.0037", 723 | "周瑜": "88.0102", 724 | "周越": "95.541", 725 | "周越美": "68.3169", 726 | "周钢": "97.7497", 727 | "周锦鑫": "89.599", 728 | "周颖": "92.6365", 729 | "咸进国": "95.5643", 730 | "唐东芹": "92.508", 731 | "唐克轩": "98.596", 732 | "唐宗明": "96.1657", 733 | "喜苏南": "95.8585", 734 | "夏中义": "87.1475", 735 | "夏利娟": "97.009", 736 | "夏玉蓉": "97.487", 737 | "奚俊芳": "95.6555", 738 | "奚立峰": "95.463", 739 | "姚卫红": "93.7983", 740 | "姚君喜": "95.033", 741 | "姚天昉": "90.606", 742 | "姚志红": "92.489", 743 | "姚旭峰": "82.8658", 744 | "姚晓敏": "93.152", 745 | "姚欣保": "94.5292", 746 | "姚武": "96.9392", 747 | "姚淑平": "97.2298", 748 | "姚莉秀": "90.113", 749 | "姚莉韵": "91.3825", 750 | "姚迪": "91.09", 751 | "姚雷": "91.2005", 752 | "姜淑忠": "92.88", 753 | "姜淳": "93.46", 754 | "姜翠波": "98.41", 755 | "姜萍萍": "91.3735", 756 | "姜静": "90.096", 757 | "孔令体": "95.951", 758 | "孔向阳": "92.492", 759 | "孔繁强": "96.4895", 760 | "孙同华": "89.23", 761 | "孙坚": "93.251", 762 | "孙扬": "95.686", 763 | "孙涵": "92.8881", 764 | "孙焱": "86.546", 765 | "孙雁": "99.093", 766 | "孟令兵": "91.6083", 767 | "孟和": "96.3037", 768 | "孟桂娥": "96.2738", 769 | "孟玲玲": "89.5825", 770 | "孟魁": "90.423", 771 | "安丽桥": "91.1959", 772 | "宋健": "92.2573", 773 | "宋元斌": "93.34", 774 | "宋宝瑞": "89.149", 775 | "宋文滨": "94.485", 776 | "宋春阳": "91.382", 777 | "宋春雨": "91.539", 778 | "宋晓冰": "95.401", 779 | "宋苏晨": "94.0257", 780 | "宣安": "92.9234", 781 | "宦飞": "94.159", 782 | "宫新保": "95.6475", 783 | "宾凯": "95.856", 784 | "寇新建": "96.049", 785 | "尹梅": "90.5425", 786 | "尹海涛": "96.139", 787 | "崔勇": "95.7685", 788 | "崔立": "86.614", 789 | "左亚娜": "88.881", 790 | "左晓岚": "79.763", 791 | "市川智生": "92.975", 792 | "席涛": "86.3102", 793 | "庄天红": "92.4388", 794 | "庄晖": "87.555", 795 | "康东元": "88.8677", 796 | "廖海波": "84.9297", 797 | "张丹丹": "98.228", 798 | "张丽清": "92.443", 799 | "张亚光": "94.0373", 800 | "张仁伟": "87.533", 801 | "张健": "87.441", 802 | "张光连": "92.3777", 803 | "张兴福": "96.8987", 804 | "张冬茉": "92.9469", 805 | "张勇健": "90.681", 806 | "张卫": "95.0145", 807 | "张同珍": "93.7397", 808 | "张君": "91.3233", 809 | "张哲敏": "81.5299", 810 | "张国良": "96.675", 811 | "张士文": "94.493", 812 | "张学昆": "86.425", 813 | "张小凡": "94.0643", 814 | "张峰": "94.2532", 815 | "张帆": "96.652", 816 | "张建华": "89.0937", 817 | "张志刚": "93.7975", 818 | "张忠能": "94.4615", 819 | "张振南": "88.617", 820 | "张晓君": "92.721", 821 | "张晓梅": "93.2085", 822 | "张晨利": "94.6985", 823 | "张沁": "92.9288", 824 | "张沛超": "95.612", 825 | "张洁": "73.971", 826 | "张海燕": "93.1243", 827 | "张清": "92.104", 828 | "张炽伟": "89.2615", 829 | "张玉梅": "88.346", 830 | "张祥": "91.2645", 831 | "张立群": "90.0784", 832 | "张绍谦": "99.378", 833 | "张维竞": "96.519", 834 | "张艳萍": "93.897", 835 | "张荔": "96.1523", 836 | "张菁": "95.1693", 837 | "张蕴艳": "91.9966", 838 | "张蕾": "91.2327", 839 | "张辉": "89.807", 840 | "张逸阳": "92.5373", 841 | "张邻": "87.1693", 842 | "张雪洪": "87.9245", 843 | "张雪珍": "96.1756", 844 | "张雷明": "95.678", 845 | "张静抒": "92.8065", 846 | "张鸿刚": "93.966", 847 | "彭宏利": "89.462", 848 | "彭崇胜": "87.4841", 849 | "彭建平": "94.577", 850 | "彭春露": "54.168", 851 | "彭育波": "95.278", 852 | "徐一峰": "93.381", 853 | "徐临江": "90.2253", 854 | "徐丽群": "85.1545", 855 | "徐兵": "91.0108", 856 | "徐宇虹": "89.639", 857 | "徐峰": "88.6673", 858 | "徐庆华": "94.0938", 859 | "徐彦冰": "95.4287", 860 | "徐昌庆": "96.427", 861 | "徐榕": "86.7367", 862 | "徐永福": "91.107", 863 | "徐萍": "93.18", 864 | "徐雄": "93.2505", 865 | "戚嵘嵘": "97.545", 866 | "戴力农": "88.4078", 867 | "戴永明": "91.6277", 868 | "文学武": "95.2704", 869 | "方从启": "96.4985", 870 | "方向忠": "96.041", 871 | "方荣青": "96.0542", 872 | "方青": "95.0988", 873 | "施亮": "96.3295", 874 | "施健": "95.2477", 875 | "施光林": "94.6095", 876 | "施立峻": "91.3453", 877 | "施英": "84.4957", 878 | "易新": "93.0317", 879 | "易晓明": "91.609", 880 | "曹其新": "92.2544", 881 | "曹慧": "95.8064", 882 | "曹林奎": "94.102", 883 | "曹树基": "93.677", 884 | "曹永康": "89.675", 885 | "曹萌": "95.261", 886 | "曹越平": "92.146", 887 | "曹阳": "96.688", 888 | "曾丽": "93.428", 889 | "曾赛星": "89.848", 890 | "曾进": "83.105", 891 | "朱一凡": "94.302", 892 | "朱丹": "88.4942", 893 | "朱佐农": "98.4555", 894 | "朱兰娟": "94.4413", 895 | "朱兴和": "86.7423", 896 | "朱其立": "95.522", 897 | "朱军生": "78.789", 898 | "朱凤军": "94.7495", 899 | "朱南文": "95.563", 900 | "朱卡的": "97.089", 901 | "朱喜": "88.797", 902 | "朱宁嘉": "78.018", 903 | "朱小燕": "91.3707", 904 | "朱建国": "90.2735", 905 | "朱建明": "96.4379", 906 | "朱慧芳": "96.4538", 907 | "朱杰": "94.863", 908 | "朱海洋": "95.1893", 909 | "朱淑文": "93.679", 910 | "朱疆": "94.1365", 911 | "朱虹": "89.4285", 912 | "朱金玉": "80.1043", 913 | "朱黎青": "88.935", 914 | "李丹": "91.175", 915 | "李为民": "98.621", 916 | "李云飞": "94.844", 917 | "李亚纯": "92.5765", 918 | "李亦中": "82.9707", 919 | "李仕健": "86.978", 920 | "李俊明": "94.0454", 921 | "李健": "89.794", 922 | "李先国": "94.313", 923 | "李勇": "82.9875", 924 | "李友林": "90.6645", 925 | "李吉有": "94.7133", 926 | "李大伟": "73.741", 927 | "李宏德": "94.6025", 928 | "李宝鸿": "92.688", 929 | "李寿德": "91.0366", 930 | "李少远": "97.528", 931 | "李康化": "95.3202", 932 | "李建勋": "92.507", 933 | "李建国": "90.981", 934 | "李志勇": "95.754", 935 | "李敏": "69.134", 936 | "李旭光": "88.8728", 937 | "李明发": "93.441", 938 | "李明明": "89.835", 939 | "李春杰": "91.86", 940 | "李春源": "94.6867", 941 | "李晓荣": "93.7013", 942 | "李晓静": "87.7973", 943 | "李晟": "95.4675", 944 | "李柏令": "84.2277", 945 | "李梅": "94.3473", 946 | "李欣": "95.2715", 947 | "李武": "77.3687", 948 | "李洁": "87.5625", 949 | "李海刚": "85.6294", 950 | "李海燕": "88.039", 951 | "李淑慧": "85.666", 952 | "李玉红": "94.942", 953 | "李立学": "93.588", 954 | "李红云": "97.299", 955 | "李红泽": "96.9895", 956 | "李翠莲": "92.8932", 957 | "李艳婷": "93.686", 958 | "李芳": "93.4715", 959 | "李莉": "95.7228", 960 | "李金叶": "93.46", 961 | "李钢": "86.4075", 962 | "李铜忠": "94.7553", 963 | "李铮": "98.4985", 964 | "李银生": "93.874", 965 | "李鸿光": "97.644", 966 | "李鹏程": "92.5093", 967 | "杜婧": "92.2428", 968 | "杜燕": "98.9733", 969 | "杜秀华": "93.3755", 970 | "杜红梅": "91.2115", 971 | "束拉": "94.7042", 972 | "杨一帆": "94.3425", 973 | "杨仁康": "95.4277", 974 | "杨启": "89.135", 975 | "杨学灵": "94.545", 976 | "杨小康": "91.248", 977 | "杨小虎": "90.6743", 978 | "杨峰": "93.828", 979 | "杨忠直": "92.7323", 980 | "杨文圣": "91.296", 981 | "杨斌": "93.041", 982 | "杨旭波": "94.3285", 983 | "杨明": "94.559", 984 | "杨晓玲": "88.227", 985 | "杨海勇": "84.9958", 986 | "杨立": "95.858", 987 | "杨立桃": "79.526", 988 | "杨若林": "98.027", 989 | "杨镜非": "90.719", 990 | "杨雨奇": "95.058", 991 | "林冈": "97.05", 992 | "林喜芬": "97.053", 993 | "林峰": "94.702", 994 | "林彦": "93.051", 995 | "林文胜": "84.003", 996 | "林玉珍": "91.9535", 997 | "林玲": "81.969", 998 | "林赫": "95.112", 999 | "林迅": "83.2277", 1000 | "柏亚东": "88.7388", 1001 | "柳存根": "86.542", 1002 | "柴康敏": "92.7", 1003 | "柴杰": "89.0703", 1004 | "梁培基": "98.023", 1005 | "梁建": "85.57", 1006 | "梁进": "98.632", 1007 | "梁阿磊": "96.4425", 1008 | "樊博": "93.501", 1009 | "武同锁": "98.596", 1010 | "武时颖": "86.129", 1011 | "武爱文": "95.4027", 1012 | "武素珍": "91.293", 1013 | "武邦涛": "95.519", 1014 | "殳国华": "93.07", 1015 | "段沫": "93.253", 1016 | "段海娟": "80.222", 1017 | "毛义梅": "95.1223", 1018 | "毛建军": "92.0214", 1019 | "江志斌": "87.167", 1020 | "江毅": "94.8392", 1021 | "江秀臣": "82.594", 1022 | "汤晓敏": "94.942", 1023 | "汤石章": "93.4042", 1024 | "汪云霞": "92.7698", 1025 | "汪国山": "90.914", 1026 | "汪国琴": "98.392", 1027 | "汪济生": "83.949", 1028 | "汪蓉": "89.353", 1029 | "汪雨申": "98.5488", 1030 | "汪静": "98.425", 1031 | "沈亚丽": "94.6718", 1032 | "沈吟菲": "91.7052", 1033 | "沈备军": "92.306", 1034 | "沈延兵": "81.751", 1035 | "沈思玮": "88.3027", 1036 | "沈惠璋": "98.041", 1037 | "沈水龙": "95.918", 1038 | "沈灏": "98.658", 1039 | "沈炎": "95.9", 1040 | "沈玮": "94.7977", 1041 | "沈琦": "94.257", 1042 | "沈豪": "93.08", 1043 | "洪嘉振": "96.12", 1044 | "浦耿强": "93.543", 1045 | "滕念管": "94.16", 1046 | "滕金芳": "96.1255", 1047 | "潘倩菲": "92.146", 1048 | "潘卫国": "95.3994", 1049 | "潘星辉": "77.594", 1050 | "潘玉春": "93.965", 1051 | "潘理": "90.267", 1052 | "熊德文": "97.832", 1053 | "牛金海": "89.73", 1054 | "王业": "95.155", 1055 | "王丰华": "89.641", 1056 | "王丽亚": "88.1895", 1057 | "王云": "93.8837", 1058 | "王亚光": "95.356", 1059 | "王亚林": "93.441", 1060 | "王伟明": "93.3317", 1061 | "王俊雄": "88.423", 1062 | "王俏华": "75.6675", 1063 | "王健": "97.8215", 1064 | "王先林": "90.2513", 1065 | "王卓": "91.88", 1066 | "王君艳": "97.7213", 1067 | "王哲希": "91.7547", 1068 | "王嘉松": "92.859", 1069 | "王国庆": "95.3853", 1070 | "王培丞": "96.4715", 1071 | "王增琦": "94.543", 1072 | "王宇": "92.58", 1073 | "王宏卫": "69.9416", 1074 | "王平": "95.9642", 1075 | "王建华": "94.4905", 1076 | "王彤": "98.168", 1077 | "王彪": "83.357", 1078 | "王德禹": "90.04", 1079 | "王志新": "86.8985", 1080 | "王恒安": "92.69", 1081 | "王惠": "95.558", 1082 | "王承国": "97.107", 1083 | "王振元": "90.4267", 1084 | "王敏": "87.661", 1085 | "王文": "91.34", 1086 | "王斌": "95.1633", 1087 | "王新兵": "92.096", 1088 | "王昊": "93.298", 1089 | "王昕": "97.7017", 1090 | "王春艳": "95.3225", 1091 | "王晓敏": "94.415", 1092 | "王晓骏": "95.7456", 1093 | "王朝霞": "96.5115", 1094 | "王梦月": "95.678", 1095 | "王欣": "90.493", 1096 | "王正武": "91.397", 1097 | "王毓伦": "94.7398", 1098 | "王泽民": "91.3264", 1099 | "王浩伟": "98.208", 1100 | "王灿华": "93.648", 1101 | "王炜": "93.4618", 1102 | "王爱民": "86.383", 1103 | "王玉璋": "93.607", 1104 | "王玮": "94.1352", 1105 | "王玲": "89.3325", 1106 | "王瑾晔": "88.039", 1107 | "王立河": "92.27", 1108 | "王纪林": "98.7454", 1109 | "王群慧": "90.2191", 1110 | "王芳": "85.0337", 1111 | "王英林": "85.989", 1112 | "王英萍": "95.5105", 1113 | "王茕": "95.386", 1114 | "王莲芸": "96.5234", 1115 | "王西田": "79.216", 1116 | "王赓": "94.258", 1117 | "王轶骏": "91.965", 1118 | "王辉": "95.192", 1119 | "王郁": "90.481", 1120 | "王铭": "96.7807", 1121 | "王雅卓": "93.1119", 1122 | "王青": "94.294", 1123 | "王韶阳": "74.0831", 1124 | "王骏": "88.937", 1125 | "甄凤超": "95.4542", 1126 | "田作华": "96.303", 1127 | "田社平": "97.9095", 1128 | "田艳": "93.7498", 1129 | "由德林": "90.472", 1130 | "申哲民": "89.843", 1131 | "申晓辉": "92.508", 1132 | "白晓慧": "87.2197", 1133 | "白林泉": "90.213", 1134 | "盛戈皡": "93.161", 1135 | "盛翀": "92.009", 1136 | "石凯民": "96.5179", 1137 | "石桂峰": "92.987", 1138 | "祝永新": "97.431", 1139 | "祝薇": "91.4083", 1140 | "秦丹尼": "92.804", 1141 | "秦向东": "96.9805", 1142 | "程晓鸣": "94.58", 1143 | "程江": "92.994", 1144 | "程金平": "94.064", 1145 | "章仰文": "95.7795", 1146 | "章伟": "92.9177", 1147 | "章毅": "94.505", 1148 | "章烨": "94.2417", 1149 | "章璞": "98.423", 1150 | "童剑平": "89.7843", 1151 | "童清艳": "83.675", 1152 | "符杰祥": "89.147", 1153 | "纪小凌": "93.5453", 1154 | "纪志刚": "93.2114", 1155 | "缪毅强": "97.3575", 1156 | "罗依琪": "98.0162", 1157 | "罗先金": "86.083", 1158 | "罗利文": "95.18", 1159 | "翁惠玉": "96.7553", 1160 | "翁正新": "97.385", 1161 | "翟宜疆": "88.0295", 1162 | "翟新": "92.1987", 1163 | "肖双九": "94.3285", 1164 | "肖国芳": "96.0198", 1165 | "肖柳青": "94.203", 1166 | "肖湘": "96.769", 1167 | "胡代平": "91.8905", 1168 | "胡全生": "78.05", 1169 | "胡其图": "96.2892", 1170 | "胡国新": "92.881", 1171 | "胡奕明": "92.854", 1172 | "胡巍": "92.157", 1173 | "胡延东": "73.62", 1174 | "胡建升": "84.7635", 1175 | "胡开宝": "90.31", 1176 | "胡慈舟": "93.2601", 1177 | "胡文蓉": "95.387", 1178 | "胡晓芳": "88.904", 1179 | "胡洪波": "92.1835", 1180 | "胡润忠": "94.084", 1181 | "胡涵锦": "95.6305", 1182 | "胡逸薇": "96.5335", 1183 | "胡飞": "95.57", 1184 | "舒谋海": "95.552", 1185 | "艾青": "95.262", 1186 | "苏晓静": "87.9665", 1187 | "苏竞元": "96.0665", 1188 | "苑波": "95.63", 1189 | "苗瑞": "91.029", 1190 | "范卫东": "84.97", 1191 | "范同祥": "92.938", 1192 | "范援朝": "94.241", 1193 | "范春菊": "96.3275", 1194 | "范纯增": "84.761", 1195 | "范黎坤": "95.2253", 1196 | "茅旭初": "97.5947", 1197 | "荆建平": "95.262", 1198 | "荣国光": "87.232", 1199 | "萧冰": "93.3147", 1200 | "董占勋": "88.8842", 1201 | "董占海": "98.5346", 1202 | "董常明": "88.016", 1203 | "董扬": "93.9637", 1204 | "董晓蕾": "95.2703", 1205 | "董笑菊": "93.948", 1206 | "蒋丹": "96.0693", 1207 | "蒋乐天": "94.989", 1208 | "蒋启芬": "96.6445", 1209 | "蒋建伟": "95.278", 1210 | "蒋怡": "90.284", 1211 | "蒋立峰": "96.108", 1212 | "蒋红珍": "95.978", 1213 | "蒋静": "88.093", 1214 | "蒯琳萍": "94.396", 1215 | "蔡伟": "95.868", 1216 | "蔡明超": "91.391", 1217 | "蔡润": "92.146", 1218 | "蔡申瓯": "93.352", 1219 | "蔡皿": "95.6208", 1220 | "蔡艳": "93.9155", 1221 | "蔡英文": "92.18", 1222 | "蔡萍": "91.376", 1223 | "蔡骏": "96.892", 1224 | "蔡鸿明": "94.855", 1225 | "薛可": "93.3033", 1226 | "薛广涛": "88.088", 1227 | "薛敏钊": "96.813", 1228 | "薛质": "97.389", 1229 | "袁斌": "95.412", 1230 | "袁晓忠": "98.3017", 1231 | "袁焱": "96.543", 1232 | "袁笃平": "96.771", 1233 | "裘兆泰": "99.0825", 1234 | "褚建君": "94.0895", 1235 | "覃筱": "85.962", 1236 | "解大": "96.192", 1237 | "訾小超": "87.7053", 1238 | "计钢": "92.1615", 1239 | "许亭方": "84.2433", 1240 | "许希阳": "79.051", 1241 | "许建平": "92.2495", 1242 | "许永国": "79.9754", 1243 | "诸勤敏": "92.871", 1244 | "谈毅": "96.959", 1245 | "谢小敏": "83.493", 1246 | "谢少艾": "96.4176", 1247 | "谢憬": "96.225", 1248 | "谢维敏": "97.2482", 1249 | "谢芳": "95.959", 1250 | "谢萍": "92.6483", 1251 | "谢金文": "84.5955", 1252 | "贺光": "95.462", 1253 | "贺志豪": "96.73", 1254 | "贾婷": "90.1597", 1255 | "赖晓阳": "94.342", 1256 | "赵一雷": "96.355", 1257 | "赵亚平": "95.85", 1258 | "赵亦希": "90.704", 1259 | "赵俊": "83.1725", 1260 | "赵俐俐": "94.976", 1261 | "赵冬梅": "98.06", 1262 | "赵加强": "96.5118", 1263 | "赵增铃": "96.178", 1264 | "赵文杰": "95.5932", 1265 | "赵文辉": "75.491", 1266 | "赵斌元": "96.214", 1267 | "赵新明": "96.2779", 1268 | "赵旭": "93.422", 1269 | "赵晓红": "90.0481", 1270 | "赵海": "83.923", 1271 | "赵社戍": "93.233", 1272 | "赵立平": "99.391", 1273 | "赵群飞": "94.877", 1274 | "赵耕春": "92.2382", 1275 | "赵艾萍": "96.3813", 1276 | "赵言正": "94.3475", 1277 | "车生泉": "92.725", 1278 | "车驰东": "97.232", 1279 | "辛玉梅": "95.0728", 1280 | "过敏意": "95.595", 1281 | "邓大萌": "94.268", 1282 | "邓林": "91.7444", 1283 | "邓真全": "96.2485", 1284 | "邰能灵": "94.569", 1285 | "邱卫东": "91.825", 1286 | "邱意弘": "92.637", 1287 | "邱江平": "83.875", 1288 | "邵国年": "96.365", 1289 | "邵奇": "92.5836", 1290 | "邹丽芳": "79.855", 1291 | "邹礼瑞": "93.2305", 1292 | "郑伟丽": "65.5265", 1293 | "郑华": "93.4775", 1294 | "郑思珣": "97.268", 1295 | "郑杭": "96.07", 1296 | "郑益慧": "98.9565", 1297 | "郑育家": "88.0537", 1298 | "郑铭洪": "96.2858", 1299 | "郑飞洲": "90.853", 1300 | "郭为忠": "94.441", 1301 | "郭俊华": "94.7378", 1302 | "郭兴伍": "94.1", 1303 | "郭圣荣": "88.107", 1304 | "郭恋东": "86.7675", 1305 | "郭鸿杰": "94.4126", 1306 | "都岚岚": "76.7333", 1307 | "金之俭": "94.055", 1308 | "金慧子": "96.638", 1309 | "金拓": "93.1427", 1310 | "金文峰": "96.7603", 1311 | "金朝晖": "92.339", 1312 | "金桥": "92.6508", 1313 | "钮卫星": "92.5026", 1314 | "钱冬": "94.032", 1315 | "钱秀萍": "95.32", 1316 | "钱良": "97.259", 1317 | "钱静峰": "97.8274", 1318 | "闫成": "96.3205", 1319 | "闫超": "93.99", 1320 | "闻媛": "91.1564", 1321 | "阎峰": "92.0255", 1322 | "阎建民": "93.3755", 1323 | "陆元雯": "90.2102", 1324 | "陆宏弟": "96.5443", 1325 | "陆岩军": "89.7303", 1326 | "陆德阳": "82.194", 1327 | "陆晨兮": "90.7883", 1328 | "陆朝俊": "94.1941", 1329 | "陆松年": "91.5445", 1330 | "陆海宁": "92.31", 1331 | "陆莹": "86.5357", 1332 | "陆蓓": "94.66", 1333 | "陆顺寿": "94.895", 1334 | "陈业新": "92.6374", 1335 | "陈先元": "81.8905", 1336 | "陈先阳": "78.6915", 1337 | "陈克应": "96.6423", 1338 | "陈克非": "96.929", 1339 | "陈兵": "91.937", 1340 | "陈列文": "93.476", 1341 | "陈刚": "95.1065", 1342 | "陈华栋": "96.1598", 1343 | "陈尧": "92.913", 1344 | "陈峰": "93.3075", 1345 | "陈峻": "94.652", 1346 | "陈崇君": "95.185", 1347 | "陈幼平": "90.061", 1348 | "陈德民": "87.2577", 1349 | "陈捷": "88.4385", 1350 | "陈斌": "96.286", 1351 | "陈新兴": "80.764", 1352 | "陈春丽": "93.322", 1353 | "陈景秋": "90.2356", 1354 | "陈梅": "87.349", 1355 | "陈欣": "93.812", 1356 | "陈永国": "90.861", 1357 | "陈海峰": "96.037", 1358 | "陈火英": "94.457", 1359 | "陈猛": "93.865", 1360 | "陈玉泉": "91.7804", 1361 | "陈玲玲": "96.312", 1362 | "陈璐": "82.5555", 1363 | "陈翌佳": "96.841", 1364 | "陈英": "94.6027", 1365 | "陈贤峰": "97.759", 1366 | "陈贤浩": "89.8955", 1367 | "陈进": "95.798", 1368 | "陈鑫": "79.74", 1369 | "陈钢": "94.399", 1370 | "陈霆": "84.3323", 1371 | "陈露": "91.3757", 1372 | "陈飞翔": "93.633", 1373 | "陈鹏": "96.1904", 1374 | "陈龙珠": "89.078", 1375 | "陶亚民": "93.573", 1376 | "陶庆": "91.0583", 1377 | "陶昉敏": "96.3383", 1378 | "雷华明": "87.329", 1379 | "雷敏": "90.064", 1380 | "韦平": "89.012", 1381 | "韩东": "92.559", 1382 | "韩丽川": "96.4987", 1383 | "韩伟": "92.648", 1384 | "韩兵": "96.472", 1385 | "韩长印": "94.912", 1386 | "韩韬": "95.544", 1387 | "顾剑平": "95.5286", 1388 | "顾剑锋": "94.8065", 1389 | "顾孟迪": "90.56", 1390 | "顾建光": "92.243", 1391 | "顾志霞": "93.544", 1392 | "顾惠忠": "95.3677", 1393 | "顾振宇": "76.866", 1394 | "顾春明": "93.049", 1395 | "顾根生": "93.7392", 1396 | "顾海英": "95.4135", 1397 | "顾琪龙": "94.278", 1398 | "顾祝轩": "92.5715", 1399 | "顾顺超": "94.9433", 1400 | "颜世富": "90.24", 1401 | "饶柱石": "85.168", 1402 | "饶若楠": "76.437", 1403 | "马伟": "94.6025", 1404 | "马伟敏": "92.299", 1405 | "马文军": "85.9175", 1406 | "马春翔": "91.817", 1407 | "马殿光": "96.7823", 1408 | "马玉蕾": "90.59", 1409 | "马紫峰": "94.8665", 1410 | "马红冰": "91.2567", 1411 | "马荔": "95.3591", 1412 | "马进": "95.217", 1413 | "马连芳": "93.1404", 1414 | "高云": "91.589", 1415 | "高亚祯": "91.2445", 1416 | "高佩荪": "92.0803", 1417 | "高圣彬": "88.889", 1418 | "高宗仁": "91.903", 1419 | "高峰": "92.9175", 1420 | "高景": "96.8694", 1421 | "高林杰": "80.644", 1422 | "高福进": "93.295", 1423 | "魏云盘": "95.7185", 1424 | "魏啸飞": "89.0568", 1425 | "魏武挥": "92.8717", 1426 | "魏陆": "85.6735", 1427 | "鲍金": "92.1813", 1428 | "黄丞": "85.6508", 1429 | "黄丹枫": "94.1133", 1430 | "黄伟力": "92.4323", 1431 | "黄其煜": "84.704", 1432 | "黄坚": "82.716", 1433 | "黄孟娇": "97.8495", 1434 | "黄少军": "92.4305", 1435 | "黄庆桥": "97.7903", 1436 | "黄建国": "94.8153", 1437 | "黄建香": "95.4935", 1438 | "黄成军": "90.321", 1439 | "黄晓艳": "87.4933", 1440 | "黄永华": "96.344", 1441 | "黄清发": "83.2587", 1442 | "黄琪轩": "96.285", 1443 | "黄真": "95.793", 1444 | "黄继红": "82.4745", 1445 | "黄苏飞": "96.4918", 1446 | "黄采金": "94.6868", 1447 | "黄钢": "96.8402", 1448 | "齐开悦": "95.9575", 1449 | "龙新华": "91.369", 1450 | "龚玲": "97.4455" 1451 | }; 1452 | --------------------------------------------------------------------------------