重庆医科大学自动评教脚本

自动给老师的除最后一个选项选a,如果没有应用上,刷新一下即可

// ==UserScript==
// @name         重庆医科大学自动评教脚本
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  自动给老师的除最后一个选项选a,如果没有应用上,刷新一下即可
// @author       一位学长
// @match        https://jiaowu.cqmu.edu.cn/*
// @grant        none
// @run-at       document-end
// @license     MIT
// ==/UserScript==


(function() {
    'use strict';

    // 创建悬浮窗口
    function createFloatingWindow() {
        const floatingDiv = document.createElement('div');
        floatingDiv.id = 'autoEvaluatePanel';
        floatingDiv.style.position = 'fixed';
        floatingDiv.style.top = '10px';
        floatingDiv.style.right = '10px';
        floatingDiv.style.backgroundColor = 'rgba(240, 240, 240, 0.9)';
        floatingDiv.style.border = '1px solid #ccc';
        floatingDiv.style.padding = '10px';
        floatingDiv.style.borderRadius = '5px';
        floatingDiv.style.zIndex = '9999';
        floatingDiv.style.boxShadow = '0 0 10px rgba(0, 0, 0, 0.2)';

        const title = document.createElement('div');
        title.textContent = '评教助手';
        title.style.fontWeight = 'bold';
        title.style.marginBottom = '8px';
        title.style.borderBottom = '1px solid #ccc';
        title.style.paddingBottom = '5px';
        floatingDiv.appendChild(title);

        const statusDiv = document.createElement('div');
        statusDiv.id = 'evaluateStatus';
        statusDiv.style.marginBottom = '8px';
        statusDiv.style.fontSize = '12px';
        statusDiv.style.color = '#666';
        statusDiv.textContent = '等待检测评教表格...';
        floatingDiv.appendChild(statusDiv);

        const runButton = document.createElement('button');
        runButton.textContent = '重新自动评教';
        runButton.style.padding = '5px 10px';
        runButton.style.cursor = 'pointer';
        runButton.style.backgroundColor = '#4CAF50';
        runButton.style.color = 'white';
        runButton.style.border = 'none';
        runButton.style.borderRadius = '3px';
        runButton.onclick = function() {
            runAutoEvaluate();
        };
        floatingDiv.appendChild(runButton);

        // 添加可拖动功能
        let isDragging = false;
        let offsetX, offsetY;

        title.style.cursor = 'move';
        title.addEventListener('mousedown', function(e) {
            isDragging = true;
            offsetX = e.clientX - floatingDiv.getBoundingClientRect().left;
            offsetY = e.clientY - floatingDiv.getBoundingClientRect().top;
        });

        document.addEventListener('mousemove', function(e) {
            if (!isDragging) return;
            floatingDiv.style.left = (e.clientX - offsetX) + 'px';
            floatingDiv.style.top = (e.clientY - offsetY) + 'px';
            floatingDiv.style.right = 'auto'; // 取消right定位,使用left定位
        });

        document.addEventListener('mouseup', function() {
            isDragging = false;
        });

        document.body.appendChild(floatingDiv);
        return floatingDiv;
    }

    // 更新状态信息
    function updateStatus(text) {
        const statusDiv = document.getElementById('evaluateStatus');
        if (statusDiv) {
            statusDiv.textContent = text;
        }
    }

    // 自动评教函数
    function runAutoEvaluate() {
        // 检查课程评教表格
        const courseEvaluateContent = document.getElementById('courseEvaluateContent');
        if (courseEvaluateContent) {
            handleCourseEvaluation(courseEvaluateContent);
            return;
        }

        // 检查教师评教表格
        const teacherEvaluateTables = document.querySelectorAll('table.gridtable');
        if (teacherEvaluateTables.length > 0) {
            for (let table of teacherEvaluateTables) {
                // 检查是否包含评教选项
                const radioInputs = table.querySelectorAll('input[type="radio"]');
                if (radioInputs.length > 0) {
                    handleTeacherEvaluation(table);
                }
            }
            return;
        }

        updateStatus('未检测到评教表格');
    }

    // 处理课程评教
    function handleCourseEvaluation(container) {
        const rows = container.querySelectorAll('tr');
        if (rows.length <= 1) {
            updateStatus('未找到有效的课程评教行');
            return;
        }

        updateStatus('正在填写课程评教...');

        // 获取所有包含评教选项的行(排除表头行)
        const evaluationRows = [];
        for (let i = 1; i < rows.length; i++) {
            if (rows[i].querySelectorAll('input[type="radio"]').length > 0) {
                evaluationRows.push(rows[i]);
            }
        }

        // 自动选择选项
        for (let i = 0; i < evaluationRows.length; i++) {
            const radioButtons = evaluationRows[i].querySelectorAll('input[type="radio"]');
            if (radioButtons.length === 0) continue;

            // 确定要选择的选项(最后一个选B,其他选A)
            // A选项的值是2,B选项的值是1
            const isLastQuestion = (i === evaluationRows.length - 1);
            const optionValue = isLastQuestion ? '1' : '2'; // 最后一个选B(1),其他选A(2)

            for (let radio of radioButtons) {
                if (radio.value === optionValue) {
                    radio.checked = true;
                    break;
                }
            }
        }

        updateStatus('课程评教已完成!共处理 ' + evaluationRows.length + ' 个问题');
    }

    // 处理教师评教
    function handleTeacherEvaluation(table) {
        const rows = table.querySelectorAll('tr');
        if (rows.length <= 1) {
            updateStatus('未找到有效的教师评教行');
            return;
        }

        updateStatus('正在填写教师评教...');

        // 获取所有包含评教选项的行(排除表头行)
        const evaluationRows = [];
        for (let i = 1; i < rows.length; i++) {
            if (rows[i].querySelectorAll('input[type="radio"]').length > 0) {
                evaluationRows.push(rows[i]);
            }
        }

        // 自动选择选项
        for (let i = 0; i < evaluationRows.length; i++) {
            const radioButtons = evaluationRows[i].querySelectorAll('input[type="radio"]');
            if (radioButtons.length === 0) continue;

            // 确定要选择的选项(最后一个选B,其他选A)
            // A选项的值是2,B选项的值是1
            const isLastQuestion = (i === evaluationRows.length - 1);
            const optionValue = isLastQuestion ? '1' : '2'; // 最后一个选B(1),其他选A(2)

            for (let radio of radioButtons) {
                if (radio.value === optionValue) {
                    radio.checked = true;
                    break;
                }
            }
        }

        updateStatus('教师评教已完成!共处理 ' + evaluationRows.length + ' 个问题');
    }

    // 等待页面完全加载后执行
    window.addEventListener('load', function() {
        // 添加一点延迟确保DOM完全加载
        setTimeout(function() {
            createFloatingWindow();
            runAutoEvaluate();
        }, 1000);
    });

    // 观察DOM变化,以应对动态加载的评教表格
    const observer = new MutationObserver(function(mutations) {
        for (let mutation of mutations) {
            if (mutation.addedNodes.length > 0) {
                // 检测新添加的节点是否包含评教表格
                for (let node of mutation.addedNodes) {
                    if (node.nodeType === Node.ELEMENT_NODE) {
                        if (node.id === 'courseEvaluateContent' ||
                            node.querySelector('#courseEvaluateContent') ||
                            node.classList.contains('gridtable') ||
                            node.querySelector('.gridtable')) {
                            setTimeout(runAutoEvaluate, 500);
                            break;
                        }
                    }
                }
            }
        }
    });

    observer.observe(document.body, { childList: true, subtree: true });
})();