// ==UserScript== // @name 1Panel 增强 // @namespace http://tampermonkey.net/ // @version 0.11 // @description 1Panel 功能增强 // @author yuyan // @match *://*/* // @grant GM_setValue // @grant GM_getValue // @grant GM_registerMenuCommand // @grant GM_addStyle // @license MIT // @downloadURL none // ==/UserScript== (function() { 'use strict'; // 配置项 const CONFIG = { panelUrls: GM_getValue('panelUrls', []) // 存储用户配置的面板地址数组 }; // 检查当前页面是否匹配配置的地址 function isMatchingUrl() { if (!CONFIG.panelUrls.length) return false; const currentUrl = window.location.host; // 获取当前域名+端口 return CONFIG.panelUrls.some(url => currentUrl.includes(url)); } // 添加样式 GM_addStyle(` .panel-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); z-index: 9998; display: none; } .settings-panel { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 12px 0 rgba(0,0,0,.1); z-index: 9999; min-width: 400px; max-width: 600px; display: none; } .settings-panel h2 { margin: 0 0 20px 0; padding-bottom: 10px; border-bottom: 1px solid #eee; } .settings-content { max-height: 400px; overflow-y: auto; padding-right: 10px; } .menu-item-control { margin-bottom: 10px; display: flex; align-items: center; } .menu-item-control input[type="checkbox"] { margin-right: 10px; } .panel-buttons { margin-top: 20px; text-align: right; border-top: 1px solid #eee; padding-top: 15px; } .panel-button { padding: 8px 15px; margin-left: 10px; border: none; border-radius: 4px; cursor: pointer; } .save-button { background: #409EFF; color: white; } .cancel-button { background: #909399; color: white; } .url-config { margin-bottom: 20px; padding: 15px; background: #f5f7fa; border-radius: 4px; } .url-item { display: flex; gap: 10px; margin-bottom: 10px; } .url-input { flex: 1; padding: 8px; border: 1px solid #dcdfe6; border-radius: 4px; } .remove-url { background: #f56c6c; color: white; } .add-url { background: #67c23a; color: white; width: 100%; } .url-config p { margin: 5px 0; color: #909399; font-size: 12px; } `); // 等待菜单元素加载 function waitForMenu() { return new Promise(resolve => { const checkExist = setInterval(() => { const menu = document.querySelector('.el-menu--vertical'); if (menu) { clearInterval(checkExist); resolve(menu); } }, 100); }); } // 获取菜单项文本 function getMenuItemText(element) { const span = element.querySelector('span'); return span ? span.textContent.trim() : ''; } // 创建菜单项控制 function createMenuItemControl(text, isVisible) { const div = document.createElement('div'); div.className = 'menu-item-control'; const checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = isVisible; checkbox.dataset.menuItem = text; const label = document.createElement('label'); label.textContent = text; div.appendChild(checkbox); div.appendChild(label); return div; } // 创建URL配置面板 function createUrlConfigPanel() { const overlay = document.createElement('div'); overlay.className = 'panel-overlay'; const panel = document.createElement('div'); panel.className = 'settings-panel'; panel.innerHTML = `

1Panel地址配置

${CONFIG.panelUrls.map((url, index) => `
`).join('')}

支持的格式:

- 域名: panel.yourdomain.com

- 域名带端口: panel.yourdomain.com:8888

- IP: 192.168.1.100

- IP带端口: 192.168.1.100:29758

`; overlay.appendChild(panel); document.body.appendChild(overlay); overlay.style.display = 'block'; panel.style.display = 'block'; // 添加地址按钮事件 panel.querySelector('.add-url').addEventListener('click', () => { const urlList = panel.querySelector('#urlList'); const newUrlItem = document.createElement('div'); newUrlItem.className = 'url-item'; newUrlItem.innerHTML = ` `; urlList.appendChild(newUrlItem); // 为新添加的删除按钮绑定事件 newUrlItem.querySelector('.remove-url').addEventListener('click', function() { newUrlItem.remove(); }); }); // 为现有的删除按钮绑定事件 panel.querySelectorAll('.remove-url').forEach(button => { button.addEventListener('click', function() { this.closest('.url-item').remove(); }); }); // 保存按钮事件 panel.querySelector('.save-button').addEventListener('click', () => { const urls = Array.from(panel.querySelectorAll('.url-input')) .map(input => input.value.trim()) .filter(url => url !== ''); // 过滤空值 GM_setValue('panelUrls', urls); CONFIG.panelUrls = urls; overlay.remove(); alert('配置已保存,请刷新页面使配置生效'); }); // 取消按钮事件 panel.querySelector('.cancel-button').addEventListener('click', () => { overlay.remove(); }); // 点击遮罩层关闭 overlay.addEventListener('click', (e) => { if (e.target === overlay) { overlay.remove(); } }); return { overlay, panel }; } // 创建设置面板HTML function createSettingsPanel() { const overlay = document.createElement('div'); overlay.className = 'panel-overlay'; const panel = document.createElement('div'); panel.className = 'settings-panel'; panel.innerHTML = `

菜单显示设置

`; overlay.appendChild(panel); document.body.appendChild(overlay); return { overlay, panel }; } // 渲染设置面板内容 async function renderSettings() { const menu = await waitForMenu(); const settingsContent = document.querySelector('.settings-content'); settingsContent.innerHTML = ''; const menuItems = menu.querySelectorAll('li'); menuItems.forEach(item => { const text = getMenuItemText(item); if (text) { const saved = GM_getValue(text); const isVisible = saved === undefined ? true : saved; const control = createMenuItemControl(text, isVisible); settingsContent.appendChild(control); } }); } // 应用设置 async function applySettings() { const menu = await waitForMenu(); const menuItems = menu.querySelectorAll('li'); menuItems.forEach(item => { const text = getMenuItemText(item); if (text) { const isVisible = GM_getValue(text, true); item.style.display = isVisible ? '' : 'none'; } }); } // 保存设置 function saveSettings() { const controls = document.querySelectorAll('.menu-item-control input'); controls.forEach(checkbox => { const text = checkbox.dataset.menuItem; GM_setValue(text, checkbox.checked); }); applySettings(); } // 显示设置面板 function showSettingsPanel() { const { overlay, panel } = createSettingsPanel(); overlay.style.display = 'block'; panel.style.display = 'block'; renderSettings(); // 注册事件处理 panel.querySelector('.save-button').addEventListener('click', () => { saveSettings(); overlay.remove(); }); panel.querySelector('.cancel-button').addEventListener('click', () => { overlay.remove(); }); overlay.addEventListener('click', (e) => { if (e.target === overlay) { overlay.remove(); } }); } // 初始化 function init() { // 注册URL配置菜单 GM_registerMenuCommand('⚙️ 配置1Panel地址', createUrlConfigPanel); // 只在匹配的URL下执行面板功能 if (isMatchingUrl()) { // 注册菜单命令 GM_registerMenuCommand('📋 菜单显示设置', showSettingsPanel); // 应用已保存的设置 applySettings(); } } // 启动脚本 init(); })();