更新之后越来越难用了,自己懒得配置nginx,mysql,这些环境,开心版的又怕后门,自己改后端的js文件看的脑瓜子疼,反正都是界面,直接js删掉一些dom元素就行了。有需要的可以拿走。
// ==UserScript==
// @name 宝塔面板优化 - 界面美化
// @namespace http://tampermonkey.net/
// @version 1.3
// @description 移除指定 class 元素、替换特定 span 文字内容,并删除包含“需求反馈”的 span
// @match http://152.136.153.72:9999/*
// @grant none
// ==/UserScript==
(function () {
'use strict';
console.log('⚠ 脚本准备加载');
// 定义需要移除的 class 组合
const selectorsToRemove = [
'.h-auto.mt-\\[1\\.2rem\\]', // h-auto mt-[1.2rem]
'.svgtofont-desired.\\!mr-4px.\\!text-\\[16px\\]', // svgtofont-desired !mr-4px !text-[16px]
'.icon-end-time-free.icon-unpaid-ltd', // icon-end-time-free icon-unpaid-ltd
'.el-card.is-always-shadow.is-always-shadow.\\!border-\\[\\#efefef\\]', // el-card is-always-shadow is-always-shadow !border-[#efefef]
'.icon-end-time.icon-unpaid-ltd' // icon-end-time icon-unpaid-ltd
];
// 移除指定 class 的元素
const removeElementsByClass = () => {
selectorsToRemove.forEach(selector => {
document.querySelectorAll(selector).forEach(el => el.remove());
});
};
// 替换指定 span 的文字内容
const replaceSpanText = () => {
const spanSelector = 'span.mr-1rem.ml-\\[-1\\.5rem\\]';
document.querySelectorAll(spanSelector).forEach(span => {
span.textContent = '精简版';
});
};
// 删除 span/button 包含 指定字符 的 span 元素
const removeSpansWithText = () => {
const spans = document.querySelectorAll('span');
spans.forEach(span => {
if (span.textContent.trim() == '需求反馈') {
span.remove();
}
});
const buttons = document.querySelectorAll('button');
buttons.forEach(span => {
if (span.textContent.trim() == '立即体验') {
span.remove();
}
});
};
// 删除指定class 包含置顶字符的元素
const removeClassWithText =()=>{
const parents = document.querySelectorAll('.header-child-tab');
parents.forEach(span => {
if (
span.textContent.trim() == '安全检测' ||
span.textContent.trim() == '违规词检测' ||
span.textContent.trim() == 'PHP网站安全' ||
span.textContent.trim() == '入侵防御' ||
span.textContent.trim() == '系统加固' ||
span.textContent.trim() == '扫描感知' ||
span.textContent.trim() == '日志审计' ||
span.textContent.trim() == 'SSH登录日志'
) {
span.remove();
}
});
const classparents = document.querySelectorAll('.el-collapse-item');
classparents.forEach(span => {
if (
span.textContent.trim().includes('top5')
) {
span.remove();
}
});
}
// 删除包含特定子元素的 el-col 元素
const removeParentIfChildExists = () => {
// 获取所有 el-col.el-col-6.wrapper-item 元素
const parents = document.querySelectorAll('.el-col.el-col-6.wrapper-item');
parents.forEach(parent => {
// 检查子元素是否包含指定的 class
const child = parent.querySelector('.absolute.-left-1\\.5.-top-1');
if (child) {
parent.remove(); // 移除父元素
}
});
};
// 综合执行函数
const removeElements = () => {
removeElementsByClass();
replaceSpanText();
removeSpansWithText();
removeParentIfChildExists();
removeClassWithText();
};
// 等待dom加载完毕后执行综合函数
let timeoutId;
const debouncedRemove = () => {
clearTimeout(timeoutId);
timeoutId = setTimeout(removeElements, 200);
};
let runCount = 0;
const maxRuns = 5;
const observer = new MutationObserver((mutations, obs) => {
if (runCount >= maxRuns) {
obs.disconnect();
return;
}
obs.disconnect();
debouncedRemove();
runCount++;
obs.observe(document.body, { childList: true, subtree: true });
});
observer.observe(document.body, { childList: true, subtree: true });
// 点击一次执行一次综合函数
let clickTimeout;
document.addEventListener('click', () => {
clearTimeout(clickTimeout);
clickTimeout = setTimeout(removeElements, 200);
});
// 初始执行(延迟 1 秒,等待 DOM 加载)
setTimeout(() => {
removeElements();
}, 1000);
})();