惠州学院教务 - 学生评价

只保留“一键填写本页”功能,并使用优雅的非阻塞Toast提示框,提供最佳用户体验。

// ==UserScript==
// @name         惠州学院教务 - 学生评价
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  只保留“一键填写本页”功能,并使用优雅的非阻塞Toast提示框,提供最佳用户体验。
// @author       Google
// @match        https://jwxt.hzu.edu.cn/xspjgl/*
// @icon         https://jwxt.hzu.edu.cn/favicon.ico
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // --- 配置区 ---
    const DELAY_CONFIG = {
        BETWEEN_RADIOS_MIN: 80,  BETWEEN_RADIOS_MAX: 250,
        PER_CHARACTER_MIN: 40,   PER_CHARACTER_MAX: 90,
    };
    const GOOD_COMMENTS = [
        "老师教学态度认真,治学严谨,授课内容丰富,深入浅出,非常感谢老师的辛勤付出!",
        "老师讲课思路清晰,语言风趣幽默,课堂气氛活跃,使我们对这门课产生了浓厚的兴趣。",
        "老师非常负责,对学生既严格要求又亲切和蔼,是我们的良师益友。",
        "课程内容充实,案例丰富,老师的讲解总能抓住重点,让我们受益匪浅。",
    ];

    // --- 核心工具函数 ---
    const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
    const randomDelay = (min, max) => sleep(Math.floor(Math.random() * (max - min + 1)) + min);
    const getRandomComment = () => GOOD_COMMENTS[Math.floor(Math.random() * GOOD_COMMENTS.length)];
    async function simulateTyping(element, text) {
        element.value = '';
        for (const char of text) {
            element.value += char;
            element.dispatchEvent(new Event('input', { bubbles: true }));
            await randomDelay(DELAY_CONFIG.PER_CHARACTER_MIN, DELAY_CONFIG.PER_CHARACTER_MAX);
        }
    }

    /**
     * 【新功能】显示一个优雅的、非阻塞的Toast提示
     */
    function showToast(message, duration = 3000) {
        const toast = document.createElement('div');
        toast.id = 'hzu-toast-notification';
        toast.innerHTML = message;
        toast.style.cssText = `
            position: fixed;
            top: 20px;
            left: 50%;
            transform: translate(-50%, -50px);
            background-color: #4CAF50;
            color: white;
            padding: 12px 20px;
            border-radius: 8px;
            z-index: 10000;
            font-size: 16px;
            box-shadow: 0 4px 10px rgba(0,0,0,0.2);
            opacity: 0;
            transition: all 0.5s cubic-bezier(0.25, 0.8, 0.25, 1);
        `;
        document.body.appendChild(toast);

        // 触发滑入动画
        setTimeout(() => {
            toast.style.opacity = '1';
            toast.style.transform = 'translate(-50%, 0)';
        }, 10);

        // 在指定时间后触发滑出并移除
        setTimeout(() => {
            toast.style.opacity = '0';
            toast.style.transform = 'translate(-50%, -50px)';
            setTimeout(() => toast.remove(), 500); // 等动画结束后再移除
        }, duration);
    }


    /**
     * 核心功能:填写当前页面的表单
     */
    async function fillThisPage() {
        const fillButton = document.getElementById('hzu-fill-page-btn');
        if (fillButton) {
            fillButton.disabled = true;
            fillButton.innerHTML = '...正在填写...';
        }

        console.log("收到指令,开始拟人化填写本页...");
        const excellentRadios = document.querySelectorAll('.input-xspj-1 input[type="radio"]');
        for (const radio of excellentRadios) {
            if (!radio.checked) {
                radio.click();
                await randomDelay(DELAY_CONFIG.BETWEEN_RADIOS_MIN, DELAY_CONFIG.BETWEEN_RADIOS_MAX);
            }
        }

        const textarea = document.querySelector('textarea.input-zgpj');
        if (textarea) {
            await simulateTyping(textarea, getRandomComment());
        } else {
            console.error("错误:未能找到评语输入框!");
        }

        console.log("填写完成!请手动点击“保存”。");

        showToast("填写完成!请手动点击“保存”。");
        // --- 核心修改点结束 ---

        if (fillButton) {
            fillButton.innerHTML = '✅ 填写完成';
        }
    }

    /**
     * 哨兵函数:根据页面状态,决定是否创建或销毁“一键填写”按钮
     */
    function manageFillButton() {
        const isFormVisible = document.querySelector('#btn_xspj_bc');
        const fillButton = document.getElementById('hzu-fill-page-btn');

        if (isFormVisible && !fillButton) {
            const newButton = document.createElement('button');
            newButton.id = 'hzu-fill-page-btn';
            newButton.innerHTML = '📝 一键填写本页';
            newButton.title = '一键填写本页所有选项和评语';
            newButton.style.cssText = `
                position: fixed; top: 100px; right: 20px; z-index: 9999;
                padding: 12px 22px; font-size: 18px; background-color: #2196F3;
                color: white; border: none; border-radius: 8px; cursor: pointer;
                box-shadow: 0 5px 10px rgba(0,0,0,0.2); transition: all 0.3s;
            `;
            newButton.addEventListener('click', fillThisPage);
            document.body.appendChild(newButton);
        }
        else if (!isFormVisible && fillButton) {
            fillButton.remove();
        }
    }

    // --- 脚本启动入口 ---
    console.log("惠州学院教务系统 - 评价页一键填写脚本已启动。");
    const observer = new MutationObserver(manageFillButton);
    observer.observe(document.body, { childList: true, subtree: true });
    manageFillButton();

})();
长期地址
遇到问题?请前往 GitHub 提 Issues。