// ==UserScript==
// @name fw
// @namespace http://tampermonkey.net/
// @version 0.3.6
// @description 对蜂网路由器后台进行优化;1.首页显示温度模块;2.内网主机可单机查看功能;3.防止自动退出登录(不可用);4.自动开启ping检测;5.ping检测日志列表处理...
// @author 005
// @match *://*/*?PAGE=*
// @match https://*.ip138.com/*
// @match https://*.chaziyu.com/*
// @match https://*.icplishi.com/*
// @match https://*.ipchaxun.com/*
// @match https://*.chapangzhan.com/*
// @match https://*.123pan.com/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
// @grant none
// @license MIT
// ==/UserScript==
(function () {
'use strict';
const FWVERSION = '0.3.6'
//=============================================================================================
//--------------------------------------------配置---------------------------------------------
//=============================================================================================
// 1为开启 0为关闭
//----------------------
// 自动开启ping检测
const isOnPing = 0
// 顶部快捷导航
const isFastNav = 0
// 常用导航
const isCommonNav = 0
// 点击SN复制
const isCopySN = 1
// 内网主机
const isOnIpCheck = 1
// 流量识别
const isFlowIdentifi = 1
// 软件优先级
const isSoftPro = 1
// ping检测日志列表
const isOnPingLog = 1
// 点击logo跳转事件
const isOnLogoTo = 0
// 防止自动退出登录(不可用)
const isOnLogin = 1
// 检查脚本更新
const isCheckFwVer = 1
// 常用导航列表
const commonNavData = [
{ page: "index", name: "首页" },
{ page: "port_mapped", name: "端口映射/DMZ" },
{ page: "fw_sysinfo", name: "系统负载" },
{ page: "wan_speed", name: "LAN/WAN流量" },
{ page: "hosts_info", name: "内网主机" },
{ page: "fluid", name: "智能流控" },
{ page: "software", name: "应用软件分流" },
{ page: "basic_safe", name: "基础配置" },
{ page: "ping", name: "Ping检测" },
{ page: "fw_system", name: "系统日志" },
]
//=============================================================================================
//---------------------------------------------结束--------------------------------------------
//=============================================================================================
// 过滤广告:ip138、查子域名、icp备案查询、ip查询、123盘
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if (location.host.indexOf("ip138.com") !== -1){
setTimeout(()=>{
let lis = document.querySelectorAll("div.bd > div.result3 > ul.navs > li");
if (lis.length > 0)lis[lis.length - 1]?.remove()
document.querySelector("#banana")?.remove()
document.querySelectorAll(".banana").forEach(item=>{item?.remove()})
document.querySelectorAll(".mod-idc").forEach(item=>{item?.remove()})
document.querySelectorAll(".banner-outer").forEach(item=>{item?.remove()})
},0)
}
if (location.host.indexOf("chaziyu.com") !== -1){
document.querySelectorAll(".MODBanana").forEach(item=>{item?.remove()})
}
if (location.host.indexOf("icplishi.com") !== -1){
document.querySelectorAll(".MODBanana").forEach(item=>{item?.remove()})
}
if (location.host.indexOf("ipchaxun.com") !== -1){
document.querySelectorAll(".MODBanana").forEach(item=>{item?.remove()})
}
if (location.host.indexOf("chapangzhan.com") !== -1){
document.querySelectorAll(".MODBanana").forEach(item=>{item?.remove()})
}
if (location.host.indexOf("123pan.com") !== -1){
document.querySelectorAll("div.mfy-main-layout__head").forEach(item=>{item?.remove()})
}
// fw
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// 消息通知
const isOnMessage = 0
const logoToTime = 500;//logo跳转时间(毫秒)
const isDev = 0;
// 权限测试
{
// 只读权限拦截
const readonlyAPI = [
'/dhcp_log_del.htm',
'/start_upgred.htm',
'/updateprogress.htm',
'/update_online_again.htm',
'/fw_profile_reset.htm',
'/fw_config_restore.htm',
'/restart2.htm',
'/poweroff.htm',
'/fwlog_ping_del.htm',
'/action/fwlog_delete.htm',
]
// 只读权限放行
const whitelistAPI = [
'/auth',
'/fw_quit.htm',
'/is_bind_lan.htm',
'/hosts_info.htm',
'/show_connect.htm',
'/show_connect_exe.htm',
'/waf_get_server.htm',
'/waf_get_rule.htm',
'/waf_get_log.htm',
]
// 请求过滤器
$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
if (!'只读权限') {
for(let i=0;i<readonlyAPI.length;i++){
if (options.url.indexOf(readonlyAPI[i]) != -1) {
// 阻止请求
jqXHR.abort('Request blocked by ajaxPrefilter.')
alert('111只读权限')
location.reload();
return;
}
}
if (options.data) {
let isInterdict = false;
for(let i=0;i<whitelistAPI.length;i++){
if (options.url.indexOf(whitelistAPI[i]) == -1){
isInterdict = true;
}else{
return;
}
}
if(isInterdict){
// 阻止请求
jqXHR.abort('Request blocked by ajaxPrefilter.')
alert('222只读权限')
location.reload();
};
}
}
});
}
// CSS
{
var btnCss = `margin-right:24x;
display:inline-block;
cursor:pointer;
margin-left:10px;
padding:5px 10px;
background-color:#26A3E9;
border-radius:4px;
color:#fff;
font-size:12px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
transition: all .2s linear;`
var inpCss = `background-color: #ffffff;
color: #666666;
font-size: 14px;
height: 28px;
line-height: 28px;
text-indent: 10px;
width: 198px;
border: 1px solid #dbdfe6;
padding: 0;
border-radius: 4px;`
var selCss = `border: 1px solid #dbdfe6;
border-radius: 4px;
height: 28px;
line-height: 28px;
text-indent: 10px;
width: 100px;
`
}
// 导入字体图标库
// https://fontawesome.p2hp.com/#google_vignette
if(0)$('head').append($('<link>', {
rel: 'stylesheet',
type: 'text/css',
href: 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css' // 替换为你的CSS文件路径
}));
// main
{
//防止自动退出登录(不可用)
if(isOnLogin){ setInterval(() => { i = 1 }, 600000);sessionStorage.setItem('login', '1') }
//检查ping检测日志是否开启,如未打开检测将自动开启所有wan
if(isOnPing){
const toPingTime = 300;
setTimeout(()=>{
$.get('/action/ping_check_log_read.htm',(msg1)=>{
//console.log(msg1)
if(!msg1||msg1.line && msg1.line.length==0){
//开启
$.get('/action/wan_line_name_show.htm',(msg2)=>{
if(msg2.length>0){
const linesArr = []
for(let i=0;i<msg2.length;i++){
console.log()
if(msg2[i].id.indexOf('WAN')!=-1)linesArr.push(msg2[i].id)
}
if(1)
setTimeout(()=>{
$.post('/action/ping_check_log_write.htm', {data : JSON.stringify({
url: 'jd.com',
check_num: 100,
line: linesArr
})}, function (res) {
if (res.state == 1) {
message('success','已开启ping检测')
if (location.search.indexOf("?PAGE=ping") !== -1)location.reload();
}
}, 'json');
},toPingTime)
}
},'json')
}
},'json');
},toPingTime)
}
//消息
if(isOnMessage){
// CSS
{
}
$(".right_t").append(`<div class="fr" style="font-size:22px;margin-right: 10px;position:relative;"><span class="warning_container_entry" style="cursor: pointer;" title="消息">✉</span>
<div class="warning_container_entry" style="color:#ff5455;position:absolute;top:-7px;right:-2px;font-size:24px;font-weight:bold;cursor: pointer;">·</div>
<div id="warning_container" style="position:absolute;
color:#666;
font-size:14px;
line-height: normal;
top:54px;
right: 0;
width: 400px;
min-height: 400px;
background-color: #fff;
z-index: 9999;
border-radius: 10px;
padding-bottom:10px;
border: 1px solid #e3e3e3;
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.15);">
<div style="padding:10px;border-bottom:1px solid #e5e5e5;font-size:16px;display: flex;justify-content:space-between;align-items:center;">
<span>消息通知</span>
<span id="warning_close_btn" style="font-weight:bold;font-size:18px;cursor:pointer;" title="关闭">×</span>
</div>
<ul id="warning_list_container" style="padding:0 20px;">
<li><span>通知1</span></li>
<li><span>通知2</span></li>
<li><span>通知3</span></li>
</ul>
</div>
</div>`)
$("#warning_list_container>li").css({
borderBottom:"1px solid #e5e5e5",
padding:"10px 0",
cursor: "pointer"
})
$(".warning_container_entry").click(()=>{
$("#warning_container").css({
display:"block"
})
})
$("#warning_close_btn").click(()=>{
$("#warning_container").css({
display:"none"
})
})
}
//-----------
if(0){
const float_div_css = `
width: 25px;
height: 25px;
background-color:#b7b7b7;
position: fixed;
bottom: 60px;
right: 10px;
transition: all .2s linear;
cursor: pointer;
transform-origin: center center;
box-sizing: border-box;
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.15);
`
const float_div_div_css = `
width:0;
height:0;
border:1px solid #e3e3e3;
background-color:#fff;
position: absolute;
bottom: 0px;
right: 31px;
border-radius: 10px;
transition: all .2s linear;
cursor: pointer;
opacity: 0;
overflow: hidden;
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.15);
`
$("body").append(`<div id="float_div" style="position: fixed;bottom: 60px;right: 10px;">
<div id="float_div_div" style="${float_div_div_css}"></div>
<div id="float_div_icon" style="${float_div_css}"><div style="background-color:#b7b7b7;width:100%; height:100%;transform: rotateZ(-45deg);"></div></div>
</div>`)
$("#float_div").hover(function () {
$("#float_div_icon").css({
transform: "rotateZ(-90deg)"
})
$("#float_div_div").css({
opacity: "1",
width:"300px",
height:"400px"
})
}, function () {
$("#float_div_icon").css({
transform: "rotateZ(0deg)"
})
$("#float_div_div").css({
opacity: "0",
width:"0px",
height:"0px"
})
})
}
// 快捷导航
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if (isFastNav) {
$("#nav").css("display","none")
$('.right_t div:first').after(`<div class="right_nav" id="fast_nav" style="display:flex;user-select: none;width:calc(100% - 680px);height:100%;padding:0;position: relative;transition: all .2s linear;">
<ul class="fast_nav" style="width:calc(100% - 55px);display:flex;transition: all .2s linear;padding-left:5px;"></ul>
<div class="close_all_nav" style="min-width: 30px;
height: 35px;
color:#939393;
border: 1px solid rgba(0, 0, 0,0);
transition: all 0.2s linear 0s;
cursor: pointer;
margin-top: 12px;
margin-left:5px;
border-radius: 10px;
position: relative;
display: none;
justify-content: center;
align-items: center;
background-color: rgb(255, 255, 255);" title="关闭全部">✖</div>
</div>`);
//添加滑块开关
/*$("#fast_nav").append(`<div id="changeNavBtn" style="position:absolute;top:0;">
<input type="checkbox" name="able" class="input_hide able" value="1" id="changeNav">
<label class="slider-v3" for="changeNav"></label>
</div>`)*/
//初始化快捷导航
initNav()
//初始化快捷导航
function initNav(){
const actionNav = [location.search,location.pathname+location.search]//当前导航信息
const navList = {id:location.search,name:main?.nav[1],href:location.pathname+location.search}//所有导航信息
let navData = JSON.parse(sessionStorage.getItem("fastNavData"))||{actionNav,navList:[]}//初始导航数据
let curNavIndex = 0//当前导航下标
let showNavLength = 3//最大显示导航长度
let fastNavAbbHeight = 0//更多导航高度
$(document).ready(function() {
const screenWidth = $(window).width(); // 页面加载完成时获取屏幕宽度
if(1383<screenWidth&&screenWidth<=1504){
showNavLength = 4;
}else if(1504<screenWidth&&screenWidth<=1618){
showNavLength = 5;
}else if(1618<screenWidth&&screenWidth<=1735){
showNavLength = 6;
}else if(1735<screenWidth&&screenWidth<=1845){
showNavLength = 7;
}else if(1845<screenWidth&&screenWidth<=1979){
showNavLength = 8;
}else if(1979<screenWidth&&screenWidth<=2099){
showNavLength = 9;
}else if(2099<screenWidth&&screenWidth<=2218){
showNavLength = 10;
}else if(2218<screenWidth&&screenWidth<=2340){
showNavLength = 11;
}else if(screenWidth>=2458){
showNavLength = 12;
}else{
showNavLength = 3;
}
});
if(navData.navList.length>0){
let temp = false
for(let i=0;i<navData.navList.length;i++){
if(navData.navList[i].id==location.search)break;
if(i==navData.navList.length-1)temp=true
}
if(temp){
navData.navList.push(navList)
}
navData.actionNav=actionNav
}else{
navData.navList=[navList]
}
sessionStorage.setItem("fastNavData",JSON.stringify(navData))
let htmlA = ''
let htmlB = ''
navData.navList.forEach((item,index)=>{
if(navData.actionNav[0]==item.id)curNavIndex=index;
if(index<showNavLength){
htmlA+=`<li title="${item.name}"><a href="${item.href}">${item.name}</a><span data-id="${item.id}" title="关闭">×</span></li>`
}else{
htmlB+=`<li title="${item.name}"><a href="${item.href}">${item.name}</a><span data-id="${item.id}" title="关闭">×</span></li>`
//console.log(item)
}
})
$("ul.fast_nav").html(htmlA)
$("ul.fast_nav>li").css({
marginTop:"10px",
marginRight:"5px",
width:"120px",
fonsSize:"12px",
paddingRight:"12px",
lineHeight:"42px",
display:"flex",
justifyContent:"space-between",
position:"relative",
cursor: "pointer",
backgroundColor:"#fff",
transition: "all .2s linear",
borderRadius:"6px 6px 0 0",
border:"1px solid #f1f1f1",
borderBottom: "none"
})
$("ul.fast_nav>li a").css({
padding:"0",
paddingLeft:"12px",
color: "#666",
width:"calc(100% - 22px)",
whiteSpace: "nowrap",
overflow: "hidden",
textOverflow: "ellipsis"
})
$("ul.fast_nav>li span").css({
position: "absolute",
right:"6px",
fontSize:"16px",
height: "fit-content"
})
if(htmlB!=''){
$("ul.fast_nav").append(`<li class="fast_nav_more" style="min-width:30px;height:35px;border:1px solid #f1f1f1;transition: all .2s linear;cursor: pointer;margin-top:12px;border-radius:10px;
position: relative;
display: flex;
justify-content: center;
align-items: center;">
<image style="width:12px;transform: rotateZ(90deg);" src="/images/menu_right.png" />
<div id="fast_nav_abb" style="width:170px;position: absolute;left:0;top:41px;z-index:9999;background-color:#fff;box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.15);border-radius: 10px;overflow: hidden;opacity: 0;transition: all .2s linear;">
<ul class="fast_nav_abbreviate" style="width:100%;display:flex;flex-direction: column;box-sizing: border-box;padding:5px;"></ul>
</div>
</li>`)
$("ul.fast_nav_abbreviate").html(htmlB)
$("ul.fast_nav_abbreviate>li").css({
backgroundColor:"#fff",
padding: "0 10px",
width: "100%",
lineHeight: "40px",
boxSizing: "border-box",
display: "flex",
justifyContent: "space-between",
transition: "all .2s linear",
borderRadius:"6px",
})
$("ul.fast_nav_abbreviate>li:not(:last-child)").css({marginBottom:"5px"})
$("ul.fast_nav_abbreviate>li>a").css({
width:"calc(100% - 22px)",
})
$("ul.fast_nav_abbreviate>li>span").css({
fontSize:"16px",
})
fastNavAbbHeight = $("#fast_nav_abb").height()//获取更多导航高度
$("#fast_nav_abb").css("height","0");
$(".close_all_nav").css("display","flex")
}
if(htmlB!=''&&curNavIndex>=showNavLength){
//当前导航
$("ul.fast_nav li").eq(curNavIndex+1).css({backgroundColor:"#f1f1f1"})
}else{
//当前导航
$("ul.fast_nav>li").eq(curNavIndex).css({backgroundColor:"#f1f1f1",})
}
if(curNavIndex>showNavLength&&0){
// 关闭导航按钮
$('ul.fast_nav').on('click', 'li>span', function() {
closeNav($(this).attr('data-id'),curNavIndex)
});
}else{
// 关闭导航按钮
$('ul.fast_nav').on('click', 'li>span', function() {
closeNav($(this).attr('data-id'),curNavIndex)
});
}
$('ul.fast_nav').off('click', 'li>span')
// 关闭导航按钮
$('ul.fast_nav').on('click', 'li>span', function() {
closeNav($(this).attr('data-id'),curNavIndex)
});
// 关闭全部导航按钮
$(".close_all_nav").click(function() {
sessionStorage.removeItem("fastNavData")
initNav()
});
$("ul.fast_nav>li a").eq(curNavIndex).css({color: "#26a3e9"})
//hover
$(`ul.fast_nav>li:not(:eq(${curNavIndex<showNavLength?curNavIndex:curNavIndex+1}))`).hover(function () {
$(this).css({backgroundColor:"#f1f1f1"})
}, function () {
$(this).css({backgroundColor:"#fff"})
});
$(`ul.fast_nav_abbreviate>li:not(:eq(${curNavIndex-showNavLength}))`).hover(function () {
$(this).css({backgroundColor:"#f1f1f1"})
}, function () {
$(this).css({backgroundColor:"#fff"})
});
$("li.fast_nav_more").hover(function () {
$("#fast_nav_abb").css({
opacity:"1",
height:fastNavAbbHeight+"px",
})
}, function () {
$("#fast_nav_abb").css({
opacity:"0",
height:"0",
})
});
$(".close_all_nav").hover(function () {
$(this).css({
color:"#ff7875",
backgroundColor:"#fff2f0"
})
}, function () {
$(this).css({
color:"#939393",
backgroundColor:"#fff"
})
});
$(`ul.fast_nav>li a:not(:eq(${curNavIndex}))`).hover(function () {
$(this).css({color: "#26a3e9"})
}, function () {
$(this).css({color: "#666"})
});
$("ul.fast_nav>li span").hover(function () {
$(this).css({color:"#ff4d4f"})
}, function () {
$(this).css({color:"#666"})
});
if(!htmlB)$(".close_all_nav").css("display","none")
$("a").css("textDecoration","none")
}
function closeNav(id,curI){
let navData = JSON.parse(sessionStorage.getItem("fastNavData"))
navData.navList = navData.navList.filter(item => item.id!=id);
sessionStorage.setItem("fastNavData",JSON.stringify(navData))
if(location.search==id&&navData.navList.length>0){
if(navData.navList.length<=curI){
location.href = navData.navList[navData.navList.length-1].href
}else{
location.href = navData.navList[curI].href
}
}else{
initNav()
}
}
$(".right").css("overflow","visible")
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// 常用导航
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if (isCommonNav) {
let curNavIndex = 9999//当前导航下标
let commonNavHeight = 0//常用导航高度
$('body>div.right').append(`
<div id="common_nav_container" style="width:30px;
overflow:hidden;
background-color:#fff;
position: absolute;
top: 60px;left: 179px;
z-index: 9999;
opacity: 0;
display:none;
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.15);
border-radius:10px;
transition: all 0.2s linear 0s;">
<ul class="common_nav" style="width:100%;display:flex;flex-direction: column;box-sizing: border-box;padding:5px;border-radius:10px;">
${addCommonNavItem(commonNavData)}
</ul>
<div style="position:absolute;top:0;left:0;width:100%;height:100%;background-color:#f1f1f1;opacity: 1;display:block;"></div>
</div>
`)
$("ul.common_nav>li").css({
backgroundColor:"#fff",
padding: "0 10px",
width: "100%",
lineHeight: "40px",
boxSizing: "border-box",
display: "flex",
justifyContent: "space-between",
transition: "all .2s linear",
borderRadius:"6px",
cursor: "pointer",
userSelect: "none",
whiteSpace: "nowrap"
})
$("ul.common_nav>li:not(:last-child)").css({marginBottom:"5px"})
//初始化常用导航导航
$("ul.common_nav>li").eq(curNavIndex).css({backgroundColor:"#f1f1f1",color:"#26a3e9"})
commonNavHeight = $(`#common_nav_container`).height()
$(`#common_nav_container`).css({width:"30px",height:"30px",opacity: "1",display:"block"})
//hover
$(`#common_nav_container`).hover(function () {
$(this).children('div').css({opacity:"0",display:"none"})
$(this).css({width:"170px",height:commonNavHeight})
}, function () {
$(this).children('div').css({opacity:"1",display:"block"})
$(this).css({width:"30px",height:"30px"})
});
$(`ul.common_nav>li:not(:eq(${curNavIndex}))`).hover(function () {
$(this).css({backgroundColor:"#f1f1f1",color:"#26a3e9"})
}, function () {
$(this).css({backgroundColor:"#fff",color:"#666"})
});
//点击事件
$('ul.common_nav').on('click', 'li', function() {location.href = `/index.htm?PAGE=${$(this).attr('data-page')}`});
function addCommonNavItem(data){
let comNav = ''
data.forEach((item,index)=>{
if(item.page==location.search.split('=')[1])curNavIndex=index;
comNav += `<li data-page="${item.page}" title="${item.name}">${item.name}</li>`
})
return comNav
}
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// 首页
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
let IndexTime = null
if (location.search.indexOf("?PAGE=index") !== -1) {
//检查脚本更新
if(isCheckFwVer)checkVersion(FWVERSION,5000)
if(isCopySN){
$(document).on({mouseenter: function() { $(this).css({cursor:"pointer",color:"#26a3e9"});},
mouseleave: function() { $(this).css({color:"#666"}) } }, '#sn');
$("#sn").attr("title","点击复制")
$("#sn").css({cursor:"pointer"})
$("#sn").click(function () {
let str = $('#sn').text();
if (str!== ""){
let $temp = $('<input>');
$('body').append($temp);
$temp.val(str).select();
document.execCommand('copy');
$temp.remove();
message('success', '已复制')
}
})
}
//添加cpu温度
IndexTime = null
$.get('/action/env_check.htm', {}, function (msg) {
// console.log(msg);
let html = ''
if (msg.cpu_term < 10 || msg.cpu_term > 85) {
html += '<span>CPU温度: [ <font style="color:#ff0000;">' + msg.cpu_term + ' ℃</font> ]<img src="images/warning.png" title="温度异常,请及时清理设备,检查设备散热问题。" style="margin-left: 5px;width:14px; height:14px;"></span>';
$(".box-B10 p:nth(5)").after(`
<div class="H10"></div>
<p class="blk_tit"><span class="info_tit"><span class="cpuwendu" style="cursor:pointer;" onclick="(()=>{window.location='/index.htm?PAGE=env_check'})()" title="点击跳转到环境检测">CPU温度</span></span><span class="blk_txt" id="cpu_term"><font style="color:#ff0000;">${msg.cpu_term} ℃</font><img src="images/warning.png" title="温度异常,请及时清理设备,检查设备散热问题。" style="margin-left: 5px;width:14px; height:14px;">
</span></p>
`)
} else {
html += '<span>CPU温度: [ <font style="color:#59CBA0">' + msg.cpu_term + ' ℃</font> ]</span>';
$(".box-B10 p:nth(5)").after(`
<div class="H10"></div>
<p class="blk_tit"><span class="info_tit"><span class="cpuwendu" style="cursor:pointer;" onclick="(()=>{window.location='/index.htm?PAGE=env_check'})()" title="点击跳转到环境检测">CPU温度</span></span><span class="blk_txt" id="cpu_term">${msg.cpu_term} ℃
</span></p>
`)
}
$(".box-B10 p:last-of-type").css("display", "none")
}, "JSON")
IndexTime = setInterval(() => {
$.get('/action/env_check.htm', {}, function (msg) {
//console.log(msg)
if (msg.cpu_term < 10 || msg.cpu_term > 85) {
$("#cpu_term").html(`<font style="color:#ff0000;">${msg.cpu_term} ℃</font><img src="images/warning.png" title="温度异常,请及时清理设备,检查设备散热问题。" style="margin-left: 5px;width:14px; height:14px;">
`)
} else {
$("#cpu_term").html(msg.cpu_term + " ℃")
}
}, "JSON")
}, 4000)
$(document).on({mouseenter: function() { $(this).css({cursor:"pointer",color:"#26a3e9"});},
mouseleave: function() { $(this).css({color:"#666"}) } }, '.cpuwendu');
//关闭跳转事件
$(".col-xs-7").off("click");
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//内网主机
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if (isOnIpCheck&&(location.search.indexOf("?PAGE=hosts_info") !== -1)) {
$(".seitchH-ul>.PPPOE_div>.H20>p").html('')
//IP查询
if(true){
$("#listModal>.modal-body>.header").after(`
<div style="margin-bottom:10px;display:flex;padding-left:20px;align-items:center;">
<span style="margin-left:10px;">IP/域名查询:</span>
<input type="text" id="ipQueryInp2" value="" style="background-color: #ffffff;
color: #666;
font-size: 14px;
height: 25px;
line-height: 25px;
text-indent: 10px;
width: 198px;
border: 1px solid #dbdfe6;
padding: 0;
border-radius: 4px;width:140px;">
<div id="ipQueryClear2" style="display:inline-block;font-size:12px;cursor:pointer;color:#666;margin-left:10px;transition:all .2s linear;">清空</div>
<div id="ipQueryBtn2" style="${btnCss}padding:2px 15px;margin-left:10px;">查询</div>
</div>`)
$("#listModal").css({transform:"translateY(-50px)"})
$("#listModal>.modal-body>.header").css({position:"relative"})
$("#listModal>.modal-body>div:nth(2)").css({maxHeight:"450px"})
$("#listModal>.modal-body>div:nth(2)>.connect_table").css({margin:"0 30px",boxSizing: "border-box",width:"calc(100% - 60px)"})
//IP/域名查询输入框添加键盘事件
$('#ipQueryInp2').keydown(function(event) {
// 使用 event.key 来判断按键
if (event.key === 'Enter') {
if($("#ipQueryInp2").val().trim()!=''){window.open(`https://ip138.com/iplookup.php?ip=${$("#ipQueryInp2").val().trim()}&action=2`)
}else{message('warning','请输入查询IP或域名')}
}
});
$("#ipQueryClear2").click(()=>{$("#ipQueryInp2").val('')})
$("#ipQueryBtn2").click(()=>{
if($("#ipQueryInp2").val().trim()!=''){window.open(`https://ip138.com/iplookup.php?ip=${$("#ipQueryInp2").val().trim()}&action=2`)}else{message('warning','请输入查询IP或域名')}
})
}
// 单机应用查看
{
$(".PPPOE_div>.div-tab").prepend(`<span style="margin-right:5px;">单机查看:</span><input type="text" id="ipInp" value="" style="${inpCss}width:130px;" />
<div id="searchBtn" style="${btnCss}" >查看</div><span> | </span>`)
$("#ipInp").val(localStorage.getItem("ipVal")||'')
}
//IP正则
let ipaddress = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/;
//遮罩层CSS
{
var maskCss = `background-color:rgba(0,0,0,.3);
display:none;
position:fixed;
width:100%;
min-width:1200px;
height:100%;
top:0;
left:0;
bottom:0;
z-index:99999;
transition: all .2s linear;
box-sizing: border-box;
overflow:auto;
`
var maskGtDiv = `width:1200px;
height:calc(100% - 110px);
overflow:hidden;
margin:55px auto;
background-color:#fff;
border-radius: 10px;
padding:10px 0;
box-sizing: border-box;`
var refreshTimeCss = `background-color: #ffffff;
color: #666666;
font-size: 13px;
height: 28px;
line-height: 28px;
text-indent: 10px;
width: 52px;
border: 1px solid #dbdfe6;
padding: 0;
border-radius: 4px;
margin:0 5px;`
var listTableWrapperCss = `width:100%;
height:calc(100% - 131px);
margin-top:45px;
border:1px solid #f0f0f0;
border-radius:0 0 10px 10px;
padding-bottom:10px;
overflow: auto;
`
}
//添加遮罩层
{
$("body").append(`
<div id="mask" style="${maskCss}">
<div style="${maskGtDiv}">
<div style="
padding:5px 20px;
display:flex;
justify-content: space-between;
align-items:center;
border-bottom:1px solid #eee;
">
<span style="font-size:16px;font-weight: bold;">连接列表</span>
<div id="colseBtn" style="${btnCss}color:#ff4d4f;background-color:#fff;" title="ESC 关闭">关闭</div>
</div>
<div style="padding:15px 40px;height:calc(100% - 95px);position: relative;">
<ul style="height:31px;line-height:31px;margin-bottom:10px;display: flex;">
<li style="width:80px;">当前 IP: <span id="currentIP" style="font-weight: bold;">-</span></li><li>连接数: <span id="conn_num" style="color: #0065ce;font-weight: bold">-</span></li>
</ul>
<div style="display:flex;justify-content: space-between">
<div style="display:flex;flex-direction: row;align-items:center;">
<select id="isHide" class="selCss"style="${selCss}width:65px;margin-right:4px;">
<option value="1">隐藏</option>
<option value="0">只看</option>
</select>
<span>:</span>
<select class="selCss" id="hideType" style="${selCss}margin-right:5px;">
<option value="appstat">连接类型</option>
<option value="pri">优先级</option>
<option value="proto">协议</option>
<option value="sport">源端口</option>
<option value="dport">目的端口</option>
<option value="daddr">目标地址</option>
<option value="wan">外网接口</option>
<option value="status">连接状态</option>
</select><span>-</span>
<input id="hideInp" style="${inpCss}width:130px;margin-left:5px;"/>
<div id="resetHideBtn" style="display:inline-block;font-size:12px;cursor:pointer;color:#666;margin-left:10px;transition:all .2s linear;">重置</div>
<div id="okHideBtn" style="${btnCss}">确认</div>
<div style="display:flex;align-items:center;margin-left:30px;">
<span style="margin-left:10px;">IP/域名查询:</span>
<input type="text" id="ipQueryInp1" value="" style="background-color: #ffffff;
color: #666;
font-size: 14px;
height: 28px;
line-height: 28px;
text-indent: 10px;
width: 198px;
border: 1px solid #dbdfe6;
padding: 0;
border-radius: 4px;width:140px;">
<div id="ipQueryClear1" style="display:inline-block;font-size:12px;cursor:pointer;color:#666;margin-left:10px;transition:all .2s linear;">清空</div>
<div id="ipQueryBtn1" style="${btnCss}">查询</div>
</div>
</div>
<div>自动刷新:<input type="number" id="refreshTimeInp" style="${refreshTimeCss}"/>秒
<div id="StartStopBtn" style="${btnCss}" title="空格 停止刷新">开始</div>
<div id="reloadBtn" style="${btnCss}" title="R 刷新">立即刷新</div>
</div>
</div>
<ul id="listTableWrapper" style="${listTableWrapperCss}">
<li style="position:absolute;
width: calc(100% - 77px);
top: 102px;
left: 40px;">
<ul class="listTableHead" style="border-radius: 10px 10px 0 0;overflow:hidden;cursor: pointer;">
<li data-type="appstat">连接类型</li>
<li data-type="pri">优先级</li>
<li data-type="up">上传流量</li>
<li data-type="down">下载流量</li>
<li data-type="proto">协议</li>
<li data-type="sport">源端口</li>
<li data-type="dport">目的端口</li>
<li data-type="daddr">目标地址</li>
<li data-type="wan">外网接口</li>
<li data-type="status">连接状态</li>
</ul>
</li>
</ul>
</div>
</div>
`)
//添加排序元素
$(".listTableHead>li").append(`
<div style="display:flex;flex-direction: column;margin-left:5px;">
<div style="width: 0;height: 0;
border-left: 4px solid transparent;
border-right: 4px solid transparent;
border-bottom: 5px solid #b1b1b1;"></div>
<div style="width: 0;height: 0;margin-top:3px;
border-top: 5px solid #b1b1b1;
border-left: 4px solid transparent;
border-right: 4px solid transparent;"></div>
</div>
`)
//CSS-----------------------
{
$("#currentIP").parent().parent().find("li").css({
width:"200px",
display:"flex",
alignItems:"center"
});
$(".selCss>option").css({
border:"1px solid #f0f0f0",
})
$(".listTableHead>li").css({
cursor: "pointer",
userSelect: "none",
transition: "all .2s linear"
})
$("#listTableWrapper>li>ul").css({
display:"flex"
})
$("#listTableWrapper>li>ul>li").css({
width:"10%",
height:"40px",
display:"flex",
justifyContent: "center",
alignItems: "center",
borderBottom:"1px solid #f0f0f0",
})
$("#listTableWrapper>li>ul").eq(0).children('li').css({
backgroundColor:"#fafafa",
fontWeight: "bold",
height:"40px"
})
//hover-------------------
//查看按钮hover
$("#searchBtn").hover(function(){
// 移入
$(this).css("background-color","#39ade6")
}, function(){
// 移出
$(this).css("background-color","#26a3e9")
});
// 遮罩层关闭按钮hover
$("#colseBtn").hover(function(){
$(this).css("color","#ff7875")
$(this).css("background-color","#fff2f0")
}, function(){
$(this).css("color","#ff4d4f")
$(this).css("background-color","#fff")
});
//按钮hover
$("#searchBtn,#reloadBtn,#okHideBtn,#StartStopBtn,#ipQueryBtn1,#ipQueryBtn2").hover(function(){
// 移入
$(this).css("background-color","#39ade6")
}, function(){
// 移出
$(this).css("background-color","#26a3e9")
});
//重置、清空hover
$("#resetHideBtn,#ipQueryClear1,#ipQueryClear2").hover(function(){
$(this).css("color","#39ade6")
}, function(){
$(this).css("color","#666")
});
//列表头部排序hover
$(".listTableHead>li").hover(function(){
// 鼠标移入时的处理逻辑
$(this).css("background-color","#efefef")
}, function(){
// 鼠标移出时的处理逻辑
$(this).css("background-color","#fafafa")
});
//回到顶部按钮hover
$("#back-to-top").hover(function(){
// 鼠标移入时的处理逻辑
$(this).css("background-color","#f0f0f0")
}, function(){
// 鼠标移出时的处理逻辑
$(this).css("background-color","#fff")
});
}
}
//ip详情列表样式
function ipListTableCss(){
$("#listTableWrapper>li>ul").css({
display:"flex"
})
$("#listTableWrapper>li>ul>li").css({
width:"10%",
height:"30px",
display:"flex",
justifyContent: "center",
alignItems: "center",
borderBottom:"1px solid #f0f0f0",
})
$("#listTableWrapper>li>ul>li:first-child").css({ width:"11%", })
$("#listTableWrapper>li>ul>li:nth-child(2)").css({ width:"9%", })
$("#listTableWrapper>li:gt(0)>ul").css({
transition: "all .2s linear"
})
//hover-------------------
//除第一个li其他选中
$("#listTableWrapper>li:gt(0)>ul").hover(function(){
// 鼠标移入时的处理逻辑
if($(this).children().last().text()=="稳定")
$(this).css("background-color","#fafafa")
}, function(){
// 鼠标移出时的处理逻辑
if($(this).children().last().text()=="稳定")
$(this).css("background-color","#fff")
});
}
let timerReload=null;//刷新定时器
let isStart=false;//是否开始
let sort={state:0,type:'down'};//排序
let ipListData=[];//ip详情数据
//查看按钮点击事件
$(document).on("click", "#searchBtn",ipDetail);
//隐藏重置点击事件
$(document).on("click", "#resetHideBtn", function(){
$("#hideInp").val('')
sessionStorage.removeItem('hideEntry')
getIpList()//发起请求
message('', '已重置')
});
//隐藏输入框添加键盘事件
$('#hideInp').keydown(function(event) {
// 使用 event.key 来判断按键
if (event.key === 'Enter') {
hideOk();
}
});
//隐藏确认点击事件
$(document).on("click", "#okHideBtn",hideOk);
//IP/域名查询输入框添加键盘事件
$('#ipQueryInp1').keydown(function(event) {
// 使用 event.key 来判断按键
if (event.key === 'Enter') {
if($("#ipQueryInp1").val().trim()!=''){window.open(`https://ip138.com/iplookup.php?ip=${$("#ipQueryInp1").val().trim()}&action=2`)
}else{message('warning','请输入查询IP或域名')}
}
});
//IP/域名查询清空按钮
$('#ipQueryClear1').click(()=>{$("#ipQueryInp1").val('')})
//IP/域名查询按钮
$('#ipQueryBtn1').click(()=>{
if($("#ipQueryInp1").val().trim()!=''){window.open(`https://ip138.com/iplookup.php?ip=${$("#ipQueryInp1").val().trim()}&action=2`)
}else{message('warning','请输入查询IP或域名')}
})
//自动刷新输入框添加键盘事件
$('#refreshTimeInp').keydown(function(event) {
// 使用 event.key 来判断按键
if (event.key === 'Enter') {
if($("#refreshTimeInp").val()>0){
clearInterval(timerReload)
$("#StartStopBtn").text('停止')
isStart=true
timerReload=setInterval(getIpList,$("#refreshTimeInp").val()*1000)
}else{
message('warning','大于 0 生效!')
}
}
});
//启/停定时按钮
$(document).on("click", "#StartStopBtn", function(){
if(isStart){
$("#StartStopBtn").text('开始')
clearInterval(timerReload)
isStart=false
message('', '已停止!')
}else{
if($("#refreshTimeInp").val()>0){
message('success', '已开始!')
$("#StartStopBtn").text('停止')
isStart=true
timerReload=setInterval(getIpList,$("#refreshTimeInp").val()*1000)
}else{
message('warning', '大于 0 生效!')
}
}
});
//立即刷新按钮
$(document).on("click", "#reloadBtn", function(){
getIpList()
$("#StartStopBtn").text('开始')
clearInterval(timerReload)
isStart=false
});
//排序点击事件
$(document).on("click", ".listTableHead>li", function(){
$(".listTableHead>li>div").each(function() {
$(this).children().eq(0).css("border-bottom-color","#b1b1b1");
$(this).children().eq(1).css("border-top-color","#b1b1b1");
})
if(sort.type==this.dataset.type){
if(sort.state<2){
sort.state+=1
}else{
sort.state=0
}
}else{
sort.state=1;
sort.type=this.dataset.type;
}
switch(sort.state){
case 1:$(this).children().children().eq(0).css("border-bottom-color","#1677ff");
$(this).children().children().eq(1).css("border-top-color","#b1b1b1");break;
case 2:$(this).children().children().eq(0).css("border-bottom-color","#b1b1b1");
$(this).children().children().eq(1).css("border-top-color","#1677ff");break;
}
addIpList()
});
// ip详情列表
function ipDetail(e,a=false){
getIpList(a);
//初始显示隐藏组件
let hideEntryInp = sessionStorage.getItem('hideEntry')?JSON.parse(sessionStorage.getItem('hideEntry')):'';
if(Object.prototype.toString.call(hideEntryInp) === '[object Object]'){
const keys = Object.keys(hideEntryInp);
const values = Object.values(hideEntryInp);
$("#hideType").val(keys[0])
if(keys[0]=='pri'){
switch(values[0]){
case "1":$('#hideInp').val("最高");break;
case "2":$('#hideInp').val("高");break;
case "3":$('#hideInp').val("中");break;
case "4":$('#hideInp').val("低");break;
case "5":$('#hideInp').val("最低");break;
}
}else{
$('#hideInp').val(values[0]);
$('#isHide').val(hideEntryInp.isHide);
}
}else{
$('#hideInp').val('');
$('#isHide').val(1);
}
}
// 隐藏确认
function hideOk(){
let hideType = $("#hideType").val()
let hideVal = $("#hideInp").val().trim()
let isOk = true
if(hideType=="pri"){
if(/^[\u4e00-\u9fa5]{1,2}$/.test(hideVal)){
switch(hideVal){
case "最高":hideVal="1";break;
case "高":hideVal="2";break;
case "中":hideVal="3";break;
case "低":hideVal="4";break;
case "最低":hideVal="5";break;
default:isOk = false;
}
}else{
isOk = false;
}
}else if(hideType=="proto"){
if(!(/TCP/i.test(hideVal) || /UDP/i.test(hideVal) || /ICMP/i.test(hideVal)))isOk = false;
}else if(hideType=="sport"||hideType=="dport"){
const num = parseInt(hideVal, 10);
if(!(!isNaN(num) && num >= 0 && num <= 65535))isOk = false;
}else if(hideType=="daddr"){
const pattern = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
if(!pattern.test(hideVal))isOk = false;
}else if(hideType=="wan"){
if(!((hideVal.indexOf('wan')!=-1)||(hideVal.indexOf('LAN')!=-1)||(hideVal.indexOf('l2tp')!=-1)||(hideVal.indexOf('pptp')!=-1)))isOk = false;
}else if(hideType=="status"){
if(hideVal=="未响应"){
hideVal = 1
}else if(hideVal=="稳定"){
hideVal = 2
}else{
isOk = false
}
}else if(hideType=="appstat"){
console.log(isOk,hideType,hideVal)
}
if(isOk&&hideVal){
message('success', 'OK!')
sessionStorage.setItem('hideEntry',JSON.stringify({[hideType]:hideVal,isHide:$("#isHide").val()}))
}else{
console.log(isOk,hideType,hideVal)
message('warning', '类型与值不匹配!')
}
getIpList()//发起请求
//console.log(isOk,hideType,hideVal)
}
// 请求获取ip详情列表
function getIpList(i){
let ip = i||$("#ipInp")[0].value
$("#currentIP").text(ip)
localStorage.setItem("ipVal",ip)
//判断输入IP是否正确
if (ipaddress.test(ip)) {
message('', '加载中...')
$("#ipInp")[0].value=ip
let data = JSON.stringify({ ip, wan: $(".sel_line option:selected").attr("data") })
//请求数据
$.get('/action/show_connect.htm', { data }, function (msg) {
//console.log(msg)
if (msg.length > 0) {
if(Array.isArray(msg[0])){
message('','有子数组');
}else{
ipListData = msg;
$("#conn_num").text(msg.length)
addIpList()
}
$("#mask").css("display","block")
} else {
//没有查到数据
message('warning',"该IP无数据!")
}
}, "JSON")
} else {
message('error',"IP有误!")
}
}
// 添加ip详情列表数据
function addIpList(){
//console.log(sort.state,sort.type);
$("#listTableWrapper>li:gt(0)").remove()
let sortData=JSON.parse(JSON.stringify(ipListData));
let hideEntry = sessionStorage.getItem('hideEntry')?JSON.parse(sessionStorage.getItem('hideEntry')):''
let hideEntryKey = '';
if(Object.prototype.toString.call(hideEntry) === '[object Object]'){
hideEntryKey = Object.keys(hideEntry)[0];
}else{
}
switch(sort.state){
case 1:sortData.sort(function(a,b){return a[sort.type]-b[sort.type]});break;
case 2:sortData.sort(function(a,b){return b[sort.type]-a[sort.type]});break;
}
let html = ''
sortData=sort.state==0?ipListData:sortData
sortData.forEach(function(item,index){
if(hideEntryKey){
if(hideEntry.isHide==1){
if(item[hideEntryKey]==hideEntry[hideEntryKey])return;
}else{
if(item[hideEntryKey]!=hideEntry[hideEntryKey])return;
}
}
html +=`
<li style="${item.status==1?'background-color:#fff2e8':''}">
<ul>
<li>${item.appstat}</li>
<li>${(function(){
switch(item.pri){
case "1":return "最高";
case "2":return "高";
case "3":return "中";
case "4":return "低";
case "5":return "最低";
}
})()}</li>
<li>${formatFileSize(item.up)}</li>
<li>${formatFileSize(item.down)}</li>
<li>${item.proto}</li>
<li>${item.sport}</li>
<li>${item.dport}</li>
<li>${item.daddr}</li>
<li>${item.wan}</li>
<li>${item.status==1?"未响应":"稳定"}</li>
</ul>
</li>`
})
if(html=='')html=`<li><div style="height:220px;display: flex;justify-content: center;align-items: center;color:#bfbfbf;flex-direction: column;">
<div style="font-size:30px;">☁</div><div>暂无数据</div>
</div>
</li>`
$("#listTableWrapper").append(html)
message('success', '刷新成功!')
ipListTableCss()
}
$(document).ready(function() {
//返回顶部按钮
// 绑定到某个元素(如按钮)的点击事件上
$('#back-to-top').click(function() {
// 使用animate()方法来平滑地滚动到页面顶部
$('body, html').animate({
scrollTop: 0
}, 500); // 500是动画的持续时间,以毫秒为单位
return false; // 阻止链接的默认行为(如果有的话)
});
//手动刷新
$(".auto-flush").val(0)
//初始隐藏组件
let hideEntryInp = sessionStorage.getItem('hideEntry')?JSON.parse(sessionStorage.getItem('hideEntry')):'';
if(Object.prototype.toString.call(hideEntryInp) === '[object Object]'){
const keys = Object.keys(hideEntryInp);
const values = Object.values(hideEntryInp);
$("#hideType").val(keys[0])
$('#hideInp').val(values[0]);
$('#isHide').val(hideEntryInp.isHide);
}else{
$('#hideInp').val('');
$('#isHide').val(1);
}
$("#mask").attr('tabindex', '0').focus()
//添加键盘事件
$("#mask").keydown(function(event) {
//console.log(event.keyCode)
// 检查是否按下了空格键
if ((event.key === ' ' || event.keyCode === 32)&&timerReload) {
message('', '已停止!')
//停止自动刷新
$("#StartStopBtn").text('开始')
clearInterval(timerReload)
isStart=false
// 阻止事件的默认行为
event.preventDefault();
return false; // 在jQuery中,返回false也会阻止事件冒泡
}else if(event.keyCode ===82){//R键
//立即刷新
$("#reloadBtn").click()
}else if(event.keyCode ===84){
//回到顶部
$('#back-to-top').click()
}else if(event.keyCode ===27){
$('#colseBtn').click()
}
});
});
//遮罩层关闭按钮
$("#colseBtn").click(function(){
$("#mask").css("display","none")
$('#hideInp').val('');
clearInterval(timerReload)
isStart=false
$("#refreshTimeInp").val('')
$("#StartStopBtn").text('开始')
})
// 点击连接数查看详情
{
setInterval(()=>{ $("#tblMain>tr>.conntrack").off('click'); },100)
setTimeout(()=>{ $(document).on("click","#tblMain>tr>td.conntrack",function(){ getIpList($(this).parent().find('.ip').attr("data")) }) })
if(0)$(document).on({mouseenter: function() { $(this).css({cursor:"pointer",color:"#26a3e9"});},
mouseleave: function() { $(this).css({color:"#505459"}) } }, '#tblMain>tr>td:first-child');
}
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// 流控设置
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if(0&&$(".sidebar_nav>li").eq(3).find("span").text()=="流控设置")$(".sidebar_nav>li").eq(3).click(()=>{
location.href = "/index.htm?PAGE=fluid&new=1"
})
if (location.search.indexOf("?PAGE=fluid&new=1") !== -1) {
$(".sidebar_nav>li:nth(3) a:nth(0)").css("color","#484848")
$(".sidebar_nav>li:nth(3) a:nth(0)").hover(function(){$(this).css("color","#1592d8")},function(){$(this).css("color","#484848")})
$(".back_center>div.box").html(`
<div id="intelligent_flow_control" style="width:100%;height:600px;padding:0 20px;">
<div class="border-b box-tit"><h4>智能流控</h4></div>
</div>`)
$("#intelligent_flow_control")
}
// 流量识别
if (isFlowIdentifi && location.search=="?PAGE=flow_identifi"){
//添加滑块开关
$("div.pdg20-LR>div.box-tit").append(`<div style="margin-top:-21px;float:right;">
<input type="checkbox" name="able" class="input_hide able" value="1" id="changeFlowIde">
<label class="slider-v3" for="changeFlowIde"></label>
</div>`)
$("body>div.right").css("overflow","visible")
$("div.pdg20-LR").css("position","relative")
$("div.pdg20-LR>div.box-tit>a")?.remove()
$("div.seitchH-radio").after(`
<div id="all_identifi" style="width:calc(100% + 2px);position:absolute;background:#fff;left:-1px;top:51px;padding:0 20px;box-sizing:border-box;border:1px solid #cdcdcd;border-top:none;">
<div class="H20"/>
<ul class="all_identifi" style="display:flex;padding-left:20px;">
<li><span>特征库识别:</span><div><input type="checkbox" name="property_able" class="input_hide property_able able" value="1" id="s10" checked="checked">
<label class="slider-v3" for="s10"></label></div></li>
<li><span>智能识别:</span><div><input type="checkbox" name="property_able" class="input_hide property_able able" value="1" id="s20" checked="checked">
<label class="slider-v3" for="s20"></label></div></li>
<li><span>智能云识别:</span><div><input type="checkbox" name="property_able" class="input_hide property_able able" value="1" id="s30" checked="checked">
<label class="slider-v3" for="s30"></label></div></li>
<li><span>客户端识别:</span><div><input type="checkbox" name="property_able" class="input_hide property_able able" value="1" id="s40" checked="checked">
<label class="slider-v3" for="s40"></label></div></li>
</ul>
<div class="H20"/><div class="H20"/>
<div class="save_identifi_btn" style="transition: all 0.2s linear 0s;color:#fff;display: inline-block;padding: 3px 15px;border: 1px solid #26a3e9;font-size: 12px;border-radius: 5px;
user-select: none;background-color:#26a3e9;margin:0 20px;cursor: pointer;">保存设置</div>
<div class="open_identifi_btn" style="transition: all 0.2s linear 0s;color:#666;display: inline-block;cursor: pointer;padding: 3px 15px;border: 1px solid #f0f0f0;font-size: 12px;border-radius: 5px;
user-select: none;background-color:#fff;">一键开启</div>
<div class="H20"/><div class="H20"/><div class="H20"/><div class="H20"/>
<div style="padding-bottom:10px;border-bottom:1px solid #e6e6e6;"><h4 style="margin:0;">自定义识别</h4></div>
<div class="H20"/><div style="display:flex;margin-bottom:10px;justify-content:end;">
<div class="delAll_identifi_btn" style="transition: all 0.2s linear 0s;color:#ff4d4f;display: inline-block;padding: 3px 15px;border: 1px solid #fff;font-size: 12px;border-radius: 5px;
user-select: none;background-color:#fff2f0;cursor: pointer;">删除全部</div>
<div class="add_identifi_btn" style="transition: all 0.2s linear 0s;color:#fff;display: inline-block;padding: 3px 15px;border: 1px solid #26a3e9;font-size: 12px;border-radius: 5px;
user-select: none;background-color:#26a3e9;margin:0 15px;cursor: pointer;">添加</div>
</div>
<div id="customize_identifi" style="width:100%;"></div>
<div class="H20"/><div class="H20"/>
</div>
`)
// CSS
{
$("ul.all_identifi>li").css({
display:"flex",
justifyContent:"space-between",
width:"170px",
marginRight:"70px",
})
//hover
$(".save_identifi_btn,.add_identifi_btn").hover(function () { $(this).css({backgroundColor:"#39ade6"}) }, function () { $(this).css({backgroundColor:"#26a3e9"}) });
$(".delAll_identifi_btn").hover(function () { $(this).css({color:"#ff7875"}) }, function () { $(this).css({color:"#ff4d4f"}) });
$(".open_identifi_btn").hover(function () { $(this).css({backgroundColor:"#f0f0f0"}) }, function () { $(this).css({backgroundColor:"#fff"}) });
$(document).on({mouseenter: function() { $(this).css({color:"#79baff"}) },
mouseleave: function() { $(this).css({color:"#26a3e9"}) } }, '.edit_customize_identifi');
$(document).on({mouseenter: function() { $(this).css({color:"#ff7875"}) },
mouseleave: function() { $(this).css({color:"#ff4d4f"}) } }, '.del_customize_identifi');
}
// 初始化识别状态
initIdentifiState()
// 滑块开关点击事件
let changeFlowIde = JSON.parse(localStorage.getItem('changeFlowIde'))!=null?JSON.parse(localStorage.getItem('changeFlowIde')):true;
$("#changeFlowIde")[0].checked = changeFlowIde
$("#all_identifi").css("z-index",changeFlowIde?"1":"-1")
$("#all_identifi").css("opacity",changeFlowIde?"1":"0")
changeFlowIde?$("ul.fluid>li:last-child").css("display","block"):''
$("#changeFlowIde").click(function(){
if($("#changeFlowIde")[0].checked){
$("ul.fluid>li:last-child").css("display","block")
initIdentifiState()
JSON.stringify(localStorage.setItem('changeFlowIde',true))
$("#all_identifi").css("z-index","1")
$("#all_identifi").css("opacity","1")
}else{
if($('div.menu>label input[type="radio"]:checked').val()!=='自定义识别')$("ul.fluid>li:last-child").css("display","none");
JSON.stringify(localStorage.setItem('changeFlowIde',false))
$("#all_identifi").css("z-index","-1")
$("#all_identifi").css("opacity","0")
}
})
$(".save_identifi_btn").click(()=>{
let saveState = 0
let failRecord = ''
$.get('/action/code_ident2.htm',{data:JSON.stringify({able:$("#s10").prop('checked')?'1':'0',var:$(".property_cont .var_tip").text(),})},(msg)=>{
if (msg.state == 1) { saveState++ }else{ failRecord += '(特征库识别)'; }
$.get('/action/auto_ident2.htm',{data:JSON.stringify({able:$("#s20").prop('checked')?'1':'0'})},(msg)=>{
if (msg.state == 1) { saveState++ }else{ failRecord += '(流量智能识别)'; }
$.get('/action/cloud_ident2.htm',{data:JSON.stringify({able:$("#s30").prop('checked')?'1':'0'})},(msg)=>{
if (msg.state == 1) { saveState++ }else{ failRecord += '(智能云识别)'; }
$.get('/action/client_ident_write.htm',{data:JSON.stringify({able:$("#s40").prop('checked')?'1':'0'})},(msg)=>{
if (msg.state == 1) { saveState++ }else{ failRecord += '(客户端识别)'; }
if(saveState==4) {
message('success','保存成功...',true)
setTimeout(()=>{ location.reload() },3000)
}
}, 'json');
}, 'json');
}, 'json');
}, 'json');
setTimeout(()=>{ if(saveState!==4) {message('warning',failRecord+'保存失败!')} },5000)
})
$(".open_identifi_btn").click(()=>{ $("#s10,#s20,#s30,#s40").prop('checked', true) })
$(".add_identifi_btn").click(()=>{
//$('#add_edit_mask').css("display","flex")
// 原版模态框
showKeyFilterForm()
})
$(".delAll_identifi_btn").click(()=>{
if(confirm("确认删除全部?")){
//删除全部
$.post('/action/protocol_diy_write.htm',{data : JSON.stringify([])},(msg)=>{ if (msg.state == 1){
message('success','删除成功...',true);
} }, 'json');
}
})
$(document).on('click','#customize_identifi span.edit_customize_identifi',(e)=>{
//console.log($(e.currentTarget).attr('data'))
//$('#add_edit_mask').css("display","flex")
// 原版模态框
editKeyFilter($(e.currentTarget).attr('data'))
//console.log()
})
$(document).on('click','#customize_identifi span.del_customize_identifi',(e)=>{
if(confirm("确认删除?")){
data["keyfilterpage"].splice($(e.currentTarget).attr('data'), 1)
$.post('/action/protocol_diy_write.htm',{data : JSON.stringify(data["keyfilterpage"])},(msg)=>{ if (msg.state == 1){
message('success','删除成功...',true);
} }, 'json');
}
})
// 初始化识别状态
function initIdentifiState(){
const columns = [
{
title: '状态',
dataIndex: 'able',
key: 'able',
},
{
title: '地址范围',
dataIndex: 'addrDomain',
key: 'addrDomain',
},
{
title: '协议',
dataIndex: 'proto',
key: 'proto',
},
{
title: '端口',
dataIndex: 'port',
key: 'port',
},
{
title: '匹配策略',
dataIndex: 'martch',
key: 'martch',
},
{
title: '关键信息',
dataIndex: 'keyInfo',
key: 'keyInfo',
},
{
title: '数据类型',
dataIndex: 'dataType',
key: 'dataType',
},
{
title: '备注',
dataIndex: 'note',
key: 'note',
},
{
title: '操作',
dataIndex: 'action',
key: 'action',
},
]
const dataSource = []
$.get('/action/code_ident.htm',(msg)=>{ $("#s10").prop("checked",msg.able==1?true:false); },'json');
$.get('/action/auto_ident.htm',(msg)=>{ $("#s20").prop("checked",msg.able==1?true:false); },'json');
$.get('/action/cloud_ident.htm',(msg)=>{ $("#s30").prop("checked",msg.able==1?true:false); },'json');
$.get('/action/client_ident_read.htm',(msg)=>{ $("#s40").prop("checked",msg.able==1?true:false); },'json');
$.get('/action/protocol_diy_read.htm',(msg)=>{
if(msg.length&&msg.length>0){
msg.forEach((item,index)=>{
dataSource.push({
key:index,
able: item.able=='1'?`启用`:"禁用",
addrDomain: item.sip+'-'+item.eip,
proto: item.proto,
port: item.sport+'-'+item.eport,
martch: martchConvert(item.martch),
keyInfo: item.key.length?(item.key[0]?(item.key.length>1?(item.key[0]+'...'):item.key[0]):'无'):'-',
dataType: dataTypeConvert(item.action),
note: item.note,
action: `<span class="edit_customize_identifi" data="${index}" style="margin-right:15px;color:#26a3e9;cursor:pointer;user-select:none;transition:all .2s linear;" title="点击编辑">编辑</span>
<span class="del_customize_identifi" data="${index}" style="color:#ff4d4f;cursor:pointer;user-select:none;transition:all .2s linear;" title="点击删除">删除</span>`,
})
})
}
table("#customize_identifi", dataSource, columns,false,{isSort:false,height:"40px"})
},'json');
function martchConvert(a){
if(a=='bin'){return '特征码'}else if(a=='long'){return '特征码长度'}else if(a=='ip'){return 'IP'}else if(a=='none'){return '无'}else{return '-'}
}
function dataTypeConvert(a){
if(a=='game'){return '游戏'}else if(a=='down'){return '网页下载'}else if(a=='http'){return '网页资源'}else if(a=='p2p'){return 'p2p下载'}else{return '-'}
}
}
}
// 优先级设置
if (location.search == "?PAGE=soft_pro") {
// 一键默认按钮
if(isSoftPro){
$("div.div-tab.fl.fc").append(`
<a class="fl soft_pro_default" style="
text-decoration: none;
transition: all .2s linear;
color:#666;
display:inline-block;
padding:3px 15px;
border:1px solid #f0f0f0;
font-size:12px;
border-radius: 5px;
user-select: none;" href="###">一键默认
<div class="bottom_line" style="transition: all .2s linear;margin-left:24px;width:0px;height:1px;background-color:#26a3e9;"></div>
</a>`)
//hover
$(".soft_pro_default").hover(function () {
$(this).css({backgroundColor:"#f0f0f0"})
//$(".bottom_line").css({width: "48px",marginLeft:"0px"})
}, function () {
$(this).css({backgroundColor:"#fff"})
//$(".bottom_line").css({width: "0px",marginLeft:"24px"})
});
$(".soft_pro_default").click(()=>{
$(".game").val('0');
$(".pat").val('0');
$(".http").val('0');
$(".im").val('0');
$(".soft").val('0');
$(".down").val('0');
$(".vio").val('0');
$(".unknow").val('0');
$(".p2p").val('0');
})
}
// 显示所有
if(1){
//添加滑块开关
$("div.pdg20-LR>div.box-tit").append(`<div style="margin-top:-21px;float:right;">
<input type="checkbox" class="input_hide" value="1" id="change_soft_pro">
<label class="slider-v3" for="change_soft_pro"></label>
</div>`)
// 滑块开关点击事件
let changeSoftPro = JSON.parse(localStorage.getItem('changeSoftPro'))!=null?JSON.parse(localStorage.getItem('changeSoftPro')):true;
$("#change_soft_pro")[0].checked = changeSoftPro
$(".pdg20-LR>ul.fluid>li:last-child").before(`
<li class="soft_pro_title" style="display:none;"><div style="padding-bottom:10px;border-bottom:1px solid #e6e6e6;margin-bottom:20px;"><h4 style="margin:0;">端口优先级</h4></div></li>`)
$(".pdg20-LR>ul.fluid>li.smart_cont tr:last-child>td").css("padding-bottom","80px")
if(changeSoftPro){
$(".soft_pro_title").css("display","block");
$(".pdg20-LR>ul.fluid>li").css("display","list-item")
$(".seitchH-radio+div.H20").css("display","none")
$(".seitchH-radio").css("display","none")
}
$("#change_soft_pro").click(function(){
if($("#change_soft_pro")[0].checked){
JSON.stringify(localStorage.setItem('changeSoftPro',true))
$(".seitchH-radio+div.H20").css("display","none")
$(".pdg20-LR>ul.fluid>li").css("display","list-item")
$(".soft_pro_title").css("display","block");
$(".seitchH-radio").css("display","none")
}else{
JSON.stringify(localStorage.setItem('changeSoftPro',false))
$(".seitchH-radio+div.H20").css("display","block");
$("ul.fluid>li:not(:first-child)").css("display","none");
$(".soft_pro_title").css("display","none");
$(".seitchH-radio").css("display","block")
if($('div.menu>label input[type="radio"]:checked').val()=='端口优先级'){
$('.radio:first-child').click()
}
}
})
}
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// 线路分流
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if(0&&$(".sidebar_nav>li").eq(4).find("span").text()=="线路分流")$(".sidebar_nav>li").eq(4).click(()=>{
location.href = "/index.htm?PAGE=software&new=1"
})
if (location.search.indexOf("?PAGE=software&new=1") !== -1) {
$(".sidebar_nav>li:nth(4) a:nth(0)").css("color","#484848")
$(".sidebar_nav>li:nth(4) a:nth(0)").hover(function(){$(this).css("color","#1592d8")},function(){$(this).css("color","#484848")})
$(".back_center>div.box").html(``)
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Ping检测
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if (location.search.indexOf("?PAGE=ping") !== -1) {
// 检测日志
if(isOnPingLog)checkLog()
function checkLog(){
let changeLog = JSON.parse(localStorage.getItem('changeLog'))!=null?JSON.parse(localStorage.getItem('changeLog')):true;
$("ul.detail-info>li").eq(3).append(`<div id="ping_check_log_wra" style="width:100%;margin:auto;display:block;">
<div style="display:flex;justify-content:space-between;align-items: center;">
<div style="display:flex;align-items: center;">
<select class="sel-nav sel_time" style="width:150px;margin-right:10px;">
<option value="0">所有时间</option>
<option value="3600">最近1小时</option>
<option value="43200">最近12小时</option>
<option value="86400">最近24小时</option>
</select>
<select class="sel-nav sel_line" style="width:150px;"></select>
</div>
<div>
<div id="ref_ping_log" style="${btnCss}">立即刷新</div>
<div id="del_ping_log" style="${btnCss}background-color:#ff4d4f;margin-right:10px;">删除</div>
</div>
</div>
<div class="H20 col"></div>
<div id="ping_check_log" style="width:100%;"></div>
</div>`)
$("#ping_check_log_wra").append(` <div id="back-to-top" style="
display:none;
position: fixed;
bottom: 80px;
right: 75px;
border-radius: 50%;
width: 40px;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 24px;
background-color: #fff;
color:#666;
cursor: pointer;
transition: all .2s linear;
font-weight: bold;
box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1);
user-select: none;
" title="回到顶部">↑</div>
</div>`)
//回到顶部按钮
$("#back-to-top").hover(function(){
// 鼠标移入时的处理逻辑
$(this).css("background-color","#f0f0f0")
}, function(){
// 鼠标移出时的处理逻辑
$(this).css("background-color","#fff")
});
$('#back-to-top').click(function() {
// 使用animate()方法来平滑地滚动到页面顶部
$('body, html').animate({
scrollTop: 0
}, 500); // 500是动画的持续时间,以毫秒为单位
return false; // 阻止链接的默认行为(如果有的话)
});
//监听滚动条
$(window).scroll(function() {
if ($(window).scrollTop() > 666) {
$("#back-to-top").css("display","block")
}else{
$("#back-to-top").css("display","none")
}
});
//获取线路并添加到下拉列表
$.get('/action/wan_line_name_show.htm',(res)=>{
let ele = '<option value="0">所有线路</option>'
if(res.length>0){
res.forEach(item=>{
if(item.id[0]!='3')ele+=`<option value="${item.id}">${item.name}</option>`
})
}
$(".sel_line").append(ele)
},'json')
//判断是否启用日志列表
if(changeLog){
$("ul.detail-info>li:nth-child(4)>table").css("display","none")
$("#ping_check_log").css("display","block")
}else{
$("ul.detail-info>li:nth-child(4)>table").css("display","table")
$("#ping_check_log_wra").css("display","none")
}
//添加滑块开关
$("div.pdg20-LR>div.fc").append(`<div id="changeLogBtn" style="margin-left: auto;display:none;">
<input type="checkbox" name="able" class="input_hide able" value="1" id="changeLog">
<label class="slider-v3" for="changeLog"></label>
</div>`)
$("div.pdg20-LR>div.fc>div.menu>label").click(()=>{
$("#changeLogBtn").css("display","none")
})
$("div.pdg20-LR>div.fc>div.menu>label").eq(3).off('click')
$("div.pdg20-LR>div.fc>div.menu>label").eq(3).click(()=>{
changeLog = JSON.parse(localStorage.getItem('changeLog'))!=null?JSON.parse(localStorage.getItem('changeLog')):true;
$("#changeLogBtn").css("display","block")
$("#changeLog")[0].checked = changeLog
})
//滑块开关点击事件
$("#changeLog").click(function(){
if($("#changeLog")[0].checked){
JSON.stringify(localStorage.setItem('changeLog',true))
$("ul.detail-info>li:nth-child(4)>table").css("display","none")
$("#ping_check_log_wra").css("display","block")
}else{
JSON.stringify(localStorage.setItem('changeLog',false))
$("ul.detail-info>li:nth-child(4)>table").css("display","table")
$("#ping_check_log_wra").css("display","none")
}
//console.log(localStorage.getItem('changeLog'))
})
//下拉列表选择事件
$(".sel_time,.sel_line").change(refPingLog)
//刷新按钮
$("#ref_ping_log").click(refPingLog)
function refPingLog(){
if($(".sel_line").val()=='0'&&$(".sel_time").val()=='0'){
getPingLog(true)
}else{
$.get('/action/get_basic_info.htm',function(msg){
let selTimeVal = 0
if($(".sel_time").val()!=0){
selTimeVal=msg.time-$(".sel_time").val()*1
}
//console.log(true,selTimeVal,$(".sel_line").val().toLowerCase())
getPingLog(true,selTimeVal,$(".sel_line").val().toLowerCase())
},'json')
}
}
//删除按钮
$("#del_ping_log").click(()=>{
if (confirm("确定要删除吗?")) {
$.get('/action/fwlog_ping_del.htm', {}, function(msg) {
if(msg.state == 1){
message("success","删除成功...",true);
getPingLog()
}else{
message("error","删除失败,请重试!");
}
}, 'json');
}
})
//按钮hover
$("#ref_ping_log").hover(function () {$(this).css("background-color", "#39ade6")
}, function () {$(this).css("background-color", "#26a3e9")
});
$("#del_ping_log").hover(function () {$(this).css("background-color", "#ff7875")
}, function () {$(this).css("background-color", "#ff4d4f")
});
$("div.pdg20-LR>div.fc").css({
display:'flex',
alignItems: 'center',
})
getPingLog()
function getPingLog(isMsg=false,timeFrame=false,wanLine=false){
const columns = [
{
title: '时间',
dataIndex: 'utime',
key: 'utime',
width:'200px'
},
{
title: '线路',
dataIndex: 'line',
key: 'line',
},
{
title: '域名/IP',
dataIndex: 'domain',
key: 'domain',
},
{
title: '发送(个包)',
dataIndex: 'sent',
key: 'sent',
},
{
title: '接收(个包)',
dataIndex: 'accept',
key: 'accept',
},
{
title: '最低延迟(ms)',
dataIndex: 'lowest',
key: 'lowest',
},
{
title: '最高延迟(ms)',
dataIndex: 'highest',
key: 'highest',
},
{
title: '平均延迟(ms)',
dataIndex: 'average',
key: 'average',
},
{
title: '丢包率(%)',
dataIndex: 'packetloss',
key: 'packetloss',
},
]
const dataSource = []
$.get('/action/fwlog_ping.htm',function(msg){
if(msg.length>0){
if(isMsg)message("success","刷新成功",)
//console.log(msg);
msg.forEach((item,index) => {
if(item.type=='0x7002'){
dataSource.push({
key: index,
utime: item.utime,
line: item.text.match(/(wan\d+|pptp\d+|L2TP\d+)/ig)?.[0],
domain: item.text.match(/PING ([^\s]+)/)?.[0].replace(/PING /g, ''),
sent: item.text.match(/发送(\d+(\.\d+)?)个包/g)?.[0].replace(/发送|个包/g, ''),
accept: item.text.match(/收到(\d+(\.\d+)?)个包/g)?.[0].replace(/收到|个包/g, ''),
lowest: item.text.match(/最低延迟(\d+(\.\d+)?)ms/g)?.[0].replace(/最低延迟|ms/g, ''),
highest: item.text.match(/最高延迟(\d+(\.\d+)?)ms/g)?.[0].replace(/最高延迟|ms/g, ''),
average: item.text.match(/,平均延迟(\d+(\.\d+)?)ms/g)?.[0].replace(/,平均延迟|ms/g, ''),
packetloss: item.text.match(/,丢包率为(\d+(\.\d+)?)%/g)?.[0].replace(/,丢包率为|%/g, ''),
})
}else{
dataSource.push({
key: index,
utime: item.utime,
line: item.text.match(/(wan\d+|pptp\d+|L2TP\d+)/ig)[0],
domain: item.text.replace(item.text.match(/(wan\d+|pptp\d+|L2TP\d+)/ig)[0], '').replace(/!/g, ''),
sent: '9999',
accept: '9999',
lowest: '9999',
highest: '9999',
average: '9999',
packetloss: '9999',
})
}
});
let dataS=dataSource.sort((a,b)=>b.utime-a.utime)
if(timeFrame&&timeFrame!=0)dataS=JSON.parse(JSON.stringify(dataS.filter(item => timeFrame<=item.utime)));
if(wanLine&&wanLine!=0)dataS=JSON.parse(JSON.stringify(dataS.filter(item => (item.line.indexOf(wanLine)!=-1))));
table("#ping_check_log", dataS, columns,false,{
unit:{sent:'个包',accept:'个包',lowest:'ms',highest:'ms',average:'ms',packetloss:'%',},
changeVal:{utime:reverse_time},isSort:true,
status:{packetloss:{0:(a)=>(a==0),1:(a)=>(a>0&&a<10),2:(a)=>(a>=10)}}
})
}else if(msg.length==0){
if(isMsg)message("warning","暂无数据!")
table("#ping_check_log", dataSource, columns,false,{isSort:true,})
}
},'json')
}
}
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//testNewfw
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if(isOnLogoTo){
if (window.location.host.indexOf(':') > 0 && !isPrivateIpAddress(window.location.hostname) || isDev == 1) $(".back_logo").css({ "cursor": "pointer" });
// logo点击事件
$(".back_logo").click(function () {
if (window.location.host.indexOf(':') > 0 && !isPrivateIpAddress(window.location.hostname) || isDev == 1) {
let str = ''
if (window.location.host.split(':').length == 1) {
str = window.btoa(window.location.host + ':80' + '*@*' + ($.cookie("NAME") || ''));
} else {
str = window.btoa(window.location.host + '*@*' + ($.cookie("NAME") || ''));
}
let $temp = $('<input>');
$('body').append($temp);
$temp.val(str).select();
document.execCommand('copy');
$temp.remove();
$(".back_logo").html(`
<div style="
width:100%;
height:100%;
display: flex;
justify-content: center;
align-items: center;
color:#666;
font-size:20px;
background-color:rgba(255, 255, 255,.8);
user-select: none;
">OK</div>
`);
setTimeout(() => {
if (isDev == 1) {
window.open("http://localhost:5173/login");
} else {
window.open("http://47.108.191.179:8887/login");
}
$(".back_logo").html("");
}, logoToTime)
}
});
}
// ip私有地址正则
function isPrivateIpAddress(ip) {
// CIDR格式的私有IP地址段
var privateRegex = /^(?:(?:10|172\.(?:[1-9]|[1][0-9])|192\.168)\.)/;
return privateRegex.test(ip);
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
}
//流量转换
function formatFileSize(size) {
const scale = 1024;
if (size == "") {
return "0B";
} else if (size < scale) {
return `${size}.00B`;
} else if (size < scale * scale) {
return `${(size / scale).toFixed(2)}KB`;
} else if (size < scale * scale * scale) {
return `${(size / (scale * scale)).toFixed(2)}MB`;
} else if (size < scale * scale * scale * scale||size >= scale * scale * scale * scale) {
return `${(size / (scale * scale * scale)).toFixed(2)}GB`;
} else {
return `${size}`;
}
}
//时间转换
function reverse_time(time){
let unixTimestamp = new Date(time*1000);
let Y = unixTimestamp.getFullYear() + '-';
let M = (unixTimestamp.getMonth()+1 < 10 ? '0'+(unixTimestamp.getMonth()+1) : unixTimestamp.getMonth()+1) + '-';
let D = unixTimestamp.getDate() + ' ';
let h = ((unixTimestamp.getHours()+'').length==1?'0'+unixTimestamp.getHours() :unixTimestamp.getHours())+ ':';
let m = ((unixTimestamp.getMinutes()+'').length==1?'0'+unixTimestamp.getMinutes() :unixTimestamp.getMinutes())+ ':';
let s = (unixTimestamp.getSeconds()+'').length==1?'0'+unixTimestamp.getSeconds() :unixTimestamp.getSeconds();
return Y+M+D+h+m+s;
}
//消息提示
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/**
* 消息提示
* @param {a} a 消息类型,例如:'default','success','warning','error'
* @param {b} b 消息内容,例如:'这是一条消息提示'
* @example
* message('success', '恭喜你,这是一条成功消息') //@example示例代码
* @return {Function} 返回数据类型
*/
_addMessageHTML();
let timerMessage = null;
let topPX = 0;
let arrMes = [];
/**
* 消息提示
* @param {a} a 消息类型,例如:'default','success','warning','error'
* @param {b} b 消息内容,例如:'这是一条消息提示'
* @param {c} c 消息结束后是否刷新,例如:true
* @param {d} d 刷新时间,例如:3000
* @example
* message('success', '恭喜你,这是一条成功消息') //@example示例代码
* @return {Function} 返回数据类型
*/
function message(a, b,c=false,d=0) {
clearTimeout(timerMessage)
switch (a) {
case 'success': _success(); break;
case 'warning': _warning(); break;
case 'error': _error(); break;
default: _default();
}
$('#pmt_text').text(b)
$('#prompt').css('opacity', 1)
$('#prompt').css('top', '20px')
timerMessage = setTimeout(() => {
_closeMessage();
if(c)setTimeout(()=>{ location.reload() },d)
}, 3000)
function _default() {
$('#prompt').css('color', '#909399')
$('#prompt').css('border-color', '#ebeef5')
$('#prompt').css('background-color', '#edf2fc')
$("#pmt_state").text('i');
$("#pmt_state").css("background-color", "#909399")
}
function _success() {
$('#prompt').css('color', '#67c23a')
$('#prompt').css('border-color', '#e1f3d8')
$('#prompt').css('background-color', '#f0f9eb')
$("#pmt_state").text('√');
$("#pmt_state").css("background-color", "#67c23a")
}
function _warning() {
$('#prompt').css('color', '#e6a23c')
$('#prompt').css('border-color', '#faecd8')
$('#prompt').css('background-color', '#fdf6ec')
$("#pmt_state").text('!');
$("#pmt_state").css("background-color", "#e6a23c")
}
function _error() {
$('#prompt').css('color', '#f56c6c')
$('#prompt').css('border-color', '#fde2e2')
$('#prompt').css('background-color', '#fef0f0')
$("#pmt_state").text('×');
$("#pmt_state").css("background-color", "#f56c6c")
}
}
//关闭消息提示
function _closeMessage() {
topPX -= 48;
clearTimeout(timerMessage)
$('#prompt').css('opacity', 0)
$('#prompt').css('top', '-48px')
}
//添加消息提示元素
function _addMessageHTML() {
const promptCSS = `
position: fixed;
background-color: #edf2fc;
border-color: #ebeef5;
color: #909399;
/* font-size: 12px; */
width: 380px;
height: 48px;
top: -48px;
left: 50%;
transform: translateX(-50%);
border: 1px solid #ebeef5;
border-radius: 3px;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 18px;
user-select: none;
opacity: 0;
transition: all .2s linear;
z-index: 99999;
`
const pmt_stateCSS = `
display: inline-block;
font-size: 12px;
font-weight: bold;
width: 16px;
height: 16px;
line-height: 16px;
border-radius: 50%;
text-align: center;
background-color: #909399;
color: #edf2fc;
margin-right: 10px;
`
const pmt_clearCSS = `
font-size: 22px;
color: #c4c5cc;
cursor: pointer;
transition: all .1s linear;
`
$('body').append(`
<div id="prompt" style="${promptCSS}">
<div id="pmt">
<span id="pmt_state" style="${pmt_stateCSS}">i</span>
<span id="pmt_text" style="font-size: 14px;">这是一条消息提示</span>
</div>
<div id="pmt_clear" style="${pmt_clearCSS}">×</div>
</div>
`)
}
//关闭消息提示按钮
$("#pmt_clear").click(() => {
_closeMessage()
})
//表格
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/**
* 表格
* @param {a} a DOM,添加到DOM里,例如:'#div','.div'
* @param {b} b 列表数据,例如:[{key: '1',name: '张三',age: 18,address: '翻斗大街',}]
* @param {c} c 列表头,例如:[{title: '姓名',dataIndex: 'name',key: 'name',},{title: '年龄',dataIndex: 'age',key: 'age',},{title: '住址',dataIndex: 'address',key: 'address',}]
* @param {d} d false
* @param {e} e 其他选项,unit(单位)、changeVal(值转换)、status(状态背景色),例如:
* @example
* table("#ping_check_log", dataSource, columns,false,
{
unit:{sent:'个包',accept:'个包',lowest:'ms',highest:'ms',average:'ms',packetloss:'%',},
changeVal:{utime:reverse_time},
status:{packetloss:{0:(a)=>(a==0),1:(a)=>(a>0&&a<10),2:(a)=>(a>10)}}
}) //@example示例代码
* @return {Function} 返回数据类型
*/
function table(DOM, d, c, isCall = false, o) {
o={
unit:o.unit?o.unit:{},
changeVal:o.changeVal?o.changeVal:{},
status:o.status?o.status:{},
isSort:o.isSort?o.isSort:false,
height:o.height?o.height:'30px',
}
!isCall && sessionStorage.setItem('originalD', JSON.stringify(d));
let sort;//排序
if(o.isSort){if(!isCall){
sort={ state: 0, type: '' };
}else{
sort = JSON.parse(sessionStorage.getItem('sort'))
}}
//sort = JSON.parse(sessionStorage.getItem('sort')) || { state: 0, type: '' };//排序
if(o.isSort)switch (sort.state) {
case 1: d.sort(function (a, b) { return a[sort.type] - b[sort.type] }); break;
case 2: d.sort(function (a, b) { return b[sort.type] - a[sort.type] }); break;
default: d = JSON.parse(sessionStorage.getItem('originalD')) || d;
//console.log(JSON.parse(sessionStorage.getItem('originalD')));
}
//if(!isCall)console.log(d,sort.state,sort.type)
const _tableCSS = `width:100%;height:calc(100% - 30px);min-height:240px;border:1px solid #f0f0f0;
border-radius: 0 0 10px 10px;
padding-bottom:10px;
overflow: auto;
box-sizing: border-box;
font-size: 14px;
color:#505459;
margin-top:${o.height};
background-color:#fff;`
let html = `<div style="width:100%;min-width:800px;height:100%;position:relative;overflow:hidden;border-radius:10px">
<ul id="listTableWrapper" style="${_tableCSS}">
<li style="width:100%;position:absolute;top:0;left:0;overflow:hidden;">
<ul class="listTableHead" style="width:100%;height:100%;cursor: pointer;">
${(() => {
let el = '';
for (let i = 0; i < c.length; i++) {
el += `<li data-key="${c[i].key}" data-type="${c[i].dataIndex}">${c[i].title}</li>`;
}
return el
})()}
</ul></li>
${(() => {
let el = '';
if(d.length!=0){
for (let i = 0; i < d.length; i++) {
el += `<li><ul>
${(() => {
let ele = '';
for (let j = 0; j < c.length; j++) {
ele += `<li data-key="${c[j].key}">${(()=>{
let temp
if(c[j].key&&Object.keys(o.changeVal).length>0&&o.changeVal[c[j].key]){
temp = [c[j].key]?(o.changeVal[c[j].key]?o.changeVal[c[j].key](d[i][c[j].key]):''):d[i][c[j].key]
}else{
temp = d[i][c[j].key]
}
return (temp==9999)?'-':(temp+(o.unit[c[j].key]?o.unit[c[j].key]:''))
})()}</li>`;
}
return ele
}
)()}
</ul></li>`;
}
}else{
el = `<li><div style="height:220px;display: flex;justify-content: center;align-items: center;color:#bfbfbf;flex-direction: column;">
<div style="font-size:30px;">☁</div><div>暂无数据</div>
</div>
</li>`
}
return el
})()}
</ul></div>`
$(DOM).html(html)
//添加排序元素
if(o.isSort)$(".listTableHead>li").append(`
<div style="display:flex;flex-direction: column;margin-left:5px;">
<div style="width: 0;height: 0;
border-left: 4px solid transparent;
border-right: 4px solid transparent;
border-bottom: 5px solid #b1b1b1;"></div>
<div style="width: 0;height: 0;margin-top:3px;
border-top: 5px solid #b1b1b1;
border-left: 4px solid transparent;
border-right: 4px solid transparent;"></div>
</div>
`)
init()
//添加样式
function addTableCss() {
$(".listTableHead>li").css({
cursor: o.isSort?"pointer":"auto",
userSelect: "none",
transition: "all .2s linear",
})
$("#listTableWrapper>li").css({
height:o.height
})
$("#listTableWrapper>li>ul").css({
display: "flex"
})
$("#listTableWrapper>li>ul").eq(0).children('li').css({
backgroundColor: "#fafafa",
fontWeight: "bold"
})
$("#listTableWrapper>li>ul").css({
display: "flex",
height: "100%",
})
let allWidthPe=0,allWidthPx=0,allLength=0;
c.forEach(item=>{
if(item.width){
++allLength;
if(item.width.indexOf('%')!=-1){
allWidthPe+=item.width.replace('%','')*1
}else{
allWidthPx+=item.width.replace('px','')*1
}
}
})
//console.log((100-allWidthPe)/(c.length-allLength) + '%', allWidthPx+'px',allWidthPe,allWidthPx,allLength)
$("#listTableWrapper>li>ul>li").css({
width: `calc(${(100-allWidthPe)/(c.length-allLength) + '%'} - ${allWidthPx+'px'}`,
width:100/c.length+ '%',
//width:(100-allWidthPe)/(c.length-allLength) + '%' - allWidthPx+'px',
width:'12.5%',
//width:`calc(100% - ${allWidthPx+'px'})/(c.length-allLength) + '%'`,
height: "100%",
display: "flex",
justifyContent: "center",
alignItems: "center",
borderBottom: "1px solid #f0f0f0",
whiteSpace: "nowrap",
})
//$("#listTableWrapper>li>ul>li:nth-child(1)").css({
//width:'200px',
//backgroundColor: "#bfa",
//})
//自定义列宽
c.forEach((item,index)=>{
if(item.width){
$(`#listTableWrapper>li>ul>li:nth-child(${index+1})`).css({
width:'200px',
})
}
})
$("#listTableWrapper>li:gt(0)>ul").css({
transition: "all .2s linear"
})
}
//自定义列宽
function customColW(k,w){}
// hover-------------------
function hoverMove() {
//列表头部移入移出
if(o.isSort)$(".listTableHead>li").hover(function () {
// 鼠标移入时的处理逻辑
$(this).css("background-color", "#efefef")
}, function () {
// 鼠标移出时的处理逻辑
$(this).css("background-color", "#fafafa")
});
//列表详情移入移出
//除第一个li其他选中
$("#listTableWrapper>li:gt(0)>ul").hover(function () {
// 鼠标移入时的处理逻辑
if ($(this).children().last().text() !== "稳定")
$(this).css("background-color", "#fafafa")
}, function () {
// 鼠标移出时的处理逻辑
if ($(this).children().last().text() !== "稳定")
$(this).css("background-color", "#fff")
});
//关闭hover并添加列表背景色
d.forEach((item,index)=>{
for(let key in o.status){
if (item.hasOwnProperty(key)) {
$.each(o.status[key], function(k, vf) {
switch(k){
case '1':if(vf(item[key])){
$(`#listTableWrapper>li:nth-child(${index+2})>ul`).off('mouseenter mouseleave');
$(`#listTableWrapper>li:nth-child(${index+2})>ul`).css({
backgroundColor: "#fff2e8",
});};break;
case '2':if(vf(item[key])){
$(`#listTableWrapper>li:nth-child(${index+2})>ul`).off('mouseenter mouseleave');
$(`#listTableWrapper>li:nth-child(${index+2})>ul`).css({
backgroundColor: "#ffc2c0",
});};break;
}
});
}
}
//$(`#listTableWrapper>li:nth-child(${index+1})>ul`)
})
}
//排序点击事件
if(o.isSort)$('.listTableHead>li').off('click.sortEvent')
if(o.isSort)$('.listTableHead>li').on('click', sortEvent);
function sortEvent() {
if (sort.type == this.dataset.type) {
if (sort.state < 2) {
sort.state += 1
} else {
sort.state = 0
}
} else {
sort.state = 1;
sort.type = this.dataset.type;
}
switch (sort.state) {
case 1: d.sort(function (a, b) { return a[sort.type] - b[sort.type] }); break;
case 2: d.sort(function (a, b) { return b[sort.type] - a[sort.type] }); break;
}
sessionStorage.setItem('sort', JSON.stringify({ state: sort.state, type: sort.type }))
changeSortCSS();
table(DOM, d, c, true, o)
}
// 切换排序样式
function changeSortCSS() {
$(".listTableHead>li>div").each(function () {
$(this).children().eq(0).css("border-bottom-color", "#b1b1b1");
$(this).children().eq(1).css("border-top-color", "#b1b1b1");
})
if (sort.state != 0) {
$(".listTableHead>li").each(function () {
if ($(this).attr("data-type") == sort.type) {
switch (sort.state) {
case 1: $(this).children().children().eq(0).css("border-bottom-color", "#1677ff");
$(this).children().children().eq(1).css("border-top-color", "#b1b1b1"); break;
case 2: $(this).children().children().eq(0).css("border-bottom-color", "#b1b1b1");
$(this).children().children().eq(1).css("border-top-color", "#1677ff"); break;
}
}
})
}
}
// 初始化
function init() {
addTableCss();//添加样式
hoverMove();//添加hover事件
if(o.isSort)changeSortCSS();//排序样式
}
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//检查版本
function checkVersion(curVer,checkTime){
const curVerArr = curVer.split('.')
//检查更新
try{
setTimeout(()=>{
$.get('http://47.108.191.179:8888/checkver',{status:'ok'},(res)=>{
if(res.version){
let isCurNewVer = true;
let newVerArr = res.version.split('.');
for(let i=0;i<newVerArr.length;i++){
if(newVerArr[i]>curVerArr[i]){
isCurNewVer = false;
break;
}
}
if(!isCurNewVer){
message('','检测到更新,跳转中...')
setTimeout(()=>{
location.href=res.updateAddress||"https://update.gf.qytechs.cn/scripts/490316/fw.user.js";
},3000)
}else{
console.log('fw脚本目前是最新版本!')
}
}else{
console.log(res)
}
},"json")
},checkTime)
}catch(e){
console.log('fw脚本检查更新失败!'+e)
}
}
})();