- // ==UserScript==
- // @name Auto grading
- // @namespace http://tampermonkey.net/
- // @version 0.3.1
- // @description USTC 自动评价 tqm.ustc.edu.cn
- // @author PRO_2684
- // @match https://tqm.ustc.edu.cn/index.html*
- // @icon https://tqm.ustc.edu.cn/favicon.ico
- // @grant none
- // @license unlicense
- // ==/UserScript==
-
- (function() {
- 'use strict';
- let standard_answers = {
- '教学内容': ['非常同意'],
- '教学资源': ['非常满意', '非常同意'],
- '教材单列': ['非常满意'],
- '课程难度': ['适合'],
- '教学态度': ['非常同意'],
- '教学水平': ['非常同意'],
- '教学手段': ['非常同意'],
- '教学方法': ['非常同意'],
- '师生互动': ['非常同意'],
- '学习投入': ['3-4小时'],
- '知识掌握': ['非常同意'],
- '能力提升': ['非常同意'],
- '兴趣培养': ['非常同意'],
- '推荐度': ['会'],
- '整体评价': ['非常好'],
- '课程准备': ['非常同意'],
- '实验报告': ['非常同意'],
- '教学表达': ['非常同意'],
- '课程安排': ['非常同意'],
- '课程考核': ['非常同意'],
- '纪律约束': ['非常同意'],
- '教师示范': ['非常同意'],
- '课程氛围': ['非常同意'],
- '素养提升': ['非常同意'],
- '个人发展': ['非常同意'],
- '1.该助教是否随堂听课?': ['全部'],
- '2.该助教批改作业是否认真?': ['非常认真'],
- '3.该助教习题课/答疑课准备是否充分?': ['非常充分'],
- '4.该助教对课程知识的掌握是否扎实?': ['非常扎实'],
- '5.该助教习题课/答疑课互动中表达是否清晰?': ['非常清晰'],
- '6.该助教的综合表现': ['优秀'],
- '1.该助教实验课前准备是否充分?': ['非常充分'],
- '3.该助教实验过程指导是否认真?': ['非常认真'],
- '4.该助教批改实验报告是否认真?': ['非常认真'],
- '5.该助教对课程知识的掌握是否扎实?': ['非常扎实'],
- '6.该助教答疑/讨论中表达是否清晰?': ['非常清晰'],
- '7.该助教的综合表现': ['优秀'],
- '1.您对本课程的总体评价': ['非常好'],
- '2.您认为本课程的难度': ['适中'],
- '3.您认为本课程的内容': ['适中'],
- '4.您认为本课程的进度': ['适中'],
- '5.您认为本课程的教材(或讲义)': ['非常好'],
- '6.本课程的上课形式(如有极其少量板书列为“纯PPT”,不列为“PPT为主,板书为辅”,体育课请勾选“以上都不是”)': ['板书为主,PPT为辅'],
- '7.您对教师的总体评价': ['非常好'],
- '11.您在这门课上平均每周花费约多少课外时间?': ['3-4小时'],
- '': [''],
- '': [''],
- };
- let menu_root;
- function append_link() {
- let auto_grade = document.createElement('li');
- auto_grade.innerText = "自动评价";
- auto_grade.onclick = grade;
- auto_grade.setAttribute('class', 'ant-menu-item');
- menu_root.appendChild(auto_grade);
- let ignore_continue = document.createElement('li');
- ignore_continue.innerText = "忽略并转到下一个";
- ignore_continue.onclick = ignore;
- ignore_continue.setAttribute('class', 'ant-menu-item');
- menu_root.appendChild(ignore_continue);
- }
- function grade() {
- let questions = document.querySelectorAll("[class|='index_subject']");
- questions.forEach((question) => {
- let required = Boolean(question.querySelector('[class|="index_necessary"]'));
- if (!required) return;
- let tmp = question.querySelector("[class|='index_title']").querySelectorAll('p');
- let title = tmp[tmp.length - 1].innerText;
- let standard_answer = standard_answers[title];
- console.log(`[Auto grading] ${title}: ${standard_answer}`);
- if (standard_answer) {
- let options = question.querySelectorAll('[style="width: 100%;"]');
- options.forEach((option) => {
- let is_standard_answer = (standard_answer.indexOf(option.innerText) >= 0);
- if (is_standard_answer) {
- option.firstChild.click();
- }
- });
- }
- });
- }
- function ignore() {
- let ignore_btn = root_node.querySelector("[class|='TaskDetailsMainContent_normalButton']");
- if (ignore_btn && ignore_btn.parentElement.parentElement.parentElement.getAttribute('aria-hidden') == 'false') {
- ignore_btn.click();
- } else {
- console.log("[Auto grading] 未找到忽略按钮!");
- }
- let tabs = root_node.querySelector("[class='ant-tabs-nav-scroll']");
- if (tabs) {
- tabs = tabs.children[0].children[0];
- } else {
- console.log("[Auto grading] 未找到教师/助教列表!");
- return;
- }
- let flag = false;
- let tab;
- for (tab of tabs.children) {
- if (flag) {
- tab.click();
- break;
- } else if (tab.getAttribute('aria-selected') == 'true') {
- flag = true;
- }
- }
- }
- const root_node = document.getElementById('root');
- const config = { attributes: false, childList: true, subtree: true };
- const callback = function(mutations, observer) {
- menu_root = root_node.querySelector('.ant-menu-root');
- if (menu_root) {
- append_link();
- observer.disconnect();
- }
- }
- const observer = new MutationObserver(callback);
- observer.observe(root_node, config);
- })();