北理工教评

自定义一键评价

// ==UserScript==
// @name         北理工教评
// @namespace    http://tampermonkey.net/
// @version      0.4
// @description  自定义一键评价
// @match        https://pj.bit.edu.cn/pjxt2.0/stpj/*
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==

(function () {
    'use strict';

    // 创建配置面板
    function createConfigPanel() {
        // 创建配置面板容器
        const panel = document.createElement('div');

        // 获取保存的位置,如果没有则使用默认位置
        const savedPosition = GM_getValue('panelPosition', { top: '50px', left: 'auto', right: '10px' });

        panel.style.position = 'fixed';
        panel.style.top = savedPosition.top;
        panel.style.left = savedPosition.left;
        panel.style.right = savedPosition.right;
        panel.style.width = '250px';
        panel.style.backgroundColor = '#f0f0f0';
        panel.style.border = '1px solid #ccc';
        panel.style.padding = '15px';
        panel.style.zIndex = '10000';
        panel.style.borderRadius = '5px';
        panel.style.boxShadow = '0 0 10px rgba(0,0,0,0.1)';

        // 标题
        const title = document.createElement('h3');
        title.textContent = '教师评价配置';
        title.style.textAlign = 'center';
        title.style.marginBottom = '15px';
        panel.appendChild(title);

        // 选项单选组
        const options = [
            { text: '神中神', value: 1 },
            { text: '挺好', value: 2 },
            { text: '一般', value: 3 },
            { text: '半唐', value: 4 },
            { text: '全唐', value: 5 }
        ];

        // 创建单选按钮
        const radioContainer = document.createElement('div');
        radioContainer.style.marginBottom = '15px';
        options.forEach((option, index) => {
            const radioDiv = document.createElement('div');
            radioDiv.style.marginBottom = '5px';

            const radio = document.createElement('input');
            radio.type = 'radio';
            radio.name = 'evaluationOption';
            radio.id = `option${index}`;
            radio.value = option.value;

            // 读取之前保存的选项
            const savedOption = GM_getValue('selectedOption', 1);
            radio.checked = parseInt(savedOption) === option.value;

            const label = document.createElement('label');
            label.htmlFor = `option${index}`;
            label.textContent = option.text;
            label.style.marginLeft = '5px';
            // 设置选中项的样式
            if (radio.checked) {
                label.style.fontWeight = 'bold';
                label.style.color = '#4CAF50';
            }

            // 添加点击事件
            radio.addEventListener('change', () => {
                // 更新所有label的样式
                radioContainer.querySelectorAll('label').forEach(l => {
                    l.style.fontWeight = 'normal';
                    l.style.color = 'black';
                });
                // 设置当前选中项的样式
                label.style.fontWeight = 'bold';
                label.style.color = '#4CAF50';
                // 自动保存选项
                GM_setValue('selectedOption', option.value);
            });

            radioDiv.appendChild(radio);
            radioDiv.appendChild(label);
            radioContainer.appendChild(radioDiv);
        });

        panel.appendChild(radioContainer);

        // 意见输入框
        const commentLabel = document.createElement('label');
        commentLabel.textContent = '意见内容:';
        const commentInput = document.createElement('input');
        commentInput.type = 'text';
        commentInput.id = 'commentInput';
        commentInput.style.width = '100%';
        commentInput.style.marginBottom = '10px';
        commentInput.value = GM_getValue('defaultComment', '好');

        // 自动保存意见内容
        commentInput.addEventListener('input', () => {
            GM_setValue('defaultComment', commentInput.value);
        });

        panel.appendChild(commentLabel);
        panel.appendChild(commentInput);

        // 添加自动提交复选框
        const autoSubmitContainer = document.createElement('div');
        autoSubmitContainer.style.marginBottom = '10px';
        autoSubmitContainer.style.display = 'flex';
        autoSubmitContainer.style.alignItems = 'center';
        autoSubmitContainer.style.padding = '8px';
        autoSubmitContainer.style.backgroundColor = '#fff';
        autoSubmitContainer.style.borderRadius = '3px';
        autoSubmitContainer.style.border = '1px solid #ddd';
        autoSubmitContainer.style.cursor = 'pointer';

        const autoSubmitWrapper = document.createElement('div');
        autoSubmitWrapper.style.display = 'flex';
        autoSubmitWrapper.style.alignItems = 'center';
        autoSubmitWrapper.style.width = '100%';
        autoSubmitWrapper.style.cursor = 'pointer';

        const autoSubmitCheckbox = document.createElement('input');
        autoSubmitCheckbox.type = 'checkbox';
        autoSubmitCheckbox.id = 'autoSubmitCheckbox';
        autoSubmitCheckbox.checked = GM_getValue('autoSubmit', false);
        autoSubmitCheckbox.style.width = '16px';
        autoSubmitCheckbox.style.height = '16px';
        autoSubmitCheckbox.style.cursor = 'pointer';
        autoSubmitCheckbox.style.margin = '0 8px 0 0';

        const autoSubmitLabel = document.createElement('label');
        autoSubmitLabel.htmlFor = 'autoSubmitCheckbox';
        autoSubmitLabel.textContent = '自动提交评价';
        autoSubmitLabel.style.cursor = 'pointer';
        autoSubmitLabel.style.userSelect = 'none';
        autoSubmitLabel.style.display = 'block';
        autoSubmitLabel.style.width = '100%';
        autoSubmitLabel.style.height = '100%';

        // 更新状态显示
        function updateAutoSubmitStyle() {
            if (autoSubmitCheckbox.checked) {
                autoSubmitContainer.style.backgroundColor = '#e8f5e9';
                autoSubmitContainer.style.borderColor = '#4CAF50';
                autoSubmitLabel.style.color = '#4CAF50';
                autoSubmitLabel.style.fontWeight = 'bold';
            } else {
                autoSubmitContainer.style.backgroundColor = '#fff';
                autoSubmitContainer.style.borderColor = '#ddd';
                autoSubmitLabel.style.color = '#666';
                autoSubmitLabel.style.fontWeight = 'normal';
            }
        }

        // 初始更新状态
        updateAutoSubmitStyle();

        // 点击事件处理
        const toggleCheckbox = (e) => {
            if (e.target !== autoSubmitCheckbox) {
                autoSubmitCheckbox.checked = !autoSubmitCheckbox.checked;
                GM_setValue('autoSubmit', autoSubmitCheckbox.checked);
                updateAutoSubmitStyle();
            }
        };

        // 给容器和包装器都添加点击事件
        autoSubmitContainer.addEventListener('click', toggleCheckbox);
        autoSubmitWrapper.addEventListener('click', toggleCheckbox);

        // 复选框变化事件
        autoSubmitCheckbox.addEventListener('change', () => {
            GM_setValue('autoSubmit', autoSubmitCheckbox.checked);
            updateAutoSubmitStyle();
        });

        autoSubmitWrapper.appendChild(autoSubmitCheckbox);
        autoSubmitWrapper.appendChild(autoSubmitLabel);
        autoSubmitContainer.appendChild(autoSubmitWrapper);
        panel.appendChild(autoSubmitContainer);

        // 创建按钮容器
        const buttonContainer = document.createElement('div');
        buttonContainer.style.display = 'flex';
        buttonContainer.style.gap = '10px';
        buttonContainer.style.marginTop = '10px';

        // 一键评价按钮
        const evaluateButton = document.createElement('button');
        evaluateButton.textContent = '一键评价';
        evaluateButton.style.width = '50%';
        evaluateButton.style.backgroundColor = '#4CAF50';
        evaluateButton.style.color = 'white';
        evaluateButton.style.padding = '8px';
        evaluateButton.style.border = 'none';
        evaluateButton.style.borderRadius = '3px';
        evaluateButton.style.cursor = 'pointer';
        evaluateButton.addEventListener('click', autoEvaluate);

        // 提交按钮
        const submitButton = document.createElement('button');
        submitButton.textContent = '提交评价';
        submitButton.style.width = '50%';
        submitButton.style.backgroundColor = '#ffa500';
        submitButton.style.color = 'white';
        submitButton.style.padding = '8px';
        submitButton.style.border = 'none';
        submitButton.style.borderRadius = '3px';
        submitButton.style.cursor = 'pointer';
        submitButton.addEventListener('click', () => {
            if (typeof savePjxx === 'function') {
                savePjxx('1');
                setTimeout(() => {
                    const okButton = document.querySelector('.bootbox.modal.fade.in .btn-primary');
                    if (okButton) {
                        okButton.click();
                    }
                }, 1000);
            } else {
                alert('未找到提交函数,请手动点击页面的提交按钮');
            }
        });

        // 筛选未评按钮
        const filterButton = document.createElement('button');
        filterButton.textContent = '筛选未评';
        filterButton.style.width = '100%';
        filterButton.style.backgroundColor = '#2196F3';
        filterButton.style.color = 'white';
        filterButton.style.padding = '8px';
        filterButton.style.border = 'none';
        filterButton.style.borderRadius = '3px';
        filterButton.style.cursor = 'pointer';
        filterButton.style.marginTop = '10px';
        filterButton.addEventListener('click', () => {
            const select = document.querySelector('#ztTab');
            if (select) {
                select.value = "3";
                select.dispatchEvent(new Event('change'));

                if (window.jQuery) {
                    try {
                        jQuery('#ztTab').trigger('chosen:updated');
                        jQuery('#ztTab').trigger('change');
                    } catch (e) {
                        console.log('Chosen plugin update failed:', e);
                    }
                }
                queryLike();
            } else {
                alert('未找到状态选择框');
            }
        });

        // 将按钮添加到容器中
        buttonContainer.appendChild(evaluateButton);
        buttonContainer.appendChild(submitButton);
        panel.appendChild(buttonContainer);
        panel.appendChild(filterButton);

        // 添加拖动功能
        panel.style.cursor = 'move';
        let isDragging = false;
        let currentX;
        let currentY;
        let initialX;
        let initialY;

        panel.addEventListener('mousedown', e => {
            if (e.target === panel || e.target === title) {
                isDragging = true;
                initialX = e.clientX - panel.offsetLeft;
                initialY = e.clientY - panel.offsetTop;
            }
        });

        document.addEventListener('mousemove', e => {
            if (isDragging) {
                e.preventDefault();
                currentX = e.clientX - initialX;
                currentY = e.clientY - initialY;
                panel.style.left = currentX + 'px';
                panel.style.top = currentY + 'px';
                panel.style.right = 'auto';
            }
        });

        document.addEventListener('mouseup', () => {
            if (isDragging) {
                GM_setValue('panelPosition', {
                    top: panel.style.top,
                    left: panel.style.left,
                    right: 'auto'
                });
            }
            isDragging = false;
        });

        document.body.appendChild(panel);
    }

    // 自动评价函数
    function autoEvaluate() {
        const selectedOption = GM_getValue('selectedOption', 1);
        const comment = GM_getValue('defaultComment', '好');
        const autoSubmit = GM_getValue('autoSubmit', false);

        // 选择所有对应序号的单选按钮并点击
        document.querySelectorAll(`.wjgl_input[id$="_${selectedOption}"]`).forEach(radio => {
            if (!radio.checked) {
                radio.click();
            }
        });

        // 填写所有文本框
        document.querySelectorAll('textarea').forEach(textarea => {
            textarea.value = comment;
            const event = new Event('change', { bubbles: true });
            textarea.dispatchEvent(event);
        });

        // 如果启用了自动提交,则自动提交评价
        if (autoSubmit) {
            if (typeof savePjxx === 'function') {
                savePjxx('1');
                setTimeout(() => {
                    const okButton = document.querySelector('.bootbox.modal.fade.in .btn-primary');
                    if (okButton) {
                        okButton.click();
                    }
                }, 1000);
            }
        }
    }

    // 页面加载完成后添加配置面板
    function init() {
        window.addEventListener('load', () => {
            setTimeout(createConfigPanel, 0);
        });
    }

    // 启动脚本
    init();
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址