沈阳理工大学方正教务快速评教脚本2025

一次性快速完成沈阳理工大学方正教务系统的教师评价,由Cursor编写。分数默认为6-8分,如果需要其他分数请自行修改代码。

// ==UserScript==
// @name         沈阳理工大学方正教务快速评教脚本2025
// @namespace    https://github.com/Dark-Li/SYLU_JiaoshiPingjia
// @version      0.1
// @description  一次性快速完成沈阳理工大学方正教务系统的教师评价,由Cursor编写。分数默认为6-8分,如果需要其他分数请自行修改代码。
// @author       Ender_Li
// @match        *://jxw.sylu.edu.cn/xspjgl/xspj_cxXspjIndex.html*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // 添加控制面板
    const panel = document.createElement('div');
    panel.innerHTML = `
        <div style="position: fixed; top: 10px; right: 10px; background: #fff; padding: 10px; border: 1px solid #ccc; z-index: 9999;">
            <button id="quickRate">一键评教</button>
            <div id="debugInfo" style="color: red;"></div>
        </div>
    `;
    document.body.appendChild(panel);

    function showDebug(message) {
        const debugDiv = document.getElementById('debugInfo');
        if (debugDiv) {
            debugDiv.textContent = message;
        }
        console.log(message);
    }

    // 快速评教函数
    async function quickRate() {
        showDebug('开始快速评教...');

        // 一次性获取所有输入框
        const inputs = document.querySelectorAll('input.form-control.input-sm.input-pjf');
        if (inputs.length === 0) {
            showDebug('未找到评分输入框!');
            return;
        }

        // 一次性填充所有分数
        inputs.forEach(input => {
            const maxScore = parseInt(input.getAttribute('data-zdfz')) || 8;
            let score;
            
            if (maxScore === 8) {
                score = Math.floor(Math.random() * 3) + 6;  // 6-8分
            } else if (maxScore === 6) {
                score = Math.floor(Math.random() * 3) + 4;  // 4-6分
            } else {
                score = Math.floor(maxScore * 0.8);  // 其他情况
            }
            
            input.value = score;
            input.dispatchEvent(new Event('input', { bubbles: true }));
            input.dispatchEvent(new Event('change', { bubbles: true }));
        });

        // 点击保存按钮
        const saveBtn = document.querySelector('#btn_xspj_bc');
        if (saveBtn) {
            saveBtn.click();

            let firstDialogHandled = false;  // 添加标记,记录第一个弹窗是否已处理

            // 处理警告框和确认框
            const handleDialogs = setInterval(() => {
                // 尝试查找并点击各种可能的确认按钮
                const buttons = [
                    document.querySelector('#btn_ok[data-bb-handler="ok"]'),  // 最后的确定按钮
                    document.querySelector('#btn_ok'),  // 警告框的确认按钮
                    document.querySelector('button[data-bb-handler="confirm"]'),  // 保存确认按钮
                ];

                for (const btn of buttons) {
                    if (btn && btn.offsetParent !== null) {  // 检查按钮是否可见
                        // 模拟鼠标移动到按钮上
                        btn.dispatchEvent(new MouseEvent('mouseover', {
                            bubbles: true,
                            cancelable: true,
                            view: window
                        }));

                        // 模拟鼠标按下
                        btn.dispatchEvent(new MouseEvent('mousedown', {
                            bubbles: true,
                            cancelable: true,
                            view: window,
                            button: 0
                        }));

                        // 短暂延迟后模拟鼠标释放和点击
                        setTimeout(() => {
                            btn.dispatchEvent(new MouseEvent('mouseup', {
                                bubbles: true,
                                cancelable: true,
                                view: window,
                                button: 0
                            }));

                            btn.dispatchEvent(new MouseEvent('click', {
                                bubbles: true,
                                cancelable: true,
                                view: window,
                                button: 0
                            }));
                        }, 50);
                        
                        // 如果这是第一个弹窗的处理
                        if (!firstDialogHandled) {
                            firstDialogHandled = true;
                            // 等待1秒后模拟鼠标点击提交按钮
                            setTimeout(() => {
                                const submitBtn = document.querySelector('#btn_xspj_tj');
                                if (submitBtn) {
                                    // 模拟鼠标移动到按钮上
                                    submitBtn.dispatchEvent(new MouseEvent('mouseover', {
                                        bubbles: true,
                                        cancelable: true,
                                        view: window
                                    }));

                                    // 模拟鼠标按下
                                    submitBtn.dispatchEvent(new MouseEvent('mousedown', {
                                        bubbles: true,
                                        cancelable: true,
                                        view: window,
                                        button: 0
                                    }));

                                    // 短暂延迟后模拟鼠标释放和点击
                                    setTimeout(() => {
                                        submitBtn.dispatchEvent(new MouseEvent('mouseup', {
                                            bubbles: true,
                                            cancelable: true,
                                            view: window,
                                            button: 0
                                        }));

                                        submitBtn.dispatchEvent(new MouseEvent('click', {
                                            bubbles: true,
                                            cancelable: true,
                                            view: window,
                                            button: 0
                                        }));

                                        // 等待500ms后处理提交确认按钮
                                        setTimeout(() => {
                                            const confirmBtn = document.querySelector('#btn_confirm');
                                            if (confirmBtn) {
                                                // 模拟鼠标移动到确认按钮上
                                                confirmBtn.dispatchEvent(new MouseEvent('mouseover', {
                                                    bubbles: true,
                                                    cancelable: true,
                                                    view: window
                                                }));

                                                // 模拟鼠标按下
                                                confirmBtn.dispatchEvent(new MouseEvent('mousedown', {
                                                    bubbles: true,
                                                    cancelable: true,
                                                    view: window,
                                                    button: 0
                                                }));

                                                // 短暂延迟后模拟鼠标释放和点击
                                                setTimeout(() => {
                                                    confirmBtn.dispatchEvent(new MouseEvent('mouseup', {
                                                        bubbles: true,
                                                        cancelable: true,
                                                        view: window,
                                                        button: 0
                                                    }));

                                                    confirmBtn.dispatchEvent(new MouseEvent('click', {
                                                        bubbles: true,
                                                        cancelable: true,
                                                        view: window,
                                                        button: 0
                                                    }));

                                                    // 等待500ms后处理最后的确定按钮
                                                    setTimeout(() => {
                                                        const okBtn = document.querySelector('#btn_ok');
                                                        if (okBtn) {
                                                            // 模拟鼠标移动到确定按钮上
                                                            okBtn.dispatchEvent(new MouseEvent('mouseover', {
                                                                bubbles: true,
                                                                cancelable: true,
                                                                view: window
                                                            }));

                                                            // 模拟鼠标按下
                                                            okBtn.dispatchEvent(new MouseEvent('mousedown', {
                                                                bubbles: true,
                                                                cancelable: true,
                                                                view: window,
                                                                button: 0
                                                            }));

                                                            // 短暂延迟后模拟鼠标释放和点击
                                                            setTimeout(() => {
                                                                okBtn.dispatchEvent(new MouseEvent('mouseup', {
                                                                    bubbles: true,
                                                                    cancelable: true,
                                                                    view: window,
                                                                    button: 0
                                                                }));

                                                                okBtn.dispatchEvent(new MouseEvent('click', {
                                                                    bubbles: true,
                                                                    cancelable: true,
                                                                    view: window,
                                                                    button: 0
                                                                }));

                                                                // 点击确定按钮后,尝试切换到下一个教师
                                                                setTimeout(() => {
                                                                    // 获取所有教师行
                                                                    const allTeachers = document.querySelectorAll('tr.ui-widget-content.jqgrow.ui-row-ltr');
                                                                    
                                                                    if (allTeachers.length > 0) {
                                                                        // 寻找下一个未评教的教师
                                                                        let nextTeacher = null;
                                                                        for (const teacher of allTeachers) {
                                                                            // 查找状态单元格
                                                                            const statusCell = teacher.querySelector('td[aria-describedby="tempGrid_tjztmc"]');
                                                                            if (statusCell && statusCell.getAttribute('title') === '未评') {
                                                                                nextTeacher = teacher;
                                                                                break;
                                                                            }
                                                                        }

                                                                        if (nextTeacher) {
                                                                            showDebug('切换到下一位未评教师...');
                                                                            // 获取教师姓名用于调试显示
                                                                            const teacherName = nextTeacher.querySelector('td[aria-describedby="tempGrid_jzgmc"]')?.textContent || '未知教师';
                                                                            showDebug(`正在切换到教师:${teacherName}`);

                                                                            // 模拟鼠标点击下一个教师
                                                                            nextTeacher.dispatchEvent(new MouseEvent('mouseover', {
                                                                                bubbles: true,
                                                                                cancelable: true,
                                                                                view: window
                                                                            }));

                                                                            setTimeout(() => {
                                                                                nextTeacher.dispatchEvent(new MouseEvent('mousedown', {
                                                                                    bubbles: true,
                                                                                    cancelable: true,
                                                                                    view: window,
                                                                                    button: 0
                                                                                }));

                                                                                setTimeout(() => {
                                                                                    nextTeacher.dispatchEvent(new MouseEvent('mouseup', {
                                                                                        bubbles: true,
                                                                                        cancelable: true,
                                                                                        view: window,
                                                                                        button: 0
                                                                                    }));

                                                                                    nextTeacher.dispatchEvent(new MouseEvent('click', {
                                                                                        bubbles: true,
                                                                                        cancelable: true,
                                                                                        view: window,
                                                                                        button: 0
                                                                                    }));

                                                                                    // 清除当前的定时器
                                                                                    clearInterval(handleDialogs);
                                                                                    
                                                                                    // 等待页面加载新教师的评教表
                                                                                    setTimeout(() => {
                                                                                        // 递归调用quickRate继续评教
                                                                                        quickRate();
                                                                                    }, 1000);
                                                                                }, 50);
                                                                            }, 50);
                                                                        } else {
                                                                            showDebug('所有教师评教完成!');
                                                                            clearInterval(handleDialogs);
                                                                        }
                                                                    } else {
                                                                        showDebug('未找到教师列表!');
                                                                        clearInterval(handleDialogs);
                                                                    }
                                                                }, 1000);
                                                            }, 50);
                                                        } else {
                                                            showDebug('未找到确定按钮!');
                                                        }
                                                    }, 500);
                                                }, 50);
                                            } else {
                                                showDebug('未找到提交确认按钮!');
                                            }
                                        }, 500);
                                    }, 50);
                                } else {
                                    showDebug('未找到提交按钮!');
                                }
                            }, 1000);
                        }
                        break;
                    }
                }

                // 尝试切换到下一个教师
                const nextTeacher = document.querySelector('tr.odd:not(.selected), tr:not(.selected)');
                if (nextTeacher) {
                    nextTeacher.click();
                    clearInterval(handleDialogs);  // 找到并点击下一个教师后停止检查
                }
            }, 200);  // 每200ms检查一次

            // 60秒后自动清除定时器(以防万一)
            setTimeout(() => {
                clearInterval(handleDialogs);
            }, 60000);
        } else {
            showDebug('未找到保存按钮!');
        }
    }

    // 绑定按钮事件
    window.addEventListener('load', () => {
        const rateButton = document.getElementById('quickRate');
        if (rateButton) {
            rateButton.addEventListener('click', quickRate);
            showDebug('脚本已准备就绪');
        } else {
            showDebug('未找到按钮!');
        }
    });
})();