diff --git a/web/public/js/components.js b/web/public/js/components.js index 5148a448..2c351a5d 100644 --- a/web/public/js/components.js +++ b/web/public/js/components.js @@ -1,4 +1,4 @@ -Vue.component("traffic-map-box",{props:["v-stats","v-is-attack"],mounted:function(){this.render()},data:function(){let i=0;var e=this.vIsAttack,t=(this.vStats.forEach(function(e){var t=parseFloat(e.percent);t>i&&(i=t),e.formattedCountRequests=teaweb.formatCount(e.countRequests)+"次",e.formattedCountAttackRequests=teaweb.formatCount(e.countAttackRequests)+"次"}),i<100&&(i*=1.2),window.innerWidth<512);return{isAttack:e,stats:this.vStats,chart:null,minOpacity:.2,maxPercent:i,selectedCountryName:"",screenIsNarrow:t}},methods:{render:function(){this.chart=teaweb.initChart(document.getElementById("traffic-map-box"));let s=this;this.chart.setOption({backgroundColor:"white",grid:{top:0,bottom:0,left:0,right:0},roam:!1,tooltip:{trigger:"item"},series:[{type:"map",map:"world",zoom:1.3,selectedMode:!1,itemStyle:{areaColor:"#E9F0F9",borderColor:"#DDD"},label:{show:!1,fontSize:"10px",color:"#fff",backgroundColor:"#8B9BD3",padding:[2,2,2,2]},emphasis:{itemStyle:{areaColor:"#8B9BD3",opacity:1},label:{show:!0,fontSize:"10px",color:"#fff",backgroundColor:"#8B9BD3",padding:[2,2,2,2]}},tooltip:{formatter:function(e){let t=e.name,i=null;return s.stats.forEach(function(e){e.name==t&&(i=e)}),null!=i?t+"
流量:"+i.formattedBytes+"
流量占比:"+i.percent+"%
请求数:"+i.formattedCountRequests+"
攻击数:"+i.formattedCountAttackRequests:t}},data:this.stats.map(function(e){let t=parseFloat(e.percent)/s.maxPercent,i=3*(t=t +Vue.component("traffic-map-box",{props:["v-stats","v-is-attack"],mounted:function(){this.render()},data:function(){let i=0;var e=this.vIsAttack,t=(this.vStats.forEach(function(e){var t=parseFloat(e.percent);t>i&&(i=t),e.formattedCountRequests=teaweb.formatCount(e.countRequests)+"次",e.formattedCountAttackRequests=teaweb.formatCount(e.countAttackRequests)+"次"}),i<100&&(i*=1.2),window.innerWidth<512);return{isAttack:e,stats:this.vStats,chart:null,minOpacity:.2,maxPercent:i,selectedCountryName:"",screenIsNarrow:t}},methods:{render:function(){if(this.$el.offsetWidth<300){let e=this;void setTimeout(function(){e.render()},100)}else{this.chart=teaweb.initChart(document.getElementById("traffic-map-box"));let s=this;this.chart.setOption({backgroundColor:"white",grid:{top:0,bottom:0,left:0,right:0},roam:!1,tooltip:{trigger:"item"},series:[{type:"map",map:"world",zoom:1.3,selectedMode:!1,itemStyle:{areaColor:"#E9F0F9",borderColor:"#DDD"},label:{show:!1,fontSize:"10px",color:"#fff",backgroundColor:"#8B9BD3",padding:[2,2,2,2]},emphasis:{itemStyle:{areaColor:"#8B9BD3",opacity:1},label:{show:!0,fontSize:"10px",color:"#fff",backgroundColor:"#8B9BD3",padding:[2,2,2,2]}},tooltip:{formatter:function(e){let t=e.name,i=null;return s.stats.forEach(function(e){e.name==t&&(i=e)}),null!=i?t+"
流量:"+i.formattedBytes+"
流量占比:"+i.percent+"%
请求数:"+i.formattedCountRequests+"
攻击数:"+i.formattedCountAttackRequests:t}},data:this.stats.map(function(e){let t=parseFloat(e.percent)/s.maxPercent,i=3*(t=t @@ -298,7 +298,7 @@ Vue.component("traffic-map-box",{props:["v-stats","v-is-attack"],mounted:functio
- {{message.body}} +
{{message.body}}
@@ -1751,7 +1751,7 @@ Vue.component("traffic-map-box",{props:["v-stats","v-is-attack"],mounted:functio    
-`}),Vue.component("http-host-redirect-box",{props:["v-redirects"],mounted:function(){let n=this;sortTable(function(e){let i=[];e.forEach(function(t){n.redirects.forEach(function(e){e.id==t&&i.push(e)})}),n.updateRedirects(i)})},data:function(){let e=this.vRedirects,t=(null==e&&(e=[]),0);return e.forEach(function(e){t++,e.id=t}),{redirects:e,statusOptions:[{code:301,text:"Moved Permanently"},{code:308,text:"Permanent Redirect"},{code:302,text:"Found"},{code:303,text:"See Other"},{code:307,text:"Temporary Redirect"}],id:t}},methods:{add:function(){let t=this;window.UPDATING_REDIRECT=null,teaweb.popup("/servers/server/settings/redirects/createPopup",{width:"50em",height:"30em",callback:function(e){t.id++,e.data.redirect.id=t.id,t.redirects.push(e.data.redirect),t.change()}})},update:function(t,i){let n=this;window.UPDATING_REDIRECT=i,teaweb.popup("/servers/server/settings/redirects/createPopup",{width:"50em",height:"30em",callback:function(e){e.data.redirect.id=i.id,Vue.set(n.redirects,t,e.data.redirect),n.change()}})},remove:function(e){let t=this;teaweb.confirm("确定要删除这条跳转规则吗?",function(){t.redirects.$remove(e),t.change()})},change:function(){let e=this;setTimeout(function(){e.$emit("change",e.redirects)},100)},updateRedirects:function(e){this.redirects=e,this.change()}},template:`
+
`}),Vue.component("http-host-redirect-box",{props:["v-redirects"],mounted:function(){let n=this;sortTable(function(e){let i=[];e.forEach(function(t){n.redirects.forEach(function(e){e.id==t&&i.push(e)})}),n.updateRedirects(i)})},data:function(){let e=this.vRedirects,t=(null==e&&(e=[]),0);return e.forEach(function(e){t++,e.id=t}),{redirects:e,statusOptions:[{code:301,text:"Moved Permanently"},{code:308,text:"Permanent Redirect"},{code:302,text:"Found"},{code:303,text:"See Other"},{code:307,text:"Temporary Redirect"}],id:t}},methods:{add:function(){let t=this;window.UPDATING_REDIRECT=null,teaweb.popup("/servers/server/settings/redirects/createPopup",{width:"50em",height:"36em",callback:function(e){t.id++,e.data.redirect.id=t.id,t.redirects.push(e.data.redirect),t.change()}})},update:function(t,i){let n=this;window.UPDATING_REDIRECT=i,teaweb.popup("/servers/server/settings/redirects/createPopup",{width:"50em",height:"36em",callback:function(e){e.data.redirect.id=i.id,Vue.set(n.redirects,t,e.data.redirect),n.change()}})},remove:function(e){let t=this;teaweb.confirm("确定要删除这条跳转规则吗?",function(){t.redirects.$remove(e),t.change()})},change:function(){let e=this;setTimeout(function(){e.$emit("change",e.redirects)},100)},updateRedirects:function(e){this.redirects=e,this.change()}},template:`
@@ -1784,6 +1784,8 @@ Vue.component("traffic-map-box",{props:["v-stats","v-is-attack"],mounted:functio 匹配前缀 正则匹配 精准匹配 + 排除:{{domain}} + 仅限:{{domain}}
@@ -3586,7 +3588,7 @@ example2.com -
`}),Vue.component("http-pages-and-shutdown-box",{props:["v-pages","v-shutdown-config","v-is-location"],data:function(){let e=[],t=(null!=this.vPages&&(e=this.vPages),{isPrior:!1,isOn:!1,bodyType:"html",url:"",body:"",status:0}),i=(null!=this.vShutdownConfig&&(null==this.vShutdownConfig.body&&(this.vShutdownConfig.body=""),null==this.vShutdownConfig.bodyType&&(this.vShutdownConfig.bodyType="html"),t=this.vShutdownConfig),"");return 0 +`}),Vue.component("http-pages-and-shutdown-box",{props:["v-pages","v-shutdown-config","v-is-location"],data:function(){let e=[],t=(null!=this.vPages&&(e=this.vPages),{isPrior:!1,isOn:!1,bodyType:"html",url:"",body:"",status:0}),i=(null!=this.vShutdownConfig&&(null==this.vShutdownConfig.body&&(this.vShutdownConfig.body=""),null==this.vShutdownConfig.bodyType&&(this.vShutdownConfig.bodyType="html"),t=this.vShutdownConfig),"");return 0 升级中 @@ -3604,78 +3606,138 @@ example2.com
Request ID: \${requestId}
-`}},template:`
+`},notifyChange:function(){let e=this.$el.parentNode;for(;;){if(null==e)break;if("FORM"==e.tagName)break;e=e.parentNode}null!=e&&setTimeout(function(){Tea.runActionOn(e)},100)}},template:`
- - - - + + + + + +
自定义页面 -
-
- {{page.status}} -> {{page.url}}[HTML内容] +

自定义页面

+ +

根据响应状态码返回一些自定义页面,比如404,500等错误页面。

+ +
+ + + + + + + + + + + + + + - - - - - -
响应状态码页面类型新状态码例外URL限制URL操作
+ + {{page.status[0]}} + {{page.status}} + + + + +
+ {{page.url}} +
+ 读取URL +
-
- -
- -
-

根据响应状态码返回一些自定义页面,比如404,500等错误页面。

-
临时关闭页面 -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
临时关闭网站 -
- - -
-

选中后,表示临时关闭当前网站,并显示自定义内容。

-
显示内容类型 * - -
显示页面URL * - -

将从此URL中读取内容。

-
显示页面HTML * - -

[使用模板]。填写页面的HTML内容,支持请求变量。

-
状态码
-

开启临时关闭页面时,所有请求都会直接显示此页面。可用于临时升级网站或者禁止用户访问某个网页。

-
-
+
+ {{page.url}} +
+ 跳转URL + {{page.newStatus}} +
+
+
+ [HTML内容] +
+ {{page.newStatus}} +
+
+
+ {{page.newStatus}} + 保持 + +
+ {{urlPattern.pattern}} +
+ - +
+
+ {{urlPattern.pattern}} +
+ - +
+ 修改   + 删除 +
+
+
+ +
+ +

临时关闭页面

+

开启临时关闭页面时,所有请求都会直接显示此页面。可用于临时升级网站或者禁止用户访问某个网页。

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
启用临时关闭网站 +
+ + +
+

选中后,表示临时关闭当前网站,并显示自定义内容。

+
显示内容类型 * + +
显示页面URL * + +

将从此URL中读取内容。

+
跳转到URL * + +

将会跳转到此URL。

+
显示页面HTML * + +

[使用模板]。填写页面的HTML内容,支持请求变量。

+
状态码
+
`}),Vue.component("http-compression-config-box",{props:["v-compression-config","v-is-location","v-is-group"],mounted:function(){let e=this;sortLoad(function(){e.initSortableTypes()})},data:function(){let t=this.vCompressionConfig,e=(null==(t=null==t?{isPrior:!1,isOn:!1,useDefaultTypes:!0,types:["brotli","gzip","zstd","deflate"],level:5,decompressData:!1,gzipRef:null,deflateRef:null,brotliRef:null,minLength:{count:1,unit:"kb"},maxLength:{count:32,unit:"mb"},mimeTypes:["text/*","application/javascript","application/json","application/atom+xml","application/rss+xml","application/xhtml+xml","font/*","image/svg+xml"],extensions:[".js",".json",".html",".htm",".xml",".css",".woff2",".txt"],exceptExtensions:[".apk",".ipa"],conds:null,enablePartialContent:!1}:t).types&&(t.types=[]),null==t.mimeTypes&&(t.mimeTypes=[]),null==t.extensions&&(t.extensions=[]),[{name:"Gzip",code:"gzip",isOn:!0},{name:"Deflate",code:"deflate",isOn:!0},{name:"Brotli",code:"brotli",isOn:!0},{name:"ZSTD",code:"zstd",isOn:!0}]),i=[];return t.types.forEach(function(t){e.forEach(function(e){t==e.code&&(e.isOn=!0,i.push(e))})}),e.forEach(function(e){t.types.$contains(e.code)||(e.isOn=!1,i.push(e))}),{config:t,moreOptionsVisible:!1,allTypes:i}},watch:{"config.level":function(e){let t=parseInt(e);isNaN(t)||t<1?t=1:10 @@ -5455,25 +5517,77 @@ example2.com
-`}),Vue.component("http-pages-box",{props:["v-pages"],data:function(){let e=[];return{pages:e=null!=this.vPages?this.vPages:e}},methods:{addPage:function(){let t=this;teaweb.popup("/servers/server/settings/pages/createPopup",{height:"26em",callback:function(e){t.pages.push(e.data.page)}})},updatePage:function(t,e){let i=this;teaweb.popup("/servers/server/settings/pages/updatePopup?pageId="+e,{height:"26em",callback:function(e){Vue.set(i.pages,t,e.data.page)}})},removePage:function(e){let t=this;teaweb.confirm("确定要移除此页面吗?",function(){t.pages.$remove(e)})}},template:`
+
`}),Vue.component("http-pages-box",{props:["v-pages"],data:function(){let e=[];return{pages:e=null!=this.vPages?this.vPages:e}},methods:{addPage:function(){let t=this;teaweb.popup("/servers/server/settings/pages/createPopup",{height:"26em",callback:function(e){t.pages.push(e.data.page),t.notifyChange()}})},updatePage:function(t,e){let i=this;teaweb.popup("/servers/server/settings/pages/updatePopup?pageId="+e,{height:"26em",callback:function(e){Vue.set(i.pages,t,e.data.page),i.notifyChange()}})},removePage:function(e){let t=this;teaweb.confirm("确定要移除此页面吗?",function(){t.pages.$remove(e),t.notifyChange()})},notifyChange:function(){let e=this.$el.parentNode;for(;;){if(null==e)break;if("FORM"==e.tagName)break;e=e.parentNode}null!=e&&setTimeout(function(){Tea.runActionOn(e)},100)}},template:`
- - - - + + + + + +
自定义页面 -
-
- {{page.status}} -> {{page.url}}[HTML内容] + +
+ + + + + + + + + + + + + + - -
响应状态码页面类型新状态码例外URL限制URL操作
+ + {{page.status[0]}} + {{page.status}} + + + + +
+ {{page.url}} +
+ 读取URL +
-
- -
- -
-

根据响应状态码返回一些自定义页面,比如404,500等错误页面。

-
+
+ {{page.url}} +
+ 跳转URL + {{page.newStatus}} +
+
+
+ [HTML内容] +
+ {{page.newStatus}} +
+
+
+ {{page.newStatus}} + 保持 + +
+ {{urlPattern.pattern}} +
+ - +
+
+ {{urlPattern.pattern}} +
+ - +
+ 修改   + 删除 +
+
+
+ +
`}),Vue.component("firewall-syn-flood-config-box",{props:["v-syn-flood-config"],data:function(){let e=this.vSynFloodConfig;return{config:e=null==e?{isOn:!1,minAttempts:10,timeoutSeconds:600,ignoreLocal:!0}:e,isEditing:!1,minAttempts:e.minAttempts,timeoutSeconds:e.timeoutSeconds}},methods:{edit:function(){this.isEditing=!this.isEditing}},watch:{minAttempts:function(e){let t=parseInt(e);(t=isNaN(t)?10:t)<5&&(t=5),this.config.minAttempts=t},timeoutSeconds:function(e){let t=parseInt(e);(t=isNaN(t)?10:t)<60&&(t=60),this.config.timeoutSeconds=t}},template:`
@@ -6026,7 +6140,7 @@ example2.com
{{addr.protocol}}://{{addr.host.quoteIP()}}*:{{addr.portRange}}
-
`}),Vue.component("url-patterns-box",{props:["value"],data:function(){let e=[];return{patterns:e=null!=this.value?this.value:e,isAdding:!1,addingPattern:{type:"wildcard",pattern:""},editingIndex:-1,patternIsInvalid:!1}},methods:{add:function(){this.isAdding=!0;let e=this;setTimeout(function(){e.$refs.patternInput.focus()})},edit:function(e){this.isAdding=!0,this.editingIndex=e,this.addingPattern={type:this.patterns[e].type,pattern:this.patterns[e].pattern}},confirm:function(){if(0==this.addingPattern.pattern.trim().length){let e=this;void teaweb.warn("请输入URL",function(){e.$refs.patternInput.focus()})}else this.editingIndex<0?this.patterns.push({type:this.addingPattern.type,pattern:this.addingPattern.pattern}):(this.patterns[this.editingIndex].type=this.addingPattern.type,this.patterns[this.editingIndex].pattern=this.addingPattern.pattern),this.notifyChange(),this.cancel()},remove:function(e){this.patterns.$remove(e),this.cancel(),this.notifyChange()},cancel:function(){this.isAdding=!1,this.addingPattern={type:"wildcard",pattern:""},this.editingIndex=-1},patternTypeName:function(e){switch(e){case"wildcard":return"通配符";case"regexp":return"正则"}return""},notifyChange:function(){this.$emit("input",this.patterns)},changePattern:function(){this.patternIsInvalid=!1;let e=this.addingPattern.pattern;switch(this.addingPattern.type){case"wildcard":0<=e.indexOf("?")&&(this.patternIsInvalid=!0);break;case"regexp":if(0<=e.indexOf("?")){var t=e.split("?");for(let e=0;e +`}),Vue.component("url-patterns-box",{props:["value"],data:function(){let e=[];return{patterns:e=null!=this.value?this.value:e,isAdding:!1,addingPattern:{type:"wildcard",pattern:""},editingIndex:-1,patternIsInvalid:!1,windowIsSmall:window.innerWidth<600}},methods:{add:function(){this.isAdding=!0;let e=this;setTimeout(function(){e.$refs.patternInput.focus()})},edit:function(e){this.isAdding=!0,this.editingIndex=e,this.addingPattern={type:this.patterns[e].type,pattern:this.patterns[e].pattern}},confirm:function(){if(0==this.addingPattern.pattern.trim().length){let e=this;void teaweb.warn("请输入URL",function(){e.$refs.patternInput.focus()})}else this.editingIndex<0?this.patterns.push({type:this.addingPattern.type,pattern:this.addingPattern.pattern}):(this.patterns[this.editingIndex].type=this.addingPattern.type,this.patterns[this.editingIndex].pattern=this.addingPattern.pattern),this.notifyChange(),this.cancel()},remove:function(e){this.patterns.$remove(e),this.cancel(),this.notifyChange()},cancel:function(){this.isAdding=!1,this.addingPattern={type:"wildcard",pattern:""},this.editingIndex=-1},patternTypeName:function(e){switch(e){case"wildcard":return"通配符";case"regexp":return"正则"}return""},notifyChange:function(){this.$emit("input",this.patterns)},changePattern:function(){this.patternIsInvalid=!1;let e=this.addingPattern.pattern;switch(this.addingPattern.type){case"wildcard":0<=e.indexOf("?")&&(this.patternIsInvalid=!0);break;case"regexp":if(0<=e.indexOf("?")){var t=e.split("?");for(let e=0;e
[{{patternTypeName(pattern.type)}}] {{pattern.pattern}}   @@ -6035,7 +6149,7 @@ example2.com
-
+
- - - - + + + + + +
自定义页面 -
-
- {{page.status}} -> {{page.url}}[HTML内容] +

自定义页面

+ +

根据响应状态码返回一些自定义页面,比如404,500等错误页面。

+ +
+ + + + + + + + + + + + + + - - - - - -
响应状态码页面类型新状态码例外URL限制URL操作
+ + {{page.status[0]}} + {{page.status}} + + + + +
+ {{page.url}} +
+ 读取URL +
-
- -
- -
-

根据响应状态码返回一些自定义页面,比如404,500等错误页面。

-
临时关闭页面 -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
临时关闭网站 -
- - -
-

选中后,表示临时关闭当前网站,并显示自定义内容。

-
显示内容类型 * - -
显示页面URL * - -

将从此URL中读取内容。

-
显示页面HTML * - -

[使用模板]。填写页面的HTML内容,支持请求变量。

-
状态码
-

开启临时关闭页面时,所有请求都会直接显示此页面。可用于临时升级网站或者禁止用户访问某个网页。

-
-
+
+ {{page.url}} +
+ 跳转URL + {{page.newStatus}} +
+
+
+ [HTML内容] +
+ {{page.newStatus}} +
+
+
+ {{page.newStatus}} + 保持 + +
+ {{urlPattern.pattern}} +
+ - +
+
+ {{urlPattern.pattern}} +
+ - +
+ 修改   + 删除 +
+
+
+ +
+ +

临时关闭页面

+

开启临时关闭页面时,所有请求都会直接显示此页面。可用于临时升级网站或者禁止用户访问某个网页。

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
启用临时关闭网站 +
+ + +
+

选中后,表示临时关闭当前网站,并显示自定义内容。

+
显示内容类型 * + +
显示页面URL * + +

将从此URL中读取内容。

+
跳转到URL * + +

将会跳转到此URL。

+
显示页面HTML * + +

[使用模板]。填写页面的HTML内容,支持请求变量。

+
状态码
+
` }) @@ -15390,6 +15480,7 @@ Vue.component("http-pages-box", { height: "26em", callback: function (resp) { that.pages.push(resp.data.page) + that.notifyChange() } }) }, @@ -15399,6 +15490,7 @@ Vue.component("http-pages-box", { height: "26em", callback: function (resp) { Vue.set(that.pages, pageIndex, resp.data.page) + that.notifyChange() } }) }, @@ -15406,28 +15498,98 @@ Vue.component("http-pages-box", { let that = this teaweb.confirm("确定要移除此页面吗?", function () { that.pages.$remove(pageIndex) + that.notifyChange() }) + }, + notifyChange: function () { + let parent = this.$el.parentNode + while (true) { + if (parent == null) { + break + } + if (parent.tagName == "FORM") { + break + } + parent = parent.parentNode + } + if (parent != null) { + setTimeout(function () { + Tea.runActionOn(parent) + }, 100) + } } }, template: `
- - - - + + + + + +
自定义页面 -
-
- {{page.status}} -> {{page.url}}[HTML内容] + +
+ + + + + + + + + + + + + + - -
响应状态码页面类型新状态码例外URL限制URL操作
+ + {{page.status[0]}} + {{page.status}} + + + + +
+ {{page.url}} +
+ 读取URL +
-
- -
- -
-

根据响应状态码返回一些自定义页面,比如404,500等错误页面。

-
+
+ {{page.url}} +
+ 跳转URL + {{page.newStatus}} +
+
+
+ [HTML内容] +
+ {{page.newStatus}} +
+
+
+ {{page.newStatus}} + 保持 + +
+ {{urlPattern.pattern}} +
+ - +
+
+ {{urlPattern.pattern}} +
+ - +
+ 修改   + 删除 +
+
+
+ +
` }) @@ -18126,6 +18288,7 @@ Vue.component("url-patterns-box", { if (this.value != null) { patterns = this.value } + return { patterns: patterns, isAdding: false, @@ -18133,7 +18296,9 @@ Vue.component("url-patterns-box", { addingPattern: {"type": "wildcard", "pattern": ""}, editingIndex: -1, - patternIsInvalid: false + patternIsInvalid: false, + + windowIsSmall: window.innerWidth < 600 } }, methods: { @@ -18226,7 +18391,7 @@ Vue.component("url-patterns-box", {
-
+