// ==UserScript== // @name 易迅数据服务自动审批 // @namespace http://tampermonkey.net/ // @version 4.0 // @description 实时监听URL变化,仅在指定页面显示控制面板 // @author 刘运运 // @match *://*/partal/* // @grant none // ==/UserScript== (function() { 'use strict'; const TARGET_PATH = '/partal/#/layout/home/personal-center/myTodoList'; let panel = null; // 用于存储面板的DOM对象 let isRunning = false; // --- 1. 判断是否是目标页面 --- function isTargetPage() { return window.location.href.includes(TARGET_PATH); } // --- 2. 创建并显示控制面板 --- function showPanel() { // 如果面板已经存在,或者不是目标页面,就不重复创建 if (panel || !isTargetPage()) return; // 创建面板 DOM (这里简写了部分样式,保持和你之前的一致) panel = document.createElement('div'); panel.id = 'auto-task-panel'; panel.style.cssText = `position: fixed; bottom: 20px; right: 20px; width: 300px; background: #fff; border: 1px solid #409EFF; border-radius: 8px; box-shadow: 0 4px 12px rgba(64,158,255,0.3); z-index: 9999; padding: 15px; font-family: Arial, sans-serif;`; panel.innerHTML = `
自动审批助手
`; document.body.appendChild(panel); log('✅ 脚本已就绪'); // 绑定按钮事件 document.getElementById('startBtn').addEventListener('click', startProcess); document.getElementById('stopBtn').addEventListener('click', stopProcess); } // --- 3. 隐藏并销毁控制面板 --- function hidePanel() { if (panel) { // 如果正在运行,先强制停止 if (isRunning) stopProcess(); panel.remove(); // 从页面中彻底移除 panel = null; // 清空变量 console.log('❌ 离开目标页面,脚本面板已隐藏'); } } // --- 4. 核心业务逻辑 (简化版) --- function log(msg) { const logBox = document.getElementById('logBox'); if (logBox) { logBox.innerHTML += `
[${new Date().toLocaleTimeString()}] ${msg}
`; logBox.scrollTop = logBox.scrollHeight; } } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function startProcess() { if (isRunning) return; isRunning = true; document.getElementById('startBtn').disabled = true; log('🚀 任务启动...'); while (isRunning) { // 1. 检查页面状态 if (!isTargetPage()) { stopProcess(); break; } // --- 阶段一:寻找弹窗中的“同意”按钮 (高优先级) --- // 查找文本为"同意"且可见的按钮 const agreeBtn = Array.from(document.querySelectorAll('button, span')) .find(el => el.innerText.trim() === '同意' && el.offsetWidth > 0); if (agreeBtn) { log('🔍 发现弹窗,点击同意...'); agreeBtn.click(); await sleep(2000); // 等待提交反应 continue; // 点击同意后,立即重新开始循环 } // --- 阶段二:寻找主页面的“处理”按钮 --- const handleBtn = document.querySelector('i.handletable'); if (handleBtn) { log('🔍 找到待处理项,点击...'); handleBtn.click(); await sleep(1000); // 等待弹窗出现 } else { // 修改点:直接停止 log('🏁 未找到任务,直接停止'); stopProcess(); break; } } } function stopProcess() { isRunning = false; const startBtn = document.getElementById('startBtn'); if (startBtn) startBtn.disabled = false; log('🛑 任务已停止'); } // --- 5. 初始化与 URL 监听 (重点!) --- // 首次加载时检查一次 if (isTargetPage()) showPanel(); // 使用 MutationObserver 监听整个页面的变化(适配单页应用的路由跳转) const observer = new MutationObserver(() => { // 当 URL 变化导致 DOM 更新时,会触发这里 const currentIsTarget = isTargetPage(); if (currentIsTarget && !panel) { showPanel(); // 进来了且没有面板 -> 显示 } else if (!currentIsTarget && panel) { hidePanel(); // 出去了且有面板 -> 隐藏 } }); // 开始观察 document 下所有子节点的变动 observer.observe(document.body, { childList: true, subtree: true }); })();